Mercurial > gemma
annotate pkg/controllers/surveys.go @ 5575:6709530f002e surveysperbottleneckid
surveys endpoint: enforce query parameters. Get rid of unnecessary else-clause
author | Thomas Junk <thomas.junk@intevation.de> |
---|---|
date | Wed, 21 Jul 2021 15:14:40 +0200 |
parents | 271888ef85bc |
children | 0011f50cf216 |
rev | line source |
---|---|
1017
a244b18cb916
Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
825
diff
changeset
|
1 // This is Free Software under GNU Affero General Public License v >= 3.0 |
a244b18cb916
Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
825
diff
changeset
|
2 // without warranty, see README.md and license for details. |
a244b18cb916
Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
825
diff
changeset
|
3 // |
a244b18cb916
Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
825
diff
changeset
|
4 // SPDX-License-Identifier: AGPL-3.0-or-later |
a244b18cb916
Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
825
diff
changeset
|
5 // License-Filename: LICENSES/AGPL-3.0.txt |
a244b18cb916
Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
825
diff
changeset
|
6 // |
2129
8f6345ad5f13
Extend /surveys/ endpoint to include reference gauge
Bernhard Reiter <bernhard@intevation.de>
parents:
1572
diff
changeset
|
7 // Copyright (C) 2018, 2019 by via donau |
1017
a244b18cb916
Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
825
diff
changeset
|
8 // – Österreichische Wasserstraßen-Gesellschaft mbH |
a244b18cb916
Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
825
diff
changeset
|
9 // Software engineering by Intevation GmbH |
a244b18cb916
Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
825
diff
changeset
|
10 // |
a244b18cb916
Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
825
diff
changeset
|
11 // Author(s): |
a244b18cb916
Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
825
diff
changeset
|
12 // * Sascha Wilde <sascha.wilde@intevation.de> |
1317
5443f5c9154c
Added missing authors names in Go files.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1017
diff
changeset
|
13 // * Sascha L. Teichmann <sascha.teichmann@intevation.de> |
2129
8f6345ad5f13
Extend /surveys/ endpoint to include reference gauge
Bernhard Reiter <bernhard@intevation.de>
parents:
1572
diff
changeset
|
14 // * Bernhard Reiter <bernhard.reiter@intevation.de> |
1017
a244b18cb916
Added GNU Affero General Public License.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
825
diff
changeset
|
15 |
812
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
16 package controllers |
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
17 |
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
18 import ( |
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
19 "database/sql" |
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
20 "net/http" |
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
21 |
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
22 "gemma.intevation.de/gemma/pkg/models" |
4244
4394daeea96a
Moved JSONHandler into middleware package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4243
diff
changeset
|
23 |
4394daeea96a
Moved JSONHandler into middleware package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4243
diff
changeset
|
24 mw "gemma.intevation.de/gemma/pkg/middleware" |
812
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
25 ) |
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
26 |
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
27 const ( |
5574
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
28 listSurveysByIdSQL = ` |
4782
fc082c611b8b
api/surveys list all existing surveys (no filter by gauge validity)
Sascha Wilde <wilde@intevation.de>
parents:
4244
diff
changeset
|
29 SELECT DISTINCT |
1572
056a86b24be2
Made bottleneck primary key an int. Attention: This may break something!
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1332
diff
changeset
|
30 s.bottleneck_id, |
2129
8f6345ad5f13
Extend /surveys/ endpoint to include reference gauge
Bernhard Reiter <bernhard@intevation.de>
parents:
1572
diff
changeset
|
31 s.date_info::text, |
2146
7267f8168176
Extending endpoint /surveys to return depth_reference
Bernhard Reiter <bernhard@intevation.de>
parents:
2129
diff
changeset
|
32 s.depth_reference, |
4891
e68220372832
List surveys even if mandatory base data is missing.
Sascha Wilde <wilde@intevation.de>
parents:
4782
diff
changeset
|
33 COALESCE(g.objname, 'ERROR: MISSING GAUGE') AS gauge_objname, |
5405
5e7fca6ef935
When listing surveys tell survey type as well.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4891
diff
changeset
|
34 r.value AS waterlevel_value, |
5406 | 35 COALESCE(s.surtyp, 'ERROR: MISSING SURVEY TYPE') AS surtype |
3302
ec6163c6687d
'Historicise' gauges on import
Tom Gottfried <tom@intevation.de>
parents:
2317
diff
changeset
|
36 FROM waterway.bottlenecks AS b |
4050
02d5c2e17eb8
Adapted surveys back end to new historization model.
Sascha Wilde <wilde@intevation.de>
parents:
3656
diff
changeset
|
37 JOIN waterway.sounding_results AS s ON b.bottleneck_id = s.bottleneck_id |
4891
e68220372832
List surveys even if mandatory base data is missing.
Sascha Wilde <wilde@intevation.de>
parents:
4782
diff
changeset
|
38 LEFT JOIN waterway.gauges AS g |
4050
02d5c2e17eb8
Adapted surveys back end to new historization model.
Sascha Wilde <wilde@intevation.de>
parents:
3656
diff
changeset
|
39 ON b.gauge_location = g.location AND s.date_info::timestamptz <@ g.validity |
3302
ec6163c6687d
'Historicise' gauges on import
Tom Gottfried <tom@intevation.de>
parents:
2317
diff
changeset
|
40 LEFT JOIN waterway.gauges_reference_water_levels AS r |
3645
02951a62e8c6
'Historicise' bottlenecks on import
Tom Gottfried <tom@intevation.de>
parents:
3302
diff
changeset
|
41 ON s.depth_reference = r.depth_reference |
02951a62e8c6
'Historicise' bottlenecks on import
Tom Gottfried <tom@intevation.de>
parents:
3302
diff
changeset
|
42 AND g.location = r.location AND g.validity = r.validity |
5572
3b842e951317
change use from name of bottleneck to its id.
Thomas Junk <thomas.junk@intevation.de>
parents:
5462
diff
changeset
|
43 WHERE b.bottleneck_id = $1` |
5574
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
44 |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
45 listSurveysByNameDateSQL = ` |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
46 SELECT DISTINCT |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
47 s.bottleneck_id, |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
48 s.date_info::text, |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
49 s.depth_reference, |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
50 COALESCE(g.objname, 'ERROR: MISSING GAUGE') AS gauge_objname, |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
51 r.value AS waterlevel_value, |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
52 COALESCE(s.surtyp, 'ERROR: MISSING SURVEY TYPE') AS surtype |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
53 FROM waterway.bottlenecks AS b |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
54 JOIN waterway.sounding_results AS s ON b.bottleneck_id = s.bottleneck_id |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
55 LEFT JOIN waterway.gauges AS g |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
56 ON b.gauge_location = g.location AND s.date_info::timestamptz <@ g.validity |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
57 LEFT JOIN waterway.gauges_reference_water_levels AS r |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
58 ON s.depth_reference = r.depth_reference |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
59 AND g.location = r.location AND g.validity = r.validity |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
60 WHERE b.objnam = $1 and s.date_info = $2` |
812
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
61 ) |
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
62 |
4244
4394daeea96a
Moved JSONHandler into middleware package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4243
diff
changeset
|
63 func listSurveys(req *http.Request) (jr mw.JSONResult, err error) { |
812
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
64 |
5574
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
65 v := req.URL.Query() |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
66 bottleneckName := v.Get("name") |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
67 date := v.Get("date") |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
68 id := v.Get("id") |
812
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
69 var rows *sql.Rows |
5574
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
70 surveys := []*models.Survey{} |
812
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
71 |
5574
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
72 if date == "" && bottleneckName == "" && id != "" { |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
73 rows, err = mw.JSONConn(req).QueryContext(req.Context(), listSurveysByIdSQL, id) |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
74 } else if date != "" && bottleneckName != "" && id == "" { |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
75 rows, err = mw.JSONConn(req).QueryContext(req.Context(), listSurveysByNameDateSQL, bottleneckName, date) |
271888ef85bc
Finalize use of bottleneck id instead of name.
Thomas Junk <thomas.junk@intevation.de>
parents:
5572
diff
changeset
|
76 } |
812
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
77 if err != nil { |
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
78 return |
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
79 } |
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
80 defer rows.Close() |
2149
ed0ee54fc49e
Extend /surveys endpoint to include waterlevel_value
Bernhard Reiter <bernhard@intevation.de>
parents:
2146
diff
changeset
|
81 // as we do not use the values here, we could simply the code here |
ed0ee54fc49e
Extend /surveys endpoint to include waterlevel_value
Bernhard Reiter <bernhard@intevation.de>
parents:
2146
diff
changeset
|
82 // to work without an explicit mdels/surverys.go |
ed0ee54fc49e
Extend /surveys endpoint to include waterlevel_value
Bernhard Reiter <bernhard@intevation.de>
parents:
2146
diff
changeset
|
83 // (like done in controllers/search.go) |
812
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
84 for rows.Next() { |
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
85 var survey models.Survey |
5405
5e7fca6ef935
When listing surveys tell survey type as well.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4891
diff
changeset
|
86 var surType string |
2152
8132434f4093
Surveys controller: Fixed nullable water level.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2149
diff
changeset
|
87 var level sql.NullInt64 |
812
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
88 if err = rows.Scan( |
1332
447db2bce052
Renamed BottleneckId to BottleneckID to make golint happy.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
1317
diff
changeset
|
89 &survey.BottleneckID, |
812
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
90 &survey.DateInfo, |
2146
7267f8168176
Extending endpoint /surveys to return depth_reference
Bernhard Reiter <bernhard@intevation.de>
parents:
2129
diff
changeset
|
91 &survey.DepthReference, |
2129
8f6345ad5f13
Extend /surveys/ endpoint to include reference gauge
Bernhard Reiter <bernhard@intevation.de>
parents:
1572
diff
changeset
|
92 &survey.ReferenceGauge, |
2152
8132434f4093
Surveys controller: Fixed nullable water level.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2149
diff
changeset
|
93 &level, |
5405
5e7fca6ef935
When listing surveys tell survey type as well.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4891
diff
changeset
|
94 &surType, |
812
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
95 ); err != nil { |
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
96 return |
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
97 } |
5462
fc01cdaf056d
Cosmetics.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5459
diff
changeset
|
98 switch { |
fc01cdaf056d
Cosmetics.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5459
diff
changeset
|
99 case level.Valid: |
2152
8132434f4093
Surveys controller: Fixed nullable water level.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2149
diff
changeset
|
100 survey.WaterLevelValue = &level.Int64 |
5462
fc01cdaf056d
Cosmetics.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5459
diff
changeset
|
101 case survey.DepthReference == "ZPG": |
fc01cdaf056d
Cosmetics.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5459
diff
changeset
|
102 survey.WaterLevelValue = new(int64) |
2152
8132434f4093
Surveys controller: Fixed nullable water level.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2149
diff
changeset
|
103 } |
5405
5e7fca6ef935
When listing surveys tell survey type as well.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4891
diff
changeset
|
104 survey.SurveyType = models.SurveyType(surType) |
2152
8132434f4093
Surveys controller: Fixed nullable water level.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2149
diff
changeset
|
105 surveys = append(surveys, &survey) |
812
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
106 } |
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
107 |
825
a5452a001b46
Added missing error check in surveys controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
812
diff
changeset
|
108 if err = rows.Err(); err != nil { |
a5452a001b46
Added missing error check in surveys controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
812
diff
changeset
|
109 return |
a5452a001b46
Added missing error check in surveys controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
812
diff
changeset
|
110 } |
a5452a001b46
Added missing error check in surveys controller.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
812
diff
changeset
|
111 |
4244
4394daeea96a
Moved JSONHandler into middleware package.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
4243
diff
changeset
|
112 jr = mw.JSONResult{ |
812
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
113 Result: struct { |
2152
8132434f4093
Surveys controller: Fixed nullable water level.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
2149
diff
changeset
|
114 Surveys []*models.Survey `json:"surveys"` |
812
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
115 }{surveys}, |
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
116 } |
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
117 return |
98a7776100fb
Added end point lo list available surveys for a given bottleneck.
Sascha Wilde <wilde@intevation.de>
parents:
diff
changeset
|
118 } |