Ejemplo n.º 1
0
        /// <summary>
        /// Цель: отправить ОТВЕТ на статусУрл
        ///
        /// Варианты, когда вызывается этот метод:
        /// 1. Мы получили ответ в КОНТРОЛ_ПАНЕЛ (от модератора)
        /// 2. Ответ на вопрос с этим идом из АПИ
        /// 3. Система сама нашла подходящий ответ на вопрос и попыталась отправить ответ, если проект это допускает
        /// </summary>
        /// <param name="questionId"></param>
        /// <returns></returns>
        internal async Task <bool> TrySendQuestionAnswerAsync(int questionId)
        {
            var question = _applicationContext.Questions
                           .Include(q => q.Answer)
                           .Include(q => q.Project)
                           .FirstOrDefault(q => q.Id == questionId);

            if (question.Answer == null)
            {
                return(false);
            }

            // Если проект запрещает отправлять ответ без подтверждения модератора И ответ дан не модератором
            if (!question.Project.AnswerWithoutApprove && !question.HasApprovedAnswer)
            {
                return(false);
            }

            if (question.AnswerToEmail)
            {
                var emailClient = new EmailService();
                await emailClient.SendEmailAsync(
                    question.StatusUrl,
                    $"Ответ на вопрос. Проект {question.Project.Name}",
                    question.Answer.Text,
                    question.Project.Name);

                return(true);
            }

            var answerOnStatus = new AnswerOnStatusUrl
            {
                QuestionId   = question.Id,
                AnswerText   = question.Answer.Text,
                QuestionText = question.Text,
                StatusCode   = question.HasApprovedAnswer ? StatusCode.AnswerByHuman : StatusCode.AnswerBySystem
            };

            var answerOnStatusJson = JsonConvert.SerializeObject(answerOnStatus);
            var signature          = CreateSignature(answerOnStatusJson, question.Project.PrivateKey);
            var data = CryptoUtils.Base64Encode(answerOnStatusJson);

            var request = new RestRequest(Method.POST);

            request.AddParameter("data", data);
            request.AddParameter("signature", signature);

            var restClient = new RestClient(question.StatusUrl);
            var response   = await Task.Run(() => restClient.Execute(request));

            //var result = response.Content;
            return(response.IsSuccessful);
        }
Ejemplo n.º 2
0
        internal async Task UpdateStatusForQuestion(int questionId)
        {
            // значит мы получили ответ в КОНТРОЛ_ПАНЕЛ на вопрос с этим идом, и можем отправить ОТВЕТ на статусУрл
            var question = _applicationContext.Questions
                           .Include(q => q.Answer)
                           .Include(q => q.Project)
                           .FirstOrDefault(q => q.Id == questionId);

            if (question.AnswerToEmail)
            {
                var emailClient = new EmailService();
                emailClient.SendEmailAsync(
                    question.StatusUrl,
                    $"Ответ на Ваш вопрос на {question.Project.Name}",
                    question.Answer.Text,
                    question.Project.Name);

                return;
            }

            var answerOnStatus = new AnswerOnStatusUrl
            {
                QuestionId   = question.Id,
                AnswerText   = question.Answer.Text,
                QuestionText = question.Text,
                StatusCode   = question.AnsweredByHuman ? StatusCode.AnswerByHuman : StatusCode.AnswerBySystem
            };

            var answerOnStatusJson = JsonConvert.SerializeObject(answerOnStatus);
            var signature          = CreateSignature(answerOnStatusJson, question.Project.PrivateKey);
            var data = CryptoUtils.Base64Encode(answerOnStatusJson);

            var request = new RestRequest(Method.POST);

            request.AddParameter("data", data);
            request.AddParameter("signature", signature);

            var response = new RestClient(question.StatusUrl).Execute(request);

            var result = response.Content;
        }