view pkg/controllers/uploadedimports.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 0d272d7bcfb9
children 0a3debcfbe8f
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 (
	"log"
	"net/http"
	"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 maxUploadSize = 25 * 1024 * 1024

func importApprovedGaugeMeasurements() http.HandlerFunc {
	return uploadedImport(
		imports.AGMJobKind,
		"agm.csv",
		func(dir string) imports.Job {
			return &imports.ApprovedGaugeMeasurements{Dir: dir}
		},
	)
}

func importUploadedBottleneck() http.HandlerFunc {
	return uploadedImport(
		imports.UBNJobKind,
		"data.xml",
		func(dir string) imports.Job {
			return &imports.UploadedBottleneck{Dir: dir}
		},
	)
}

func importUploadedFairwayAvailability() http.HandlerFunc {
	return uploadedImport(
		imports.UFAJobKind,
		"data.xml",
		func(dir string) imports.Job {
			return &imports.UploadedFairwayAvailability{Dir: dir}
		},
	)
}

func importUploadedGaugeMeasurement() http.HandlerFunc {
	return uploadedImport(
		imports.UGMJobKind,
		"data.xml",
		func(dir string) imports.Job {
			return &imports.UploadedGaugeMeasurement{Dir: dir}
		},
	)
}

func uploadedImport(
	kind imports.JobKind,
	fname string,
	create func(string) imports.Job,
) http.HandlerFunc {

	return func(rw http.ResponseWriter, req *http.Request) {
		dir, err := misc.StoreUploadedFile(
			req,
			string(kind),
			fname,
			maxUploadSize)
		if err != nil {
			log.Printf("error: %v\n", err)
			http.Error(rw, "error: "+err.Error(), http.StatusInternalServerError)
			return
		}

		job := create(dir)

		serialized, err := common.ToJSONString(job)
		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(
			kind,
			time.Time{}, // due
			nil,         // trys
			nil,         // retry wait
			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)
	}
}