public async Task <IActionResult> Details(int messageId, CancellationToken cancellationToken) { var message = await MailAppDbContext.Messages .Include(x => x.MessageAttachments) .Include(x => x.MessagePersons) .ThenInclude(x => x.Account) .Include(x => x.MessagePersons) .ThenInclude(x => x.Type) .SingleOrDefaultAsync(x => x.Id == messageId, cancellationToken); if (message == null) { return(NotFound()); } var currentAccount = await AccountProvider.GetAccountForCurrentUser(cancellationToken); message.MarkAsRead(currentAccount); await MailAppDbContext.SaveChangesAsync(cancellationToken); var viewModel = new MessageViewModel(message, currentAccount); return(PartialView(viewModel)); }
public async Task <IActionResult> Index(MessagesQuery query, CancellationToken cancellationToken) { var senders = await MailAppDbContext.Accounts .ToArrayAsync(cancellationToken); var owner = await AccountProvider.GetAccountForCurrentUser(cancellationToken); var messages = await MailAppDbContext.Messages .Include(x => x.MessagePersons) .ThenInclude(x => x.Account) .ToArrayAsync(cancellationToken); messages = messages .Where(x => query.SenderId == null || x.Sender.Id == query.SenderId) .Where(x => x.MessagePersons.Any(y => y.Type != MessagePersonType.Sender && y.Account == owner)) .ToArray(); if (!String.IsNullOrEmpty(query.Search)) { foreach (var part in query.Search.Split(" ")) { messages = messages.Where(x => (x.Subject + x.Text).Contains(part)).ToArray(); } } messages = query.Sort switch { MessagesQuery.SortingOptions.Subject => messages.OrderBy(x => x.Subject).ToArray(), MessagesQuery.SortingOptions.Date => messages.OrderBy(x => x.SentDate).ToArray(), MessagesQuery.SortingOptions.Nick => messages.OrderBy(x => x.Sender.Nick).ToArray(), _ => messages.OrderBy(x => x.SentDate).ToArray() }; var viewModel = new MessagesListViewModel { SenderId = query.SenderId, Senders = senders .Select(x => new AccountViewModel(x)) .ToArray(), MessageList = new MessageListViewModel { Messages = messages .Select(x => new MessageViewModel(x, owner)) .ToArray(), } }; return(View(viewModel)); }
public async Task <IActionResult> MarkAsUnread(MarkAsUnreadViewModel m, CancellationToken cancellationToken) { var message = await MailAppDbContext.Messages.SingleOrDefaultAsync(x => x.Id == m.MessageId, cancellationToken); if (message == null) { return(BadRequest()); } var currentAccount = await AccountProvider.GetAccountForCurrentUser(cancellationToken); message.MarkAsUnread(currentAccount); await MailAppDbContext.SaveChangesAsync(cancellationToken); return(RedirectToAction(nameof(Index))); }
private async Task ReadLatestReceivers(NewMessageViewModel viewModel, CancellationToken cancellationToken) { var sender = await AccountProvider.GetAccountForCurrentUser(cancellationToken); var lastReceivers = await MailAppDbContext.Messages .Include(x => x.MessagePersons) .ThenInclude(x => x.Account) .Include(x => x.MessagePersons) .ThenInclude(x => x.Type) .Where(x => x.MessagePersons.Any(y => y.Type != MessagePersonType.Sender && y.Account == sender)) .OrderByDescending(x => x.SentDate) .Distinct() .Take(5) .ToArrayAsync(cancellationToken); viewModel.LastReceivers = lastReceivers .SelectMany(x => x.Receivers) .Distinct() .Select(x => new AccountViewModel(x)) .ToArray(); }
public async Task <IActionResult> NewMessage(NewMessageViewModel request, CancellationToken cancellationToken) { await ReadLatestReceivers(request, cancellationToken); if (!ModelState.IsValid) { return(View(request)); } if (string.IsNullOrEmpty(request.Receiver) && string.IsNullOrEmpty(request.Cc) && string.IsNullOrEmpty(request.Bcc)) { ModelState.AddModelError(nameof(request.Receiver), "There is no receiver."); return(View(request)); } if (string.IsNullOrEmpty(request.Subject) && string.IsNullOrEmpty(request.Text)) { ModelState.AddModelError(nameof(request.Subject), "Message should have subject or text"); return(View(request)); } var message = new Message { Subject = request.Subject, Text = request.Text, SentDate = DateTime.Now, Notification = request.Notification, }; var sender = await AccountProvider.GetAccountForCurrentUser(cancellationToken); foreach (var i in request.FileForm ?? new IFormFile[0]) { var fileName = i.FileName; var contentType = i.ContentType; var blobId = Guid.NewGuid().ToString(); message.AddAttachments(new MessageAttachment(blobId, fileName, contentType)); var blobClient = ContainerClient.GetBlobClient(blobId); await blobClient.UploadAsync(i.OpenReadStream(), true, cancellationToken); } if (sender == null) { return(BadRequest()); } message.SetSender(sender); var flag = true; async Task SetPersons(String addresses, Action <Account> f1, Action <Group> f2) { foreach (var address in (addresses ?? String.Empty).Split(";", StringSplitOptions.RemoveEmptyEntries).Select(x => x.Trim()).ToArray()) { var group = await MailAppDbContext.Groups.Include(x => x.GroupAccounts).ThenInclude(x => x.Account).SingleOrDefaultAsync(x => x.Name == address, cancellationToken); if (group != null) { f2(group); } else { var account = await MailAppDbContext.Accounts.SingleOrDefaultAsync(x => x.Email == address, cancellationToken); if (account != null) { f1(account); } else { flag = false; } } } } await SetPersons(request.Receiver, account => message.AddReceiver(account), group => message.AddReceiver(group)); if (flag == false) { ModelState.AddModelError(nameof(request.Receiver), "Invadlid mail or group name"); return(View(request)); } await SetPersons(request.Cc, account => message.AddCc(account), group => message.AddCc(group)); if (flag == false) { ModelState.AddModelError(nameof(request.Cc), "Invadlid mail or group name"); return(View(request)); } await SetPersons(request.Bcc, account => message.AddReceiver(account), group => message.AddBcc(group)); if (flag == false) { ModelState.AddModelError(nameof(request.Bcc), "Invadlid mail or group name"); return(View(request)); } MailAppDbContext.Messages.Add(message); await MailAppDbContext.SaveChangesAsync(cancellationToken); TelemetryClient.TrackEvent("Message sent"); return(RedirectToAction(nameof(Index))); }