Mercurial > gemma
view pkg/models/pubservices.go @ 458:01deefb7ec7a
Add GeoServer Dockerfile
author | Tom Gottfried <tom@intevation.de> |
---|---|
date | Wed, 22 Aug 2018 14:34:37 +0200 |
parents | a8e217119085 |
children | 788c87b99bae |
line wrap: on
line source
package models import ( "database/sql" "log" "sync" "gemma.intevation.de/gemma/pkg/auth" "gemma.intevation.de/gemma/pkg/config" ) type PubEntry struct { Name string Style sql.NullString WMS bool WFS bool } 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) { 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 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 }