Mercurial > gemma
view pkg/controllers/surveys.go @ 2149:ed0ee54fc49e
Extend /surveys endpoint to include waterlevel_value
* Change SQL to use the same strategy as used in schema/gemma.sql
for bottlenecks_geoserver to determine the waterlevel_value.
* Extend go controler to deal with the situation where the value is not
there. This is still suboptimal as this creates a json object for
the NullInt64 value.
author | Bernhard Reiter <bernhard@intevation.de> |
---|---|
date | Fri, 08 Feb 2019 11:26:05 +0100 |
parents | 7267f8168176 |
children | 8132434f4093 |
line wrap: on
line source
// This is Free Software under GNU Affero General Public License v >= 3.0 // without warranty, see README.md and license for details. // // SPDX-License-Identifier: AGPL-3.0-or-later // License-Filename: LICENSES/AGPL-3.0.txt // // Copyright (C) 2018, 2019 by via donau // – Österreichische Wasserstraßen-Gesellschaft mbH // Software engineering by Intevation GmbH // // Author(s): // * Sascha Wilde <sascha.wilde@intevation.de> // * Sascha L. Teichmann <sascha.teichmann@intevation.de> // * Bernhard Reiter <bernhard.reiter@intevation.de> package controllers import ( "database/sql" "net/http" "gemma.intevation.de/gemma/pkg/models" "github.com/gorilla/mux" ) const ( // Use the same logic as in schema/gemma.sql to find out // which is the reference gauge and which from its values is meant. // The LEFT for the JOIN is necessary because we still want to list // the surveys even if the corresponding value cannot be found because the // depth_reference and reference_water_level strings do not match. // // As this information could be vary from survey entry to survey, // in theory even for the same bottleneck // it seems to be the right place to return it from the /surveys endpoint. listSurveysSQL = ` SELECT s.bottleneck_id, s.date_info::text, s.depth_reference, bg.objname AS gauge_objname, r.value AS waterlevel_value FROM ( ( SELECT * FROM waterway.bottlenecks AS b, waterway.gauges AS g WHERE b.fk_g_fid = g.location ) AS bg JOIN waterway.sounding_results AS s ON bg.id = s.bottleneck_id ) LEFT JOIN waterway.gauges_reference_water_levels AS r ON s.depth_reference = r.reference_water_level AND bg.location = r.gauge_id WHERE bg.objnam=$1` ) func listSurveys( _ interface{}, req *http.Request, db *sql.Conn, ) (jr JSONResult, err error) { bottleneckName := mux.Vars(req)["bottleneck"] var rows *sql.Rows rows, err = db.QueryContext(req.Context(), listSurveysSQL, bottleneckName) if err != nil { return } defer rows.Close() surveys := []models.Survey{} // as we do not use the values here, we could simply the code here // to work without an explicit mdels/surverys.go // (like done in controllers/search.go) for rows.Next() { var survey models.Survey if err = rows.Scan( &survey.BottleneckID, &survey.DateInfo, &survey.DepthReference, &survey.ReferenceGauge, &survey.WaterLevelValue, ); err != nil { return } surveys = append(surveys, survey) } if err = rows.Err(); err != nil { return } jr = JSONResult{ Result: struct { Surveys []models.Survey `json:"surveys"` }{surveys}, } return }