view pkg/controllers/agmimports.go @ 1754:807569b08513

Import queue: Auto acceptance is now a property of the import kind itself and is not configurable any more.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 10 Jan 2019 16:19:26 +0100
parents 44398a8bdf94
children b0bf7533deec
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 (
	"bufio"
	"io"
	"io/ioutil"
	"log"
	"net/http"
	"os"
	"path/filepath"
	"strconv"
	"time"

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

const (
	maxApprovedGaugeMeasurementSize = 25 * 1024 * 1024
	approvedGaugeMeasurementsName   = "approvedgm"
)

func storeApprovedGaugeMeasurements(req *http.Request) (string, error) {

	// Check for direct upload.
	f, _, err := req.FormFile(approvedGaugeMeasurementsName)
	if err != nil {
		return "", err
	}
	defer f.Close()

	dir, err := ioutil.TempDir(config.TmpDir(), approvedGaugeMeasurementsName)
	if err != nil {
		return "", err
	}

	o, err := os.Create(filepath.Join(dir, "agm.csv"))
	if err != nil {
		os.RemoveAll(dir)
		return "", err
	}

	out := bufio.NewWriter(o)

	if _, err = io.Copy(out, io.LimitReader(f, maxApprovedGaugeMeasurementSize)); err != nil {
		o.Close()
		os.RemoveAll(dir)
		return "", err
	}

	if err = out.Flush(); err != nil {
		o.Close()
		os.RemoveAll(dir)
		return "", err
	}

	return dir, nil
}

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

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

	agm := &imports.ApprovedGaugeMeasurements{Dir: dir}

	serialized, err := common.ToJSONString(agm)
	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("bottleneck") != ""

	var due time.Time
	if d := req.FormValue("due"); d != "" {
		var err error
		if due, err = time.Parse("2006-01-02T15:04:05", d); err != nil {
			log.Printf("error: %v\n", err)
		}
	}

	retries := -1
	if r := req.FormValue("retries"); r != "" {
		var err error
		if retries, err = strconv.Atoi(r); err != nil {
			log.Printf("error: %v\n", err)
			retries = -1
		}
	}

	jobID, err := imports.AddJob(
		imports.AGMJobKind,
		due, retries,
		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)
}