comparison pkg/controllers/user.go @ 1660:f32e8a973b48

Scheduler: Moved code to figure out the scheduled jobs per user from the database to a more suited place.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 21 Dec 2018 13:04:46 +0100
parents 85386ad17d34
children 7cf8a276a80c
comparison
equal deleted inserted replaced
1659:897e7cad7e77 1660:f32e8a973b48
15 15
16 package controllers 16 package controllers
17 17
18 import ( 18 import (
19 "bytes" 19 "bytes"
20 "context"
21 "database/sql" 20 "database/sql"
22 "fmt" 21 "fmt"
23 "log" 22 "log"
24 "net/http" 23 "net/http"
25 "text/template" 24 "text/template"
70 email_address, 69 email_address,
71 ST_XMin(map_extent), ST_YMin(map_extent), 70 ST_XMin(map_extent), ST_YMin(map_extent),
72 ST_XMax(map_extent), ST_YMax(map_extent) 71 ST_XMax(map_extent), ST_YMax(map_extent)
73 FROM users.list_users 72 FROM users.list_users
74 WHERE username = $1` 73 WHERE username = $1`
75
76 scheduledIDsSQL = `
77 SELECT id from waterway.import_configuration
78 WHERE username = $1`
79 ) 74 )
80 75
81 var ( 76 var (
82 testSysadminNotifyMailTmpl = template.Must( 77 testSysadminNotifyMailTmpl = template.Must(
83 template.New("sysadmin").Parse(`Dear {{ .User }}, 78 template.New("sysadmin").Parse(`Dear {{ .User }},
99 When the status of an data import managed by you changes an automated mail will 94 When the status of an data import managed by you changes an automated mail will
100 be send to the address: {{ .Email }} with details on the new import status 95 be send to the address: {{ .Email }} with details on the new import status
101 (inkluding import errors) and details on the concerned import.`)) 96 (inkluding import errors) and details on the concerned import.`))
102 ) 97 )
103 98
104 func scheduledIDs(
105 ctx context.Context,
106 conn *sql.Conn,
107 user string,
108 ) (map[int64]struct{}, error) {
109 ids := map[int64]struct{}{}
110 rows, err := conn.QueryContext(ctx, scheduledIDsSQL, user)
111 if err != nil {
112 return nil, nil
113 }
114 defer rows.Close()
115 for rows.Next() {
116 var id int64
117 if err := rows.Scan(&id); err != nil {
118 return nil, err
119 }
120 ids[id] = struct{}{}
121 }
122 if err := rows.Err(); err != nil {
123 return nil, err
124 }
125 return ids, nil
126 }
127
128 func deleteUser( 99 func deleteUser(
129 _ interface{}, req *http.Request, 100 _ interface{}, req *http.Request,
130 db *sql.Conn, 101 db *sql.Conn,
131 ) (jr JSONResult, err error) { 102 ) (jr JSONResult, err error) {
132 103
140 if session.User == user { 111 if session.User == user {
141 err = JSONError{http.StatusBadRequest, "error: cannot delete yourself"} 112 err = JSONError{http.StatusBadRequest, "error: cannot delete yourself"}
142 return 113 return
143 } 114 }
144 115
116 ctx := req.Context()
117
145 // Remove scheduled tasks. 118 // Remove scheduled tasks.
146 ids, err2 := scheduledIDs(req.Context(), db, user) 119 ids, err2 := scheduler.ScheduledUserIDs(ctx, db, user)
147 if err2 == nil { 120 if err2 == nil {
148 if len(ids) > 0 { 121 if len(ids) > 0 {
149 go func() { scheduler.UnbindByIDs(ids) }() 122 go func() { scheduler.UnbindByIDs(ids) }()
150 } 123 }
151 } else { 124 } else {
152 log.Printf("error: %v\n", err2) 125 log.Printf("error: %v\n", err2)
153 } 126 }
154 127
155 var res sql.Result 128 var res sql.Result
156 129
157 if res, err = db.ExecContext(req.Context(), deleteUserSQL, user); err != nil { 130 if res, err = db.ExecContext(ctx, deleteUserSQL, user); err != nil {
158 return 131 return
159 } 132 }
160 133
161 if n, err2 := res.RowsAffected(); err2 == nil && n == 0 { 134 if n, err2 := res.RowsAffected(); err2 == nil && n == 0 {
162 err = JSONError{ 135 err = JSONError{