-
Notifications
You must be signed in to change notification settings - Fork 0
/
MeetingTimesCalculator.cs
102 lines (89 loc) · 3.71 KB
/
MeetingTimesCalculator.cs
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using cardinal_webservices.Data;
using cardinal_webservices.GoogleCalendar;
using cardinal_webservices.Models;
using cardinal_webservices.DataModels;
using System;
using cardinal_webservices.WebSockets;
namespace cardinal_webservices
{
public class MeetingTimesCalculator
{
private readonly ICardinalDataService _cardinalDataService;
private readonly CardinalEventManager _eventManager;
public MeetingTimesCalculator(ICardinalDataService cardinalDataService, CardinalEventManager eventManager)
{
_cardinalDataService = cardinalDataService;
_eventManager = eventManager;
}
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);
}
private async Task<IEnumerable<UserEventModel>> GetUserEvents(string userId, string userCalendarToken)
{
var googleEvents = await GetAllEvents(userCalendarToken);
return googleEvents.Select(e => EventToUserEvent(e, userId));
}
private UserEventModel EventToUserEvent(Event ev, string userId)
{
return new UserEventModel
{
userId = userId,
name = ev.Id,
timeSlot = new TimeSlotModel
{
start = ev.Start.DateTime,
length = ev.End.DateTime.Subtract(ev.Start.DateTime)
}
};
}
private async Task<IEnumerable<Event>> GetAllEvents(string userCalendarToken)
{
var calendarService = GetCalendarService(userCalendarToken);
var calendars = await calendarService.GetCalendarsAsync();
return await calendarService.GetEventsAsync(calendars.First().Id);
}
private GoogleCalendarService GetCalendarService(string token)
{
return new GoogleCalendarService(token);
}
}
}