Mercurial > gemma
diff pkg/models/intservices.go @ 474:11d80120ed3d
Renamed published services to internal services to be more symmetrical to external services.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Thu, 23 Aug 2018 13:32:16 +0200 |
parents | pkg/models/pubservices.go@b2dea4e56ff1 |
children | c10c76c92797 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pkg/models/intservices.go Thu Aug 23 13:32:16 2018 +0200 @@ -0,0 +1,115 @@ +package models + +import ( + "database/sql" + "log" + "sync" + + "gemma.intevation.de/gemma/pkg/auth" + "gemma.intevation.de/gemma/pkg/config" +) + +type IntEntry struct { + Name string `json:"name"` + Style sql.NullString `json:"-"` // This should be done separately. + WMS bool `json:"wms"` + WFS bool `json:"wfs"` +} + +type IntServices struct { + entries []IntEntry + mu sync.Mutex +} + +const selectPublishedServices = `SELECT name, style, as_wms, as_wfs +FROM sys_admin.published_services ORDER by name` + +var InternalServices = &IntServices{} + +func (ps *IntServices) Find(name string) (string, bool) { + ps.mu.Lock() + defer ps.mu.Unlock() + + if ps.entries == nil { + if err := ps.load(); err != nil { + log.Printf("error: %v\n", err) + return "", false + } + } + + if ps.has(name) { + return config.GeoServerURL() + "/" + name, true + } + return "", false +} + +func (ps *IntServices) has(service string) bool { + var check func(*IntEntry) bool + switch service { + case "wms": + check = func(e *IntEntry) bool { return e.WMS } + case "wfs": + check = func(e *IntEntry) bool { return e.WFS } + default: + return false + } + for i := range ps.entries { + if check(&ps.entries[i]) { + return true + } + } + return false +} + +func (ps *IntServices) load() error { + // make empty slice to prevent retry if slice is empty. + ps.entries = []IntEntry{} + return auth.RunAs("sys_admin", func(db *sql.DB) error { + rows, err := db.Query(selectPublishedServices) + if err != nil { + return err + } + defer rows.Close() + for rows.Next() { + var entry IntEntry + if err := rows.Scan( + &entry.Name, &entry.Style, + &entry.WFS, &entry.WFS, + ); err != nil { + return err + } + ps.entries = append(ps.entries, entry) + } + return rows.Err() + }) + return nil +} + +func (ps *IntServices) Invalidate() { + ps.mu.Lock() + ps.entries = nil + ps.mu.Unlock() +} + +func InternalAll(IntEntry) bool { return true } +func IntWMS(entry IntEntry) bool { return entry.WMS } +func IntWFS(entry IntEntry) bool { return entry.WFS } + +func (ps *IntServices) Filter(accept func(IntEntry) bool) []IntEntry { + ps.mu.Lock() + defer ps.mu.Unlock() + if ps.entries == nil { + if err := ps.load(); err != nil { + log.Printf("error: %v\n", err) + return nil + } + } + pe := make([]IntEntry, 0, len(ps.entries)) + for _, e := range ps.entries { + if accept(e) { + pe = append(pe, e) + } + } + + return pe +}