diff pkg/imports/wg.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 e199655809c1
children d9903cb34842
line wrap: on
line diff
--- a/pkg/imports/wg.go	Wed Mar 13 17:13:15 2019 +0100
+++ b/pkg/imports/wg.go	Wed Mar 13 18:19:44 2019 +0100
@@ -18,14 +18,11 @@
 	"context"
 	"database/sql"
 	"errors"
-	"fmt"
-	"strings"
 	"time"
 
 	"github.com/jackc/pgx/pgtype"
 
 	"gemma.intevation.de/gemma/pkg/models"
-	"gemma.intevation.de/gemma/pkg/soap"
 	"gemma.intevation.de/gemma/pkg/soap/erdms"
 )
 
@@ -69,8 +66,6 @@
 func (*WaterwayGauge) CleanUp() error { return nil }
 
 const (
-	selectCurrentUserCountrySQL = `SELECT users.current_user_country()`
-
 	hasGaugeSQL = `
 SELECT true
 FROM waterway.gauges
@@ -145,41 +140,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,
+		wg.Username,
+		wg.Password,
+		wg.URL,
+		wg.Insecure,
+		"wtwgag")
+	if err != nil {
 		return nil, err
 	}
 
-	country = strings.ToUpper(country)
-	feedback.Info("Using country '%s'.", country)
-
-	var auth *soap.BasicAuth
-	if wg.Username != "" {
-		auth = &soap.BasicAuth{
-			Login:    wg.Username,
-			Password: wg.Password,
-		}
-	}
-
-	client := erdms.NewRefService(wg.URL, wg.Insecure, auth)
-
-	request := &erdms.GetRisDataXML{
-		GetRisDataXMLType: &erdms.GetRisDataXMLType{
-			Subcode: erdms.NoNS{Text: country + "%"},
-			Funcode: erdms.NoNS{Text: "wtwgag"},
-		},
-	}
-
-	data, err := client.GetRisDataXML(request)
-
-	if err != nil {
-		return nil, fmt.Errorf("Error requesting ERDMS service: %v", err)
-	}
-
 	hasGaugeStmt, err := tx.PrepareContext(ctx, hasGaugeSQL)
 	if err != nil {
 		return nil, err
@@ -189,59 +162,62 @@
 	var ignored int
 
 	type idxCode struct {
+		jdx  int
 		idx  int
 		code *models.Isrs
 	}
 
 	var news, olds []idxCode
 
-	for i, 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
-		}
+	for j, data := range responseData {
+		for i, 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
+			}
 
-		if dr.Objname.Loc == nil {
-			feedback.Warn("missing objname: %s", code)
-			ignored++
-			continue
-		}
+			if dr.Objname.Loc == nil {
+				feedback.Warn("missing objname: %s", code)
+				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.Zeropoint == nil {
-			feedback.Warn("missing zeropoint: %s", code)
-			ignored++
-			continue
-		}
+			if dr.Zeropoint == nil {
+				feedback.Warn("missing zeropoint: %s", code)
+				ignored++
+				continue
+			}
 
-		var dummy bool
-		err = hasGaugeStmt.QueryRowContext(ctx,
-			code.CountryCode,
-			code.LoCode,
-			code.FairwaySection,
-			code.Orc,
-			code.Hectometre,
-		).Scan(&dummy)
-		switch {
-		case err == sql.ErrNoRows:
-			news = append(news, idxCode{idx: i, code: code})
-		case err != nil:
-			return nil, err
-		case !dummy:
-			return nil, errors.New("Unexpected result")
-		default:
-			olds = append(olds, idxCode{idx: i, code: code})
+			var dummy bool
+			err = hasGaugeStmt.QueryRowContext(ctx,
+				code.CountryCode,
+				code.LoCode,
+				code.FairwaySection,
+				code.Orc,
+				code.Hectometre,
+			).Scan(&dummy)
+			switch {
+			case err == sql.ErrNoRows:
+				news = append(news, idxCode{jdx: j, idx: i, code: code})
+			case err != nil:
+				return nil, err
+			case !dummy:
+				return nil, errors.New("Unexpected result")
+			default:
+				olds = append(olds, idxCode{jdx: j, idx: i, code: code})
+			}
 		}
 	}
 	feedback.Info("ignored gauges: %d", ignored)
@@ -298,7 +274,7 @@
 	// insert/update the gauges
 	for i := range news {
 		ic := &news[i]
-		dr := data.RisdataReturn[ic.idx]
+		dr := responseData[ic.jdx].RisdataReturn[ic.idx]
 
 		feedback.Info("insert/update %s", ic.code)