Exemplo n.º 1
0
        /// <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);
            }
        }
Exemplo n.º 2
0
        public async Task <IActionResult> GetDialogAsync([FromBody] DialogInput dialogInput)
        {
            GetResultMessageOutput messages = await _chatService.GetDialogAsync(dialogInput.DialogId, GetUserName(), dialogInput.ExecutorId, dialogInput.IsWriteBtn);

            return(Ok(messages));
        }
Exemplo n.º 3
0
        /// <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);
            }
        }
Exemplo n.º 4
0
        public async Task <IActionResult> SendAsync([FromBody] ChatInput chatInput)
        {
            GetResultMessageOutput messages = await _chatService.SendAsync(chatInput.Message, GetUserName(), chatInput.DialogId);

            return(Ok(messages));
        }