/// <summary> /// Метод пишет сообщение. /// </summary> /// <param name="account">Логин пользователя.</param> /// <param name="message">Сообщение.</param> /// <param name="dialogId">Id диалога.</param> /// <returns>Список сообщений.</returns> public async Task <GetResultMessageOutput> SendAsync(string message, string account, long dialogId) { try { GetResultMessageOutput messagesList = new GetResultMessageOutput(); // Если сообщения не передано, то ничего не делать. if (string.IsNullOrEmpty(message)) { return(null); } // Найдет Id пользователя. string userId = await _userService.GetUserIdByLogin(account); // Проверит существование диалога. bool isDialog = await _postgre.MainInfoDialogs .Where(d => d.DialogId == dialogId) .FirstOrDefaultAsync() != null; if (!isDialog) { throw new NotFoundDialogIdException(dialogId); } // Запишет сообщение в диалог. await _postgre.DialogMessages.AddAsync(new DialogMessageEntity() { Message = message, DialogId = dialogId, Created = DateTime.Now, UserId = userId, IsMyMessage = true }); await _postgre.SaveChangesAsync(); // Получит сообщения диалога. var messages = await(_postgre.DialogMessages .Where(d => d.DialogId == dialogId) .OrderBy(m => m.Created) .Select(res => new { dialogId = res.DialogId, message = res.Message, created = string.Format("{0:f}", res.Created), userId = res.UserId, isMyMessage = res.IsMyMessage }) .ToListAsync()); // Приведет к типу MessageOutput. foreach (object messageText in messages) { string jsonString = JsonSerializer.Serialize(messageText); MessageOutput messageOutput = JsonSerializer.Deserialize <MessageOutput>(jsonString); // Проставит флаг принадлежности сообщения. messageOutput.IsMyMessage = messageOutput.UserId.Equals(userId); // Затирает Id пользователя, чтобы фронт не видел. messageOutput.UserId = null; messagesList.Messages.Add(messageOutput); } messagesList.DialogState = DialogStateEnum.Open.ToString(); return(messagesList); } catch (Exception ex) { Logger logger = new Logger(_db, ex.GetType().FullName, ex.Message, ex.StackTrace); await logger.LogCritical(); throw new Exception(ex.Message); } }
public async Task <IActionResult> GetDialogAsync([FromBody] DialogInput dialogInput) { GetResultMessageOutput messages = await _chatService.GetDialogAsync(dialogInput.DialogId, GetUserName(), dialogInput.ExecutorId, dialogInput.IsWriteBtn); return(Ok(messages)); }
/// <summary> /// Метод получает диалог, либо создает новый. /// </summary> /// <param name="dialogId">Id диалога, для которого нужно подтянуть сообщения.</param> /// <param name="account">Логин текущего пользователя.</param> /// <param name="isWriteBtn">Флаг кнопки "Написать".</param> /// <param name="executorId">Id исполнителя, на ставку которого нажали.</param> /// <returns>Список сообщений диалога.</returns> public async Task <GetResultMessageOutput> GetDialogAsync(long?dialogId, string account, string executorId, bool isWriteBtn = false) { try { GetResultMessageOutput messagesList = new GetResultMessageOutput(); // Если dialogId не передан и не передан флаг кнопки, значит нужно открыть пустой чат. if (dialogId == null && !isWriteBtn) { messagesList.DialogState = DialogStateEnum.None.ToString(); return(messagesList); } // Найдет Id текущего пользователя. string userId = await _userService.GetUserIdByLogin(account); // Если передан флаг кнопки "Ответить", значит нужно поискать существующий диалог с исполнителем или создать новый. if (isWriteBtn) { // Есть ли роль заказчика. UserOutput user = await _userService.GetUserInitialsByIdAsync(userId); // Пытается найти существующий диалог заказчика с исполнителем. if (user.UserRole.Equals(UserRole.CUSTOMER) && !string.IsNullOrEmpty(executorId)) { // Ищет Id диалога с текущим заказчиком и исполнителем, на ставку которого нажали. Затем сравнит их DialogId, если он совпадает, значит заказчик с исполнителем общаются. // Выберет DialogId заказчика. long customerDialogId = await _postgre.DialogMembers .Where(d => d.Id .Equals(userId)) .Select(res => res.DialogId) .FirstOrDefaultAsync(); // Выберет DialogId исполнителя. long executorDialogId = await _postgre.DialogMembers .Where(d => d.Id .Equals(executorId)) .Select(res => res.DialogId) .FirstOrDefaultAsync(); // Сравнит DialogId заказчика и исполнителя. Если они равны, значит заказчик и исполнитель общаются в одном чате и возьмет DialogId этого чата. if (customerDialogId != executorDialogId) { // Создаст новый диалог. await _postgre.MainInfoDialogs.AddAsync(new MainInfoDialogEntity() { DialogName = string.Empty, Created = DateTime.Now }); await _postgre.SaveChangesAsync(); // Выберет DialogId созданного диалога. long newDialogId = await _postgre.MainInfoDialogs .OrderBy(d => d.DialogId) .Select(d => d.DialogId) .LastOrDefaultAsync(); // Добавит заказчика и исполнителя к новому диалогу. await _postgre.DialogMembers.AddRangeAsync( new DialogMemberEntity() { DialogId = newDialogId, Id = userId, Joined = DateTime.Now }, new DialogMemberEntity() { DialogId = newDialogId, Id = executorId, Joined = DateTime.Now }); await _postgre.SaveChangesAsync(); messagesList.DialogState = DialogStateEnum.Open.ToString(); return(messagesList); } dialogId = executorDialogId; } } // Проверит существование диалога. bool isDialog = await _postgre.MainInfoDialogs .Where(d => d.DialogId == dialogId) .FirstOrDefaultAsync() != null; if (!isDialog) { throw new NotFoundDialogIdException(dialogId); } // Получит сообщения диалога. var messages = await(_postgre.DialogMessages .Where(d => d.DialogId == dialogId) .OrderBy(m => m.Created) .Select(res => new { dialogId = res.DialogId, message = res.Message, created = string.Format("{0:f}", res.Created), userId = res.UserId, isMyMessage = res.IsMyMessage }) .ToListAsync()); // Если у диалога нет сообщений, значит вернуть пустой диалог, который будет открыт. if (!messages.Any()) { messagesList.DialogState = DialogStateEnum.Empty.ToString(); return(messagesList); } // Приведет к типу MessageOutput. foreach (object message in messages) { string jsonString = JsonSerializer.Serialize(message); MessageOutput messageOutput = JsonSerializer.Deserialize <MessageOutput>(jsonString); // Проставит флаг принадлежности сообщения. messageOutput.IsMyMessage = messageOutput.UserId.Equals(userId); // Затирает Id пользователя, чтобы фронт его не видел. messageOutput.UserId = null; messagesList.Messages.Add(messageOutput); } messagesList.DialogState = DialogStateEnum.Open.ToString(); // Находит Id участников диалога по DialogId. IEnumerable <string> membersIds = await GetDialogMembers(dialogId); if (membersIds == null) { throw new NotDialogMembersException(dialogId); } string id = membersIds.FirstOrDefault(i => !i.Equals(userId)); UserOutput otherUser = await _userService.GetUserInitialsByIdAsync(id); // Запишет имя и фамилию пользователя, диалог с которым открыт. if (!string.IsNullOrEmpty(otherUser.FirstName) && !string.IsNullOrEmpty(otherUser.LastName)) { messagesList.FirstName = otherUser.FirstName; messagesList.LastName = CommonMethodsService.SubstringLastName(otherUser.LastName); } // Если не заполнено имя и фамилия, значит записать логин. else { messagesList.UserName = otherUser.UserName; } return(messagesList); } catch (Exception ex) { Logger logger = new Logger(_db, ex.GetType().FullName, ex.Message, ex.StackTrace); await logger.LogCritical(); throw new Exception(ex.Message); } }
public async Task <IActionResult> SendAsync([FromBody] ChatInput chatInput) { GetResultMessageOutput messages = await _chatService.SendAsync(chatInput.Message, GetUserName(), chatInput.DialogId); return(Ok(messages)); }