diff pkg/imports/dmv.go @ 2633:eb1d119f253f

Fetch data from ERDMS for all allowed countries This will enable a sys_admin to import data for all countries while a waterway_admin still can only import data for his own country.
author Tom Gottfried <tom@intevation.de>
date Wed, 13 Mar 2019 18:19:44 +0100
parents 5f300bd7316f
children d9903cb34842
line wrap: on
line diff
--- a/pkg/imports/dmv.go	Wed Mar 13 17:13:15 2019 +0100
+++ b/pkg/imports/dmv.go	Wed Mar 13 18:19:44 2019 +0100
@@ -17,14 +17,9 @@
 	"context"
 	"database/sql"
 	"errors"
-	"fmt"
-	"log"
-	"strings"
 	"time"
 
 	"gemma.intevation.de/gemma/pkg/models"
-	"gemma.intevation.de/gemma/pkg/soap"
-	"gemma.intevation.de/gemma/pkg/soap/erdms"
 )
 
 type DistanceMarksVirtual struct {
@@ -97,42 +92,19 @@
 	}
 	defer tx.Rollback()
 
-	var country string
-	err = tx.QueryRowContext(ctx, selectCurrentUserCountrySQL).Scan(&country)
-	switch {
-	case err == sql.ErrNoRows:
-		return nil, errors.New("Cannot figure out user country")
-	case err != nil:
+	responseData, err := getRisData(
+		tx,
+		ctx,
+		feedback,
+		dmv.Username,
+		dmv.Password,
+		dmv.URL,
+		dmv.Insecure,
+		"dismar")
+	if err != nil {
 		return nil, err
 	}
 
-	country = strings.ToUpper(country)
-	feedback.Info("Using country '%s'.", country)
-
-	var auth *soap.BasicAuth
-	if dmv.Username != "" {
-		auth = &soap.BasicAuth{
-			Login:    dmv.Username,
-			Password: dmv.Password,
-		}
-	}
-
-	client := erdms.NewRefService(dmv.URL, dmv.Insecure, auth)
-
-	request := &erdms.GetRisDataXML{
-		GetRisDataXMLType: &erdms.GetRisDataXMLType{
-			Subcode: erdms.NoNS{Text: country + "%"},
-			Funcode: erdms.NoNS{Text: "DISMAR"},
-		},
-	}
-
-	data, err := client.GetRisDataXML(request)
-
-	if err != nil {
-		log.Printf("error: %v\n", err)
-		return nil, fmt.Errorf("Error requesting ERDMS service: %v", err)
-	}
-
 	insertStmt, err := tx.PrepareContext(ctx, insertDistanceMarksVirtualSQL)
 	if err != nil {
 		return nil, err
@@ -141,44 +113,46 @@
 
 	var ignored, features int
 
-	for _, dr := range data.RisdataReturn {
-		if dr.RisidxCode == nil {
-			ignored++
-			continue
-		}
+	for _, data := range responseData {
+		for _, dr := range data.RisdataReturn {
+			if dr.RisidxCode == nil {
+				ignored++
+				continue
+			}
 
-		code, err := models.IsrsFromString(string(*dr.RisidxCode))
-		if err != nil {
-			feedback.Warn("invalid ISRS code %v", err)
-			ignored++
-			continue
-		}
+			code, err := models.IsrsFromString(string(*dr.RisidxCode))
+			if err != nil {
+				feedback.Warn("invalid ISRS code %v", err)
+				ignored++
+				continue
+			}
 
-		if dr.Lat == nil || dr.Lon == nil {
-			feedback.Warn("missing lat/lon: %s", code)
-			ignored++
-			continue
-		}
+			if dr.Lat == nil || dr.Lon == nil {
+				feedback.Warn("missing lat/lon: %s", code)
+				ignored++
+				continue
+			}
 
-		if dr.Relenc == nil {
-			feedback.Warn("missing relenc: %s", code)
-			ignored++
-			continue
-		}
+			if dr.Relenc == nil {
+				feedback.Warn("missing relenc: %s", code)
+				ignored++
+				continue
+			}
 
-		if _, err := insertStmt.ExecContext(
-			ctx,
-			code.CountryCode,
-			code.LoCode,
-			code.FairwaySection,
-			code.Orc,
-			code.Hectometre,
-			float64(*dr.Lon), float64(*dr.Lat),
-			string(*dr.Relenc),
-		); err != nil {
-			return nil, err
+			if _, err := insertStmt.ExecContext(
+				ctx,
+				code.CountryCode,
+				code.LoCode,
+				code.FairwaySection,
+				code.Orc,
+				code.Hectometre,
+				float64(*dr.Lon), float64(*dr.Lat),
+				string(*dr.Relenc),
+			); err != nil {
+				return nil, err
+			}
+			features++
 		}
-		features++
 	}
 	feedback.Info("ignored: %d", ignored)
 	feedback.Info("features: %d", features)