Passed
Push — master ( 7c4243...e861e2 )
by Julito
10:46
created

ResourceNodeRepository::getResourceFileUrl()   A

Complexity

Conditions 6
Paths 18

Size

Total Lines 31
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 19
c 0
b 0
f 0
nc 18
nop 3
dl 0
loc 31
rs 9.0111
1
<?php
2
3
declare(strict_types=1);
4
5
/* For licensing terms, see /license.txt */
6
7
namespace Chamilo\CoreBundle\Repository;
8
9
use Chamilo\CoreBundle\Entity\Course;
10
use Chamilo\CoreBundle\Entity\ResourceFile;
11
use Chamilo\CoreBundle\Entity\ResourceLink;
12
use Chamilo\CoreBundle\Entity\ResourceNode;
13
use Chamilo\CoreBundle\Entity\ResourceType;
14
use Chamilo\CoreBundle\Entity\Session;
15
use Doctrine\ORM\EntityManagerInterface;
16
use Gedmo\Tree\Entity\Repository\MaterializedPathRepository;
17
use League\Flysystem\FilesystemOperator;
18
use Symfony\Component\Filesystem\Exception\FileNotFoundException;
19
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
20
use Symfony\Component\Routing\RouterInterface;
21
use Throwable;
22
use Vich\UploaderBundle\Storage\FlysystemStorage;
23
24
class ResourceNodeRepository extends MaterializedPathRepository
25
{
26
    protected FlysystemStorage $storage;
27
    protected FilesystemOperator $filesystem;
28
    protected RouterInterface $router;
29
30
    public function __construct(EntityManagerInterface $manager, FlysystemStorage $storage, FilesystemOperator $resourceFilesystem, RouterInterface $router)
31
    {
32
        parent::__construct($manager, $manager->getClassMetadata(ResourceNode::class));
33
        $this->storage = $storage;
34
        // Flysystem mount name is saved in config/packages/oneup_flysystem.yaml
35
        $this->filesystem = $resourceFilesystem;
36
        $this->router = $router;
37
    }
38
39
    public function getFilename(ResourceFile $resourceFile): ?string
40
    {
41
        return $this->storage->resolveUri($resourceFile);
42
    }
43
44
    /*public function create(ResourceNode $node): void
45
    {
46
        $this->getEntityManager()->persist($node);
47
        $this->getEntityManager()->flush();
48
    }
49
50
    public function update(ResourceNode $node, $andFlush = true): void
51
    {
52
        //$node->setUpdatedAt(new \DateTime());
53
        $this->getEntityManager()->persist($node);
54
        if ($andFlush) {
55
            $this->getEntityManager()->flush();
56
        }
57
    }*/
58
59
    public function getFileSystem()
60
    {
61
        return $this->filesystem;
62
    }
63
64
    public function getResourceNodeFileContent(ResourceNode $resourceNode): string
65
    {
66
        try {
67
            if ($resourceNode->hasResourceFile()) {
68
                $resourceFile = $resourceNode->getResourceFile();
69
                $fileName = $this->getFilename($resourceFile);
70
71
                return $this->getFileSystem()->read($fileName);
72
            }
73
74
            return '';
75
        } catch (Throwable $throwable) {
76
            throw new FileNotFoundException($resourceNode->getTitle());
77
        }
78
    }
79
80
    /**
81
     * @return false|resource
82
     */
83
    public function getResourceNodeFileStream(ResourceNode $resourceNode)
84
    {
85
        try {
86
            if ($resourceNode->hasResourceFile()) {
87
                $resourceFile = $resourceNode->getResourceFile();
88
                $fileName = $this->getFilename($resourceFile);
89
90
                return $this->getFileSystem()->readStream($fileName);
91
            }
92
93
            return false;
94
        } catch (Throwable $exception) {
95
            throw new FileNotFoundException($resourceNode->getTitle());
96
        }
97
    }
98
99
    public function getResourceFileUrl(ResourceNode $resourceNode, array $extraParams = [], $referenceType = null): string
100
    {
101
        try {
102
            if ($resourceNode->hasResourceFile()) {
103
                $params = [
104
                    'tool' => $resourceNode->getResourceType()->getTool(),
105
                    'type' => $resourceNode->getResourceType(),
106
                    'id' => $resourceNode->getId(),
107
                ];
108
109
                if (!empty($extraParams)) {
110
                    $params = array_merge($params, $extraParams);
111
                }
112
113
                $referenceType ??= UrlGeneratorInterface::ABSOLUTE_PATH;
114
115
                $mode = $params['mode'] ?? 'view';
116
                // Remove mode from params and sent directly to the controller.
117
                unset($params['mode']);
118
119
                switch ($mode) {
120
                    case 'download':
121
                        return $this->router->generate('chamilo_core_resource_download', $params, $referenceType);
122
                    case 'view':
123
                        return $this->router->generate('chamilo_core_resource_view', $params, $referenceType);
124
                }
125
            }
126
127
            return '';
128
        } catch (Throwable $exception) {
129
            throw new FileNotFoundException($resourceNode->getTitle());
130
        }
131
    }
132
133
    /**
134
     * @todo filter files, check status
135
     */
136
    public function getSize(ResourceNode $resourceNode, ResourceType $type, Course $course = null, Session $session = null): int
137
    {
138
        $qb = $this->createQueryBuilder('node')
139
            ->select('SUM(file.size) as total')
140
            ->innerJoin('node.resourceFile', 'file')
141
            ->innerJoin('node.resourceLinks', 'l')
142
            ->where('node.resourceType = :type')
143
            ->andWhere('node.parent = :parentNode')
144
            ->andWhere('l.visibility <> :visibility')
145
            ->andWhere('file IS NOT NULL')
146
        ;
147
148
        $params = [];
149
        if (null !== $course) {
150
            $qb->andWhere('l.course = :course');
151
            $params['course'] = $course;
152
        }
153
        $params['visibility'] = ResourceLink::VISIBILITY_DELETED;
154
        $params['parentNode'] = $resourceNode;
155
        $params['type'] = $type;
156
157
        $qb->setParameters($params);
158
159
        return (int) $qb->getQuery()->getSingleScalarResult();
160
    }
161
}
162