Completed
Push — master ( 65255d...9dfb0b )
by Luc
07:57 queued 02:17
created

OfferCommandHandler::handleUpdateCalendar()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 8
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 4
nc 1
nop 1
1
<?php
2
3
namespace CultuurNet\UDB3\Offer;
4
5
use Broadway\Repository\RepositoryInterface;
6
use CultuurNet\UDB3\CommandHandling\Udb3CommandHandler;
7
use CultuurNet\UDB3\Label;
8
use CultuurNet\UDB3\Label\ReadModels\JSON\Repository\ReadRepositoryInterface;
9
use CultuurNet\UDB3\Label\ValueObjects\Visibility;
10
use CultuurNet\UDB3\Offer\Commands\AbstractAddLabel;
11
use CultuurNet\UDB3\Offer\Commands\AbstractLabelCommand;
12
use CultuurNet\UDB3\Offer\Commands\AbstractRemoveLabel;
13
use CultuurNet\UDB3\Offer\Commands\AbstractDeleteOffer;
14
use CultuurNet\UDB3\Offer\Commands\AbstractDeleteOrganizer;
15
use CultuurNet\UDB3\Offer\Commands\AbstractDeleteTypicalAgeRange;
16
use CultuurNet\UDB3\Offer\Commands\AbstractUpdateBookingInfo;
17
use CultuurNet\UDB3\Offer\Commands\AbstractUpdateCalendar;
18
use CultuurNet\UDB3\Offer\Commands\AbstractUpdateContactPoint;
19
use CultuurNet\UDB3\Offer\Commands\AbstractUpdateDescription;
20
use CultuurNet\UDB3\Offer\Commands\AbstractUpdateOrganizer;
21
use CultuurNet\UDB3\Offer\Commands\AbstractUpdatePriceInfo;
22
use CultuurNet\UDB3\Offer\Commands\AbstractUpdateTypicalAgeRange;
23
use CultuurNet\UDB3\Offer\Commands\Image\AbstractAddImage;
24
use CultuurNet\UDB3\Offer\Commands\Image\AbstractRemoveImage;
25
use CultuurNet\UDB3\Offer\Commands\Image\AbstractSelectMainImage;
26
use CultuurNet\UDB3\Offer\Commands\Image\AbstractUpdateImage;
27
use CultuurNet\UDB3\Offer\Commands\AbstractUpdateTitle;
28
use CultuurNet\UDB3\Offer\Commands\Moderation\AbstractApprove;
29
use CultuurNet\UDB3\Offer\Commands\Moderation\AbstractFlagAsDuplicate;
30
use CultuurNet\UDB3\Offer\Commands\Moderation\AbstractFlagAsInappropriate;
31
use CultuurNet\UDB3\Offer\Commands\Moderation\AbstractPublish;
32
use CultuurNet\UDB3\Offer\Commands\Moderation\AbstractReject;
33
use CultuurNet\UDB3\Organizer\Organizer;
34
use ValueObjects\StringLiteral\StringLiteral;
35
36
abstract class OfferCommandHandler extends Udb3CommandHandler
37
{
38
    /**
39
     * @var RepositoryInterface
40
     */
41
    protected $offerRepository;
42
43
    /**
44
     * @var RepositoryInterface
45
     */
46
    protected $organizerRepository;
47
48
    /**
49
     * @var RepositoryInterface
50
     */
51
    protected $labelRepository;
52
53
    /**
54
     * @param RepositoryInterface $offerRepository
55
     * @param RepositoryInterface $organizerRepository
56
     * @param ReadRepositoryInterface $labelRepository
57
     */
58
    public function __construct(
59
        RepositoryInterface $offerRepository,
60
        RepositoryInterface $organizerRepository,
61
        ReadRepositoryInterface $labelRepository
62
    ) {
63
        $this->offerRepository = $offerRepository;
64
        $this->organizerRepository = $organizerRepository;
65
        $this->labelRepository = $labelRepository;
0 ignored issues
show
Documentation Bug introduced by
It seems like $labelRepository of type object<CultuurNet\UDB3\L...eadRepositoryInterface> is incompatible with the declared type object<Broadway\Repository\RepositoryInterface> of property $labelRepository.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
66
    }
67
68
    /**
69
     * {@inheritdoc}
70
     */
71
    public function handle($command)
72
    {
73
        $commandName = get_class($command);
74
        $commandHandlers = $this->getCommandHandlers();
75
76
        if (isset($commandHandlers[$commandName])) {
77
            $handler = $commandHandlers[$commandName];
78
            call_user_func(array($this, $handler), $command);
79
        } else {
80
            parent::handle($command);
81
        }
82
    }
83
84
    /**
85
     * @return string[]
86
     *   An associative array of commands and their handler methods.
87
     */
88 View Code Duplication
    private function getCommandHandlers()
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...
89
    {
90
        $commands = [];
91
92
        foreach (get_class_methods($this) as $method) {
93
            $matches = [];
94
            if (preg_match('/^handle(.+)$/', $method, $matches)) {
95
                $command = $matches[1];
96
                $classNameMethod = 'get' . $command . 'ClassName';
97
98
                if (method_exists($this, $classNameMethod)) {
99
                    $commandFullClassName = call_user_func(array($this, $classNameMethod));
100
                    $commands[$commandFullClassName] = $method;
101
                }
102
            }
103
        }
104
105
        return $commands;
106
    }
107
108
    /**
109
     * @return string
110
     */
111
    abstract protected function getAddLabelClassName();
112
113
    /**
114
     * @return string
115
     */
116
    abstract protected function getRemoveLabelClassName();
117
118
    /**
119
     * @return string
120
     */
121
    abstract protected function getUpdateTitleClassName();
122
123
    /**
124
     * @return string
125
     */
126
    abstract protected function getAddImageClassName();
127
128
    /**
129
     * @return string
130
     */
131
    abstract protected function getUpdateImageClassName();
132
133
    /**
134
     * @return string
135
     */
136
    abstract protected function getRemoveImageClassName();
137
138
    /**
139
     * @return string
140
     */
141
    abstract protected function getSelectMainImageClassName();
142
143
    /**
144
     * @return string
145
     */
146
    abstract protected function getUpdateDescriptionClassName();
147
148
    /**
149
     * @return string
150
     */
151
    abstract protected function getUpdateCalendarClassName();
152
153
    /**
154
     * @return string
155
     */
156
    abstract protected function getUpdateTypicalAgeRangeClassName();
157
158
    /**
159
     * @return string
160
     */
161
    abstract protected function getDeleteTypicalAgeRangeClassName();
162
163
    /**
164
     * @return string
165
     */
166
    abstract protected function getUpdateOrganizerClassName();
167
168
    /**
169
     * @return string
170
     */
171
    abstract protected function getDeleteOrganizerClassName();
172
173
    /**
174
     * @return string
175
     */
176
    abstract protected function getUpdateContactPointClassName();
177
178
    /**
179
     * @return string
180
     */
181
    abstract protected function getUpdateBookingInfoClassName();
182
183
    /**
184
     * @return string
185
     */
186
    abstract protected function getUpdatePriceInfoClassName();
187
188
    /**
189
     * @return string
190
     */
191
    abstract protected function getDeleteOfferClassName();
192
193
    /**
194
     * @return string
195
     */
196
    abstract protected function getPublishClassName();
197
198
    /**
199
     * @return string
200
     */
201
    abstract protected function getApproveClassName();
202
203
    /**
204
     * @return string
205
     */
206
    abstract protected function getRejectClassName();
207
208
    /**
209
     * @return string
210
     */
211
    abstract protected function getFlagAsDuplicateClassName();
212
213
    /**
214
     * @return string
215
     */
216
    abstract protected function getFlagAsInappropriateClassName();
217
218
    /**
219
     * @param AbstractAddLabel $addLabel
220
     */
221
    private function handleAddLabel(AbstractAddLabel $addLabel)
222
    {
223
        $offer = $this->load($addLabel->getItemId());
224
225
        $offer->addLabel($this->createLabel($addLabel));
226
227
        $this->offerRepository->save($offer);
228
    }
229
230
    /**
231
     * @param AbstractRemoveLabel $removeLabel
232
     */
233
    private function handleRemoveLabel(AbstractRemoveLabel $removeLabel)
234
    {
235
        $offer = $this->load($removeLabel->getItemId());
236
237
        $offer->removeLabel($this->createLabel($removeLabel));
238
239
        $this->offerRepository->save($offer);
240
    }
241
242
    /**
243
     * @param AbstractLabelCommand $labelCommand
244
     * @return Label
245
     */
246 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...
247
    {
248
        $labelName = new StringLiteral((string) $labelCommand->getLabel());
249
        $label = $this->labelRepository->getByName($labelName);
0 ignored issues
show
Bug introduced by
The method getByName() does not seem to exist on object<Broadway\Repository\RepositoryInterface>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
250
251
        return new Label(
252
            $labelName->toNative(),
253
            $label->getVisibility() === Visibility::VISIBLE()
254
        );
255
    }
256
257
    /**
258
     * @param AbstractUpdateTitle $translateTitle
259
     */
260
    private function handleUpdateTitle(AbstractUpdateTitle $translateTitle)
261
    {
262
        $offer = $this->load($translateTitle->getItemId());
263
        $offer->updateTitle($translateTitle->getLanguage(), $translateTitle->getTitle());
0 ignored issues
show
Documentation introduced by
$translateTitle->getTitle() is of type string, but the function expects a object<CultuurNet\UDB3\Title>.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
264
        $this->offerRepository->save($offer);
265
    }
266
267
    /**
268
     * Handle an add image command.
269
     * @param AbstractAddImage $addImage
270
     */
271
    public function handleAddImage(AbstractAddImage $addImage)
272
    {
273
        $offer = $this->load($addImage->getItemId());
274
        $offer->addImage($addImage->getImage());
275
        $this->offerRepository->save($offer);
276
    }
277
278
    /**
279
     * @param AbstractRemoveImage $removeImage
280
     */
281
    public function handleRemoveImage(AbstractRemoveImage $removeImage)
282
    {
283
        $offer = $this->load($removeImage->getItemId());
284
        $offer->removeImage($removeImage->getImage());
285
        $this->offerRepository->save($offer);
286
    }
287
288
    /**
289
     * @param AbstractUpdateImage $updateImage
290
     */
291
    public function handleUpdateImage(AbstractUpdateImage $updateImage)
292
    {
293
        $offer = $this->load($updateImage->getItemId());
294
        $offer->updateImage($updateImage);
295
        $this->offerRepository->save($offer);
296
    }
297
298
    /**
299
     * @param AbstractSelectMainImage $selectMainImage
300
     */
301
    public function handleSelectMainImage(AbstractSelectMainImage $selectMainImage)
302
    {
303
        $offer = $this->load($selectMainImage->getItemId());
304
        $offer->selectMainImage($selectMainImage->getImage());
305
        $this->offerRepository->save($offer);
306
    }
307
308
    /**
309
     * Handle the update of description on a place.
310
     * @param AbstractUpdateDescription $updateDescription
311
     */
312
    public function handleUpdateDescription(AbstractUpdateDescription $updateDescription)
313
    {
314
        $offer = $this->load($updateDescription->getItemId());
315
316
        $offer->updateDescription(
317
            $updateDescription->getDescription(),
318
            $updateDescription->getLanguage()
319
        );
320
321
        $this->offerRepository->save($offer);
322
323
    }
324
325
    /**
326
     * @param AbstractUpdateCalendar $updateCalendar
327
     */
328
    public function handleUpdateCalendar(AbstractUpdateCalendar $updateCalendar)
329
    {
330
        $offer = $this->load($updateCalendar->getItemId());
331
332
        $offer->updateCalendar($updateCalendar->getCalendar());
333
334
        $this->offerRepository->save($offer);
335
    }
336
337
    /**
338
     * Handle the update of typical age range on a place.
339
     * @param AbstractUpdateTypicalAgeRange $updateTypicalAgeRange
340
     */
341
    public function handleUpdateTypicalAgeRange(AbstractUpdateTypicalAgeRange $updateTypicalAgeRange)
342
    {
343
        $offer = $this->load($updateTypicalAgeRange->getItemId());
344
345
        $offer->updateTypicalAgeRange(
346
            $updateTypicalAgeRange->getTypicalAgeRange()
347
        );
348
349
        $this->offerRepository->save($offer);
350
351
    }
352
353
    /**
354
     * Handle the deletion of typical age range on a place.
355
     * @param AbstractDeleteTypicalAgeRange $deleteTypicalAgeRange
356
     */
357
    public function handleDeleteTypicalAgeRange(AbstractDeleteTypicalAgeRange $deleteTypicalAgeRange)
358
    {
359
        $offer = $this->load($deleteTypicalAgeRange->getItemId());
360
361
        $offer->deleteTypicalAgeRange();
362
363
        $this->offerRepository->save($offer);
364
365
    }
366
367
    /**
368
     * Handle an update command to update organizer of a place.
369
     * @param AbstractUpdateOrganizer $updateOrganizer
370
     */
371
    public function handleUpdateOrganizer(AbstractUpdateOrganizer $updateOrganizer)
372
    {
373
        $offer = $this->load($updateOrganizer->getItemId());
374
        $this->loadOrganizer($updateOrganizer->getOrganizerId());
375
376
        $offer->updateOrganizer(
377
            $updateOrganizer->getOrganizerId()
378
        );
379
380
        $this->offerRepository->save($offer);
381
    }
382
383
    /**
384
     * Handle an update command to delete the organizer.
385
     * @param AbstractDeleteOrganizer $deleteOrganizer
386
     */
387
    public function handleDeleteOrganizer(AbstractDeleteOrganizer $deleteOrganizer)
388
    {
389
        $offer = $this->load($deleteOrganizer->getItemId());
390
391
        $offer->deleteOrganizer(
392
            $deleteOrganizer->getOrganizerId()
393
        );
394
395
        $this->offerRepository->save($offer);
396
    }
397
398
    /**
399
     * Handle an update command to updated the contact point.
400
     * @param AbstractUpdateContactPoint $updateContactPoint
401
     */
402
    public function handleUpdateContactPoint(AbstractUpdateContactPoint $updateContactPoint)
403
    {
404
        $offer = $this->load($updateContactPoint->getId());
405
406
        $offer->updateContactPoint(
407
            $updateContactPoint->getContactPoint()
408
        );
409
410
        $this->offerRepository->save($offer);
411
412
    }
413
414
    /**
415
     * Handle an update command to updated the booking info.
416
     * @param AbstractUpdateBookingInfo $updateBookingInfo
417
     */
418
    public function handleUpdateBookingInfo(AbstractUpdateBookingInfo $updateBookingInfo)
419
    {
420
        $offer = $this->load($updateBookingInfo->getItemId());
421
422
        $offer->updateBookingInfo(
423
            $updateBookingInfo->getBookingInfo()
424
        );
425
426
        $this->offerRepository->save($offer);
427
    }
428
429
    /**
430
     * @param AbstractUpdatePriceInfo $updatePriceInfo
431
     */
432
    private function handleUpdatePriceInfo(AbstractUpdatePriceInfo $updatePriceInfo)
433
    {
434
        $offer = $this->load($updatePriceInfo->getItemId());
435
436
        $offer->updatePriceInfo(
437
            $updatePriceInfo->getPriceInfo()
438
        );
439
440
        $this->offerRepository->save($offer);
441
    }
442
443
    /**
444
     * @param AbstractDeleteOffer $deleteOffer
445
     */
446
    private function handleDeleteOffer(AbstractDeleteOffer $deleteOffer)
447
    {
448
        $offer = $this->load($deleteOffer->getItemId());
449
        $offer->delete();
450
        $this->offerRepository->save($offer);
451
    }
452
453
    /**
454
     * @param AbstractPublish $publish
455
     */
456
    private function handlePublish(AbstractPublish $publish)
457
    {
458
        $offer = $this->load($publish->getItemId());
459
        $offer->publish($publish->getPublicationDate());
460
        $this->offerRepository->save($offer);
461
    }
462
463
    /**
464
     * @param AbstractApprove $approve
465
     */
466
    private function handleApprove(AbstractApprove $approve)
467
    {
468
        $offer = $this->load($approve->getItemId());
469
        $offer->approve();
470
        $this->offerRepository->save($offer);
471
    }
472
473
    /**
474
     * @param AbstractReject $reject
475
     */
476
    private function handleReject(AbstractReject $reject)
477
    {
478
        $offer = $this->load($reject->getItemId());
479
        $offer->reject($reject->getReason());
480
        $this->offerRepository->save($offer);
481
    }
482
483
    /**
484
     * @param AbstractFlagAsDuplicate $flagAsDuplicate
485
     */
486
    private function handleFlagAsDuplicate(AbstractFlagAsDuplicate $flagAsDuplicate)
487
    {
488
        $offer = $this->load($flagAsDuplicate->getItemId());
489
        $offer->flagAsDuplicate();
490
        $this->offerRepository->save($offer);
491
    }
492
493
    /**
494
     * @param AbstractFlagAsInappropriate $flagAsInappropriate
495
     */
496
    private function handleFlagAsInappropriate(AbstractFlagAsInappropriate $flagAsInappropriate)
497
    {
498
        $offer = $this->load($flagAsInappropriate->getItemId());
499
        $offer->flagAsInappropriate();
500
        $this->offerRepository->save($offer);
501
    }
502
503
    /**
504
     * Makes it easier to type-hint to Offer.
505
     *
506
     * @param string $id
507
     * @return Offer
508
     */
509
    private function load($id)
510
    {
511
        return $this->offerRepository->load($id);
512
    }
513
514
    /**
515
     * Makes it easier to type-hint to Organizer.
516
     *
517
     * @param string $id
518
     * @return Organizer
519
     */
520
    private function loadOrganizer($id)
521
    {
522
        return $this->organizerRepository->load($id);
523
524
    }
525
}
526