private async Task SendOutboxNotification(Entity.UserMessage message) { try { var notification = new UserMessageModel { Id = message.Id, Recipiants = message.Recipients, Subject = message.Subject, Timestamp = message.Timestamp }; await SendNotification(DataNotificationType.OutboxMessage, message.UserId, notification).ConfigureAwait(false); } catch (Exception) { } }
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)); } }