public async Task ProcessUserJoinMeeting(string meetingId, string userId, string userCalendarToken) { var meeting = _cardinalDataService.GetMeetings().Where(m => m.Id == meetingId).First(); var userEvents = await GetUserEvents(userId, userCalendarToken); var events = _cardinalDataService.GetUserEvents().Where(e => e.meetingId == meetingId); foreach (UserEvent userEvent in events) { await _cardinalDataService.UpsertUserEventAsync(userEvent); } var calendar = new CalendarModel { startDate = meeting.StartFence, endDate = meeting.EndFence, dayStart = meeting.dayStart, dayEnd = meeting.dayEnd, lengthOfMeeting = meeting.Length, events = events.Select(e => UserEventModel.UserEventModelFromUserEvent(e)).ToList() }; calendar.consolidateEvents(); var Gaps = calendar.gaps; DateTime startTime; foreach (TimeSlotModel gap in Gaps) { int numMeetings = Convert.ToInt32(Math.Floor(gap.length.TotalMinutes / meeting.Length.TotalMinutes)); while (numMeetings > 0) { startTime = Gaps[numMeetings - 1].start; await _cardinalDataService.UpsertMeetingTimeAsync(new MeetingTime { Id = Guid.NewGuid().ToString(), MeetingId = meetingId, StartTime = startTime, }); numMeetings--; startTime.Add(meeting.Length); } } _eventManager.OnMeetingTimesUpdated(meetingId); }