view pkg/controllers/surveys.go @ 5406:6d73836bc2fb marking-single-beam

quick fix of typo
author Thomas Junk <thomas.junk@intevation.de>
date Tue, 06 Jul 2021 14:26:02 +0200
parents 5e7fca6ef935
children d45d5fafdc5b
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"

	"github.com/gorilla/mux"

	"gemma.intevation.de/gemma/pkg/models"

	mw "gemma.intevation.de/gemma/pkg/middleware"
)

const (
	listSurveysSQL = `
SELECT DISTINCT
  s.bottleneck_id,
  s.date_info::text,
  s.depth_reference,
  COALESCE(g.objname, 'ERROR: MISSING GAUGE') AS gauge_objname,
  r.value AS waterlevel_value,
  COALESCE(s.surtyp, 'ERROR: MISSING SURVEY TYPE') AS surtype
FROM waterway.bottlenecks AS b
  JOIN waterway.sounding_results AS s ON b.bottleneck_id = s.bottleneck_id
  LEFT JOIN waterway.gauges AS g
    ON b.gauge_location = g.location AND s.date_info::timestamptz <@ g.validity
  LEFT JOIN waterway.gauges_reference_water_levels AS r
    ON s.depth_reference = r.depth_reference
      AND g.location = r.location AND g.validity = r.validity
WHERE b.objnam = $1`
)

func listSurveys(req *http.Request) (jr mw.JSONResult, err error) {

	bottleneckName := mux.Vars(req)["bottleneck"]

	var rows *sql.Rows

	rows, err = mw.JSONConn(req).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
		var surType string
		var level sql.NullInt64
		if err = rows.Scan(
			&survey.BottleneckID,
			&survey.DateInfo,
			&survey.DepthReference,
			&survey.ReferenceGauge,
			&level,
			&surType,
		); err != nil {
			return
		}
		if level.Valid {
			survey.WaterLevelValue = &level.Int64
		}
		survey.SurveyType = models.SurveyType(surType)
		surveys = append(surveys, &survey)
	}

	if err = rows.Err(); err != nil {
		return
	}

	jr = mw.JSONResult{
		Result: struct {
			Surveys []*models.Survey `json:"surveys"`
		}{surveys},
	}
	return
}