Mercurial > gemma
changeset 439:1504f8eff12e
Load the configuration of the proxied external services from database.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Tue, 21 Aug 2018 12:36:10 +0200 |
parents | ffdb507d5b42 |
children | 3739aa34f838 |
files | pkg/controllers/externalservices.go pkg/controllers/routes.go |
diffstat | 2 files changed, 65 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pkg/controllers/externalservices.go Tue Aug 21 12:36:10 2018 +0200 @@ -0,0 +1,64 @@ +package controllers + +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() +}
--- a/pkg/controllers/routes.go Tue Aug 21 11:33:19 2018 +0200 +++ b/pkg/controllers/routes.go Tue Aug 21 12:36:10 2018 +0200 @@ -54,7 +54,7 @@ // External proxies. proxy := &httputil.ReverseProxy{ - Director: proxyDirector(findProxy("external")), + Director: proxyDirector(externalServices.find), ModifyResponse: proxyModifyResponse("/api/external/"), }