Completed
Pull Request — master (#252)
by Kristof
09:20 queued 04:17
created

Event::isSameCollaborationDataAlreadyPresent()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 12
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 12
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 7
nc 2
nop 2

1 Method

Rating   Name   Duplication   Size   Complexity  
A Event::applyEventUpdatedFromUDB2() 0 5 1
1
<?php
2
3
namespace CultuurNet\UDB3\Event;
4
5
use CultuurNet\UDB3\BookingInfo;
6
use CultuurNet\UDB3\CalendarInterface;
7
use CultuurNet\UDB3\Cdb\EventItemFactory;
8
use CultuurNet\UDB3\Cdb\UpdateableWithCdbXmlInterface;
9
use CultuurNet\UDB3\ContactPoint;
10
use CultuurNet\UDB3\Event\Events\BookingInfoUpdated;
11
use CultuurNet\UDB3\Event\Events\ContactPointUpdated;
12
use CultuurNet\UDB3\Event\Events\DescriptionTranslated;
13
use CultuurNet\UDB3\Event\Events\DescriptionUpdated;
14
use CultuurNet\UDB3\Event\Events\EventCdbXMLInterface;
15
use CultuurNet\UDB3\Event\Events\EventCreated;
16
use CultuurNet\UDB3\Event\Events\EventCreatedFromCdbXml;
17
use CultuurNet\UDB3\Event\Events\EventDeleted;
18
use CultuurNet\UDB3\Event\Events\EventImportedFromUDB2;
19
use CultuurNet\UDB3\Event\Events\EventUpdatedFromCdbXml;
20
use CultuurNet\UDB3\Event\Events\EventUpdatedFromUDB2;
21
use CultuurNet\UDB3\Event\Events\ImageAdded;
22
use CultuurNet\UDB3\Event\Events\ImageRemoved;
23
use CultuurNet\UDB3\Event\Events\ImageUpdated;
24
use CultuurNet\UDB3\Event\Events\LabelAdded;
25
use CultuurNet\UDB3\Event\Events\LabelRemoved;
26
use CultuurNet\UDB3\Event\Events\MainImageSelected;
27
use CultuurNet\UDB3\Event\Events\MajorInfoUpdated;
28
use CultuurNet\UDB3\Event\Events\Moderation\Approved;
29
use CultuurNet\UDB3\Event\Events\Moderation\FlaggedAsDuplicate;
30
use CultuurNet\UDB3\Event\Events\Moderation\FlaggedAsInappropriate;
31
use CultuurNet\UDB3\Event\Events\Moderation\Published;
32
use CultuurNet\UDB3\Event\Events\Moderation\Rejected;
33
use CultuurNet\UDB3\Event\Events\OrganizerDeleted;
34
use CultuurNet\UDB3\Event\Events\OrganizerUpdated;
35
use CultuurNet\UDB3\Event\Events\PriceInfoUpdated;
36
use CultuurNet\UDB3\Event\Events\TitleTranslated;
37
use CultuurNet\UDB3\Event\Events\TranslationApplied;
38
use CultuurNet\UDB3\Event\Events\TranslationDeleted;
39
use CultuurNet\UDB3\Event\Events\TypicalAgeRangeDeleted;
40
use CultuurNet\UDB3\Event\Events\TypicalAgeRangeUpdated;
41
use CultuurNet\UDB3\EventXmlString;
42
use CultuurNet\UDB3\Label;
43
use CultuurNet\UDB3\LabelCollection;
44
use CultuurNet\UDB3\Language;
45
use CultuurNet\UDB3\Location\Location;
46
use CultuurNet\UDB3\Offer\Commands\Image\AbstractUpdateImage;
47
use CultuurNet\UDB3\Offer\Offer;
48
use CultuurNet\UDB3\Media\Image;
49
use CultuurNet\UDB3\PriceInfo\PriceInfo;
50
use CultuurNet\UDB3\Offer\WorkflowStatus;
51
use CultuurNet\UDB3\Theme;
52
use CultuurNet\UDB3\Title;
53
use CultuurNet\UDB3\Translation;
54
use ValueObjects\Identity\UUID;
55
use ValueObjects\String\String as StringLiteral;
56
57
class Event extends Offer implements UpdateableWithCdbXmlInterface
58
{
59
    protected $eventId;
60
61
    /**
62
     * @var Translation[]
63
     */
64
    protected $translations = [];
65
66
    const MAIN_LANGUAGE_CODE = 'nl';
67
68
    public function __construct()
69
    {
70
        parent::__construct();
71
    }
72
73
    /**
74
     * Factory method to create a new event.
75
     *
76
     * @param Title $title
77
     * @param EventType $eventType
78
     * @param Location $location
79
     * @param CalendarInterface $calendar
80
     * @param Theme|null $theme
81
     * @param \DateTimeImmutable|null $publicationDate
82
     *
83
     * @return Event
84
     */
85
    public static function create(
86
        $eventId,
87
        Title $title,
88
        EventType $eventType,
89
        Location $location,
90
        CalendarInterface $calendar,
91
        Theme $theme = null,
92
        \DateTimeImmutable $publicationDate = null
93
    ) {
94
        if (!is_string($eventId)) {
95
            throw new \InvalidArgumentException(
96
                'Expected eventId to be a string, received ' . gettype($eventId)
97
            );
98
        }
99
100
        $event = new self();
101
102
        $event->apply(
103
            new EventCreated(
104
                $eventId,
105
                $title,
106
                $eventType,
107
                $location,
108
                $calendar,
109
                $theme,
110
                $publicationDate
111
            )
112
        );
113
114
        return $event;
115
    }
116
117
    /**
118
     * @param string $eventId
119
     * @param string $cdbXml
120
     * @param string $cdbXmlNamespaceUri
121
     * @return Event
122
     */
123
    public static function importFromUDB2(
124
        $eventId,
125
        $cdbXml,
126
        $cdbXmlNamespaceUri
127
    ) {
128
        $event = new self();
129
        $event->apply(
130
            new EventImportedFromUDB2(
131
                $eventId,
132
                $cdbXml,
133
                $cdbXmlNamespaceUri
134
            )
135
        );
136
137
        return $event;
138
    }
139
140
    /**
141
     * @param EventXmlString $xmlString
142
     * @param StringLiteral $eventId
143
     * @param StringLiteral $cdbXmlNamespaceUri
144
     * @return Event
145
     */
146
    public static function createFromCdbXml(
147
        StringLiteral $eventId,
148
        EventXmlString $xmlString,
149
        StringLiteral $cdbXmlNamespaceUri
150
    ) {
151
        $event = new self();
152
        $event->apply(
153
            new EventCreatedFromCdbXml(
154
                $eventId,
155
                $xmlString,
156
                $cdbXmlNamespaceUri
157
            )
158
        );
159
160
        return $event;
161
    }
162
163
    /**
164
     * @param StringLiteral $eventId
165
     * @param EventXmlString $xmlString
166
     * @param StringLiteral $cdbXmlNamespaceUri
167
     * @return Event
168
     */
169
    public function updateFromCdbXml(
170
        StringLiteral $eventId,
171
        EventXmlString $xmlString,
172
        StringLiteral $cdbXmlNamespaceUri
173
    ) {
174
        $this->apply(
175
            new EventUpdatedFromCdbXml(
176
                $eventId,
177
                $xmlString,
178
                $cdbXmlNamespaceUri
179
            )
180
        );
181
    }
182
183
    /**
184
     * @param Language $language
185
     * @param StringLiteral|null $title
186
     * @param StringLiteral|null $shortDescription
187
     * @param StringLiteral|null $longDescription
188
     */
189
    public function applyTranslation(
190
        Language $language,
191
        StringLiteral $title = null,
192
        StringLiteral $shortDescription = null,
193
        StringLiteral $longDescription = null
194
    ) {
195
        $this->apply(
196
            new TranslationApplied(
197
                new StringLiteral($this->eventId),
198
                $language,
199
                $title,
0 ignored issues
show
Bug introduced by
It seems like $title defined by parameter $title on line 191 can also be of type object<ValueObjects\String\String>; however, CultuurNet\UDB3\Event\Ev...nApplied::__construct() does only seem to accept null|string, maybe add an additional type check?

This check looks at variables that have been passed in as parameters and are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
200
                $shortDescription,
0 ignored issues
show
Bug introduced by
It seems like $shortDescription defined by parameter $shortDescription on line 192 can also be of type object<ValueObjects\String\String>; however, CultuurNet\UDB3\Event\Ev...nApplied::__construct() does only seem to accept null|string, maybe add an additional type check?

This check looks at variables that have been passed in as parameters and are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
201
                $longDescription
0 ignored issues
show
Bug introduced by
It seems like $longDescription defined by parameter $longDescription on line 193 can also be of type object<ValueObjects\String\String>; however, CultuurNet\UDB3\Event\Ev...nApplied::__construct() does only seem to accept null|string, maybe add an additional type check?

This check looks at variables that have been passed in as parameters and are passed out again to other methods.

If the outgoing method call has stricter type requirements than the method itself, an issue is raised.

An additional type check may prevent trouble.

Loading history...
202
            )
203
        );
204
    }
205
206
    /**
207
     * @param Language $language
208
     */
209
    public function deleteTranslation(
210
        Language $language
211
    ) {
212
        if (!array_key_exists($language->getCode(), $this->translations)) {
213
            return;
214
        }
215
216
        $this->apply(
217
            new TranslationDeleted(
218
                new StringLiteral($this->eventId),
219
                $language
220
            )
221
        );
222
    }
223
224
    /**
225
     * {@inheritdoc}
226
     */
227
    public function getAggregateRootId()
228
    {
229
        return $this->eventId;
230
    }
231
232
    /**
233
     * @return Translation[]
234
     */
235
    public function getTranslations()
236
    {
237
        return $this->translations;
238
    }
239
240
    /**
241
     * @return UUID[]
242
     */
243
    public function getMediaObjects()
244
    {
245
        return $this->mediaObjects;
246
    }
247
248
    protected function applyEventCreated(EventCreated $eventCreated)
249
    {
250
        $this->eventId = $eventCreated->getEventId();
251
        $this->workflowStatus = WorkflowStatus::DRAFT();
252
    }
253
254
    protected function applyEventImportedFromUDB2(
255
        EventImportedFromUDB2 $eventImported
256
    ) {
257
        $this->eventId = $eventImported->getEventId();
258
        $this->setUDB2Data($eventImported);
259
    }
260
261
    /**
262
     * @param EventUpdatedFromUDB2 $eventUpdated
263
     */
264
    protected function applyEventUpdatedFromUDB2(
265
        EventUpdatedFromUDB2 $eventUpdated
266
    ) {
267
        $this->setUDB2Data($eventUpdated);
268
    }
269
270
    /**
271
     * @param EventCdbXMLInterface $eventCdbXML
272
     */
273
    protected function setUDB2Data(
274
        EventCdbXMLInterface $eventCdbXML
275
    ) {
276
        $udb2Event = EventItemFactory::createEventFromCdbXml(
277
            $eventCdbXML->getCdbXmlNamespaceUri(),
278
            $eventCdbXML->getCdbXml()
279
        );
280
281
        $this->importWorkflowStatus($udb2Event);
282
        $this->labels = LabelCollection::fromKeywords($udb2Event->getKeywords(true));
283
    }
284
285
    /**
286
     * Update the major info.
287
     *
288
     * @param Title $title
289
     * @param EventType $eventType
290
     * @param Location $location
291
     * @param CalendarInterface $calendar
292
     * @param type $theme
293
     */
294
    public function updateMajorInfo(
295
        Title $title,
296
        EventType $eventType,
297
        Location $location,
298
        CalendarInterface $calendar,
299
        $theme = null
300
    ) {
301
        $this->apply(new MajorInfoUpdated($this->eventId, $title, $eventType, $location, $calendar, $theme));
302
    }
303
304
    protected function applyEventCreatedFromCdbXml(
305
        EventCreatedFromCdbXml $eventCreatedFromCdbXml
306
    ) {
307
        $this->eventId = $eventCreatedFromCdbXml->getEventId()->toNative();
308
309
        $udb2Event = EventItemFactory::createEventFromCdbXml(
310
            $eventCreatedFromCdbXml->getCdbXmlNamespaceUri(),
311
            $eventCreatedFromCdbXml->getEventXmlString()->toEventXmlString()
312
        );
313
314
        $this->labels = LabelCollection::fromKeywords($udb2Event->getKeywords(true));
315
    }
316
317
    protected function applyEventUpdatedFromCdbXml(
318
        EventUpdatedFromCdbXml $eventUpdatedFromCdbXml
319
    ) {
320
        $this->eventId = $eventUpdatedFromCdbXml->getEventId()->toNative();
321
322
        $udb2Event = EventItemFactory::createEventFromCdbXml(
323
            $eventUpdatedFromCdbXml->getCdbXmlNamespaceUri(),
324
            $eventUpdatedFromCdbXml->getEventXmlString()->toEventXmlString()
325
        );
326
327
        $this->labels = LabelCollection::fromKeywords($udb2Event->getKeywords(true));
328
    }
329
330
    protected function applyTranslationApplied(
331
        TranslationApplied $translationApplied
332
    ) {
333
        $this->eventId = $translationApplied->getEventId()->toNative();
334
335
        $language = $translationApplied->getLanguage()->getCode();
336
        $translation = new Translation(
337
            $translationApplied->getLanguage(),
338
            $translationApplied->getTitle(),
339
            $translationApplied->getShortdescription(),
340
            $translationApplied->getLongdescription()
341
        );
342
343
        if (!array_key_exists($language, $this->translations)) {
344
            $this->translations[$language] = $translation;
345
        } else {
346
            $newTranslation = $this->translations[$language]->mergeTranslation($translation);
347
            $this->translations[$language] = $newTranslation;
348
        }
349
    }
350
351
    protected function applyTranslationDeleted(
352
        TranslationDeleted $translationDeleted
353
    ) {
354
        $language = $translationDeleted->getLanguage()->getCode();
355
356
        if (array_key_exists($language, $this->translations)) {
357
            unset($this->translations[$language]);
358
        }
359
    }
360
361
    /**
362
     * @inheritdoc
363
     */
364
    public function updateWithCdbXml($cdbXml, $cdbXmlNamespaceUri)
365
    {
366
        $this->apply(
367
            new EventUpdatedFromUDB2(
368
                $this->eventId,
369
                $cdbXml,
370
                $cdbXmlNamespaceUri
371
            )
372
        );
373
    }
374
375
    /**
376
     * @param Label $label
377
     * @return LabelAdded
378
     */
379
    protected function createLabelAddedEvent(Label $label)
380
    {
381
        return new LabelAdded($this->eventId, $label);
382
    }
383
384
    /**
385
     * @param Label $label
386
     * @return LabelRemoved
387
     */
388
    protected function createLabelRemovedEvent(Label $label)
389
    {
390
        return new LabelRemoved($this->eventId, $label);
391
    }
392
393
    /**
394
     * @param Image $image
395
     * @return ImageAdded
396
     */
397
    protected function createImageAddedEvent(Image $image)
398
    {
399
        return new ImageAdded($this->eventId, $image);
400
    }
401
402
    /**
403
     * @param Image $image
404
     * @return ImageRemoved
405
     */
406
    protected function createImageRemovedEvent(Image $image)
407
    {
408
        return new ImageRemoved($this->eventId, $image);
409
    }
410
411
    /**
412
     * @param AbstractUpdateImage $updateImageCommand
413
     * @return ImageUpdated
414
     */
415
    protected function createImageUpdatedEvent(
416
        AbstractUpdateImage $updateImageCommand
417
    ) {
418
        return new ImageUpdated(
419
            $this->eventId,
420
            $updateImageCommand->getMediaObjectId(),
421
            $updateImageCommand->getDescription(),
422
            $updateImageCommand->getCopyrightHolder()
423
        );
424
    }
425
426
    /**
427
     * @param Image $image
428
     * @return MainImageSelected
429
     */
430
    protected function createMainImageSelectedEvent(Image $image)
431
    {
432
        return new MainImageSelected($this->eventId, $image);
433
    }
434
435
    /**
436
     * @param Language $language
437
     * @param StringLiteral $title
438
     * @return TitleTranslated
439
     */
440
    protected function createTitleTranslatedEvent(Language $language, StringLiteral $title)
441
    {
442
        return new TitleTranslated($this->eventId, $language, $title);
443
    }
444
445
    /**
446
     * @param Language $language
447
     * @param StringLiteral $description
448
     * @return DescriptionTranslated
449
     */
450
    protected function createDescriptionTranslatedEvent(Language $language, StringLiteral $description)
451
    {
452
        return new DescriptionTranslated($this->eventId, $language, $description);
453
    }
454
455
    /**
456
     * @param string $description
457
     * @return DescriptionUpdated
458
     */
459
    protected function createDescriptionUpdatedEvent($description)
460
    {
461
        return new DescriptionUpdated($this->eventId, $description);
462
    }
463
464
    /**
465
     * @param string $typicalAgeRange
466
     * @return TypicalAgeRangeUpdated
467
     */
468
    protected function createTypicalAgeRangeUpdatedEvent($typicalAgeRange)
469
    {
470
        return new TypicalAgeRangeUpdated($this->eventId, $typicalAgeRange);
471
    }
472
473
    /**
474
     * @return TypicalAgeRangeDeleted
475
     */
476
    protected function createTypicalAgeRangeDeletedEvent()
477
    {
478
        return new TypicalAgeRangeDeleted($this->eventId);
479
    }
480
481
    /**
482
     * @param string $organizerId
483
     * @return OrganizerUpdated
484
     */
485
    protected function createOrganizerUpdatedEvent($organizerId)
486
    {
487
        return new OrganizerUpdated($this->eventId, $organizerId);
488
    }
489
490
    /**
491
     * @param string $organizerId
492
     * @return OrganizerDeleted
493
     */
494
    protected function createOrganizerDeletedEvent($organizerId)
495
    {
496
        return new OrganizerDeleted($this->eventId, $organizerId);
497
    }
498
499
    /**
500
     * @param ContactPoint $contactPoint
501
     * @return ContactPointUpdated
502
     */
503
    protected function createContactPointUpdatedEvent(ContactPoint $contactPoint)
504
    {
505
        return new ContactPointUpdated($this->eventId, $contactPoint);
506
    }
507
508
    /**
509
     * @param BookingInfo $bookingInfo
510
     * @return BookingInfoUpdated
511
     */
512
    protected function createBookingInfoUpdatedEvent(BookingInfo $bookingInfo)
513
    {
514
        return new BookingInfoUpdated($this->eventId, $bookingInfo);
515
    }
516
517
    /**
518
     * @param PriceInfo $priceInfo
519
     * @return PriceInfoUpdated
520
     */
521
    protected function createPriceInfoUpdatedEvent(PriceInfo $priceInfo)
522
    {
523
        return new PriceInfoUpdated($this->eventId, $priceInfo);
524
    }
525
526
    /**
527
     * @return EventDeleted
528
     */
529
    protected function createOfferDeletedEvent()
530
    {
531
        return new EventDeleted($this->eventId);
532
    }
533
534
    /**
535
     * @inheritdoc
536
     */
537
    protected function createPublishedEvent(\DateTimeInterface $publicationDate)
538
    {
539
        return new Published($this->eventId, $publicationDate);
540
    }
541
542
    /**
543
     * @inheritdoc
544
     */
545
    protected function createApprovedEvent()
546
    {
547
        return new Approved($this->eventId);
548
    }
549
550
    /**
551
     * @inheritdoc
552
     */
553
    protected function createRejectedEvent(StringLiteral $reason)
554
    {
555
        return new Rejected($this->eventId, $reason);
556
    }
557
558
    /**
559
     * @inheritDoc
560
     */
561
    protected function createFlaggedAsDuplicate()
562
    {
563
        return new FlaggedAsDuplicate($this->eventId);
564
    }
565
566
    /**
567
     * @inheritDoc
568
     */
569
    protected function createFlaggedAsInappropriate()
570
    {
571
        return new FlaggedAsInappropriate($this->eventId);
572
    }
573
}
574