# Plan: Core / Infrastructure / API Project Split ## Goal Split the single `Budget.Api` project into three projects matching the stwaddle stack pattern: - `Budget.Core` — entities, DTOs, enums. No ASP.NET or EF dependencies. - `Budget.Infrastructure` — DbContext, EF configs, migrations, domain services. - `Budget.Api` — controllers, middleware, Program.cs, DI wiring. ## Current state Everything lives in `src/Budget.Api/`: ``` Models/ Budget, Income, Outgo, BudgetShare, KnownUser, enums DTOs/ BudgetDtos, IncomeDtos, OutgoDtos, ShareDtos, SummaryDtos Data/ AppDbContext, Migrations/ Services/ BudgetAuthorizationService, FrequencyCalculator, KnownUserMiddleware, ErrorHandlingMiddleware, ClaimsPrincipalExtensions Controllers/ BudgetsController, IncomesController, OutgosController, SharesController, SummaryController Program.cs ``` ## Target state ``` src/ Budget.Core/ Models/ Budget, Income, Outgo, BudgetShare, KnownUser, enums DTOs/ all DTO records and request types Services/ FrequencyCalculator (pure logic, no EF/ASP.NET) Budget.Infrastructure/ Data/ AppDbContext, Migrations/ Services/ BudgetAuthorizationService Budget.Api/ Controllers/ Services/ KnownUserMiddleware, ErrorHandlingMiddleware, ClaimsPrincipalExtensions Program.cs ``` **References:** `Budget.Api` → `Budget.Infrastructure` → `Budget.Core` ## Steps ### Phase 1 — Create projects and move files 1. `dotnet new classlib -n Budget.Core -o src/Budget.Core --framework net10.0` 2. `dotnet new classlib -n Budget.Infrastructure -o src/Budget.Infrastructure --framework net10.0` 3. Add both to the solution: `dotnet sln add src/Budget.Core/Budget.Core.csproj src/Budget.Infrastructure/Budget.Infrastructure.csproj` 4. Move `Models/` and `DTOs/` to `Budget.Core`; update namespaces from `Budget.Api.*` to `Budget.Core.*`. 5. Move `FrequencyCalculator.cs` to `Budget.Core/Services/`. 6. Move `Data/` (AppDbContext + Migrations) to `Budget.Infrastructure/Data/`. 7. Move `BudgetAuthorizationService.cs` to `Budget.Infrastructure/Services/`. ### Phase 2 — Wire up project references and NuGet packages 8. Add project reference: `Budget.Infrastructure` → `Budget.Core`. 9. Move EF Core + Npgsql NuGet packages from `Budget.Api.csproj` to `Budget.Infrastructure.csproj`. Keep only `Microsoft.AspNetCore.Authentication.JwtBearer` and health-check packages in `Budget.Api.csproj`. 10. Add project references to `Budget.Api.csproj`: both `Budget.Core` and `Budget.Infrastructure`. 11. Add `Microsoft.EntityFrameworkCore.Design` to `Budget.Api.csproj` (needed for `dotnet ef` CLI to find the startup project). ### Phase 3 — Update namespaces and using statements 12. Global search-replace across all moved files: `namespace Budget.Api` → `namespace Budget.Core` or `namespace Budget.Infrastructure` as appropriate. 13. Update `using` directives in all controllers, middleware, and Program.cs to reference the new namespaces. ### Phase 4 — Update Dockerfile and EF migrations command 14. Update Dockerfile Stage 2 to copy and restore all three projects before publishing `Budget.Api`. 15. Verify `dotnet ef migrations add` command still works with `--project Budget.Infrastructure --startup-project Budget.Api`. 16. Build and confirm zero errors. ## Key decisions - `ClaimsPrincipalExtensions` and the two middleware classes stay in `Budget.Api` — they have direct ASP.NET dependencies and are not reusable across projects. - `BudgetAuthorizationService` goes in `Budget.Infrastructure` because it queries the DbContext. - `FrequencyCalculator` goes in `Budget.Core` because it is pure arithmetic with no external dependencies. - DTOs stay in `Budget.Core` (not `Budget.Api`) so `Budget.Infrastructure` can reference them if needed without creating a circular dependency. ## Files affected - `Budget.sln` - New: `src/Budget.Core/Budget.Core.csproj` - New: `src/Budget.Infrastructure/Budget.Infrastructure.csproj` - `src/Budget.Api/Budget.Api.csproj` (trim NuGet packages, add project refs) - All `.cs` files under `src/Budget.Api/` (namespace updates) - `Dockerfile` (Stage 2 COPY pattern)