view pkg/imports/ufa.go @ 5711:2dd155cc95ec revive-cleanup

Fix all revive issue (w/o machine generated stuff).
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 20 Feb 2024 22:22:57 +0100
parents 56c589f7435d
children 6270951dda28
line wrap: on
line source

// 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 (
	"context"
	"database/sql"
	"errors"
	"os"
	"path/filepath"

	"gemma.intevation.de/gemma/pkg/soap"
	"gemma.intevation.de/gemma/pkg/soap/ifaf"
)

// UploadedFairwayAvailability is Job to extract
// fairway availability data from an XML file and stores
// it into the database.
type UploadedFairwayAvailability struct {
	Dir string
}

// UFAJobKind is the unique name of this import job type.
const UFAJobKind JobKind = "ufa"

type ufaJobCreator struct{}

func init() { RegisterJobCreator(UFAJobKind, ufaJobCreator{}) }

func (ufaJobCreator) Description() string {
	return "uploaded fairway availability"
}

func (ufaJobCreator) Create() Job { return new(UploadedFairwayAvailability) }

func (ufaJobCreator) Depends() [2][]string {
	// Same as faJobCreator
	return faJobCreator{}.Depends()
}

func (ufaJobCreator) AutoAccept() bool { return true }

// StageDone is a NOP for fairway availability imports.
func (ufaJobCreator) StageDone(context.Context, *sql.Tx, int64, Feedback) error {
	return nil
}

// CleanUp removes the temporary files from the filesystem.
func (ufa *UploadedFairwayAvailability) CleanUp() error {
	return os.RemoveAll(ufa.Dir)
}

// Do executes the actual uploaded fairway availability import.
func (ufa *UploadedFairwayAvailability) Do(
	ctx context.Context,
	_ int64,
	conn *sql.Conn,
	feedback Feedback,
) (interface{}, error) {

	fetch := func(
		_ context.Context,
		_ *sql.Tx,
		_ bottlenecks,
	) ([]*ifaf.FairwayAvailability, error) {

		var response ifaf.Get_bottleneck_faResponse

		if err := soap.ValidateFile(
			filepath.Join(ufa.Dir, "data.xml"),
			"IFAF.xsd",
			&response,
		); err != nil {
			return nil, err
		}

		result := response.Get_bottleneck_faResult
		if result == nil {
			return nil, errors.New("no bottlenecks found")
		}

		return result.FairwayAvailability, nil
	}

	return storeFairwayAvailability(ctx, conn, feedback, fetch)
}