Files
fiscalos/src/FiscalOS.Infra/Transactions/Plaid/PlaidTransactionProcessor.cs
T

91 lines
2.8 KiB
C#

using Account = FiscalOS.Core.Accounts.Account;
namespace FiscalOS.Infra.Transactions.Plaid;
internal interface IPlaidTransactionProcessor
{
Task<bool> 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<PlaidTransactionProcessor> _logger;
private PlaidTransactionProcessor(
IPlaidAddedTransactionHandler addedHandler,
IPlaidModifiedTransactionHandler modifiedHandler,
IPlaidRemovedTransactionHandler removedHandler,
ILogger<PlaidTransactionProcessor> logger
)
{
_addedHandler = addedHandler;
_modifiedHandler = modifiedHandler;
_removedHandler = removedHandler;
_logger = logger;
}
internal static PlaidTransactionProcessor From(
IPlaidAddedTransactionHandler addedHandler,
IPlaidModifiedTransactionHandler modifiedHandler,
IPlaidRemovedTransactionHandler removedHandler,
ILogger<PlaidTransactionProcessor> logger
)
{
return new(addedHandler, modifiedHandler, removedHandler, logger);
}
internal static PlaidTransactionProcessor From(IServiceProvider provider)
{
return new(
provider.GetRequiredService<IPlaidAddedTransactionHandler>(),
provider.GetRequiredService<IPlaidModifiedTransactionHandler>(),
provider.GetRequiredService<IPlaidRemovedTransactionHandler>(),
provider.GetRequiredService<ILogger<PlaidTransactionProcessor>>()
);
}
public async Task<bool> 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;
}
}