Passed
Push — master ( 258428...ddae1a )
by Julito
11:33
created

AssetRepository::unZipFile()   B

Complexity

Conditions 6
Paths 10

Size

Total Lines 35
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 21
nc 10
nop 2
dl 0
loc 35
rs 8.9617
c 0
b 0
f 0
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\Component\Utils\CreateUploadedFile;
10
use Chamilo\CoreBundle\Entity\Asset;
11
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
12
use Doctrine\Persistence\ManagerRegistry;
13
use Exception;
14
use League\Flysystem\FilesystemOperator;
15
use PhpZip\ZipFile;
16
use Symfony\Component\HttpFoundation\File\UploadedFile;
17
use Symfony\Component\Routing\RouterInterface;
18
use Vich\UploaderBundle\Storage\FlysystemStorage;
19
use Vich\UploaderBundle\Templating\Helper\UploaderHelper;
20
21
class AssetRepository extends ServiceEntityRepository
22
{
23
    protected RouterInterface $router;
24
    protected UploaderHelper $uploaderHelper;
25
    protected FilesystemOperator $filesystem;
26
    protected FlysystemStorage $storage;
27
28
    public function __construct(ManagerRegistry $registry, RouterInterface $router, UploaderHelper $uploaderHelper, FilesystemOperator $assetFilesystem, FlysystemStorage $storage)
29
    {
30
        parent::__construct($registry, Asset::class);
31
        $this->router = $router;
32
        $this->uploaderHelper = $uploaderHelper;
33
        // Flysystem mount name is saved in config/packages/oneup_flysystem.yaml
34
        $this->filesystem = $assetFilesystem;
35
        $this->storage = $storage;
36
    }
37
38
    public function getStorage(): FlysystemStorage
39
    {
40
        return $this->storage;
41
    }
42
43
    public function getFileSystem(): FilesystemOperator
44
    {
45
        return $this->filesystem;
46
    }
47
48
    public function unZipFile(Asset $asset, string $addFolder = ''): void
49
    {
50
        $folder = '/'.$asset->getCategory().'/'.$asset->getTitle();
51
52
        if (!empty($addFolder)) {
53
            $folder .= '/'.$addFolder;
54
        }
55
56
        $fs = $this->getFileSystem();
57
        $file = $this->getStorage()->resolveUri($asset);
58
59
        if (!$fs->fileExists($file)) {
60
            throw new Exception('file not found');
61
        }
62
63
        $stream = $fs->readStream($file);
64
        $zipFile = new ZipFile();
65
        $zipFile->openFromStream($stream);
66
67
        $list = $zipFile->getEntries();
68
        foreach ($list as $item) {
69
            $name = $item->getName();
70
            error_log('final: '.$folder.'/'.$name);
71
            if ($fs->fileExists($folder.'/'.$name)) {
72
                continue;
73
            }
74
75
            if ($item->isDirectory()) {
76
                $fs->createDirectory($folder.'/'.$name);
77
78
                continue;
79
            }
80
81
            $content = $zipFile->getEntryContents($name);
82
            $fs->write($folder.'/'.$name, $content);
83
        }
84
    }
85
86
    public function getAssetContent(Asset $asset): string
87
    {
88
        if (!$asset->hasFile()) {
89
            return '';
90
        }
91
92
        $fs = $this->getFileSystem();
93
        $file = $this->getStorage()->resolveUri($asset);
94
95
        if (!$fs->fileExists($file)) {
96
            return '';
97
        }
98
99
        return $this->getFileSystem()->read($file);
100
    }
101
102
    public function getFolder(Asset $asset): ?string
103
    {
104
        if ($asset->hasFile()) {
105
            $file = $asset->getTitle();
106
107
            return '/'.$asset->getCategory().'/'.$file.'/';
108
        }
109
110
        return null;
111
    }
112
113
    public function getAssetUrl(Asset $asset): string
114
    {
115
        if (Asset::SCORM === $asset->getCategory()) {
116
            $params = [
117
                'category' => $asset->getCategory(),
118
                'path' => $asset->getTitle(),
119
            ];
120
121
            return $this->router->generate('chamilo_core_asset_showfile', $params);
122
        }
123
124
        // Classic.
125
        $helper = $this->uploaderHelper;
126
127
        $cropFilter = '';
128
        $crop = $asset->getCrop();
129
        if (!empty($crop)) {
130
            $cropFilter = '?crop='.$crop;
131
        }
132
133
        return '/assets'.$helper->asset($asset).$cropFilter;
134
    }
135
136
    public function createFromRequest(Asset $asset, array $file): Asset
137
    {
138
        if (isset($file['tmp_name']) && !empty($file['tmp_name'])) {
139
            $mimeType = mime_content_type($file['tmp_name']);
140
            $file = new UploadedFile($file['tmp_name'], $asset->getTitle(), $mimeType, null, true);
141
            $asset->setFile($file);
142
            $this->getEntityManager()->persist($asset);
143
            $this->getEntityManager()->flush();
144
        }
145
146
        return $asset;
147
    }
148
149
    public function createFromString(Asset $asset, string $mimeType, string $content): Asset
150
    {
151
        $file = CreateUploadedFile::fromString($asset->getTitle(), $mimeType, $content);
152
        $asset->setFile($file);
153
        $this->getEntityManager()->persist($asset);
154
        $this->getEntityManager()->flush();
155
156
        return $asset;
157
    }
158
159
    public function update(Asset $asset): void
160
    {
161
        $this->getEntityManager()->persist($asset);
162
        $this->getEntityManager()->flush();
163
    }
164
165
    public function delete(Asset $asset = null): void
166
    {
167
        if (null !== $asset) {
168
            $this->getEntityManager()->remove($asset);
169
            $this->getEntityManager()->flush();
170
        }
171
    }
172
}
173