Mercurial > gemma
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 }