Completed
Push — master ( f93802...a3beff )
by Paweł
34:14
created

MediaFactory::create()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 10
ccs 0
cts 6
cp 0
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 6
nc 1
nop 3
crap 2
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Superdesk Web Publisher Content Bundle.
7
 *
8
 * Copyright 2016 Sourcefabric z.ú. and contributors.
9
 *
10
 * For the full copyright and license information, please see the
11
 * AUTHORS and LICENSE files distributed with this source code.
12
 *
13
 * @copyright 2016 Sourcefabric z.ú
14
 * @license http://www.superdesk.org/license
15
 */
16
17
namespace SWP\Bundle\ContentBundle\Factory\ORM;
18
19
use SWP\Bundle\ContentBundle\Doctrine\ImageRepositoryInterface;
20
use SWP\Bundle\ContentBundle\Model\ArticleMedia;
21
use SWP\Bundle\ContentBundle\Model\File;
22
use SWP\Bundle\ContentBundle\Model\Image;
23
use SWP\Bundle\ContentBundle\Model\ImageRendition;
24
use SWP\Bundle\ContentBundle\Factory\MediaFactoryInterface;
25
use SWP\Bundle\ContentBundle\Model\ArticleInterface;
26
use SWP\Bundle\ContentBundle\Model\ArticleMediaInterface;
27
use SWP\Bundle\ContentBundle\Model\FileInterface;
28
use SWP\Bundle\ContentBundle\Model\ImageInterface;
29
use SWP\Bundle\ContentBundle\Model\ImageRenditionInterface;
30
use SWP\Component\Bridge\Model\ItemInterface;
31
use SWP\Component\Bridge\Model\Rendition;
32
use SWP\Component\Common\Criteria\Criteria;
33
use Symfony\Component\HttpFoundation\File\UploadedFile;
34
35
class MediaFactory implements MediaFactoryInterface
36
{
37
    /**
38
     * @var ImageRepositoryInterface
39
     */
40
    protected $imageRepository;
41
42
    protected $mediaModelClass;
43
44
    /**
45
     * MediaFactory constructor.
46
     *
47
     * @param ImageRepositoryInterface $imageRepository
48
     */
49 8
    public function __construct(
50
        ImageRepositoryInterface $imageRepository,
51
        $mediaModelClass
52
    ) {
53 8
        $this->imageRepository = $imageRepository;
54 8
        $this->mediaModelClass = $mediaModelClass;
55 8
    }
56
57
    public function create(ArticleInterface $article, string $key, ItemInterface $item): ArticleMediaInterface
58
    {
59
        $articleMedia = new $this->mediaModelClass();
60
        $articleMedia->setArticle($article);
61
        $articleMedia->setFromItem($item);
62
63
        $articleMedia = $this->createImageMedia($articleMedia, $key, $item);
64
65
        return $articleMedia;
66
    }
67
68
    /**
69
     * {@inheritdoc}
70
     */
71
    public function createMediaAsset(UploadedFile $uploadedFile, string $assetId): FileInterface
72
    {
73
        $asset = $this->getProperObject($uploadedFile);
74
        $asset->setAssetId($assetId);
75
        $asset->setFileExtension($uploadedFile->guessClientExtension());
76
77
        return $asset;
78
    }
79
80
    /**
81
     * {@inheritdoc}
82
     */
83
    public function createImageRendition(
84
        ImageInterface $image,
85
        ArticleMediaInterface $articleMedia,
86
        string $key, Rendition $rendition
87
    ): ImageRenditionInterface {
88
        $imageRendition = new ImageRendition();
89
        $imageRendition->setImage($image);
90
        $imageRendition->setMedia($articleMedia);
91
        $imageRendition->setHeight($rendition->getHeight());
92
        $imageRendition->setWidth($rendition->getWidth());
93
        $imageRendition->setName($key);
94
95
        return $imageRendition;
96
    }
97
98
    /**
99
     * Handle Article Media with Image (add renditions, set mimetype etc.).
100
     *
101
     * @param ArticleMedia  $articleMedia
102
     * @param string        $key          unique key shared between media and image rendition
103
     * @param ItemInterface $item
104
     *
105
     * @return ArticleMedia
106
     */
107
    protected function createImageMedia(ArticleMedia $articleMedia, string $key, ItemInterface $item)
108
    {
109
        if (0 === $item->getRenditions()->count()) {
110
            return $articleMedia;
111
        }
112
113
        $originalRendition = $item->getRenditions()['original'];
114
        $criteria = new Criteria();
115
        $criteria->set('assetId', ArticleMedia::handleMediaId($originalRendition->getMedia()));
116
117
        $articleMedia->setMimetype($originalRendition->getMimetype());
118
        $articleMedia->setKey($key);
119
        $image = $this->imageRepository->getByCriteria($criteria, [])->getQuery()->getOneOrNullResult();
120
        $articleMedia->setImage($image);
121
122
        foreach ($item->getRenditions() as $key => $rendition) {
123
            $criteria->set('assetId', ArticleMedia::handleMediaId($rendition->getMedia()));
124
            $image = $this->imageRepository->getByCriteria($criteria, [])->getQuery()->getOneOrNullResult();
125
            if (null === $image) {
126
                continue;
127
            }
128
129
            $imageRendition = $image->getRendition();
130
            if (null === $image->getRendition()) {
131
                $imageRendition = $this->createImageRendition($image, $articleMedia, $key, $rendition);
132
                $this->imageRepository->persist($imageRendition);
133
            }
134
135
            $articleMedia->addRendition($imageRendition);
136
        }
137
138
        return $articleMedia;
139
    }
140
141
    protected function getProperObject(UploadedFile $uploadedFile)
142
    {
143
        if (in_array(exif_imagetype($uploadedFile->getRealPath()), [
144
            IMAGETYPE_GIF,
145
            IMAGETYPE_JPEG,
146
            IMAGETYPE_PNG,
147
            IMAGETYPE_BMP,
148
        ])) {
149
            return new Image();
150
        }
151
152
        return new File();
153
    }
154
}
155