/* Copyright © 2023 Philipp Wolfer This file is part of Scotty. Scotty is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Scotty is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Scotty. If not, see . */ package backends import "go.uploadedlobster.com/scotty/internal/models" type ImportProcessor[T models.ListensResult | models.LovesResult] interface { ImportBackend() models.ImportBackend Process(results chan T, out chan models.ImportResult, progress chan models.Progress) Import(export T, result models.ImportResult, out chan models.ImportResult, progress chan models.Progress) models.ImportResult } type ListensImportProcessor struct { Backend models.ListensImport } func (p ListensImportProcessor) ImportBackend() models.ImportBackend { return p.Backend } func (p ListensImportProcessor) Process(results chan models.ListensResult, out chan models.ImportResult, progress chan models.Progress) { process(p, results, out, progress) } func (p ListensImportProcessor) Import(export models.ListensResult, result models.ImportResult, out chan models.ImportResult, progress chan models.Progress) models.ImportResult { if export.Error != nil { handleError(result, export.Error, out, progress) return result } if export.Total > 0 { result.TotalCount = export.Total } else { result.TotalCount += len(export.Items) } importResult, err := p.Backend.ImportListens(export, result, progress) if err != nil { handleError(importResult, err, out, progress) return result } return importResult } type LovesImportProcessor struct { Backend models.LovesImport } func (p LovesImportProcessor) ImportBackend() models.ImportBackend { return p.Backend } func (p LovesImportProcessor) Process(results chan models.LovesResult, out chan models.ImportResult, progress chan models.Progress) { process(p, results, out, progress) } func (p LovesImportProcessor) Import(export models.LovesResult, result models.ImportResult, out chan models.ImportResult, progress chan models.Progress) models.ImportResult { if export.Error != nil { handleError(result, export.Error, out, progress) return result } if export.Total > 0 { result.TotalCount = export.Total } else { result.TotalCount += len(export.Items) } importResult, err := p.Backend.ImportLoves(export, result, progress) if err != nil { handleError(importResult, err, out, progress) return result } return importResult } func process[R models.LovesResult | models.ListensResult, P ImportProcessor[R]](processor P, results chan R, out chan models.ImportResult, progress chan models.Progress) { defer close(out) defer close(progress) result := models.ImportResult{} err := processor.ImportBackend().StartImport() if err != nil { handleError(result, err, out, progress) return } for exportResult := range results { importResult := processor.Import(exportResult, result, out, progress) result.Update(importResult) progress <- models.Progress{}.FromImportResult(result) } err = processor.ImportBackend().FinishImport() if err != nil { handleError(result, err, out, progress) return } progress <- models.Progress{}.FromImportResult(result).Complete() out <- result } func handleError(result models.ImportResult, err error, out chan models.ImportResult, progress chan models.Progress) { result.Error = err progress <- models.Progress{}.FromImportResult(result).Complete() out <- result }