Passed
Push — master ( 3e71cc...8cb8bb )
by Julito
09:43
created

AssetRepository::getFolder()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 4
c 1
b 0
f 0
nc 2
nop 1
dl 0
loc 9
rs 10
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
namespace Chamilo\CoreBundle\Repository;
6
7
use Chamilo\CoreBundle\Entity\Asset;
8
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
9
use Doctrine\Persistence\ManagerRegistry;
10
use League\Flysystem\FilesystemInterface;
11
use League\Flysystem\MountManager;
12
use League\Flysystem\ZipArchive\ZipArchiveAdapter;
13
use Symfony\Component\Filesystem\Exception\FileNotFoundException;
14
use Symfony\Component\Routing\RouterInterface;
15
use Vich\UploaderBundle\Templating\Helper\UploaderHelper;
16
17
class AssetRepository extends ServiceEntityRepository
18
{
19
    protected $mountManager;
20
    protected $storage;
21
    protected $router;
22
    protected $uploaderHelper;
23
24
    public function __construct(ManagerRegistry $registry, RouterInterface $router, MountManager $mountManager, UploaderHelper $uploaderHelper)
25
    {
26
        parent::__construct($registry, Asset::class);
27
        $this->router = $router;
28
        $this->mountManager = $mountManager;
29
        $this->uploaderHelper = $uploaderHelper;
30
    }
31
32
    /**
33
     * @return FilesystemInterface
34
     */
35
    public function getFileSystem()
36
    {
37
        // Flysystem mount name is saved in config/packages/oneup_flysystem.yaml
38
        return $this->mountManager->getFilesystem('assets_fs');
39
    }
40
41
    /*public function getUploaderHelper(): UploaderHelper
42
    {
43
        return $this->uploaderHelper;
44
    }*/
45
46
    public function unZipFile(Asset $asset, ZipArchiveAdapter $zipArchiveAdapter)
47
    {
48
        $folder = '/'.$asset->getCategory().'/'.$asset->getTitle();
49
50
        $fs = $this->getFileSystem();
51
        if ($fs->has($folder)) {
52
            $contents = $zipArchiveAdapter->listContents();
53
            foreach ($contents as $data) {
54
                if ($fs->has($folder.'/'.$data['path'])) {
55
                    continue;
56
                }
57
58
                if ('dir' === $data['type']) {
59
                    $fs->createDir($folder.'/'.$data['path']);
60
                    continue;
61
                }
62
63
                $fs->write($folder.'/'.$data['path'], $zipArchiveAdapter->read($data['path']));
64
            }
65
        }
66
    }
67
68
    public function getFolder(Asset $asset): ?string
69
    {
70
        if ($asset->hasFile()) {
71
            $file = $asset->getTitle();
72
73
            return '/'.$asset->getCategory().'/'.$file.'/';
74
        }
75
76
        return null;
77
    }
78
79
    public function getAssetUrl(Asset $asset)
80
    {
81
        if (Asset::SCORM === $asset->getCategory()) {
82
            return $this->router->generate(
83
                'chamilo_core_asset_showfile',
84
                ['category' => $asset->getCategory(), 'path' => $asset->getTitle()]
85
            );
86
        }
87
88
        // Classic
89
90
        $helper = $this->uploaderHelper;
91
92
        return '/assets'.$helper->asset($asset);
93
    }
94
95
    public function getFileContent(Asset $asset): string
96
    {
97
        try {
98
            if ($asset->hasFile()) {
99
                $file = $asset->getFile();
100
                $fileName = $this->getFilename($file);
101
102
                return $this->getFileSystem()->read($fileName);
103
            }
104
105
            return '';
106
        } catch (\Throwable $exception) {
107
            throw new FileNotFoundException($asset);
108
        }
109
    }
110
111
    public function getFileStream(Asset $asset)
112
    {
113
        try {
114
            if ($asset->hasFile()) {
115
                $file = $asset->getFile();
116
                $fileName = $this->getFilename($file);
117
118
                return $this->getFileSystem()->readStream($fileName);
119
            }
120
121
            return '';
122
        } catch (\Throwable $exception) {
123
            throw new FileNotFoundException($asset);
124
        }
125
    }
126
127
    public function delete(Asset $asset = null)
128
    {
129
        if ($asset) {
130
            $this->getEntityManager()->remove($asset);
131
            $this->getEntityManager()->flush();
132
        }
133
    }
134
}
135