namespace IOL.GreatOffice.Api.Endpoints.Internal.Account; public class GetAccountArchiveRoute : RouteBaseAsync.WithoutRequest.WithActionResult { private readonly AppDbContext _context; /// public GetAccountArchiveRoute(AppDbContext context) { _context = context; } /// /// Get a data archive with the currently logged on user's data. /// /// /// [HttpGet("~/_/account/archive")] public override async Task> HandleAsync(CancellationToken cancellationToken = default) { var user = _context.Users.SingleOrDefault(c => c.Id == LoggedInUser.Id); if (user == default) { await HttpContext.SignOutAsync(); return Unauthorized(); } var entries = _context.TimeEntries .AsNoTracking() .Include(c => c.Labels) .Include(c => c.Category) .Where(c => c.User.Id == user.Id) .ToList(); var jsonOptions = new JsonSerializerOptions { WriteIndented = true }; var dto = new UserArchiveDto(user); dto.Entries.AddRange(entries.Select(entry => new UserArchiveDto.EntryDto { CreatedAt = entry.CreatedAt.ToString("yyyy-MM-ddTHH:mm:ssZ"), StartDateTime = entry.Start, StopDateTime = entry.Stop, Description = entry.Description, Labels = entry.Labels .Select(c => new UserArchiveDto.LabelDto { Name = c.Name, Color = c.Color }) .ToList(), Category = new UserArchiveDto.CategoryDto { Name = entry.Category.Name, Color = entry.Category.Color }, })); dto.CountEntries(); var entriesSerialized = JsonSerializer.SerializeToUtf8Bytes(dto, jsonOptions); return File(entriesSerialized, "application/json", user.Username + "-time-tracker-archive-" + DateTime.UtcNow.ToString("yyyyMMddTHHmmss") + ".json"); } }