/// <summary> /// Check for all events sent and stored in DB and update if the the Start Time is change, /// Update the event in calendar and send a notification email. /// </summary> /// <returns>The created MS Graph event</returns> protected async Task <Event> UpdateEventAndSendEmail(EventModel curEvent, InfernoEventDTO infernoEvent) { var updatedEvent = infernoEvent.ToMSGraphEvent(); Event eventUpdated = null; try { GraphServiceClient graphClient = GetGraphServiceClient(_tenantID, _clientId, _clientSecret); if (graphClient == null) { return(null); } string eventId = curEvent.MSGraphEventId; //Only changes in Start and/or End Times Event eventToUpdate = new Event { Start = updatedEvent.Start, End = updatedEvent.End }; eventUpdated = await graphClient.Users[_defaultOrganizerUserId] .Events[eventId] .Request() .UpdateAsync(eventToUpdate); if (eventUpdated != null) { //Save Event in DB curEvent.StartTZ = eventUpdated.Start.DateTime; curEvent.EndTZ = eventUpdated.End.DateTime; curEvent.TimeZone = eventUpdated.Start.TimeZone; curEvent.Start = eventUpdated.Start.ToDateTime(); curEvent.End = eventUpdated.End.ToDateTime(); curEvent.ModifiedDate = DateTime.UtcNow; await _unitOfWork.EventRepository.UpdateAsync(curEvent); //string recipients = string.Join(";", eventUpdated.Attendees.Select(x => x.EmailAddress.Address).ToList()); //Create and send Email invitation using MSGraph API //await SendEmail(graphClient, _hostEnv, eventUpdated, _defaultOrganizerUserId, recipients, curEvent.OrganizerEmail); } } catch (Exception e) { _logger.LogError(e.ToString()); } return(eventUpdated); }
public async Task <ActionResult <List <EventDTO> > > UpdateEvents() { string infernoAPIUrl = _configuration.GetValue <string>("InfernoAPIUrl"); string infernoAPIKey = _configuration.GetValue <string>("InfernoAPIKey"); List <EventDTO> eventList = new List <EventDTO>(); try { var allEventList = await _unitOfWork.EventRepository.FindAllAsync(); foreach (var curEvent in allEventList) { // Get InfernoEvent info from Inferno WebAPI InfernoEventDTO infernoEvent = await GetInfernoEvent(infernoAPIUrl, infernoAPIKey, curEvent.InfernoEventId); //If start or end times change if (infernoEvent != null && !curEvent.Start.Equals(infernoEvent.startTime.DateTime)) { Event updatedEvent = await UpdateEventAndSendEmail(curEvent, infernoEvent); if (updatedEvent != null) { var eventDto = new EventDTO { Subject = updatedEvent.Subject, Body = updatedEvent.Body.Content, Start = updatedEvent.Start.DateTime, End = updatedEvent.End.DateTime, TimeZone = updatedEvent.Start.TimeZone }; eventList.Add(eventDto); } } } } catch (MsalUiRequiredException ex) { HttpContext.Response.ContentType = "text/plain"; HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized; await HttpContext.Response.WriteAsync("An authentication error occurred while acquiring a token for downstream API\n" + ex.ErrorCode + "\n" + ex.Message); } catch (Exception e) { _logger.LogError(e.ToString()); } return(Ok(eventList)); }
/// <summary> /// Create a MS Graph Event from Inferno Event in the current user's and recipient's calendar /// </summary> /// <param name="graphClient"></param> /// <param name="hostEnv"></param> /// <param name="infernoAPIKey"></param> /// <param name="eventId"></param> /// <param name="recipients"></param> /// <returns>The created MS Graph event</returns> private async Task <Event> CreateEvent( GraphServiceClient graphClient, IWebHostEnvironment hostEnv, string infernoAPIUrl, string infernoAPIKey, string defaultOrganizerUserId, string eventId, string recipients) { Event createdEvent = null; try { //TODO Check if the Event already exists in the DB for the recipients User me = await graphClient.Users[defaultOrganizerUserId].Request().GetAsync(); if (me == null) { throw new Exception("Unable to get the AzureAD User from the 'DefaultOrganizerUserId' declared in App Settings."); } // Get InfernoEvent info from Inferno WebAPI InfernoEventDTO infernoEvent = await GetInfernoEvent(infernoAPIUrl, infernoAPIKey, eventId); if (infernoEvent == null) { throw new Exception("Unable to get the Event from InfernoAPI with 'InfernoAPIKey' declared in App Settings."); } //Construct a MSGraph Event from InfernoEvent string tzName = infernoEvent.startTime.GetTimeZoneStandardName(); Event newEvent = infernoEvent.ToMSGraphEvent(); //Add default user and recipients as attendees to the MSGraph event newEvent = AddAttendees(newEvent, recipients, me); createdEvent = await graphClient.Users[defaultOrganizerUserId] .Events .Request() .Header("Prefer", $"outlook.timezone=\"{tzName}\"") .AddAsync(newEvent); } catch (Exception e) { _logger.LogError(e.ToString()); } return(createdEvent); }