Completed
Push — master ( a203f6...ccc5ed )
by Maxence
04:27
created

ProviderParser::generateGroupParameter()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 1 Features 0
Metric Value
c 2
b 1
f 0
dl 0
loc 8
rs 9.4285
cc 1
eloc 6
nc 1
nop 1
1
<?php
2
3
/**
4
 * Circles - Bring cloud-users closer together.
5
 *
6
 * This file is licensed under the Affero General Public License version 3 or
7
 * later. See the COPYING file.
8
 *
9
 * @author Maxence Lange <[email protected]>
10
 * @copyright 2017
11
 * @license GNU AGPL version 3 or any later version
12
 *
13
 * This program is free software: you can redistribute it and/or modify
14
 * it under the terms of the GNU Affero General Public License as
15
 * published by the Free Software Foundation, either version 3 of the
16
 * License, or (at your option) any later version.
17
 *
18
 * This program is distributed in the hope that it will be useful,
19
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21
 * GNU Affero General Public License for more details.
22
 *
23
 * You should have received a copy of the GNU Affero General Public License
24
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
25
 *
26
 */
27
28
namespace OCA\Circles\Activity;
29
30
use OCA\Circles\Api\v1\Circles;
31
use OCA\Circles\Model\Circle;
32
use OCA\Circles\Model\FederatedLink;
33
use OCA\Circles\Model\Member;
34
use OCA\Circles\Service\FederatedLinkService;
35
use OCA\Circles\Service\MiscService;
36
use OCP\Activity\IEvent;
37
use OCP\Activity\IManager;
38
use OCP\IL10N;
39
use OCP\IURLGenerator;
40
41
class ProviderParser {
42
43
44
	/** @var MiscService */
45
	protected $miscService;
46
47
	/** @var IL10N */
48
	protected $l10n;
49
50
	/** @var IURLGenerator */
51
	protected $url;
52
53
	/** @var IManager */
54
	protected $activityManager;
55
56
	public function __construct(
57
		IURLGenerator $url, IManager $activityManager, IL10N $l10n, MiscService $miscService
58
	) {
59
		$this->url = $url;
60
		$this->activityManager = $activityManager;
61
		$this->l10n = $l10n;
62
		$this->miscService = $miscService;
63
	}
64
65
66
	/**
67
	 * general function to generate Circle event.
68
	 *
69
	 * @param IEvent $event
70
	 * @param Circle $circle
71
	 * @param FederatedLink|null $remote
72
	 * @param string $ownEvent
73
	 * @param string $othersEvent
74
	 */
75
	protected function parseCircleEvent(
76
		IEvent &$event, Circle $circle, $remote, $ownEvent, $othersEvent
77
	) {
78
		$data = [
79
			'author' => $this->generateViewerParameter($circle),
80
			'circle' => $this->generateCircleParameter($circle),
81
			'remote' => ($remote === null) ? [] : $this->generateRemoteCircleParameter($remote)
82
		];
83
84
		if ($this->isViewerTheAuthor($circle, $this->activityManager->getCurrentUserId())) {
85
			$this->setSubject($event, $ownEvent, $data);
86
87
			return;
88
		}
89
90
		$this->setSubject($event, $othersEvent, $data);
91
	}
92
93
94
	/**
95
	 * @param IEvent $event
96
	 * @param string $line
97
	 * @param array $data
98
	 */
99
	private function setSubject(IEvent $event, $line, $data) {
100
		$this->setParsedSubject($event, $line, $data);
101
		$this->setRichSubject($event, $line, $data);
102
	}
103
104
105
	/**
106
	 * @param IEvent $event
107
	 * @param string $line
108
	 * @param array $data
109
	 */
110
	private function setRichSubject(IEvent $event, $line, $data) {
111
		$ak = array_keys($data);
112
		foreach ($ak as $k) {
113
			$subAk = array_keys($data[$k]);
114
			foreach ($subAk as $sK) {
115
				if (substr($sK, 0, 1) === '_') {
116
					unset($data[$k][$sK]);
117
				}
118
			}
119
		}
120
121
		$event->setRichSubject($line, $data);
122
	}
123
124
125
	/**
126
	 * @param IEvent $event
127
	 * @param string $line
128
	 * @param array $data
129
	 */
130
	private function setParsedSubject(IEvent $event, $line, $data) {
131
		$ak = array_keys($data);
132
		$replace = [];
133
		foreach ($ak as $k) {
134
			if (!key_exists('_parsed', $data[$k])) {
135
				continue;
136
			}
137
138
			$replace['{' . $k . '}'] = $data[$k]['_parsed'];
139
		}
140
141
		$line = strtr($line, $replace);
142
143
		$event->setParsedSubject($line);
144
	}
145
146
147
	/**
148
	 * general function to generate Member event.
149
	 *
150
	 * @param Circle $circle
151
	 * @param $member
152
	 * @param IEvent $event
153
	 * @param $ownEvent
154
	 * @param $othersEvent
155
	 */
156
	protected function parseMemberEvent(
157
		IEvent &$event, Circle $circle, Member $member, $ownEvent, $othersEvent
158
	) {
159
		$data = [
160
			'circle' => $this->generateCircleParameter($circle),
161
			'member' => $this->generateUserParameter($member)
162
		];
163
164
		if ($member->getUserId() === $this->activityManager->getCurrentUserId()
165
		) {
166
			$event->setSubject($ownEvent, $data);
167
168
			return;
169
		}
170
171
		$this->setSubject($event, $othersEvent, $data);
172
	}
173
174
175
	/**
176
	 * general function to generate Link event.
177
	 *
178
	 * @param Circle $circle
179
	 * @param FederatedLink $remote
180
	 * @param IEvent $event
181
	 * @param string $line
182
	 */
183
	protected function parseLinkEvent(IEvent &$event, Circle $circle, FederatedLink $remote, $line
184
	) {
185
		$data = [
186
			'circle' => $this->generateCircleParameter($circle),
187
			'remote' => $this->generateRemoteCircleParameter($remote)
188
		];
189
190
		$this->setSubject($event, $line, $data);
191
	}
192
193
194
	/**
195
	 * general function to generate Circle+Member event.
196
	 *
197
	 * @param Circle $circle
198
	 * @param Member $member
199
	 * @param IEvent $event
200
	 * @param string $ownEvent
201
	 * @param string $othersEvent
202
	 */
203
	protected function parseCircleMemberEvent(
204
		IEvent &$event, Circle $circle, Member $member, $ownEvent, $othersEvent
205
	) {
206
		$data = [
207
			'author'   => $this->generateViewerParameter($circle),
208
			'circle'   => $this->generateCircleParameter($circle),
209
			'member'   => $this->generateUserParameter($member),
210
			'external' => $this->generateExternalMemberParameter($member),
211
			'group'    => $this->generateGroupParameter($member),
212
		];
213
214
		if ($this->isViewerTheAuthor($circle, $this->activityManager->getCurrentUserId())) {
215
			$this->setSubject($event, $ownEvent, $data);
216
217
			return;
218
		}
219
220
		$this->setSubject($event, $othersEvent, $data);
221
	}
222
223
224
	/**
225
	 * general function to generate Circle+Member advanced event.
226
	 *
227
	 * @param Circle $circle
228
	 * @param Member $member
229
	 * @param IEvent $event
230
	 * @param $ownEvent
231
	 * @param $targetEvent
232
	 * @param $othersEvent
233
	 */
234
	protected function parseCircleMemberAdvancedEvent(
235
		IEvent &$event, Circle $circle, Member $member, $ownEvent, $targetEvent, $othersEvent
236
	) {
237
		$data = [
238
			'author' => $this->generateViewerParameter($circle),
239
			'circle' => $this->generateCircleParameter($circle),
240
			'member' => $this->generateUserParameter($member)
241
		];
242
243
		if ($this->isViewerTheAuthor($circle, $this->activityManager->getCurrentUserId())) {
244
			$this->setSubject($event, $ownEvent, $data);
245
246
			return;
247
		}
248
249
		if ($member->getUserId() === $this->activityManager->getCurrentUserId()) {
250
			$this->setSubject($event, $targetEvent, $data);
251
252
			return;
253
		}
254
255
		$this->setSubject($event, $othersEvent, $data);
256
	}
257
258
259
	/**
260
	 * @param Circle $circle
261
	 * @param string $userId
262
	 *
263
	 * @return bool
264
	 */
265
	protected function isViewerTheAuthor(Circle $circle, $userId) {
266
		if ($circle->getViewer() === null) {
267
			return false;
268
		}
269
270
		if ($circle->getViewer()
0 ignored issues
show
Unused Code introduced by
This if statement, and the following return statement can be replaced with return $circle->getViewe...etUserId() === $userId;.
Loading history...
271
				   ->getUserId() === $userId) {
272
			return true;
273
		}
274
275
		return false;
276
	}
277
278
279
	/**
280
	 * @param Circle $circle
281
	 *
282
	 * @return string|array <string,string|integer>
283
	 */
284
	protected function generateViewerParameter(Circle $circle) {
285
		if ($circle->getViewer() === null) {
286
			return [];
287
		}
288
289
		return $this->generateUserParameter($circle->getViewer());
290
	}
291
292
293
	/**
294
	 * @param Member $member
295
	 *
296
	 * @return array|string <string,string|integer>
297
	 */
298
	protected function generateExternalMemberParameter(Member $member) {
299
		return [
300
			'type'    => 'member_' . $member->getType(),
301
			'id'      => $member->getUserId(),
302
			'name'    => $member->getDisplayName() . ' (' . $member->getTypeString() . ')',
303
			'_parsed' => $member->getDisplayName()
304
		];
305
	}
306
307
308
	/**
309
	 * @param Circle $circle
310
	 *
311
	 * @return array<string,string|integer>
312
	 */
313
	protected function generateCircleParameter(Circle $circle) {
314
		return [
315
			'type'    => 'circle',
316
			'id'      => $circle->getId(),
317
			'name'    => $circle->getName(),
318
			'_parsed' => $circle->getName(),
319
			'link'    => Circles::generateLink($circle->getUniqueId())
320
		];
321
	}
322
323
324
	/**
325
	 * @param FederatedLink $link
326
	 *
327
	 * @return array<string,string|integer>
0 ignored issues
show
Documentation introduced by
Consider making the return type a bit more specific; maybe use array<string,string>.

This check looks for the generic type array as a return type and suggests a more specific type. This type is inferred from the actual code.

Loading history...
328
	 */
329
	protected function generateRemoteCircleParameter(FederatedLink $link) {
330
		return [
331
			'type'    => 'circle',
332
			'id'      => $link->getUniqueId(),
333
			'name'    => $link->getToken() . '@' . $link->getAddress(),
334
			'_parsed' => $link->getToken() . '@' . $link->getAddress()
335
		];
336
	}
337
338
339
	/**
340
	 * @param Member $member
341
	 *
342
	 * @return array <string,string|integer>
0 ignored issues
show
Documentation introduced by
Consider making the return type a bit more specific; maybe use array<string,string>.

This check looks for the generic type array as a return type and suggests a more specific type. This type is inferred from the actual code.

Loading history...
343
	 */
344
	protected function generateUserParameter(Member $member) {
345
		return [
346
			'type'    => 'user',
347
			'id'      => $member->getUserId(),
348
			'name'    => $this->miscService->getDisplayName($member->getUserId(), true),
349
			'_parsed' => $this->miscService->getDisplayName($member->getUserId(), true)
350
		];
351
	}
352
353
354
	/**
355
	 * @param Member $group
356
	 *
357
	 * @return array <string,string|integer>
0 ignored issues
show
Documentation introduced by
Consider making the return type a bit more specific; maybe use array<string,string>.

This check looks for the generic type array as a return type and suggests a more specific type. This type is inferred from the actual code.

Loading history...
358
	 */
359
	protected function generateGroupParameter($group) {
360
		return [
361
			'type'    => 'group',
362
			'id'      => $group->getUserId(),
363
			'name'    => $group->getUserId(),
364
			'_parsed' => $group->getUserId()
365
		];
366
	}
367
368
}