public async Task <IActionResult> Answer(int projectId, int questionId, string answerText) { if (string.IsNullOrEmpty(answerText)) { return(Json(new Result { Message = "Текст ответа не может быть пустым." })); } var project = _applicationContext.Projects .Include(p => p.Questions) .FirstOrDefault(p => p.Id == projectId); if (project == null) { return(Json(new Result { Message = "Parameter projectId" })); } var user = _repositoryService.GetUserByClaims(User); if (user == null) { return(Json(new Result { Message = "Ошибка с идентификацией пользователя." })); } var answer = new Answer { Date = DateTime.Now, Text = answerText, Project = project, User = user }; var question = project.Questions.FirstOrDefault(q => q.Id == questionId); if (question == null) { return(Json(new Result { Message = "Parameter questionId" })); } question.Answer = answer; question.AnsweredByHuman = true; _applicationContext.Answers.Add(answer); await _applicationContext.SaveChangesAsync(); await _processorService.TrySendQuestionAnswerAsync(questionId); _processorService.AnswerOnSimilarQuestionsAsync(questionId); return(Json(new Result { Success = true })); }
public async Task <JsonResult> Post([FromForm] string data, [FromForm] string signature) { try { //string answerJson; var decodedData = CryptoUtils.Base64Decode(data); var answerToApi = JsonConvert.DeserializeObject <PostAnswer>(decodedData); if (!answerToApi.IsModelValid()) { throw new ErrorWithDataException("Some of the data parameters are invalid. Check the documentation.", Models.Api.StatusCode.WrongData); } var user = _applicationContext.User .Include(u => u.UserProjects) .ThenInclude(up => up.Project) .FirstOrDefault(u => u.UserName == answerToApi.Login); if (user == null)// || user.PasswordHash != questionToApi.PasswordHash) { throw new ErrorWithDataException("User with such email doesn't exist.", Models.Api.StatusCode.WrongLoginPasswordCredentials); } var userProject = user.UserProjects.FirstOrDefault(up => up.Project.Id == answerToApi.ProjectId); if (userProject == null) { throw new ErrorWithDataException("Provided user doesn't consist in the project with such ID.", Models.Api.StatusCode.WrongProjectId); } if (!Utils.ValidateSignature(data, signature, userProject.Project.PrivateKey)) { throw new ErrorWithDataException("Signature is not valid. Check your PrivateKey and MD5 alghorithm.", Models.Api.StatusCode.WrongSignature); } var question = _applicationContext.Questions .Include(q => q.Answer) .FirstOrDefault(q => q.Id == answerToApi.QuestionId); if (question == null) { throw new ErrorWithDataException("Provided question ID doesn't consist in the project with such ID.", Models.Api.StatusCode.WrongQuestionId); } var answer = new Answer { Date = DateTime.Now, Text = answerToApi.AnswerText, ProjectId = answerToApi.ProjectId, User = user }; question.Answer = answer; question.AnsweredByHuman = true; _applicationContext.Answers.Add(answer); await _applicationContext.SaveChangesAsync(); // Запускаем обработку вопроса без ожидания результата _processorService.AnswerOnSimilarQuestionsAsync(question.Id); var postAnswerResponse = new PostAnswerResponse { QuestionId = question.Id, StatusCode = Models.Api.StatusCode.Success, StatusMessage = $"Answer on question with ID {question.Id} was successfully placed." }; return(Json(postAnswerResponse)); } catch (ErrorWithDataException ex) { var answer = new PostQuestionResponse() { StatusCode = ex.StatusCode(), StatusMessage = ex.Message }; //var answerJson = JsonConvert.SerializeObject(answer); return(Json(answer)); } catch (Exception ex) { var answer = new PostQuestionResponse() { StatusCode = Models.Api.StatusCode.Error, StatusMessage = ex.Message }; //var answerJson = JsonConvert.SerializeObject(answer); return(Json(answer)); } }