ActivityLogger::handleLoggableChild()   A
last analyzed

Complexity

Conditions 4
Paths 2

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 3
nc 2
nop 3
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Locastic\Loggastic\Logger;
4
5
use Locastic\Loggastic\Bridge\Elasticsearch\Context\Traits\ElasticNormalizationContextTrait;
6
use Locastic\Loggastic\Enum\ActivityLogAction;
7
use Locastic\Loggastic\Event\PreDispatchActivityLogMessageEvent;
8
use Locastic\Loggastic\Loggable\LoggableChildInterface;
9
use Locastic\Loggastic\Message\CreateActivityLogMessage;
10
use Locastic\Loggastic\Message\DeleteActivityLogMessage;
11
use Locastic\Loggastic\Message\UpdateActivityLogMessage;
12
use Locastic\Loggastic\Message\UpdateActivityLogMessageInterface;
13
use Locastic\Loggastic\MessageDispatcher\ActivityLogMessageDispatcherInterface;
14
use Locastic\Loggastic\Metadata\LoggableContext\Factory\LoggableContextFactoryInterface;
15
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
16
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
17
18
final class ActivityLogger implements ActivityLoggerInterface
19
{
20
    use ElasticNormalizationContextTrait;
21
22
    public function __construct(
23
        private readonly ActivityLogMessageDispatcherInterface $activityLogMessageDispatcher,
24
        private readonly LoggableContextFactoryInterface $loggableContextFactory,
25
        private readonly NormalizerInterface $normalizer,
26
        private readonly EventDispatcherInterface $eventDispatcher
27
    ) {
28
    }
29
    public function logCreatedItem(object $item, ?string $actionName = null): void
30
    {
31
        $this->handleLoggableChild($item, $actionName);
32
33
        $message = new CreateActivityLogMessage($item, $actionName);
34
35
        $this->eventDispatcher->dispatch(PreDispatchActivityLogMessageEvent::create($message));
36
37
        $this->activityLogMessageDispatcher->dispatch($message);
38
    }
39
40
    public function logDeletedItem(object $item, $objectId, string $className, ?string $actionName = null): void
41
    {
42
        $this->handleLoggableChild($item, $actionName);
43
44
        $message = new DeleteActivityLogMessage($objectId, $className, $actionName);
45
46
        $this->eventDispatcher->dispatch(PreDispatchActivityLogMessageEvent::create($message));
47
48
        $this->activityLogMessageDispatcher->dispatch($message);
49
    }
50
51
    public function logUpdatedItem($item, ?string $actionName = null, bool $createLogWithoutChanges = false): void
52
    {
53
        $this->handleLoggableChild($item, $actionName, $createLogWithoutChanges);
54
55
        $message = new UpdateActivityLogMessage($item, $actionName, $createLogWithoutChanges);
56
        $this->handleUpdateActivityLogMessage($message);
57
    }
58
59
    private function handleLoggableChild(object $item, ?string $actionName = null, bool $createLogWithoutChanges = false): void
60
    {
61
        if ($item instanceof LoggableChildInterface && is_object($item->logTo())) {
62
            $childLoggableMessage = new UpdateActivityLogMessage($item->logTo(), $actionName ?: ActivityLogAction::EDITED, $createLogWithoutChanges);
63
            $this->handleUpdateActivityLogMessage($childLoggableMessage);
64
        }
65
    }
66
67
    private function handleUpdateActivityLogMessage(UpdateActivityLogMessageInterface $message): void
68
    {
69
        $context = $this->loggableContextFactory->create($message->getClassName());
70
        if (null === $context) {
71
            return;
72
        }
73
74
        $normalizedItem = $this->normalizer->normalize($message->getUpdatedItem(), 'activityLog', $this->getNormalizationContext($context));
75
        $message->setNormalizedItem($normalizedItem);
76
77
        $this->eventDispatcher->dispatch(PreDispatchActivityLogMessageEvent::create($message));
78
        $this->activityLogMessageDispatcher->dispatch($message);
79
    }
80
}
81