2026-03-01 19:56:29 -06:00
using Account = FiscalOS . Core . Accounts . Account ;
namespace FiscalOS.Infra.Transactions.Plaid ;
internal interface IPlaidTransactionProcessor
{
2026-03-03 05:09:03 -06:00
Task < bool > ProcessAsync (
2026-03-01 19:56:29 -06:00
Account account ,
TransactionsSyncResponse syncResponse ,
CancellationToken cancellationToken
);
}
internal sealed class PlaidTransactionProcessor : IPlaidTransactionProcessor
{
private readonly IPlaidAddedTransactionHandler _addedHandler ;
private readonly IPlaidModifiedTransactionHandler _modifiedHandler ;
private readonly IPlaidRemovedTransactionHandler _removedHandler ;
2026-03-12 16:42:44 -05:00
private readonly ILogger < PlaidTransactionProcessor > _logger ;
2026-03-01 19:56:29 -06:00
private PlaidTransactionProcessor (
IPlaidAddedTransactionHandler addedHandler ,
IPlaidModifiedTransactionHandler modifiedHandler ,
2026-03-12 16:42:44 -05:00
IPlaidRemovedTransactionHandler removedHandler ,
ILogger < PlaidTransactionProcessor > logger
2026-03-01 19:56:29 -06:00
)
{
_addedHandler = addedHandler ;
_modifiedHandler = modifiedHandler ;
_removedHandler = removedHandler ;
2026-03-12 16:42:44 -05:00
_logger = logger ;
2026-03-01 19:56:29 -06:00
}
2026-03-05 13:58:00 -06:00
internal static PlaidTransactionProcessor From (
IPlaidAddedTransactionHandler addedHandler ,
IPlaidModifiedTransactionHandler modifiedHandler ,
2026-03-12 16:42:44 -05:00
IPlaidRemovedTransactionHandler removedHandler ,
ILogger < PlaidTransactionProcessor > logger
2026-03-05 13:58:00 -06:00
)
{
2026-03-12 16:42:44 -05:00
return new ( addedHandler , modifiedHandler , removedHandler , logger );
2026-03-05 13:58:00 -06:00
}
2026-03-01 19:56:29 -06:00
internal static PlaidTransactionProcessor From ( IServiceProvider provider )
{
return new (
provider . GetRequiredService < IPlaidAddedTransactionHandler >(),
provider . GetRequiredService < IPlaidModifiedTransactionHandler >(),
2026-03-12 16:42:44 -05:00
provider . GetRequiredService < IPlaidRemovedTransactionHandler >(),
provider . GetRequiredService < ILogger < PlaidTransactionProcessor >>()
2026-03-01 19:56:29 -06:00
);
}
2026-03-03 05:09:03 -06:00
public async Task < bool > ProcessAsync (
Account account ,
TransactionsSyncResponse syncResponse ,
CancellationToken cancellationToken
)
2026-03-01 19:56:29 -06:00
{
2026-03-03 05:09:03 -06:00
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 );
2026-03-12 16:42:44 -05:00
_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
);
2026-03-03 05:09:03 -06:00
return numAdded == syncResponse . Added . Count &&
numModified == syncResponse . Modified . Count &&
numRemoved == syncResponse . Removed . Count ;
2026-03-01 19:56:29 -06:00
}
}