# HG changeset patch # User Thomas Junk # Date 1543489741 -3600 # Node ID 5e1218b5a123dabaacfd4791420e88c184f07c2f # Parent c5e004b97394a5369c517677c148f1ccc99708ab proof of concept diff -r c5e004b97394 -r 5e1218b5a123 client/src/components/map/contextbox/Staging.vue --- 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 */ 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; diff -r c5e004b97394 -r 5e1218b5a123 client/src/store/imports.js --- 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 diff -r c5e004b97394 -r 5e1218b5a123 pkg/controllers/importqueue.go --- 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 { diff -r c5e004b97394 -r 5e1218b5a123 pkg/controllers/routes.go --- 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)