Mercurial > gemma
comparison pkg/controllers/importqueue.go @ 4244:4394daeea96a json-handler-middleware
Moved JSONHandler into middleware package.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Thu, 22 Aug 2019 11:26:48 +0200 |
parents | d776110b4db0 |
children | 47922c1a088d |
comparison
equal
deleted
inserted
replaced
4243:d776110b4db0 | 4244:4394daeea96a |
---|---|
28 | 28 |
29 "gemma.intevation.de/gemma/pkg/auth" | 29 "gemma.intevation.de/gemma/pkg/auth" |
30 "gemma.intevation.de/gemma/pkg/common" | 30 "gemma.intevation.de/gemma/pkg/common" |
31 "gemma.intevation.de/gemma/pkg/imports" | 31 "gemma.intevation.de/gemma/pkg/imports" |
32 "gemma.intevation.de/gemma/pkg/models" | 32 "gemma.intevation.de/gemma/pkg/models" |
33 | |
34 mw "gemma.intevation.de/gemma/pkg/middleware" | |
33 ) | 35 ) |
34 | 36 |
35 const ( | 37 const ( |
36 selectImportsCountSQL = ` | 38 selectImportsCountSQL = ` |
37 SELECT count(*) | 39 SELECT count(*) |
226 return nil | 228 return nil |
227 } | 229 } |
228 return &models.ImportTime{Time: when.UTC()} | 230 return &models.ImportTime{Time: when.UTC()} |
229 } | 231 } |
230 | 232 |
231 func listImports(req *http.Request) (jr JSONResult, err error) { | 233 func listImports(req *http.Request) (jr mw.JSONResult, err error) { |
232 | 234 |
233 var list, before, after *filledStmt | 235 var list, before, after *filledStmt |
234 | 236 |
235 if list, before, after, err = buildFilters(req); err != nil { | 237 if list, before, after, err = buildFilters(req); err != nil { |
236 return | 238 return |
237 } | 239 } |
238 | 240 |
239 ctx := req.Context() | 241 ctx := req.Context() |
240 | 242 |
241 conn := JSONConn(req) | 243 conn := mw.JSONConn(req) |
242 | 244 |
243 // Fast path for counting | 245 // Fast path for counting |
244 | 246 |
245 switch count := strings.ToLower(req.FormValue("count")); count { | 247 switch count := strings.ToLower(req.FormValue("count")); count { |
246 case "1", "t", "true": | 248 case "1", "t", "true": |
250 case err == sql.ErrNoRows: | 252 case err == sql.ErrNoRows: |
251 count, err = 0, nil | 253 count, err = 0, nil |
252 case err != nil: | 254 case err != nil: |
253 return | 255 return |
254 } | 256 } |
255 jr = JSONResult{Result: count} | 257 jr = mw.JSONResult{Result: count} |
256 return | 258 return |
257 } | 259 } |
258 | 260 |
259 // Generate the list | 261 // Generate the list |
260 | 262 |
303 | 305 |
304 if after != nil { | 306 if after != nil { |
305 next = neighbored(ctx, conn, after) | 307 next = neighbored(ctx, conn, after) |
306 } | 308 } |
307 | 309 |
308 jr = JSONResult{ | 310 jr = mw.JSONResult{ |
309 Result: struct { | 311 Result: struct { |
310 Prev *models.ImportTime `json:"prev,omitempty"` | 312 Prev *models.ImportTime `json:"prev,omitempty"` |
311 Next *models.ImportTime `json:"next,omitempty"` | 313 Next *models.ImportTime `json:"next,omitempty"` |
312 Imports []*models.Import `json:"imports"` | 314 Imports []*models.Import `json:"imports"` |
313 }{ | 315 }{ |
317 }, | 319 }, |
318 } | 320 } |
319 return | 321 return |
320 } | 322 } |
321 | 323 |
322 func importLogs(req *http.Request) (jr JSONResult, err error) { | 324 func importLogs(req *http.Request) (jr mw.JSONResult, err error) { |
323 | 325 |
324 ctx := req.Context() | 326 ctx := req.Context() |
325 | 327 |
326 id, _ := strconv.ParseInt(mux.Vars(req)["id"], 10, 64) | 328 id, _ := strconv.ParseInt(mux.Vars(req)["id"], 10, 64) |
327 | 329 |
328 conn := JSONConn(req) | 330 conn := mw.JSONConn(req) |
329 | 331 |
330 // Check if he have such a import job first. | 332 // Check if he have such a import job first. |
331 var summary sql.NullString | 333 var summary sql.NullString |
332 var enqueued time.Time | 334 var enqueued time.Time |
333 err = conn.QueryRowContext(ctx, selectImportSummarySQL, id).Scan( | 335 err = conn.QueryRowContext(ctx, selectImportSummarySQL, id).Scan( |
334 &summary, | 336 &summary, |
335 &enqueued, | 337 &enqueued, |
336 ) | 338 ) |
337 switch { | 339 switch { |
338 case err == sql.ErrNoRows: | 340 case err == sql.ErrNoRows: |
339 err = JSONError{ | 341 err = mw.JSONError{ |
340 Code: http.StatusNotFound, | 342 Code: http.StatusNotFound, |
341 Message: fmt.Sprintf("Cannot find import #%d.", id), | 343 Message: fmt.Sprintf("Cannot find import #%d.", id), |
342 } | 344 } |
343 return | 345 return |
344 case err != nil: | 346 case err != nil: |
376 | 378 |
377 if err = rows.Err(); err != nil { | 379 if err = rows.Err(); err != nil { |
378 return | 380 return |
379 } | 381 } |
380 | 382 |
381 jr = JSONResult{ | 383 jr = mw.JSONResult{ |
382 Result: struct { | 384 Result: struct { |
383 Enqueued models.ImportTime `json:"enqueued"` | 385 Enqueued models.ImportTime `json:"enqueued"` |
384 Summary interface{} `json:"summary,omitempty"` | 386 Summary interface{} `json:"summary,omitempty"` |
385 Entries []*models.ImportLogEntry `json:"entries"` | 387 Entries []*models.ImportLogEntry `json:"entries"` |
386 }{ | 388 }{ |
390 }, | 392 }, |
391 } | 393 } |
392 return | 394 return |
393 } | 395 } |
394 | 396 |
395 func deleteImport(req *http.Request) (jr JSONResult, err error) { | 397 func deleteImport(req *http.Request) (jr mw.JSONResult, err error) { |
396 | 398 |
397 ctx := req.Context() | 399 ctx := req.Context() |
398 id, _ := strconv.ParseInt(mux.Vars(req)["id"], 10, 64) | 400 id, _ := strconv.ParseInt(mux.Vars(req)["id"], 10, 64) |
399 | 401 |
400 var tx *sql.Tx | 402 var tx *sql.Tx |
401 tx, err = JSONConn(req).BeginTx(ctx, nil) | 403 tx, err = mw.JSONConn(req).BeginTx(ctx, nil) |
402 if err != nil { | 404 if err != nil { |
403 return | 405 return |
404 } | 406 } |
405 defer tx.Rollback() | 407 defer tx.Rollback() |
406 | 408 |
407 // Check if he have such a import job first. | 409 // Check if he have such a import job first. |
408 var dummy bool | 410 var dummy bool |
409 err = tx.QueryRowContext(ctx, selectHasNoRunningImportSQL, id).Scan(&dummy) | 411 err = tx.QueryRowContext(ctx, selectHasNoRunningImportSQL, id).Scan(&dummy) |
410 switch { | 412 switch { |
411 case err == sql.ErrNoRows: | 413 case err == sql.ErrNoRows: |
412 err = JSONError{ | 414 err = mw.JSONError{ |
413 Code: http.StatusNotFound, | 415 Code: http.StatusNotFound, |
414 Message: fmt.Sprintf("Cannot find import #%d.", id), | 416 Message: fmt.Sprintf("Cannot find import #%d.", id), |
415 } | 417 } |
416 return | 418 return |
417 case err != nil: | 419 case err != nil: |
428 | 430 |
429 if err = tx.Commit(); err != nil { | 431 if err = tx.Commit(); err != nil { |
430 return | 432 return |
431 } | 433 } |
432 | 434 |
433 jr = JSONResult{Code: http.StatusNoContent} | 435 jr = mw.JSONResult{Code: http.StatusNoContent} |
434 | 436 |
435 return | 437 return |
436 } | 438 } |
437 | 439 |
438 const ( | 440 const ( |
454 | 456 |
455 logDecisionSQL = ` | 457 logDecisionSQL = ` |
456 INSERT INTO import.import_logs (import_id, msg) VALUES ($1, $2)` | 458 INSERT INTO import.import_logs (import_id, msg) VALUES ($1, $2)` |
457 ) | 459 ) |
458 | 460 |
459 func reviewImports(req *http.Request) (JSONResult, error) { | 461 func reviewImports(req *http.Request) (mw.JSONResult, error) { |
460 | 462 |
461 rs := *JSONInput(req).(*[]models.Review) | 463 rs := *mw.JSONInput(req).(*[]models.Review) |
462 | 464 |
463 type reviewResult struct { | 465 type reviewResult struct { |
464 ID int64 `json:"id"` | 466 ID int64 `json:"id"` |
465 Message string `json:"message,omitempty"` | 467 Message string `json:"message,omitempty"` |
466 Error string `json:"error,omitempty"` | 468 Error string `json:"error,omitempty"` |
467 } | 469 } |
468 | 470 |
469 results := make([]reviewResult, len(rs)) | 471 results := make([]reviewResult, len(rs)) |
470 | 472 |
471 conn := JSONConn(req) | 473 conn := mw.JSONConn(req) |
472 | 474 |
473 for i := range rs { | 475 for i := range rs { |
474 rev := &rs[i] | 476 rev := &rs[i] |
475 msg, err := decideImport(req, conn, rev.ID, string(rev.State)) | 477 msg, err := decideImport(req, conn, rev.ID, string(rev.State)) |
476 var errString string | 478 var errString string |
482 Message: msg, | 484 Message: msg, |
483 Error: errString, | 485 Error: errString, |
484 } | 486 } |
485 } | 487 } |
486 | 488 |
487 return JSONResult{Result: results}, nil | 489 return mw.JSONResult{Result: results}, nil |
488 } | 490 } |
489 | 491 |
490 func reviewImport(req *http.Request) (jr JSONResult, err error) { | 492 func reviewImport(req *http.Request) (jr mw.JSONResult, err error) { |
491 | 493 |
492 vars := mux.Vars(req) | 494 vars := mux.Vars(req) |
493 id, _ := strconv.ParseInt(vars["id"], 10, 64) | 495 id, _ := strconv.ParseInt(vars["id"], 10, 64) |
494 state := vars["state"] | 496 state := vars["state"] |
495 | 497 |
496 var msg string | 498 var msg string |
497 if msg, err = decideImport(req, JSONConn(req), id, state); err != nil { | 499 if msg, err = decideImport(req, mw.JSONConn(req), id, state); err != nil { |
498 return | 500 return |
499 } | 501 } |
500 | 502 |
501 result := struct { | 503 result := struct { |
502 Message string `json:"message"` | 504 Message string `json:"message"` |
503 }{ | 505 }{ |
504 Message: msg, | 506 Message: msg, |
505 } | 507 } |
506 | 508 |
507 jr = JSONResult{Result: &result} | 509 jr = mw.JSONResult{Result: &result} |
508 return | 510 return |
509 } | 511 } |
510 | 512 |
511 func decideImport( | 513 func decideImport( |
512 req *http.Request, | 514 req *http.Request, |
525 var kind string | 527 var kind string |
526 | 528 |
527 err = tx.QueryRowContext(ctx, isPendingSQL, id).Scan(&pending, &kind) | 529 err = tx.QueryRowContext(ctx, isPendingSQL, id).Scan(&pending, &kind) |
528 switch { | 530 switch { |
529 case err == sql.ErrNoRows: | 531 case err == sql.ErrNoRows: |
530 err = JSONError{ | 532 err = mw.JSONError{ |
531 Code: http.StatusNotFound, | 533 Code: http.StatusNotFound, |
532 Message: fmt.Sprintf("cannot find import #%d", id), | 534 Message: fmt.Sprintf("cannot find import #%d", id), |
533 } | 535 } |
534 return | 536 return |
535 case err != nil: | 537 case err != nil: |
536 return | 538 return |
537 case !pending: | 539 case !pending: |
538 err = JSONError{ | 540 err = mw.JSONError{ |
539 Code: http.StatusConflict, | 541 Code: http.StatusConflict, |
540 Message: fmt.Sprintf("import #%d is not pending", id), | 542 Message: fmt.Sprintf("import #%d is not pending", id), |
541 } | 543 } |
542 return | 544 return |
543 } | 545 } |