Passed
Push — 1.11.x ( dd515f...e2aa28 )
by Angel Fernando Quiroz
09:45
created

StatementsController::deserializeStatement()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 1
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
namespace Chamilo\PluginBundle\XApi\Lrs;
6
7
use Chamilo\PluginBundle\XApi\Lrs\Util\InternalLogUtil;
8
use Symfony\Component\HttpFoundation\Request;
9
use Symfony\Component\HttpFoundation\Response;
10
use Xabbuh\XApi\Common\Exception\NotFoundException;
11
use Xabbuh\XApi\Model\StatementId;
12
use Xabbuh\XApi\Serializer\Symfony\ActorSerializer;
13
use Xabbuh\XApi\Serializer\Symfony\Serializer;
14
use Xabbuh\XApi\Serializer\Symfony\SerializerFactory;
15
use XApi\LrsBundle\Controller\StatementGetController;
16
use XApi\LrsBundle\Controller\StatementHeadController;
17
use XApi\LrsBundle\Controller\StatementPostController;
18
use XApi\LrsBundle\Controller\StatementPutController;
19
use XApi\LrsBundle\Model\StatementsFilterFactory;
20
use XApi\Repository\Doctrine\Mapping\Statement as StatementEntity;
21
use XApi\Repository\Doctrine\Repository\StatementRepository;
22
use XApiPlugin;
23
24
/**
25
 * Class StatementsController.
26
 *
27
 * @package Chamilo\PluginBundle\XApi\Lrs
28
 */
29
class StatementsController extends BaseController
30
{
31
    /**
32
     * @var StatementRepository
33
     */
34
    private $statementRepository;
35
    /**
36
     * @var \Symfony\Component\Serializer\Serializer|\Symfony\Component\Serializer\SerializerInterface
37
     */
38
    private $serializer;
39
    /**
40
     * @var SerializerFactory
41
     */
42
    private $serializerFactory;
43
44
    public function __construct(Request $httpRequest)
45
    {
46
        parent::__construct($httpRequest);
47
48
        $pluginEm = XApiPlugin::getEntityManager();
49
50
        $this->statementRepository = new StatementRepository(
51
            $pluginEm->getRepository(StatementEntity::class)
52
        );
53
        $this->serializer = Serializer::createSerializer();
54
        $this->serializerFactory = new SerializerFactory($this->serializer);
55
    }
56
57
    public function get(): Response
58
    {
59
        $getStatementController = new StatementGetController(
60
            $this->statementRepository,
61
            $this->serializerFactory->createStatementSerializer(),
62
            $this->serializerFactory->createStatementResultSerializer(),
63
            new StatementsFilterFactory(
64
                new ActorSerializer($this->serializer)
65
            )
66
        );
67
68
        return $getStatementController->getStatement($this->httpRequest);
69
    }
70
71
    public function head(): Response
72
    {
73
        $headStatementController = new StatementHeadController(
74
            $this->statementRepository,
75
            $this->serializerFactory->createStatementSerializer(),
76
            $this->serializerFactory->createStatementResultSerializer(),
77
            new StatementsFilterFactory(
78
                new ActorSerializer($this->serializer)
79
            )
80
        );
81
82
        return $headStatementController->getStatement($this->httpRequest);
83
    }
84
85
    public function put(): Response
86
    {
87
        $statement = $this->serializerFactory
88
            ->createStatementSerializer()
89
            ->deserializeStatement(
90
                $this->httpRequest->getContent()
91
            )
92
        ;
93
94
        $putStatementController = new StatementPutController($this->statementRepository);
95
96
        $response = $putStatementController->putStatement($this->httpRequest, $statement);
97
98
        $this->saveLog(
99
            [$this->httpRequest->query->get('statementId')]
100
        );
101
102
        return $response;
103
    }
104
105
    public function post(): Response
106
    {
107
        $content = $this->httpRequest->getContent();
108
109
        if (substr($content, 0, 1) !== '[') {
110
            $content = "[$content]";
111
        }
112
113
        $statements = $this->serializerFactory
114
            ->createStatementSerializer()
115
            ->deserializeStatements($content)
116
        ;
117
118
        $postStatementController = new StatementPostController($this->statementRepository);
119
120
        $response = $postStatementController->postStatements($this->httpRequest, $statements);
121
122
        $this->saveLog(
123
            json_decode($response->getContent(), false)
124
        );
125
126
        return $response;
127
    }
128
129
    /**
130
     * @param array<string> $statementsId
131
     *
132
     * @return void
133
     */
134
    private function saveLog(array $statementsId)
135
    {
136
        foreach ($statementsId as $statementId) {
137
            try {
138
                $storedStatement = $this->statementRepository->findStatementById(
139
                    StatementId::fromString($statementId)
140
                );
141
142
                InternalLogUtil::saveStatementForInternalLog($storedStatement);
143
            } catch (NotFoundException $e) {
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
144
            }
145
        }
146
    }
147
}
148