diff pkg/imports/queue.go @ 1642:49c04bb64e0a

Import queue: Implemented auto-accept and email sending. TODO: Do actual email sending.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 20 Dec 2018 13:45:32 +0100
parents b10aa02d7819
children a0982c38eac0
line wrap: on
line diff
--- a/pkg/imports/queue.go	Thu Dec 20 13:19:54 2018 +0100
+++ b/pkg/imports/queue.go	Thu Dec 20 13:45:32 2018 +0100
@@ -83,10 +83,12 @@
 	}
 
 	idJob struct {
-		id   int64
-		kind JobKind
-		user string
-		data string
+		id         int64
+		kind       JobKind
+		user       string
+		sendEmail  bool
+		autoAccept bool
+		data       string
 	}
 )
 
@@ -128,11 +130,15 @@
 INSERT INTO waterway.imports (
   kind,
   username,
+  send_email,
+  auto_accept,
   data
 ) VALUES (
   $1,
   $2,
-  $3
+  $3,
+  $4,
+  $5
 ) RETURNING id`
 
 	selectJobSQL = `
@@ -140,6 +146,8 @@
   id,
   kind,
   username,
+  send_email,
+  auto_accept,
   data
 FROM waterway.imports
 WHERE state = 'queued'::waterway.import_state AND enqueued IN (
@@ -232,11 +240,23 @@
 	return q.creators[kind]
 }
 
-func (q *importQueue) addJob(kind JobKind, user, data string) (int64, error) {
+func (q *importQueue) addJob(
+	kind JobKind,
+	user string,
+	sendEmail, autoAccept bool,
+	data string,
+) (int64, error) {
 	ctx := context.Background()
 	var id int64
 	err := auth.RunAs(ctx, queueUser, func(conn *sql.Conn) error {
-		return conn.QueryRowContext(ctx, insertJobSQL, string(kind), user, data).Scan(&id)
+		return conn.QueryRowContext(
+			ctx,
+			insertJobSQL,
+			string(kind),
+			user,
+			sendEmail,
+			autoAccept,
+			data).Scan(&id)
 	})
 	if err == nil {
 		select {
@@ -250,8 +270,8 @@
 // AddJob adds a job to the global import queue to be executed
 // as soon as possible. This is gone in a separate Go routine
 // so this will not block.
-func AddJob(kind JobKind, user, data string) (int64, error) {
-	return iqueue.addJob(kind, user, data)
+func AddJob(kind JobKind, user string, sendEmail, autoAccept bool, data string) (int64, error) {
+	return iqueue.addJob(kind, user, sendEmail, autoAccept, data)
 }
 
 type logFeedback int64
@@ -333,7 +353,13 @@
 		}
 		defer tx.Rollback()
 		if err = tx.QueryRowContext(ctx, selectJobSQL, &kinds).Scan(
-			&ji.id, &ji.kind, &ji.user, &ji.data); err != nil {
+			&ji.id,
+			&ji.kind,
+			&ji.user,
+			&ji.sendEmail,
+			&ji.autoAccept,
+			&ji.data,
+		); err != nil {
 			return err
 		}
 		_, err = tx.ExecContext(ctx, updateStateSQL, "running", ji.id)
@@ -480,14 +506,18 @@
 			}
 
 			var state string
-			if errDo != nil || errCleanup != nil {
+			switch {
+			case errDo != nil || errCleanup != nil:
 				state = "failed"
-			} else {
+			case idj.autoAccept:
+				state = "accepted"
+			default:
 				state = "pending"
 			}
 			if err := updateStateSummary(ctx, idj.id, state, summary); err != nil {
 				log.Printf("setting state of job %d failed: %v\n", idj.id, err)
 			}
+			// TODO: Send email if sendEmail is set.
 			log.Printf("import #%d finished: %s\n", idj.id, state)
 		}(jc, idj)
 	}