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)); } }