public async Task <ActionResult> SendMessageToUser(SendMessageToUserDto sendMessageToUserDto) { try { var userId = this.User.Claims.First(c => c.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier").Value; await _messagesService.SendMessageToUserAsync(sendMessageToUserDto, userId); return(Ok(MessageControllerConstants.YouMessageSenddedWithSuccess)); } catch (Exception ex) { _logger.Error(ex); return(StatusCode(StatusCodes.Status500InternalServerError, ex.Message)); } }
public async Task SendMessageToUserAsync(SendMessageToUserDto sendMessageToUserDto, string SenderId) { User user = null; #region find user to send if (string.IsNullOrEmpty(sendMessageToUserDto.SendToUserId) && string.IsNullOrEmpty(sendMessageToUserDto.SendToEmail)) { throw new ArgumentException("You need to write userId or email"); } if (!string.IsNullOrEmpty(sendMessageToUserDto.SendToUserId)) { user = await _userManager.FindByIdAsync(sendMessageToUserDto.SendToUserId); if (user == null && string.IsNullOrEmpty(sendMessageToUserDto.SendToEmail)) { throw new ArgumentException("We can't find your user for message"); } if (user == null && !string.IsNullOrEmpty(sendMessageToUserDto.SendToEmail)) { user = await _userManager.FindByEmailAsync(sendMessageToUserDto.SendToEmail); if (user == null) { throw new ArgumentException("We can't find your user for message"); } } } else { user = await _userManager.FindByEmailAsync(sendMessageToUserDto.SendToEmail); if (user == null) { throw new ArgumentException("We can't find your user for message"); } } #endregion find user to send var chatForSend = sendMessageToUserDto.ChatId == null ? null : await _unitOfWork.ChatRepository.GetChatByIdWithAllIncludes(sendMessageToUserDto.ChatId.Value); if (chatForSend != null && chatForSend.Public && ChatContainUser(user, chatForSend).Value) { await SendMessageToChatAsync( new SendMessageToChatDto { ChatId = chatForSend.Id, Message = sendMessageToUserDto.Message }, SenderId ); return; } if (chatForSend != null && !chatForSend.Public && ChatContainUser(SenderId, chatForSend).Value&& ChatContainUser(user, chatForSend).Value) { await SendMessageToChatAsync( new SendMessageToChatDto { ChatId = chatForSend.Id, Message = sendMessageToUserDto.Message }, SenderId ); return; } chatForSend = _unitOfWork.ChatRepository.Find(ch => ch.DefaultChat && ch.Public == sendMessageToUserDto.PublicSend && (ch.UserChats.Any(uch => uch.UserId == SenderId)) && (ch.UserChats.Any(uch => uch.UserId == user.Id))).FirstOrDefault(); if (chatForSend != null) { await SendMessageToChatAsync( new SendMessageToChatDto { ChatId = chatForSend.Id, Message = sendMessageToUserDto.Message }, SenderId ); return; } else { //create new default chat with this users //add users and send message chatForSend = await CreateDefaultChat(sendMessageToUserDto.PublicSend, SenderId, user); await SendMessageToChatAsync( new SendMessageToChatDto { ChatId = chatForSend.Id, Message = sendMessageToUserDto.Message }, SenderId ); return; } }