src/Controller/v1/Survey/CreateSurveyResultController.php line 66

Open in your IDE?
  1. <?php
  2. namespace App\Controller\v1\Survey;
  3. use App\Form\SurveyResultFormType;
  4. use App\Repository\Survey\AnswerRepository;
  5. use App\Repository\Survey\QuestionRepository;
  6. use App\Repository\Survey\SurveyRepository;
  7. use App\Services\Survey\SurveyResultDataService;
  8. use App\Services\Survey\SurveyResultService;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\Form\FormInterface;
  12. use Symfony\Component\HttpFoundation\JsonResponse;
  13. use Symfony\Component\HttpFoundation\Request;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\Routing\Annotation\Route;
  16. use OpenApi\Annotations as OA;
  17. /**
  18.  * @Route("/api/v1/surveyResult/", name="create.surveyResult", methods={"POST"})
  19.  * @OA\Post(
  20.  *   summary="Сохранить результаты опроса",
  21.  *   description="",
  22.  *   operationId="create.surveyResult",
  23.  *     @OA\RequestBody(
  24.  *          required=true,
  25.  *          description="Результаты опроса",
  26.  *          @OA\JsonContent(
  27.  *              type="object",
  28.  *              @OA\Property(property="survey_id", type="integer", example="1"),
  29.  *              @OA\Property(property="user_ip", type="string", example="127.0.0.1"),
  30.  *              @OA\Property(property="user_agent", type="string", example="Yandex Browser"),
  31.  *              @OA\Property(property="user_email", type="string", example="email@mail.ru"),
  32.  *              @OA\Property(property="elapsedTime", type="integer", example="161085433"),
  33.  *              @OA\Property(
  34.  *                  property="questions",
  35.  *                  type="array",
  36.  *                  @OA\Items(
  37.  *                      type="object",
  38.  *                      @OA\Property(
  39.  *                          property="question_id",
  40.  *                          type="integer",
  41.  *                          example="1"
  42.  *                      ),
  43.  *                      @OA\Property(
  44.  *                          property="question_data",
  45.  *                          type="string",
  46.  *                          example="1,2,3"
  47.  *                      ),
  48.  *                      @OA\Property(
  49.  *                          property="isPasted",
  50.  *                          type="boolean",
  51.  *                          example="false"
  52.  *                      )
  53.  *                  )
  54.  *              )
  55.  *          )
  56.  *     )
  57.  * )
  58.  * @OA\Response(
  59.  *     response=200,
  60.  *     description="Результаты опроса сохранены"
  61.  * )
  62.  * @OA\Tag(name="Survey")
  63.  */
  64. class CreateSurveyResultController extends AbstractController
  65. {
  66.     public function __construct(
  67.         public SurveyResultDataService $surveyResultDataService
  68.     ) {
  69.     }
  70.     /**
  71.      * @param Request $request
  72.      * @return JsonResponse
  73.      */
  74.     public function __invoke(Request $request): JsonResponse
  75.     {
  76.         $dataCollections json_decode($request->getContent(), true);
  77.         $form $this->createForm(SurveyResultFormType::class);
  78.         $form->submit($dataCollections);
  79.         if ($form->isSubmitted() && !$form->isValid()) {
  80.             return $this->json([
  81.                 'success' => false,
  82.                 'errors' => $this->getErrorMessages($form)
  83.             ], Response::HTTP_BAD_REQUEST);
  84.         }
  85.         $this->surveyResultDataService->createResultData($form->getData());
  86.         return $this->json([
  87.             'success' => true,
  88.             'message' => 'Результат опроса успешно сохранен'
  89.         ], Response::HTTP_OK);
  90.     }
  91.     protected function getErrorMessages(FormInterface $form): array
  92.     {
  93.         $errors = array();
  94.         foreach ($form->getErrors() as $key => $error) {
  95.             $errors[] = $error->getMessage();
  96.         }
  97.         foreach ($form->all() as $child) {
  98.             if (!$child->isValid()) {
  99.                 $errors[$child->getName()] = $this->getErrorMessages($child);
  100.             }
  101.         }
  102.         return $errors;
  103.     }
  104. }