diff pkg/controllers/user.go @ 1654:85386ad17d34

Scheduled imports: Don't track the user in the running scheduler. The user is stored in the database already.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 20 Dec 2018 18:39:19 +0100
parents 5f80ec319a4f
children f32e8a973b48
line wrap: on
line diff
--- a/pkg/controllers/user.go	Thu Dec 20 18:14:28 2018 +0100
+++ b/pkg/controllers/user.go	Thu Dec 20 18:39:19 2018 +0100
@@ -17,6 +17,7 @@
 
 import (
 	"bytes"
+	"context"
 	"database/sql"
 	"fmt"
 	"log"
@@ -71,6 +72,10 @@
   ST_XMax(map_extent), ST_YMax(map_extent)
 FROM users.list_users
 WHERE username = $1`
+
+	scheduledIDsSQL = `
+SELECT id from waterway.import_configuration
+WHERE username = $1`
 )
 
 var (
@@ -96,6 +101,30 @@
 (inkluding import errors) and details on the concerned import.`))
 )
 
+func scheduledIDs(
+	ctx context.Context,
+	conn *sql.Conn,
+	user string,
+) (map[int64]struct{}, error) {
+	ids := map[int64]struct{}{}
+	rows, err := conn.QueryContext(ctx, scheduledIDsSQL, user)
+	if err != nil {
+		return nil, nil
+	}
+	defer rows.Close()
+	for rows.Next() {
+		var id int64
+		if err := rows.Scan(&id); err != nil {
+			return nil, err
+		}
+		ids[id] = struct{}{}
+	}
+	if err := rows.Err(); err != nil {
+		return nil, err
+	}
+	return ids, nil
+}
+
 func deleteUser(
 	_ interface{}, req *http.Request,
 	db *sql.Conn,
@@ -113,6 +142,16 @@
 		return
 	}
 
+	// Remove scheduled tasks.
+	ids, err2 := scheduledIDs(req.Context(), db, user)
+	if err2 == nil {
+		if len(ids) > 0 {
+			go func() { scheduler.UnbindByIDs(ids) }()
+		}
+	} else {
+		log.Printf("error: %v\n", err2)
+	}
+
 	var res sql.Result
 
 	if res, err = db.ExecContext(req.Context(), deleteUserSQL, user); err != nil {
@@ -129,7 +168,6 @@
 
 	// Running in a go routine should not be necessary.
 	go func() { auth.Sessions.Logout(user) }()
-	go func() { scheduler.UnbindUser(user) }()
 
 	jr = JSONResult{Code: http.StatusNoContent}
 	return
@@ -207,7 +245,6 @@
 	if user != newUser.User {
 		// Running in a go routine should not be necessary.
 		go func() { auth.Sessions.Logout(string(user)) }()
-		go func() { scheduler.UnbindUser(string(user)) }()
 	}
 
 	jr = JSONResult{