Passed
Pull Request — master (#50)
by Daniel
08:24
created

MediaObjectListener::loadClassMetadata()   B

Complexity

Conditions 6
Paths 7

Size

Total Lines 43
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 4
CRAP Score 27.8133

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 26
c 1
b 0
f 0
dl 0
loc 43
ccs 4
cts 26
cp 0.1538
rs 8.8817
cc 6
nc 7
nop 1
crap 27.8133
1
<?php
2
3
/*
4
 * This file is part of the Silverback API Component Bundle Project
5
 *
6
 * (c) Daniel West <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
declare(strict_types=1);
13
14
namespace Silverback\ApiComponentBundle\EventListener\Doctrine;
15
16
use Doctrine\ORM\EntityManagerInterface;
17
use Doctrine\ORM\Mapping\ClassMetadataInfo;
18
use Doctrine\Persistence\Event\LoadClassMetadataEventArgs;
19
use Silverback\ApiComponentBundle\Exception\OutOfBoundsException;
20
use Silverback\ApiComponentBundle\Helper\MediaObjectHelper;
21
use Silverback\ApiComponentBundle\Helper\UploadableHelper;
22
23
/**
24
 * Configures mapping between Uploadable and MediaObject resources.
25
 *
26
 * @author Daniel West <[email protected]>
27
 */
28
class MediaObjectListener
29
{
30
    private MediaObjectHelper $mediaObjectHelper;
31
    private UploadableHelper $uploadableHelper;
32
33 9
    public function __construct(MediaObjectHelper $mediaObjectHelper, UploadableHelper $uploadableHelper)
34
    {
35 9
        $this->mediaObjectHelper = $mediaObjectHelper;
36 9
        $this->uploadableHelper = $uploadableHelper;
37 9
    }
38
39 9
    public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs): void
40
    {
41
        /** @var ClassMetadataInfo $mediaObjectClassMetadata */
42 9
        $mediaObjectClassMetadata = $eventArgs->getClassMetadata();
43 9
        if (!$this->mediaObjectHelper->isConfigured($mediaObjectClassMetadata->getName())) {
44 9
            return;
45
        }
46
47
        $mediaObjectConfiguration = $this->mediaObjectHelper->getConfiguration($mediaObjectClassMetadata->getName());
48
        if (!$this->uploadableHelper->isConfigured($mediaObjectConfiguration->uploadableEntityClass)) {
49
            throw new OutOfBoundsException('The value of uploadableEntityClass on your MediaObject is not configured as an Uploadable resource');
50
        }
51
52
        $uploadableConfiguration = $this->uploadableHelper->getConfiguration($mediaObjectConfiguration->uploadableEntityClass);
53
54
        $em = $eventArgs->getObjectManager();
55
        if (!$em instanceof EntityManagerInterface) {
56
            return;
57
        }
58
        /** @var ClassMetadataInfo $mediaObjectClassMetadata */
59
        $uploadableClassMetadata = $em->getClassMetadata($mediaObjectConfiguration->uploadableEntityClass);
60
        $namingStrategy = $em->getConfiguration()->getNamingStrategy();
61
62
        if (!$mediaObjectClassMetadata->hasAssociation($mediaObjectConfiguration->uploadableEntityClass)) {
63
            $mediaObjectClassMetadata->mapManyToOne([
64
                'fieldName' => $mediaObjectConfiguration->uploadableFieldName,
65
                'targetEntity' => $mediaObjectConfiguration->uploadableEntityClass,
66
                'joinColumns' => [
67
                    [
68
                        'name' => $namingStrategy->joinKeyColumnName($uploadableClassMetadata->getName()),
69
                        'referencedColumnName' => $namingStrategy->referenceColumnName(),
70
                        'onDelete' => 'SET NULL',
71
                    ],
72
                ],
73
                'inversedBy' => $uploadableConfiguration->fieldName,
74
            ]);
75
        }
76
77
        if (!$mediaObjectClassMetadata->hasAssociation($uploadableConfiguration->fieldName)) {
78
            $mediaObjectClassMetadata->mapOneToMany([
79
                'fieldName' => $uploadableConfiguration->fieldName,
80
                'targetEntity' => $mediaObjectClassMetadata->getName(),
81
                'mappedBy' => $mediaObjectConfiguration->uploadableEntityClass,
82
            ]);
83
        }
84
    }
85
}
86