@startuml delete-account !include ../../../pipeline/diagrams/biergarten-weizen-theme.puml skinparam sequenceMessageAlign center skinparam maxMessageSize 200 title User Authentication Flow - Delete Account actor User participant "API\nController" as API participant "MediatR pipeline\n(ValidationBehavior)" as Mediator box "Handler Layer" #F1F3EA participant "DeleteAccountHandler" as DeleteAccountHandler participant "UserManager" as UserMgr end box box "Repository / Cross-slice" #DBEEDD participant "DapperUserStore\n(IUserStore/IUserPasswordStore/\nIUserEmailStore)" as UserStore end box database "SQL Server" as DB note over UserMgr ASP.NET Core Identity's UserManager replaces the deleted AuthRepository: handlers no longer issue SQL or call Argon2 directly, they delegate to UserManager, which in turn calls DapperUserStore (persistence) and Argon2PasswordHasher (IPasswordHasher). end note User -> API: DELETE /api/auth/account\n(requires Bearer access token) activate API API -> Mediator: Send(DeleteAccountCommand(\n GetAuthenticatedUserId())) activate Mediator Mediator -> DeleteAccountHandler: Handle(command) activate DeleteAccountHandler DeleteAccountHandler -> UserMgr: FindByIdAsync(userAccountId) activate UserMgr UserMgr -> UserStore: FindByIdAsync(userAccountId) UserStore --> UserMgr: ApplicationUser or null UserMgr --> DeleteAccountHandler: ApplicationUser or null deactivate UserMgr alt Account not found DeleteAccountHandler -> Mediator: throw NotFoundException Mediator -> API: propagate API -> User: 404 Not Found else Account found DeleteAccountHandler -> UserMgr: DeleteAsync(user) activate UserMgr UserMgr -> UserStore: DeleteAsync(user) activate UserStore UserStore -> DB: DELETE FROM dbo.UserAccount\nWHERE UserAccountID = @Id note right of UserStore UserCredential/UserVerification/UserAvatar cascade on delete. Posts, comments, photos, and follows use ON DELETE NO ACTION - if any reference this account, the DELETE throws a foreign key violation (SQL error 547). end note alt Foreign key violation (dependent records exist) UserStore --> UserMgr: IdentityResult.Failed\n(AccountHasDependentRecords) else Delete succeeds UserStore --> UserMgr: IdentityResult.Success end deactivate UserStore UserMgr --> DeleteAccountHandler: IdentityResult deactivate UserMgr alt Account has dependent records DeleteAccountHandler -> Mediator: throw ConflictException\n"Account cannot be deleted while it still\nhas associated posts, comments, photos,\nor follows." Mediator -> API: propagate API -> User: 409 Conflict else !result.Succeeded (other failure) DeleteAccountHandler -> Mediator: throw ConflictException Mediator -> API: propagate API -> User: 409 Conflict else result.Succeeded DeleteAccountHandler --> Mediator: (void) deactivate DeleteAccountHandler Mediator --> API: (void) deactivate Mediator API -> User: 200 OK\n{message: "Account deleted successfully."} end end deactivate API @enduml