diff --git a/lib/Activity/Deprecated/Provider.php b/lib/Activity/Deprecated/Provider.php new file mode 100644 index 000000000..1ea994f62 --- /dev/null +++ b/lib/Activity/Deprecated/Provider.php @@ -0,0 +1,213 @@ +getSubjectParameters(); + $this->initActivityParser($event, $params); + + /** @var Circle $circle */ + $circle = $this->deserializeJson($params['circle'], Circle::class); + + $this->setIcon($event); + $this->parseAsNonMember($event, $circle); + $this->parseAsMember($event, $circle, $params); + $this->parseAsModerator($event, $circle, $params); + } catch (FakeException|InvalidItemException $e) { + /** clean exit */ + } + + return $event; + } + + /** + * @param IEvent $event + * @param array $params + */ + private function initActivityParser(IEvent $event, array $params): void { + if ($event->getApp() !== Application::APP_ID) { + throw new UnknownActivityException(); + } + + if (!key_exists('circle', $params)) { + throw new UnknownActivityException(); + } + } + + /** + * @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 Circle $circle + * @param array $params + * + * @throws FakeException + */ + private function parseAsNonMember( + IEvent $event, + Circle $circle, + ): void { + if ($event->getType() !== 'circles_as_non_member') { + return; + } + + $this->parserCircle->parseSubjectCircleCreate($event, $circle); + } + + /** + * @param IEvent $event + * @param Circle $circle + * @param array $params + * + * @throws FakeException + */ + private function parseAsMember( + IEvent $event, + Circle $circle, + array $params, + ): void { + if ($event->getType() !== 'circles_as_member') { + return; + } + + $this->parserCircle->parseSubjectCircleCreate($event, $circle); + $this->parserCircle->parseSubjectCircleDelete($event, $circle); + $this->parseMemberAsMember($event, $circle, $params); + $this->parseCircleMemberAsMember($event, $circle, $params); + } + + /** + * @param Circle $circle + * @param IEvent $event + * @param array $params + * + * @throws FakeException + * @throws InvalidItemException + */ + private function parseAsModerator(IEvent $event, Circle $circle, array $params): void { + if ($event->getType() !== 'circles_as_moderator') { + return; + } + + $this->parseMemberAsModerator($event, $circle, $params); + } + + /** + * @param IEvent $event + * @param Circle $circle + * @param array $params + * + * @throws FakeException + * @throws InvalidItemException + */ + private function parseMemberAsMember( + IEvent $event, + Circle $circle, + array $params, + ): void { + if (!key_exists('member', $params)) { + return; + } + + /** @var Member $member */ + $member = $this->deserializeJson($params['member'], Member::class); + + $this->parserMember->parseSubjectMemberJoin($event, $circle, $member); + $this->parserMember->parseSubjectMemberAdd($event, $circle, $member); + $this->parserMember->parseSubjectMemberLeft($event, $circle, $member); + $this->parserMember->parseSubjectMemberRemove($event, $circle, $member); + } + + /** + * @param IEvent $event + * @param Circle $circle + * @param array $params + * + * @throws FakeException + * @throws InvalidItemException + */ + private function parseCircleMemberAsMember( + IEvent $event, + Circle $circle, + array $params, + ): void { + if (!key_exists('member', $params)) { + return; + } + + /** @var Member $member */ + $member = $this->deserializeJson($params['member'], Member::class); + + $this->parserCircleMember->parseSubjectCircleMemberJoin($event, $circle, $member); + $this->parserCircleMember->parseSubjectCircleMemberAdd($event, $circle, $member); + $this->parserCircleMember->parseSubjectCircleMemberLeft($event, $circle, $member); + $this->parserCircleMember->parseSubjectCircleMemberRemove($event, $circle, $member); + } + + /** + * @param IEvent $event + * @param Circle $circle + * @param array $params + * + * @throws FakeException + * @throws InvalidItemException + */ + private function parseMemberAsModerator( + IEvent $event, + Circle $circle, + array $params, + ): void { + if (!key_exists('member', $params)) { + return; + } + + /** @var Member $member */ + $member = $this->deserializeJson($params['member'], Member::class); + + $this->parserMember->parseMemberInvited($event, $circle, $member); + $this->parserMember->parseMemberLevel($event, $circle, $member, $params['level'] ?? 0); + $this->parserMember->parseMemberRequestInvitation($event, $circle, $member); + $this->parserMember->parseMemberOwner($event, $circle, $member); + } +} diff --git a/lib/Activity/Deprecated/ProviderParser.php b/lib/Activity/Deprecated/ProviderParser.php new file mode 100644 index 000000000..ac5e2514c --- /dev/null +++ b/lib/Activity/Deprecated/ProviderParser.php @@ -0,0 +1,301 @@ + $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 + */ + protected function generateViewerParameter(Circle $circle): array { + if (!$circle->hasInitiator()) { + return []; + } + + return $this->generateUserParameter($circle->getInitiator()); + } + + /** + * @param Member $member + * + * @return array + */ + protected function generateExternalMemberParameter(Member $member): array { + return [ + 'type' => 'email', + 'id' => $member->getUserId(), + 'link' => '', + 'name' => $member->getDisplayName(), + '_parsed' => $member->getDisplayName() + ]; + } + + /** + * @param Circle $circle + * + * @return array + */ + 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 + */ + 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 + */ + protected function generateGroupParameter(Member $group): array { + return [ + 'type' => 'user-group', + 'id' => $group->getUserId(), + 'name' => $group->getUserId(), + '_parsed' => $group->getUserId() + ]; + } +} diff --git a/lib/Activity/Deprecated/ProviderSubjectCircle.php b/lib/Activity/Deprecated/ProviderSubjectCircle.php new file mode 100644 index 000000000..9581efea2 --- /dev/null +++ b/lib/Activity/Deprecated/ProviderSubjectCircle.php @@ -0,0 +1,56 @@ +getSubject() !== 'circle_create') { + return; + } + + $this->parseCircleEvent( + $event, $circle, + $this->l10n->t('You created the team {circle}'), + $this->l10n->t('{author} created the team {circle}') + ); + + throw new FakeException(); + } + + /** + * @param IEvent $event + * @param Circle $circle + * + * @throws FakeException + */ + public function parseSubjectCircleDelete(IEvent $event, Circle $circle): void { + if ($event->getSubject() !== 'circle_delete') { + return; + } + + $this->parseCircleEvent( + $event, $circle, + $this->l10n->t('You deleted {circle}'), + $this->l10n->t('{author} deleted {circle}') + ); + + throw new FakeException(); + } +} diff --git a/lib/Activity/Deprecated/ProviderSubjectCircleMember.php b/lib/Activity/Deprecated/ProviderSubjectCircleMember.php new file mode 100644 index 000000000..f991ca40d --- /dev/null +++ b/lib/Activity/Deprecated/ProviderSubjectCircleMember.php @@ -0,0 +1,148 @@ + $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); + } + + /** + * @param IEvent $event + * @param Circle $circle + * @param Member $member + * @throws FakeException + */ + public function parseSubjectCircleMemberJoin( + IEvent $event, + Circle $circle, + Member $member, + ): void { + if ($event->getSubject() !== 'member_circle_joined') { + return; + } + + $this->parseMemberCircleEvent( + $event, $circle, $member, + $this->l10n->t('You made {member} join {circle}'), + $this->l10n->t('{author} made {member} join {circle}') + ); + + throw new FakeException(); + } + + /** + * @param IEvent $event + * @param Circle $circle + * @param Member $member + * @return void + * @throws FakeException + */ + public function parseSubjectCircleMemberAdd( + IEvent $event, + Circle $circle, + Member $member, + ): void { + if ($event->getSubject() !== 'member_circle_added') { + return; + } + + $this->parseMemberCircleEvent( + $event, $circle, $member, + $this->l10n->t('You added team {member} as member to {circle}'), + $this->l10n->t('{author} added team {member} as member to {circle}') + ); + + throw new FakeException(); + } + + /** + * @param IEvent $event + * @param Circle $circle + * @param Member $member + * @return void + * @throws FakeException + */ + public function parseSubjectCircleMemberLeft( + IEvent $event, + Circle $circle, + Member $member, + ): void { + if ($event->getSubject() !== 'member_circle_left') { + return; + } + + $this->parseCircleMemberEvent( + $event, $circle, $member, + $this->l10n->t('You made {member} leave {circle}'), + $this->l10n->t('{author} made {member} leave {circle}') + ); + + throw new FakeException(); + } + + /** + * @param IEvent $event + * @param Circle $circle + * @param Member $member + * @return void + * @throws FakeException + */ + public function parseSubjectCircleMemberRemove( + IEvent $event, + Circle $circle, + Member $member, + ): void { + if ($event->getSubject() !== 'member_circle_removed') { + return; + } + + $this->parseCircleMemberEvent( + $event, $circle, $member, + $this->l10n->t('You removed {member} from {circle}'), + $this->l10n->t('{author} removed {member} from {circle}') + ); + + throw new FakeException(); + } +} diff --git a/lib/Activity/Deprecated/ProviderSubjectMember.php b/lib/Activity/Deprecated/ProviderSubjectMember.php new file mode 100644 index 000000000..a5ab9a96e --- /dev/null +++ b/lib/Activity/Deprecated/ProviderSubjectMember.php @@ -0,0 +1,438 @@ +getSubject() !== 'member_join') { + return; + } + + $this->parseSubjectMemberJoinOnInvite($event, $circle, $member); + $this->parseCircleMemberEvent( + $event, $circle, $member, $this->l10n->t('You joined {circle}'), + $this->l10n->t('{member} joined {circle}') + ); + + throw new FakeException(); + } + + /** + * @param IEvent $event + * @param Circle $circle + * @param Member $member + * + * @throws FakeException + */ + private function parseSubjectMemberJoinOnInvite( + IEvent $event, + Circle $circle, + Member $member, + ): void { + if (!$circle->isConfig(Circle::CFG_INVITE)) { + return; + } + + $this->parseCircleMemberEvent( + $event, $circle, $member, + $this->l10n->t('You accepted the invitation to join {circle}'), + $this->l10n->t('{member} accepted the invitation to join {circle}') + ); + + throw new FakeException(); + } + + + /** + * @param IEvent $event + * @param Circle $circle + * @param Member $member + * + * @throws FakeException + */ + public function parseSubjectMemberAdd( + IEvent $event, + Circle $circle, + Member $member, + ): void { + if ($event->getSubject() !== 'member_added') { + return; + } + + $this->parseSubjectMemberAddNotLocalMember($event, $circle, $member); + $this->parseSubjectMemberAddClosedCircle($event, $circle, $member); + $this->parseCircleMemberAdvancedEvent( + $event, $circle, $member, + $this->l10n->t('You added {member} as member to {circle}'), + $this->l10n->t('You have been added as member to {circle} by {author}'), + $this->l10n->t('{member} has been added as member to {circle} by {author}') + ); + + throw new FakeException(); + } + + /** + * @param IEvent $event + * @param Circle $circle + * @param Member $member + * + * @throws FakeException + */ + private function parseSubjectMemberAddNotLocalMember( + IEvent $event, + Circle $circle, + Member $member, + ): void { + if ($member->getUserType() === Member::TYPE_USER) { + return; + } + + $this->parseCircleMemberEvent( + $event, $circle, $member, + $this->l10n->t('You added {external} to {circle}'), + $this->l10n->t('{external} has been added to {circle} by {author}') + ); + + throw new FakeException(); + } + + + /** + * @param IEvent $event + * @param Circle $circle + * @param Member $member + * + * @throws FakeException + */ + private function parseSubjectMemberAddClosedCircle( + IEvent $event, + Circle $circle, + Member $member, + ): void { + if (!$circle->isConfig(Circle::CFG_REQUEST)) { + return; + } + + $this->parseCircleMemberAdvancedEvent( + $event, $circle, $member, + $this->l10n->t("You accepted {member}'s request to join {circle}"), + $this->l10n->t('Your request to join {circle} has been accepted by {author}'), + $this->l10n->t("{member}'s request to join {circle} has been accepted by {author}") + ); + + throw new FakeException(); + } + + + /** + * @param IEvent $event + * @param Circle $circle + * @param Member $member + * + * @throws FakeException + */ + public function parseSubjectMemberLeft( + IEvent $event, + Circle $circle, + Member $member, + ): void { + if ($event->getSubject() !== 'member_left') { + return; + } + + $this->parseSubjectNonMemberLeftInvite($event, $circle, $member); + $this->parseSubjectNonMemberLeftRequest($event, $circle, $member); + $this->parseCircleMemberEvent( + $event, $circle, $member, + $this->l10n->t('You left {circle}'), + $this->l10n->t('{member} left {circle}') + ); + + throw new FakeException(); + } + + + /** + * @param IEvent $event + * @param Circle $circle + * @param Member $member + * + * @throws FakeException + */ + private function parseSubjectNonMemberLeftInvite( + IEvent $event, + Circle $circle, + Member $member, + ): void { + if (!$circle->isConfig(Circle::CFG_INVITE) + || $member->getLevel() > Member::LEVEL_NONE) { + return; + } + + $this->parseCircleMemberEvent( + $event, $circle, $member, + $this->l10n->t('You declined the invitation to join {circle}'), + $this->l10n->t('{member} declined an invitation to join {circle}') + ); + + throw new FakeException(); + } + + + /** + * @param IEvent $event + * @param Circle $circle + * @param Member $member + * + * @throws FakeException + */ + private function parseSubjectNonMemberLeftRequest( + IEvent $event, + Circle $circle, + Member $member, + ): void { + if (!$circle->isConfig(Circle::CFG_REQUEST) + || $member->getLevel() > Member::LEVEL_NONE) { + return; + } + + $this->parseCircleMemberEvent( + $event, $circle, $member, + $this->l10n->t('You cancelled your request to join {circle}'), + $this->l10n->t('{member} cancelled a request to join {circle}') + ); + + throw new FakeException(); + } + + + /** + * @param IEvent $event + * @param Circle $circle + * @param Member $member + * + * @throws FakeException + */ + public function parseSubjectMemberRemove( + IEvent $event, + Circle $circle, + Member $member, + ): void { + if ($event->getSubject() !== 'member_remove') { + return; + } + + $this->parseSubjectMemberRemoveNotLocalMember($event, $circle, $member); + $this->parseSubjectMemberRemoveNotYetMember($event, $circle, $member); + $this->parseCircleMemberAdvancedEvent( + $event, $circle, $member, + $this->l10n->t('You removed {member} from {circle}'), + $this->l10n->t('You have been removed from {circle} by {author}'), + $this->l10n->t('{member} has been removed from {circle} by {author}') + ); + + throw new FakeException(); + } + + /** + * @param IEvent $event + * @param Circle $circle + * @param Member $member + * + * @throws FakeException + */ + private function parseSubjectMemberRemoveNotLocalMember( + IEvent $event, + Circle $circle, + Member $member, + ): void { + if ($member->getUserType() === Member::TYPE_USER) { + return; + } + + $this->parseCircleMemberEvent( + $event, $circle, $member, + $this->l10n->t('You removed {external} from {circle}'), + $this->l10n->t('{external} has been removed from {circle} by {author}') + ); + + throw new FakeException(); + } + + + /** + * @param IEvent $event + * @param Circle $circle + * @param Member $member + * + * @throws FakeException + */ + private function parseSubjectMemberRemoveNotYetMember( + IEvent $event, + Circle $circle, + Member $member, + ): void { + if (!$circle->isConfig(Circle::CFG_INVITE) + || $member->getLevel() > Member::LEVEL_NONE) { + return; + } + + $this->parseSubjectMemberRemoveNotYetMemberRequesting($event, $circle, $member); + $this->parseCircleMemberAdvancedEvent( + $event, $circle, $member, + $this->l10n->t("You cancelled {member}'s invitation to join {circle}"), + $this->l10n->t('Your invitation to join {circle} has been cancelled by {author}'), + $this->l10n->t("{author} cancelled {member}'s invitation to join {circle}") + ); + + throw new FakeException(); + } + + /** + * @param IEvent $event + * @param Circle $circle + * @param Member $member + * @throws FakeException + */ + private function parseSubjectMemberRemoveNotYetMemberRequesting( + IEvent $event, + Circle $circle, + Member $member, + ): void { + if ($member->getStatus() !== Member::STATUS_REQUEST) { + return; + } + + $this->parseCircleMemberAdvancedEvent( + $event, $circle, $member, + $this->l10n->t("You dismissed {member}'s request to join {circle}"), + $this->l10n->t('Your request to join {circle} has been dismissed by {author}'), + $this->l10n->t("{member}'s request to join {circle} has been dismissed by {author}") + ); + + throw new FakeException(); + } + + /** + * @param IEvent $event + * @param Circle $circle + * @param Member $member + * @throws FakeException + */ + public function parseMemberInvited(IEvent $event, Circle $circle, Member $member): void { + if ($event->getSubject() !== 'member_invited') { + return; + } + + $this->parseCircleMemberAdvancedEvent( + $event, $circle, $member, + $this->l10n->t('You invited {member} to join {circle}'), + $this->l10n->t('You have been invited to join {circle} by {author}'), + $this->l10n->t('{member} has been invited to join {circle} by {author}') + ); + + throw new FakeException(); + } + + + /** + * @param IEvent $event + * @param Circle $circle + * @param Member $member + * @param int $level + * @throws FakeException + */ + public function parseMemberLevel( + IEvent $event, + Circle $circle, + Member $member, + int $level, + ): void { + if ($event->getSubject() !== 'member_level') { + return; + } + + $levelString = $this->l10n->t(Member::$DEF_LEVEL[$level] ?? ''); + $this->parseCircleMemberAdvancedEvent( + $event, $circle, $member, + $this->l10n->t('You changed {member}\'s level in {circle} to %1$s', [$levelString]), + $this->l10n->t('{author} changed your level in {circle} to %1$s', [$levelString]), + $this->l10n->t('{author} changed {member}\'s level in {circle} to %1$s', [$levelString]) + ); + + throw new FakeException(); + } + + + /** + * @param IEvent $event + * @param Circle $circle + * @param Member $member + * + * @throws FakeException + */ + public function parseMemberRequestInvitation( + IEvent $event, + Circle $circle, + Member $member, + ): void { + if ($event->getSubject() !== 'member_request_invitation') { + return; + } + + $this->parseMemberEvent( + $event, $circle, $member, + $this->l10n->t('You sent a request to join {circle}'), + $this->l10n->t('{member} sent a request to join {circle}') + ); + + throw new FakeException(); + } + + /** + * @param IEvent $event + * @param Circle $circle + * @param Member $member + * + * @throws FakeException + */ + public function parseMemberOwner( + IEvent $event, + Circle $circle, + Member $member, + ): void { + if ($event->getSubject() !== 'member_owner') { + return; + } + + $this->parseMemberEvent( + $event, $circle, $member, + $this->l10n->t('You are the new owner of {circle}'), + $this->l10n->t('{member} is the new owner of {circle}') + ); + throw new FakeException(); + } +} diff --git a/lib/Activity/Provider.php b/lib/Activity/Provider.php index 2a1c5b032..1a796846c 100644 --- a/lib/Activity/Provider.php +++ b/lib/Activity/Provider.php @@ -11,8 +11,6 @@ use OCA\Circles\AppInfo\Application; use OCA\Circles\Exceptions\FakeException; -use OCA\Circles\Model\Circle; -use OCA\Circles\Model\Member; use OCA\Circles\Tools\Exceptions\InvalidItemException; use OCA\Circles\Tools\Traits\TDeserialize; use OCP\Activity\Exceptions\UnknownActivityException; @@ -30,6 +28,7 @@ public function __construct( private ProviderSubjectCircle $parserCircle, private ProviderSubjectMember $parserMember, private ProviderSubjectCircleMember $parserCircleMember, + private Deprecated\Provider $deprecatedProvider, ) { } @@ -39,16 +38,17 @@ public function __construct( public function parse($language, IEvent $event, ?IEvent $previousEvent = null): IEvent { try { $params = $event->getSubjectParameters(); - $this->initActivityParser($event, $params); + $ver = $this->initActivityParser($event, $params); - /** @var Circle $circle */ - $circle = $this->deserializeJson($params['circle'], Circle::class); + if ($ver === 1) { + return $this->deprecatedProvider->parse($language, $event, $previousEvent); + } $this->setIcon($event); - $this->parseAsNonMember($event, $circle); - $this->parseAsMember($event, $circle, $params); - $this->parseAsModerator($event, $circle, $params); - } catch (FakeException|InvalidItemException $e) { + $this->parseAsNonMember($event, $params); + $this->parseAsMember($event, $params); + $this->parseAsModerator($event, $params); + } catch (FakeException|InvalidItemException) { /** clean exit */ } @@ -59,7 +59,7 @@ public function parse($language, IEvent $event, ?IEvent $previousEvent = null): * @param IEvent $event * @param array $params */ - private function initActivityParser(IEvent $event, array $params): void { + private function initActivityParser(IEvent $event, array $params): int { if ($event->getApp() !== Application::APP_ID) { throw new UnknownActivityException(); } @@ -67,6 +67,8 @@ private function initActivityParser(IEvent $event, array $params): void { if (!key_exists('circle', $params)) { throw new UnknownActivityException(); } + + return $params['ver'] ?? 1; } /** @@ -79,115 +81,98 @@ private function setIcon(IEvent $event): void { /** * @param IEvent $event - * @param Circle $circle * @param array $params * * @throws FakeException */ private function parseAsNonMember( IEvent $event, - Circle $circle, + array $params, ): void { if ($event->getType() !== 'circles_as_non_member') { return; } - $this->parserCircle->parseSubjectCircleCreate($event, $circle); + $this->parserCircle->parseSubjectCircleCreate($event, $params); } /** * @param IEvent $event - * @param Circle $circle * @param array $params * * @throws FakeException */ private function parseAsMember( IEvent $event, - Circle $circle, array $params, ): void { if ($event->getType() !== 'circles_as_member') { return; } - $this->parserCircle->parseSubjectCircleCreate($event, $circle); - $this->parserCircle->parseSubjectCircleDelete($event, $circle); - $this->parseMemberAsMember($event, $circle, $params); - $this->parseCircleMemberAsMember($event, $circle, $params); + $this->parserCircle->parseSubjectCircleCreate($event, $params); + $this->parserCircle->parseSubjectCircleDelete($event, $params); + $this->parseMemberAsMember($event, $params); + $this->parseCircleMemberAsMember($event, $params); } /** - * @param Circle $circle * @param IEvent $event * @param array $params * * @throws FakeException * @throws InvalidItemException */ - private function parseAsModerator(IEvent $event, Circle $circle, array $params): void { + private function parseAsModerator(IEvent $event, array $params): void { if ($event->getType() !== 'circles_as_moderator') { return; } - $this->parseMemberAsModerator($event, $circle, $params); + $this->parseMemberAsModerator($event, $params); } /** * @param IEvent $event - * @param Circle $circle * @param array $params * * @throws FakeException - * @throws InvalidItemException */ private function parseMemberAsMember( IEvent $event, - Circle $circle, array $params, ): void { - if (!key_exists('member', $params)) { + if (!array_key_exists('member', $params)) { return; } - /** @var Member $member */ - $member = $this->deserializeJson($params['member'], Member::class); - - $this->parserMember->parseSubjectMemberJoin($event, $circle, $member); - $this->parserMember->parseSubjectMemberAdd($event, $circle, $member); - $this->parserMember->parseSubjectMemberLeft($event, $circle, $member); - $this->parserMember->parseSubjectMemberRemove($event, $circle, $member); + $this->parserMember->parseSubjectMemberJoin($event, $params); + $this->parserMember->parseSubjectMemberAdd($event, $params); + $this->parserMember->parseSubjectMemberLeft($event, $params); + $this->parserMember->parseSubjectMemberRemove($event, $params); } /** * @param IEvent $event - * @param Circle $circle * @param array $params * * @throws FakeException - * @throws InvalidItemException */ private function parseCircleMemberAsMember( IEvent $event, - Circle $circle, array $params, ): void { - if (!key_exists('member', $params)) { + if (!array_key_exists('member', $params)) { return; } - /** @var Member $member */ - $member = $this->deserializeJson($params['member'], Member::class); - - $this->parserCircleMember->parseSubjectCircleMemberJoin($event, $circle, $member); - $this->parserCircleMember->parseSubjectCircleMemberAdd($event, $circle, $member); - $this->parserCircleMember->parseSubjectCircleMemberLeft($event, $circle, $member); - $this->parserCircleMember->parseSubjectCircleMemberRemove($event, $circle, $member); + $this->parserCircleMember->parseSubjectCircleMemberJoin($event, $params); + $this->parserCircleMember->parseSubjectCircleMemberAdd($event, $params); + $this->parserCircleMember->parseSubjectCircleMemberLeft($event, $params); + $this->parserCircleMember->parseSubjectCircleMemberRemove($event, $params); } /** * @param IEvent $event - * @param Circle $circle * @param array $params * * @throws FakeException @@ -195,19 +180,15 @@ private function parseCircleMemberAsMember( */ private function parseMemberAsModerator( IEvent $event, - Circle $circle, array $params, ): void { - if (!key_exists('member', $params)) { + if (!array_key_exists('member', $params)) { return; } - /** @var Member $member */ - $member = $this->deserializeJson($params['member'], Member::class); - - $this->parserMember->parseMemberInvited($event, $circle, $member); - $this->parserMember->parseMemberLevel($event, $circle, $member, $params['level'] ?? 0); - $this->parserMember->parseMemberRequestInvitation($event, $circle, $member); - $this->parserMember->parseMemberOwner($event, $circle, $member); + $this->parserMember->parseMemberInvited($event, $params); + $this->parserMember->parseMemberLevel($event, $params); + $this->parserMember->parseMemberRequestInvitation($event, $params); + $this->parserMember->parseMemberOwner($event, $params); } } diff --git a/lib/Activity/ProviderParser.php b/lib/Activity/ProviderParser.php index 26cafa70e..1a86369bf 100644 --- a/lib/Activity/ProviderParser.php +++ b/lib/Activity/ProviderParser.php @@ -9,8 +9,6 @@ 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; @@ -25,24 +23,18 @@ public function __construct( ) { } - /** - * @param IEvent $event - * @param Circle $circle - * @param string $ownEvent - * @param string $othersEvent - */ protected function parseCircleEvent( IEvent $event, - Circle $circle, + array $params, string $ownEvent, string $othersEvent, ): void { $data = [ - 'author' => $this->generateViewerParameter($circle), - 'circle' => $this->generateCircleParameter($circle) + 'author' => $this->generateUserParameter($params['initiator'] ?? []), + 'circle' => $this->generateCircleParameter($params['circle']) ]; - if ($this->isViewerTheAuthor($circle, $this->activityManager->getCurrentUserId())) { + if ($this->isViewerTheAuthor($params['initiator'] ?? [], $this->activityManager->getCurrentUserId())) { $this->setSubject($event, $ownEvent, $data); return; @@ -113,25 +105,22 @@ protected function setParsedSubject( /** * @param IEvent $event - * @param Circle $circle - * @param Member $member + * @param array $params * @param string $ownEvent * @param string $othersEvent */ protected function parseMemberEvent( IEvent $event, - Circle $circle, - Member $member, + array $params, string $ownEvent, string $othersEvent, ): void { $data = [ - 'circle' => $this->generateCircleParameter($circle), - 'member' => $this->generateUserParameter($member) + 'circle' => $this->generateCircleParameter($params['circle']), + 'member' => $this->generateUserParameter($params['member'] ?? []) ]; - if ($member->getUserId() === $this->activityManager->getCurrentUserId() - ) { + if ($this->isViewerTheAuthor($params['member'] ?? [], $this->activityManager->getCurrentUserId())) { $this->setSubject($event, $ownEvent, $data); return; @@ -142,27 +131,25 @@ protected function parseMemberEvent( /** * @param IEvent $event - * @param Circle $circle - * @param Member $member + * @param array $params * @param string $ownEvent * @param string $othersEvent */ protected function parseCircleMemberEvent( IEvent $event, - Circle $circle, - Member $member, + array $params, 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), + 'author' => $this->generateUserParameter($params['initiator'] ?? []), + 'circle' => $this->generateCircleParameter($params['circle']), + 'member' => $this->generateUserParameter($params['member'] ?? []), + 'external' => $this->generateExternalMemberParameter($params['member'] ?? []), + 'group' => $this->generateGroupParameter($params['member'] ?? []), ]; - if ($this->isViewerTheAuthor($circle, $this->activityManager->getCurrentUserId())) { + if ($this->isViewerTheAuthor($params['initiator'] ?? [], $this->activityManager->getCurrentUserId())) { $this->setSubject($event, $ownEvent, $data); return; @@ -175,33 +162,31 @@ protected function parseCircleMemberEvent( * general function to generate Circle+Member advanced event. * * @param IEvent $event - * @param Circle $circle - * @param Member $member + * @param array $params * @param string $ownEvent * @param string $targetEvent * @param string $othersEvent */ protected function parseCircleMemberAdvancedEvent( IEvent $event, - Circle $circle, - Member $member, + array $params, string $ownEvent, string $targetEvent, string $othersEvent, ): void { $data = [ - 'author' => $this->generateViewerParameter($circle), - 'circle' => $this->generateCircleParameter($circle), - 'member' => $this->generateUserParameter($member) + 'author' => $this->generateUserParameter($params['initiator'] ?? []), + 'circle' => $this->generateCircleParameter($params['circle']), + 'member' => $this->generateUserParameter($params['member'] ?? []) ]; - if ($this->isViewerTheAuthor($circle, $this->activityManager->getCurrentUserId())) { + if ($this->isViewerTheAuthor($params['initiator'] ?? [], $this->activityManager->getCurrentUserId())) { $this->setSubject($event, $ownEvent, $data); return; } - if ($member->getUserId() === $this->activityManager->getCurrentUserId()) { + if ($this->isViewerTheAuthor($params['member'] ?? [], $this->activityManager->getCurrentUserId())) { $this->setSubject($event, $targetEvent, $data); return; @@ -211,91 +196,74 @@ protected function parseCircleMemberAdvancedEvent( } /** - * @param Circle $circle + * @param array $params * @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); + protected function isViewerTheAuthor(array $initiator, string $userId): bool { + return (($initiator['type'] ?? 0) === Member::TYPE_USER && ($initiator['userId'] ?? '') === $userId); } + /** - * @param Circle $circle + * @param array $member * * @return array */ - protected function generateViewerParameter(Circle $circle): array { - if (!$circle->hasInitiator()) { - return []; + protected function generateExternalMemberParameter(array $member): array { + $data = $this->generateUserParameter($member); + if (!empty($data)) { + $data['link'] = ''; } - return $this->generateUserParameter($circle->getInitiator()); - } - - /** - * @param Member $member - * - * @return array - */ - protected function generateExternalMemberParameter(Member $member): array { - return [ - 'type' => 'email', - 'id' => $member->getUserId(), - 'link' => '', - 'name' => $member->getDisplayName(), - '_parsed' => $member->getDisplayName() - ]; + return $data; } /** - * @param Circle $circle + * @param array $circle * * @return array */ - protected function generateCircleParameter(Circle $circle): array { + protected function generateCircleParameter(array $circle): array { return [ 'type' => 'circle', - 'id' => $circle->getSingleId(), - 'name' => $circle->getName(), - '_parsed' => $circle->getName(), - 'link' => $this->url->getAbsoluteURL($circle->getUrl()), + 'id' => $circle['singleId'], + 'name' => $circle['name'], + '_parsed' => $circle['name'], + 'link' => $this->url->getAbsoluteURL($circle['url']), ]; } /** * @return array */ - protected function generateUserParameter(IFederatedUser $member): array { - $display = $member->getDisplayName(); - if ($display === '') { - $display = $member->getUserId(); + protected function generateUserParameter(array $member): array { + if (!array_key_exists('userId', $member)) { + return []; } return [ 'type' => 'user', - 'id' => $member->getUserId(), - 'name' => $display, - '_parsed' => $display + 'id' => $member['userId'], + 'name' => $member['displayName'] ?? $member['userId'], + '_parsed' => $member['displayName'] ?? $member['userId'], ]; } /** * @return array */ - protected function generateGroupParameter(Member $group): array { + protected function generateGroupParameter(array $group): array { + if (!array_key_exists('userId', $group)) { + return []; + } + return [ 'type' => 'user-group', - 'id' => $group->getUserId(), - 'name' => $group->getUserId(), - '_parsed' => $group->getUserId() + 'id' => $group['userId'], + 'name' => $group['userId'], + '_parsed' => $group['userId'] ]; } } diff --git a/lib/Activity/ProviderSubjectCircle.php b/lib/Activity/ProviderSubjectCircle.php index dc955b568..f591929cd 100644 --- a/lib/Activity/ProviderSubjectCircle.php +++ b/lib/Activity/ProviderSubjectCircle.php @@ -10,23 +10,16 @@ namespace OCA\Circles\Activity; use OCA\Circles\Exceptions\FakeException; -use OCA\Circles\Model\Circle; use OCP\Activity\IEvent; class ProviderSubjectCircle extends ProviderParser { - /** - * @param IEvent $event - * @param Circle $circle - * - * @throws FakeException - */ - public function parseSubjectCircleCreate(IEvent $event, Circle $circle): void { + public function parseSubjectCircleCreate(IEvent $event, array $params): void { if ($event->getSubject() !== 'circle_create') { return; } $this->parseCircleEvent( - $event, $circle, + $event, $params, $this->l10n->t('You created the team {circle}'), $this->l10n->t('{author} created the team {circle}') ); @@ -36,17 +29,17 @@ public function parseSubjectCircleCreate(IEvent $event, Circle $circle): void { /** * @param IEvent $event - * @param Circle $circle + * @param array $params * * @throws FakeException */ - public function parseSubjectCircleDelete(IEvent $event, Circle $circle): void { + public function parseSubjectCircleDelete(IEvent $event, array $params): void { if ($event->getSubject() !== 'circle_delete') { return; } $this->parseCircleEvent( - $event, $circle, + $event, $params, $this->l10n->t('You deleted {circle}'), $this->l10n->t('{author} deleted {circle}') ); diff --git a/lib/Activity/ProviderSubjectCircleMember.php b/lib/Activity/ProviderSubjectCircleMember.php index 62c2962fc..50b464563 100644 --- a/lib/Activity/ProviderSubjectCircleMember.php +++ b/lib/Activity/ProviderSubjectCircleMember.php @@ -10,35 +10,30 @@ namespace OCA\Circles\Activity; use OCA\Circles\Exceptions\FakeException; -use OCA\Circles\Model\Circle; -use OCA\Circles\Model\Member; use OCP\Activity\IEvent; class ProviderSubjectCircleMember extends ProviderParser { /** * @param IEvent $event - * @param Circle $circle - * @param Member $member + * @param array $params * @param string $ownEvent * @param string $othersEvent - * @return void */ protected function parseMemberCircleEvent( IEvent $event, - Circle $circle, - Member $member, + array $params, 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), + 'author' => $this->generateUserParameter($params['initiator'] ?? []), + 'circle' => $this->generateCircleParameter($params['circle']), + 'member' => $this->generateUserParameter($params['member'] ?? []), + 'external' => $this->generateExternalMemberParameter($params['member'] ?? []), + 'group' => $this->generateGroupParameter($params['member'] ?? []), ]; - if ($this->isViewerTheAuthor($circle, $this->activityManager->getCurrentUserId())) { + if ($this->isViewerTheAuthor($params['initiator'] ?? [], $this->activityManager->getCurrentUserId())) { $this->setSubject($event, $ownEvent, $data); return; @@ -49,21 +44,20 @@ protected function parseMemberCircleEvent( /** * @param IEvent $event - * @param Circle $circle - * @param Member $member + * @param array $params + * * @throws FakeException */ public function parseSubjectCircleMemberJoin( IEvent $event, - Circle $circle, - Member $member, + array $params, ): void { if ($event->getSubject() !== 'member_circle_joined') { return; } $this->parseMemberCircleEvent( - $event, $circle, $member, + $event, $params, $this->l10n->t('You made {member} join {circle}'), $this->l10n->t('{author} made {member} join {circle}') ); @@ -73,22 +67,20 @@ public function parseSubjectCircleMemberJoin( /** * @param IEvent $event - * @param Circle $circle - * @param Member $member - * @return void + * @param array $params + * * @throws FakeException */ public function parseSubjectCircleMemberAdd( IEvent $event, - Circle $circle, - Member $member, + array $params, ): void { if ($event->getSubject() !== 'member_circle_added') { return; } $this->parseMemberCircleEvent( - $event, $circle, $member, + $event, $params, $this->l10n->t('You added team {member} as member to {circle}'), $this->l10n->t('{author} added team {member} as member to {circle}') ); @@ -98,22 +90,20 @@ public function parseSubjectCircleMemberAdd( /** * @param IEvent $event - * @param Circle $circle - * @param Member $member - * @return void + * @param array $params + * * @throws FakeException */ public function parseSubjectCircleMemberLeft( IEvent $event, - Circle $circle, - Member $member, + array $params, ): void { if ($event->getSubject() !== 'member_circle_left') { return; } $this->parseCircleMemberEvent( - $event, $circle, $member, + $event, $params, $this->l10n->t('You made {member} leave {circle}'), $this->l10n->t('{author} made {member} leave {circle}') ); @@ -123,22 +113,20 @@ public function parseSubjectCircleMemberLeft( /** * @param IEvent $event - * @param Circle $circle - * @param Member $member - * @return void + * @param array $params + * * @throws FakeException */ public function parseSubjectCircleMemberRemove( IEvent $event, - Circle $circle, - Member $member, + array $params, ): void { if ($event->getSubject() !== 'member_circle_removed') { return; } $this->parseCircleMemberEvent( - $event, $circle, $member, + $event, $params, $this->l10n->t('You removed {member} from {circle}'), $this->l10n->t('{author} removed {member} from {circle}') ); diff --git a/lib/Activity/ProviderSubjectMember.php b/lib/Activity/ProviderSubjectMember.php index cd1f74795..2118e611f 100644 --- a/lib/Activity/ProviderSubjectMember.php +++ b/lib/Activity/ProviderSubjectMember.php @@ -17,23 +17,21 @@ class ProviderSubjectMember extends ProviderParser { /** * @param IEvent $event - * @param Circle $circle - * @param Member $member + * @param array $params * * @throws FakeException */ public function parseSubjectMemberJoin( IEvent $event, - Circle $circle, - Member $member, + array $params, ): void { if ($event->getSubject() !== 'member_join') { return; } - $this->parseSubjectMemberJoinOnInvite($event, $circle, $member); + $this->parseSubjectMemberJoinOnInvite($event, $params); $this->parseCircleMemberEvent( - $event, $circle, $member, $this->l10n->t('You joined {circle}'), + $event, $params, $this->l10n->t('You joined {circle}'), $this->l10n->t('{member} joined {circle}') ); @@ -42,22 +40,20 @@ public function parseSubjectMemberJoin( /** * @param IEvent $event - * @param Circle $circle - * @param Member $member + * @param array $params * * @throws FakeException */ private function parseSubjectMemberJoinOnInvite( IEvent $event, - Circle $circle, - Member $member, + array $params, ): void { - if (!$circle->isConfig(Circle::CFG_INVITE)) { + if ((($params['circle']['config'] ?? 0) & Circle::CFG_INVITE) === 0) { return; } $this->parseCircleMemberEvent( - $event, $circle, $member, + $event, $params, $this->l10n->t('You accepted the invitation to join {circle}'), $this->l10n->t('{member} accepted the invitation to join {circle}') ); @@ -68,24 +64,22 @@ private function parseSubjectMemberJoinOnInvite( /** * @param IEvent $event - * @param Circle $circle - * @param Member $member + * @param array $params * * @throws FakeException */ public function parseSubjectMemberAdd( IEvent $event, - Circle $circle, - Member $member, + array $params, ): void { if ($event->getSubject() !== 'member_added') { return; } - $this->parseSubjectMemberAddNotLocalMember($event, $circle, $member); - $this->parseSubjectMemberAddClosedCircle($event, $circle, $member); + $this->parseSubjectMemberAddNotLocalMember($event, $params); + $this->parseSubjectMemberAddClosedCircle($event, $params); $this->parseCircleMemberAdvancedEvent( - $event, $circle, $member, + $event, $params, $this->l10n->t('You added {member} as member to {circle}'), $this->l10n->t('You have been added as member to {circle} by {author}'), $this->l10n->t('{member} has been added as member to {circle} by {author}') @@ -96,22 +90,20 @@ public function parseSubjectMemberAdd( /** * @param IEvent $event - * @param Circle $circle - * @param Member $member + * @param array $params * * @throws FakeException */ private function parseSubjectMemberAddNotLocalMember( IEvent $event, - Circle $circle, - Member $member, + array $params, ): void { - if ($member->getUserType() === Member::TYPE_USER) { + if (($params['member']['type'] ?? Member::TYPE_USER) === Member::TYPE_USER) { return; } $this->parseCircleMemberEvent( - $event, $circle, $member, + $event, $params, $this->l10n->t('You added {external} to {circle}'), $this->l10n->t('{external} has been added to {circle} by {author}') ); @@ -122,22 +114,20 @@ private function parseSubjectMemberAddNotLocalMember( /** * @param IEvent $event - * @param Circle $circle - * @param Member $member + * @param array $params * * @throws FakeException */ private function parseSubjectMemberAddClosedCircle( IEvent $event, - Circle $circle, - Member $member, + array $params, ): void { - if (!$circle->isConfig(Circle::CFG_REQUEST)) { + if ((($params['circle']['config'] ?? 0) & Circle::CFG_REQUEST) === 0) { return; } $this->parseCircleMemberAdvancedEvent( - $event, $circle, $member, + $event, $params, $this->l10n->t("You accepted {member}'s request to join {circle}"), $this->l10n->t('Your request to join {circle} has been accepted by {author}'), $this->l10n->t("{member}'s request to join {circle} has been accepted by {author}") @@ -149,24 +139,22 @@ private function parseSubjectMemberAddClosedCircle( /** * @param IEvent $event - * @param Circle $circle - * @param Member $member + * @param array $params * * @throws FakeException */ public function parseSubjectMemberLeft( IEvent $event, - Circle $circle, - Member $member, + array $params, ): void { if ($event->getSubject() !== 'member_left') { return; } - $this->parseSubjectNonMemberLeftInvite($event, $circle, $member); - $this->parseSubjectNonMemberLeftRequest($event, $circle, $member); + $this->parseSubjectNonMemberLeftInvite($event, $params); + $this->parseSubjectNonMemberLeftRequest($event, $params); $this->parseCircleMemberEvent( - $event, $circle, $member, + $event, $params, $this->l10n->t('You left {circle}'), $this->l10n->t('{member} left {circle}') ); @@ -177,23 +165,21 @@ public function parseSubjectMemberLeft( /** * @param IEvent $event - * @param Circle $circle - * @param Member $member + * @param array $params * * @throws FakeException */ private function parseSubjectNonMemberLeftInvite( IEvent $event, - Circle $circle, - Member $member, + array $params, ): void { - if (!$circle->isConfig(Circle::CFG_INVITE) - || $member->getLevel() > Member::LEVEL_NONE) { + if (((($params['circle']['config'] ?? 0) & Circle::CFG_INVITE) === 0) + || (($params['member']['level'] ?? 1) > Member::LEVEL_NONE)) { return; } $this->parseCircleMemberEvent( - $event, $circle, $member, + $event, $params, $this->l10n->t('You declined the invitation to join {circle}'), $this->l10n->t('{member} declined an invitation to join {circle}') ); @@ -204,23 +190,21 @@ private function parseSubjectNonMemberLeftInvite( /** * @param IEvent $event - * @param Circle $circle - * @param Member $member + * @param array $params * * @throws FakeException */ private function parseSubjectNonMemberLeftRequest( IEvent $event, - Circle $circle, - Member $member, + array $params, ): void { - if (!$circle->isConfig(Circle::CFG_REQUEST) - || $member->getLevel() > Member::LEVEL_NONE) { + if (((($params['circle']['config'] ?? 0) & Circle::CFG_REQUEST) === 0) + || (($params['member']['level'] ?? 1) > Member::LEVEL_NONE)) { return; } $this->parseCircleMemberEvent( - $event, $circle, $member, + $event, $params, $this->l10n->t('You cancelled your request to join {circle}'), $this->l10n->t('{member} cancelled a request to join {circle}') ); @@ -231,24 +215,22 @@ private function parseSubjectNonMemberLeftRequest( /** * @param IEvent $event - * @param Circle $circle - * @param Member $member + * @param array $params * * @throws FakeException */ public function parseSubjectMemberRemove( IEvent $event, - Circle $circle, - Member $member, + array $params, ): void { if ($event->getSubject() !== 'member_remove') { return; } - $this->parseSubjectMemberRemoveNotLocalMember($event, $circle, $member); - $this->parseSubjectMemberRemoveNotYetMember($event, $circle, $member); + $this->parseSubjectMemberRemoveNotLocalMember($event, $params); + $this->parseSubjectMemberRemoveNotYetMember($event, $params); $this->parseCircleMemberAdvancedEvent( - $event, $circle, $member, + $event, $params, $this->l10n->t('You removed {member} from {circle}'), $this->l10n->t('You have been removed from {circle} by {author}'), $this->l10n->t('{member} has been removed from {circle} by {author}') @@ -259,22 +241,20 @@ public function parseSubjectMemberRemove( /** * @param IEvent $event - * @param Circle $circle - * @param Member $member + * @param array $params * * @throws FakeException */ private function parseSubjectMemberRemoveNotLocalMember( IEvent $event, - Circle $circle, - Member $member, + array $params, ): void { - if ($member->getUserType() === Member::TYPE_USER) { + if (($params['member']['type'] ?? Member::TYPE_USER) === Member::TYPE_USER) { return; } $this->parseCircleMemberEvent( - $event, $circle, $member, + $event, $params, $this->l10n->t('You removed {external} from {circle}'), $this->l10n->t('{external} has been removed from {circle} by {author}') ); @@ -285,24 +265,22 @@ private function parseSubjectMemberRemoveNotLocalMember( /** * @param IEvent $event - * @param Circle $circle - * @param Member $member + * @param array $params * * @throws FakeException */ private function parseSubjectMemberRemoveNotYetMember( IEvent $event, - Circle $circle, - Member $member, + array $params, ): void { - if (!$circle->isConfig(Circle::CFG_INVITE) - || $member->getLevel() > Member::LEVEL_NONE) { + if (((($params['circle']['config'] ?? 0) & Circle::CFG_INVITE) === 0) + || (($params['member']['level'] ?? 1) > Member::LEVEL_NONE)) { return; } - $this->parseSubjectMemberRemoveNotYetMemberRequesting($event, $circle, $member); + $this->parseSubjectMemberRemoveNotYetMemberRequesting($event, $params); $this->parseCircleMemberAdvancedEvent( - $event, $circle, $member, + $event, $params, $this->l10n->t("You cancelled {member}'s invitation to join {circle}"), $this->l10n->t('Your invitation to join {circle} has been cancelled by {author}'), $this->l10n->t("{author} cancelled {member}'s invitation to join {circle}") @@ -313,21 +291,19 @@ private function parseSubjectMemberRemoveNotYetMember( /** * @param IEvent $event - * @param Circle $circle - * @param Member $member + * @param array $params * @throws FakeException */ private function parseSubjectMemberRemoveNotYetMemberRequesting( IEvent $event, - Circle $circle, - Member $member, + array $params, ): void { - if ($member->getStatus() !== Member::STATUS_REQUEST) { + if (($params['member']['status'] ?? '') !== Member::STATUS_REQUEST) { return; } $this->parseCircleMemberAdvancedEvent( - $event, $circle, $member, + $event, $params, $this->l10n->t("You dismissed {member}'s request to join {circle}"), $this->l10n->t('Your request to join {circle} has been dismissed by {author}'), $this->l10n->t("{member}'s request to join {circle} has been dismissed by {author}") @@ -338,17 +314,17 @@ private function parseSubjectMemberRemoveNotYetMemberRequesting( /** * @param IEvent $event - * @param Circle $circle - * @param Member $member + * @param array $params + * * @throws FakeException */ - public function parseMemberInvited(IEvent $event, Circle $circle, Member $member): void { + public function parseMemberInvited(IEvent $event, array $params): void { if ($event->getSubject() !== 'member_invited') { return; } $this->parseCircleMemberAdvancedEvent( - $event, $circle, $member, + $event, $params, $this->l10n->t('You invited {member} to join {circle}'), $this->l10n->t('You have been invited to join {circle} by {author}'), $this->l10n->t('{member} has been invited to join {circle} by {author}') @@ -360,24 +336,22 @@ public function parseMemberInvited(IEvent $event, Circle $circle, Member $member /** * @param IEvent $event - * @param Circle $circle - * @param Member $member - * @param int $level + * @param array $params + * * @throws FakeException */ public function parseMemberLevel( IEvent $event, - Circle $circle, - Member $member, - int $level, + array $params, ): void { if ($event->getSubject() !== 'member_level') { return; } + $level = $params['level'] ?? 0; $levelString = $this->l10n->t(Member::$DEF_LEVEL[$level] ?? ''); $this->parseCircleMemberAdvancedEvent( - $event, $circle, $member, + $event, $params, $this->l10n->t('You changed {member}\'s level in {circle} to %1$s', [$levelString]), $this->l10n->t('{author} changed your level in {circle} to %1$s', [$levelString]), $this->l10n->t('{author} changed {member}\'s level in {circle} to %1$s', [$levelString]) @@ -389,22 +363,20 @@ public function parseMemberLevel( /** * @param IEvent $event - * @param Circle $circle - * @param Member $member + * @param array $params * * @throws FakeException */ public function parseMemberRequestInvitation( IEvent $event, - Circle $circle, - Member $member, + array $params, ): void { if ($event->getSubject() !== 'member_request_invitation') { return; } $this->parseMemberEvent( - $event, $circle, $member, + $event, $params, $this->l10n->t('You sent a request to join {circle}'), $this->l10n->t('{member} sent a request to join {circle}') ); @@ -414,22 +386,20 @@ public function parseMemberRequestInvitation( /** * @param IEvent $event - * @param Circle $circle - * @param Member $member + * @param array $params * * @throws FakeException */ public function parseMemberOwner( IEvent $event, - Circle $circle, - Member $member, + array $params, ): void { if ($event->getSubject() !== 'member_owner') { return; } $this->parseMemberEvent( - $event, $circle, $member, + $event, $params, $this->l10n->t('You are the new owner of {circle}'), $this->l10n->t('{member} is the new owner of {circle}') ); diff --git a/lib/Service/ActivityService.php b/lib/Service/ActivityService.php index 83d950ef3..c33a52eff 100644 --- a/lib/Service/ActivityService.php +++ b/lib/Service/ActivityService.php @@ -41,7 +41,14 @@ public function onCircleCreation(Circle $circle): void { } $event = $this->generateEvent('circles_as_non_member'); - $event->setSubject('circle_create', ['circle' => json_encode($circle)]); + $event->setSubject( + 'circle_create', + [ + 'ver' => 2, + 'circle' => $this->shortenCircleData($circle), + 'initiator' => ($circle->hasInitiator() ? $this->shortenMemberData($circle->getInitiator()) : null), + ] + ); $this->userManager->callForSeenUsers( function ($user) use ($event) { @@ -60,7 +67,14 @@ public function onCircleDestruction(Circle $circle): void { } $event = $this->generateEvent('circles_as_member'); - $event->setSubject('circle_delete', ['circle' => json_encode($circle)]); + $event->setSubject( + 'circle_delete', + [ + 'ver' => 2, + 'circle' => $this->shortenCircleData($circle), + 'initiator' => ($circle->hasInitiator() ? $this->shortenMemberData($circle->getInitiator()) : null), + ] + ); $this->publishEvent( $event, $this->memberRequest->getInheritedMembers($circle->getSingleId(), false, Member::LEVEL_MEMBER) @@ -122,8 +136,10 @@ private function onMemberNewAccount( CircleGenericEvent::JOINED => 'member_join' }, [ - 'circle' => json_encode($circle), - 'member' => json_encode($member) + 'ver' => 2, + 'circle' => $this->shortenCircleData($circle), + 'initiator' => ($circle->hasInitiator() ? $this->shortenMemberData($circle->getInitiator()) : null), + 'member' => $this->shortenMemberData($member), ] ); } catch (UnhandledMatchError $e) { @@ -161,8 +177,10 @@ private function onMemberNewCircle( CircleGenericEvent::JOINED => 'member_circle_joined' }, [ - 'circle' => json_encode($circle), - 'member' => json_encode($member) + 'ver' => 2, + 'circle' => $this->shortenCircleData($circle), + 'initiator' => ($circle->hasInitiator() ? $this->shortenMemberData($circle->getInitiator()) : null), + 'member' => $this->shortenMemberData($member), ] ); } catch (UnhandledMatchError $e) { @@ -200,8 +218,10 @@ private function onMemberAlmost( CircleGenericEvent::REQUESTED => 'member_request_invitation' }, [ - 'circle' => json_encode($circle), - 'member' => json_encode($member) + 'ver' => 2, + 'circle' => $this->shortenCircleData($circle), + 'initiator' => ($circle->hasInitiator() ? $this->shortenMemberData($circle->getInitiator()) : null), + 'member' => $this->shortenMemberData($member), ] ); } catch (UnhandledMatchError $e) { @@ -244,7 +264,6 @@ public function onMemberRemove(Circle $circle, Member $member, int $eventType): } } - private function onMemberRemoveAccount( Circle $circle, Member $member, @@ -259,8 +278,10 @@ private function onMemberRemoveAccount( CircleGenericEvent::REMOVED => 'member_remove' }, [ - 'circle' => json_encode($circle), - 'member' => json_encode($member) + 'ver' => 2, + 'circle' => $this->shortenCircleData($circle), + 'initiator' => ($circle->hasInitiator() ? $this->shortenMemberData($circle->getInitiator()) : null), + 'member' => $this->shortenMemberData($member), ] ); } catch (UnhandledMatchError $e) { @@ -293,8 +314,10 @@ private function onMemberRemoveCircle( CircleGenericEvent::REMOVED => 'member_circle_removed' }, [ - 'circle' => json_encode($circle), - 'member' => json_encode($member) + 'ver' => 2, + 'circle' => $this->shortenCircleData($circle), + 'initiator' => ($circle->hasInitiator() ? $this->shortenMemberData($circle->getInitiator()) : null), + 'member' => $this->shortenMemberData($member), ] ); } catch (UnhandledMatchError $e) { @@ -328,17 +351,23 @@ public function onMemberLevel( $event = $this->generateEvent('circles_as_moderator'); $event->setSubject( 'member_level', - ['circle' => json_encode($circle), 'member' => json_encode($member), 'level' => $level] + [ + 'ver' => 2, + 'circle' => $this->shortenCircleData($circle), + 'initiator' => ($circle->hasInitiator() ? $this->shortenMemberData($circle->getInitiator()) : null), + 'member' => $this->shortenMemberData($member), + 'level' => $level + ] ); $this->publishEvent( $event, array_merge( [$member], - $this->memberRequest->getInheritedMembers($circle->getSingleId(), false, Member::LEVEL_MODERATOR)) + $this->memberRequest->getInheritedMembers($circle->getSingleId(), false, Member::LEVEL_MODERATOR) + ) ); } - /** * @param Circle $circle * @param Member $member @@ -347,7 +376,12 @@ public function onMemberOwner(Circle $circle, Member $member): void { $event = $this->generateEvent('circles_as_moderator'); $event->setSubject( 'member_owner', - ['circle' => json_encode($circle), 'member' => json_encode($member)] + [ + 'ver' => 2, + 'circle' => $this->shortenCircleData($circle), + 'initiator' => ($circle->hasInitiator() ? $this->shortenMemberData($circle->getInitiator()) : null), + 'member' => $this->shortenMemberData($member), + ] ); $this->publishEvent( @@ -356,11 +390,9 @@ public function onMemberOwner(Circle $circle, Member $member): void { ); } - public function onShareNew(Circle $getCircle, FederatedEvent $federatedEvent): void { } - /** * generateEvent() * Create an Activity Event with the basic settings for the app. @@ -377,7 +409,6 @@ private function generateEvent(string $type): IEvent { return $event; } - /** * Publish the event to the users. * - if user is IUser, we get userId, @@ -395,8 +426,8 @@ private function publishEvent(IEvent $event, array $users): void { $userId = $user->getUID(); } elseif ($user instanceof IFederatedUser) { $singleId = $user->getSingleId(); - if ($user->getUserType() !== Member::TYPE_USER || - in_array($singleId, $knownSingleIds)) { + if ($user->getUserType() !== Member::TYPE_USER + || in_array($singleId, $knownSingleIds)) { continue; // we ignore non-local account and already known single ids } @@ -410,4 +441,23 @@ private function publishEvent(IEvent $event, array $users): void { $this->activityManager->publish($event); } } + + private function shortenCircleData(Circle $circle): array { + return [ + 'singleId' => $circle->getSingleId(), + 'name' => $circle->getName(), + 'config' => $circle->getConfig(), + 'url' => $circle->getUrl(), + ]; + } + + private function shortenMemberData(Member $member): array { + return [ + 'userId' => $member->getUserId(), + 'displayName' => $member->getDisplayName(), + 'type' => $member->getUserType(), + 'level' => $member->getLevel(), + 'status' => $member->getStatus(), + ]; + } }