changeset 2194:4d6979dedb11

Imports: Deduplicted file upload code.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 12 Feb 2019 11:09:55 +0100
parents 35c56ace42b9
children 3437ceee1529
files pkg/controllers/agmimports.go pkg/controllers/srimports.go pkg/controllers/ubnimports.go pkg/controllers/wpimports.go pkg/misc/http.go
diffstat 5 files changed, 94 insertions(+), 175 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/controllers/agmimports.go	Tue Feb 12 10:50:03 2019 +0100
+++ b/pkg/controllers/agmimports.go	Tue Feb 12 11:09:55 2019 +0100
@@ -14,66 +14,28 @@
 package controllers
 
 import (
-	"bufio"
-	"io"
-	"io/ioutil"
 	"log"
 	"net/http"
-	"os"
-	"path/filepath"
 	"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"
+	"gemma.intevation.de/gemma/pkg/misc"
 )
 
 const (
+	approvedGaugeMeasurementsName   = "approvedgm"
 	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)
+	dir, err := misc.StoreUploadedFile(
+		req,
+		approvedGaugeMeasurementsName,
+		"agm.csv",
+		maxApprovedGaugeMeasurementSize)
 	if err != nil {
 		log.Printf("error: %v\n", err)
 		http.Error(rw, "error: "+err.Error(), http.StatusInternalServerError)
--- a/pkg/controllers/srimports.go	Tue Feb 12 10:50:03 2019 +0100
+++ b/pkg/controllers/srimports.go	Tue Feb 12 11:09:55 2019 +0100
@@ -15,12 +15,9 @@
 
 import (
 	"archive/zip"
-	"bufio"
 	"database/sql"
 	"encoding/hex"
 	"fmt"
-	"io"
-	"io/ioutil"
 	"log"
 	"net/http"
 	"os"
@@ -40,8 +37,8 @@
 )
 
 const (
+	soundingResultName    = "soundingresult"
 	maxSoundingResultSize = 25 * 1024 * 1024
-	soundingResultName    = "soundingresult"
 )
 
 func fetchSoundingResult(req *http.Request) (string, error) {
@@ -64,44 +61,12 @@
 		return dst, nil
 	}
 
-	return storeSoundingResult(req)
-}
-
-func storeSoundingResult(req *http.Request) (string, error) {
-
-	// Check for direct upload.
-	f, _, err := req.FormFile(soundingResultName)
-	if err != nil {
-		return "", err
-	}
-	defer f.Close()
-
-	dir, err := ioutil.TempDir(config.TmpDir(), soundingResultName)
-	if err != nil {
-		return "", err
-	}
-
-	o, err := os.Create(filepath.Join(dir, "sr.zip"))
-	if err != nil {
-		os.RemoveAll(dir)
-		return "", err
-	}
-
-	out := bufio.NewWriter(o)
-
-	if _, err = io.Copy(out, io.LimitReader(f, maxSoundingResultSize)); 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
+	return misc.StoreUploadedFile(
+		req,
+		soundingResultName,
+		"sr.zip",
+		maxSoundingResultSize,
+	)
 }
 
 func fetchSoundingResultMetaOverrides(sr *imports.SoundingResult, req *http.Request) error {
@@ -205,7 +170,12 @@
 ) (jr JSONResult, err error) {
 
 	var dir string
-	if dir, err = storeSoundingResult(req); err != nil {
+	if dir, err = misc.StoreUploadedFile(
+		req,
+		soundingResultName,
+		"sr.zip",
+		maxSoundingResultSize,
+	); err != nil {
 		return
 	}
 
--- a/pkg/controllers/ubnimports.go	Tue Feb 12 10:50:03 2019 +0100
+++ b/pkg/controllers/ubnimports.go	Tue Feb 12 11:09:55 2019 +0100
@@ -14,19 +14,14 @@
 package controllers
 
 import (
-	"bufio"
-	"io"
-	"io/ioutil"
 	"log"
 	"net/http"
-	"os"
-	"path/filepath"
 	"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"
+	"gemma.intevation.de/gemma/pkg/misc"
 )
 
 const (
@@ -34,46 +29,13 @@
 	uploadBottleneckName      = "ubn"
 )
 
-func storeUploadedBottleneck(req *http.Request) (string, error) {
-
-	// Check for direct upload.
-	f, _, err := req.FormFile(uploadBottleneckName)
-	if err != nil {
-		return "", err
-	}
-	defer f.Close()
-
-	dir, err := ioutil.TempDir(config.TmpDir(), uploadBottleneckName)
-	if err != nil {
-		return "", err
-	}
-
-	o, err := os.Create(filepath.Join(dir, "data.xml"))
-	if err != nil {
-		os.RemoveAll(dir)
-		return "", err
-	}
-
-	out := bufio.NewWriter(o)
-
-	if _, err = io.Copy(out, io.LimitReader(f, maxUploadedBottleneckSize)); 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 importUploadedBottleneck(rw http.ResponseWriter, req *http.Request) {
 
-	dir, err := storeUploadedBottleneck(req)
+	dir, err := misc.StoreUploadedFile(
+		req,
+		uploadBottleneckName,
+		"data.xml",
+		maxUploadedBottleneckSize)
 	if err != nil {
 		log.Printf("error: %v\n", err)
 		http.Error(rw, "error: "+err.Error(), http.StatusInternalServerError)
--- a/pkg/controllers/wpimports.go	Tue Feb 12 10:50:03 2019 +0100
+++ b/pkg/controllers/wpimports.go	Tue Feb 12 11:09:55 2019 +0100
@@ -14,21 +14,16 @@
 package controllers
 
 import (
-	"bufio"
 	"fmt"
-	"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"
+	"gemma.intevation.de/gemma/pkg/misc"
 )
 
 const (
@@ -36,42 +31,6 @@
 	waterwayProfilesName    = "wp"
 )
 
-func storeWaterwayProfiles(req *http.Request) (string, error) {
-
-	// Check for direct upload.
-	f, _, err := req.FormFile(waterwayProfilesName)
-	if err != nil {
-		return "", err
-	}
-	defer f.Close()
-
-	dir, err := ioutil.TempDir(config.TmpDir(), waterwayProfilesName)
-	if err != nil {
-		return "", err
-	}
-
-	o, err := os.Create(filepath.Join(dir, "wp.csv"))
-	if err != nil {
-		os.RemoveAll(dir)
-		return "", err
-	}
-
-	out := bufio.NewWriter(o)
-
-	if _, err = io.Copy(out, io.LimitReader(f, maxWaterwayProfilesSize)); 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 importWaterwayProfiles(rw http.ResponseWriter, req *http.Request) {
 
 	url := req.FormValue("url")
@@ -86,7 +45,11 @@
 		return
 	}
 
-	dir, err := storeWaterwayProfiles(req)
+	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)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pkg/misc/http.go	Tue Feb 12 11:09:55 2019 +0100
@@ -0,0 +1,62 @@
+// 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 misc
+
+import (
+	"bufio"
+	"io"
+	"io/ioutil"
+	"net/http"
+	"os"
+	"path/filepath"
+
+	"gemma.intevation.de/gemma/pkg/config"
+)
+
+func StoreUploadedFile(req *http.Request, field, fname string, maxSize int64) (string, error) {
+
+	// Check for direct upload.
+	f, _, err := req.FormFile(field)
+	if err != nil {
+		return "", err
+	}
+	defer f.Close()
+
+	dir, err := ioutil.TempDir(config.TmpDir(), field)
+	if err != nil {
+		return "", err
+	}
+
+	o, err := os.Create(filepath.Join(dir, fname))
+	if err != nil {
+		os.RemoveAll(dir)
+		return "", err
+	}
+
+	out := bufio.NewWriter(o)
+
+	if _, err = io.Copy(out, io.LimitReader(f, maxSize)); 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
+}