Completed
Pull Request — master (#121)
by Kristof
05:11
created

EventCommandHandler::handleUnlabel()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %
Metric Value
dl 0
loc 8
rs 9.4285
cc 1
eloc 4
nc 1
nop 1
1
<?php
2
3
4
namespace CultuurNet\UDB3\Event;
5
6
use Broadway\Repository\RepositoryInterface;
7
use CultuurNet\UDB3\CommandHandling\Udb3CommandHandler;
8
use CultuurNet\UDB3\Event\Commands\AddImage;
9
use CultuurNet\UDB3\Event\Commands\ApplyLabel;
10
use CultuurNet\UDB3\Event\Commands\DeleteEvent;
11
use CultuurNet\UDB3\Event\Commands\RemoveImage;
12
use CultuurNet\UDB3\Event\Commands\DeleteOrganizer;
13
use CultuurNet\UDB3\Event\Commands\DeleteTypicalAgeRange;
14
use CultuurNet\UDB3\Event\Commands\LabelEvents;
15
use CultuurNet\UDB3\Event\Commands\LabelQuery;
16
use CultuurNet\UDB3\Event\Commands\Unlabel;
17
use CultuurNet\UDB3\Event\Commands\UpdateBookingInfo;
18
use CultuurNet\UDB3\Event\Commands\UpdateContactPoint;
19
use CultuurNet\UDB3\Event\Commands\UpdateDescription;
20
use CultuurNet\UDB3\Event\Commands\UpdateImage;
21
use CultuurNet\UDB3\Event\Commands\UpdateMajorInfo;
22
use CultuurNet\UDB3\Event\Commands\UpdateOrganizer;
23
use CultuurNet\UDB3\Event\Commands\UpdateTypicalAgeRange;
24
use CultuurNet\UDB3\Label as Label;
25
use CultuurNet\UDB3\Search\Results;
26
use CultuurNet\UDB3\Search\SearchServiceInterface;
27
use Guzzle\Http\Exception\ClientErrorResponseException;
28
use Psr\Log\LoggerAwareInterface;
29
use Psr\Log\LoggerAwareTrait;
30
31
/**
32
 * Commandhandler for events
33
 */
34
class EventCommandHandler extends Udb3CommandHandler implements LoggerAwareInterface
35
{
36
    use LoggerAwareTrait;
37
38
    /**
39
     * @var RepositoryInterface
40
     */
41
    protected $eventRepository;
42
43
    /**
44
     * @var SearchServiceInterface
45
     */
46
    protected $searchService;
47
48
    public function __construct(
49
        RepositoryInterface $eventRepository,
50
        SearchServiceInterface $searchService
51
    ) {
52
        $this->eventRepository = $eventRepository;
53
        $this->searchService = $searchService;
54
    }
55
56
    public function handleLabelEvents(LabelEvents $labelEvents)
57
    {
58
        foreach ($labelEvents->getEventIds() as $eventId) {
59
            $this->labelEvent($labelEvents->getLabel(), $eventId);
0 ignored issues
show
Compatibility introduced by
$labelEvents->getLabel() of type object<CultuurNet\Entry\Keyword> is not a sub-type of object<CultuurNet\UDB3\Label>. It seems like you assume a child class of the class CultuurNet\Entry\Keyword 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...
60
        }
61
    }
62
63
    public function handleLabelQuery(LabelQuery $labelQuery)
64
    {
65
        $query = $labelQuery->getQuery();
66
67
        // do a pre query to test if the query is valid and check the item count
68
        $preQueryResult = $this->searchService->search($query, 1, 0);
69
        $totalItemCount = $preQueryResult->getTotalItems()->toNative();
70
71
        if (0 === $totalItemCount) {
72
            return;
73
        }
74
75
        // change this pageSize value to increase or decrease the page size;
76
        $pageSize = 10;
77
        $pageCount = ceil($totalItemCount / $pageSize);
78
        $pageCounter = 0;
79
        $labelledEventIds = [];
80
81
        //Page querying the search service;
82
        while ($pageCounter < $pageCount) {
83
            $start = $pageCounter * $pageSize;
84
            // Sort ascending by creation date to make sure we get a quite consistent paging.
85
            $sort = 'creationdate asc';
86
            $results = $this->searchService->search(
87
                $query,
88
                $pageSize,
89
                $start,
90
                $sort
91
            );
92
93
            // Iterate the results of the current page and get their IDs
94
            // by stripping them from the json-LD representation
95
            foreach ($results->getItems() as $event) {
96
                $expoId = explode('/', $event['@id']);
97
                $eventId = array_pop($expoId);
98
99
                if (!array_key_exists($eventId, $labelledEventIds)) {
100
                    $labelledEventIds[$eventId] = $pageCounter;
101
102
                    $this->labelEvent($labelQuery->getLabel(), $eventId);
103
                } else {
104
                    if ($this->logger) {
105
                        $this->logger->error(
106
                            'query_duplicate_event',
107
                            array(
108
                                'query' => $query,
109
                                'error' => "found duplicate event {$eventId} on page {$pageCounter}, occurred first time on page {$labelledEventIds[$eventId]}"
110
                            )
111
                        );
112
                    }
113
                }
114
            }
115
            ++$pageCounter;
116
        };
117
    }
118
119
    /**
120
     * Labels a single event with a keyword.
121
     *
122
     * @param Label $label
123
     * @param $eventId
124
     */
125
    private function labelEvent(Label $label, $eventId)
126
    {
127
        /** @var Event $event */
128
        $event = $this->eventRepository->load($eventId);
129
        $event->label($label);
130
        try {
131
            $this->eventRepository->save($event);
132
133
            if ($this->logger) {
134
                $this->logger->info(
135
                    'event_was_labelled',
136
                    array(
137
                        'event_id' => $eventId,
138
                    )
139
                );
140
            }
141
        } catch (\Exception $e) {
142
            if ($this->logger) {
143
                $this->logger->error(
144
                    'event_was_not_labelled',
145
                    array(
146
                        'event_id' => $eventId,
147
                        'error' => $e->getMessage(),
148
                        'exception_class' => get_class($e),
149
                    )
150
                );
151
            }
152
        }
153
    }
154
155
    public function handleTranslateTitle(TranslateTitle $translateTitle)
156
    {
157
        /** @var Event $event */
158
        $event = $this->eventRepository->load($translateTitle->getId());
159
160
        $event->translateTitle(
161
            $translateTitle->getLanguage(),
162
            $translateTitle->getTitle()
163
        );
164
165
        $this->eventRepository->save($event);
166
    }
167
168
    public function handleTranslateDescription(
169
        TranslateDescription $translateDescription
170
    ) {
171
172
        /** @var Event $event */
173
        $event = $this->eventRepository->load($translateDescription->getId());
174
175
        $event->translateDescription(
176
            $translateDescription->getLanguage(),
177
            $translateDescription->getDescription()
178
        );
179
180
        $this->eventRepository->save($event);
181
    }
182
183
    /**
184
     * Handle an update command to update the main description.
185
     */
186
    public function handleUpdateDescription(UpdateDescription $updateDescription)
187
    {
188
189
        /** @var Event $event */
190
        $event = $this->eventRepository->load($updateDescription->getId());
191
192
        $event->updateDescription(
193
            $updateDescription->getDescription()
194
        );
195
196
        $this->eventRepository->save($event);
197
198
    }
199
200
    /**
201
     * Handle an update command to update the typical age range.
202
     */
203
    public function handleUpdateTypicalAgeRange(UpdateTypicalAgeRange $updateTypicalAgeRange)
204
    {
205
206
        /** @var Event $event */
207
        $event = $this->eventRepository->load($updateTypicalAgeRange->getId());
208
209
        $event->updateTypicalAgeRange(
210
            $updateTypicalAgeRange->getTypicalAgeRange()
211
        );
212
213
        $this->eventRepository->save($event);
214
215
    }
216
217
    /**
218
     * Handle the deletion of typical age range on an event.
219
     */
220
    public function handleDeleteTypicalAgeRange(DeleteTypicalAgeRange $deleteTypicalAgeRange)
221
    {
222
223
        /** @var Event $event */
224
        $event = $this->eventRepository->load($deleteTypicalAgeRange->getId());
225
226
        $event->deleteTypicalAgeRange();
227
228
        $this->eventRepository->save($event);
229
230
    }
231
232
    /**
233
     * Handle an update command to update organizer.
234
     */
235
    public function handleUpdateOrganizer(UpdateOrganizer $updateOrganizer)
236
    {
237
238
        /** @var Event $event */
239
        $event = $this->eventRepository->load($updateOrganizer->getId());
240
241
        $event->updateOrganizer(
242
            $updateOrganizer->getOrganizerId()
243
        );
244
245
        $this->eventRepository->save($event);
246
247
    }
248
249
    /**
250
     * Handle an update command to delete the organizer.
251
     */
252
    public function handleDeleteOrganizer(DeleteOrganizer $deleteOrganizer)
253
    {
254
255
        /** @var Event $event */
256
        $event = $this->eventRepository->load($deleteOrganizer->getId());
257
258
        $event->deleteOrganizer(
259
            $deleteOrganizer->getOrganizerId()
260
        );
261
262
        $this->eventRepository->save($event);
263
264
    }
265
266
    /**
267
     * Handle an update command to updated the contact point.
268
     */
269
    public function handleUpdateContactPoint(UpdateContactPoint $updateContactPoint)
270
    {
271
272
        /** @var Event $event */
273
        $event = $this->eventRepository->load($updateContactPoint->getId());
274
275
        $event->updateContactPoint(
276
            $updateContactPoint->getContactPoint()
277
        );
278
279
        $this->eventRepository->save($event);
280
281
    }
282
283
    /**
284
     * Handle an update command to updated the booking info.
285
     */
286
    public function handleUpdateBookingInfo(UpdateBookingInfo $updateBookingInfo)
287
    {
288
289
        /** @var Event $event */
290
        $event = $this->eventRepository->load($updateBookingInfo->getId());
291
292
        $event->updateBookingInfo(
293
            $updateBookingInfo->getBookingInfo()
294
        );
295
296
        $this->eventRepository->save($event);
297
298
    }
299
300
    /**
301
     * Handle an add image command.
302
     * @param AddImage $addImage
303
     */
304
    public function handleAddImage(AddImage $addImage)
305
    {
306
307
        /** @var Event $event */
308
        $event = $this->eventRepository->load($addImage->getId());
309
310
        $event->addImage(
311
            $addImage->getImage()
312
        );
313
314
        $this->eventRepository->save($event);
315
316
    }
317
318
    /**
319
     * Handle an update image command.
320
     * @param UpdateImage $updateImage
321
     */
322
    public function handleUpdateImage(UpdateImage $updateImage)
323
    {
324
        /** @var Event $event */
325
        $event = $this->eventRepository->load($updateImage->getItemId());
326
327
        $event->updateImage($updateImage);
328
329
        $this->eventRepository->save($event);
330
    }
331
332
    /**
333
     * Handle a remove image command.
334
     * @param RemoveImage $removeImage
335
     */
336
    public function handleRemoveImage(RemoveImage $removeImage)
337
    {
338
        /** @var Event $event */
339
        $event = $this->eventRepository->load($removeImage->getItemId());
340
341
        $event->removeImage($removeImage->getImage());
342
343
        $this->eventRepository->save($event);
344
    }
345
346
    /**
347
     * Handle an update the major info command.
348
     */
349 View Code Duplication
    public function handleUpdateMajorInfo(UpdateMajorInfo $updateMajorInfo)
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...
350
    {
351
352
        /** @var Event $event */
353
        $event = $this->eventRepository->load($updateMajorInfo->getId());
354
355
        $event->updateMajorInfo(
356
            $updateMajorInfo->getTitle(),
357
            $updateMajorInfo->getEventType(),
358
            $updateMajorInfo->getLocation(),
359
            $updateMajorInfo->getCalendar(),
360
            $updateMajorInfo->getTheme()
0 ignored issues
show
Documentation introduced by
$updateMajorInfo->getTheme() is of type object<CultuurNet\UDB3\Theme>, but the function expects a object<CultuurNet\UDB3\Event\type>|null.

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...
361
        );
362
363
        $this->eventRepository->save($event);
364
365
    }
366
367
    /**
368
     * Handle a delete event command.
369
     */
370
    public function handleDeleteEvent(DeleteEvent $deleteEvent)
371
    {
372
373
        /** @var Event $event */
374
        $event = $this->eventRepository->load($deleteEvent->getId());
375
        $event->deleteEvent();
376
377
        $this->eventRepository->save($event);
378
379
    }
380
381
    public function handleApplyLabel(ApplyLabel $label)
382
    {
383
        /** @var Event $event */
384
        $event = $this->eventRepository->load($label->getEventId());
385
        $event->label($label->getLabel());
386
387
        $this->eventRepository->save($event);
388
    }
389
390
    public function handleUnlabel(Unlabel $label)
391
    {
392
        /** @var Event $event */
393
        $event = $this->eventRepository->load($label->getEventId());
394
        $event->unlabel($label->getLabel());
395
396
        $this->eventRepository->save($event);
397
    }
398
}
399