Completed
Pull Request — master (#344)
by Luc
05:32
created

PlaceLDProjector::applyPlaceImportedFromUDB2()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 7
rs 9.4285
cc 1
eloc 4
nc 1
nop 1
1
<?php
2
3
namespace CultuurNet\UDB3\Place\ReadModel\JSONLD;
4
5
use Broadway\Domain\DateTime;
6
use Broadway\Domain\DomainMessage;
7
use Broadway\EventHandling\EventListenerInterface;
8
use CultuurNet\UDB3\Actor\ActorImportedFromUDB2;
9
use CultuurNet\UDB3\Address\Address;
10
use CultuurNet\UDB3\Cdb\ActorItemFactory;
11
use CultuurNet\UDB3\EntityServiceInterface;
12
use CultuurNet\UDB3\Event\EventType;
13
use CultuurNet\UDB3\Event\ReadModel\DocumentGoneException;
14
use CultuurNet\UDB3\Event\ReadModel\DocumentRepositoryInterface;
15
use CultuurNet\UDB3\EventListener\EventSpecification;
16
use CultuurNet\UDB3\Iri\IriGeneratorInterface;
17
use CultuurNet\UDB3\Language;
18
use CultuurNet\UDB3\Offer\AvailableTo;
19
use CultuurNet\UDB3\Offer\ReadModel\JSONLD\OfferLDProjector;
20
use CultuurNet\UDB3\Offer\ReadModel\JSONLD\OfferUpdate;
21
use CultuurNet\UDB3\Offer\WorkflowStatus;
22
use CultuurNet\UDB3\Organizer\OrganizerProjectedToJSONLD;
23
use CultuurNet\UDB3\Place\Events\AddressTranslated;
24
use CultuurNet\UDB3\Place\Events\AddressUpdated;
25
use CultuurNet\UDB3\Place\Events\BookingInfoUpdated;
26
use CultuurNet\UDB3\Place\Events\CalendarUpdated;
27
use CultuurNet\UDB3\Place\Events\ContactPointUpdated;
28
use CultuurNet\UDB3\Place\Events\DescriptionTranslated;
29
use CultuurNet\UDB3\Place\Events\DescriptionUpdated;
30
use CultuurNet\UDB3\Place\Events\FacilitiesUpdated;
31
use CultuurNet\UDB3\Place\Events\GeoCoordinatesUpdated;
32
use CultuurNet\UDB3\Place\Events\Image\ImagesImportedFromUDB2;
33
use CultuurNet\UDB3\Place\Events\Image\ImagesUpdatedFromUDB2;
34
use CultuurNet\UDB3\Place\Events\ImageAdded;
35
use CultuurNet\UDB3\Place\Events\ImageRemoved;
36
use CultuurNet\UDB3\Place\Events\ImageUpdated;
37
use CultuurNet\UDB3\Place\Events\LabelAdded;
38
use CultuurNet\UDB3\Place\Events\LabelRemoved;
39
use CultuurNet\UDB3\Place\Events\MainImageSelected;
40
use CultuurNet\UDB3\Place\Events\MajorInfoUpdated;
41
use CultuurNet\UDB3\Place\Events\Moderation\Approved;
42
use CultuurNet\UDB3\Place\Events\Moderation\FlaggedAsDuplicate;
43
use CultuurNet\UDB3\Place\Events\Moderation\FlaggedAsInappropriate;
44
use CultuurNet\UDB3\Place\Events\Moderation\Published;
45
use CultuurNet\UDB3\Place\Events\Moderation\Rejected;
46
use CultuurNet\UDB3\Place\Events\OrganizerDeleted;
47
use CultuurNet\UDB3\Place\Events\OrganizerUpdated;
48
use CultuurNet\UDB3\Place\Events\PlaceCreated;
49
use CultuurNet\UDB3\Place\Events\PlaceDeleted;
50
use CultuurNet\UDB3\Place\Events\PlaceImportedFromUDB2;
51
use CultuurNet\UDB3\Place\Events\PlaceUpdatedFromUDB2;
52
use CultuurNet\UDB3\Place\Events\PriceInfoUpdated;
53
use CultuurNet\UDB3\Place\Events\ThemeUpdated;
54
use CultuurNet\UDB3\Place\Events\TitleTranslated;
55
use CultuurNet\UDB3\Place\Events\TitleUpdated;
56
use CultuurNet\UDB3\Place\Events\TypeUpdated;
57
use CultuurNet\UDB3\Place\Events\TypicalAgeRangeDeleted;
58
use CultuurNet\UDB3\Place\Events\TypicalAgeRangeUpdated;
59
use CultuurNet\UDB3\Place\ReadModel\Relations\RepositoryInterface;
60
use CultuurNet\UDB3\ReadModel\JsonDocument;
61
use CultuurNet\UDB3\ReadModel\JsonDocumentMetaDataEnricherInterface;
62
use CultuurNet\UDB3\Theme;
63
use Symfony\Component\Serializer\SerializerInterface;
64
65
/**
66
 * Projects state changes on Place entities to a JSON-LD read model in a
67
 * document repository.
68
 */
69
class PlaceLDProjector extends OfferLDProjector implements EventListenerInterface
70
{
71
    /**
72
     * @var RepositoryInterface
73
     */
74
    private $placeRelations;
75
76
    /**
77
     * @var CdbXMLImporter
78
     */
79
    protected $cdbXMLImporter;
80
81
    /**
82
     * @param DocumentRepositoryInterface $repository
83
     * @param IriGeneratorInterface $iriGenerator
84
     * @param EntityServiceInterface $organizerService
85
     * @param RepositoryInterface $placeRelations
86
     * @param SerializerInterface $mediaObjectSerializer
87
     * @param CdbXMLImporter $cdbXMLImporter
88
     * @param JsonDocumentMetaDataEnricherInterface $jsonDocumentMetaDataEnricher
89
     * @param EventSpecification $eventFilter
90
     */
91
    public function __construct(
92
        DocumentRepositoryInterface $repository,
93
        IriGeneratorInterface $iriGenerator,
94
        EntityServiceInterface $organizerService,
95
        RepositoryInterface $placeRelations,
96
        SerializerInterface $mediaObjectSerializer,
97
        CdbXMLImporter $cdbXMLImporter,
98
        JsonDocumentMetaDataEnricherInterface $jsonDocumentMetaDataEnricher,
99
        EventSpecification $eventFilter
100
    ) {
101
        parent::__construct(
102
            $repository,
103
            $iriGenerator,
104
            $organizerService,
105
            $mediaObjectSerializer,
106
            $jsonDocumentMetaDataEnricher,
107
            $eventFilter
108
        );
109
110
        $this->placeRelations = $placeRelations;
111
112
        $this->cdbXMLImporter = $cdbXMLImporter;
113
    }
114
115
    /**
116
     * @param PlaceImportedFromUDB2 $placeImportedFromUDB2
117
     * @return JsonDocument
118
     */
119
    protected function applyPlaceImportedFromUDB2(
120
        PlaceImportedFromUDB2 $placeImportedFromUDB2
121
    ) {
122
        return $this->projectActorImportedFromUDB2(
123
            $placeImportedFromUDB2
124
        );
125
    }
126
127
    /**
128
     * @param PlaceUpdatedFromUDB2 $placeUpdatedFromUDB2
129
     * @return JsonDocument
130
     */
131
    protected function applyPlaceUpdatedFromUDB2(
132
        PlaceUpdatedFromUDB2 $placeUpdatedFromUDB2
133
    ) {
134
        return $this->projectActorImportedFromUDB2(
135
            $placeUpdatedFromUDB2
136
        );
137
    }
138
139
    /**
140
     * @param ActorImportedFromUDB2 $actorImportedFromUDB2
141
     * @return JsonDocument
142
     * @throws \CultureFeed_Cdb_ParseException
143
     */
144
    protected function projectActorImportedFromUDB2(
145
        ActorImportedFromUDB2 $actorImportedFromUDB2
146
    ) {
147
        $actorId = $actorImportedFromUDB2->getActorId();
148
149
        $udb2Actor = ActorItemFactory::createActorFromCdbXml(
150
            $actorImportedFromUDB2->getCdbXmlNamespaceUri(),
151
            $actorImportedFromUDB2->getCdbXml()
152
        );
153
154
        try {
155
            $document = $this->loadPlaceDocumentFromRepositoryById($actorId);
156
        } catch (DocumentGoneException $e) {
157
            $document = $this->newDocument($actorId);
158
        }
159
160
        $actorLd = $document->getBody();
161
162
        $actorLd = $this->cdbXMLImporter->documentWithCdbXML(
163
            $actorLd,
164
            $udb2Actor
165
        );
166
167
        // When importing from UDB2 the main language is always nl.
168
        // When updating from UDB2 never change the main language.
169
        if (!isset($actorLd->mainLanguage)) {
170
            $this->setMainLanguage($actorLd, new Language('nl'));
171
        }
172
173
        // Remove geocoordinates, because the address might have been
174
        // updated and we might get inconsistent data if it takes a while
175
        // before the new geocoordinates are added.
176
        // In case geocoding fails, it's also easier to look for places that
177
        // have no geocoordinates instead of places that have incorrect
178
        // geocoordinates.
179
        unset($actorLd->geo);
180
181
        return $document->withBody($actorLd);
182
    }
183
184
    /**
185
     * @param string $id
186
     * @return JsonDocument
187
     */
188 View Code Duplication
    protected function newDocument($id)
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...
189
    {
190
        $document = new JsonDocument($id);
191
192
        $placeLd = $document->getBody();
193
        $placeLd->{'@id'} = $this->iriGenerator->iri($id);
194
        $placeLd->{'@context'} = '/contexts/place';
195
196
        return $document->withBody($placeLd);
197
    }
198
199
    /**
200
     * @param PlaceCreated $placeCreated
201
     * @param DomainMessage $domainMessage
202
     * @return JsonDocument
203
     */
204
    protected function applyPlaceCreated(PlaceCreated $placeCreated, DomainMessage $domainMessage)
205
    {
206
        $document = $this->newDocument($placeCreated->getPlaceId());
207
208
        $jsonLD = $document->getBody();
209
210
        $jsonLD->{'@id'} = $this->iriGenerator->iri(
211
            $placeCreated->getPlaceId()
212
        );
213
214
        $this->setMainLanguage($jsonLD, $placeCreated->getMainLanguage());
215
216
        $jsonLD->name[$placeCreated->getMainLanguage()->getCode()] = $placeCreated->getTitle();
217
218
        $this->setAddress(
219
            $jsonLD,
220
            $placeCreated->getAddress(),
221
            $this->getMainLanguage($jsonLD)
222
        );
223
224
        $calendarJsonLD = $placeCreated->getCalendar()->toJsonLd();
225
        $jsonLD = (object) array_merge((array) $jsonLD, $calendarJsonLD);
226
227
        $availableTo = AvailableTo::createFromCalendar($placeCreated->getCalendar());
228
        $jsonLD->availableTo = (string)$availableTo;
229
230
        $eventType = $placeCreated->getEventType();
231
        $jsonLD->terms = [
232
            $eventType->toJsonLd(),
233
        ];
234
235
        $theme = $placeCreated->getTheme();
236
        if (!empty($theme)) {
237
            $jsonLD->terms[] = $theme->toJsonLd();
238
        }
239
240
        $recordedOn = $domainMessage->getRecordedOn()->toString();
241
        $jsonLD->created = \DateTime::createFromFormat(
242
            DateTime::FORMAT_STRING,
243
            $recordedOn
244
        )->format('c');
245
246
        $jsonLD->modified = $jsonLD->created;
247
248
        $metaData = $domainMessage->getMetadata()->serialize();
249 View Code Duplication
        if (isset($metaData['user_email'])) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across 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...
250
            $jsonLD->creator = $metaData['user_email'];
251
        } elseif (isset($metaData['user_nick'])) {
252
            $jsonLD->creator = $metaData['user_nick'];
253
        }
254
255
        $jsonLD->workflowStatus = WorkflowStatus::DRAFT()->getName();
256
257
        return $document->withBody($jsonLD);
258
    }
259
260
    /**
261
     * @param PlaceDeleted $placeDeleted
262
     * @return null
263
     */
264 View Code Duplication
    protected function applyPlaceDeleted(PlaceDeleted $placeDeleted)
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...
265
    {
266
        $document = $this->loadDocumentFromRepository($placeDeleted);
267
268
        $jsonLD = $document->getBody();
269
270
        $jsonLD->workflowStatus = WorkflowStatus::DELETED()->getName();
271
272
        return $document->withBody($jsonLD);
273
    }
274
275
    /**
276
     * Apply the major info updated command to the projector.
277
     * @param MajorInfoUpdated $majorInfoUpdated
278
     * @return JsonDocument
279
     */
280
    protected function applyMajorInfoUpdated(MajorInfoUpdated $majorInfoUpdated)
281
    {
282
        $document = $this
283
            ->loadPlaceDocumentFromRepositoryById($majorInfoUpdated->getPlaceId())
284
            ->apply(OfferUpdate::calendar($majorInfoUpdated->getCalendar()));
0 ignored issues
show
Compatibility introduced by
$majorInfoUpdated->getCalendar() of type object<CultuurNet\UDB3\CalendarInterface> is not a sub-type of object<CultuurNet\UDB3\Calendar>. It seems like you assume a concrete implementation of the interface CultuurNet\UDB3\CalendarInterface to be always present.

This check looks for parameters that are defined as one type in their type hint or doc comment but seem to be used as a narrower type, i.e an implementation of an interface or a subclass.

Consider changing the type of the parameter or doing an instanceof check before assuming your parameter is of the expected type.

Loading history...
285
286
        $jsonLD = $document->getBody();
287
288
        $jsonLD->name->nl = $majorInfoUpdated->getTitle();
289
290
        $this->setAddress(
291
            $jsonLD,
292
            $majorInfoUpdated->getAddress(),
293
            $this->getMainLanguage($jsonLD)
294
        );
295
296
        $availableTo = AvailableTo::createFromCalendar($majorInfoUpdated->getCalendar());
297
        $jsonLD->availableTo = (string)$availableTo;
298
299
        // Remove old theme and event type.
300
        $jsonLD->terms = array_filter($jsonLD->terms, function ($term) {
301
            return $term->domain !== EventType::DOMAIN &&  $term->domain !== Theme::DOMAIN;
302
        });
303
304
        $eventType = $majorInfoUpdated->getEventType();
305
        $jsonLD->terms = [
306
            $eventType->toJsonLd(),
307
        ];
308
309
        $theme = $majorInfoUpdated->getTheme();
310
        if (!empty($theme)) {
311
            $jsonLD->terms[] = $theme->toJsonLd();
312
        }
313
314
        // Remove geocoordinates, because the address might have been
315
        // updated and we might get inconsistent data if it takes a while
316
        // before the new geocoordinates are added.
317
        // In case geocoding fails, it's also easier to look for places that
318
        // have no geocoordinates instead of places that have incorrect
319
        // geocoordinates.
320
        unset($jsonLD->geo);
321
322
        return $document->withBody($jsonLD);
323
    }
324
325
    /**
326
     * @param AddressUpdated $addressUpdated
327
     * @return JsonDocument
328
     */
329 View Code Duplication
    protected function applyAddressUpdated(AddressUpdated $addressUpdated)
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...
330
    {
331
        $document = $this->loadPlaceDocumentFromRepositoryById($addressUpdated->getPlaceId());
332
        $jsonLD = $document->getBody();
333
        $this->setAddress($jsonLD, $addressUpdated->getAddress(), $this->getMainLanguage($jsonLD));
334
        return $document->withBody($jsonLD);
335
    }
336
337
    /**
338
     * @param AddressTranslated $addressTranslated
339
     * @return JsonDocument
340
     */
341 View Code Duplication
    protected function applyAddressTranslated(AddressTranslated $addressTranslated)
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...
342
    {
343
        $document = $this->loadPlaceDocumentFromRepositoryById($addressTranslated->getPlaceId());
344
        $jsonLD = $document->getBody();
345
        $this->setAddress($jsonLD, $addressTranslated->getAddress(), $addressTranslated->getLanguage());
346
        return $document->withBody($jsonLD);
347
    }
348
349
    /**
350
     * @param \stdClass $jsonLd
351
     * @param Address $address
352
     * @param Language $language
353
     */
354
    protected function setAddress(\stdClass $jsonLd, Address $address, Language $language)
355
    {
356
        if (!isset($jsonLd->address)) {
357
            $jsonLd->address = new \stdClass();
358
        }
359
360
        if (isset($jsonLd->address->streetAddress)) {
361
            // Old projections have their address in a single language.
362
            // Set the old address as the address for the main language before
363
            // updating it or adding another address.
364
            // @replay_i18n
365
            // @see https://jira.uitdatabank.be/browse/III-2201
366
            $mainLanguageCode = $this->getMainLanguage($jsonLd)->getCode();
367
            $jsonLd->address = (object) [
368
                $mainLanguageCode => $jsonLd->address,
369
            ];
370
        }
371
372
        $jsonLd->address->{$language->getCode()} = $address->toJsonLd();
373
    }
374
375
    /**
376
     * @param GeoCoordinatesUpdated $geoCoordinatesUpdated
377
     * @return JsonDocument
378
     */
379 View Code Duplication
    protected function applyGeoCoordinatesUpdated(GeoCoordinatesUpdated $geoCoordinatesUpdated)
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...
380
    {
381
        $document = $this->loadPlaceDocumentFromRepositoryById($geoCoordinatesUpdated->getItemId());
382
383
        $placeLd = $document->getBody();
384
385
        $placeLd->geo = (object) [
386
            'latitude' => $geoCoordinatesUpdated->getCoordinates()->getLatitude()->toDouble(),
387
            'longitude' => $geoCoordinatesUpdated->getCoordinates()->getLongitude()->toDouble(),
388
        ];
389
390
        return $document->withBody($placeLd);
391
    }
392
393
    /**
394
     * @param OrganizerProjectedToJSONLD $organizerProjectedToJSONLD
395
     * @return JsonDocument[]
396
     *
397
     * @throws \CultuurNet\UDB3\EntityNotFoundException
398
     */
399 View Code Duplication
    protected function applyOrganizerProjectedToJSONLD(
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...
400
        OrganizerProjectedToJSONLD $organizerProjectedToJSONLD
401
    ) {
402
        $placeIds = $this->placeRelations->getPlacesOrganizedByOrganizer(
403
            $organizerProjectedToJSONLD->getId()
404
        );
405
406
        $organizer = $this->organizerService->getEntity(
407
            $organizerProjectedToJSONLD->getId()
408
        );
409
410
        $documents = [];
411
412
        foreach ($placeIds as $placeId) {
413
            $document = $this->loadDocumentFromRepositoryByItemId($placeId);
414
            $placeLD = $document->getBody();
415
416
            $newPlaceLD = clone $placeLD;
417
            $newPlaceLD->organizer = json_decode($organizer);
418
419
            if ($newPlaceLD != $placeLD) {
420
                $documents[] = $document->withBody($newPlaceLD);
421
            }
422
        }
423
424
        return $documents;
425
    }
426
427
    /**
428
     * @param string $itemId
429
     * @return JsonDocument
430
     */
431
    protected function loadPlaceDocumentFromRepositoryById($itemId)
432
    {
433
        $document = $this->repository->get($itemId);
434
435
        if (!$document) {
436
            return $this->newDocument($itemId);
437
        }
438
439
        return $document;
440
    }
441
442
    /**
443
     * @return string
444
     */
445
    protected function getLabelAddedClassName()
446
    {
447
        return LabelAdded::class;
448
    }
449
450
    /**
451
     * @return string
452
     */
453
    protected function getLabelRemovedClassName()
454
    {
455
        return LabelRemoved::class;
456
    }
457
458
    /**
459
     * @return string
460
     */
461
    protected function getImageAddedClassName()
462
    {
463
        return ImageAdded::class;
464
    }
465
466
    /**
467
     * @return string
468
     */
469
    protected function getImageRemovedClassName()
470
    {
471
        return ImageRemoved::class;
472
    }
473
474
    /**
475
     * @return string
476
     */
477
    protected function getImageUpdatedClassName()
478
    {
479
        return ImageUpdated::class;
480
    }
481
482
    protected function getMainImageSelectedClassName()
483
    {
484
        return MainImageSelected::class;
485
    }
486
487
    /**
488
     * @return string
489
     */
490
    protected function getTitleTranslatedClassName()
491
    {
492
        return TitleTranslated::class;
493
    }
494
495
    /**
496
     * @return string
497
     */
498
    protected function getDescriptionTranslatedClassName()
499
    {
500
        return DescriptionTranslated::class;
501
    }
502
503
    /**
504
     * @return string
505
     */
506
    protected function getOrganizerUpdatedClassName()
507
    {
508
        return OrganizerUpdated::class;
509
    }
510
511
    /**
512
     * @return string
513
     */
514
    protected function getOrganizerDeletedClassName()
515
    {
516
        return OrganizerDeleted::class;
517
    }
518
519
    protected function getBookingInfoUpdatedClassName()
520
    {
521
        return BookingInfoUpdated::class;
522
    }
523
524
    /**
525
     * @return string
526
     */
527
    protected function getPriceInfoUpdatedClassName()
528
    {
529
        return PriceInfoUpdated::class;
530
    }
531
532
    protected function getContactPointUpdatedClassName()
533
    {
534
        return ContactPointUpdated::class;
535
    }
536
537
    protected function getDescriptionUpdatedClassName()
538
    {
539
        return DescriptionUpdated::class;
540
    }
541
542
    protected function getCalendarUpdatedClassName()
543
    {
544
        return CalendarUpdated::class;
545
    }
546
547
    protected function getTypicalAgeRangeUpdatedClassName()
548
    {
549
        return TypicalAgeRangeUpdated::class;
550
    }
551
552
    protected function getTypicalAgeRangeDeletedClassName()
553
    {
554
        return TypicalAgeRangeDeleted::class;
555
    }
556
557
    protected function getPublishedClassName()
558
    {
559
        return Published::class;
560
    }
561
562
    protected function getApprovedClassName()
563
    {
564
        return Approved::class;
565
    }
566
567
    protected function getRejectedClassName()
568
    {
569
        return Rejected::class;
570
    }
571
572
    protected function getFlaggedAsDuplicateClassName()
573
    {
574
        return FlaggedAsDuplicate::class;
575
    }
576
577
    protected function getFlaggedAsInappropriateClassName()
578
    {
579
        return FlaggedAsInappropriate::class;
580
    }
581
582
    protected function getImagesImportedFromUdb2ClassName()
583
    {
584
        return ImagesImportedFromUDB2::class;
585
    }
586
587
    protected function getImagesUpdatedFromUdb2ClassName()
588
    {
589
        return ImagesUpdatedFromUDB2::class;
590
    }
591
592
    protected function getTitleUpdatedClassName()
593
    {
594
        return TitleUpdated::class;
595
    }
596
597
    protected function getTypeUpdatedClassName()
598
    {
599
        return TypeUpdated::class;
600
    }
601
602
    protected function getThemeUpdatedClassName()
603
    {
604
        return ThemeUpdated::class;
605
    }
606
607
    protected function getFacilitiesUpdatedClassName()
608
    {
609
        return FacilitiesUpdated::class;
610
    }
611
}
612