This refactor keeps all public API contracts (routes, DTOs, and HTTP response behavior) intact while moving internal code to a feature-oriented structure.
HsumChaint.APIHsumChaint.DomainHsumChaint.DatabaseHsumChaint.Shared
HsumChaint.API/Features/{Auth,User,Notification}/...HsumChaint.Domain/Features/{Auth,User,Notification}/...HsumChaint.Database/Models/...
HsumChaint is now shaped as a mobile-ready backend for monastery donation management:
- users can register, login, and refresh JWT tokens
- monastery owners can create monastery spaces and manage members
- owners/admins can invite existing users into monastery roles
- donors can submit donation requests
- monastery owners/admins can manually record donations and review requests
- owners/admins/editors can schedule pickup/dropoff and complete donations
- donation lifecycle changes create database notifications and optionally send Firebase push when a user has an FCM token
- API handles HTTP entry only and delegates to Domain services.
- Domain handles feature orchestration, validation, auth/token flow, notification sending, and DTO-entity mapping.
- Database contains EF Core database-first
AppDbContextand table models only. - Shared stores cross-project configuration contracts and enums.
Program.csnow focuses on host bootstrap + middleware + endpoint mapping.- All registration is split into extension methods:
HsumChaint.API/Extensions/DependencyInjectionExtensions.csAddApiServicesAddFirebaseConfigurationAddJwtAuthentication
HsumChaint.Domain/Extensions/DependencyInjectionExtensions.csHsumChaint.Database/Extensions/DependencyInjectionExtensions.cs
- Stage-aware config loading:
HsumChaint.API/Extensions/StageConfigurationExtensions.csHsumChaint.API/Config/appsettings.jsonHsumChaint.API/Config/custom-settings-{stage}.json(for now:custom-settings-development.json)Programcallsbuilder.AddStageConfig()immediately after creation.
flowchart LR
Request["HTTP Request"] --> Controllers["API Feature Controller<br/>api/v1/Auth, api/User, api/Notifications"]
Controllers --> Service["Domain Feature Service<br/>IAuthService / IUserService / INotificationService"]
Service --> Db[(Database<br/>EF Core AppDbContext)]
Db --> Models["Database-first table models"]
Service --> Provider["Domain Notification Provider"]
Service --> Mapper["AutoMapper Profiles"]
Service --> Response["ApplicationCommonResponseModel / DTOs"]
Response --> Controllers --> Result["HTTP Response"]
- API controllers moved from
HsumChaint.API/Controllers/*into:HsumChaint.API/Features/Auth/ControllersHsumChaint.API/Features/User/ControllersHsumChaint.API/Features/Notification/Controllers
- Application service logic and DTOs moved under feature folders in
HsumChaint.Domain/Features/.... - Repository logic was folded into Domain services so feature services use
AppDbContextdirectly. - EF Core database-first context and table models moved to
HsumChaint.Database/Models/.... - Shared enums/options moved from
HsumChaint.CommontoHsumChaint.Shared.
- Add each feature under:
HsumChaint.API/Features/<Feature>/ControllersHsumChaint.Domain/Features/<Feature>/{DTOs,ServiceInterfaces,Services}HsumChaint.Database/Modelsonly when EF database-first scaffolding adds or refreshes table models.
- Register new services and database wiring through extension methods in:
HsumChaint.API/Extensions/DependencyInjectionExtensions.csHsumChaint.Domain/Extensions/DependencyInjectionExtensions.csHsumChaint.Database/Extensions/DependencyInjectionExtensions.cs
- Default/shared values:
HsumChaint.API/Config/appsettings.json - Stage-specific override values:
HsumChaint.API/Config/custom-settings-<stage>.json - Environment values continue to work through standard .NET configuration providers.
- Complete local database setup is captured in:
HsumChaint.Database/Scripts/000_create_local_database.sql
- One round of local test seed data is captured in:
HsumChaint.Database/Scripts/001_seed_test_data.sql
- Donation-management schema additions for an existing older database are captured in:
HsumChaint.Database/Scripts/20260831_complete_donation_management.sql
- This project continues to follow the database-first approach; run the complete SQL script against local MySQL before using the API, then run the seed script when you need sample users, monastery, members, donations, invitations, notifications, and settings.
POST /api/v1/Auth/registerPOST /api/v1/Auth/loginPOST /api/v1/Auth/refresh-token
POST /api/v1/monasteriesGET /api/v1/monasteries/mineGET /api/v1/monasteries/{id}PUT /api/v1/monasteries/{id}POST /api/v1/monasteries/{id}/invitationsPOST /api/v1/monasteries/invitations/{invitationId}/respondGET /api/v1/monasteries/{id}/membersPUT /api/v1/monasteries/{id}/members/{memberUserId}/roleDELETE /api/v1/monasteries/{id}/members/{memberUserId}
POST /api/v1/donations/requestPOST /api/v1/donations/manualGET /api/v1/donationsGET /api/v1/donations/{id}PUT /api/v1/donations/{id}/reviewPUT /api/v1/donations/{id}/schedulePUT /api/v1/donations/{id}/completePUT /api/v1/donations/{id}/cancel
- Build:
dotnet build HsumChaint.slnx - Tests:
dotnet test HsumChaint.Tests/HsumChaint.Tests.csproj - Run API:
dotnet run --project HsumChaint.API
dotnet ef dbcontext scaffold ...command kept below for database scaffolding tasks.docker compose up --build