# HG changeset patch # User Sascha L. Teichmann # Date 1535023936 -7200 # Node ID 11d80120ed3d8df5cabf3fe6b0e337db654e27cd # Parent b2dea4e56ff1fe5bb9ab2334a9137f663ef07631 Renamed published services to internal services to be more symmetrical to external services. diff -r b2dea4e56ff1 -r 11d80120ed3d cmd/gemma/geoserver.go --- a/cmd/gemma/geoserver.go Thu Aug 23 13:24:26 2018 +0200 +++ b/cmd/gemma/geoserver.go Thu Aug 23 13:32:16 2018 +0200 @@ -182,7 +182,7 @@ auth = basicAuth(user, password) ) - tables := models.PublishedServices.Filter(models.PublishedWFS) + tables := models.InternalServices.Filter(models.IntWFS) if len(tables) == 0 { log.Println("info: no tables to publish") return nil diff -r b2dea4e56ff1 -r 11d80120ed3d pkg/controllers/publish.go --- a/pkg/controllers/publish.go Thu Aug 23 13:24:26 2018 +0200 +++ b/pkg/controllers/publish.go Thu Aug 23 13:32:16 2018 +0200 @@ -10,10 +10,10 @@ func published(_ interface{}, req *http.Request, _ *sql.DB) (jr JSONResult, err error) { jr = JSONResult{ Result: struct { - Internal []models.PubEntry `json:"internal"` + Internal []models.IntEntry `json:"internal"` External []models.ExtEntry `json:"external"` }{ - Internal: models.PublishedServices.Filter(models.PublishedAll), + Internal: models.InternalServices.Filter(models.InternalAll), External: models.ExternalServices.Filter(models.ExternalAll), }, } diff -r b2dea4e56ff1 -r 11d80120ed3d pkg/controllers/routes.go --- a/pkg/controllers/routes.go Thu Aug 23 13:24:26 2018 +0200 +++ b/pkg/controllers/routes.go Thu Aug 23 13:32:16 2018 +0200 @@ -73,7 +73,7 @@ // Internal proxies. internal := &httputil.ReverseProxy{ - Director: proxyDirector(models.PublishedServices.Find), + Director: proxyDirector(models.InternalServices.Find), ModifyResponse: proxyModifyResponse("/api/internal/"), } diff -r b2dea4e56ff1 -r 11d80120ed3d pkg/models/intservices.go --- /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 +} diff -r b2dea4e56ff1 -r 11d80120ed3d pkg/models/pubservices.go --- a/pkg/models/pubservices.go Thu Aug 23 13:24:26 2018 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,115 +0,0 @@ -package models - -import ( - "database/sql" - "log" - "sync" - - "gemma.intevation.de/gemma/pkg/auth" - "gemma.intevation.de/gemma/pkg/config" -) - -type PubEntry struct { - Name string `json:"name"` - Style sql.NullString `json:"-"` // This should be done separately. - WMS bool `json:"wms"` - WFS bool `json:"wfs"` -} - -type PubServices struct { - entries []PubEntry - mu sync.Mutex -} - -const selectPublishedServices = `SELECT name, style, as_wms, as_wfs -FROM sys_admin.published_services ORDER by name` - -var PublishedServices = &PubServices{} - -func (ps *PubServices) 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 *PubServices) has(service string) bool { - var check func(*PubEntry) bool - switch service { - case "wms": - check = func(e *PubEntry) bool { return e.WMS } - case "wfs": - check = func(e *PubEntry) bool { return e.WFS } - default: - return false - } - for i := range ps.entries { - if check(&ps.entries[i]) { - return true - } - } - return false -} - -func (ps *PubServices) load() error { - // make empty slice to prevent retry if slice is empty. - ps.entries = []PubEntry{} - 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 PubEntry - 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 *PubServices) Invalidate() { - ps.mu.Lock() - ps.entries = nil - ps.mu.Unlock() -} - -func PublishedAll(PubEntry) bool { return true } -func PublishedWMS(entry PubEntry) bool { return entry.WMS } -func PublishedWFS(entry PubEntry) bool { return entry.WFS } - -func (ps *PubServices) Filter(accept func(PubEntry) bool) []PubEntry { - 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([]PubEntry, 0, len(ps.entries)) - for _, e := range ps.entries { - if accept(e) { - pe = append(pe, e) - } - } - - return pe -}