// Check the availability of people/rooms with corresponding emails on condition of startTime and duration. public async Task <List <bool> > CheckAvailableAsync(List <string> users, DateTime startTime, int availabilityViewInterval) { try { List <bool> availability = new List <bool>(); var schedules = users; var intervalStartTime = new DateTimeTimeZone { DateTime = startTime.ToString(), TimeZone = "UTC" }; var intervalEndTime = new DateTimeTimeZone { DateTime = startTime.AddDays(1).ToString(), TimeZone = "UTC" }; ICalendarGetScheduleCollectionPage collectionPage = await _graphClient.Me.Calendar .GetSchedule(schedules, intervalEndTime, intervalStartTime, availabilityViewInterval) .Request() .PostAsync(); // AvailabilityView[0] == '0' means available, while others mean not available. foreach (var page in collectionPage) { // Can't find this room. if (page.AvailabilityView == null) { availability.Add(false); continue; } // AvailabilityViem is empty, should not get into this state. if (page.AvailabilityView.Length == 0) { throw new Exception("There is no elements in AvailabilityView"); } availability.Add(page.AvailabilityView.Length > 0 && page.AvailabilityView[0] == '0'); } return(availability); } catch (ServiceException ex) { throw GraphClient.HandleGraphAPIException(ex); } }
/// <inheritdoc/> internal override async Task <WorkingHours> CallGraphServiceWithResultAsync(IGraphServiceClient client, IReadOnlyDictionary <string, object> parameters, CancellationToken cancellationToken) { var addressProperty = (string)parameters["Address"]; var startProperty = DateTime.UtcNow.Date; var endProperty = startProperty.Date.AddHours(23).AddMinutes(59); ICalendarGetScheduleCollectionPage schedule = await client.Me.Calendar.GetSchedule( Schedules : new[] { addressProperty }, StartTime : DateTimeTimeZone.FromDateTime(startProperty, "UTC"), EndTime : DateTimeTimeZone.FromDateTime(endProperty, "UTC")) .Request() .PostAsync() .ConfigureAwait(false); var workingHours = schedule.First().WorkingHours; return(workingHours); }
public async Task <AvailabilityResult> GetUserAvailabilityAsync(string userEmail, List <string> attendees, DateTime startTime, int availabilityViewInterval) { List <bool> availability = new List <bool>(); attendees.Add(userEmail); var schedules = attendees; var endTime = startTime.AddDays(1); var intervalStartTime = new DateTimeTimeZone { DateTime = startTime.ToString(), TimeZone = "UTC" }; var intervalEndTime = new DateTimeTimeZone { DateTime = endTime.ToString(), TimeZone = "UTC" }; ICalendarGetScheduleCollectionPage collectionPage = await _graphClient.Me.Calendar .GetSchedule(schedules, intervalEndTime, intervalStartTime, availabilityViewInterval) .Request() .PostAsync(); var result = new AvailabilityResult(); // set non-working time as 3 in availability view foreach (var collection in collectionPage) { var availabilityView = collection.AvailabilityView.ToCharArray(); if (collection.WorkingHours != null) { var workingTimeZone = TimeZoneInfo.FindSystemTimeZoneById(collection.WorkingHours.TimeZone.Name); var startTimeInWorkTimeZone = TimeConverter.ConvertUtcToUserTime(startTime, workingTimeZone); var workingStartTimeTimeOfDay = collection.WorkingHours.StartTime; var workingStartTime = new DateTime( startTimeInWorkTimeZone.Year, startTimeInWorkTimeZone.Month, startTimeInWorkTimeZone.Day, workingStartTimeTimeOfDay.Hour, workingStartTimeTimeOfDay.Minute, workingStartTimeTimeOfDay.Second); var workingEndTimeTimeOfDay = collection.WorkingHours.EndTime; var workingEndTime = new DateTime( startTimeInWorkTimeZone.Year, startTimeInWorkTimeZone.Month, startTimeInWorkTimeZone.Day, workingEndTimeTimeOfDay.Hour, workingEndTimeTimeOfDay.Minute, workingEndTimeTimeOfDay.Second); var workDays = collection.WorkingHours.DaysOfWeek.Select(li => (int)li); for (int i = 0; i < availabilityView.Length; i++) { if (availabilityView[i] == '0') { var availabilityViewStartTime = startTime.AddMinutes(i * CalendarCommonUtil.AvailabilityViewInterval); availabilityViewStartTime = TimeConverter.ConvertUtcToUserTime(availabilityViewStartTime, workingTimeZone); if (!workDays.Contains((int)availabilityViewStartTime.DayOfWeek)) { availabilityView[i] = '3'; continue; } var availabilityViewEndTime = availabilityViewStartTime.AddMinutes(CalendarCommonUtil.AvailabilityViewInterval); if (!((availabilityViewStartTime.TimeOfDay >= workingStartTime.TimeOfDay && availabilityViewStartTime.TimeOfDay < workingEndTime.TimeOfDay) || (availabilityViewEndTime.TimeOfDay > workingStartTime.TimeOfDay && availabilityViewEndTime.TimeOfDay <= workingEndTime.TimeOfDay))) { availabilityView[i] = '3'; } } } } result.AvailabilityViewList.Add(new string(availabilityView)); } result.MySchedule.AddRange(collectionPage.Last().ScheduleItems.Select(li => new EventModel(EventSource.Microsoft) { Title = li.Subject, StartTime = DateTime.Parse(li.Start.DateTime + "Z").ToUniversalTime(), EndTime = DateTime.Parse(li.End.DateTime + "Z").ToUniversalTime(), Location = li.Location })); return(result); }