using Account = FiscalOS.Core.Accounts.Account; namespace FiscalOS.Infra.Transactions.Plaid; internal interface IPlaidTransactionProcessor { Task ProcessAsync( Account account, TransactionsSyncResponse syncResponse, CancellationToken cancellationToken ); } internal sealed class PlaidTransactionProcessor : IPlaidTransactionProcessor { private readonly IPlaidAddedTransactionHandler _addedHandler; private readonly IPlaidModifiedTransactionHandler _modifiedHandler; private readonly IPlaidRemovedTransactionHandler _removedHandler; private readonly ILogger _logger; private PlaidTransactionProcessor( IPlaidAddedTransactionHandler addedHandler, IPlaidModifiedTransactionHandler modifiedHandler, IPlaidRemovedTransactionHandler removedHandler, ILogger logger ) { _addedHandler = addedHandler; _modifiedHandler = modifiedHandler; _removedHandler = removedHandler; _logger = logger; } internal static PlaidTransactionProcessor From( IPlaidAddedTransactionHandler addedHandler, IPlaidModifiedTransactionHandler modifiedHandler, IPlaidRemovedTransactionHandler removedHandler, ILogger logger ) { return new(addedHandler, modifiedHandler, removedHandler, logger); } internal static PlaidTransactionProcessor From(IServiceProvider provider) { return new( provider.GetRequiredService(), provider.GetRequiredService(), provider.GetRequiredService(), provider.GetRequiredService>() ); } public async Task ProcessAsync( Account account, TransactionsSyncResponse syncResponse, CancellationToken cancellationToken ) { var numAdded = await _addedHandler.HandleAsync( account, syncResponse.Added, cancellationToken ).ConfigureAwait(false); var numModified = await _modifiedHandler.HandleAsync( account, syncResponse.Modified, cancellationToken ).ConfigureAwait(false); var numRemoved = await _removedHandler.HandleAsync( syncResponse.Removed, cancellationToken ).ConfigureAwait(false); _logger.LogInformation( "Processed Plaid transactions sync for account {AccountId}: {NumAdded} of {TotalAdded} added, {NumModified} of {TotalModified} modified, {NumRemoved} of {TotalRemoved} removed", account.Id, numAdded, syncResponse.Added.Count, numModified, syncResponse.Modified.Count, numRemoved, syncResponse.Removed.Count ); return numAdded == syncResponse.Added.Count && numModified == syncResponse.Modified.Count; } }