Passed
Pull Request — master (#50)
by Daniel
10:36 queued 02:25
created

FileListener   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 64
Duplicated Lines 0 %

Test Coverage

Coverage 22.86%

Importance

Changes 0
Metric Value
wmc 7
eloc 38
c 0
b 0
f 0
dl 0
loc 64
ccs 8
cts 35
cp 0.2286
rs 10

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
B loadClassMetadata() 0 53 6
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\FileHelper;
21
use Silverback\ApiComponentBundle\Helper\UploadsHelper;
22
23
/**
24
 * Configures mapping between Uploads and MediaObject resources.
25
 *
26
 * @author Daniel West <[email protected]>
27
 */
28
class FileListener
29
{
30
    private FileHelper $mediaObjectHelper;
31
    private UploadsHelper $uploadsHelper;
32
33 9
    public function __construct(FileHelper $mediaObjectHelper, UploadsHelper $uploadsHelper)
34
    {
35 9
        $this->mediaObjectHelper = $mediaObjectHelper;
36 9
        $this->uploadsHelper = $uploadsHelper;
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->uploadsHelper->isConfigured($mediaObjectConfiguration->uploadsEntityClass)) {
49
            throw new OutOfBoundsException('The value of uploadsEntityClass on your MediaObject is not configured as an Uploads resource');
50
        }
51
52
        $uploadsConfiguration = $this->uploadsHelper->getConfiguration($mediaObjectConfiguration->uploadsEntityClass);
53
54
        $em = $eventArgs->getObjectManager();
55
        if (!$em instanceof EntityManagerInterface) {
56
            return;
57
        }
58
        /** @var ClassMetadataInfo $mediaObjectClassMetadata */
59
        $uploadsClassMetadata = $em->getClassMetadata($mediaObjectConfiguration->uploadsEntityClass);
60
        $namingStrategy = $em->getConfiguration()->getNamingStrategy();
61
62
        if (!$mediaObjectClassMetadata->hasAssociation($mediaObjectConfiguration->uploadsEntityClass)) {
63
            $mediaObjectClassMetadata->mapField([
64
                'fieldName' => $mediaObjectConfiguration->filePathFieldName,
65
                'nullable' => false,
66
            ]);
67
            $mediaObjectClassMetadata->mapField([
68
                'fieldName' => $mediaObjectConfiguration->temporaryFieldName,
69
                'type' => 'boolean',
70
                'nullable' => false,
71
            ]);
72
73
            $mediaObjectClassMetadata->mapManyToOne([
74
                'fieldName' => $mediaObjectConfiguration->uploadsFieldName,
75
                'targetEntity' => $mediaObjectConfiguration->uploadsEntityClass,
76
                'joinColumns' => [
77
                    [
78
                        'name' => $namingStrategy->joinKeyColumnName($uploadsClassMetadata->getName()),
79
                        'referencedColumnName' => $namingStrategy->referenceColumnName(),
80
                        'onDelete' => 'SET NULL',
81
                    ],
82
                ],
83
                'inversedBy' => $uploadsConfiguration->fieldName,
84
            ]);
85
        }
86
87
        if (!$mediaObjectClassMetadata->hasAssociation($uploadsConfiguration->fieldName)) {
88
            $mediaObjectClassMetadata->mapOneToMany([
89
                'fieldName' => $uploadsConfiguration->fieldName,
90
                'targetEntity' => $mediaObjectClassMetadata->getName(),
91
                'mappedBy' => $mediaObjectConfiguration->uploadsEntityClass,
92
            ]);
93
        }
94
    }
95
}
96