Completed
Push — master ( f36eb7...96a58d )
by
unknown
36s
created

replacePlaceIdWithItemId()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
3
namespace CultuurNet\UDB3;
4
5
use Broadway\Serializer\SerializerInterface;
6
use Broadway\Serializer\SimpleInterfaceSerializer;
7
use CultuurNet\UDB3\Event\Events\BookingInfoUpdated as EventBookingInfoUpdated;
8
use CultuurNet\UDB3\Event\Events\ContactPointUpdated as EventContactPointUpdated;
9
use CultuurNet\UDB3\Event\Events\DescriptionTranslated;
10
use CultuurNet\UDB3\Event\Events\DescriptionUpdated as EventDescriptionUpdated;
11
use CultuurNet\UDB3\Event\Events\EventDeleted;
12
use CultuurNet\UDB3\Event\Events\EventImportedFromUDB2;
13
use CultuurNet\UDB3\Event\Events\LabelAdded;
14
use CultuurNet\UDB3\Event\Events\LabelRemoved;
15
use CultuurNet\UDB3\Event\Events\MajorInfoUpdated;
16
use CultuurNet\UDB3\Event\Events\OrganizerDeleted as EventOrganizerDeleted;
17
use CultuurNet\UDB3\Event\Events\OrganizerUpdated as EventOrganizerUpdated;
18
use CultuurNet\UDB3\Event\Events\TitleTranslated;
19
use CultuurNet\UDB3\Event\Events\TypicalAgeRangeDeleted as EventTypicalAgeRangeDeleted;
20
use CultuurNet\UDB3\Event\Events\TypicalAgeRangeUpdated as EventTypicalAgeRangeUpdated;
21
use CultuurNet\UDB3\EventSourcing\PayloadManipulatingSerializer;
22
use CultuurNet\UDB3\Label\ReadModels\JSON\Repository\ReadRepositoryInterface;
23
use CultuurNet\UDB3\Label\ValueObjects\Visibility;
24
use CultuurNet\UDB3\Place\Events\BookingInfoUpdated as PlaceBookingInfoUpdated;
25
use CultuurNet\UDB3\Place\Events\ContactPointUpdated as PlaceContactPointUpdated;
26
use CultuurNet\UDB3\Place\Events\DescriptionUpdated as PlaceDescriptionUpdated;
27
use CultuurNet\UDB3\Place\Events\OrganizerDeleted as PlaceOrganizerDeleted;
28
use CultuurNet\UDB3\Place\Events\OrganizerUpdated as PlaceOrganizerUpdated;
29
use CultuurNet\UDB3\Place\Events\PlaceDeleted;
30
use CultuurNet\UDB3\Place\Events\TypicalAgeRangeDeleted as PlaceTypicalAgeRangeDeleted;
31
use CultuurNet\UDB3\Place\Events\TypicalAgeRangeUpdated as PlaceTypicalAgeRangeUpdated;
32
use ValueObjects\Identity\UUID;
33
34
/**
35
 * Factory chaining together the logic to manipulate the payload of old events
36
 * in order to make it usable by new events.
37
 *
38
 * Some cases:
39
 * - changing the class name / namespace after class renames
40
 * - changing the names of properties
41
 */
