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
+}