Add four new services to extract business logic from PageModels: - AccountService: Account retrieval, stats, and deletion with validation - CardService: Card retrieval, stats, and deletion with validation - ReferenceDataService: Centralized reference data for dropdowns (categories, merchants, cards, accounts) - TransactionStatisticsService: Transaction statistics and aggregate calculations All services follow the established service layer pattern with interfaces for DI and improved testability. Includes comprehensive DTOs for stats and validation results. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
81 lines
2.7 KiB
C#
81 lines
2.7 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
using MoneyMap.Data;
|
|
using MoneyMap.Pages;
|
|
using MoneyMap.Services; // Add this for the services
|
|
|
|
var builder = WebApplication.CreateBuilder(args);
|
|
|
|
builder.Services.AddRazorPages();
|
|
builder.Services.AddDbContext<MoneyMapContext>(options =>
|
|
options.UseSqlServer(builder.Configuration.GetConnectionString("MoneyMapDb")));
|
|
|
|
// Add session support
|
|
builder.Services.AddDistributedMemoryCache();
|
|
builder.Services.AddSession(options =>
|
|
{
|
|
options.IdleTimeout = TimeSpan.FromMinutes(30);
|
|
options.Cookie.HttpOnly = true;
|
|
options.Cookie.IsEssential = true;
|
|
options.IOTimeout = TimeSpan.FromMinutes(5); // Increase timeout for large data
|
|
});
|
|
|
|
// Core transaction and import services
|
|
builder.Services.AddScoped<ITransactionImporter, TransactionImporter>();
|
|
builder.Services.AddScoped<ICardResolver, CardResolver>();
|
|
builder.Services.AddScoped<ITransactionCategorizer, TransactionCategorizer>();
|
|
builder.Services.AddScoped<ITransactionService, TransactionService>();
|
|
builder.Services.AddScoped<ITransactionStatisticsService, TransactionStatisticsService>();
|
|
|
|
// Entity management services
|
|
builder.Services.AddScoped<IAccountService, AccountService>();
|
|
builder.Services.AddScoped<ICardService, CardService>();
|
|
builder.Services.AddScoped<IMerchantService, MerchantService>();
|
|
|
|
// Receipt services
|
|
builder.Services.AddScoped<IReceiptMatchingService, ReceiptMatchingService>();
|
|
|
|
// Reference data services
|
|
builder.Services.AddScoped<IReferenceDataService, ReferenceDataService>();
|
|
|
|
// Dashboard services
|
|
builder.Services.AddScoped<IDashboardService, DashboardService>();
|
|
builder.Services.AddScoped<IDashboardStatsCalculator, DashboardStatsCalculator>();
|
|
builder.Services.AddScoped<ITopCategoriesProvider, TopCategoriesProvider>();
|
|
builder.Services.AddScoped<IRecentTransactionsProvider, RecentTransactionsProvider>();
|
|
builder.Services.AddScoped<ISpendTrendsProvider, SpendTrendsProvider>();
|
|
builder.Services.AddScoped<IReceiptManager, ReceiptManager>();
|
|
builder.Services.AddScoped<IReceiptAutoMapper, ReceiptAutoMapper>();
|
|
builder.Services.AddHttpClient<IReceiptParser, AIReceiptParser>();
|
|
|
|
// AI categorization service
|
|
builder.Services.AddHttpClient<ITransactionAICategorizer, TransactionAICategorizer>();
|
|
|
|
var app = builder.Build();
|
|
|
|
// Seed default category mappings on startup
|
|
using (var scope = app.Services.CreateScope())
|
|
{
|
|
var categorizer = scope.ServiceProvider.GetRequiredService<ITransactionCategorizer>();
|
|
await categorizer.SeedDefaultMappingsAsync();
|
|
}
|
|
|
|
// Configure the HTTP request pipeline.
|
|
if (!app.Environment.IsDevelopment())
|
|
{
|
|
app.UseExceptionHandler("/Error");
|
|
app.UseHsts();
|
|
}
|
|
|
|
app.UseHttpsRedirection();
|
|
app.UseStaticFiles();
|
|
|
|
app.UseRouting();
|
|
|
|
app.UseSession();
|
|
|
|
app.UseAuthorization();
|
|
|
|
app.MapRazorPages();
|
|
|
|
app.Run();
|