Passed
Push — master ( 9ac6fa...c6fd81 )
by Julito
10:12
created

AssetRepository::createFromString()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

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