namespace IOL.GreatOffice.Api.Endpoints.Internal.Account; public class DeleteAccountRoute : RouteBaseAsync.WithoutRequest.WithActionResult { private readonly MainAppDatabase _database; private readonly UserService _userService; public DeleteAccountRoute(MainAppDatabase database, UserService userService) { _database = database; _userService = userService; } /// /// Delete the logged on user's account. /// /// /// [HttpDelete("~/_/account/delete")] public override async Task HandleAsync(CancellationToken cancellationToken = default) { var user = _database.Users.SingleOrDefault(c => c.Id == LoggedInUser.Id); if (user == default) { await _userService.LogOutUser(HttpContext); return Unauthorized(); } if (user.Username == "demo@demo.demo") { await _userService.LogOutUser(HttpContext); return Ok(); } var githubMappings = _database.TimeCategories.Where(c => c.UserId == user.Id); var passwordResets = _database.ForgotPasswordRequests.Where(c => c.UserId == user.Id); var entries = _database.TimeEntries.Where(c => c.UserId == user.Id); var labels = _database.TimeLabels.Where(c => c.UserId == user.Id); var categories = _database.TimeCategories.Where(c => c.UserId == user.Id); _database.TimeCategories.RemoveRange(githubMappings); _database.ForgotPasswordRequests.RemoveRange(passwordResets); _database.TimeEntries.RemoveRange(entries); _database.TimeLabels.RemoveRange(labels); _database.TimeCategories.RemoveRange(categories); _database.Users.Remove(user); await _database.SaveChangesAsync(cancellationToken); await _userService.LogOutUser(HttpContext); return Ok(); } }