Passed
Push — feature/publishable ( 5afc24...ce6968 )
by Daniel
30:22 queued 23:47
created

TimestampedListener::setFields()   A

Complexity

Conditions 3
Paths 2

Size

Total Lines 16
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 3.0052

Importance

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