changeset 2038:42a33f9e1f95 unify_imports

Imports: Moved model conversion into a table in the imports package.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 25 Jan 2019 12:31:50 +0100
parents 11cb57f85c60
children 8b5cc2dffbde
files pkg/controllers/manualimports.go pkg/controllers/routes.go pkg/imports/modelconvert.go
diffstat 3 files changed, 153 insertions(+), 117 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/controllers/manualimports.go	Fri Jan 25 11:53:28 2019 +0100
+++ b/pkg/controllers/manualimports.go	Fri Jan 25 12:31:50 2019 +0100
@@ -26,120 +26,22 @@
 	"gemma.intevation.de/gemma/pkg/models"
 )
 
-func importBottleneck(input interface{}) interface{} {
-	bi := input.(*models.BottleneckImport)
-	return &imports.Bottleneck{
-		URL:      bi.URL,
-		Insecure: bi.Insecure,
-	}
-}
-
-func importGaugeMeasurement(input interface{}) interface{} {
-	gi := input.(*models.GaugeMeasurementImport)
-	return &imports.GaugeMeasurement{
-		URL:      gi.URL,
-		Insecure: gi.Insecure,
-	}
-}
-
-func importFairwayAvailability(input interface{}) interface{} {
-	fai := input.(*models.FairwayAvailabilityImport)
-	return &imports.FairwayAvailability{
-		URL:      fai.URL,
-		Insecure: fai.Insecure,
-	}
-}
-
-func importWaterwayAxis(input interface{}) interface{} {
-	wxi := input.(*models.WaterwayAxisImport)
-	return &imports.WaterwayAxis{
-		URL:         wxi.URL,
-		FeatureType: wxi.FeatureType,
-		SortBy:      nilString(wxi.SortBy),
-	}
-}
-
-func importWaterwayArea(input interface{}) interface{} {
-	wai := input.(*models.WaterwayAreaImport)
-	return &imports.WaterwayArea{
-		URL:         wai.URL,
-		FeatureType: wai.FeatureType,
-		SortBy:      nilString(wai.SortBy),
-	}
-}
-
-func importWaterwayGauge(input interface{}) interface{} {
-	wgi := input.(*models.WaterwayGaugeImport)
-	return &imports.WaterwayGauge{
-		Username: nilString(wgi.User),
-		Password: nilString(wgi.Password),
-		Insecure: wgi.Insecure,
-	}
-}
-
-func importDistancemarksVirtual(input interface{}) interface{} {
-	dmvi := input.(*models.DistanceMarksVirtualImport)
-	return &imports.DistanceMarksVirtual{
-		URL:      dmvi.URL,
-		Username: nilString(dmvi.User),
-		Password: nilString(dmvi.Password),
-		Insecure: dmvi.Insecure,
-	}
-}
-
-func importFairwayDimension(input interface{}) interface{} {
-	fdi := input.(*models.FairwayDimensionImport)
-	return &imports.FairwayDimension{
-		URL:                fdi.URL,
-		FeatureType:        fdi.FeatureType,
-		SortBy:             nilString(fdi.SortBy),
-		LOS:                fdi.LOS,
-		MinWidth:           fdi.MinWidth,
-		MaxWidth:           fdi.MaxWidth,
-		Depth:              fdi.Depth,
-		SourceOrganization: fdi.SourceOrganization,
-	}
-}
-
-func importDistanceMarksAshore(input interface{}) interface{} {
-	dmai := input.(*models.DistanceMarksAshoreImport)
-	return &imports.DistanceMarksAshore{
-		URL:         dmai.URL,
-		FeatureType: dmai.FeatureType,
-		SortBy:      nilString(dmai.SortBy),
-	}
-}
-
-func importStretch(input interface{}) interface{} {
-	sti := input.(*models.StretchImport)
-	return &imports.Stretch{
-		Name:      sti.Name,
-		From:      sti.From,
-		To:        sti.To,
-		ObjNam:    sti.ObjNam,
-		NObjNam:   sti.NObjNam,
-		Source:    sti.Source,
-		Date:      sti.Date,
-		Countries: sti.Countries,
-	}
-}
-
-func nilString(s *string) string {
-	if s != nil {
-		return *s
-	}
-	return ""
-}
-
 func manualImport(
 	kind imports.JobKind,
-	setup func(interface{}) interface{},
 ) func(interface{}, *http.Request, *sql.Conn) (JSONResult, error) {
 
 	return func(input interface{}, req *http.Request, _ *sql.Conn) (
 		jr JSONResult, err error) {
 
-		what := setup(input)
+		what := imports.ConvertToInternal(kind, input)
+		if what == nil {
+			err = JSONError{
+				Code:    http.StatusInternalServerError,
+				Message: "Unable to convert import models",
+			}
+			return
+		}
+
 		var serialized string
 		if serialized, err = common.ToJSONString(what); err != nil {
 			return
--- a/pkg/controllers/routes.go	Fri Jan 25 11:53:28 2019 +0100
+++ b/pkg/controllers/routes.go	Fri Jan 25 12:31:50 2019 +0100
@@ -177,61 +177,61 @@
 
 	api.Handle("/imports/bottleneck", waterwayAdmin(&JSONHandler{
 		Input:  func() interface{} { return new(models.BottleneckImport) },
-		Handle: manualImport(imports.BNJobKind, importBottleneck),
+		Handle: manualImport(imports.BNJobKind),
 		NoConn: true,
 	})).Methods(http.MethodPost)
 
 	api.Handle("/imports/gaugemeasurement", waterwayAdmin(&JSONHandler{
 		Input:  func() interface{} { return new(models.GaugeMeasurementImport) },
-		Handle: manualImport(imports.GMJobKind, importGaugeMeasurement),
+		Handle: manualImport(imports.GMJobKind),
 		NoConn: true,
 	})).Methods(http.MethodPost)
 
 	api.Handle("/imports/fairwayavailability", waterwayAdmin(&JSONHandler{
 		Input:  func() interface{} { return new(models.FairwayAvailabilityImport) },
-		Handle: manualImport(imports.FAJobKind, importFairwayAvailability),
+		Handle: manualImport(imports.FAJobKind),
 		NoConn: true,
 	})).Methods(http.MethodPost)
 
 	api.Handle("/imports/waterwayaxis", waterwayAdmin(&JSONHandler{
 		Input:  func() interface{} { return new(models.WaterwayAxisImport) },
-		Handle: manualImport(imports.WXJobKind, importWaterwayAxis),
+		Handle: manualImport(imports.WXJobKind),
 		NoConn: true,
 	})).Methods(http.MethodPost)
 
 	api.Handle("/imports/waterwayarea", waterwayAdmin(&JSONHandler{
 		Input:  func() interface{} { return new(models.WaterwayAreaImport) },
-		Handle: manualImport(imports.WAJobKind, importWaterwayArea),
+		Handle: manualImport(imports.WAJobKind),
 		NoConn: true,
 	})).Methods(http.MethodPost)
 
 	api.Handle("/imports/waterwaygauge", waterwayAdmin(&JSONHandler{
 		Input:  func() interface{} { return new(models.WaterwayGaugeImport) },
-		Handle: manualImport(imports.WGJobKind, importWaterwayGauge),
+		Handle: manualImport(imports.WGJobKind),
 		NoConn: true,
 	})).Methods(http.MethodPost)
 
 	api.Handle("/imports/distancemarksvirtual", waterwayAdmin(&JSONHandler{
 		Input:  func() interface{} { return new(models.DistanceMarksVirtualImport) },
-		Handle: manualImport(imports.DMVJobKind, importDistancemarksVirtual),
+		Handle: manualImport(imports.DMVJobKind),
 		NoConn: true,
 	})).Methods(http.MethodPost)
 
 	api.Handle("/imports/fairwaydimension", waterwayAdmin(&JSONHandler{
 		Input:  func() interface{} { return new(models.FairwayDimensionImport) },
-		Handle: manualImport(imports.FDJobKind, importFairwayDimension),
+		Handle: manualImport(imports.FDJobKind),
 		NoConn: true,
 	})).Methods(http.MethodPost)
 
 	api.Handle("/imports/distancemarks", waterwayAdmin(&JSONHandler{
 		Input:  func() interface{} { return new(models.DistanceMarksAshoreImport) },
-		Handle: manualImport(imports.DMAJobKind, importDistanceMarksAshore),
+		Handle: manualImport(imports.DMAJobKind),
 		NoConn: true,
 	})).Methods(http.MethodPost)
 
 	api.Handle("/imports/stretch", sysAdmin(&JSONHandler{
 		Input:  func() interface{} { return new(models.StretchImport) },
-		Handle: manualImport(imports.STJobKind, importStretch),
+		Handle: manualImport(imports.STJobKind),
 		NoConn: true,
 	})).Methods(http.MethodPost)
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pkg/imports/modelconvert.go	Fri Jan 25 12:31:50 2019 +0100
@@ -0,0 +1,134 @@
+// 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 imports
+
+import (
+	"gemma.intevation.de/gemma/pkg/models"
+)
+
+var convertModel = map[JobKind]func(interface{}) interface{}{
+
+	BNJobKind: func(input interface{}) interface{} {
+		bi := input.(*models.BottleneckImport)
+		return &Bottleneck{
+			URL:      bi.URL,
+			Insecure: bi.Insecure,
+		}
+	},
+
+	GMJobKind: func(input interface{}) interface{} {
+		gi := input.(*models.GaugeMeasurementImport)
+		return &GaugeMeasurement{
+			URL:      gi.URL,
+			Insecure: gi.Insecure,
+		}
+	},
+
+	FAJobKind: func(input interface{}) interface{} {
+		fai := input.(*models.FairwayAvailabilityImport)
+		return &FairwayAvailability{
+			URL:      fai.URL,
+			Insecure: fai.Insecure,
+		}
+	},
+
+	WXJobKind: func(input interface{}) interface{} {
+		wxi := input.(*models.WaterwayAxisImport)
+		return &WaterwayAxis{
+			URL:         wxi.URL,
+			FeatureType: wxi.FeatureType,
+			SortBy:      nilString(wxi.SortBy),
+		}
+	},
+
+	WAJobKind: func(input interface{}) interface{} {
+		wai := input.(*models.WaterwayAreaImport)
+		return &WaterwayArea{
+			URL:         wai.URL,
+			FeatureType: wai.FeatureType,
+			SortBy:      nilString(wai.SortBy),
+		}
+	},
+
+	WGJobKind: func(input interface{}) interface{} {
+		wgi := input.(*models.WaterwayGaugeImport)
+		return &WaterwayGauge{
+			Username: nilString(wgi.User),
+			Password: nilString(wgi.Password),
+			Insecure: wgi.Insecure,
+		}
+	},
+
+	DMVJobKind: func(input interface{}) interface{} {
+		dmvi := input.(*models.DistanceMarksVirtualImport)
+		return &DistanceMarksVirtual{
+			URL:      dmvi.URL,
+			Username: nilString(dmvi.User),
+			Password: nilString(dmvi.Password),
+			Insecure: dmvi.Insecure,
+		}
+	},
+
+	FDJobKind: func(input interface{}) interface{} {
+		fdi := input.(*models.FairwayDimensionImport)
+		return &FairwayDimension{
+			URL:                fdi.URL,
+			FeatureType:        fdi.FeatureType,
+			SortBy:             nilString(fdi.SortBy),
+			LOS:                fdi.LOS,
+			MinWidth:           fdi.MinWidth,
+			MaxWidth:           fdi.MaxWidth,
+			Depth:              fdi.Depth,
+			SourceOrganization: fdi.SourceOrganization,
+		}
+	},
+
+	DMAJobKind: func(input interface{}) interface{} {
+		dmai := input.(*models.DistanceMarksAshoreImport)
+		return &DistanceMarksAshore{
+			URL:         dmai.URL,
+			FeatureType: dmai.FeatureType,
+			SortBy:      nilString(dmai.SortBy),
+		}
+	},
+
+	STJobKind: func(input interface{}) interface{} {
+		sti := input.(*models.StretchImport)
+		return &Stretch{
+			Name:      sti.Name,
+			From:      sti.From,
+			To:        sti.To,
+			ObjNam:    sti.ObjNam,
+			NObjNam:   sti.NObjNam,
+			Source:    sti.Source,
+			Date:      sti.Date,
+			Countries: sti.Countries,
+		}
+	},
+}
+
+func nilString(s *string) string {
+	if s != nil {
+		return *s
+	}
+	return ""
+}
+
+func ConvertToInternal(kind JobKind, src interface{}) interface{} {
+	fn := convertModel[kind]
+	if fn == nil {
+		return nil
+	}
+	return fn(src)
+}