view pkg/models/extservices.go @ 955:920fba3f593f

chore: upgrading packages to latest
author Thomas Junk <thomas.junk@intevation.de>
date Tue, 16 Oct 2018 11:13:06 +0200
parents c10c76c92797
children a244b18cb916
line wrap: on
line source

package models

import (
	"context"
	"database/sql"
	"log"
	"sort"
	"sync"

	"gemma.intevation.de/gemma/pkg/auth"
)

type ExtEntry struct {
	Name string `json:"name"`
	URL  string `json:"url"`
	WFS  bool   `json:"wfs"`
}

type ExtServices struct {
	mu      sync.Mutex
	entries []ExtEntry
}

var ExternalServices = &ExtServices{}

const selectExternalServices = `SELECT local_name, remote_url, is_wfs
FROM sys_admin.external_services ORDER BY local_name`

func (es *ExtServices) Find(name string) (string, bool) {
	es.mu.Lock()
	defer es.mu.Unlock()

	if es.entries == nil {
		if err := es.load(); err != nil {
			log.Printf("error: %v\n", err)
			return "", false
		}
	}
	n := sort.Search(len(es.entries), func(i int) bool {
		return es.entries[i].Name >= name
	})
	if n == len(es.entries) || es.entries[n].Name != name {
		return "", false
	}
	return es.entries[n].URL, true
}

func (es *ExtServices) load() error {
	// make empty slice to prevent retry if slice is empty.
	es.entries = []ExtEntry{}
	return auth.RunAs("sys_admin", context.Background(),
		func(conn *sql.Conn) error {
			rows, err := conn.QueryContext(
				context.Background(), selectExternalServices)
			if err != nil {
				return err
			}
			defer rows.Close()
			for rows.Next() {
				var entry ExtEntry
				if err := rows.Scan(
					&entry.Name,
					&entry.URL,
					&entry.WFS,
				); err != nil {
					return err
				}
				es.entries = append(es.entries, entry)
			}
			return rows.Err()
		})
}

func (es *ExtServices) Invalidate() {
	es.mu.Lock()
	es.entries = nil
	es.mu.Unlock()
}

func ExternalAll(ExtEntry) bool       { return true }
func ExternalWMS(entry ExtEntry) bool { return !entry.WFS }
func ExternalWFS(entry ExtEntry) bool { return entry.WFS }

func (es *ExtServices) Filter(accept func(ExtEntry) bool) []ExtEntry {
	es.mu.Lock()
	defer es.mu.Unlock()
	if es.entries == nil {
		if err := es.load(); err != nil {
			log.Printf("error: %v\n", err)
			return nil
		}
	}
	ee := make([]ExtEntry, 0, len(es.entries))
	for _, e := range es.entries {
		if accept(e) {
			ee = append(ee, e)
		}
	}
	return ee
}