Test Failed
Pull Request — master (#45)
by Daniel
07:55
created

TimestampedListener::loadClassMetadata()   A

Complexity

Conditions 4
Paths 5

Size

Total Lines 23
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 0
Metric Value
eloc 14
c 0
b 0
f 0
dl 0
loc 23
ccs 0
cts 5
cp 0
rs 9.7998
cc 4
nc 5
nop 1
crap 20
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\Mapping\ClassMetadataInfo;
17
use Doctrine\Persistence\Event\LifecycleEventArgs;
18
use Doctrine\Persistence\Event\LoadClassMetadataEventArgs;
19
use Doctrine\Persistence\ManagerRegistry;
20
use Silverback\ApiComponentBundle\Timestamped\TimestampedHelper;
21
use Silverback\ApiComponentBundle\Utility\ClassMetadataTrait;
22
23
/**
24
 * @author Daniel West <[email protected]>
25
 */
26 7
class TimestampedListener
27
{
28 7
    use ClassMetadataTrait;
29 7
30
    private TimestampedHelper $timestampedHelper;
31
32
    public function __construct(TimestampedHelper $timestampedHelper, ManagerRegistry $managerRegistry)
33 7
    {
34 7
        $this->timestampedHelper = $timestampedHelper;
35 7
        $this->initRegistry($managerRegistry);
36
    }
37
38
    public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs): void
39
    {
40
        /** @var ClassMetadataInfo $metadata */
41
        $metadata = $eventArgs->getClassMetadata();
42
        if (!$this->timestampedHelper->isTimestamped($metadata->getName())) {
43
            return;
44
        }
45
46
        $configuration = $this->timestampedHelper->getConfiguration($metadata->getName());
47
48
        if (!$metadata->hasField($configuration->createdAtField)) {
49
            $metadata->mapField([
50
                'fieldName' => $configuration->createdAtField,
51
                'type' => 'datetime_immutable',
52
                'nullable' => false,
53
            ]);
54
        }
55
56
        if (!$metadata->hasField($configuration->modifiedAtField)) {
57
            $metadata->mapField([
58
                'fieldName' => $configuration->modifiedAtField,
59
                'type' => 'datetime',
60
                'nullable' => false,
61
            ]);
62
        }
63
    }
64
65
    public function prePersist(LifecycleEventArgs $args): void
66
    {
67
        $this->setFields($args->getObject(), true);
68
    }
69
70
    public function preUpdate(LifecycleEventArgs $args): void
71
    {
72
        $this->setFields($args->getObject(), false);
73
    }
74
75
    private function setFields(object $timestamped, bool $isNew): void
76
    {
77
        if (!$this->timestampedHelper->isTimestamped($timestamped)) {
78
            return;
79
        }
80
81
        $config = $this->timestampedHelper->getConfiguration($timestamped);
82
        $classMetadata = $this->getClassMetadata($timestamped);
83
        $classMetadata->setFieldValue(
84
            $timestamped,
85
            $config->createdAtField,
86
            $isNew ?
87
                new \DateTimeImmutable() :
88
                $classMetadata->getFieldValue($timestamped, $config->createdAtField)
89
        );
90
        $classMetadata->setFieldValue($timestamped, $config->modifiedAtField, new \DateTime());
91
    }
92
}
93