File size: 1,909 Bytes
d2897cd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php

namespace Mautic\WebhookBundle\Form\DataTransformer;

use Doctrine\Common\Collections\Collection;
use Mautic\WebhookBundle\Entity\Event;
use Mautic\WebhookBundle\Entity\Webhook;
use Symfony\Component\Form\DataTransformerInterface;

/**
 * @implements DataTransformerInterface<Collection<int, Event>, array<int, string>>
 */
class EventsToArrayTransformer implements DataTransformerInterface
{
    public function __construct(
        private Webhook $webhook
    ) {
    }

    /**
     * Convert from the PersistentCollection of Event entities to a simple array.
     *
     * @param $events Collection<int, Event>
     *
     * @return array<int, string>
     */
    public function transform($events)
    {
        $eventArray = [];
        foreach ($events as $event) {
            $eventArray[] = $event->getEventType();
        }

        return $eventArray;
    }

    /**
     * Convert a simple array into a PersistentCollection of Event entities.
     *
     * @param $submittedArray array<int, string>
     *
     * @return Collection<int, Event>
     */
    public function reverseTransform($submittedArray)
    {
        // Get a list of existing events and types

        $events     = $this->webhook->getEvents();
        $eventTypes = $events->getKeys();

        // Check to see what events have been removed
        $removed = array_diff($eventTypes, $submittedArray);
        foreach ($removed as $type) {
            $this->webhook->removeEvent($events[$type]);
        }

        // Now check to see what events have been added
        $added = array_diff($submittedArray, $eventTypes);
        foreach ($added as $type) {
            // Create a new entity
            $event = new Event();
            $event->setWebhook($this->webhook)->setEventType($type);
            $events[] = $event;
        }

        $this->webhook->setEvents($events);

        return $events;
    }
}