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

SurveyController::apiSurveyUpdateAction()   C

Complexity

Conditions 7
Paths 8

Size

Total Lines 30
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 30
rs 6.7272
c 0
b 0
f 0
cc 7
eloc 22
nc 8
nop 2
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', array('groups' => array('group1'))
37
        );
38
        $response = new Response($json, Response::HTTP_OK);
39
        $response->headers->set('Content-Type', 'application/json');
40
41
        return $response;
42
    }
43
44
    /**
45
     * @param Survey $survey
46
     * @Route("/survey/{id}", name="api_survey_byid")
47
     * @Method("GET")
48
     * @ParamConverter("survey", class="AppBundle:Survey")
49
     */
50
    public function apiSurveyAction(Survey $survey)
51
    {
52
        $user = $this->getUser();
53
        if (!$user) {
54
            return $this->json(['message' => 'User is not authorized'], 401);
55
        }
56
        $em = $this->getDoctrine()->getManager();
0 ignored issues
show
Unused Code introduced by
$em is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
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', array('groups' => array('group1', 'group2'))
66
            );
67
        } else {
68
            $json = $serializer->serialize(
69
                $survey,
70
                'json', array('groups' => array('group1', 'group3'))
71
            );
72
        }
73
74
        $response = new Response($json, Response::HTTP_OK);
75
        $response->headers->set('Content-Type', 'application/json');
76
77
        return $response;
78
    }
79
80
    /**
81
     * @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...
82
     * @Route("/survey/update/{id}", name="api_survey_update")
83
     * @Method("POST")
84
     * @ParamConverter("survey", class="AppBundle:Survey")
85
     */
86
    public function apiSurveyUpdateAction(Request $request, Survey $survey)
87
    {
88
        $user = $this->getUser();
89
        if (!$user) {
90
            return $this->json(['message' => 'User is not authorized'], 401);
91
        }
92
        if (!$survey || $survey->getStatus() == 'submited') {
93
            return $this->json(['message' => 'No survey'], 404);
94
        }
95
        foreach ($survey->getType()->getQuestions() as $question) {
96
            $quest_key[] = $question->getId();
0 ignored issues
show
Coding Style Comprehensibility introduced by
$quest_key was never initialized. Although not strictly required by PHP, it is generally a good practice to add $quest_key = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
97
        }
98
        $data = json_decode($request->getContent(), true);
99
        $em = $this->getDoctrine()->getManager();
100
        foreach ($quest_key as $key) {
0 ignored issues
show
Bug introduced by
The variable $quest_key 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...
101
            $answer = $data[$key];
102
            if ($answer == null) {
103
                return $this->json(['message' => 'Wrong question id'], 400);
104
            }
105
            $new_answer = new SurveyAnswer();
106
            $new_answer->setSurvey($survey);
107
            $new_answer->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...
108
            $new_answer->setContent($answer);
109
            $em->persist($new_answer);
110
        }
111
        $survey->setStatus('submited');
112
        $em->flush();
113
114
        return $this->json(['message' => 'Survey updated'], 200);
115
    }
116
}
117