%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/circles/lib/Activity/ |
| Current File : /www/varak.net/nextcloud.varak.net/apps_old/apps/circles/lib/Activity/ProviderParser.php |
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Circles\Activity;
use OCA\Circles\IFederatedUser;
use OCA\Circles\Model\Circle;
use OCA\Circles\Model\Member;
use OCP\Activity\IEvent;
use OCP\Activity\IManager;
use OCP\IL10N;
use OCP\IURLGenerator;
class ProviderParser {
public function __construct(
protected IURLGenerator $url,
protected IManager $activityManager,
protected IL10N $l10n
) {
}
/**
* @param IEvent $event
* @param Circle $circle
* @param string $ownEvent
* @param string $othersEvent
*/
protected function parseCircleEvent(
IEvent $event,
Circle $circle,
string $ownEvent,
string $othersEvent
): void {
$data = [
'author' => $this->generateViewerParameter($circle),
'circle' => $this->generateCircleParameter($circle)
];
if ($this->isViewerTheAuthor($circle, $this->activityManager->getCurrentUserId())) {
$this->setSubject($event, $ownEvent, $data);
return;
}
$this->setSubject($event, $othersEvent, $data);
}
/**
* @param IEvent $event
* @param string $line
* @param array $data
*/
protected function setSubject(
IEvent $event,
string $line,
array $data
): void {
$this->setParsedSubject($event, $line, $data);
$this->setRichSubject($event, $line, $data);
}
/**
* @param IEvent $event
* @param string $line
* @param array $data
*/
protected function setRichSubject(
IEvent $event,
string $line,
array $data
): void {
$ak = array_keys($data);
foreach ($ak as $k) {
$subAk = array_keys($data[$k]);
foreach ($subAk as $sK) {
if (str_starts_with($sK, '_')) {
unset($data[$k][$sK]);
}
}
}
$event->setRichSubject($line, $data);
}
/**
* @param IEvent $event
* @param string $line
* @param array $data
*/
protected function setParsedSubject(
IEvent $event,
string $line,
array $data
): void {
$ak = array_keys($data);
$replace = [];
foreach ($ak as $k) {
if (!key_exists('_parsed', $data[$k])) {
continue;
}
$replace['{' . $k . '}'] = $data[$k]['_parsed'];
}
$event->setParsedSubject(strtr($line, $replace));
}
/**
* @param IEvent $event
* @param Circle $circle
* @param Member $member
* @param string $ownEvent
* @param string $othersEvent
*/
protected function parseMemberEvent(
IEvent $event,
Circle $circle,
Member $member,
string $ownEvent,
string $othersEvent
): void {
$data = [
'circle' => $this->generateCircleParameter($circle),
'member' => $this->generateUserParameter($member)
];
if ($member->getUserId() === $this->activityManager->getCurrentUserId()
) {
$this->setSubject($event, $ownEvent, $data);
return;
}
$this->setSubject($event, $othersEvent, $data);
}
/**
* @param IEvent $event
* @param Circle $circle
* @param Member $member
* @param string $ownEvent
* @param string $othersEvent
*/
protected function parseCircleMemberEvent(
IEvent $event,
Circle $circle,
Member $member,
string $ownEvent,
string $othersEvent
): void {
$data = [
'author' => $this->generateViewerParameter($circle),
'circle' => $this->generateCircleParameter($circle),
'member' => $this->generateUserParameter($member),
'external' => $this->generateExternalMemberParameter($member),
'group' => $this->generateGroupParameter($member),
];
if ($this->isViewerTheAuthor($circle, $this->activityManager->getCurrentUserId())) {
$this->setSubject($event, $ownEvent, $data);
return;
}
$this->setSubject($event, $othersEvent, $data);
}
/**
* general function to generate Circle+Member advanced event.
*
* @param IEvent $event
* @param Circle $circle
* @param Member $member
* @param string $ownEvent
* @param string $targetEvent
* @param string $othersEvent
*/
protected function parseCircleMemberAdvancedEvent(
IEvent $event,
Circle $circle,
Member $member,
string $ownEvent,
string $targetEvent,
string $othersEvent
): void {
$data = [
'author' => $this->generateViewerParameter($circle),
'circle' => $this->generateCircleParameter($circle),
'member' => $this->generateUserParameter($member)
];
if ($this->isViewerTheAuthor($circle, $this->activityManager->getCurrentUserId())) {
$this->setSubject($event, $ownEvent, $data);
return;
}
if ($member->getUserId() === $this->activityManager->getCurrentUserId()) {
$this->setSubject($event, $targetEvent, $data);
return;
}
$this->setSubject($event, $othersEvent, $data);
}
/**
* @param Circle $circle
* @param string $userId
*
* @return bool
*/
protected function isViewerTheAuthor(Circle $circle, string $userId): bool {
if (!$circle->hasInitiator()) {
return false;
}
$initiator = $circle->getInitiator();
return ($initiator->getUserType() === Member::TYPE_USER
&& $initiator->getUserId() === $userId);
}
/**
* @param Circle $circle
*
* @return array <string,string|integer>
*/
protected function generateViewerParameter(Circle $circle): array {
if (!$circle->hasInitiator()) {
return [];
}
return $this->generateUserParameter($circle->getInitiator());
}
/**
* @param Member $member
*
* @return array <string,string|integer>
*/
protected function generateExternalMemberParameter(Member $member): array {
return [
'type' => 'email',
'id' => $member->getUserId(),
'link' => '',
'name' => $member->getDisplayName(),
'_parsed' => $member->getDisplayName()
];
}
/**
* @param Circle $circle
*
* @return array<string,string|integer>
*/
protected function generateCircleParameter(Circle $circle): array {
return [
'type' => 'circle',
'id' => $circle->getSingleId(),
'name' => $circle->getName(),
'_parsed' => $circle->getName(),
'link' => $this->url->getAbsoluteURL($circle->getUrl()),
];
}
/**
* @return array <string,string|integer>
*/
protected function generateUserParameter(IFederatedUser $member): array {
$display = $member->getDisplayName();
if ($display === '') {
$display = $member->getUserId();
}
return [
'type' => 'user',
'id' => $member->getUserId(),
'name' => $display,
'_parsed' => $display
];
}
/**
* @return array <string,string|integer>
*/
protected function generateGroupParameter(Member $group): array {
return [
'type' => 'user-group',
'id' => $group->getUserId(),
'name' => $group->getUserId(),
'_parsed' => $group->getUserId()
];
}
}