Completed
Pull Request — master (#102)
by Kristof
04:35
created

Projector::applyEventImportedFromUDB2()   B

Complexity

Conditions 3
Paths 3

Size

Total Lines 25
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 1
Metric Value
dl 0
loc 25
rs 8.8571
c 2
b 0
f 1
cc 3
eloc 14
nc 3
nop 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