Completed
Push — stable13 ( 81b02e...968127 )
by Morris
11:09 queued 10s
created

Event::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7

Duplication

Lines 7
Ratio 100 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 6
dl 7
loc 7
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * @copyright Copyright (c) 2016 Joas Schilling <[email protected]>
4
 *
5
 * @author Joas Schilling <[email protected]>
6
 *
7
 * @license GNU AGPL version 3 or any later version
8
 *
9
 * This program is free software: you can redistribute it and/or modify
10
 * it under the terms of the GNU Affero General Public License as
11
 * published by the Free Software Foundation, either version 3 of the
12
 * License, or (at your option) any later version.
13
 *
14
 * This program is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 * GNU Affero General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU Affero General Public License
20
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
 *
22
 */
23
24
namespace OCA\DAV\CalDAV\Activity\Provider;
25
26
use OCA\DAV\CalDAV\CalDavBackend;
27
use OCP\Activity\IEvent;
28
use OCP\Activity\IEventMerger;
29
use OCP\Activity\IManager;
30
use OCP\IGroupManager;
31
use OCP\IL10N;
32
use OCP\IURLGenerator;
33
use OCP\IUserManager;
34
use OCP\L10N\IFactory;
35
36
class Event extends Base {
37
38
	const SUBJECT_OBJECT_ADD = 'object_add';
39
	const SUBJECT_OBJECT_UPDATE = 'object_update';
40
	const SUBJECT_OBJECT_DELETE = 'object_delete';
41
42
	/** @var IFactory */
43
	protected $languageFactory;
44
45
	/** @var IL10N */
46
	protected $l;
47
48
	/** @var IURLGenerator */
49
	protected $url;
50
51
	/** @var IManager */
52
	protected $activityManager;
53
54
	/** @var IEventMerger */
55
	protected $eventMerger;
56
57
	/**
58
	 * @param IFactory $languageFactory
59
	 * @param IURLGenerator $url
60
	 * @param IManager $activityManager
61
	 * @param IUserManager $userManager
62
	 * @param IGroupManager $groupManager
63
	 * @param IEventMerger $eventMerger
64
	 */
65 View Code Duplication
	public function __construct(IFactory $languageFactory, IURLGenerator $url, IManager $activityManager, IUserManager $userManager, IGroupManager $groupManager, IEventMerger $eventMerger) {
66
		parent::__construct($userManager, $groupManager);
67
		$this->languageFactory = $languageFactory;
68
		$this->url = $url;
69
		$this->activityManager = $activityManager;
70
		$this->eventMerger = $eventMerger;
71
	}
72
73
	/**
74
	 * @param string $language
75
	 * @param IEvent $event
76
	 * @param IEvent|null $previousEvent
77
	 * @return IEvent
78
	 * @throws \InvalidArgumentException
79
	 * @since 11.0.0
80
	 */
81
	public function parse($language, IEvent $event, IEvent $previousEvent = null) {
82
		if ($event->getApp() !== 'dav' || $event->getType() !== 'calendar_event') {
83
			throw new \InvalidArgumentException();
84
		}
85
86
		$this->l = $this->languageFactory->get('dav', $language);
87
88
		if ($this->activityManager->getRequirePNG()) {
89
			$event->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'places/calendar-dark.png')));
90
		} else {
91
			$event->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'places/calendar-dark.svg')));
92
		}
