Passed
Push — master ( 45d699...d5e463 )
by Julito
12:21
created

getResourceNodeFileStream()   A

Complexity

Conditions 3
Paths 6

Size

Total Lines 13
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 8
c 0
b 0
f 0
nc 6
nop 1
dl 0
loc 13
rs 10
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
namespace Chamilo\CoreBundle\Repository;
6
7
use Chamilo\CoreBundle\Entity\Course;
8
use Chamilo\CoreBundle\Entity\Resource\ResourceFile;
9
use Chamilo\CoreBundle\Entity\Resource\ResourceLink;
10
use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
11
use Chamilo\CoreBundle\Entity\Resource\ResourceType;
12
use Chamilo\CoreBundle\Entity\Session;
13
use Doctrine\ORM\EntityManagerInterface;
14
use Gedmo\Tree\Entity\Repository\MaterializedPathRepository;
15
use League\Flysystem\MountManager;
16
use Symfony\Component\Filesystem\Exception\FileNotFoundException;
17
use Vich\UploaderBundle\Storage\FlysystemStorage;
18
19
/**
20
 * Class ResourceNodeRepository.
21
 */
22
class ResourceNodeRepository extends MaterializedPathRepository
23
{
24
    protected $mountManager;
25
    protected $storage;
26
27
    public function __construct(EntityManagerInterface $manager, FlysystemStorage $storage, MountManager $mountManager)
28
    {
29
        parent::__construct($manager, $manager->getClassMetadata(ResourceNode::class));
30
        $this->storage = $storage;
31
        $this->mountManager = $mountManager;
32
    }
33
34
    public function getFilename(ResourceFile $resourceFile)
35
    {
36
        return $this->storage->resolveUri($resourceFile);
37
    }
38
39
    /**
40
     * @return \League\Flysystem\FilesystemInterface
41
     */
42
    public function getFileSystem()
43
    {
44
        // Flysystem mount name is saved in config/packages/oneup_flysystem.yaml @todo add it as a service.
45
        $this->fs = $this->mountManager->getFilesystem('resources_fs');
0 ignored issues
show
Bug Best Practice introduced by
The property fs does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
46
47
        return $this->fs;
48
    }
49
50
    public function getResourceNodeFileContent(ResourceNode $resourceNode): string
51
    {
52
        try {
53
            if ($resourceNode->hasResourceFile()) {
54
                $resourceFile = $resourceNode->getResourceFile();
55
                $fileName = $this->getFilename($resourceFile);
56
57
                return $this->getFileSystem()->read($fileName);
58
            }
59
60
            return '';
61
        } catch (\Throwable $exception) {
62
            throw new FileNotFoundException($resourceNode);
63
        }
64
    }
65
66
    public function getResourceNodeFileStream(ResourceNode $resourceNode)
67
    {
68
        try {
69
            if ($resourceNode->hasResourceFile()) {
70
                $resourceFile = $resourceNode->getResourceFile();
71
                $fileName = $this->getFilename($resourceFile);
72
73
                return $this->getFileSystem()->readStream($fileName);
74
            }
75
76
            return '';
77
        } catch (\Throwable $exception) {
78
            throw new FileNotFoundException($resourceNode);
79
        }
80
    }
81
82
    /**
83
     * @todo filter files, check status
84
     */
85
    public function getSize(ResourceNode $resourceNode, ResourceType $type, Course $course = null, Session $session = null): int
86
    {
87
        $qb = $this->createQueryBuilder('node')
88
            ->select('SUM(file.size) as total')
89
            ->innerJoin('node.resourceFile', 'file')
90
            ->innerJoin('node.resourceLinks', 'l')
91
            ->where('node.resourceType = :type')
92
            ->setParameter('type', $type)
93
            ->andWhere('node.parent = :parentNode')
94
            ->setParameter('parentNode', $resourceNode)
95
            ->andWhere('file IS NOT NULL')
96
            ->andWhere('l.visibility <> :visibility')
97
            ->setParameter('visibility', ResourceLink::VISIBILITY_DELETED)
98
        ;
99
100
        if ($course) {
101
            $qb
102
                ->andWhere('l.course = :course')
103
                ->setParameter('course', $course);
104
        }
105
106
        return (int) $qb->getQuery()->getSingleScalarResult();
107
    }
108
}
109