diff pkg/controllers/srimports.go @ 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
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
 }