Passed
Push — master ( 72f3da...dcd5ef )
by Yannick
09:41
created

ResourceNodeRepository::getResourceFileUrl()   B

Complexity

Conditions 7
Paths 34

Size

Total Lines 38
Code Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 7
eloc 22
c 0
b 0
f 0
nc 34
nop 4
dl 0
loc 38
rs 8.6346
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\ResourceNode;
12
use Chamilo\CoreBundle\Entity\ResourceType;
13
use Chamilo\CoreBundle\Entity\Session;
14
use Chamilo\CoreBundle\ServiceHelper\AccessUrlHelper;
15
use Chamilo\CoreBundle\Settings\SettingsManager;
16
use Doctrine\ORM\EntityManagerInterface;
17
use Gedmo\Tree\Entity\Repository\MaterializedPathRepository;
18
use League\Flysystem\FilesystemOperator;
19
use Symfony\Component\Filesystem\Exception\FileNotFoundException;
20
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
21
use Symfony\Component\Routing\RouterInterface;
22
use Throwable;
23
use Vich\UploaderBundle\Storage\FlysystemStorage;
24
25
/**
26
 * @template-extends MaterializedPathRepository<ResourceNode>
27
 */
28
class ResourceNodeRepository extends MaterializedPathRepository
29
{
30
    protected FilesystemOperator $filesystem;
31
32
    public function __construct(
33
        private readonly EntityManagerInterface $manager,
34
        private readonly FlysystemStorage $storage,
35
        private readonly FilesystemOperator $resourceFilesystem,
36
        private readonly RouterInterface $router,
37
        private readonly AccessUrlHelper $accessUrlHelper,
38
        private readonly SettingsManager $settingsManager
39
    ) {
40
        $this->filesystem = $resourceFilesystem; // Asignar el filesystem correcto
41
        parent::__construct($manager, $manager->getClassMetadata(ResourceNode::class));
42
    }
43
44
    public function getFilename(ResourceFile $resourceFile): ?string
45
    {
46
        return $this->storage->resolveUri($resourceFile);
47
    }
48
49
    /*public function create(ResourceNode $node): void
50
     * {
51
     * $this->getEntityManager()->persist($node);
52
     * $this->getEntityManager()->flush();
53
     * }
54
     * public function update(ResourceNode $node, bool $andFlush = true): void
55
     * {
56
     * //$node->setUpdatedAt(new \DateTime());
57
     * $this->getEntityManager()->persist($node);
58
     * if ($andFlush) {
59
     * $this->getEntityManager()->flush();
60
     * }
61
     * }*/
62
    public function getFileSystem(): FilesystemOperator
63
    {
64
        return $this->filesystem;
65
    }
66
67
    public function getResourceNodeFileContent(ResourceNode $resourceNode, ?ResourceFile $resourceFile = null): string
68
    {
69
        try {
70
            $resourceFile ??= $resourceNode->getResourceFiles()->first();
71
72
            if ($resourceFile) {
73
                $fileName = $this->getFilename($resourceFile);
74
75
                return $this->getFileSystem()->read($fileName);
76
            }
77
78
            return '';
79
        } catch (Throwable $throwable) {
80
            throw new FileNotFoundException($resourceNode->getTitle());
81
        }
82
    }
83
84
    /**
85
     * @return false|resource
86
     */
87
    public function getResourceNodeFileStream(ResourceNode $resourceNode, ?ResourceFile $resourceFile = null)
88
    {
89
        try {
90
            $resourceFile ??= $resourceNode->getResourceFiles()->first();
91
92
            if ($resourceFile) {
93
                $fileName = $this->getFilename($resourceFile);
94
95
                return $this->getFileSystem()->readStream($fileName);
96
            }
97
98
            return false;
99
        } catch (Throwable $exception) {
100
            throw new FileNotFoundException($resourceNode->getTitle());
101
        }
102
    }
103
104
    public function getResourceFileUrl(?ResourceNode $resourceNode, array $extraParams = [], ?int $referenceType = null, ?ResourceFile $resourceFile = null): string
105
    {
106
        try {
107
            $file = $resourceFile ?? $resourceNode?->getResourceFiles()->first();
108
109
            if ($file) {
110
                $params = [
111
                    'tool' => $resourceNode->getResourceType()->getTool(),
0 ignored issues
show
Bug introduced by
The method getResourceType() does not exist on null. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

111
                    'tool' => $resourceNode->/** @scrutinizer ignore-call */ getResourceType()->getTool(),

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
112
                    'type' => $resourceNode->getResourceType(),
113
                    'id' => $resourceNode->getUuid(),
114
                ];
115
116
                if ($resourceFile) {
117
                    $params['resourceFileId'] = $resourceFile->getId();
118
                }
119
120
                if (!empty($extraParams)) {
121
                    $params = array_merge($params, $extraParams);
122
                }
123
124
                $referenceType ??= UrlGeneratorInterface::ABSOLUTE_PATH;
125
126
                $mode = $params['mode'] ?? 'view';
127
                // Remove mode from params and sent directly to the controller.
128
                unset($params['mode']);
129
130
                switch ($mode) {
131
                    case 'download':
132
                        return $this->router->generate('chamilo_core_resource_download', $params, $referenceType);
133
134
                    case 'view':
135
                        return $this->router->generate('chamilo_core_resource_view', $params, $referenceType);
136
                }
137
            }
138
139
            return '';
140
        } catch (Throwable $exception) {
141
            throw new FileNotFoundException($resourceNode->getTitle());
142
        }
143
    }
144
145
    /**
146
     * @todo filter files, check status
147
     */
148
    public function getSize(ResourceNode $resourceNode, ResourceType $type, ?Course $course = null, ?Session $session = null): int
149
    {
150
        $qb = $this->createQueryBuilder('node')
151
            ->select('SUM(file.size) as total')
152
            ->innerJoin('node.resourceFiles', 'file')
153
            ->innerJoin('node.resourceLinks', 'l')
154
            ->where('node.resourceType = :type')
155
            ->andWhere('node.parent = :parentNode')
156
            ->andWhere('file IS NOT NULL')
157
        ;
158
159
        $params = [];
160
        if (null !== $course) {
161
            $qb->andWhere('l.course = :course');
162
            $params['course'] = $course;
163
        }
164
        $params['parentNode'] = $resourceNode;
165
        $params['type'] = $type;
166
167
        $qb->setParameters($params);
168
169
        return (int) $qb->getQuery()->getSingleScalarResult();
170
    }
171
172
    public function findByResourceTypeAndCourse(string $type, Course $course): array
173
    {
174
        $qb = $this->createQueryBuilder('node');
175
176
        return $qb
177
            ->innerJoin('node.resourceType', 'resourceType')
178
            ->innerJoin('node.resourceLinks', 'resourceLinks')
179
            ->where($qb->expr()->eq('resourceType.title', ':resourceType'))
180
            ->andWhere($qb->expr()->eq('resourceLinks.course', ':course'))
181
            ->setParameters([
182
                'resourceType' => $type,
183
                'course' => $course,
184
            ])
185
            ->getQuery()
186
            ->getResult()
187
        ;
188
    }
189
}
190