view pkg/controllers/wpimports.go @ 2515:6bcaa8bf2603 octree-diff

STR tree: Fixed sorting. Stored num items per nodes. Simpified code.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 05 Mar 2019 15:55:14 +0100
parents 4d6979dedb11
children
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 by via donau
//   – Österreichische Wasserstraßen-Gesellschaft mbH
// Software engineering by Intevation GmbH
//
// Author(s):
//  * Sascha L. Teichmann <sascha.teichmann@intevation.de>

package controllers

import (
	"fmt"
	"log"
	"net/http"
	"strconv"
	"time"

	"gemma.intevation.de/gemma/pkg/auth"
	"gemma.intevation.de/gemma/pkg/common"
	"gemma.intevation.de/gemma/pkg/imports"
	"gemma.intevation.de/gemma/pkg/misc"
)

const (
	maxWaterwayProfilesSize = 25 * 1024 * 1024
	waterwayProfilesName    = "wp"
)

func importWaterwayProfiles(rw http.ResponseWriter, req *http.Request) {

	url := req.FormValue("url")
	if url == "" {
		http.Error(rw, "missing 'url' parameter", http.StatusBadRequest)
		return
	}

	featureType := req.FormValue("feature-type")
	if featureType == "" {
		http.Error(rw, "missing 'feature-type' parameter", http.StatusBadRequest)
		return
	}

	dir, err := misc.StoreUploadedFile(
		req,
		waterwayProfilesName,
		"wp.csv",
		maxWaterwayProfilesSize)
	if err != nil {
		log.Printf("error: %v\n", err)
		http.Error(rw, "error: "+err.Error(), http.StatusInternalServerError)
		return
	}

	sortBy := req.FormValue("sort-by")

	var precision *float64
	if p := req.FormValue("precision"); p != "" {
		if v, err := strconv.ParseFloat(p, 64); err != nil {
			http.Error(rw,
				fmt.Sprintf("Invalid 'precision' parameter: %v", err),
				http.StatusBadRequest)
			return
		} else {
			precision = &v
		}
	}

	wp := &imports.WaterwayProfiles{
		Dir:         dir,
		URL:         url,
		FeatureType: featureType,
		SortBy:      sortBy,
		Precision:   precision,
	}

	serialized, err := common.ToJSONString(wp)
	if err != nil {
		log.Printf("error: %v\n", err)
		http.Error(rw, "error: "+err.Error(), http.StatusInternalServerError)
		return
	}

	session, _ := auth.GetSession(req)

	sendEmail := req.FormValue("email") != ""

	jobID, err := imports.AddJob(
		imports.WPJobKind,
		time.Time{}, // due
		nil,         // trys
		nil,         // wait retry
		session.User,
		sendEmail,
		serialized)

	if err != nil {
		log.Printf("error: %v\n", err)
		http.Error(rw, "error: "+err.Error(), http.StatusInternalServerError)
		return
	}

	log.Printf("info: added import #%d to queue\n", jobID)

	result := struct {
		ID int64 `json:"id"`
	}{
		ID: jobID,
	}
	SendJSON(rw, http.StatusCreated, &result)
}