@startuml architecture !theme plain skinparam backgroundColor #FFFFFF skinparam defaultFontName Arial skinparam packageStyle rectangle title The Biergarten App - Vertical Slice Architecture package "API.Core (thin host)" #E3F2FD { [API.Core\nASP.NET Core Web API host] as API note right of API - Program.cs wiring only - MediatR + AddApplicationPart per Features.* assembly - Swagger/OpenAPI, health checks - JWT auth middleware - Global exception filter end note } package "Feature Slices" #F3E5F5 { [Features.Auth] as AuthSlice [Features.Breweries] as BrewerySlice [Features.UserManagement] as UserSlice [Features.Emails] as EmailsSlice note right of AuthSlice Each slice owns its own: - Controller (HTTP endpoints) - Commands/Queries + Handlers - Validators - Repository end note note right of EmailsSlice No controller - invoked only via MediatR commands sent from other slices end note } package "Shared" #FCE4EC { [Shared.Contracts] as SharedContracts [Shared.Application] as SharedApp note right of SharedApp - ValidationBehavior (MediatR pipeline) - Cross-slice email commands (SendRegistrationEmailCommand, SendResendConfirmationEmailCommand) end note } package "Infrastructure Layer" #FFF3E0 { [Infrastructure.Sql] as Sql [Infrastructure.Jwt] as JWT [Infrastructure.PasswordHashing] as PwdHash [Infrastructure.Email] as Email [Infrastructure.Email.Templates] as EmailTemplates } package "Domain Layer" #E8F5E9 { [Domain.Entities] as Domain [Domain.Exceptions] as DomainExceptions note right of Domain - UserAccount - UserCredential - UserVerification - BreweryPost end note } database "SQL Server" { [Stored Procedures] as SP [Tables] as Tables } ' Relationships API ..> AuthSlice : AddApplicationPart\n+ MediatR scan API ..> BrewerySlice : AddApplicationPart\n+ MediatR scan API ..> UserSlice : AddApplicationPart\n+ MediatR scan API ..> EmailsSlice : MediatR scan only\n(no controller) AuthSlice --> Sql AuthSlice --> JWT AuthSlice --> PwdHash AuthSlice --> SharedContracts AuthSlice --> SharedApp BrewerySlice --> Sql BrewerySlice --> SharedContracts BrewerySlice --> SharedApp UserSlice --> Sql UserSlice --> SharedContracts UserSlice --> SharedApp EmailsSlice --> Email EmailsSlice --> EmailTemplates EmailsSlice --> SharedApp ' The one cross-slice interaction: a MediatR command contract, not a project reference AuthSlice ..> SharedApp : sends\nSendRegistrationEmailCommand EmailsSlice ..> SharedApp : handles\nSendRegistrationEmailCommand Sql --> SP Sql --> Domain SP --> Tables AuthSlice --> Domain BrewerySlice --> Domain UserSlice --> Domain AuthSlice --> DomainExceptions ' Notes note left of Sql SQL-first approach All queries via stored procedures end note note bottom of AuthSlice No Features.* project ever references another Features.* project directly end note @enduml