namespace IOL.GreatOffice.Api.Endpoints.V1.Entries; public class UpdateEntryRoute : RouteBaseSync.WithRequest.WithActionResult { private readonly AppDbContext _context; public UpdateEntryRoute(AppDbContext context) { _context = context; } /// /// Update a time entry. /// /// /// [ApiVersion(ApiSpecV1.VERSION_STRING)] [BasicAuthentication(AppConstants.TOKEN_ALLOW_UPDATE)] [HttpPost("~/v{version:apiVersion}/entries/update")] [ProducesResponseType(404, Type = typeof(ErrorResult))] [ProducesResponseType(200, Type = typeof(TimeEntry.TimeEntryDto))] public override ActionResult Handle(TimeEntry.TimeEntryDto timeEntryTimeEntryDto) { var entry = _context.TimeEntries .Where(c => c.UserId == LoggedInUser.Id) .Include(c => c.Labels) .SingleOrDefault(c => c.Id == timeEntryTimeEntryDto.Id); if (entry == default) { return NotFound(); } var category = _context.TimeCategories .Where(c => c.UserId == LoggedInUser.Id) .SingleOrDefault(c => c.Id == timeEntryTimeEntryDto.Category.Id); if (category == default) { return NotFound(new ErrorResult("Not found", $"Could not find category {timeEntryTimeEntryDto.Category.Name}")); } entry.Start = timeEntryTimeEntryDto.Start.ToUniversalTime(); entry.Stop = timeEntryTimeEntryDto.Stop.ToUniversalTime(); entry.Description = timeEntryTimeEntryDto.Description; entry.Category = category; if (timeEntryTimeEntryDto.Labels?.Count > 0) { var labels = new List(); foreach (var labelDto in timeEntryTimeEntryDto.Labels) { var label = _context.TimeLabels .Where(c => c.UserId == LoggedInUser.Id) .SingleOrDefault(c => c.Id == labelDto.Id); if (label == default) { continue; } labels.Add(label); } entry.Labels = labels; } else { entry.Labels = default; } _context.SaveChanges(); return Ok(entry.AsDto); } }