diff pkg/models/pubservices.go @ 442:fc37e7072022

Moved some models used in controllers to to model package because they may be needed elsewhere (e.g. GeoServer config).
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 21 Aug 2018 16:57:55 +0200
parents pkg/controllers/pubservices.go@76a76691a298
children c315885825e5
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pkg/models/pubservices.go	Tue Aug 21 16:57:55 2018 +0200
@@ -0,0 +1,72 @@
+package models
+
+import (
+	"database/sql"
+	"log"
+	"sync"
+
+	"gemma.intevation.de/gemma/pkg/auth"
+)
+
+type PubEntry struct {
+	style sql.NullString
+	asWMS bool
+	asWFS bool
+}
+
+type PubServices struct {
+	entries map[string]PubEntry
+	mu      sync.Mutex
+}
+
+const selectPublishedServices = `SELECT name, style, as_wms, as_wfs
+FROM sys_admin.published_services`
+
+var PublishedServices = &PubServices{}
+
+func (ps *PubServices) Find(name string) (string, bool) {
+	ps.mu.Lock()
+	defer ps.mu.Unlock()
+
+	if ps.entries == nil {
+		ps.entries = make(map[string]PubEntry)
+		if err := ps.load(); err != nil {
+			log.Printf("error: %v\n", err)
+			return "", false
+		}
+	}
+	_, found := ps.entries[name]
+	if !found {
+		name = ""
+	}
+	return name, found
+}
+
+func (ps *PubServices) load() error {
+	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
+			var key string
+			if err := rows.Scan(
+				&key, &entry.style,
+				&entry.asWFS, &entry.asWFS,
+			); err != nil {
+				return err
+			}
+			ps.entries[key] = entry
+		}
+		return rows.Err()
+	})
+	return nil
+}
+
+func (ps *PubServices) Invalidate() {
+	ps.mu.Lock()
+	ps.entries = nil
+	ps.mu.Unlock()
+}