public ActionResult PostNewMessage(FormCollection frm) { if (ModelState.IsValid) { var invitees = new List <string>(); if (!string.IsNullOrEmpty(frm["invitees"])) { invitees = frm["invitees"].Split(',').ToList(); } var result = _chat.CreateNewChat(frm["Message"], invitees); } return(RedirectToAction("ShowChat")); }
public async Task <MessageModel> SendMessage(MessageModel message) { var user = await _userManager.FindByNameAsync(Thread.CurrentPrincipal.Identity.Name); if (ReferenceEquals(message.ChatId, null)) { var companion = await _userManager.FindByNameAsync(message.ToChatName); if (!(await _chat.IsChatExist(user, companion, message))) { _chat.CreateNewChat(user, companion, message); } } FileDb fileDb = null; if (!ReferenceEquals(message.File, null)) { fileDb = new FileDb(); fileDb.FilePath = message.File.FileFullName; fileDb.IsImage = message.File.IsImage; fileDb.IsAudio = message.File.IsVoice; fileDb.IsVideo = message.File.IsVideo; _context.Files.Add(fileDb); _context.Entry(fileDb).State = EntityState.Added; } var dbMessage = new Message() { ChatId = message.ChatId, Content = message.Content, UserId = user.Id, File = ReferenceEquals(message.File, null) ? null : fileDb?.Id, Created = DateTime.Now }; _context.Messages.Add(dbMessage); _context.Entry(dbMessage).State = EntityState.Added; await _context.SaveChangesAsync(); message.MessageId = dbMessage.Id; message.DateCreate = dbMessage.Created; var dbCurrentStatusMessage = new MessageStatus() { MessageId = dbMessage.Id, IsRead = true, UserId = user.Id, }; _context.MessagesStatus.Add(dbCurrentStatusMessage); if ((await _context.Chats.FindAsync(message.ChatId)).ChatType == ChatEnum.ChatForTwo) { var chatForTwo = _context.ChatsForTwo.FirstOrDefault(x => String.Equals(x.ChatId, message.ChatId)); var dbCompanionStatusMessage = new MessageStatus() { MessageId = dbMessage.Id, UserId = String.Equals(Thread.CurrentPrincipal.Identity.Name, chatForTwo.FirstUser.UserName) ? chatForTwo.SecondUser.Id : chatForTwo.FirstUser.Id }; _context.MessagesStatus.Add(dbCompanionStatusMessage); message.ToChatName = String.Equals(user.UserName, chatForTwo.FirstUser.UserName) ? chatForTwo.FirstUser.UserName : chatForTwo.SecondUser.UserName; await _hubContext.Clients.User(dbCompanionStatusMessage.UserId).SendAsync("ReceiveMessage", message); message.ToChatName = user.UserName; } else { var chatForGroup = _context.ChatsForGroup.FirstOrDefault(x => String.Equals(x.ChatId, message.ChatId)); var sorted = chatForGroup.GroupsUsers.Where(x => !String.Equals(user.Id, x.UserId)).Select(x => x.UserId); if (!chatForGroup.GroupsUsers.Any(x => String.Equals(user.Id, x.UserId))) { _context.GroupsUsers.Add(new GroupsUsers() { GroupId = chatForGroup.Id, UserId = user.Id }); var newChat = new ChatListModel() { ChatId = chatForGroup.ChatId, ChatName = chatForGroup.Chat.ChatName, ChatEnum = ChatEnum.ChatForGroup }; await _hubContext.Clients.User(user.Id).SendAsync("NewChat", newChat); } foreach (var userId in sorted) { var dbCompanionStatusMessage = new MessageStatus() { MessageId = dbMessage.Id, UserId = userId }; _context.MessagesStatus.Add(dbCompanionStatusMessage); } await _hubContext.Clients.Users(sorted.ToList()).SendAsync("ReceiveMessage", message); } await _context.SaveChangesAsync(); message.IsMyMessage = true; return(message); }