Completed
Pull Request — master (#485)
by
unknown
01:58
created

SlotReplacement::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 7
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace HDNET\Calendarize\Compatibility;
6
7
use HDNET\Calendarize\Command\ImportCommandController;
8
use HDNET\Calendarize\Domain\Repository\IndexRepository;
9
use HDNET\Calendarize\Event\AddTimeFrameConstraintsEvent;
10
use HDNET\Calendarize\Event\ImportSingleIcalEvent;
11
use TYPO3\CMS\Core\Messaging\FlashMessage;
12
use TYPO3\CMS\Core\Messaging\FlashMessageService;
13
use TYPO3\CMS\Core\Utility\GeneralUtility;
14
use TYPO3\CMS\Extbase\SignalSlot\Dispatcher;
15
16
/**
17
 * @extensionScannerIgnoreFile
18
 */
19
class SlotReplacement
20
{
21
    /**
22
     * @var Dispatcher
23
     */
24
    protected $signalSlotDispatcher;
25
26
    /**
27
     * Flash message service.
28
     *
29
     * @var FlashMessageService
30
     */
31
    protected $flashMessageService;
32
33
    public function __construct(
34
        Dispatcher $signalSlotDispatcher,
35
        FlashMessageService $flashMessageService
36
    ) {
37
        $this->signalSlotDispatcher = $signalSlotDispatcher;
38
        $this->flashMessageService = $flashMessageService;
39
    }
40
41
    public function emitImportCommand(ImportSingleIcalEvent $event)
42
    {
43
        $icalEvent = $event->getEvent();
44
        $this->signalSlotDispatcher->dispatch(
45
            ImportCommandController::class,
46
            'importCommand',
47
            [
48
                'event' => [
49
                    'uid' => $icalEvent->getUid(),
50
                    'start' => $icalEvent->getStartDate()->add(\DateInterval::createFromDateString($icalEvent->getStartTime() . ' seconds')),
51
                    'end' => ($icalEvent->getEndDate() ?? $icalEvent->getStartDate())->add(\DateInterval::createFromDateString($icalEvent->getEndTime() . ' seconds')),
52
                    'title' => $icalEvent->getTitle(),
53
                    'description' => $icalEvent->getDescription(),
54
                    'location' => $icalEvent->getLocation(),
55
                ],
56
                'commandController' => $this, // Implements all public functions
57
                'pid' => $event->getPid(),
58
                'handled' => false,
59
            ]
60
        );
61
    }
62
63
    public function emitAddDateTimeFrameConstraints(AddTimeFrameConstraintsEvent $event): void
64
    {
65
        $start = $event->getStart();
66
        $end = $event->getEnd();
67
68
        // The start and end dates are expected as UTC timestamps
69
        if (null !== $start) {
70
            $start = strtotime($start->format('Y-m-d H:i:s') . ' UTC');
71
        }
72
        if (null !== $end) {
73
            $end = strtotime($end->format('Y-m-d H:i:s') . ' UTC');
74
        }
75
76
        $constraints = &$event->getConstraints();
77
        $arguments = [
78
            'constraints' => &$constraints,
79
            'query' => $event->getQuery(),
80
            'startTime' => $start,
81
            'endTime' => $end,
82
            'additionalSlotArguments' => $event->getAdditionalArguments(),
83
        ];
84
        $arguments = $this->signalSlotDispatcher->dispatch(
85
            IndexRepository::class,
86
            'addTimeFrameConstraints',
87
            $arguments
88
        );
89
90
        // If the dates changed, we write them back
91
        // Note: A new DateTime with '@' is in the UTC timezone.
92
        //       This is fine here, since no timezone conversion should later happen.
93
        if ($arguments['startTime'] !== $start) {
94
            if (null === $arguments['startTime']) {
95
                $event->setStart(null);
96
            } else {
97
                $event->setStart(new \DateTime("@{$arguments['startTime']}"));
98
            }
99
        }
100
        if ($arguments['endTime'] !== $end) {
101
            if (null === $arguments['endTime']) {
102
                $event->setEnd(null);
103
            } else {
104
                $event->setEnd(new \DateTime("@{$arguments['endTime']}"));
105
            }
106
        }
107
    }
108
109
    //--------------------------------------------------------------------
110
    // Public functions from AbstractCommandController for compatibility
111
    //--------------------------------------------------------------------
112
113
    /**
114
     * Adds a message to the FlashMessageQueue or prints it to the CLI.
115
     *
116
     * @param mixed  $message
117
     * @param string $title
118
     * @param int    $severity
119
     */
120
    public function enqueueMessage($message, $title = '', $severity = FlashMessage::INFO)
121
    {
122
        if ($message instanceof \Exception) {
123
            if ('' === $title) {
124
                $title = 'Exception: ' . $message->getCode();
125
            }
126
            $message = '"' . $message->getMessage() . '"' . LF . 'In ' . $message->getFile() . ' at line ' . $message->getLine() . '!';
127
            $this->enqueueMessage($message, $title, FlashMessage::ERROR);
128
129
            return;
130
        }
131
        if (!is_scalar($message)) {
132
            $message = var_export($message, true);
133
        }
134
        if (\defined('TYPO3_cliMode') && TYPO3_cliMode) {
135
            echo '==' . $title . ' == ' . LF;
136
            echo $message . LF;
137
        } else {
138
            $this->enqueueMessageGui($message, $title, $severity);
139
        }
140
    }
141
142
    /**
143
     * Adds a message to the FlashMessageQueue.
144
     *
145
     * @param mixed  $message
146
     * @param string $title
147
     * @param int    $severity
148
     */
149
    private function enqueueMessageGui($message, $title = '', $severity = FlashMessage::INFO)
150
    {
151
        $message = GeneralUtility::makeInstance(FlashMessage::class, nl2br($message), $title, $severity);
152
        $this->flashMessageService->getMessageQueueByIdentifier()
153
            ->enqueue($message);
154
    }
155
}
156