Mercurial > gemma
changeset 1226:2e65e8ddacab
Finished the sounding result upload controller to temp uploads.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 19 Nov 2018 17:56:44 +0100 |
parents | 4d7c44f7044e |
children | 737e1acea1f1 |
files | pkg/controllers/srimports.go |
diffstat | 1 files changed, 58 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/pkg/controllers/srimports.go Mon Nov 19 17:28:35 2018 +0100 +++ b/pkg/controllers/srimports.go Mon Nov 19 17:56:44 2018 +0100 @@ -18,18 +18,22 @@ "bufio" "database/sql" "encoding/hex" + "fmt" "io" "io/ioutil" "log" "net/http" "os" "path/filepath" + "sync" "time" "gemma.intevation.de/gemma/pkg/auth" + "gemma.intevation.de/gemma/pkg/common" "gemma.intevation.de/gemma/pkg/config" "gemma.intevation.de/gemma/pkg/imports" "gemma.intevation.de/gemma/pkg/misc" + "gemma.intevation.de/gemma/pkg/models" ) const ( @@ -124,6 +128,16 @@ SendJSON(rw, http.StatusCreated, &result) } +func loadMeta(f *zip.File) (*models.SoundingResultMeta, error) { + r, err := f.Open() + if err != nil { + return nil, err + } + defer r.Close() + var m models.SoundingResultMeta + return &m, m.Decode(r) +} + func uploadSoundingResult( _ interface{}, req *http.Request, @@ -141,10 +155,51 @@ if zr, err = zip.OpenReader(srFile); err != nil { return } - defer zr.Close() + var once sync.Once + closeOnce := func() { zr.Close() } + defer once.Do(closeOnce) + + var messages []string + + var result struct { + Token string `json:"token"` + Meta interface{} `json:"meta,omitempty"` + Messages []string `json:"messages,omitempty"` + } + + if common.FindInZIP(zr, ".xyz") == nil { + messages = append(messages, "no .xyz file found.") + } - _ = dir - // TODO: Implement me! + if mj := common.FindInZIP(zr, "meta.json"); mj == nil { + messages = append(messages, "no 'meta.json' file found.") + } else { + if meta, err := loadMeta(mj); err != nil { + messages = append(messages, + fmt.Sprintf("'meta.json' found but invalid: %v", err)) + } else { + errs := meta.Validate(conn, req.Context()) + for _, err := range errs { + messages = append(messages, + fmt.Sprintf("invalid 'meta.json': %v", err)) + } + result.Meta = meta + } + } + once.Do(closeOnce) + if result.Token, err = misc.MakeTempFile(dir); err != nil { + if err2 := os.RemoveAll(dir); err2 != nil { + log.Printf("error: %v\n", err2) + } + return + } + + result.Messages = messages + + jr = JSONResult{ + Code: http.StatusCreated, + Result: &result, + } return }