using System; using System.Collections.Generic; using System.Linq; using AudibleUtilities; using DataLayer; using Dinah.Core; namespace DtoImporterService { public abstract class ImporterBase where TValidate : IValidator { protected LibationContext DbContext { get; } protected ImporterBase(LibationContext context) { ArgumentValidator.EnsureNotNull(context, nameof(context)); DbContext = context; } /// LONG RUNNING. call with await Task.Run public int Import(IEnumerable param) => Run(DoImport, param); public TResult Run(Func, TResult> func, IEnumerable param) { try { var exceptions = TValidate.Validate(param.Select(i => i.DtoItem)); if (exceptions is not null && exceptions.Any()) throw new AggregateException($"Importer validation failed", exceptions); } catch (Exception ex) { Serilog.Log.Logger.Error(ex, "Import error: validation"); throw; } try { var result = func(param); return result; } catch (Exception ex) { Serilog.Log.Logger.Error(ex, "Import error: post-validation importing"); throw; } } protected abstract int DoImport(IEnumerable elements); } }