public async Task <IActionResult> New([FromBody] ScheduleViewModel scheduleViewModel) { var currentUserId = GetCurrentUserId(); var timeTable = await dbContext.Timetables .Include(t => t.Location) .Include(t => t.Course) .SingleAsync(t => t.Id == scheduleViewModel.TimetableId); var alreadySubscribedSchedules = await dbContext.Schedules .Include(s => s.Timetable) .Where(s => s.Timetable.Id == scheduleViewModel.TimetableId && s.Date.Date == scheduleViewModel.Date.Date) .CountAsync(); var meta = new Dictionary <string, string> { { "user id", currentUserId.ToString() }, { "timetable id", scheduleViewModel.TimetableId.ToString() }, { "date", scheduleViewModel.Date.ToShortDateString() } }; if (alreadySubscribedSchedules >= timeTable.Course.Capacity) { telemetryClient.TrackTrace("Course has reached it's capacity", SeverityLevel.Warning, meta); return(BadRequest()); } var courseTypeId = timeTable.Course.CourseTypeId; var user = await dbContext.Users .Include(u => u.UserCourseTypes) .Include(u => u.UserSubscriptions) .ThenInclude(us => us.Subscription) .SingleAsync(u => u.Id == currentUserId); if (user.UserCourseTypes.All(uc => uc.CourseTypeId != courseTypeId)) { telemetryClient.TrackTrace("User does not have any subscriptions for this coursetype", SeverityLevel.Warning, meta); return(BadRequest()); } if (await dbContext.Schedules.SingleOrDefaultAsync(s => s.UserId == currentUserId && s.TimetableId == scheduleViewModel.TimetableId && s.Date.Date == scheduleViewModel.Date.Date) != null) { telemetryClient.TrackTrace("User is trying to send a schedule for the second time", SeverityLevel.Warning, meta); return(BadRequest()); } var count = dbContext.Schedules.Count(s => s.UserId == currentUserId && s.Date >= DateTime.Today); var subscription = user.UserSubscriptions.Single(us => us.Subscription.CourseTypeId == courseTypeId); var type = (int)subscription.Subscription.Type; if (type != 0 && count >= type * 4) { meta.Add("schedules count", count.ToString()); telemetryClient.TrackTrace("User has reached it's maximum capacity for the coming 4 weeks", SeverityLevel.Warning, meta); return(BadRequest()); } var newSchedule = scheduleViewModel.ToEntity(currentUserId, timeTable); await dbContext.Schedules.AddAsync(newSchedule); await dbContext.SaveChangesAsync(); return(NoContent()); }