changeset 846:6902032757e4

Added end point to set style (colour) information for feature.
author Sascha Wilde <wilde@intevation.de>
date Fri, 28 Sep 2018 11:51:06 +0200
parents 596ef3b46028
children 82765aa6de53
files pkg/controllers/routes.go pkg/controllers/system.go pkg/models/system.go schema/auth.sql
diffstat 4 files changed, 63 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/controllers/routes.go	Fri Sep 28 11:48:57 2018 +0200
+++ b/pkg/controllers/routes.go	Fri Sep 28 11:51:06 2018 +0200
@@ -59,6 +59,11 @@
 		Handle: getFeatureStyle,
 	})).Methods(http.MethodGet)
 
+	api.Handle("/system/style/{feature}/{attr}", any(&JSONHandler{
+		Input:  func() interface{} { return new(models.Colour) },
+		Handle: setFeatureStyle,
+	})).Methods(http.MethodPut)
+
 	// Password resets.
 	api.Handle("/users/passwordreset", &JSONHandler{
 		Input:  func() interface{} { return new(models.PWResetUser) },
--- a/pkg/controllers/system.go	Fri Sep 28 11:48:57 2018 +0200
+++ b/pkg/controllers/system.go	Fri Sep 28 11:51:06 2018 +0200
@@ -15,6 +15,9 @@
 	getFeatureColourSQL = `SELECT r,g,b,a
 FROM systemconf.feature_colours
 WHERE feature_name = $1 AND style_attr = $2`
+	setFeatureColourSQL = `UPDATE systemconf.feature_colours
+SET (r, g, b, a) = ($3, $4, $5, $6)
+WHERE feature_name = $1 AND style_attr = $2`
 )
 
 // System status end points
@@ -97,3 +100,46 @@
 	}{c, fmt.Sprintf("rgba(%d, %d, %d, %g)", c.R, c.G, c.B, c.A)}
 	return
 }
+
+func setFeatureStyle(
+	input interface{},
+	req *http.Request,
+	db *sql.Conn,
+) (jr JSONResult, err error) {
+
+	feature := mux.Vars(req)["feature"]
+	attr := mux.Vars(req)["attr"]
+
+	c := input.(*models.Colour)
+	if !c.IsValid() {
+		err = JSONError{http.StatusBadRequest, "error: invalid colours"}
+		return
+	}
+
+	var res sql.Result
+	res, err = db.ExecContext(
+		req.Context(),
+		setFeatureColourSQL,
+		feature, attr,
+		c.R, c.G, c.B, c.A)
+
+	if err != nil {
+		return
+	}
+
+	if n, err2 := res.RowsAffected(); err2 == nil && n == 0 {
+		err = JSONError{
+			Code:    http.StatusNotFound,
+			Message: "Requestes style not found.",
+		}
+		return
+	}
+
+	jr = JSONResult{
+		Code: http.StatusCreated,
+		Result: struct {
+			Result string `json:"result"`
+		}{"success"},
+	}
+	return
+}
--- a/pkg/models/system.go	Fri Sep 28 11:48:57 2018 +0200
+++ b/pkg/models/system.go	Fri Sep 28 11:51:06 2018 +0200
@@ -8,3 +8,14 @@
 		A float32 `json:"a"`
 	}
 )
+
+func isByteRange(i int) bool {
+	return i >= 0 && i < 256
+}
+
+func (c Colour) IsValid() bool {
+	return isByteRange(c.R) &&
+		isByteRange(c.G) &&
+		isByteRange(c.B) &&
+		c.A >= 0 && c.A <= 1
+}
--- a/schema/auth.sql	Fri Sep 28 11:48:57 2018 +0200
+++ b/schema/auth.sql	Fri Sep 28 11:51:06 2018 +0200
@@ -32,6 +32,7 @@
 GRANT USAGE ON SCHEMA sys_admin TO sys_admin;
 GRANT SELECT ON ALL TABLES IN SCHEMA sys_admin TO sys_admin;
 GRANT UPDATE ON sys_admin.system_config TO sys_admin;
+GRANT UPDATE ON systemconf.feature_colours TO sys_admin;
 GRANT INSERT, DELETE ON sys_admin.password_reset_requests TO sys_admin;
 GRANT INSERT, DELETE, UPDATE ON waterway.sounding_results_contour_lines TO sys_admin;