Completed
Pull Request — dev (#24)
by
unknown
04:08
created

SurveyController::apiSurveysAction()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 23
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 23
rs 9.0856
c 0
b 0
f 0
cc 3
eloc 16
nc 3
nop 0
1
<?php
2
3
namespace AppBundle\Controller\Api;
4
5
use AppBundle\Entity\SurveyAnswer;
6
use AppBundle\Entity\Survey;
7
use AppBundle\Entity\SurveyQuestion;
8
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
9
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
10
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
11
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
12
use Symfony\Component\HttpFoundation\Request;
13
use Symfony\Component\HttpFoundation\Response;
14
15
class SurveyController extends Controller
16
{
17
    /**
18
     * @Route("/surveys", name="api_surveys")
19
     * @Method("GET")
20
     */
21
    public function apiSurveysAction()
22
    {
23
        $user = $this->getUser();
24
        if (!$user) {
25
            return $this->json(['message' => 'User is not authorized'], 401);
26
        }
27
        $em = $this->getDoctrine()->getManager();
28
        $surveys = $em->getRepository(Survey::class)->findSurveyByUser($user);
29
        if (!$surveys) {
30
            return $this->json(['message' => 'No surveys'], 404);
31
        }
32
        $serializer = $this->get('serializer');
33
34
        $json = $serializer->serialize(
35
            $surveys,
36
            'json',
37
            array('groups' => array('group1'))
38
        );
39
        $response = new Response($json, Response::HTTP_OK);
40
        $response->headers->set('Content-Type', 'application/json');
41
42
        return $response;
43
    }
44
45
    /**
46
     * @param Survey $survey
47
     * @Route("/survey/{id}", name="api_survey_byid")
48
     * @Method("GET")
49
     * @ParamConverter("survey", class="AppBundle:Survey")
50
     */
51
    public function apiSurveyAction(Survey $survey)
52
    {
53
        $user = $this->getUser();
54
        if (!$user) {
55
            return $this->json(['message' => 'User is not authorized'], 401);
56
        }
57
58
        if (!$survey) {
59
            return $this->json(['message' => 'No surveys'], 404);
60
        }
61
        $serializer = $this->get('serializer');
62
        if ($survey->getStatus() == 'submited') {
63
            $json = $serializer->serialize(
64
                $survey,
65
                'json',
66
                array('groups' => array('group1', 'group2'))
67
            );
68
        }
69
        if ($survey->getStatus() == 'current') {
70
            $json = $serializer->serialize(
71
                $survey,
72
                'json',
73
                array('groups' => array('group1', 'group3'))
74
            );
75
        }
76
77
        $response = new Response($json, Response::HTTP_OK);
0 ignored issues
show
Bug introduced by
The variable $json does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
78
        $response->headers->set('Content-Type', 'application/json');
79
80
        return $response;
81
    }
82
83
    /**
84
     * @param Request $request, Survey $survey
0 ignored issues
show
Documentation introduced by
There is no parameter named $request,. Did you maybe mean $request?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function. It has, however, found a similar but not annotated parameter which might be a good fit.

Consider the following example. The parameter $ireland is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $ireland
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was changed, but the annotation was not.

Loading history...
85
     * @Route("/survey/update/{id}", name="api_survey_update")
86
     * @Method("POST")
87
     * @ParamConverter("survey", class="AppBundle:Survey")
88
     */
89
    public function apiSurveyUpdateAction(Request $request, Survey $survey)
90
    {
91
        $user = $this->getUser();
92
        if (!$user) {
93
            return $this->json(['message' => 'User is not authorized'], 401);
94
        }
95
        if (!$survey || $survey->getStatus() == 'submited') {
96
            return $this->json(['message' => 'No survey'], 404);
97
        }
98
        $questKey = array();
99
        foreach ($survey->getType()->getQuestions() as $question) {
100
            $questKey[] = $question->getId();
101
        }
102
        $data = json_decode($request->getContent(), true);
103
        $em = $this->getDoctrine()->getManager();
104
        foreach ($questKey as $key) {
105
            $answer = $data[$key];
106
            if ($answer == null) {
107
                return $this->json(['message' => 'Wrong question id'], 400);
108
            }
109
            $newAnswer = new SurveyAnswer();
110
            $newAnswer->setSurvey($survey);
111
            $newAnswer->setQuestion($em->getRepository(SurveyQuestion::class)->find($key));
0 ignored issues
show
Documentation introduced by
$em->getRepository(\AppB...ion::class)->find($key) is of type object|null, but the function expects a object<AppBundle\Entity\SurveyQuestion>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
112
            $newAnswer->setContent($answer);
113
            $em->persist($newAnswer);
114
        }
115
        $survey->setStatus('submited');
116
        $em->flush();
117
118
        return $this->json(['message' => 'Survey updated'], 200);
119
    }
120
}
121