Mercurial > gemma
diff pkg/imports/erdms.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 | |
children | e1ccc8438529 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pkg/imports/erdms.go Wed Mar 13 18:19:44 2019 +0100 @@ -0,0 +1,82 @@ +// 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, 2019 by via donau +// – Österreichische Wasserstraßen-Gesellschaft mbH +// Software engineering by Intevation GmbH +// +// Author(s): +// * Sascha L. Teichmann <sascha.teichmann@intevation.de> +// * Tom Gottfried <tom.gottfried@intevation.de> + +package imports + +import ( + "context" + "database/sql" + "fmt" + "strings" + + "gemma.intevation.de/gemma/pkg/soap" + "gemma.intevation.de/gemma/pkg/soap/erdms" +) + +const selectUserCountriesSQL = `SELECT DISTINCT country FROM users.list_users` + +func getRisData( + tx *sql.Tx, + ctx context.Context, + feedback Feedback, + username string, + password string, + URL string, + insecure bool, + funcode string, +) ([]*erdms.GetRisDataXMLResponse, error) { + + var auth *soap.BasicAuth + if username != "" { + auth = &soap.BasicAuth{ + Login: username, + Password: password, + } + } + + client := erdms.NewRefService(URL, insecure, auth) + + rows, err := tx.QueryContext(ctx, selectUserCountriesSQL) + if err != nil { + return nil, err + } + defer rows.Close() + + var country string + var countries []string + var responseData []*erdms.GetRisDataXMLResponse + for rows.Next() { + err = rows.Scan(&country) + if err != nil { + return nil, err + } + countries = append(countries, country) + + request := &erdms.GetRisDataXML{ + GetRisDataXMLType: &erdms.GetRisDataXMLType{ + Subcode: erdms.NoNS{Text: country + "%"}, + Funcode: erdms.NoNS{Text: funcode}, + }, + } + + data, err := client.GetRisDataXML(request) + if err != nil { + return nil, fmt.Errorf("Error requesting ERDMS service: %v", err) + } + responseData = append(responseData, data) + } + feedback.Info("Import data for countries: %s.", + strings.Join(countries, ", ")) + return responseData, nil +}