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