Ejemplo n.º 1
0
        private string GenerateRecurrenceRuleForSMTP(MeetingNotificationItemEntity meetingNotificationItem)
        {
            switch (meetingNotificationItem.RecurrencePattern)
            {
            case MeetingRecurrencePattern.Daily:
                return(this.DailySMTP(meetingNotificationItem));

            case MeetingRecurrencePattern.Weekly:
                return(this.WeeklySMTP(meetingNotificationItem));

            case MeetingRecurrencePattern.Monthly:
                return(this.MonthlySMTP(meetingNotificationItem));

            case MeetingRecurrencePattern.Yearly:
                return(this.YearlySMTP(meetingNotificationItem));

            case MeetingRecurrencePattern.None:
                break;

            default:
                break;
            }

            return(string.Empty);
        }
        /// <inheritdoc/>
        public async Task <IList <MeetingNotificationItemEntity> > DownloadMeetingInvite(IList <MeetingNotificationItemEntity> meetingNotificationItemEntities, string applicationName)
        {
            var traceProps = new Dictionary <string, string>();

            traceProps[AIConstants.Application] = applicationName;
            traceProps[AIConstants.MeetingNotificationCount] = meetingNotificationItemEntities?.Count.ToString(CultureInfo.InvariantCulture);

            this.logger.TraceInformation($"Started {nameof(this.DownloadMeetingInvite)} method of {nameof(MailAttachmentRepository)}.", traceProps);
            IList <MeetingNotificationItemEntity> notificationEntities = new List <MeetingNotificationItemEntity>();

            if (!(meetingNotificationItemEntities is null) && meetingNotificationItemEntities.Count > 0)
            {
                foreach (var item in meetingNotificationItemEntities)
                {
                    MeetingNotificationItemEntity notificationEntity = item;
                    var blobPath      = this.GetBlobPath(applicationName, item.NotificationId, ApplicationConstants.MeetingNotificationsFolderName);
                    var encryptedData = await this.cloudStorageClient.DownloadBlobAsync(blobPath).ConfigureAwait(false);

                    var decryptedData = this.encryptionService.Decrypt(encryptedData);
                    var blobEmailData = JsonConvert.DeserializeObject <BlobEmailData>(decryptedData);
                    notificationEntity.Attachments  = blobEmailData.Attachments;
                    notificationEntity.Body         = blobEmailData.Body;
                    notificationEntity.TemplateData = blobEmailData.TemplateData;
                    notificationEntities.Add(notificationEntity);
                }
            }

            this.logger.TraceInformation($"Finished {nameof(this.DownloadMeetingInvite)} method of {nameof(MailAttachmentRepository)}.", traceProps);
            return(notificationEntities);
        }
