MediaListener   A
last analyzed

Complexity

Total Complexity 15

Size/Duplication

Total Lines 122
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 8
Bugs 2 Features 1
Metric Value
eloc 52
dl 0
loc 122
rs 10
c 8
b 2
f 1
ccs 0
cts 63
cp 0
wmc 15

8 Methods

Rating   Name   Duplication   Size   Complexity  
A onVichUploaderPreUpload() 0 6 1
A preUpdate() 0 9 2
A onVichUploaderPostUpload() 0 25 2
A updatePaletteColor() 0 7 1
A checkIfThereIsAName() 0 4 3
A __construct() 0 16 1
A preRemove() 0 4 1
A checkIfNameEverExistInDatabase() 0 7 4
1
<?php
2
3
namespace PiedWeb\CMSBundle\EventListener;
4
5
use Doctrine\ORM\EntityManagerInterface;
6
use Doctrine\ORM\Event\PreUpdateEventArgs;
7
use League\ColorExtractor\Color;
8
use League\ColorExtractor\ColorExtractor;
9
use League\ColorExtractor\Palette;
10
use Liip\ImagineBundle\Imagine\Cache\CacheManager;
11
use PiedWeb\CMSBundle\Entity\MediaInterface;
12
use PiedWeb\CMSBundle\Service\MediaCacheGeneratorService;
13
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
14
use Symfony\Component\Filesystem\Filesystem;
15
use Symfony\Component\HttpKernel\KernelEvents;
16
use Vich\UploaderBundle\Event\Event;
17
18
class MediaListener
19
{
20
    protected $projectDir;
21
    protected $iterate = 1;
22
    protected $em;
23
    protected $eventDispatcher;
24
    protected $filesystem;
25
    protected $rootDir;
26
    protected $cacheManager;
27
    protected $cacheGenerator;
28
29
    public function __construct(
30
        string $projectDir,
31
        string $rootDir,
32
        EntityManagerInterface $em,
33
        CacheManager $cacheManager,
34
        EventDispatcherInterface $eventDispatcher,
35
        FileSystem $filesystem,
36
        MediaCacheGeneratorService $cacheGenerator
37
    ) {
38
        $this->projectDir = $projectDir;
39
        $this->em = $em;
40
        $this->cacheManager = $cacheManager;
41
        $this->eventDispatcher = $eventDispatcher;
42
        $this->filesystem = $filesystem;
43
        $this->rootDir = $rootDir;
44
        $this->cacheGenerator = $cacheGenerator;
45
    }
46
47
    /**
48
     * Check if name exist.
49
     */
50
    public function onVichUploaderPreUpload(Event $event)
51
    {
52
        $media = $event->getObject();
53
54
        $this->checkIfThereIsAName($media);
55
        $this->checkIfNameEverExistInDatabase($media);
56
    }
57
58
    /**
59
     * renameMediaOnMediaNameUpdate.
60
     */
61
    public function preUpdate(MediaInterface $media, PreUpdateEventArgs $event)
62
    {
63
        if ($event->hasChangedField('media')) {
64
            //var_dump($media->getRelativeDir().'/'.$media->getMediaBeforeUpdate()); exit;
65
            $this->filesystem->rename(
66
                $this->rootDir.'/../'.$media->getRelativeDir().'/'.$media->getMediaBeforeUpdate(),
67
                $this->rootDir.'/../'.$media->getRelativeDir().'/'.$media->getMedia()
68
            );
69
            $this->cacheManager->remove('/'.$media->getRelativeDir().'/'.$media->getMediaBeforeUpdate());
70
        }
71
    }
72
73
    public function preRemove(MediaInterface $media)
74
    {
75
        $this->filesystem->remove($this->rootDir.'/../'.$media->getRelativeDir().'/'.$media->getMedia());
76
        $this->cacheManager->remove('/'.$media->getRelativeDir().'/'.$media->getMediaBeforeUpdate());
77
    }
78
79
    /**
80
     * Si l'utilisateur ne propose pas de nom pour l'image,
81
     * on récupère celui d'origine duquel on enlève son extension.
82
     */
83
    protected function checkIfThereIsAName($media)
84
    {
85
        if (null === $media->getName() || empty($media->getName())) {
86
            $media->setName(preg_replace('/\\.[^.\\s]{3,4}$/', '', $media->getMediaFile()->getClientOriginalName()));
87
        }
88
    }
89
90
    protected function checkIfNameEverExistInDatabase($media)
91
    {
92
        $same = $this->em->getRepository(\get_class($media))->findOneBy(['name' => $media->getName()]);
93
        if ($same && (null == $media->getId() || $media->getId() != $same->getId())) {
94
            $media->setName(preg_replace('/\([0-9]+\)$/', '', $media->getName()).' ('.$this->iterate.')');
95
            ++$this->iterate;
96
            $this->checkIfNameEverExistInDatabase($media);
97
        }
98
    }
99
100
    /**
101
     * Update RelativeDir.
102
     */
103
    public function onVichUploaderPostUpload(Event $event)
104
    {
105
        $media = $event->getObject();
106
        $mapping = $event->getMapping();
107
108
        $absoluteDir = $mapping->getUploadDestination().'/'.$mapping->getUploadDir($media);
109
        $relativeDir = substr_replace($absoluteDir, '', 0, \strlen($this->projectDir) + 1);
110
111
        $media->setRelativeDir($relativeDir);
112
113
        if (false !== strpos($media->getMimeType(), 'image/')) {
114
            $this->updatePaletteColor($media);
115
116
            $this->cacheManager->remove($media->getFullPath());
117
118
            // Quick hack to have correct URI in image previewer
119
            // A better way would be to
120
            // implement https://github.com/liip/LiipImagineBundle/issues/242#issuecomment-71647135
121
            $path = '/'.$media->getRelativeDir().'/'.$media->getMedia();
122
            $this->cacheGenerator->storeImageInCache($path, $this->cacheGenerator->getBinary($path), 'default');
123
124
            $this->eventDispatcher->addListener(
125
                KernelEvents::TERMINATE,
126
                function () use ($media) {
127
                    $this->cacheGenerator->generateCache($media);
128
                }
129
            );
130
        }
131
    }
132
133
    protected function updatePaletteColor(MediaInterface $media)
134
    {
135
        $img = $this->projectDir.$media->getPath();
136
        $palette = Palette::fromFilename($img, Color::fromHexToInt('#FFFFFF'));
137
        $extractor = new ColorExtractor($palette);
138
        $colors = $extractor->extract();
139
        $media->setMainColor(Color::fromIntToHex($colors[0]));
140
    }
141
}
142