Completed
Pull Request — master (#252)
by Kristof
10:27 queued 05:25
created

Event::addCollaborationData()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 16
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 16
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 10
nc 2
nop 2
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\LabelsMerged;
27
use CultuurNet\UDB3\Event\Events\MainImageSelected;
28
use CultuurNet\UDB3\Event\Events\MajorInfoUpdated;
29
use CultuurNet\UDB3\Event\Events\Moderation\Approved;
30
use CultuurNet\UDB3\Event\Events\Moderation\FlaggedAsDuplicate;
31
use CultuurNet\UDB3\Event\Events\Moderation\FlaggedAsInappropriate;
32
use CultuurNet\UDB3\Event\Events\Moderation\Published;
33
use CultuurNet\UDB3\Event\Events\Moderation\Rejected;
34
use CultuurNet\UDB3\Event\Events\OrganizerDeleted;
35
use CultuurNet\UDB3\Event\Events\OrganizerUpdated;
36
use CultuurNet\UDB3\Event\Events\PriceInfoUpdated;
37
use CultuurNet\UDB3\Event\Events\TitleTranslated;
38
use CultuurNet\UDB3\Event\Events\TranslationApplied;
39
use CultuurNet\UDB3\Event\Events\TranslationDeleted;
40
use CultuurNet\UDB3\Event\Events\TypicalAgeRangeDeleted;
41
use CultuurNet\UDB3\Event\Events\TypicalAgeRangeUpdated;
42
use CultuurNet\UDB3\EventXmlString;
43
use CultuurNet\UDB3\Label;
44
use CultuurNet\UDB3\LabelCollection;
45
use CultuurNet\UDB3\Language;
46
use CultuurNet\UDB3\Location\Location;
47
use CultuurNet\UDB3\Offer\Commands\Image\AbstractUpdateImage;
48
use CultuurNet\UDB3\Offer\Offer;
49
use CultuurNet\UDB3\Media\Image;
50
use CultuurNet\UDB3\PriceInfo\PriceInfo;
51
use CultuurNet\UDB3\Offer\WorkflowStatus;
52
use CultuurNet\UDB3\Theme;
53
use CultuurNet\UDB3\Title;
54
use CultuurNet\UDB3\Translation;
55
use ValueObjects\Identity\UUID;
56
use ValueObjects\String\String as StringLiteral;
57
58
class Event extends Offer implements UpdateableWithCdbXmlInterface
59
{
60
    protected $eventId;
61
62
    /**
63
     * @var Translation[]
64
     */
65
    protected $translations = [];
66
67
    const MAIN_LANGUAGE_CODE = 'nl';
68
69
    public function __construct()
70
    {
71
        parent::__construct();
72
    }
73
74
    /**
75
     * Factory method to create a new event.
76
     *
77
     * @param Title $title
78
     * @param EventType $eventType
79
     * @param Location $location
80
     * @param CalendarInterface $calendar
81
     * @param Theme|null $theme
82
     * @param \DateTimeImmutable|null $publicationDate
83
     *
84
     * @return Event
85
     */
86
    public static function create(
87
        $eventId,
88
        Title $title,
89
        EventType $eventType,
90
        Location $location,
91
        CalendarInterface $calendar,
92
        Theme $theme = null,
93
        \DateTimeImmutable $publicationDate = null
94
    ) {
95
        if (!is_string($eventId)) {
96
            throw new \InvalidArgumentException(
97
                'Expected eventId to be a string, received ' . gettype($eventId)
98
            );
99
        }
100
101
        $event = new self();
102
103
        $event->apply(
104
            new EventCreated(
105
                $eventId,
106
                $title,
107
                $eventType,
108
                $location,
109
                $calendar,
110
                $theme,
111
                $publicationDate
112
            )
113
        );
114
115
        return $event;
116
    }
117
118
    /**
119
     * @param string $eventId
120
     * @param string $cdbXml
121
     * @param string $cdbXmlNamespaceUri
122
     * @return Event
123
     */
124
    public static function importFromUDB2(
125
        $eventId,
126
        $cdbXml,
127
        $cdbXmlNamespaceUri
128
    ) {
129
        $event = new self();
130
        $event->apply(
131
            new EventImportedFromUDB2(
132
                $eventId,
133
                $cdbXml,
134
                $cdbXmlNamespaceUri
135
            )
136
        );
137
138
        return $event;
139
    }
140
141
    /**
142
     * @param EventXmlString $xmlString
143
     * @param StringLiteral $eventId
144
     * @param StringLiteral $cdbXmlNamespaceUri
145
     * @return Event
146
     */
147
    public static function createFromCdbXml(
148
        StringLiteral $eventId,
149
        EventXmlString $xmlString,
150
        StringLiteral $cdbXmlNamespaceUri
151
    ) {
152
        $event = new self();
153
        $event->apply(
154
            new EventCreatedFromCdbXml(
155
                $eventId,
156
                $xmlString,
157
                $cdbXmlNamespaceUri
158
            )
159
        );
160
161
        return $event;
162
    }
163
164
    /**
165
     * @param StringLiteral $eventId
166
     * @param EventXmlString $xmlString
167
     * @param StringLiteral $cdbXmlNamespaceUri
168
     * @return Event
169
     */
170
    public function updateFromCdbXml(
171
        StringLiteral $eventId,
172
        EventXmlString $xmlString,
173
        StringLiteral $cdbXmlNamespaceUri
174
    ) {
175
        $this->apply(
176
            new EventUpdatedFromCdbXml(
177
                $eventId,
178
                $xmlString,
179
                $cdbXmlNamespaceUri
180
            )
181
        );
182
    }
183
184
    /**
185
     * @param Language $language
186
     * @param StringLiteral|null $title
187
     * @param StringLiteral|null $shortDescription
188
     * @param StringLiteral|null $longDescription
189
     */
190
    public function applyTranslation(
191
        Language $language,
192
        StringLiteral $title = null,
193
        StringLiteral $shortDescription = null,
194
        StringLiteral $longDescription = null
195
    ) {
196
        $this->apply(
197
            new TranslationApplied(
198
                new StringLiteral($this->eventId),
199
                $language,
200
                $title,
0 ignored issues
show
Bug introduced by
It seems like $title defined by parameter $title 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
                $shortDescription,
0 ignored issues
show
Bug introduced by
It seems like $shortDescription defined by parameter $shortDescription 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
                $longDescription
0 ignored issues
show
Bug introduced by
It seems like $longDescription defined by parameter $longDescription on line 194 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...
203
            )
204
        );
205
    }
206
207
    /**
208
     * @param Language $language
209
     */
210
    public function deleteTranslation(
211
        Language $language
212
    ) {
213
        if (!array_key_exists($language->getCode(), $this->translations)) {
214
            return;
215
        }
216
217
        $this->apply(
218
            new TranslationDeleted(
219
                new StringLiteral($this->eventId),
220
                $language
221
            )
222
        );
223
    }
224
225
    /**
226
     * {@inheritdoc}
227
     */
228
    public function getAggregateRootId()
229
    {
230
        return $this->eventId;
231
    }
232
233
    /**
234
     * @return Translation[]
235
     */
236
    public function getTranslations()
237
    {
238
        return $this->translations;
239
    }
240
241
    /**
242
     * @return UUID[]
243
     */
244
    public function getMediaObjects()
245
    {
246
        return $this->mediaObjects;
247
    }
248
249
    protected function applyEventCreated(EventCreated $eventCreated)
250
    {
251
        $this->eventId = $eventCreated->getEventId();
252
        $this->workflowStatus = WorkflowStatus::DRAFT();
253
    }
254
255
    protected function applyEventImportedFromUDB2(
256
        EventImportedFromUDB2 $eventImported
257
    ) {
258
        $this->eventId = $eventImported->getEventId();
259
        $this->setUDB2Data($eventImported);
260
    }
261
262
    /**
263
     * @param EventUpdatedFromUDB2 $eventUpdated
264
     */
265
    protected function applyEventUpdatedFromUDB2(
266
        EventUpdatedFromUDB2 $eventUpdated
267
    ) {
268
        $this->setUDB2Data($eventUpdated);
269
    }
270
271
    /**
272
     * @param EventCdbXMLInterface $eventCdbXML
273
     */
274
    protected function setUDB2Data(
275
        EventCdbXMLInterface $eventCdbXML
276
    ) {
277
        $udb2Event = EventItemFactory::createEventFromCdbXml(
278
            $eventCdbXML->getCdbXmlNamespaceUri(),
279
            $eventCdbXML->getCdbXml()
280
        );
281
282
        $this->importWorkflowStatus($udb2Event);
283
        $this->labels = LabelCollection::fromKeywords($udb2Event->getKeywords(true));
284
    }
285
286
    /**
287
     * Update the major info.
288
     *
289
     * @param Title $title
290
     * @param EventType $eventType
291
     * @param Location $location
292
     * @param CalendarInterface $calendar
293
     * @param type $theme
294
     */
295
    public function updateMajorInfo(
296
        Title $title,
297
        EventType $eventType,
298
        Location $location,
299
        CalendarInterface $calendar,
300
        $theme = null
301
    ) {
302
        $this->apply(new MajorInfoUpdated($this->eventId, $title, $eventType, $location, $calendar, $theme));
303
    }
304
305
    protected function applyEventCreatedFromCdbXml(
306
        EventCreatedFromCdbXml $eventCreatedFromCdbXml
307
    ) {
308
        $this->eventId = $eventCreatedFromCdbXml->getEventId()->toNative();
309
310
        $udb2Event = EventItemFactory::createEventFromCdbXml(
311
            $eventCreatedFromCdbXml->getCdbXmlNamespaceUri(),
312
            $eventCreatedFromCdbXml->getEventXmlString()->toEventXmlString()
313
        );
314
315
        $this->labels = LabelCollection::fromKeywords($udb2Event->getKeywords(true));
316
    }
317
318
    protected function applyEventUpdatedFromCdbXml(
319
        EventUpdatedFromCdbXml $eventUpdatedFromCdbXml
320
    ) {
321
        $this->eventId = $eventUpdatedFromCdbXml->getEventId()->toNative();
322
323
        $udb2Event = EventItemFactory::createEventFromCdbXml(
324
            $eventUpdatedFromCdbXml->getCdbXmlNamespaceUri(),
325
            $eventUpdatedFromCdbXml->getEventXmlString()->toEventXmlString()
326
        );
327
328
        $this->labels = LabelCollection::fromKeywords($udb2Event->getKeywords(true));
329
    }
330
331
    protected function applyLabelsMerged(
332
        LabelsMerged $labelsMerged
333
    ) {
334
        $this->labels = $this->labels->merge($labelsMerged->getLabels());
335
    }
336
337
    protected function applyTranslationApplied(
338
        TranslationApplied $translationApplied
339
    ) {
340
        $this->eventId = $translationApplied->getEventId()->toNative();
341
342
        $language = $translationApplied->getLanguage()->getCode();
343
        $translation = new Translation(
344
            $translationApplied->getLanguage(),
345
            $translationApplied->getTitle(),
346
            $translationApplied->getShortdescription(),
347
            $translationApplied->getLongdescription()
348
        );
349
350
        if (!array_key_exists($language, $this->translations)) {
351
            $this->translations[$language] = $translation;
352
        } else {
353
            $newTranslation = $this->translations[$language]->mergeTranslation($translation);
354
            $this->translations[$language] = $newTranslation;
355
        }
356
    }
357
358
    protected function applyTranslationDeleted(
359
        TranslationDeleted $translationDeleted
360
    ) {
361
        $language = $translationDeleted->getLanguage()->getCode();
362
363
        if (array_key_exists($language, $this->translations)) {
364
            unset($this->translations[$language]);
365
        }
366
    }
367
368
    /**
369
     * @inheritdoc
370
     */
371
    public function updateWithCdbXml($cdbXml, $cdbXmlNamespaceUri)
372
    {
373
        $this->apply(
374
            new EventUpdatedFromUDB2(
375
                $this->eventId,
376
                $cdbXml,
377
                $cdbXmlNamespaceUri
378
            )
379
        );
380
    }
381
382
    /**
383
     * @param Label $label
384
     * @return LabelAdded
385
     */
386
    protected function createLabelAddedEvent(Label $label)
387
    {
388
        return new LabelAdded($this->eventId, $label);
389
    }
390
391
    /**
392
     * @param Label $label
393
     * @return LabelRemoved
394
     */
395
    protected function createLabelRemovedEvent(Label $label)
396
    {
397
        return new LabelRemoved($this->eventId, $label);
398
    }
399
400
    /**
401
     * @param Image $image
402
     * @return ImageAdded
403
     */
404
    protected function createImageAddedEvent(Image $image)
405
    {
406
        return new ImageAdded($this->eventId, $image);
407
    }
408
409
    /**
410
     * @param Image $image
411
     * @return ImageRemoved
412
     */
413
    protected function createImageRemovedEvent(Image $image)
414
    {
415
        return new ImageRemoved($this->eventId, $image);
416
    }
417
418
    /**
419
     * @param AbstractUpdateImage $updateImageCommand
420
     * @return ImageUpdated
421
     */
422
    protected function createImageUpdatedEvent(
423
        AbstractUpdateImage $updateImageCommand
424
    ) {
425
        return new ImageUpdated(
426
            $this->eventId,
427
            $updateImageCommand->getMediaObjectId(),
428
            $updateImageCommand->getDescription(),
429
            $updateImageCommand->getCopyrightHolder()
430
        );
431
    }
432
433
    /**
434
     * @param Image $image
435
     * @return MainImageSelected
436
     */
437
    protected function createMainImageSelectedEvent(Image $image)
438
    {
439
        return new MainImageSelected($this->eventId, $image);
440
    }
441
442
    /**
443
     * @param Language $language
444
     * @param StringLiteral $title
445
     * @return TitleTranslated
446
     */
447
    protected function createTitleTranslatedEvent(Language $language, StringLiteral $title)
448
    {
449
        return new TitleTranslated($this->eventId, $language, $title);
450
    }
451
452
    /**
453
     * @param Language $language
454
     * @param StringLiteral $description
455
     * @return DescriptionTranslated
456
     */
457
    protected function createDescriptionTranslatedEvent(Language $language, StringLiteral $description)
458
    {
459
        return new DescriptionTranslated($this->eventId, $language, $description);
460
    }
461
462
    /**
463
     * @param string $description
464
     * @return DescriptionUpdated
465
     */
466
    protected function createDescriptionUpdatedEvent($description)
467
    {
468
        return new DescriptionUpdated($this->eventId, $description);
469
    }
470
471
    /**
472
     * @param string $typicalAgeRange
473
     * @return TypicalAgeRangeUpdated
474
     */
475
    protected function createTypicalAgeRangeUpdatedEvent($typicalAgeRange)
476
    {
477
        return new TypicalAgeRangeUpdated($this->eventId, $typicalAgeRange);
478
    }
479
480
    /**
481
     * @return TypicalAgeRangeDeleted
482
     */
483
    protected function createTypicalAgeRangeDeletedEvent()
484
    {
485
        return new TypicalAgeRangeDeleted($this->eventId);
486
    }
487
488
    /**
489
     * @param string $organizerId
490
     * @return OrganizerUpdated
491
     */
492
    protected function createOrganizerUpdatedEvent($organizerId)
493
    {
494
        return new OrganizerUpdated($this->eventId, $organizerId);
495
    }
496
497
    /**
498
     * @param string $organizerId
499
     * @return OrganizerDeleted
500
     */
501
    protected function createOrganizerDeletedEvent($organizerId)
502
    {
503
        return new OrganizerDeleted($this->eventId, $organizerId);
504
    }
505
506
    /**
507
     * @param ContactPoint $contactPoint
508
     * @return ContactPointUpdated
509
     */
510
    protected function createContactPointUpdatedEvent(ContactPoint $contactPoint)
511
    {
512
        return new ContactPointUpdated($this->eventId, $contactPoint);
513
    }
514
515
    /**
516
     * @param BookingInfo $bookingInfo
517
     * @return BookingInfoUpdated
518
     */
519
    protected function createBookingInfoUpdatedEvent(BookingInfo $bookingInfo)
520
    {
521
        return new BookingInfoUpdated($this->eventId, $bookingInfo);
522
    }
523
524
    /**
525
     * @param PriceInfo $priceInfo
526
     * @return PriceInfoUpdated
527
     */
528
    protected function createPriceInfoUpdatedEvent(PriceInfo $priceInfo)
529
    {
530
        return new PriceInfoUpdated($this->eventId, $priceInfo);
531
    }
532
533
    /**
534
     * @return EventDeleted
535
     */
536
    protected function createOfferDeletedEvent()
537
    {
538
        return new EventDeleted($this->eventId);
539
    }
540
541
    /**
542
     * @inheritdoc
543
     */
544
    protected function createPublishedEvent(\DateTimeInterface $publicationDate)
545
    {
546
        return new Published($this->eventId, $publicationDate);
547
    }
548
549
    /**
550
     * @inheritdoc
551
     */
552
    protected function createApprovedEvent()
553
    {
554
        return new Approved($this->eventId);
555
    }
556
557
    /**
558
     * @inheritdoc
559
     */
560
    protected function createRejectedEvent(StringLiteral $reason)
561
    {
562
        return new Rejected($this->eventId, $reason);
563
    }
564
565
    /**
566
     * @inheritDoc
567
     */
568
    protected function createFlaggedAsDuplicate()
569
    {
570
        return new FlaggedAsDuplicate($this->eventId);
571
    }
572
573
    /**
574
     * @inheritDoc
575
     */
576
    protected function createFlaggedAsInappropriate()
577
    {
578
        return new FlaggedAsInappropriate($this->eventId);
579
    }
580
}
581