diff pkg/models/extservices.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/extservices.go@3739aa34f838
children 659c04feb2dc
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pkg/models/extservices.go	Tue Aug 21 16:57:55 2018 +0200
@@ -0,0 +1,64 @@
+package models
+
+import (
+	"database/sql"
+	"log"
+	"sync"
+
+	"gemma.intevation.de/gemma/pkg/auth"
+)
+
+type ExtEntry struct {
+	url   string
+	isWFS bool
+}
+
+type ExtServices struct {
+	mu      sync.Mutex
+	entries map[string]ExtEntry
+}
+
+var ExternalServices = &ExtServices{}
+
+const selectExternalServices = `SELECT local_name, remote_url, is_wfs
+FROM sys_admin.external_services`
+
+func (es *ExtServices) Find(name string) (string, bool) {
+	es.mu.Lock()
+	defer es.mu.Unlock()
+
+	if es.entries == nil {
+		es.entries = make(map[string]ExtEntry)
+		if err := es.load(); err != nil {
+			log.Printf("error: %v\n", err)
+			return "", false
+		}
+	}
+	e, found := es.entries[name]
+	return e.url, found
+}
+
+func (es *ExtServices) load() error {
+	return auth.RunAs("sys_admin", func(db *sql.DB) error {
+		rows, err := db.Query(selectExternalServices)
+		if err != nil {
+			return err
+		}
+		defer rows.Close()
+		for rows.Next() {
+			var entry ExtEntry
+			var key string
+			if err := rows.Scan(&key, &entry.url, &entry.isWFS); err != nil {
+				return err
+			}
+			es.entries[key] = entry
+		}
+		return rows.Err()
+	})
+}
+
+func (es *ExtServices) Invalidate() {
+	es.mu.Lock()
+	es.entries = nil
+	es.mu.Unlock()
+}