namespace IOL.GreatOffice.Api.Endpoints.Internal.Account; public class DeleteAccountRoute : RouteBaseAsync.WithoutRequest.WithActionResult { private readonly AppDbContext _context; private readonly UserService _userService; /// public DeleteAccountRoute(AppDbContext context, UserService userService) { _context = context; _userService = userService; } /// /// Delete the logged on user's account. /// /// /// [HttpDelete("~/_/account/delete")] public override async Task HandleAsync(CancellationToken cancellationToken = default) { var user = _context.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 = _context.TimeCategories.Where(c => c.UserId == user.Id); var passwordResets = _context.ForgotPasswordRequests.Where(c => c.UserId == user.Id); var entries = _context.TimeEntries.Where(c => c.UserId == user.Id); var labels = _context.TimeLabels.Where(c => c.UserId == user.Id); var categories = _context.TimeCategories.Where(c => c.UserId == user.Id); _context.TimeCategories.RemoveRange(githubMappings); _context.ForgotPasswordRequests.RemoveRange(passwordResets); _context.TimeEntries.RemoveRange(entries); _context.TimeLabels.RemoveRange(labels); _context.TimeCategories.RemoveRange(categories); _context.Users.Remove(user); await _context.SaveChangesAsync(cancellationToken); await _userService.LogOutUser(HttpContext); return Ok(); } }