Esempio n. 1
0
        /// <summary>
        /// Sends the message to a person via the specified medium type using the system communication.
        /// </summary>
        /// <param name="person">The person.</param>
        /// <param name="mediumType">Type of the medium.</param>
        /// <param name="systemCommunication">The system communication.</param>
        /// <param name="mergeObjects">The merge objects.</param>
        /// <returns></returns>
        internal static SendMessageResult SendMessage(Person person, int mediumType, SystemCommunication systemCommunication, Dictionary <string, object> mergeObjects)
        {
            var results = new SendMessageResult();
            CreateMessageResult createMessageResults;

            switch (mediumType)
            {
            case ( int )CommunicationType.SMS:
                createMessageResults = CreateSmsMessage(person, mergeObjects, systemCommunication);
                break;

            default:
                createMessageResults = CreateEmailMessage(person, mergeObjects, systemCommunication);
                break;
            }

            if (createMessageResults.Message == null)
            {
                results.Warnings.AddRange(createMessageResults.Warnings);
                return(results);
            }

            if (createMessageResults.Message.Send(out var errors))
            {
                results.MessagesSent = 1;
            }
            else
            {
                results.Errors.AddRange(errors);
            }

            return(results);
        }
Esempio n. 2
0
        /// <summary>
        /// Sends the message to a group using the system communication. Each person in the group receives the message in their preferred medium.
        /// A "Recipient" merge object will be added to the merge objects.
        /// </summary>
        /// <param name="groupId">The group identifier.</param>
        /// <param name="systemCommunication">The system communication.</param>
        /// <param name="mergeObjects">The merge objects.</param>
        /// <returns></returns>
        public static SendMessageResult SendMessage(int groupId, SystemCommunication systemCommunication, Dictionary <string, object> mergeObjects)
        {
            var results = new SendMessageResult();

            using (var rockContext = new RockContext())
            {
                // The group members are the message recipients
                var groupMemberViews = new GroupMemberService(rockContext)
                                       .Queryable()
                                       .AsNoTracking()
                                       .Where(m =>
                                              m.GroupId == groupId &&
                                              m.GroupMemberStatus == GroupMemberStatus.Active &&
                                              m.Person != null
                                              )
                                       .Select(m => new
                {
                    Person = m.Person,
                    GroupCommunicationPreference = m.CommunicationPreference
                })
                                       .Distinct()
                                       .ToList();

                // Send the communication to each recipient in the group
                foreach (var groupMemberView in groupMemberViews)
                {
                    var recipient = groupMemberView.Person;
                    mergeObjects["Recipient"] = recipient;

                    var mediumType = Rock.Model.Communication.DetermineMediumEntityTypeId(
                        ( int )CommunicationType.Email,
                        ( int )CommunicationType.SMS,
                        ( int )CommunicationType.PushNotification,
                        groupMemberView.GroupCommunicationPreference,
                        groupMemberView.Person.CommunicationPreference);

                    var result = SendMessage(recipient, mediumType, systemCommunication, mergeObjects);

                    // Add this result to the set of results to return
                    results.Warnings.AddRange(result.Warnings);
                    results.Errors.AddRange(result.Errors);
                    results.MessagesSent += result.MessagesSent;
                }
            }

            return(results);
        }
Esempio n. 3
0
        /// <summary>
        /// Sends the asynchronous.
        /// </summary>
        /// <returns></returns>
        public virtual async Task <SendMessageResult> SendAsync()
        {
            var sendEmailResult = new SendMessageResult();

            try
            {
                if (this.Recipients.Any())
                {
                    var mediumEntity = EntityTypeCache.Get(MediumEntityTypeId);
                    if (mediumEntity != null)
                    {
                        var medium = MediumContainer.GetComponent(mediumEntity.Name);
                        if (medium != null)
                        {
                            var iAsyncMedium = medium as IAsyncMediumComponent;
                            if (iAsyncMedium == null)
                            {
                                medium.Send(this, out var errorMessages);
                                sendEmailResult.Errors.AddRange(errorMessages);
                            }
                            else
                            {
                                sendEmailResult = await iAsyncMedium.SendAsync(this).ConfigureAwait(false);
                            }
                            return(sendEmailResult);
                        }
                    }

                    sendEmailResult.Errors.Add("Could not find valid Medium");
                    return(sendEmailResult);
                }

                return(sendEmailResult);
            }
            catch (Exception ex)
            {
                ExceptionLogService.LogException(ex, HttpContext.Current);
                sendEmailResult.Errors.Add(ex.Message);
                return(sendEmailResult);
            }
        }