59 lines
1.5 KiB
C#
59 lines
1.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using AudibleApiDTOs;
|
|
using DataLayer;
|
|
using InternalUtilities;
|
|
|
|
namespace DtoImporterService
|
|
{
|
|
public class SeriesImporter : ItemsImporterBase
|
|
{
|
|
public override IEnumerable<Exception> Validate(IEnumerable<Item> items) => new SeriesValidator().Validate(items);
|
|
|
|
protected override int DoImport(IEnumerable<Item> items, LibationContext context)
|
|
{
|
|
// get distinct
|
|
var series = items.GetSeriesDistinct().ToList();
|
|
|
|
// load db existing => .Local
|
|
loadLocal_series(series, context);
|
|
|
|
// upsert
|
|
var qtyNew = upsertSeries(series, context);
|
|
return qtyNew;
|
|
}
|
|
|
|
private void loadLocal_series(List<AudibleApiDTOs.Series> series, LibationContext context)
|
|
{
|
|
var seriesIds = series.Select(s => s.SeriesId).ToList();
|
|
var localIds = context.Series.Local.Select(s => s.AudibleSeriesId).ToList();
|
|
var remainingSeriesIds = seriesIds
|
|
.Distinct()
|
|
.Except(localIds)
|
|
.ToList();
|
|
|
|
if (remainingSeriesIds.Any())
|
|
context.Series.Where(s => remainingSeriesIds.Contains(s.AudibleSeriesId)).ToList();
|
|
}
|
|
|
|
private int upsertSeries(List<AudibleApiDTOs.Series> requestedSeries, LibationContext context)
|
|
{
|
|
var qtyNew = 0;
|
|
|
|
foreach (var s in requestedSeries)
|
|
{
|
|
var series = context.Series.Local.SingleOrDefault(c => c.AudibleSeriesId == s.SeriesId);
|
|
if (series is null)
|
|
{
|
|
series = context.Series.Add(new DataLayer.Series(new AudibleSeriesId(s.SeriesId))).Entity;
|
|
qtyNew++;
|
|
}
|
|
series.UpdateName(s.SeriesName);
|
|
}
|
|
|
|
return qtyNew;
|
|
}
|
|
}
|
|
}
|