public async Task PostChatMessage(string receiverId, ChatMessageNewDto chatMessageNew) { await ValidateMessagePosting(receiverId, chatMessageNew); var senderId = _currentUserService.GetUserId(); var chatMessage = new ChatMessage { ReceiverId = receiverId, SenderId = senderId, Timestamp = _timeService.GetCurrentTime(), Content = chatMessageNew.Content, ModuleId = chatMessageNew.ModuleId }; await _chatMessagesRepository.Create(chatMessage); var sender = await _userManager.FindByIdAsync(senderId); var chatMessageDto = new ChatMessageDto { SenderId = chatMessage.SenderId, Timestamp = chatMessage.Timestamp, SenderName = $"{sender.FirstName} {sender.LastName}", Content = chatMessage.Content }; await _hubsService.SendChatNotificationToUser(senderId, chatMessageDto); await _hubsService.SendChatNotificationToUser(receiverId, chatMessageDto); }
public async Task <IActionResult> PostMessage(string userId, [FromBody] ChatMessageNewDto chatMessageNew) { try { await _chatsService.PostChatMessage(userId, chatMessageNew); return(Ok()); } catch (InvalidOperationException ex) { return(BadRequest(ex.Message)); } }
public async Task When_PostingChatMessageAsStudent_Expect_MessagePosted() { var receiver = await _userManager.FindByEmailAsync("*****@*****.**"); var sender = await _userManager.FindByEmailAsync("*****@*****.**"); var chatMessageNewDto = new ChatMessageNewDto { Content = "Testing...", ModuleId = 1 }; await _chatsService.PostChatMessage(receiver.Id, chatMessageNewDto); var chatMessagePosted = await _context.ChatMessages.FirstAsync(cm => cm.Content == "Testing..."); Assert.Equal(sender.Id, chatMessagePosted.SenderId); Assert.Equal(receiver.Id, chatMessagePosted.ReceiverId); }
public async Task When_PostingChatMessageToRandomUser_Expect_Exception(string receiverEmail) { _currentUserServiceMock .Setup(s => s.GetUserId()) .Returns(_userManager.Users.First(u => u.Email == "*****@*****.**").Id); var receiver = await _userManager.FindByEmailAsync(receiverEmail); var chatMessageNewDto = new ChatMessageNewDto { Content = "Testing..." }; await Assert.ThrowsAsync <InvalidOperationException>(async() => await _chatsService.PostChatMessage(receiver?.Id, chatMessageNewDto) ); }
public async Task When_PostingChatMessageAsTutor_Expect_MessagePosted() { _currentUserServiceMock .Setup(s => s.GetUserId()) .Returns(_userManager.Users.First(u => u.Email == "*****@*****.**").Id); var sender = await _userManager.FindByEmailAsync("*****@*****.**"); var receiver = await _userManager.FindByEmailAsync("*****@*****.**"); var chatMessageNewDto = new ChatMessageNewDto { Content = "Testing...", ModuleId = 1 }; await _chatsService.PostChatMessage(receiver.Id, chatMessageNewDto); var chatMessagePosted = await _context.ChatMessages.FirstAsync(cm => cm.Content == "Testing..."); Assert.Equal(sender.Id, chatMessagePosted.SenderId); Assert.Equal(receiver.Id, chatMessagePosted.ReceiverId); }
private async Task ValidateMessagePosting(string receiverId, ChatMessageNewDto chatMessageNew) { var receiver = await _userManager.Users .Include(u => u.StudentTutors) .Include(u => u.TutorStudents) .FirstOrDefaultAsync(u => u.Id == receiverId); if (receiver is null) { throw new InvalidOperationException($"Could not send message to user (id = '{receiverId}'): user does not exist"); } var senderId = _currentUserService.GetUserId(); var isStudent = receiver.StudentTutors.Any(st => st.TutorId == senderId && st.ModuleId == chatMessageNew.ModuleId); var isTutor = receiver.TutorStudents.Any(st => st.StudentId == senderId && st.ModuleId == chatMessageNew.ModuleId); if (!isStudent && !isTutor) { throw new InvalidOperationException($"Could not send message to user (id = '{receiverId}'): user does not exist"); } }