Ejemplo n.º 3
0
        /// <inheritdoc/>
        public async Task <MeetingInviteMessage> GetMeetingNotificationMessage(string applicationName, string notificationId)
        {
            var traceprops = new Dictionary <string, string>();

            traceprops[AIConstants.Application]     = applicationName;
            traceprops[AIConstants.NotificationIds] = notificationId;
            this.logger.TraceInformation($"Started {nameof(this.GetNotificationMessage)} method in {nameof(NotificationReportManager)}.", traceprops);
            try
            {
                MeetingNotificationItemEntity notification = await this.emailNotificationRepository.GetMeetingNotificationItemEntity(notificationId, applicationName).ConfigureAwait(false);

                if (notification != null)
                {
                    MessageBody body = await this.GetNotificationMessageBodyAsync(applicationName, notification).ConfigureAwait(false);

                    this.logger.TraceInformation($"Completed {nameof(this.GetNotificationMessage)} method in {nameof(NotificationReportManager)}.", traceprops);
                    return(notification.ToMeetingInviteReportMessage(body));
                }
                else
                {
                    throw new ArgumentNullException(notificationId, "No MeetingInvite entity found for the input notification id: ");
                }
            }
            catch (Exception ex)
            {
                this.logger.WriteException(ex);
                throw;
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Converts <see cref="MeetingNotificationItemCosmosDbEntity"/> to a <see cref="MeetingNotificationItemEntity"/>.
        /// </summary>
        /// <param name="meetingNotificationItemDbEntity"> MeetingNotificationItemCosmosDbEntity. </param>
        /// <returns><see cref="MeetingNotificationItemEntity"/>.</returns>
        public static MeetingNotificationItemEntity ConvertToMeetingNotificationItemEntity(this MeetingNotificationItemCosmosDbEntity meetingNotificationItemDbEntity)
        {
            if (meetingNotificationItemDbEntity is null)
            {
                return(null);
            }

            MeetingNotificationItemEntity meetingNotificationItemEntity = new MeetingNotificationItemEntity();

            meetingNotificationItemEntity.Application       = meetingNotificationItemDbEntity.Application;
            meetingNotificationItemEntity.NotificationId    = meetingNotificationItemDbEntity.NotificationId;
            meetingNotificationItemEntity.RequiredAttendees = meetingNotificationItemDbEntity.RequiredAttendees;
            meetingNotificationItemEntity.OptionalAttendees = meetingNotificationItemDbEntity.OptionalAttendees;
            meetingNotificationItemEntity.Application       = meetingNotificationItemDbEntity.Application;
            meetingNotificationItemEntity.ErrorMessage      = meetingNotificationItemDbEntity.ErrorMessage;
            meetingNotificationItemEntity.DayofMonth        = meetingNotificationItemDbEntity.DayofMonth;
            meetingNotificationItemEntity.DayOfWeekByMonth  = meetingNotificationItemDbEntity.DayOfWeekByMonth;
            meetingNotificationItemEntity.DaysOfWeek        = meetingNotificationItemDbEntity.DaysOfWeek;
            meetingNotificationItemEntity.IsAllDayEvent     = meetingNotificationItemDbEntity.IsAllDayEvent;
            meetingNotificationItemEntity.From                       = meetingNotificationItemDbEntity.From;
            meetingNotificationItemEntity.IsCancel                   = meetingNotificationItemDbEntity.IsCancel;
            meetingNotificationItemEntity.IsOnlineMeeting            = meetingNotificationItemDbEntity.IsOnlineMeeting;
            meetingNotificationItemEntity.NotificationId             = meetingNotificationItemDbEntity.NotificationId;
            meetingNotificationItemEntity.Priority                   = meetingNotificationItemDbEntity.Priority == null ? NotificationPriority.Low : (NotificationPriority)Enum.Parse(typeof(NotificationPriority), meetingNotificationItemDbEntity.Priority);
            meetingNotificationItemEntity.IsPrivate                  = meetingNotificationItemDbEntity.IsPrivate;
            meetingNotificationItemEntity.IsResponseRequested        = meetingNotificationItemDbEntity.IsResponseRequested;
            meetingNotificationItemEntity.Status                     = meetingNotificationItemDbEntity.Status == null ? NotificationItemStatus.Queued : (NotificationItemStatus)Enum.Parse(typeof(NotificationItemStatus), meetingNotificationItemDbEntity.Status);
            meetingNotificationItemEntity.Subject                    = meetingNotificationItemDbEntity.Subject;
            meetingNotificationItemEntity.Location                   = meetingNotificationItemDbEntity.Location;
            meetingNotificationItemEntity.Timestamp                  = meetingNotificationItemDbEntity.Timestamp;
            meetingNotificationItemEntity.MonthOfYear                = meetingNotificationItemDbEntity.MonthOfYear;
            meetingNotificationItemEntity.TrackingId                 = meetingNotificationItemDbEntity.TrackingId;
            meetingNotificationItemEntity.TryCount                   = meetingNotificationItemDbEntity.TryCount;
            meetingNotificationItemEntity.ETag                       = meetingNotificationItemDbEntity.ETag;
            meetingNotificationItemEntity.OccurrenceId               = meetingNotificationItemDbEntity.OccurrenceId;
            meetingNotificationItemEntity.Ocurrences                 = meetingNotificationItemDbEntity.Ocurrences;
            meetingNotificationItemEntity.RecurrencePattern          = meetingNotificationItemDbEntity.RecurrencePattern == null ? MeetingRecurrencePattern.None : (MeetingRecurrencePattern)Enum.Parse(typeof(MeetingRecurrencePattern), meetingNotificationItemDbEntity.RecurrencePattern);
            meetingNotificationItemEntity.ReminderMinutesBeforeStart = meetingNotificationItemDbEntity.ReminderMinutesBeforeStart;
            meetingNotificationItemEntity.TemplateId                 = meetingNotificationItemDbEntity.TemplateId;
            meetingNotificationItemEntity.End                 = meetingNotificationItemDbEntity.End;
            meetingNotificationItemEntity.Start               = meetingNotificationItemDbEntity.Start;
            meetingNotificationItemEntity.EndDate             = meetingNotificationItemDbEntity.EndDate;
            meetingNotificationItemEntity.SequenceNumber      = meetingNotificationItemDbEntity.SequenceNumber;
            meetingNotificationItemEntity.SendOnUtcDate       = meetingNotificationItemDbEntity.SendOnUtcDate;
            meetingNotificationItemEntity.TrackingId          = meetingNotificationItemDbEntity.TrackingId;
            meetingNotificationItemEntity.TryCount            = meetingNotificationItemDbEntity.TryCount;
            meetingNotificationItemEntity.Timestamp           = meetingNotificationItemDbEntity.Timestamp;
            meetingNotificationItemEntity.RowKey              = meetingNotificationItemDbEntity.NotificationId;
            meetingNotificationItemEntity.PartitionKey        = meetingNotificationItemDbEntity.Application;
            meetingNotificationItemEntity.Interval            = meetingNotificationItemDbEntity.Interval;
            meetingNotificationItemEntity.ICalUid             = meetingNotificationItemDbEntity.ICalUid;
            meetingNotificationItemEntity.ShowAs              = meetingNotificationItemDbEntity.ShowAs;
            meetingNotificationItemEntity.AttachmentReference = meetingNotificationItemDbEntity.AttachmentReference;
            meetingNotificationItemEntity.EventId             = meetingNotificationItemDbEntity.EventId;
            meetingNotificationItemEntity.EmailAccountUsed    = meetingNotificationItemDbEntity.EmailAccountUsed;
            meetingNotificationItemEntity.Action              = meetingNotificationItemDbEntity.Action;
            meetingNotificationItemEntity.Id = meetingNotificationItemDbEntity.Id;
            return(meetingNotificationItemEntity);
        }
Ejemplo n.º 5
0
        private string WeeklySMTP(MeetingNotificationItemEntity meetingNotificationItem)
        {
            if (meetingNotificationItem.EndDate.HasValue)
            {
                return(string.Format(CultureInfo.InvariantCulture, "RRULE:FREQ=WEEKLY;BYDAY={0};INTERVAL={1};UNTIL={2}", DaysOfWeekToShortNames(GetDaysOfWeek(meetingNotificationItem.DaysOfWeek)), meetingNotificationItem.Interval, meetingNotificationItem.EndDate.Value.ToString(this.strTimeFormat, CultureInfo.InvariantCulture)));
            }

            return(string.Format(CultureInfo.InvariantCulture, "RRULE:FREQ=WEEKLY;BYDAY={0};INTERVAL={1};COUNT={2}", DaysOfWeekToShortNames(GetDaysOfWeek(meetingNotificationItem.DaysOfWeek)), meetingNotificationItem.Interval, meetingNotificationItem.Ocurrences.HasValue ? meetingNotificationItem.Ocurrences.Value : 1)); // Default to 1 Occurrence
        }
Ejemplo n.º 6
0
        private string DailySMTP(MeetingNotificationItemEntity meetingNotificationItem)
        {
            if (meetingNotificationItem.EndDate.HasValue)
            {
                return(string.Format(CultureInfo.InvariantCulture, "RRULE:FREQ=DAILY;INTERVAL={0};UNTIL={1}", meetingNotificationItem.Interval, meetingNotificationItem.EndDate.Value.ToString(this.strTimeFormat, CultureInfo.InvariantCulture)));
            }

            return(string.Format(CultureInfo.InvariantCulture, "RRULE:FREQ=DAILY;INTERVAL={0};COUNT={1}", meetingNotificationItem.Interval, meetingNotificationItem.Ocurrences.HasValue ? meetingNotificationItem.Ocurrences.Value : 1)); // Default to 1 Occurrence
        }
Ejemplo n.º 7
0
 /// <summary>
 /// Converts <see cref="EmailNotificationItemEntity"/> to a <see cref="EmailMessage"/>.
 /// </summary>
 /// <param name="meetingNotificationItemEntity">Email Notification Item Entity.</param>
 /// <param name="body">Message Bosy.</param>
 /// <returns><see cref="EmailMessage"/>.</returns>
 public static MeetingInviteMessage ToMeetingInviteReportMessage(this MeetingNotificationItemEntity meetingNotificationItemEntity, MessageBody body)
 {
     return(meetingNotificationItemEntity != null ?
            new MeetingInviteMessage()
     {
         Subject = meetingNotificationItemEntity.Subject,
         Body = body?.Content,
         RequiredAttendees = meetingNotificationItemEntity.RequiredAttendees,
         Application = meetingNotificationItemEntity.Application,
         From = meetingNotificationItemEntity.From,
         NotificationId = meetingNotificationItemEntity.NotificationId,
         OptionalAttendees = meetingNotificationItemEntity.OptionalAttendees,
         Attachments = meetingNotificationItemEntity.Attachments?.Select(attachment => new FileAttachment
         {
             Name = attachment.FileName, ContentBytes = attachment.FileBase64, IsInline = attachment.IsInline
         }).ToList(),
     }
         : null);
 }
 /// <summary>
 /// Converts <see cref="MeetingNotificationItemEntity"/> to a <see cref="MeetingInviteReportResponse"/>.
 /// </summary>
 /// <param name="meetingNotificationItemEntity"> meetingNotificationItemEntity. </param>
 /// <returns><see cref="MeetingInviteReportResponse"/>.</returns>
 public static MeetingInviteReportResponse ToMeetingInviteReportResponse(MeetingNotificationItemEntity meetingNotificationItemEntity)
 {
     return(new MeetingInviteReportResponse()
     {
         NotificationId = meetingNotificationItemEntity?.NotificationId,
         Application = meetingNotificationItemEntity?.Application,
         EmailAccountUsed = meetingNotificationItemEntity?.EmailAccountUsed,
         TrackingId = meetingNotificationItemEntity?.TrackingId,
         Status = meetingNotificationItemEntity?.Status.ToString(),
         Priority = meetingNotificationItemEntity?.Priority.ToString(),
         TryCount = meetingNotificationItemEntity?.TryCount ?? 0,
         ErrorMessage = meetingNotificationItemEntity?.ErrorMessage,
         CreatedDateTime = meetingNotificationItemEntity?.CreatedDateTime ?? DateTime.MinValue,
         UpdatedDateTime = meetingNotificationItemEntity?.UpdatedDateTime ?? DateTime.MinValue,
         SendOnUtcDate = meetingNotificationItemEntity?.SendOnUtcDate ?? DateTime.MinValue,
         RequiredAttendees = meetingNotificationItemEntity?.RequiredAttendees,
         From = meetingNotificationItemEntity?.From,
         OptionalAttendees = meetingNotificationItemEntity?.OptionalAttendees,
         Subject = meetingNotificationItemEntity?.Subject,
     });
 }
Ejemplo n.º 9
0
        private string YearlySMTP(MeetingNotificationItemEntity meetingNotificationItem)
        {
            StringBuilder sb = new StringBuilder();

            if (string.IsNullOrEmpty(meetingNotificationItem.DaysOfWeek))
            {
                _ = sb.Append(string.Format(CultureInfo.InvariantCulture, "RRULE:FREQ=YEARLY;BYMONTH={0};BYMONTHDAY={1}", meetingNotificationItem.MonthOfYear, meetingNotificationItem.DayofMonth.HasValue ? meetingNotificationItem.DayofMonth.Value : meetingNotificationItem.Start.Day));
            }
            else
            {
                _ = sb.Append(string.Format(CultureInfo.InvariantCulture, "RRULE:FREQ=YEARLY;BYDAY={0};BYSETPOS={1};BYMONTH={2}", DaysOfWeekToShortNames(GetDaysOfWeek(meetingNotificationItem.DaysOfWeek)), GetDayOfWeekIndexSMTP(meetingNotificationItem.DayOfWeekByMonth), meetingNotificationItem.MonthOfYear));
            }

            if (meetingNotificationItem.EndDate.HasValue)
            {
                _ = sb.Append(string.Format(CultureInfo.InvariantCulture, ";UNTIL={0}", meetingNotificationItem.EndDate.Value.ToString(this.strTimeFormat, CultureInfo.InvariantCulture)));
            }
            else
            {
                _ = sb.Append(string.Format(CultureInfo.InvariantCulture, ";COUNT={0}", meetingNotificationItem.Ocurrences.HasValue ? meetingNotificationItem.Ocurrences.Value : 1)); // Default to 1 Occurrence
            }

            return(sb.ToString());
        }
Ejemplo n.º 10
0
        private string MonthlySMTP(MeetingNotificationItemEntity meetingNotificationItem)
        {
            StringBuilder sb = new StringBuilder();

            if (string.IsNullOrEmpty(meetingNotificationItem.DaysOfWeek))
            {
                _ = sb.Append(string.Format(CultureInfo.InvariantCulture, "RRULE:FREQ=MONTHLY;BYMONTHDAY={0};INTERVAL={1}", meetingNotificationItem.DayofMonth.HasValue ? meetingNotificationItem.DayofMonth.Value : meetingNotificationItem.Start.Day, meetingNotificationItem.Interval)); // If the Day of Month was not specified, use the day of the Start Date.
            }
            else
            {
                _ = sb.Append(string.Format(CultureInfo.InvariantCulture, "RRULE:FREQ=MONTHLY;BYSETPOS={0};BYDAY={1};INTERVAL={2}", GetDayOfWeekIndexSMTP(meetingNotificationItem.DayOfWeekByMonth), DaysOfWeekToShortNames(GetDaysOfWeek(meetingNotificationItem.DaysOfWeek)), meetingNotificationItem.Interval));
            }

            if (meetingNotificationItem.EndDate.HasValue)
            {
                _ = sb.Append(string.Format(CultureInfo.InvariantCulture, ";UNTIL={0}", meetingNotificationItem.EndDate.Value.ToString(this.strTimeFormat, CultureInfo.InvariantCulture)));
            }
            else
            {
                _ = sb.Append(string.Format(CultureInfo.InvariantCulture, ";COUNT={0}", meetingNotificationItem.Ocurrences.HasValue ? meetingNotificationItem.Ocurrences.Value : 1)); // Default to 1 Occurrence
            }

            return(sb.ToString());
        }
Ejemplo n.º 11
0
        /// <summary>
        /// Converts the meeting invite to body.
        /// </summary>
        /// <param name="meetingNotificationItem">The meeting notification item.</param>
        /// <param name="meetingBody">meetingBody.</param>
        /// <returns>A string for meeting invite.</returns>
        private string ConvertMeetingInviteToBody(MeetingNotificationItemEntity meetingNotificationItem, string meetingBody)
        {
            StringBuilder str = new StringBuilder();

#pragma warning disable IDE0058 // Expression value is never used
            str.AppendLine("BEGIN:VCALENDAR");

            str.AppendLine("PRODID:-//Microsoft Corporation//Outlook 14.0 MIMEDIR//EN");
            str.AppendLine("VERSION:2.0");

            // if (meetingNotificationItem.IsCancel)
            // {
            //    str.AppendLine("METHOD:CANCEL");
            //    str.AppendLine("STATUS:CANCELLED");
            // }
            // else
            // {
            str.AppendLine("METHOD:REQUEST");
            str.AppendLine("X-MS-OLK-FORCEINSPECTOROPEN:TRUE");
            str.AppendLine("BEGIN:VEVENT");
            str.AppendLine("DTSTART:" + meetingNotificationItem.Start.ToString(this.strTimeFormat, CultureInfo.InvariantCulture));
            str.AppendLine("DTEND:" + meetingNotificationItem.End.ToString(this.strTimeFormat, CultureInfo.InvariantCulture));

            // if (meetingNotificationItem.OccurenceId.HasValue) str.AppendLine("RECURRENCE-ID:" + invitation.OccurenceId.Value.ToString(c_strTimeFormat));
            str.AppendLine(this.GenerateRecurrenceRuleForSMTP(meetingNotificationItem));
            str.AppendLine(string.Format(CultureInfo.InvariantCulture, "UID:{0}", "icauid")); // currently harcoded as meeting invite is not being sent properly, if UID is null/empty
            str.AppendLine(string.Format(CultureInfo.InvariantCulture, "DESCRIPTION:{0}", meetingBody));
            str.AppendLine(string.Format(CultureInfo.InvariantCulture, "X-ALT-DESC;FMTTYPE=text/html:{0}", meetingBody));
            str.AppendLine(string.Format(CultureInfo.InvariantCulture, "SUMMARY:{0}", meetingNotificationItem.Subject));
            str.AppendLine(string.Format(CultureInfo.InvariantCulture, "LOCATION:{0}", meetingNotificationItem.Location));
            str.AppendLine(string.Format(CultureInfo.InvariantCulture, "ORGANIZER:MAILTO:{0}", meetingNotificationItem.From));

            if (meetingNotificationItem.SequenceNumber.HasValue)
            {
                str.AppendLine(string.Format(CultureInfo.InvariantCulture, "SEQUENCE:{0}", meetingNotificationItem.SequenceNumber.Value));
            }

            if (meetingNotificationItem.IsPrivate)
            {
                str.AppendLine("CLASS:PRIVATE");
            }

            foreach (var to in meetingNotificationItem.RequiredAttendees?.Split(Common.Constants.SplitCharacter, System.StringSplitOptions.RemoveEmptyEntries))
            {
                str.AppendLine(string.Format(CultureInfo.InvariantCulture, "ATTENDEE;PARTSTAT=NEEDS-ACTION;ROLE=REQ-PARTICIPANT;CN=\"{0}\";RSVP=FALSE:mailto:{0}", to));
            }

            if (!string.IsNullOrEmpty(meetingNotificationItem.OptionalAttendees))
            {
                foreach (var cc in meetingNotificationItem.OptionalAttendees?.Split(Common.Constants.SplitCharacter, System.StringSplitOptions.RemoveEmptyEntries))
                {
                    str.AppendLine(string.Format(CultureInfo.InvariantCulture, "ATTENDEE;PARTSTAT=NEEDS-ACTION;ROLE=OPT-PARTICIPANT;CN=\"{0}\";RSVP=FALSE:mailto:{0}", cc));
                }
            }

            str.AppendLine("BEGIN:VALARM");
            if (!string.IsNullOrEmpty(meetingNotificationItem.ReminderMinutesBeforeStart))
            {
                str.AppendLine(string.Format(CultureInfo.InvariantCulture, "TRIGGER:-P{0}M", meetingNotificationItem.ReminderMinutesBeforeStart));
            }

            str.AppendLine("ACTION:DISPLAY");
            str.AppendLine("DESCRIPTION:Reminder");
            str.AppendLine("END:VALARM");
            str.AppendLine("END:VEVENT");
            str.AppendLine("END:VCALENDAR");

#pragma warning restore IDE0058 // Expression value is never used
            return(str.ToString());
        }
        /// <summary>
        /// create Payload for Meeting Invite to be set to Graph API.
        /// </summary>
        /// <param name="meetingNotificationEntity"> MeetingNotification Entity Object.</param>
        /// <param name="applicationName">Application Name for the Meeting Invite.</param>
        /// <returns>A <see cref="Task"/> representing the result of the asynchronous operation.</returns>
        private async Task <InvitePayload> CreateInvitePayload(MeetingNotificationItemEntity meetingNotificationEntity, string applicationName)
        {
            if (meetingNotificationEntity == null)
            {
                return(null);
            }

            var payload = new InvitePayload();

            var requiredAttendees = meetingNotificationEntity.RequiredAttendees.Split(Common.ApplicationConstants.SplitCharacter, System.StringSplitOptions.RemoveEmptyEntries).Select(e => new Attendee()
            {
                EmailAddress = new EmailAddress()
                {
                    Address = e,
                },
                Type = AttendeeType.Required,
            });
            var optionalAttendees = meetingNotificationEntity.OptionalAttendees?.Split(Common.ApplicationConstants.SplitCharacter, System.StringSplitOptions.RemoveEmptyEntries).Select(e => new Attendee()
            {
                EmailAddress = new EmailAddress()
                {
                    Address = e,
                },
                Type = AttendeeType.Optional,
            });

            payload.Attendees = (optionalAttendees != null ? requiredAttendees.Union(optionalAttendees) : requiredAttendees).ToList();
            payload.Body      = await this.emailManager.GetMeetingInviteBodyAsync(applicationName, meetingNotificationEntity).ConfigureAwait(false);

            payload.End = new InviteDateTime()
            {
                DateTime = meetingNotificationEntity.End.FormatDate(ApplicationConstants.GraphMeetingInviteDateTimeFormatter),
            };
            payload.Importance      = (ImportanceType)Enum.Parse(typeof(ImportanceType), meetingNotificationEntity.Priority.ToString());
            payload.IsCancelled     = meetingNotificationEntity.IsCancel;
            payload.IsOnlineMeeting = meetingNotificationEntity.IsOnlineMeeting;
            payload.IsAllDay        = meetingNotificationEntity.IsAllDayEvent;
            payload.Location        = new Location()
            {
                DisplayName = meetingNotificationEntity.Location,
            };
            payload.Organizer = new Organizer()
            {
                EmailAddress = new EmailAddress()
                {
                    Address = meetingNotificationEntity.From,
                },
            };

            if (meetingNotificationEntity.RecurrencePattern != MeetingRecurrencePattern.None)
            {
                var recurrencePattern = new RecurrencePattern()
                {
                    Type       = (RecurrencePatternType)Enum.Parse(typeof(RecurrencePatternType), meetingNotificationEntity.RecurrencePattern.ToString()),
                    Interval   = meetingNotificationEntity.Interval,
                    DaysOfWeek = meetingNotificationEntity.DaysOfWeek.GetListFromString <Contracts.Models.Graph.Invite.DayOfTheWeek>(','),
                    DayOfMonth = meetingNotificationEntity.DayofMonth,
                    Month      = meetingNotificationEntity.MonthOfYear,
                };
                var recurrenceRangeType = meetingNotificationEntity.EndDate.HasValue ? RecurrenceRangeType.EndDate : meetingNotificationEntity.Ocurrences.HasValue ? RecurrenceRangeType.Numbered : RecurrenceRangeType.NoEnd;
                var recurrenceRange     = new RecurrenceRange()
                {
                    NumberOfOccurences = meetingNotificationEntity.Ocurrences,
                    EndDate            = meetingNotificationEntity.EndDate.HasValue ? meetingNotificationEntity.EndDate?.FormatDate(ApplicationConstants.GraphMeetingInviteRecurrenceRangeDateFormatter) : null,
                    StartDate          = meetingNotificationEntity.Start.FormatDate(ApplicationConstants.GraphMeetingInviteRecurrenceRangeDateFormatter),
                    Type = recurrenceRangeType,
                };
                payload.Recurrence = new Recurrence()
                {
                    Pattern = recurrencePattern,
                    Range   = recurrenceRange,
                };
            }

            payload.ReminderMinutesBeforeStart = Convert.ToInt32(meetingNotificationEntity.ReminderMinutesBeforeStart, CultureInfo.InvariantCulture);
            payload.Start = new InviteDateTime()
            {
                DateTime = meetingNotificationEntity.Start.FormatDate(ApplicationConstants.GraphMeetingInviteDateTimeFormatter),
            };

            payload.Subject        = meetingNotificationEntity.Subject;
            payload.TransactionId  = meetingNotificationEntity.NotificationId;
            payload.HasAttachments = meetingNotificationEntity.Attachments != null && meetingNotificationEntity.Attachments.Any() ? true : false;
            payload.ICallUid       = meetingNotificationEntity.ICalUid;
            payload.ShowAs         = meetingNotificationEntity.ShowAs ?? ApplicationConstants.DefaultInviteStatus;
            return(payload);
        }
        /// <summary>
        /// Validates for all attachments sent.
        /// </summary>
        /// <param name="res">HttpResponse object after send attachment request using httpclient.</param>
        /// <param name="item">Meeting Notification Item object.</param>
        /// <returns>a boolean value for success/failure.</returns>
        private static bool IsAllAttachmentsSent(IDictionary <string, ResponseData <string> > res, MeetingNotificationItemEntity item)
        {
            if (res == null)
            {
                return(false);
            }

            var successResponse = res.Values.Where(a => a.Status == true);

            return(successResponse.Count() == item.Attachments.Count());
        }
        /// <summary>
        /// Converts <see cref="MeetingNotificationItemEntity"/> to a <see cref="MeetingNotificationItemTableEntity"/>.
        /// </summary>
        /// <param name="meetingNotificationItemEntity"> meetingNotificationItemEntity. </param>
        /// <returns><see cref="MeetingNotificationItemTableEntity"/>.</returns>
        public static MeetingNotificationItemTableEntity ConvertToMeetingNotificationItemTableEntity(this MeetingNotificationItemEntity meetingNotificationItemEntity)
        {
            if (meetingNotificationItemEntity is null)
            {
                return(null);
            }

            MeetingNotificationItemTableEntity meetingNotificationItemTableEntity = new MeetingNotificationItemTableEntity();

            meetingNotificationItemTableEntity.PartitionKey      = meetingNotificationItemEntity.Application;
            meetingNotificationItemTableEntity.RowKey            = meetingNotificationItemEntity.NotificationId;
            meetingNotificationItemTableEntity.Application       = meetingNotificationItemEntity.Application;
            meetingNotificationItemTableEntity.RequiredAttendees = meetingNotificationItemEntity.RequiredAttendees;
            meetingNotificationItemTableEntity.OptionalAttendees = meetingNotificationItemEntity.OptionalAttendees;
            meetingNotificationItemTableEntity.Application       = meetingNotificationItemEntity.Application;
            meetingNotificationItemTableEntity.ErrorMessage      = meetingNotificationItemEntity.ErrorMessage;
            meetingNotificationItemTableEntity.DayofMonth        = meetingNotificationItemEntity.DayofMonth ?? default;
            meetingNotificationItemTableEntity.DayOfWeekByMonth  = meetingNotificationItemEntity.DayOfWeekByMonth;
            meetingNotificationItemTableEntity.DaysOfWeek        = meetingNotificationItemEntity.DaysOfWeek;
            meetingNotificationItemTableEntity.EndDate           = meetingNotificationItemEntity.EndDate;
            meetingNotificationItemTableEntity.IsAllDayEvent     = meetingNotificationItemEntity.IsAllDayEvent;
            meetingNotificationItemTableEntity.From                       = meetingNotificationItemEntity.From;
            meetingNotificationItemTableEntity.IsCancel                   = meetingNotificationItemEntity.IsCancel;
            meetingNotificationItemTableEntity.IsOnlineMeeting            = meetingNotificationItemEntity.IsOnlineMeeting;
            meetingNotificationItemTableEntity.NotificationId             = meetingNotificationItemEntity.NotificationId;
            meetingNotificationItemTableEntity.Priority                   = meetingNotificationItemEntity.Priority.ToString();
            meetingNotificationItemTableEntity.IsPrivate                  = meetingNotificationItemEntity.IsPrivate;
            meetingNotificationItemTableEntity.IsResponseRequested        = meetingNotificationItemEntity.IsResponseRequested;
            meetingNotificationItemTableEntity.Status                     = meetingNotificationItemEntity.Status.ToString();
            meetingNotificationItemTableEntity.Subject                    = meetingNotificationItemEntity.Subject;
            meetingNotificationItemTableEntity.Location                   = meetingNotificationItemEntity.Location;
            meetingNotificationItemTableEntity.Timestamp                  = meetingNotificationItemEntity.Timestamp;
            meetingNotificationItemTableEntity.MonthOfYear                = meetingNotificationItemEntity.MonthOfYear;
            meetingNotificationItemTableEntity.TrackingId                 = meetingNotificationItemEntity.TrackingId;
            meetingNotificationItemTableEntity.TryCount                   = meetingNotificationItemEntity.TryCount;
            meetingNotificationItemTableEntity.ETag                       = meetingNotificationItemEntity.ETag;
            meetingNotificationItemTableEntity.OccurrenceId               = meetingNotificationItemEntity.OccurrenceId;
            meetingNotificationItemTableEntity.Ocurrences                 = meetingNotificationItemEntity.Ocurrences ?? default;
            meetingNotificationItemTableEntity.RecurrencePattern          = meetingNotificationItemEntity.RecurrencePattern.ToString();
            meetingNotificationItemTableEntity.ReminderMinutesBeforeStart = meetingNotificationItemEntity.ReminderMinutesBeforeStart;
            meetingNotificationItemTableEntity.TemplateId                 = meetingNotificationItemEntity.TemplateId;
            meetingNotificationItemTableEntity.End                 = meetingNotificationItemEntity.End;
            meetingNotificationItemTableEntity.Start               = meetingNotificationItemEntity.Start;
            meetingNotificationItemTableEntity.SequenceNumber      = meetingNotificationItemEntity.SequenceNumber ?? default;
            meetingNotificationItemTableEntity.SendOnUtcDate       = meetingNotificationItemEntity.SendOnUtcDate;
            meetingNotificationItemTableEntity.TrackingId          = meetingNotificationItemEntity.TrackingId;
            meetingNotificationItemTableEntity.TryCount            = meetingNotificationItemEntity.TryCount;
            meetingNotificationItemTableEntity.Timestamp           = meetingNotificationItemEntity.Timestamp;
            meetingNotificationItemTableEntity.RowKey              = meetingNotificationItemEntity.NotificationId;
            meetingNotificationItemTableEntity.PartitionKey        = meetingNotificationItemEntity.Application;
            meetingNotificationItemTableEntity.Interval            = meetingNotificationItemEntity.Interval;
            meetingNotificationItemTableEntity.ICalUid             = meetingNotificationItemEntity.ICalUid;
            meetingNotificationItemTableEntity.AttachmentReference = meetingNotificationItemEntity.AttachmentReference;
            meetingNotificationItemTableEntity.EmailAccountUsed    = meetingNotificationItemEntity.EmailAccountUsed;
            meetingNotificationItemTableEntity.EventId             = meetingNotificationItemEntity.EventId;
            return(meetingNotificationItemTableEntity);
        }
        /// <summary>
        /// Gets the notification message body asynchronous.
        /// </summary>
        /// <param name="applicationName">Name of the application.</param>
        /// <param name="notification">The notification.</param>
        /// <returns>A <see cref="Task{TResult}" /> representing the result of the asynchronous operation.</returns>
        /// <exception cref="ArgumentNullException">
        /// applicationName - applicationName cannot be null or empty.
        /// or
        /// notification - notification cannot be null.
        /// </exception>
        /// <exception cref="ArgumentException">
        /// TemplateData cannot be null or empty.
        /// or
        /// Template cannot be found, please provide a valid template and application name.
        /// </exception>
        public async Task <MessageBody> GetNotificationMessageBodyAsync(string applicationName, MeetingNotificationItemEntity notification)
        {
            this.logger.TraceInformation($"Started {nameof(this.GetNotificationMessageBodyAsync)} method of {nameof(EmailManager)}.");
            string notificationBody = null;

            try
            {
                if (string.IsNullOrEmpty(applicationName))
                {
                    throw new ArgumentNullException(nameof(applicationName), "applicationName cannot be null or empty.");
                }

                if (notification is null)
                {
                    throw new ArgumentNullException(nameof(notification), "notification cannot be null.");
                }

                if (string.IsNullOrEmpty(notification.Body) && !string.IsNullOrEmpty(notification.TemplateId))
                {
                    if (string.IsNullOrEmpty(notification.TemplateData))
                    {
                        throw new ArgumentException("TemplateData cannot be null or empty.");
                    }

                    MailTemplate template = await this.templateManager.GetMailTemplate(applicationName, notification.TemplateId).ConfigureAwait(false);

                    if (template == null)
                    {
                        throw new ArgumentException("Template cannot be found, please provide a valid template and application name");
                    }

                    notificationBody = this.templateMerge.CreateMailBodyUsingTemplate(template.TemplateType, template.Content, notification.TemplateData);
                }
                else
                {
                    if (!string.IsNullOrEmpty(notification.Body))
                    {
                        notificationBody = notification.Body;
                    }
                }
            }
            catch (Exception ex)
            {
                this.logger.WriteException(ex);
                throw;
            }

            MessageBody messageBody = new MessageBody {
                Content = notificationBody, ContentType = Common.Constants.EmailBodyContentType
            };

            this.logger.TraceInformation($"Finished {nameof(this.GetNotificationMessageBodyAsync)} method of {nameof(EmailManager)}.");
            return(messageBody);
        }