comparison 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
comparison
equal deleted inserted replaced
1225:4d7c44f7044e 1226:2e65e8ddacab
16 import ( 16 import (
17 "archive/zip" 17 "archive/zip"
18 "bufio" 18 "bufio"
19 "database/sql" 19 "database/sql"
20 "encoding/hex" 20 "encoding/hex"
21 "fmt"
21 "io" 22 "io"
22 "io/ioutil" 23 "io/ioutil"
23 "log" 24 "log"
24 "net/http" 25 "net/http"
25 "os" 26 "os"
26 "path/filepath" 27 "path/filepath"
28 "sync"
27 "time" 29 "time"
28 30
29 "gemma.intevation.de/gemma/pkg/auth" 31 "gemma.intevation.de/gemma/pkg/auth"
32 "gemma.intevation.de/gemma/pkg/common"
30 "gemma.intevation.de/gemma/pkg/config" 33 "gemma.intevation.de/gemma/pkg/config"
31 "gemma.intevation.de/gemma/pkg/imports" 34 "gemma.intevation.de/gemma/pkg/imports"
32 "gemma.intevation.de/gemma/pkg/misc" 35 "gemma.intevation.de/gemma/pkg/misc"
36 "gemma.intevation.de/gemma/pkg/models"
33 ) 37 )
34 38
35 const ( 39 const (
36 maxSoundingResultSize = 25 * 1024 * 1024 40 maxSoundingResultSize = 25 * 1024 * 1024
37 soundingResultName = "soundingresult" 41 soundingResultName = "soundingresult"
122 ID: jobID, 126 ID: jobID,
123 } 127 }
124 SendJSON(rw, http.StatusCreated, &result) 128 SendJSON(rw, http.StatusCreated, &result)
125 } 129 }
126 130
131 func loadMeta(f *zip.File) (*models.SoundingResultMeta, error) {
132 r, err := f.Open()
133 if err != nil {
134 return nil, err
135 }
136 defer r.Close()
137 var m models.SoundingResultMeta
138 return &m, m.Decode(r)
139 }
140
127 func uploadSoundingResult( 141 func uploadSoundingResult(
128 _ interface{}, 142 _ interface{},
129 req *http.Request, 143 req *http.Request,
130 conn *sql.Conn, 144 conn *sql.Conn,
131 ) (jr JSONResult, err error) { 145 ) (jr JSONResult, err error) {
139 153
140 var zr *zip.ReadCloser 154 var zr *zip.ReadCloser
141 if zr, err = zip.OpenReader(srFile); err != nil { 155 if zr, err = zip.OpenReader(srFile); err != nil {
142 return 156 return
143 } 157 }
144 defer zr.Close() 158 var once sync.Once
145 159 closeOnce := func() { zr.Close() }
146 _ = dir 160 defer once.Do(closeOnce)
147 // TODO: Implement me! 161
148 162 var messages []string
163
164 var result struct {
165 Token string `json:"token"`
166 Meta interface{} `json:"meta,omitempty"`
167 Messages []string `json:"messages,omitempty"`
168 }
169
170 if common.FindInZIP(zr, ".xyz") == nil {
171 messages = append(messages, "no .xyz file found.")
172 }
173
174 if mj := common.FindInZIP(zr, "meta.json"); mj == nil {
175 messages = append(messages, "no 'meta.json' file found.")
176 } else {
177 if meta, err := loadMeta(mj); err != nil {
178 messages = append(messages,
179 fmt.Sprintf("'meta.json' found but invalid: %v", err))
180 } else {
181 errs := meta.Validate(conn, req.Context())
182 for _, err := range errs {
183 messages = append(messages,
184 fmt.Sprintf("invalid 'meta.json': %v", err))
185 }
186 result.Meta = meta
187 }
188 }
189 once.Do(closeOnce)
190
191 if result.Token, err = misc.MakeTempFile(dir); err != nil {
192 if err2 := os.RemoveAll(dir); err2 != nil {
193 log.Printf("error: %v\n", err2)
194 }
195 return
196 }
197
198 result.Messages = messages
199
200 jr = JSONResult{
201 Code: http.StatusCreated,
202 Result: &result,
203 }
149 return 204 return
150 } 205 }