comparison pkg/controllers/importqueue.go @ 1315:24e4c60c2606

Simplified and fixed filtering of import queue listing.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 23 Nov 2018 19:41:31 +0100
parents 486d66a9565c
children d753ce6cf588
comparison
equal deleted inserted replaced
1314:97d9e689520b 1315:24e4c60c2606
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de> 12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de>
13 13
14 package controllers 14 package controllers
15 15
16 import ( 16 import (
17 "context"
18 "database/sql" 17 "database/sql"
19 "fmt" 18 "fmt"
20 "log" 19 "log"
21 "net/http" 20 "net/http"
22 "strconv" 21 "strconv"
89 return &ta 88 return &ta
90 } 89 }
91 90
92 func queryImportListStmt( 91 func queryImportListStmt(
93 conn *sql.Conn, 92 conn *sql.Conn,
94 ctx context.Context, 93 req *http.Request,
95 vars map[string]string,
96 ) (*sql.Rows, error) { 94 ) (*sql.Rows, error) {
97 95
98 var ( 96 var (
99 stmt strings.Builder 97 stmt strings.Builder
100 args []interface{} 98 args []interface{}
101 states *pgtype.TextArray 99 states *pgtype.TextArray
102 kinds *pgtype.TextArray 100 kinds *pgtype.TextArray
103 ) 101 )
104 102
105 if st, found := vars["states"]; found { 103 arg := func(format string, v interface{}) {
104 fmt.Fprintf(&stmt, format, len(args)+1)
105 args = append(args, v)
106 }
107
108 if st := req.FormValue("states"); st != "" {
106 states = toTextArray(st, imports.ImportStateNames) 109 states = toTextArray(st, imports.ImportStateNames)
107 } 110 }
108 111
109 if ks, found := vars["kinds"]; found { 112 if ks := req.FormValue("kinds"); ks != "" {
110 kinds = toTextArray(ks, imports.ImportKindNames) 113 kinds = toTextArray(ks, imports.ImportKindNames)
111 } 114 }
112 115
113 stmt.WriteString(selectImportsSQL) 116 stmt.WriteString(selectImportsSQL)
114 if states != nil || kinds != nil { 117 if states != nil || kinds != nil {
115 stmt.WriteString(" WHERE ") 118 stmt.WriteString(" WHERE ")
116 } 119 }
117 120
118 if states != nil { 121 if states != nil {
119 fmt.Fprintf(&stmt, " states = ANY($%d) ", len(args)+1) 122 arg(" state = ANY($%d) ", states)
120 args = append(args, states)
121 } 123 }
122 124
123 if states != nil && kinds != nil { 125 if states != nil && kinds != nil {
124 stmt.WriteString("AND") 126 stmt.WriteString("AND")
125 } 127 }
126 128
127 if kinds != nil { 129 if kinds != nil {
128 fmt.Fprintf(&stmt, " kind = ANY($%d) ", len(args)+1) 130 arg(" kind = ANY($%d) ", kinds)
129 args = append(args, kinds)
130 } 131 }
131 132
132 stmt.WriteString(" ORDER BY enqueued DESC ") 133 stmt.WriteString(" ORDER BY enqueued DESC ")
133 134
134 if lim, found := vars["limit"]; found { 135 if lim := req.FormValue("limit"); lim != "" {
135 fmt.Fprintf(&stmt, " LIMIT $%d ", len(args)+1) 136 limit, err := strconv.ParseInt(lim, 10, 64)
136 limit, _ := strconv.ParseInt(lim, 10, 64) 137 if err != nil {
137 args = append(args, limit) 138 return nil, err
138 } 139 }
139 140 arg(" LIMIT $%d ", limit)
140 if ofs, found := vars["offset"]; found { 141 }
141 fmt.Fprintf(&stmt, " OFFSET $%d ", len(args)+1) 142
142 offset, _ := strconv.ParseInt(ofs, 10, 64) 143 if ofs := req.FormValue("offset"); ofs != "" {
143 args = append(args, offset) 144 offset, err := strconv.ParseInt(ofs, 10, 64)
144 } 145 if err != nil {
145 146 return nil, err
146 return conn.QueryContext(ctx, stmt.String(), args...) 147 }
148 arg(" OFFSET $%d ", offset)
149 }
150
151 return conn.QueryContext(req.Context(), stmt.String(), args...)
147 } 152 }
148 153
149 func listImports( 154 func listImports(
150 _ interface{}, 155 _ interface{},
151 req *http.Request, 156 req *http.Request,
152 conn *sql.Conn, 157 conn *sql.Conn,
153 ) (jr JSONResult, err error) { 158 ) (jr JSONResult, err error) {
154 159
155 var rows *sql.Rows 160 var rows *sql.Rows
156 rows, err = queryImportListStmt(conn, req.Context(), mux.Vars(req)) 161 rows, err = queryImportListStmt(conn, req)
157 if err != nil { 162 if err != nil {
158 return 163 return
159 } 164 }
160 defer rows.Close() 165 defer rows.Close()
161 166