Importers need access to Account
This commit is contained in:
parent
57ee150d3c
commit
c67972a327
@ -13,13 +13,15 @@ namespace ApplicationServices
|
||||
{
|
||||
try
|
||||
{
|
||||
var items = await AudibleApiActions.GetAllLibraryItemsAsync(callback);
|
||||
var account = AudibleApiStorage.TEST_GetFirstAccount();
|
||||
|
||||
var items = await AudibleApiActions.GetAllLibraryItemsAsync(account, callback);
|
||||
var totalCount = items.Count;
|
||||
Serilog.Log.Logger.Information($"GetAllLibraryItems: Total count {totalCount}");
|
||||
|
||||
using var context = DbContexts.GetContext();
|
||||
var libImporter = new LibraryImporter(context);
|
||||
var newCount = await Task.Run(() => libImporter.Import(items));
|
||||
var libraryImporter = new LibraryImporter(context, account);
|
||||
var newCount = await Task.Run(() => libraryImporter.Import(items));
|
||||
context.SaveChanges();
|
||||
Serilog.Log.Logger.Information($"Import: New count {newCount}");
|
||||
|
||||
|
||||
@ -9,16 +9,16 @@ namespace DtoImporterService
|
||||
{
|
||||
public class BookImporter : ItemsImporterBase
|
||||
{
|
||||
public BookImporter(LibationContext context) : base(context) { }
|
||||
public BookImporter(LibationContext context, Account account) : base(context, account) { }
|
||||
|
||||
public override IEnumerable<Exception> Validate(IEnumerable<Item> items) => new BookValidator().Validate(items);
|
||||
|
||||
protected override int DoImport(IEnumerable<Item> items)
|
||||
{
|
||||
// pre-req.s
|
||||
new ContributorImporter(DbContext).Import(items);
|
||||
new SeriesImporter(DbContext).Import(items);
|
||||
new CategoryImporter(DbContext).Import(items);
|
||||
new ContributorImporter(DbContext, Account).Import(items);
|
||||
new SeriesImporter(DbContext, Account).Import(items);
|
||||
new CategoryImporter(DbContext, Account).Import(items);
|
||||
|
||||
// get distinct
|
||||
var productIds = items.Select(i => i.ProductId).ToList();
|
||||
|
||||
@ -9,7 +9,7 @@ namespace DtoImporterService
|
||||
{
|
||||
public class CategoryImporter : ItemsImporterBase
|
||||
{
|
||||
public CategoryImporter(LibationContext context) : base(context) { }
|
||||
public CategoryImporter(LibationContext context, Account account) : base(context, account) { }
|
||||
|
||||
public override IEnumerable<Exception> Validate(IEnumerable<Item> items) => new CategoryValidator().Validate(items);
|
||||
|
||||
|
||||
@ -9,7 +9,7 @@ namespace DtoImporterService
|
||||
{
|
||||
public class ContributorImporter : ItemsImporterBase
|
||||
{
|
||||
public ContributorImporter(LibationContext context) : base(context) { }
|
||||
public ContributorImporter(LibationContext context, Account account) : base(context, account) { }
|
||||
|
||||
public override IEnumerable<Exception> Validate(IEnumerable<Item> items) => new ContributorValidator().Validate(items);
|
||||
|
||||
|
||||
@ -4,17 +4,22 @@ using System.Linq;
|
||||
using AudibleApiDTOs;
|
||||
using DataLayer;
|
||||
using Dinah.Core;
|
||||
using InternalUtilities;
|
||||
|
||||
namespace DtoImporterService
|
||||
{
|
||||
public abstract class ImporterBase<T>
|
||||
{
|
||||
protected LibationContext DbContext { get; }
|
||||
protected Account Account { get; }
|
||||
|
||||
public ImporterBase(LibationContext context)
|
||||
protected ImporterBase(LibationContext context, Account account)
|
||||
{
|
||||
ArgumentValidator.EnsureNotNull(context, nameof(context));
|
||||
ArgumentValidator.EnsureNotNull(account, nameof(account));
|
||||
|
||||
DbContext = context;
|
||||
Account = account;
|
||||
}
|
||||
|
||||
/// <summary>LONG RUNNING. call with await Task.Run</summary>
|
||||
@ -52,6 +57,6 @@ namespace DtoImporterService
|
||||
|
||||
public abstract class ItemsImporterBase : ImporterBase<IEnumerable<Item>>
|
||||
{
|
||||
public ItemsImporterBase(LibationContext context) : base(context) { }
|
||||
protected ItemsImporterBase(LibationContext context, Account account) : base(context, account) { }
|
||||
}
|
||||
}
|
||||
|
||||
@ -9,13 +9,13 @@ namespace DtoImporterService
|
||||
{
|
||||
public class LibraryImporter : ItemsImporterBase
|
||||
{
|
||||
public LibraryImporter(LibationContext context) : base(context) { }
|
||||
public LibraryImporter(LibationContext context, Account account) : base(context, account) { }
|
||||
|
||||
public override IEnumerable<Exception> Validate(IEnumerable<Item> items) => new LibraryValidator().Validate(items);
|
||||
|
||||
protected override int DoImport(IEnumerable<Item> items)
|
||||
{
|
||||
new BookImporter(DbContext).Import(items);
|
||||
new BookImporter(DbContext, Account).Import(items);
|
||||
|
||||
var qtyNew = upsertLibraryBooks(items);
|
||||
return qtyNew;
|
||||
|
||||
@ -9,7 +9,7 @@ namespace DtoImporterService
|
||||
{
|
||||
public class SeriesImporter : ItemsImporterBase
|
||||
{
|
||||
public SeriesImporter(LibationContext context) : base(context) { }
|
||||
public SeriesImporter(LibationContext context, Account account) : base(context, account) { }
|
||||
|
||||
public override IEnumerable<Exception> Validate(IEnumerable<Item> items) => new SeriesValidator().Validate(items);
|
||||
|
||||
|
||||
@ -20,22 +20,30 @@ namespace InternalUtilities
|
||||
return await EzApiCreator.GetApiAsync(AudibleApiStorage.AccountsSettingsFile, AudibleApiStorage.TEST_GetFirstIdentityTokensJsonPath(), loginCallback);
|
||||
}
|
||||
|
||||
/// <summary>USE THIS from within Libation. It wraps the call with correct JSONPath</summary>
|
||||
public static async Task<Api> GetApiAsync(Account account, ILoginCallback loginCallback = null)
|
||||
{
|
||||
Localization.SetLocale(Configuration.Instance.LocaleCountryCode);
|
||||
|
||||
return await EzApiCreator.GetApiAsync(AudibleApiStorage.AccountsSettingsFile, account.GetIdentityTokensJsonPath(), loginCallback);
|
||||
}
|
||||
|
||||
private static AsyncRetryPolicy policy { get; }
|
||||
= Policy.Handle<Exception>()
|
||||
// 2 retries == 3 total
|
||||
.RetryAsync(2);
|
||||
|
||||
public static Task<List<Item>> GetAllLibraryItemsAsync(ILoginCallback callback)
|
||||
public static Task<List<Item>> GetAllLibraryItemsAsync(Account account, ILoginCallback callback)
|
||||
{
|
||||
// bug on audible's side. the 1st time after a long absence, a query to get library will return without titles or authors. a subsequent identical query will be successful. this is true whether or tokens are refreshed
|
||||
// worse, this 1st dummy call doesn't seem to help:
|
||||
// var page = await api.GetLibraryAsync(new AudibleApi.LibraryOptions { NumberOfResultPerPage = 1, PageNumber = 1, PurchasedAfter = DateTime.Now.AddYears(-20), ResponseGroups = AudibleApi.LibraryOptions.ResponseGroupOptions.ALL_OPTIONS });
|
||||
// i don't want to incur the cost of making a full dummy call every time because it fails sometimes
|
||||
return policy.ExecuteAsync(() => getItemsAsync(callback));
|
||||
return policy.ExecuteAsync(() => getItemsAsync(account, callback));
|
||||
}
|
||||
private static async Task<List<Item>> getItemsAsync(ILoginCallback callback)
|
||||
private static async Task<List<Item>> getItemsAsync(Account account, ILoginCallback callback)
|
||||
{
|
||||
var api = await GetApiAsync(callback);
|
||||
var api = await GetApiAsync(account, callback);
|
||||
var items = await api.GetAllLibraryItemsAsync();
|
||||
|
||||
// remove episode parents
|
||||
|
||||
@ -13,7 +13,7 @@
|
||||
<!-- <PublishSingleFile>true</PublishSingleFile> -->
|
||||
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
||||
|
||||
<Version>3.1.12.136</Version>
|
||||
<Version>3.1.12.139</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@ -22,7 +22,7 @@ namespace LibationWinForms.Dialogs
|
||||
{
|
||||
(TotalBooksProcessed, NewBooksAdded) = await LibraryCommands.ImportLibraryAsync(new WinformResponder());
|
||||
}
|
||||
catch (Exception ex)
|
||||
catch
|
||||
{
|
||||
var msg = "Error importing library. Please try again. If this still happens after 2 or 3 tries, stop and contact administrator";
|
||||
MessageBox.Show(msg, "Error importing library", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user