Mercurial > gemma
diff pkg/controllers/importqueue.go @ 5028:d727641911a5
Moved import desision logic to import queue (where it belongs).
Major change: StageDone of the import job is executed by the original user
who does the import.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Wed, 18 Mar 2020 17:52:00 +0100 |
parents | 1fef4679b07a |
children | 66270586031a |
line wrap: on
line diff
--- a/pkg/controllers/importqueue.go Wed Mar 18 14:52:36 2020 +0100 +++ b/pkg/controllers/importqueue.go Wed Mar 18 17:52:00 2020 +0100 @@ -583,28 +583,6 @@ return } -const ( - isPendingSQL = ` -SELECT state = 'pending'::import_state, kind -FROM import.imports -WHERE id = $1` - - reviewSQL = ` -UPDATE import.imports SET - state = $1::import_state, - changed = CURRENT_TIMESTAMP, - signer = $2 -WHERE id = $3` - - deleteImportDataSQL = `SELECT import.del_import($1)` - - deleteImportTrackSQL = ` -DELETE FROM import.track_imports WHERE import_id = $1` - - logDecisionSQL = ` -INSERT INTO import.import_logs (import_id, msg) VALUES ($1, $2)` -) - func reviewImports(req *http.Request) (mw.JSONResult, error) { rs := *mw.JSONInput(req).(*[]models.Review) @@ -617,11 +595,9 @@ results := make([]reviewResult, len(rs)) - conn := mw.JSONConn(req) - for i := range rs { rev := &rs[i] - msg, err := decideImport(req, conn, rev.ID, string(rev.State)) + msg, err := decideImport(req, rev.ID, string(rev.State)) var errString string if err != nil { errString = err.Error() @@ -643,7 +619,7 @@ state := vars["state"] var msg string - if msg, err = decideImport(req, mw.JSONConn(req), id, state); err != nil { + if msg, err = decideImport(req, id, state); err != nil { return } @@ -659,70 +635,21 @@ func decideImport( req *http.Request, - conn *sql.Conn, id int64, state string, ) (message string, err error) { ctx := req.Context() - var tx *sql.Tx - if tx, err = conn.BeginTx(ctx, nil); err != nil { - return - } - defer tx.Rollback() - var pending bool - var kind string + accepted := state == "accepted" - err = tx.QueryRowContext(ctx, isPendingSQL, id).Scan(&pending, &kind) - switch { - case err == sql.ErrNoRows: - err = mw.JSONError{ - Code: http.StatusNotFound, - Message: fmt.Sprintf("cannot find import #%d", id), - } - return - case err != nil: - return - case !pending: - err = mw.JSONError{ - Code: http.StatusConflict, - Message: fmt.Sprintf("import #%d is not pending", id), - } - return - } + session, _ := auth.GetSession(req) + reviewer := session.User - if state == "accepted" { - if jc := imports.FindJobCreator(imports.JobKind(kind)); jc != nil { - if err = jc.StageDone(ctx, tx, id); err != nil { - return - } - } - - } else { - if _, err = tx.ExecContext(ctx, deleteImportDataSQL, id); err != nil { - return + if err = imports.DecideImport(ctx, id, accepted, reviewer); err != nil { + err = mw.JSONError{ + Code: http.StatusBadRequest, + Message: err.Error(), } - } - - // Remove the import track - if _, err = tx.ExecContext(ctx, deleteImportTrackSQL, id); err != nil { - return - } - - // Log the decision and set the final state. - session, _ := auth.GetSession(req) - who := session.User - - if _, err = tx.ExecContext(ctx, logDecisionSQL, id, - fmt.Sprintf("User '%s' %s import %d.", who, state, id)); err != nil { - return - } - - if _, err = tx.ExecContext(ctx, reviewSQL, state, who, id); err != nil { - return - } - - if err = tx.Commit(); err != nil { return }