Completed
Push — master ( 9ea25e...b0fe89 )
by Kristof
06:49
created

Projector   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 95
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 11

Importance

Changes 4
Bugs 0 Features 2
Metric Value
wmc 8
c 4
b 0
f 2
lcom 1
cbo 11
dl 0
loc 95
rs 10

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 7 1
B applyEventImportedFromUDB2() 0 25 3
B applyEventCreatedFromCdbXml() 0 33 3
A applyEventCreated() 0 12 1
1
<?php
2
3
namespace CultuurNet\UDB3\Event\ReadModel\Permission;
4
5
use Broadway\Domain\DomainMessage;
6
use Broadway\EventHandling\EventListenerInterface;
7
use CultuurNet\UDB3\Cdb\CreatedByToUserIdResolverInterface;
8
use CultuurNet\UDB3\Cdb\EventItemFactory;
9
use CultuurNet\UDB3\Event\Events\EventCreated;
10
use CultuurNet\UDB3\Event\Events\EventCreatedFromCdbXml;
11
use CultuurNet\UDB3\Event\Events\EventImportedFromUDB2;
12
use CultuurNet\UDB3\EventHandling\DelegateEventHandlingToSpecificMethodTrait;
13
use ValueObjects\String\String;
14
15
class Projector implements EventListenerInterface
16
{
17
    use DelegateEventHandlingToSpecificMethodTrait;
18
19
    /**
20
     * @var CreatedByToUserIdResolverInterface
21
     */
22
    private $userIdResolver;
23
24
    /**
25
     * @var PermissionRepositoryInterface
26
     */
27
    private $permissionRepository;
28
29
    public function __construct(
30
        PermissionRepositoryInterface $permissionRepository,
31
        CreatedByToUserIdResolverInterface $createdByToUserIdResolver
32
    ) {
33
        $this->userIdResolver = $createdByToUserIdResolver;
34
        $this->permissionRepository = $permissionRepository;
35
    }
36
37
    protected function applyEventImportedFromUDB2(
38
        EventImportedFromUDB2 $eventImportedFromUDB2
39
    ) {
40
        $cdbEvent = EventItemFactory::createEventFromCdbXml(
41
            $eventImportedFromUDB2->getCdbXmlNamespaceUri(),
42
            $eventImportedFromUDB2->getCdbXml()
43
        );
44
45
        $createdByIdentifier = $cdbEvent->getCreatedBy();
46
47
        if ($createdByIdentifier) {
48
            $ownerId = $this->userIdResolver->resolveCreatedByToUserId(
49
                new String($createdByIdentifier)
50
            );
51
52
            if (!$ownerId) {
53
                return;
54
            }
55
56
            $this->permissionRepository->markEventEditableByUser(
57
                new String($eventImportedFromUDB2->getEventId()),
58
                $ownerId
59
            );
60
        }
61
    }
62
63
    protected function applyEventCreatedFromCdbXml(
64
        EventCreatedFromCdbXml $eventCreatedFromCdbXml,
65
        DomainMessage $domainMessage
66
    ) {
67
        $cdbEvent = EventItemFactory::createEventFromCdbXml(
68
            $eventCreatedFromCdbXml->getCdbXmlNamespaceUri(),
69
            $eventCreatedFromCdbXml->getEventXmlString()->toEventXmlString()
70
        );
71
72
        $createdByIdentifier = $cdbEvent->getCreatedBy();
73
74
        // By default the owner is the user who was authenticated when creating
75
        // the event.
76
        $metadata = $domainMessage->getMetadata()->serialize();
77
        $ownerId = new String($metadata['user_id']);
78
79
        // If createdby is supplied, consider the user identified by createdby
80
        // as the owner.
81
        if ($createdByIdentifier) {
82
            $ownerId = $this->userIdResolver->resolveCreatedByToUserId(
83
                new String($createdByIdentifier)
84
            );
85
        }
86
87
        if (!$ownerId) {
88
            return;
89
        }
90
91
        $this->permissionRepository->markEventEditableByUser(
92
            $eventCreatedFromCdbXml->getEventId(),
93
            $ownerId
94
        );
95
    }
96
97
    protected function applyEventCreated(
98
        EventCreated $eventCreated,
99
        DomainMessage $domainMessage
100
    ) {
101
        $metadata = $domainMessage->getMetadata()->serialize();
102
        $ownerId = new String($metadata['user_id']);
103
104
        $this->permissionRepository->markEventEditableByUser(
105
            new String($eventCreated->getEventId()),
106
            $ownerId
107
        );
108
    }
109
}
110