Completed
Pull Request — master (#105)
by Kristof
13:40 queued 05:31
created

MediaManager::generateUrl()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 0
loc 8
rs 9.4286
c 1
b 0
f 0
cc 1
eloc 5
nc 1
nop 1
1
<?php
2
3
namespace CultuurNet\UDB3\Media;
4
5
use Broadway\Repository\RepositoryInterface;
6
use CultuurNet\UDB3\CommandHandling\Udb3CommandHandler;
7
use CultuurNet\UDB3\Iri\IriGeneratorInterface;
8
use CultuurNet\UDB3\Media\Commands\UploadImage;
9
use CultuurNet\UDB3\Media\Properties\MIMEType;
10
use League\Flysystem\FilesystemInterface;
11
use Psr\Log\LoggerAwareInterface;
12
use Psr\Log\LoggerAwareTrait;
13
use Psr\Log\NullLogger;
14
use Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser;
15
use ValueObjects\Identity\UUID;
16
use ValueObjects\String\String;
17
use ValueObjects\Web\Url;
18
19
class MediaManager extends Udb3CommandHandler implements LoggerAwareInterface, MediaManagerInterface
20
{
21
    use LoggerAwareTrait;
22
23
    /**
24
     * @var IriGeneratorInterface
25
     */
26
    protected $iriGenerator;
27
28
    /**
29
     * @var string
30
     */
31
    protected $mediaDirectory;
32
33
    /**
34
     * @var string
35
     */
36
    protected $uploadDirectory;
37
38
    /**
39
     * @var RepositoryInterface
40
     */
41
    protected $repository;
42
43
    /**
44
     * @var FilesystemInterface
45
     */
46
    protected $filesystem;
47
48
    public function __construct(
49
        IriGeneratorInterface $iriGenerator,
50
        RepositoryInterface $repository,
51
        FilesystemInterface $filesystem,
52
        $uploadDirectory,
53
        $mediaDirectory
54
    ) {
55
        $this->iriGenerator = $iriGenerator;
56
        $this->mediaDirectory = $mediaDirectory;
57
        $this->uploadDirectory = $uploadDirectory;
58
        $this->filesystem = $filesystem;
59
        $this->repository = $repository;
60
61
        // Avoid conditional log calls by setting a null logger by default.
62
        $this->setLogger(new NullLogger());
63
    }
64
65
    /**
66
     * {@inheritdoc}
67
     */
68
    public function create(UUID $fileId, MIMEType $fileType, String $description, String $copyrightHolder)
69
    {
70
        $mediaObject = MediaObject::create($fileId, $fileType, $description, $copyrightHolder);
71
72
        $this->repository->save($mediaObject);
73
74
        return $mediaObject;
75
    }
76
77
    private function generateUrl(MediaObject $mediaObject)
78
    {
79
        $extensionGuesser = ExtensionGuesser::getInstance();
80
        $fileExtension = $extensionGuesser->guess((string) $mediaObject->getMimeType());
81
        $fileId = $mediaObject->getFileId();
82
83
        return Url::fromNative($this->iriGenerator->iri($fileId.'.'.$fileExtension));
84
    }
85
86
    /**
87
     * {@inheritdoc}
88
     */
89
    public function handleUploadImage(UploadImage $uploadImage)
90
    {
91
        $fileId = $uploadImage->getFileId();
92
        $mimeType = $uploadImage->getMimeType();
93
        $extensionGuesser = ExtensionGuesser::getInstance();
94
        $extension = $extensionGuesser->guess((string) $mimeType);
95
        $fileName = (string) $uploadImage->getFileId().'.'.$extension;
96
97
        $this->filesystem->rename(
98
            $this->uploadDirectory.'/'.$fileName,
99
            $this->mediaDirectory.'/'.$fileName
100
        );
101
102
        $this->create(
103
            $fileId,
104
            $mimeType,
105
            $uploadImage->getDescription(),
106
            $uploadImage->getCopyrightHolder()
107
        );
108
109
        $jobInfo = ['file_id' => (string) $fileId];
110
        $this->logger->info('job_info', $jobInfo);
111
    }
112
113
    /**
114
     * {@inheritdoc}
115
     */
116
    public function get(UUID $fileId)
117
    {
118
        $mediaObject = $this->repository->load((string) $fileId);
119
        $mediaObject->setUrl($this->generateUrl($mediaObject));
0 ignored issues
show
Compatibility introduced by
$mediaObject of type object<Broadway\Domain\AggregateRoot> is not a sub-type of object<CultuurNet\UDB3\Media\MediaObject>. It seems like you assume a concrete implementation of the interface Broadway\Domain\AggregateRoot to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
120
121
        return $mediaObject;
122
    }
123
}
124