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);
        }