93
94
		if ($event->getSubject() === self::SUBJECT_OBJECT_ADD . '_event') {
95
			$subject = $this->l->t('{actor} created event {event} in calendar {calendar}');
96
		} else if ($event->getSubject() === self::SUBJECT_OBJECT_ADD . '_event_self') {
97
			$subject = $this->l->t('You created event {event} in calendar {calendar}');
98
		} else if ($event->getSubject() === self::SUBJECT_OBJECT_DELETE . '_event') {
99
			$subject = $this->l->t('{actor} deleted event {event} from calendar {calendar}');
100
		} else if ($event->getSubject() === self::SUBJECT_OBJECT_DELETE . '_event_self') {
101
			$subject = $this->l->t('You deleted event {event} from calendar {calendar}');
102
		} else if ($event->getSubject() === self::SUBJECT_OBJECT_UPDATE . '_event') {
103
			$subject = $this->l->t('{actor} updated event {event} in calendar {calendar}');
104
		} else if ($event->getSubject() === self::SUBJECT_OBJECT_UPDATE . '_event_self') {
105
			$subject = $this->l->t('You updated event {event} in calendar {calendar}');
106
		} else {
107
			throw new \InvalidArgumentException();
108
		}
109
110
		$parsedParameters = $this->getParameters($event);
111
		$this->setSubjects($event, $subject, $parsedParameters);
112
113
		$event = $this->eventMerger->mergeEvents('event', $event, $previousEvent);
114
115
		return $event;
116
	}
117
118
	/**
119
	 * @param IEvent $event
120
	 * @return array
121
	 */
122
	protected function getParameters(IEvent $event) {
123
		$subject = $event->getSubject();
124
		$parameters = $event->getSubjectParameters();
125
126
		// Nextcloud 13+
127
		if (isset($parameters['calendar'])) {
128
			switch ($subject) {
129
				case self::SUBJECT_OBJECT_ADD . '_event':
130
				case self::SUBJECT_OBJECT_DELETE . '_event':
131 View Code Duplication
				case self::SUBJECT_OBJECT_UPDATE . '_event':
132
					return [
133
						'actor' => $this->generateUserParameter($parameters['actor']),
134
						'calendar' => $this->generateCalendarParameter($parameters['calendar'], $this->l),
135
						'event' => $this->generateClassifiedObjectParameter($parameters['object']),
136
					];
137
				case self::SUBJECT_OBJECT_ADD . '_event_self':
138
				case self::SUBJECT_OBJECT_DELETE . '_event_self':
139 View Code Duplication
				case self::SUBJECT_OBJECT_UPDATE . '_event_self':
140
					return [
141
						'calendar' => $this->generateCalendarParameter($parameters['calendar'], $this->l),
142
						'event' => $this->generateClassifiedObjectParameter($parameters['object']),
143
					];
144
			}
145
		}
146
147
		// Legacy - Do NOT Remove unless necessary
148
		// Removing this will break parsing of activities that were created on
149
		// Nextcloud 12, so we should keep this as long as it's acceptable.
150
		// Otherwise if people upgrade over multiple releases in a short period,
151
		// they will get the dead entries in their stream.
152
		switch ($subject) {
153
			case self::SUBJECT_OBJECT_ADD . '_event':
154
			case self::SUBJECT_OBJECT_DELETE . '_event':
155 View Code Duplication
			case self::SUBJECT_OBJECT_UPDATE . '_event':
156
				return [
157
					'actor' => $this->generateUserParameter($parameters[0]),
158
					'calendar' => $this->generateLegacyCalendarParameter((int)$event->getObjectId(), $parameters[1]),
159
					'event' => $this->generateObjectParameter($parameters[2]),
160
				];
161
			case self::SUBJECT_OBJECT_ADD . '_event_self':
162
			case self::SUBJECT_OBJECT_DELETE . '_event_self':
163
			case self::SUBJECT_OBJECT_UPDATE . '_event_self':
164
				return [
165
					'calendar' => $this->generateLegacyCalendarParameter((int)$event->getObjectId(), $parameters[1]),
166
					'event' => $this->generateObjectParameter($parameters[2]),
167
				];
168
		}
169
170
		throw new \InvalidArgumentException();
171
	}
172
173
	private function generateClassifiedObjectParameter(array $eventData) {
174
		$parameter = $this->generateObjectParameter($eventData);
175
		if (!empty($eventData['classified'])) {
176
			$parameter['name'] = $this->l->t('Busy');
177
		}
178
		return $parameter;
179
	}
180
}
181