diff pkg/controllers/report.go @ 5321:0919946f624b extented-report

Added a report controller.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 27 May 2021 01:22:10 +0200
parents
children 80d9fd782f00
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pkg/controllers/report.go	Thu May 27 01:22:10 2021 +0200
@@ -0,0 +1,101 @@
+// 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) 2021 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"
+	"os"
+	"path/filepath"
+
+	"gemma.intevation.de/gemma/pkg/config"
+	"gemma.intevation.de/gemma/pkg/middleware"
+	"gemma.intevation.de/gemma/pkg/xlsx"
+
+	"github.com/360EntSecGroup-Skylar/excelize/v2"
+	"github.com/gorilla/mux"
+)
+
+func report(rw http.ResponseWriter, req *http.Request) {
+
+	vars := mux.Vars(req)
+
+	name := vars["name"]
+
+	config.WaitReady()
+	path := config.ReportPath()
+	if path == "" {
+		http.NotFound(rw, req)
+		return
+	}
+
+	stat, err := os.Stat(path)
+	if err != nil {
+		http.Error(rw, "Error: "+err.Error(), http.StatusInternalServerError)
+		return
+	}
+
+	if !stat.Mode().IsDir() {
+		http.NotFound(rw, req)
+		return
+	}
+
+	xlsxFilename := filepath.Join(path, name+".xlsx")
+	yamlFilename := filepath.Join(path, name+".yaml")
+
+	_, errX := os.Stat(xlsxFilename)
+	_, errY := os.Stat(yamlFilename)
+	if errX != nil || errX != nil {
+		if (errX != nil && os.IsNotExist(errX)) || (errY != nil && os.IsNotExist(errY)) {
+			http.NotFound(rw, req)
+		} else {
+			http.Error(rw, "Something is wrong", http.StatusInternalServerError)
+		}
+		return
+	}
+
+	template, err := excelize.OpenFile(xlsxFilename)
+	if err != nil {
+		http.Error(rw, "Error: "+err.Error(), http.StatusInternalServerError)
+		log.Printf("error: %v\n", err)
+		return
+	}
+
+	action, err := xlsx.ActionFromFile(yamlFilename)
+	if err != nil {
+		http.Error(rw, "Error: "+err.Error(), http.StatusInternalServerError)
+		log.Printf("error: %v\n", err)
+		return
+	}
+
+	ctx := req.Context()
+	conn := middleware.GetDBConn(req)
+
+	if err := action.Execute(ctx, conn, template); err != nil {
+		http.Error(rw, "Error: "+err.Error(), http.StatusInternalServerError)
+		log.Printf("error: %v\n", err)
+		return
+	}
+	rw.Header().Set(
+		"Content-Disposition",
+		fmt.Sprintf("attachment; filename=%s.xlsx", name))
+	rw.Header().Set(
+		"Content-Type",
+		"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
+
+	if _, err := template.WriteTo(rw); err != nil {
+		log.Printf("error: %v\n", err)
+	}
+}