Completed
Pull Request — master (#345)
by
unknown
05:39
created

OrganizerCommandHandler::createOrganizer()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 11
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 7
nc 1
nop 1
1
<?php
2
3
namespace CultuurNet\UDB3\Organizer;
4
5
use Broadway\CommandHandling\CommandHandlerInterface;
6
use Broadway\Repository\RepositoryInterface;
7
use CultuurNet\UDB3\Label;
8
use CultuurNet\UDB3\Label\ValueObjects\Visibility;
9
use CultuurNet\UDB3\Organizer\Commands\AbstractLabelCommand;
10
use CultuurNet\UDB3\Organizer\Commands\AddLabel;
11
use CultuurNet\UDB3\Organizer\Commands\CreateOrganizer;
12
use CultuurNet\UDB3\Organizer\Commands\DeleteOrganizer;
13
use CultuurNet\UDB3\Organizer\Commands\RemoveLabel;
14
use CultuurNet\UDB3\Organizer\Commands\UpdateAddress;
15
use CultuurNet\UDB3\Organizer\Commands\UpdateContactPoint;
16
use CultuurNet\UDB3\Organizer\Commands\UpdateTitle;
17
use CultuurNet\UDB3\Organizer\Commands\UpdateWebsite;
18
use ValueObjects\StringLiteral\StringLiteral;
19
use CultuurNet\UDB3\Label\ReadModels\JSON\Repository\ReadRepositoryInterface;
20
21
class OrganizerCommandHandler implements CommandHandlerInterface
22
{
23
    /**
24
     * @var RepositoryInterface
25
     */
26
    private $organizerRepository;
27
28
    /**
29
     * @var ReadRepositoryInterface
30
     */
31
    private $labelRepository;
32
33
    /**
34
     * @var OrganizerRelationServiceInterface[]
35
     */
36
    private $organizerRelationServices;
37
38
    /**
39
     * @param RepositoryInterface $organizerRepository
40
     * @param ReadRepositoryInterface $labelRepository
41
     */
42
    public function __construct(
43
        RepositoryInterface $organizerRepository,
44
        ReadRepositoryInterface $labelRepository
45
    ) {
46
        $this->organizerRepository = $organizerRepository;
47
        $this->labelRepository = $labelRepository;
48
        $this->organizerRelationServices = [];
49
    }
50
51
    /**
52
     * @param OrganizerRelationServiceInterface $relationService
53
     * @return OrganizerCommandHandler
54
     */
55
    public function withOrganizerRelationService(OrganizerRelationServiceInterface $relationService)
56
    {
57
        $c = clone $this;
58
        $c->organizerRelationServices[] = $relationService;
59
        return $c;
60
    }
61
62
    /**
63
     * @return array
64
     */
65
    protected function getCommandHandlerMethods()
66
    {
67
        return [
68
            CreateOrganizer::class => 'createOrganizer',
69
            UpdateWebsite::class => 'updateWebsite',
70
            UpdateTitle::class => 'updateTitle',
71
            UpdateAddress::class => 'updateAddress',
72
            UpdateContactPoint::class => 'updateContactPoint',
73
            DeleteOrganizer::class => 'deleteOrganizer',
74
            AddLabel::class => 'addLabel',
75
            RemoveLabel::class => 'removeLabel',
76
        ];
77
    }
78
79
    /**
80
     * @param mixed $command
81
     */
82
    public function handle($command)
83
    {
84
        $class = get_class($command);
85
        $handlers = $this->getCommandHandlerMethods();
86
87
        if (isset($handlers[$class])) {
88
            $method = $handlers[$class];
89
            $this->{$method}($command);
90
        }
91
    }
92
93
    protected function createOrganizer(CreateOrganizer $createOrganizer)
94
    {
95
        $organizer = Organizer::create(
96
            $createOrganizer->getOrganizerId(),
97
            $createOrganizer->getMainLanguage(),
98
            $createOrganizer->getWebsite(),
99
            $createOrganizer->getTitle()
100
        );
101
102
        $this->organizerRepository->save($organizer);
103
    }
104
105
    /**
106
     * @param UpdateWebsite $updateWebsite
107
     */
108
    protected function updateWebsite(UpdateWebsite $updateWebsite)
109
    {
110
        $organizer = $this->loadOrganizer($updateWebsite->getOrganizerId());
111
112
        $organizer->updateWebsite($updateWebsite->getWebsite());
113
114
        $this->organizerRepository->save($organizer);
115
    }
116
117
    /**
118
     * @param UpdateTitle $updateTitle
119
     */
120
    protected function updateTitle(UpdateTitle $updateTitle)
121
    {
122
        $organizer = $this->loadOrganizer($updateTitle->getOrganizerId());
123
124
        $organizer->updateTitle(
125
            $updateTitle->getTitle(),
126
            $updateTitle->getLanguage()
127
        );
128
129
        $this->organizerRepository->save($organizer);
130
    }
131
132
    /**
133
     * @param UpdateAddress $updateAddress
134
     */
135
    protected function updateAddress(UpdateAddress $updateAddress)
136
    {
137
        $organizer = $this->loadOrganizer($updateAddress->getOrganizerId());
138
139
        $organizer->updateAddress($updateAddress->getAddress());
140
141
        $this->organizerRepository->save($organizer);
142
    }
143
144
    /**
145
     * @param UpdateContactPoint $updateContactPoint
146
     */
147
    protected function updateContactPoint(UpdateContactPoint $updateContactPoint)
148
    {
149
        $organizer = $this->loadOrganizer($updateContactPoint->getOrganizerId());
150
151
        $organizer->updateContactPoint($updateContactPoint->getContactPoint());
152
153
        $this->organizerRepository->save($organizer);
154
    }
155
156
    /**
157
     * @param AddLabel $addLabel
158
     */
159
    protected function addLabel(AddLabel $addLabel)
160
    {
161
        $organizer = $this->loadOrganizer($addLabel->getOrganizerId());
162
163
        $organizer->addLabel($this->createLabel($addLabel));
164
165
        $this->organizerRepository->save($organizer);
166
    }
167
168
    /**
169
     * @param RemoveLabel $removeLabel
170
     */
171
    protected function removeLabel(RemoveLabel $removeLabel)
172
    {
173
        $organizer = $this->loadOrganizer($removeLabel->getOrganizerId());
174
175
        $organizer->removeLabel($this->createLabel($removeLabel));
176
177
        $this->organizerRepository->save($organizer);
178
    }
179
180
    /**
181
     * @param AbstractLabelCommand $labelCommand
182
     * @return Label
183
     */
184 View Code Duplication
    private function createLabel(AbstractLabelCommand $labelCommand)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
185
    {
186
        $labelName = new StringLiteral((string) $labelCommand->getLabel());
187
        $label = $this->labelRepository->getByName($labelName);
188
189
        return new Label(
190
            $labelName->toNative(),
191
            $label->getVisibility() === Visibility::VISIBLE()
192
        );
193
    }
194
195
    /**
196
     * @param DeleteOrganizer $deleteOrganizer
197
     */
198
    public function deleteOrganizer(DeleteOrganizer $deleteOrganizer)
199
    {
200
        $id = $deleteOrganizer->getOrganizerId();
201
202
        // First remove all relations to the given organizer.
203
        foreach ($this->organizerRelationServices as $relationService) {
204
            $relationService->deleteOrganizer($id);
205
        }
206
207
        // Delete the organizer itself.
208
        $organizer = $this->loadOrganizer($id);
209
210
        $organizer->delete();
211
212
        $this->organizerRepository->save($organizer);
213
    }
214
215
    /**
216
     * Makes it easier to type hint to Organizer.
217
     *
218
     * @param string $id
219
     * @return Organizer
220
     */
221
    protected function loadOrganizer($id)
222
    {
223
        return $this->organizerRepository->load($id);
224
    }
225
}
226