public async Task <IActionResult> GetSession(long chatId)
        {
            var user = await _userManager.GetUserAsync(HttpContext.User);

            if (user == null)
            {
                return(BadRequest());
            }

            // не знаю способа лучше (по бырику)
            user = _userManager.Users.Include(x => x.Sessions).FirstOrDefault(x => x.Id == user.Id);

            var notCompletedSession = user.Sessions.FirstOrDefault(x => x.ChatId == chatId && !x.IsCompleted);

            if (notCompletedSession != null)
            {
                return(Json(new { SessionId = notCompletedSession.Id }));
            }

            var createdSession = new ChatSession()
            {
                ChatId = chatId,
                Status = SessionProgressType.NotStarted,
                UserId = user.Id
            };

            _db.ChatSessions.Add(createdSession);
            _db.SaveChanges();

            var welcomeQuestion = _db.Questions.FirstOrDefault(x => x.ChatId == chatId && x.QuestionType == QuestionType.Welcome);

            if (welcomeQuestion == null)
            {
                return(BadRequest());
            }

            _db.ChatSessionAnswers.Add(new ChatSessionAnswer()
            {
                SessionId  = createdSession.Id,
                QuestionId = welcomeQuestion.Id,
            });

            _db.SaveChanges();

            return(Json(new { SessionId = createdSession.Id }));
        }
        /// <summary>
        /// Должно срабатывать когда человек зашел в сессию
        /// </summary>
        /// <param name="id">Идентификатор сессии</param>
        /// <returns></returns>
        public async Task EnterToSession(long id)
        {
            // Группа для SignalR (потом мб на гуид переделаем)
            var groupId = Convert.ToString(id);

            // Добавляем это подключение в группу
            await Groups.AddToGroupAsync(Context.ConnectionId, groupId);

            // Если нет такой сессии
            if (!_db.ChatSessions.Any(x => x.Id == id))
            {
                return;
            }

            // Получаем историю ответов для сессии
            var answersHistory = _db.ChatSessionAnswers
                                 .Where(x => x.SessionId == id).ToList();

            // Если нет ниодного ответа
            if (answersHistory.Any())
            {
                // Получаем сессию из БД
                var session = _db.ChatSessions
                              .Include(x => x.ChatSessionAnswers)
                              .ThenInclude(x => x.Question)
                              .ThenInclude(x => x.Buttons)
                              .First(x => x.Id == id);

                // Формируем историю для отправки
                var history = _mapper.Map <HistoryDto>(session);

                // Сериализуем в JSON
                //var json = JsonConvert.SerializeObject(history);

                // Отправляем историю к новому подключившемуся к сессии человеку
                await Clients.Caller.SendAsync("EnterToSession", history);
            }
            else
            {
                // Получаем сессию из БД
                var session = _db.ChatSessions
                              .Include(x => x.Chat)
                              .ThenInclude(x => x.Questions)
                              .ThenInclude(x => x.Buttons)
                              .First(x => x.Id == id);

                // Получаем первый вопрос
                var firstQuestion = session.Chat.Questions.First(x => x.QueueNumber == 0);

                var answer = new ChatSessionAnswer()
                {
                    QuestionId = firstQuestion.Id,
                    SessionId  = id,
                };

                // Добавляем в историю новый вопрос
                _db.ChatSessionAnswers.Add(answer);
                _db.SaveChanges();

                answer.Question = firstQuestion;

                // Формируем историю для отправки
                var history = new HistoryDto()
                {
                    QuestionsHistory   = null,
                    NextQuestion       = _mapper.Map <NextQuestionDto>(answer),
                    IsSessionCompleted = session.IsCompleted
                };

                // Сериализуем в JSON
                //var json = JsonConvert.SerializeObject(history);

                // Отправляем историю к новому подключившемуся к сессии человеку
                await Clients.Caller.SendAsync("EnterToSession", history);
            }
        }
        public IActionResult Add(long ChatId, List <QuestionDto> Model)
        {
            if (ModelState.IsValid)
            {
                short queueNumber = 0;

                foreach (QuestionDto questionDto in Model)
                {
                    Question           q;
                    QuestionType       qt;
                    QuestionAnswerType qat;

                    if (queueNumber == 0)
                    {
                        qt = QuestionType.Welcome;
                    }
                    else if (queueNumber == Model.Count() - 1)
                    {
                        qt = QuestionType.Final;
                    }
                    else
                    {
                        qt = QuestionType.Normal;
                    }

                    if (questionDto.Buttons == null)
                    {
                        qat = QuestionAnswerType.OnlyChatAvailable;
                    }
                    else
                    {
                        qat = QuestionAnswerType.OnlyButtonsAvailable;
                    }

                    if (questionDto.Id == null)
                    {
                        q = new Question()
                        {
                            ChatId             = ChatId,
                            Text               = questionDto.Text,
                            QueueNumber        = queueNumber++,
                            QuestionType       = qt,
                            QuestionAnswerType = qat
                        };

                        _db.Questions.Add(q);
                    }
                    else
                    {
                        q = _db.Questions.FirstOrDefault(x => x.Id == questionDto.Id);

                        q.Text               = questionDto.Text;
                        q.QueueNumber        = queueNumber++;
                        q.QuestionType       = qt;
                        q.QuestionAnswerType = qat;

                        _db.Questions.Update(q);
                    }

                    _db.SaveChanges();

                    if (questionDto.Buttons != null)
                    {
                        foreach (ButtonDto buttonDto in questionDto.Buttons)
                        {
                            if (buttonDto.Id == null)
                            {
                                Button b = new Button()
                                {
                                    QuestionId = q.Id,
                                    Text       = buttonDto.Text
                                };

                                _db.Buttons.Add(b);
                            }
                            else
                            {
                                Button b = _db.Buttons.FirstOrDefault(x => x.Id == buttonDto.Id);

                                b.Text = buttonDto.Text;

                                _db.Buttons.Update(b);
                            }

                            _db.SaveChanges();
                        }
                    }
                    else
                    {
                        var b = _db.Buttons.Where(x => x.QuestionId == questionDto.Id).ToList();
                        foreach (var button in b)
                        {
                            _db.Buttons.Remove(button);
                        }
                        _db.SaveChanges();
                    }
                }

                var QuestionsList = _db.Questions
                                    .Include(q => q.Buttons)
                                    .Where(q => q.ChatId == ChatId && q.DeleteUtcDateTime == null)
                                    .OrderBy(q => q.QueueNumber)
                                    .Select(x => new {
                    Id           = x.Id,
                    Text         = x.Text,
                    QueueNumber  = x.QueueNumber,
                    QuestionType = x.QuestionType.ToString(),
                    Buttons      = x.Buttons.Select(b => new { b.Id, b.Text })
                })
                                    .ToList();

                return(Ok(QuestionsList));
            }
            else
            {
                return(BadRequest(ModelState));
            }
        }