changeset 5129:882b3d2308c4 queued-stage-done

Merge default into queued-stage-done
author Tom Gottfried <tom@intevation.de>
date Fri, 27 Mar 2020 12:24:25 +0100
parents 6910c1cad1fb (current diff) 7bd9c5161836 (diff)
children 52e3980e3462
files schema/gemma.sql
diffstat 8 files changed, 57 insertions(+), 42 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/controllers/routes.go	Fri Mar 27 00:40:52 2020 +0100
+++ b/pkg/controllers/routes.go	Fri Mar 27 12:24:25 2020 +0100
@@ -176,11 +176,6 @@
 		Handle: listSurveys,
 	})).Methods(http.MethodGet)
 
-	// Bottlenecks
-	api.Handle("/bottlenecks", any(&mw.JSONHandler{
-		Handle: listBottlenecks,
-	})).Methods(http.MethodGet)
-
 	// difference calculation
 	api.Handle("/diff", any(&mw.JSONHandler{
 		Input:  func(*http.Request) interface{} { return new(models.DiffCalculationInput) },
--- a/pkg/controllers/search.go	Fri Mar 27 00:40:52 2020 +0100
+++ b/pkg/controllers/search.go	Fri Mar 27 12:24:25 2020 +0100
@@ -15,7 +15,6 @@
 package controllers
 
 import (
-	"database/sql"
 	"net/http"
 	"strings"
 
@@ -26,18 +25,6 @@
 
 const (
 	searchMostSQL = `SELECT search_most($1)::text`
-
-	listBottlenecksSQL = `
-SELECT COALESCE(json_agg(r),'[]')
-FROM (
-  SELECT
-    objnam AS name,
-    ST_AsGeoJSON(ST_Centroid(area))::json AS geom,
-    'bottleneck' AS type
-  FROM waterway.bottlenecks
-  WHERE validity @> current_timestamp
-ORDER BY objnam) r
-`
 )
 
 func searchFeature(req *http.Request) (jr mw.JSONResult, err error) {
@@ -66,24 +53,3 @@
 	jr.Result = strings.NewReader(result)
 	return
 }
-
-func listBottlenecks(req *http.Request) (jr mw.JSONResult, err error) {
-
-	var result string
-	err = mw.JSONConn(req).QueryRowContext(
-		req.Context(), listBottlenecksSQL).Scan(&result)
-
-	switch {
-	case err == sql.ErrNoRows:
-		err = mw.JSONError{
-			Code:    http.StatusNotFound,
-			Message: "Cannot find any bottleneck.",
-		}
-		return
-	case err != nil:
-		return
-	}
-
-	jr = mw.JSONResult{Result: strings.NewReader(result)}
-	return
-}
--- a/pkg/imports/dsr.go	Fri Mar 27 00:40:52 2020 +0100
+++ b/pkg/imports/dsr.go	Fri Mar 27 12:24:25 2020 +0100
@@ -112,8 +112,13 @@
 		dsr.BottleneckID, dsr.Date.Time)
 
 	var id int64
-	if err := tx.QueryRowContext(ctx, dsrFindSQL,
-		dsr.BottleneckID, dsr.Date.Time).Scan(&id); err != nil {
+	switch err := tx.QueryRowContext(ctx, dsrFindSQL,
+		dsr.BottleneckID, dsr.Date.Time).Scan(&id); err {
+	case sql.ErrNoRows:
+		return nil, UnchangedError("Sounding result does not exist")
+	case nil:
+		// Continue
+	default:
 		return nil, err
 	}
 
--- a/pkg/pgxutils/errors.go	Fri Mar 27 00:40:52 2020 +0100
+++ b/pkg/pgxutils/errors.go	Fri Mar 27 12:24:25 2020 +0100
@@ -132,6 +132,13 @@
 					c = http.StatusConflict
 					return
 				}
+			case "fairway_dimensions":
+				switch err.ConstraintName {
+				case "fairway_dimensions_area_unique":
+					m = "Duplicate fairway area"
+					c = http.StatusConflict
+					return
+				}
 			}
 		}
 	case exclusionViolation:
--- a/schema/gemma.sql	Fri Mar 27 00:40:52 2020 +0100
+++ b/schema/gemma.sql	Fri Mar 27 12:24:25 2020 +0100
@@ -721,6 +721,9 @@
     CREATE TRIGGER fairway_dimensions_date_info
         BEFORE UPDATE ON fairway_dimensions
         FOR EACH ROW EXECUTE PROCEDURE update_date_info()
+    CREATE CONSTRAINT TRIGGER fairway_dimensions_area_unique
+        AFTER INSERT OR UPDATE OF area, staging_done ON fairway_dimensions
+        FOR EACH ROW EXECUTE FUNCTION prevent_st_equals('area', 'staging_done')
 
     --
     -- Bottlenecks
--- a/schema/gemma_tests.sql	Fri Mar 27 00:40:52 2020 +0100
+++ b/schema/gemma_tests.sql	Fri Mar 27 12:24:25 2020 +0100
@@ -52,3 +52,38 @@
     $$,
     23505, NULL,
     'No duplicate geometries can be inserted into waterway_area');
