changeset 978:544a5cfe07cd

Started with endpoint for uploading sounding result and trigger respective import job.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 18 Oct 2018 18:37:19 +0200
parents 4a2ca0e20006
children 7934b5c1a910
files cmd/gemma/main.go pkg/controllers/imports.go pkg/controllers/routes.go pkg/imports/queue.go pkg/imports/sr.go
diffstat 5 files changed, 85 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/cmd/gemma/main.go	Thu Oct 18 17:30:53 2018 +0200
+++ b/cmd/gemma/main.go	Thu Oct 18 18:37:19 2018 +0200
@@ -18,8 +18,6 @@
 	"gemma.intevation.de/gemma/pkg/config"
 	"gemma.intevation.de/gemma/pkg/controllers"
 	"gemma.intevation.de/gemma/pkg/geoserver"
-
-	_ "gemma.intevation.de/gemma/pkg/imports"
 )
 
 func prepareSessionStore() {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pkg/controllers/imports.go	Thu Oct 18 18:37:19 2018 +0200
@@ -0,0 +1,68 @@
+package controllers
+
+import (
+	"bufio"
+	"io"
+	"io/ioutil"
+	"log"
+	"net/http"
+	"os"
+	"path/filepath"
+
+	"gemma.intevation.de/gemma/pkg/config"
+)
+
+const (
+	maxSoundingResultSize = 25 * 1024 * 1024
+	soundingResultName    = "soundingresult"
+)
+
+func downloadSoundingResult(req *http.Request) (string, error) {
+
+	f, _, err := req.FormFile(soundingResultName)
+	if err != nil {
+		return "", err
+	}
+	defer f.Close()
+
+	dir, err := ioutil.TempDir(config.TmpDir(), soundingResultName)
+	if err != nil {
+		return "", err
+	}
+
+	o, err := os.Create(filepath.Join(dir, "sr.zip"))
+	if err != nil {
+		os.RemoveAll(dir)
+		return "", err
+	}
+
+	out := bufio.NewWriter(o)
+
+	if _, err = io.Copy(out, io.LimitReader(f, maxSoundingResultSize)); err != nil {
+		o.Close()
+		os.RemoveAll(dir)
+		return "", err
+	}
+
+	if err = out.Flush(); err != nil {
+		o.Close()
+		os.RemoveAll(dir)
+		return "", err
+	}
+
+	return "", nil
+}
+
+func importSoundingResult(rw http.ResponseWriter, req *http.Request) {
+
+	dir, err := downloadSoundingResult(req)
+	if err != nil {
+		log.Printf("error: %v\n", err)
+		http.Error(rw, "error: "+err.Error(), http.StatusInternalServerError)
+		return
+	}
+
+	// TODO: Enqueue job.
+
+	_ = dir
+}
--- a/pkg/controllers/routes.go	Thu Oct 18 17:30:53 2018 +0200
+++ b/pkg/controllers/routes.go	Thu Oct 18 18:37:19 2018 +0200
@@ -16,8 +16,9 @@
 	api := m.PathPrefix("/api").Subrouter()
 
 	var (
-		sysAdmin = auth.EnsureRole("sys_admin")
-		any      = auth.EnsureRole("sys_admin", "waterway_admin", "waterway_user")
+		sysAdmin      = auth.EnsureRole("sys_admin")
+		waterwayAdmin = auth.EnsureRole("waterway_admin")
+		any           = auth.EnsureRole("sys_admin", "waterway_admin", "waterway_user")
 	)
 
 	// User management.
@@ -139,6 +140,10 @@
 	api.Handle("/geo/style/{feature}",
 		sysAdmin(http.HandlerFunc(uploadStyle))).Methods(http.MethodPost)
 
+	// Imports
+	api.Handle("/imports/soundingresult",
+		waterwayAdmin(http.HandlerFunc(importSoundingResult))).Methods(http.MethodPost)
+
 	// Token handling: Login/Logout.
 	api.HandleFunc("/login", login).
 		Methods(http.MethodPost)
--- a/pkg/imports/queue.go	Thu Oct 18 17:30:53 2018 +0200
+++ b/pkg/imports/queue.go	Thu Oct 18 18:37:19 2018 +0200
@@ -6,6 +6,7 @@
 	"database/sql"
 	"log"
 	"sync"
+	"sync/atomic"
 
 	"gemma.intevation.de/gemma/pkg/auth"
 )
@@ -19,17 +20,21 @@
 var (
 	queueCond = sync.NewCond(new(sync.Mutex))
 	queue     = list.New()
+
+	jobID int64
 )
 
 func init() {
 	go importLoop()
 }
 
-func AddJob(job Job) {
+func AddJob(job Job) int64 {
+	id := atomic.AddInt64(&jobID, 1)
 	queueCond.L.Lock()
 	defer queueCond.L.Unlock()
 	queue.PushBack(job)
 	queueCond.Signal()
+	return id
 }
 
 func importLoop() {
--- a/pkg/imports/sr.go	Thu Oct 18 17:30:53 2018 +0200
+++ b/pkg/imports/sr.go	Thu Oct 18 18:37:19 2018 +0200
@@ -14,6 +14,7 @@
 	"log"
 	"os"
 	"path"
+	"path/filepath"
 	"strconv"
 	"strings"
 	"time"
@@ -25,7 +26,7 @@
 
 type SoundingResult struct {
 	who string
-	zip string
+	dir string
 }
 
 const SoundingResultDateFormat = "2006-01-02"
@@ -132,7 +133,7 @@
 }
 
 func (sr *SoundingResult) CleanUp() error {
-	return os.RemoveAll(sr.zip)
+	return os.RemoveAll(sr.dir)
 }
 
 func find(needle string, haystack []*zip.File) *zip.File {
@@ -275,7 +276,7 @@
 
 func (sr *SoundingResult) Do(conn *sql.Conn) error {
 
-	z, err := zip.OpenReader(sr.zip)
+	z, err := zip.OpenReader(filepath.Join(sr.dir, "sr.zip"))
 	if err != nil {
 		return err
 	}