public async Task <ActionResult> CreateMessage(UserMessageCreateModel model)
        {
            if (!ModelState.IsValid)
            {
                return(View("CreateMessageModal", model));
            }

            var result = await UserMessageWriter.CreateMessage(User.Identity.GetUserId(), model);

            if (!ModelState.IsWriterResultValid(result))
            {
                return(View("CreateMessageModal", model));
            }

            return(CloseModal(result));
        }
        public async Task <ActionResult> ReplyMessage(UserMessageCreateModel model)
        {
            if (!ModelState.IsValid)
            {
                return(View("ReplyMessageModal", model));
            }

            var result = await UserMessageWriter.CreateMessage(User.Identity.GetUserId(), model);

            if (!result.Success)
            {
                ModelState.AddModelError("", result.Message);
                return(View("ReplyMessageModal", model));
            }

            return(CloseModal(result));
        }
Example #3
0
        public async Task <IWriterResult> CreateMessage(string userId, UserMessageCreateModel model)
        {
            try
            {
                using (var context = DataContextFactory.CreateContext())
                {
                    var sender = await context.Users.Where(x => x.Id == userId).Select(x => x.UserName).FirstOrDefaultNoLockAsync().ConfigureAwait(false);

                    var usernames  = model.Recipiants.Split(';').Select(x => x.Trim()).ToList();
                    var recipients = await context.Users
                                     .Where(x => usernames.Contains(x.UserName))
                                     .Select(x => x.Id)
                                     .ToListNoLockAsync().ConfigureAwait(false);

                    if (!recipients.Any())
                    {
                        return(new WriterResult(false, "No users found."));
                    }

                    var sanitizedMessage = SanitizeMessage(model.Message);
                    var newMessages      = new List <Entity.UserMessage>();
                    foreach (var recipient in recipients)
                    {
                        var inbox = new Entity.UserMessage
                        {
                            IsInbound    = true,
                            SenderUserId = userId,
                            UserId       = recipient,
                            IsRead       = false,
                            Timestamp    = DateTime.UtcNow,
                            Subject      = model.Subject,
                            Message      = sanitizedMessage
                        };
                        newMessages.Add(inbox);
                    }

                    var outbox = new Entity.UserMessage
                    {
                        IsInbound    = false,
                        SenderUserId = userId,
                        UserId       = userId,
                        IsRead       = true,
                        Recipients   = model.Recipiants,
                        Timestamp    = DateTime.UtcNow,
                        Subject      = model.Subject,
                        Message      = sanitizedMessage
                    };
                    context.Messages.Add(outbox);
                    foreach (var message in newMessages)
                    {
                        context.Messages.Add(message);
                    }
                    await context.SaveChangesAsync().ConfigureAwait(false);
                    await SendOutboxNotification(outbox).ConfigureAwait(false);
                    await SendInboxNotifications(sender, newMessages).ConfigureAwait(false);

                    return(new WriterResult(true, "Message sent successfully."));
                }
            }
            catch (Exception)
            {
                return(new WriterResult(false));
            }
        }