namespace FiscalOS.Infra.DependencyInjection; using FiscalOS.Core.Queuing; using FiscalOS.Infra.Accounts.Plaid; using FiscalOS.Infra.Queuing; using FiscalOS.Infra.Transactions.Plaid; public static class ServiceCollectionExtensions { public static IServiceCollection AddInfrastructure(this IServiceCollection services) { services.AddSingleton(); services.AddHttpClient(); services.AddSingleton(TimeProvider.System); services.AddSingleton(); services.ConfigureOptions(); services.ConfigureOptions(); services.AddSingleton(TokenGenerator.From); services.AddSingleton(PasswordHasher.From); services.ConfigureOptions(); services.AddSingleton(FileKeyRing.From); services.AddSingleton(Encryptor.From); services.ConfigureOptions(); services.AddDbContext(); services.AddHostedService(); services.ConfigureOptions(); services.AddSingleton(static sp => { var factory = sp.GetRequiredService(); var logger = sp.GetRequiredService>(); var clientOptions = sp.GetRequiredService>(); var options = clientOptions.Value.ToPlaidOptions(); return new PlaidClient(options, factory, logger); }); services.AddSingleton(PlaidAccountService.From); services.AddSingleton(PlaidTransactionService.From); services.AddScoped(PlaidAddedTransactionHandler.From); services.AddScoped(PlaidModifiedTransactionHandler.From); services.AddScoped(PlaidRemovedTransactionHandler.From); services.AddScoped(PlaidTransactionProcessor.From); services.AddScoped(PlaidTransactionSyncer.From); services.AddSingleton>(ChannelAsyncQueue.From); services.AddScoped>(SyncUpdatesProcessor.From); services.AddHostedService(AsyncQueueHostedService.From); return services; } }