changeset 1468:5e1218b5a123 bulkreview

proof of concept
author Thomas Junk <thomas.junk@intevation.de>
date Thu, 29 Nov 2018 12:09:01 +0100
parents c5e004b97394
children 286a3306f6bf
files client/src/components/map/contextbox/Staging.vue client/src/store/imports.js pkg/controllers/importqueue.go pkg/controllers/routes.go
diffstat 4 files changed, 79 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/client/src/components/map/contextbox/Staging.vue	Thu Nov 29 09:59:10 2018 +0100
+++ b/client/src/components/map/contextbox/Staging.vue	Thu Nov 29 12:09:01 2018 +0100
@@ -85,6 +85,7 @@
  * Markus Kottländer <markus@intevation.de>
  */
 import { mapState } from "vuex";
+import { HTTP } from "../../../lib/http.js";
 import { STATES } from "../../../store/imports.js";
 import { displayError, displayInfo } from "../../../lib/errors.js";
 
@@ -93,13 +94,7 @@
     return {};
   },
   mounted() {
-    this.$store.dispatch("imports/getStaging").catch(error => {
-      const { status, data } = error.response;
-      displayError({
-        title: "Backend Error",
-        message: `${status}: ${data.message || data}`
-      });
-    });
+    this.loadData();
   },
   computed: {
     ...mapState("application", ["searchQuery"]),
@@ -115,16 +110,47 @@
   },
   STATES: STATES,
   methods: {
+    loadData() {
+      this.$store.dispatch("imports/getStaging").catch(error => {
+        const { status, data } = error.response;
+        displayError({
+          title: "Backend Error",
+          message: `${status}: ${data.message || data}`
+        });
+      });
+    },
     confirmReview() {
-      const message = this.staging
-        .map(x => {
-          return x.id + ": " + x.status;
+      const reviewResults = this.staging.map(r => {
+        return {
+          id: r.id,
+          state: r.status
+        };
+      });
+      HTTP.patch("/imports", reviewResults, {
+        headers: {
+          "X-Gemma-Auth": localStorage.getItem("token"),
+          "Content-type": "application/json"
+        }
+      })
+        .then(() => {
+          const message = this.staging
+            .map(x => {
+              return x.id + ": " + x.status;
+            })
+            .join("\n");
+          displayInfo({
+            title: "Staging Area",
+            message: message
+          });
+          this.loadData();
         })
-        .join("\n");
-      displayInfo({
-        title: "Staging Area",
-        message: message
-      });
+        .catch(error => {
+          const { status, data } = error.response;
+          displayError({
+            title: "Backend Error",
+            message: `${status}: ${data.message || data}`
+          });
+        });
     },
     needsApproval(item) {
       return item.status === STATES.NEEDSAPPROVAL;
--- a/client/src/store/imports.js	Thu Nov 29 09:59:10 2018 +0100
+++ b/client/src/store/imports.js	Thu Nov 29 12:09:01 2018 +0100
@@ -17,9 +17,9 @@
 /* eslint-disable no-unused-vars */
 /* eslint-disable no-unreachable */
 const STATES = {
-  NEEDSAPPROVAL: "NEEDSAPPROVAL",
-  APPROVED: "APPROVED",
-  REJECTED: "REJECTED"
+  NEEDSAPPROVAL: "pending",
+  APPROVED: "accepted",
+  REJECTED: "rejected"
 };
 
 // initial state
--- a/pkg/controllers/importqueue.go	Thu Nov 29 09:59:10 2018 +0100
+++ b/pkg/controllers/importqueue.go	Thu Nov 29 12:09:01 2018 +0100
@@ -66,6 +66,15 @@
 DELETE FROM waterway.imports WHERE id = $1`
 )
 
+type Review struct {
+	ID    int64  `json:"id"`
+	State string `json:"state"`
+}
+
+func (r Review) String() string {
+	return fmt.Sprintf("%d %s", r.ID, r.State)
+}
+
 func toTextArray(txt string, allowed []string) *pgtype.TextArray {
 	parts := strings.Split(txt, ",")
 	var accepted []string
@@ -334,6 +343,20 @@
 INSERT INTO waterway.import_logs (import_id, msg) VALUES ($1, $2)`
 )
 
+func reviewImports(
+	_ interface{},
+	req *http.Request,
+	conn *sql.Conn,
+) (jr JSONResult, err error) {
+	decoder := json.NewDecoder(req.Body)
+	var reviews []Review
+	decoder.Decode(&reviews)
+	for _, review := range reviews {
+		updateImport(req, conn, review.ID, review.State)
+	}
+	return
+}
+
 func reviewImport(
 	_ interface{},
 	req *http.Request,
@@ -343,7 +366,15 @@
 	vars := mux.Vars(req)
 	id, _ := strconv.ParseInt(vars["id"], 10, 64)
 	state := vars["state"]
+	return updateImport(req, conn, id, state)
+}
 
+func updateImport(
+	req *http.Request,
+	conn *sql.Conn,
+	id int64,
+	state string,
+) (jr JSONResult, err error) {
 	ctx := req.Context()
 	var tx *sql.Tx
 	if tx, err = conn.BeginTx(ctx, nil); err != nil {
--- a/pkg/controllers/routes.go	Thu Nov 29 09:59:10 2018 +0100
+++ b/pkg/controllers/routes.go	Thu Nov 29 12:09:01 2018 +0100
@@ -182,6 +182,10 @@
 		Handle: importLogs,
 	})).Methods(http.MethodGet)
 
+	api.Handle("/imports", waterwayAdmin(&JSONHandler{
+		Handle: reviewImports,
+	})).Methods(http.MethodPatch)
+
 	api.Handle("/imports/{id:[0-9]+}", waterwayAdmin(&JSONHandler{
 		Handle: deleteImport,
 	})).Methods(http.MethodDelete)