aboutsummaryrefslogtreecommitdiffstats
path: root/code/api/src/Endpoints/V1/Entries/UpdateEntryRoute.cs
blob: 22542144041754c3ec7fe3f0ca36ea04ef6b5c6b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
namespace IOL.GreatOffice.Api.Endpoints.V1.Entries;

public class UpdateEntryRoute : RouteBaseSync.WithRequest<TimeEntry.TimeEntryDto>.WithActionResult<TimeEntry.TimeEntryDto>
{
    private readonly MainAppDatabase _database;

    public UpdateEntryRoute(MainAppDatabase database) {
        _database = database;
    }

    /// <summary>
    /// Update a time entry.
    /// </summary>
    /// <param name="timeEntryTimeEntryDto"></param>
    /// <returns></returns>
    [ApiVersion(ApiSpecV1.VERSION_STRING)]
    [BasicAuthentication(AppConstants.TOKEN_ALLOW_UPDATE)]
    [HttpPost("~/v{version:apiVersion}/entries/update")]
    [ProducesResponseType(404, Type = typeof(KnownProblemModel))]
    [ProducesResponseType(200, Type = typeof(TimeEntry.TimeEntryDto))]
    public override ActionResult<TimeEntry.TimeEntryDto> Handle(TimeEntry.TimeEntryDto timeEntryTimeEntryDto) {
        var entry = _database.TimeEntries
            .Where(c => c.UserId == LoggedInUser.Id)
            .Include(c => c.Labels)
            .SingleOrDefault(c => c.Id == timeEntryTimeEntryDto.Id);

        if (entry == default) {
            return NotFound();
        }

        var category = _database.TimeCategories
            .Where(c => c.UserId == LoggedInUser.Id)
            .SingleOrDefault(c => c.Id == timeEntryTimeEntryDto.Category.Id);
        if (category == default) {
            return NotFound(new KnownProblemModel("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<TimeLabel>();

            foreach (var labelDto in timeEntryTimeEntryDto.Labels) {
                var label = _database.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;
        }

        _database.SaveChanges();
        return Ok(entry.AsDto);
    }
}