Passed
Push — master ( bdf7a9...a94470 )
by Julito
09:19
created

ResourceApiController::postResourceCommentAction()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 21
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 13
nc 2
nop 2
dl 0
loc 21
rs 9.8333
c 0
b 0
f 0
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
namespace Chamilo\CoreBundle\Controller;
6
7
use Chamilo\CoreBundle\Entity\Resource\AbstractResource;
8
use Chamilo\CoreBundle\Entity\Resource\ResourceComment;
9
use Chamilo\CoreBundle\Form\Type\ResourceCommentType;
10
use Chamilo\CoreBundle\Security\Authorization\Voter\ResourceNodeVoter;
11
use Chamilo\CoreBundle\Traits\ControllerTrait;
12
use Chamilo\CoreBundle\Traits\CourseControllerTrait;
13
use Chamilo\CoreBundle\Traits\ResourceControllerTrait;
14
use Chamilo\CourseBundle\Controller\CourseControllerInterface;
15
use Doctrine\Common\Collections\Criteria;
16
use Doctrine\ORM\QueryBuilder;
17
use FOS\RestBundle\Controller\AbstractFOSRestController;
18
use FOS\RestBundle\Controller\Annotations as Rest;
19
use FOS\RestBundle\Request\ParamFetcher;
20
use FOS\RestBundle\View\View;
21
use Symfony\Component\HttpFoundation\Request;
22
use FOS\RestBundle\Controller\Annotations\Route;
23
use Symfony\Component\HttpFoundation\Response;
24
use function _HumbugBox58fd4d9e2a25\Amp\Parallel\Worker\create;
0 ignored issues
show
introduced by
The function _HumbugBox58fd4d9e2a25\Amp\Parallel\Worker\create was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
25
26
/**
27
 * Class ResourceApiController.
28
 * RouteResource("Resource")
29
 *
30
 * debug api routes with: bin/console debug:router | grep api
31
 */
32
class ResourceApiController extends AbstractFOSRestController implements CourseControllerInterface
33
{
34
    use CourseControllerTrait;
35
    use ResourceControllerTrait;
36
    use ControllerTrait;
37
38
    /**
39
     * @Rest\View(serializerGroups={"list"})
40
     */
41
    public function getResourcesListAction($id, Request $request)
42
    {
43
        $repository = $this->getRepositoryFromRequest($request);
44
        $parentNode = $repository->getResourceNodeRepository()->find($id);
45
46
        $course = $this->getCourse();
47
        $session = $this->getSession();
48
49
        $this->denyAccessUnlessGranted(
50
            ResourceNodeVoter::VIEW,
51
            $parentNode,
52
            'Unauthorised access to resource'
53
        );
54
55
        /** @var QueryBuilder $qb */
56
        $qb = $repository->getResources($this->getUser(), $parentNode, $course, $session, null);
57
58
        return $qb->getQuery()->getResult();
59
    }
60
61
    /**
62
     * @Rest\View(serializerGroups={"list"})
63
     */
64
    public function getResourceAction($id, Request $request)
65
    {
66
        $repository = $this->getRepositoryFromRequest($request);
67
68
        /** @var AbstractResource $resource */
69
        $resource = $repository->getResourceFromResourceNode($id);
70
        $this->denyAccessUnlessValidResource($resource);
71
72
        return $resource;
73
    }
74
75
    /**
76
     * @Rest\QueryParam(name="orderBy", default="createdAt", nullable=true, description="Ordering")
77
     * @Rest\View(serializerGroups={"list"})
78
     */
79
    public function getResourceCommentsAction($id, Request $request, ParamFetcher $paramFetcher)
80
    {
81
        $repository = $this->getRepositoryFromRequest($request);
82
83
        /** @var AbstractResource $resource */
84
        $resource = $repository->getResourceFromResourceNode($id);
85
        $this->denyAccessUnlessValidResource($resource);
86
87
        $orderBy = $paramFetcher->get('orderBy');
88
        $criteria = Criteria::create()->orderBy([$orderBy => Criteria::DESC]);
89
90
        return $resource->getResourceNode()->getComments()->matching($criteria);
91
    }
92
93
    /**
94
     * @Rest\View(serializerGroups={"list"})
95
     */
96
    public function postResourceCommentAction($id, Request $request)
97
    {
98
        $repository = $this->getRepositoryFromRequest($request);
99
100
        /** @var AbstractResource $resource */
101
        $resource = $repository->getResourceFromResourceNode($id);
102
        $this->denyAccessUnlessValidResource($resource);
103
104
        $comment = new ResourceComment();
105
        $form = $this->createForm(ResourceCommentType::class, $comment, ['method' => 'POST']);
106
107
        $form->handleRequest($request);
108
        if ($form->isSubmitted() && $form->isValid()) {
109
            /** @var ResourceComment $comment */
110
            $comment = $form->getData();
111
            $comment->setAuthor($this->getUser());
112
            $resource->getResourceNode()->addComment($comment);
113
            $repository->getEntityManager()->persist($resource);
114
            $repository->getEntityManager()->flush();
115
116
            return View::create($comment, Response::HTTP_CREATED);
117
        }
118
    }
119
}
120