private async Task CalculateTimeTotal(TimeTaskItemApi item, long taskId, DateTime date)
        {
            var firstDayOfMonth     = date.FirstDayOfMonth();
            var firstDayOfNextMonth = date.FirstDayOfNextMonth();
            var firstDayOfWeek      = date.FirstDayOfWeek();
            var firstDayOfNextWeek  = date.FirstDayOfNextWeek();

            item.WeekTotal = await DbContext.TaskItems.Where(ti => ti.UserId == CurrentUserId && ti.TaskId == taskId && ti.Date >= firstDayOfWeek && ti.Date < firstDayOfNextWeek).Select(ti => (int)ti.Time).SumAsync();

            item.MonthTotal = await DbContext.TaskItems.Where(ti => ti.UserId == CurrentUserId && ti.TaskId == taskId && ti.Date >= firstDayOfMonth && ti.Date < firstDayOfNextMonth).Select(ti => (int)ti.Time).SumAsync();
        }
        public async Task <IActionResult> Post([FromBody] TimeTaskItemApi item)
        {
            await CleanWhiteSpace(item);

            if (!ModelState.IsValidUpdated())
            {
                return(new BadRequestObjectResult(ModelState));
            }

            // Only pass Date through
            item.Date = item.Date.Date;

            var taskItem = await DbContext.TaskItems.Where(ti => ti.UserId == CurrentUserId && ti.TaskId == item.TaskId && ti.Date == item.Date).FirstOrDefaultAsync();

            if (taskItem == null)
            {
                if (item.Time > 0)
                {
                    if (!(await DbContext.Tasks.Where(t => t.Group.PartitionId == CurrentPartitionId && t.Id == item.TaskId).AnyAsync()))
                    {
                        throw new NotFoundResultException($"Task (TaskId:{item.TaskId}) not found.");
                    }

                    taskItem = new TtaskItem {
                        UserId = CurrentUserId, TaskId = item.TaskId.Value, Date = item.Date, Time = item.Time
                    };
                    DbContext.TaskItems.Add(taskItem);
                    await DbContext.SaveChangesAsync();
                }
            }
            else
            {
                taskItem.Time = item.Time;
                await DbContext.SaveChangesAsync();
            }

            item.Id = taskItem?.Id;
            await CalculateTimeTotal(item, item.TaskId.Value, item.Date);

            return(Json(item));
        }
        public async Task <IActionResult> Patch(long id, [FromBody] TimeTaskItemApi item)
        {
            var taskItem = await DbContext.TaskItems.Where(w => w.UserId == CurrentUserId && w.Id == id).FirstOrDefaultAsync();

            if (taskItem == null)
            {
                throw new NotFoundResultException($"TaskItem (TaskItemId:{id}) not found.");
            }

            await MapDeltaValuesAndCleanWhiteSpace(item, taskItem, includeForeignId : true);

            if (!ModelState.IsValidUpdated())
            {
                return(new BadRequestObjectResult(ModelState));
            }
            await DbContext.SaveChangesAsync();

            item.Id = id;
            await CalculateTimeTotal(item, taskItem.TaskId, taskItem.Date);

            return(Json(item));
        }