Completed
Push — master ( 13dd2e...a1a590 )
by Julito
20:58
created

ResolveResourceFileContentUrlSubscriber   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 62
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 33
c 2
b 0
f 0
dl 0
loc 62
rs 10
wmc 14

3 Methods

Rating   Name   Duplication   Size   Complexity  
A getSubscribedEvents() 0 4 1
A __construct() 0 4 1
C onPreSerialize() 0 44 12
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
namespace Chamilo\CoreBundle\EventSubscriber;
6
7
use ApiPlatform\Core\EventListener\EventPriorities;
8
use ApiPlatform\Core\Util\RequestAttributesExtractor;
9
use Chamilo\CoreBundle\Entity\AbstractResource;
10
use Chamilo\CoreBundle\Repository\ResourceNodeRepository;
11
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
12
use Symfony\Component\HttpFoundation\Response;
13
use Symfony\Component\HttpKernel\Event\ViewEvent;
14
use Symfony\Component\HttpKernel\KernelEvents;
15
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
16
17
class ResolveResourceFileContentUrlSubscriber implements EventSubscriberInterface
18
{
19
    private $generator;
20
    private $resourceNodeRepository;
21
22
    public function __construct(UrlGeneratorInterface $generator, ResourceNodeRepository $resourceNodeRepository)
23
    {
24
        $this->generator = $generator;
25
        $this->resourceNodeRepository = $resourceNodeRepository;
26
    }
27
28
    public static function getSubscribedEvents(): array
29
    {
30
        return [
31
            KernelEvents::VIEW => ['onPreSerialize', EventPriorities::PRE_SERIALIZE],
32
        ];
33
    }
34
35
    public function onPreSerialize(ViewEvent $event): void
36
    {
37
        $controllerResult = $event->getControllerResult();
38
        $request = $event->getRequest();
39
40
        if ($controllerResult instanceof Response || !$request->attributes->getBoolean('_api_respond', true)) {
41
            return;
42
        }
43
        $attributes = RequestAttributesExtractor::extractAttributes($request);
44
45
        if (!($attributes = RequestAttributesExtractor::extractAttributes($request)) ||
46
            //!\is_a($attributes['resource_class'], ResourceFile::class, true)
47
            !\is_a($attributes['resource_class'], AbstractResource::class, true)
48
        ) {
49
            return;
50
        }
51
        $mediaObjects = $controllerResult;
52
53
        if (!is_iterable($mediaObjects)) {
54
            $mediaObjects = [$mediaObjects];
55
        }
56
        //error_log($request->get('getFile'));
57
        $getFile = $request->get('getFile');
58
        //$getFile = true;
59
        foreach ($mediaObjects as $mediaObject) {
60
            if (!$mediaObject instanceof AbstractResource) {
61
                continue;
62
            }
63
            if ($mediaObject->hasResourceNode()) {
64
                $resourceNode = $mediaObject->getResourceNode();
65
66
                $params = [
67
                    'id' => $resourceNode->getId(),
68
                    'tool' => $resourceNode->getResourceType()->getTool()->getName(),
69
                    'type' => $resourceNode->getResourceType()->getName(),
70
                ];
71
72
                $mediaObject->contentUrl = $this->generator->generate('chamilo_core_resource_view_file', $params);
73
74
                if ($getFile &&
75
                    $resourceNode->hasResourceFile() &&
76
                    $resourceNode->hasEditableContent()
77
                ) {
78
                    $mediaObject->contentFile = $this->resourceNodeRepository->getResourceNodeFileContent($resourceNode);
79
                }
80
            }
81
        }
82
    }
83
}
84