42
class BackwardsCompatiblePayloadSerializerFactory
43
{
44
    private function __construct()
45
    {
46
47
    }
48
49
    /**
50
     * @param ReadRepositoryInterface $labelRepository
51
     * @return SerializerInterface
52
     */
53
    public static function createSerializer(ReadRepositoryInterface $labelRepository)
54
    {
55
        $payloadManipulatingSerializer = new PayloadManipulatingSerializer(
56
            new SimpleInterfaceSerializer()
57
        );
58
59
        /*
60
         * CREATE EVENTS
61
         *
62
         */
63
64
        $payloadManipulatingSerializer->manipulateEventsOfClass(
65
            'CultuurNet\UDB3\Event\Events\EventCreated',
66
            function (array $serializedObject) {
67
                return self::addDefaultMainLanguage($serializedObject);
68
            }
69
        );
70
71
        $payloadManipulatingSerializer->manipulateEventsOfClass(
72
            'CultuurNet\UDB3\Place\Events\PlaceCreated',
73
            function (array $serializedObject) {
74
                return self::addDefaultMainLanguage($serializedObject);
75
            }
76
        );
77
78
        $payloadManipulatingSerializer->manipulateEventsOfClass(
79
            'CultuurNet\UDB3\Organizer\Events\OrganizerCreatedWithUniqueWebsite',
80
            function (array $serializedObject) {
81
                return self::addDefaultMainLanguage($serializedObject);
82
            }
83
        );
84
85
        /*
86
         * TRANSLATION EVENTS
87
         */
88
89
        $payloadManipulatingSerializer->manipulateEventsOfClass(
90
            'CultuurNet\UDB3\Event\TitleTranslated',
91
            function (array $serializedObject) {
92
                $serializedObject['class'] = TitleTranslated::class;
93
94
                $serializedObject = self::replaceEventIdWithItemId($serializedObject);
95
96
                return $serializedObject;
97
            }
98
        );
99
100
        $payloadManipulatingSerializer->manipulateEventsOfClass(
101
            'CultuurNet\UDB3\Event\DescriptionTranslated',
102
            function (array $serializedObject) {
103
                $serializedObject['class'] = DescriptionTranslated::class;
104
105
                $serializedObject = self::replaceEventIdWithItemId($serializedObject);
106
107
                return $serializedObject;
108
            }
109
        );
110
111
        /*
112
         * LABEL EVENTS
113
         */
114
115
        $payloadManipulatingSerializer->manipulateEventsOfClass(
116
            'CultuurNet\UDB3\Label\Events\MadeInvisible',
117
            function (array $serializedObject) use ($labelRepository) {
118
                return self::addLabelName($serializedObject, $labelRepository);
119
            }
120
        );
121
122
        $payloadManipulatingSerializer->manipulateEventsOfClass(
123
            'CultuurNet\UDB3\Label\Events\MadeVisible',
124
            function (array $serializedObject) use ($labelRepository) {
125
                return self::addLabelName($serializedObject, $labelRepository);
126
            }
127
        );
128
129
        $payloadManipulatingSerializer->manipulateEventsOfClass(
130
            'CultuurNet\UDB3\Label\Events\MadePrivate',
131
            function (array $serializedObject) use ($labelRepository) {
132
                return self::addLabelName($serializedObject, $labelRepository);
133
            }
134
        );
135
136
        $payloadManipulatingSerializer->manipulateEventsOfClass(
137
            'CultuurNet\UDB3\Label\Events\MadePublic',
138
            function (array $serializedObject) use ($labelRepository) {
139
                return self::addLabelName($serializedObject, $labelRepository);
140
            }
141
        );
142
143
        $payloadManipulatingSerializer->manipulateEventsOfClass(
144
            'CultuurNet\UDB3\Organizer\Events\LabelAdded',
145
            function (array $serializedObject) use ($labelRepository) {
146
                return self::fixOrganizerLabelEvent($serializedObject, $labelRepository);
147
            }
148
        );
149
150
        $payloadManipulatingSerializer->manipulateEventsOfClass(
151
            'CultuurNet\UDB3\Organizer\Events\LabelRemoved',
152
            function (array $serializedObject) use ($labelRepository) {
153
                return self::fixOrganizerLabelEvent($serializedObject, $labelRepository);
154
            }
155
        );
156
157
        $payloadManipulatingSerializer->manipulateEventsOfClass(
158
            'CultuurNet\UDB3\Event\Events\EventWasLabelled',
159
            function (array $serializedObject) {
160
                $serializedObject['class'] = LabelAdded::class;
161
162
                $serializedObject = self::replaceEventIdWithItemId($serializedObject);
163
164
                return $serializedObject;
165
            }
166
        );
167
168
        $payloadManipulatingSerializer->manipulateEventsOfClass(
169
            'CultuurNet\UDB3\Event\EventWasTagged',
170
            function (array $serializedObject) {
171
                $serializedObject['class'] = LabelAdded::class;
172
173
                $serializedObject = self::replaceEventIdWithItemId($serializedObject);
174
175
                $serializedObject = self::replaceKeywordWithLabel($serializedObject);
176
177
                return $serializedObject;
178
            }
179
        );
180
181
        $payloadManipulatingSerializer->manipulateEventsOfClass(
182
            'CultuurNet\UDB3\Event\TagErased',
183
            function (array $serializedObject) {
184
                $serializedObject['class'] = LabelRemoved::class;
185
186
                $serializedObject = self::replaceEventIdWithItemId($serializedObject);
187
188
                $serializedObject = self::replaceKeywordWithLabel($serializedObject);
189
190
                return $serializedObject;
191
            }
192
        );
193
194
        $payloadManipulatingSerializer->manipulateEventsOfClass(
195
            'CultuurNet\UDB3\Event\Events\Unlabelled',
196
            function (array $serializedObject) {
197
                $serializedObject['class'] = LabelRemoved::class;
198
199
                $serializedObject = self::replaceEventIdWithItemId($serializedObject);
200
201
                return $serializedObject;
202
            }
203
        );
204
205
        /**
206
         * UBD2 IMPORT
207
         */
208
209
        $payloadManipulatingSerializer->manipulateEventsOfClass(
210
            'CultuurNet\UDB3\Event\EventImportedFromUDB2',
211
            function (array $serializedObject) {
212
                $serializedObject['class'] = EventImportedFromUDB2::class;
213
214
                return $serializedObject;
215
            }
216
        );
217
218
        /**
219
         * PLACE FACILITIES EVENT
220
         */
221
        $payloadManipulatingSerializer->manipulateEventsOfClass(
222
            'CultuurNet\UDB3\Place\Events\FacilitiesUpdated',
223
            function (array $serializedObject) {
224
                $serializedObject = self::replacePlaceIdWithItemId($serializedObject);
225
226
                return $serializedObject;
227
            }
228
        );
229
230
        /**
231
         * GEOCOORDINATES UPDATED EVENT
232
         */
233
        $payloadManipulatingSerializer->manipulateEventsOfClass(
234
            'CultuurNet\UDB3\Place\Events\GeoCoordinatesUpdated',
235
            function (array $serializedObject) {
236
                $serializedObject = self::replacePlaceIdWithItemId($serializedObject);
237
238
                return $serializedObject;
239
            }
240
        );
241
242
        /**
243
         * EventEvent to AbstractEvent (Offer)
244
         */
245
        $refactoredEventEvents = [
246
            EventBookingInfoUpdated::class,
247
            EventTypicalAgeRangeDeleted::class,
248
            EventTypicalAgeRangeUpdated::class,
249
            EventContactPointUpdated::class,
250
            MajorInfoUpdated::class,
251
            EventOrganizerUpdated::class,
252
            EventOrganizerDeleted::class,
253
            EventDescriptionUpdated::class,
254
            EventDeleted::class,
255
        ];
256
257
        foreach ($refactoredEventEvents as $refactoredEventEvent) {
258
            $payloadManipulatingSerializer->manipulateEventsOfClass(
259
                $refactoredEventEvent,
260
                function (array $serializedObject) {
261
                    $serializedObject = self::replaceEventIdWithItemId($serializedObject);
262
                    return $serializedObject;
263
                }
264
            );
265
        }
266
267
        /**
268
         * PlaceEvent to AbstractEvent (Offer)
269
         */
270
        $refactoredPlaceEvents = [
271
            PlaceOrganizerUpdated::class,
272
            PlaceOrganizerDeleted::class,
273
            PlaceBookingInfoUpdated::class,
274
            PlaceTypicalAgeRangeDeleted::class,
275
            PlaceTypicalAgeRangeUpdated::class,
276
            PlaceContactPointUpdated::class,
277
            PlaceDescriptionUpdated::class,
278
            PlaceDeleted::class,
279
        ];
280
281
        foreach ($refactoredPlaceEvents as $refactoredPlaceEvent) {
282
            $payloadManipulatingSerializer->manipulateEventsOfClass(
283
                $refactoredPlaceEvent,
284
                function (array $serializedObject) {
285
                    $serializedObject = self::replacePlaceIdWithItemId($serializedObject);
286
                    return $serializedObject;
287
                }
288
            );
289
        }
290
291
        return $payloadManipulatingSerializer;
292
    }
293
294
    /**
295
     * @param array $serializedObject
296
     * @return array
297
     */
298
    private static function replaceEventIdWithItemId(array $serializedObject)
299
    {
300
        return self::replaceKeys('event_id', 'item_id', $serializedObject);
301
    }
302
303
    /**
304
     * @param array $serializedObject
305
     * @return array
306
     */
307
    private static function replacePlaceIdWithItemId(array $serializedObject)
308
    {
309
        return self::replaceKeys('place_id', 'item_id', $serializedObject);
310
    }
311
312
    /**
313
     * @param string $oldKey
314
     * @param string $newKey
315
     * @param array $serializedObject
316
     * @return array
317
     */
318
    private static function replaceKeys($oldKey, $newKey, $serializedObject)
319
    {
320
        if (isset($serializedObject['payload'][$oldKey])) {
321
            $value = $serializedObject['payload'][$oldKey];
322
            $serializedObject['payload'][$newKey] = $value;
323
            unset($serializedObject['payload'][$oldKey]);
324
        }
325
326
        return $serializedObject;
327
    }
328
329
    /**
330
     * @param array $serializedObject
331
     * @return array
332
     */
333
    private static function replaceKeywordWithLabel(array $serializedObject)
334
    {
335
        $keyword = $serializedObject['payload']['keyword'];
336
        $serializedObject['payload']['label'] = $keyword;
337
        unset($serializedObject['payload']['keyword']);
338
339
        return $serializedObject;
340
    }
341
342
    /**
343
     * @param array $serializedObject
344
     * @param ReadRepositoryInterface $labelRepository
345
     * @return array
346
     */
347
    private static function addLabelName(
348
        array $serializedObject,
349
        ReadRepositoryInterface $labelRepository
350
    ) {
351
        if (!isset($serializedObject['payload']['name'])) {
352
            $uuid = $serializedObject['payload']['uuid'];
353
            $label = $labelRepository->getByUuid(new UUID($uuid));
354
355
            $serializedObject['payload']['name'] = $label->getName()->toNative();
356
        }
357
358
        return $serializedObject;
359
    }
360
361
    /**
362
     * @param array $serializedObject
363
     * @param ReadRepositoryInterface $labelRepository
364
     * @return array
365
     */
366
    private static function fixOrganizerLabelEvent(
367
        array $serializedObject,
368
        ReadRepositoryInterface $labelRepository
369
    ) {
370
        if (!isset($serializedObject['payload']['label']) ||
371
            !isset($serializedObject['payload']['visibility'])) {
372
            $uuid = $serializedObject['payload']['labelId'];
373
            $label = $labelRepository->getByUuid(new UUID($uuid));
374
375
            $serializedObject['payload']['label'] = $label->getName()->toNative();
376
            $serializedObject['payload']['visibility'] = $label->getVisibility() === Visibility::VISIBLE();
377
        }
378
379
        return $serializedObject;
380
    }
381
382
    /**
383
     * @param array $serializedObject
384
     * @return array
385
     */
386
    private static function addDefaultMainLanguage(array $serializedObject)
387
    {
388
        if (!isset($serializedObject['payload']['main_language'])) {
389
            $mainLanguage = new Language('nl');
390
            $serializedObject['payload']['main_language'] = $mainLanguage->getCode();
391
        }
392
393
        return $serializedObject;
394
    }
395
}
396