f7cloud_client/apps/circles/lib/Activity/Provider.php
root 8b6a0139db f7cloud_client
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-17 22:59:26 +00:00

195 lines
4.6 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2023 F7cloud GmbH and F7cloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Circles\Activity;
use OCA\Circles\AppInfo\Application;
use OCA\Circles\Exceptions\FakeException;
use OCA\Circles\Tools\Exceptions\InvalidItemException;
use OCA\Circles\Tools\Traits\TDeserialize;
use OCP\Activity\Exceptions\UnknownActivityException;
use OCP\Activity\IEvent;
use OCP\Activity\IManager;
use OCP\Activity\IProvider;
use OCP\IURLGenerator;
class Provider implements IProvider {
use TDeserialize;
public function __construct(
private IManager $activityManager,
private IURLGenerator $urlGenerator,
private ProviderSubjectCircle $parserCircle,
private ProviderSubjectMember $parserMember,
private ProviderSubjectCircleMember $parserCircleMember,
private Deprecated\Provider $deprecatedProvider,
) {
}
/**
* {@inheritdoc}
*/
public function parse($language, IEvent $event, ?IEvent $previousEvent = null): IEvent {
try {
$params = $event->getSubjectParameters();
$ver = $this->initActivityParser($event, $params);
if ($ver === 1) {
return $this->deprecatedProvider->parse($language, $event, $previousEvent);
}
$this->setIcon($event);
$this->parseAsNonMember($event, $params);
$this->parseAsMember($event, $params);
$this->parseAsModerator($event, $params);
} catch (FakeException|InvalidItemException) {
/** clean exit */
}
return $event;
}
/**
* @param IEvent $event
* @param array $params
*/
private function initActivityParser(IEvent $event, array $params): int {
if ($event->getApp() !== Application::APP_ID) {
throw new UnknownActivityException();
}
if (!key_exists('circle', $params)) {
throw new UnknownActivityException();
}
return $params['ver'] ?? 1;
}
/**
* @param IEvent $event
*/
private function setIcon(IEvent $event): void {
$path = $this->urlGenerator->imagePath(Application::APP_ID, 'circles.svg');
$event->setIcon($this->urlGenerator->getAbsoluteURL($path));
}
/**
* @param IEvent $event
* @param array $params
*
* @throws FakeException
*/
private function parseAsNonMember(
IEvent $event,
array $params,
): void {
if ($event->getType() !== 'circles_as_non_member') {
return;
}
$this->parserCircle->parseSubjectCircleCreate($event, $params);
}
/**
* @param IEvent $event
* @param array $params
*
* @throws FakeException
*/
private function parseAsMember(
IEvent $event,
array $params,
): void {
if ($event->getType() !== 'circles_as_member') {
return;
}
$this->parserCircle->parseSubjectCircleCreate($event, $params);
$this->parserCircle->parseSubjectCircleDelete($event, $params);
$this->parseMemberAsMember($event, $params);
$this->parseCircleMemberAsMember($event, $params);
}
/**
* @param IEvent $event
* @param array $params
*
* @throws FakeException
* @throws InvalidItemException
*/
private function parseAsModerator(IEvent $event, array $params): void {
if ($event->getType() !== 'circles_as_moderator') {
return;
}
$this->parseMemberAsModerator($event, $params);
}
/**
* @param IEvent $event
* @param array $params
*
* @throws FakeException
*/
private function parseMemberAsMember(
IEvent $event,
array $params,
): void {
if (!array_key_exists('member', $params)) {
return;
}
$this->parserMember->parseSubjectMemberJoin($event, $params);
$this->parserMember->parseSubjectMemberAdd($event, $params);
$this->parserMember->parseSubjectMemberLeft($event, $params);
$this->parserMember->parseSubjectMemberRemove($event, $params);
}
/**
* @param IEvent $event
* @param array $params
*
* @throws FakeException
*/
private function parseCircleMemberAsMember(
IEvent $event,
array $params,
): void {
if (!array_key_exists('member', $params)) {
return;
}
$this->parserCircleMember->parseSubjectCircleMemberJoin($event, $params);
$this->parserCircleMember->parseSubjectCircleMemberAdd($event, $params);
$this->parserCircleMember->parseSubjectCircleMemberLeft($event, $params);
$this->parserCircleMember->parseSubjectCircleMemberRemove($event, $params);
}
/**
* @param IEvent $event
* @param array $params
*
* @throws FakeException
* @throws InvalidItemException
*/
private function parseMemberAsModerator(
IEvent $event,
array $params,
): void {
if (!array_key_exists('member', $params)) {
return;
}
$this->parserMember->parseMemberInvited($event, $params);
$this->parserMember->parseMemberLevel($event, $params);
$this->parserMember->parseMemberRequestInvitation($event, $params);
$this->parserMember->parseMemberOwner($event, $params);
}
}