/// <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);
        }
示例#2
0
        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);
        }