+
+SELECT throws_ok($$
+    INSERT INTO waterway.fairway_dimensions (
+        area, level_of_service,
+        min_width, max_width, min_depth, source_organization
+    ) VALUES (
+        ST_GeogFromText('MULTIPOLYGON(((0 0, 1 1, 1 0, 0 0)))'), 3,
+        100, 200, 2, 'test'
+    ), (
+        ST_GeogFromText('MULTIPOLYGON(((0 0, 1 1, 1 0, 0 0)))'), 3,
+        100, 200, 2, 'test'
+    )
+    $$,
+    23505, NULL,
+    'No duplicate geometries can be inserted into fairway_dimensions');
+
+SELECT lives_ok($$
+    INSERT INTO waterway.fairway_dimensions (
+        area, level_of_service,
+        min_width, max_width, min_depth, source_organization, staging_done
+    ) VALUES (
+        ST_GeogFromText('MULTIPOLYGON(((0 0, 1 1, 1 0, 0 0)))'), 3,
+        100, 200, 2, 'test', false
+    ), (
+        ST_GeogFromText('MULTIPOLYGON(((0 0, 1 1, 1 0, 0 0)))'), 3,
+        100, 200, 2, 'test', true
+    )
+    $$,
+    'Duplicate fairway area can be inserted if stage_done differs');
+
+SELECT throws_ok($$
+    UPDATE waterway.fairway_dimensions SET staging_done = true
+    $$,
+    23505, NULL,
+    'No duplicate fairway area can be released from staging area');
--- a/schema/run_tests.sh	Fri Mar 27 00:40:52 2020 +0100
+++ b/schema/run_tests.sh	Fri Mar 27 12:24:25 2020 +0100
@@ -80,7 +80,7 @@
     -c 'SET client_min_messages TO WARNING' \
     -c "DROP ROLE IF EXISTS $TEST_ROLES" \
     -f "$BASEDIR"/tap_tests_data.sql \
-    -c "SELECT plan(85 + (
+    -c "SELECT plan(88 + (
             SELECT count(*)::int
                 FROM information_schema.tables
                 WHERE table_schema = 'waterway'))" \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/schema/updates/1431/01.prevent_equal_fairway_areas.sql	Fri Mar 27 12:24:25 2020 +0100
@@ -0,0 +1,4 @@
+CREATE CONSTRAINT TRIGGER fairway_dimensions_area_unique
+    AFTER INSERT OR UPDATE OF area, staging_done
+    ON waterway.fairway_dimensions
+    FOR EACH ROW EXECUTE FUNCTION prevent_st_equals('area', 'staging_done');