Files
therinaldos.com/wedding-pics/apps/circles/lib/Service/EventsService.php
T
david ef1ff240d4
Build & Deploy to DigitalOcean Space / build (push) Failing after 2m38s
migrate therinaldos.com data
2024-05-05 15:50:45 -04:00

947 lines
28 KiB
PHP

<?php
/**
* Circles - Bring cloud-users closer together.
*
* This file is licensed under the Affero General Public License version 3 or
* later. See the COPYING file.
*
* @author Maxence Lange <maxence@artificial-owl.com>
* @author: Vinicius Cubas Brand <viniciuscb@gmail.com>
* @copyright 2017
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Circles\Service;
use OCA\Circles\AppInfo\Application;
use OCA\Circles\Db\DeprecatedCirclesRequest;
use OCA\Circles\Db\DeprecatedMembersRequest;
use OCA\Circles\Model\DeprecatedCircle;
use OCA\Circles\Model\FederatedLink;
use OCA\Circles\Model\DeprecatedMember;
use OCP\Activity\IEvent;
use OCP\Activity\IManager as IActivityManager;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\IURLGenerator;
use OCP\IUser;
use OCP\IUserManager;
use OCP\Notification\IManager as INotificationManager;
use OCP\Notification\INotification;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\GenericEvent;
/**
* @deprecated
*
* Class EventsService
*
* @package OCA\Circles\Service
*/
class EventsService {
/** @var string */
private $userId;
/** @var ITimeFactory */
private $time;
/** @var IActivityManager */
private $activityManager;
/** @var INotificationManager */
private $notificationManager;
/** @var IUserManager */
private $userManager;
/** @var IURLGenerator */
private $urlGenerator;
/** @var EventDispatcher */
private $eventDispatcher;
/** @var DeprecatedCirclesRequest */
private $circlesRequest;
/** @var DeprecatedMembersRequest */
private $membersRequest;
/** @var ConfigService */
private $configService;
/** @var MiscService */
private $miscService;
/**
* Events constructor.
*
* @param string $userId
* @param ITimeFactory $time
* @param IActivityManager $activityManager
* @param INotificationManager $notificationManager
* @param IUserManager $userManager
* @param IURLGenerator $urlGenerator
* @param EventDispatcher $eventDispatcher
* @param DeprecatedCirclesRequest $circlesRequest
* @param DeprecatedMembersRequest $membersRequest
* @param ConfigService $configService
* @param MiscService $miscService
*/
public function __construct(
$userId, ITimeFactory $time, IActivityManager $activityManager,
INotificationManager $notificationManager, IUserManager $userManager, IURLGenerator $urlGenerator,
EventDispatcher $eventDispatcher, DeprecatedCirclesRequest $circlesRequest, DeprecatedMembersRequest $membersRequest,
ConfigService $configService, MiscService $miscService
) {
$this->userId = $userId;
$this->time = $time;
$this->activityManager = $activityManager;
$this->notificationManager = $notificationManager;
$this->userManager = $userManager;
$this->urlGenerator = $urlGenerator;
$this->eventDispatcher = $eventDispatcher;
$this->circlesRequest = $circlesRequest;
$this->membersRequest = $membersRequest;
$this->configService = $configService;
$this->miscService = $miscService;
}
/**
* onCircleCreation()
*
* Called when a circle is created.
* Broadcast an activity to the cloud
* We won't do anything if the circle is not PUBLIC or CLOSED
*
* @param DeprecatedCircle $circle
*/
public function onCircleCreation(DeprecatedCircle $circle) {
if ($circle->getType() !== DeprecatedCircle::CIRCLES_PUBLIC
&& $circle->getType() !== DeprecatedCircle::CIRCLES_CLOSED) {
return;
}
if ($this->configService->getAppValue(ConfigService::ACTIVITY_ON_NEW_CIRCLE) === '1') {
$event = $this->generateEvent('circles_as_non_member');
$event->setSubject('circle_create', ['circle' => json_encode($circle)]);
$this->userManager->callForSeenUsers(
function ($user) use ($event) {
/** @var IUser $user */
$this->publishEvent($event, [$user]);
}
);
}
$this->dispatch('\OCA\Circles::onCircleCreation', ['circle' => $circle]);
}
/**
* onCircleDestruction()
*
* Called when a circle is destroyed.
* Broadcast an activity on its members.
* We won't do anything if the circle is PERSONAL
*
* @param DeprecatedCircle $circle
*/
public function onCircleDestruction(DeprecatedCircle $circle) {
if ($circle->getType() === DeprecatedCircle::CIRCLES_PERSONAL) {
return;
}
$event = $this->generateEvent('circles_as_member');
$event->setSubject('circle_delete', ['circle' => json_encode($circle)]);
$this->publishEvent(
$event,
$this->membersRequest->forceGetMembers($circle->getUniqueId(), DeprecatedMember::LEVEL_MEMBER, 0, true)
);
$this->dispatch('\OCA\Circles::onCircleDestruction', ['circle' => $circle]);
}
/**
* onMemberNew()
*
* Called when a member is added to a circle.
* Broadcast an activity to the new member and to the moderators of the circle.
* We won't do anything if the circle is PERSONAL
* If the level is still 0, we will redirect to onMemberAlmost and manage the
* invitation/request from there
* If the level is Owner, we ignore the event.
*
* @param DeprecatedCircle $circle
* @param DeprecatedMember $member
*/
public function onMemberNew(DeprecatedCircle $circle, DeprecatedMember $member) {
if ($member->getLevel() === DeprecatedMember::LEVEL_OWNER
|| $circle->getType() === DeprecatedCircle::CIRCLES_PERSONAL
) {
return;
}
if ($member->getLevel() === DeprecatedMember::LEVEL_NONE) {
$this->onMemberAlmost($circle, $member);
return;
}
$event = $this->generateEvent('circles_as_member');
$event->setSubject(
($this->userId === $member->getUserId()) ? 'member_join' : 'member_add',
['circle' => json_encode($circle), 'member' => json_encode($member)]
);
$this->publishEvent(
$event, array_merge(
[$member],
$this->membersRequest->forceGetMembers(
$circle->getUniqueId(), DeprecatedMember::LEVEL_MODERATOR, 0, true
)
)
);
$this->dispatch('\OCA\Circles::onMemberNew', ['circle' => $circle, 'member' => $member]);
$this->notificationOnMemberNew($circle, $member);
}
/**
* onMemberAlmost()
*
* Called when a member is added to a circle with level=0
* Trigger onMemberInvitation() or onMemberInvitationRequest() based on Member Status
*
* @param DeprecatedCircle $circle
* @param DeprecatedMember $member
*/
private function onMemberAlmost(DeprecatedCircle $circle, DeprecatedMember $member) {
switch ($member->getStatus()) {
case DeprecatedMember::STATUS_INVITED:
$this->onMemberInvited($circle, $member);
return;
case DeprecatedMember::STATUS_REQUEST:
$this->onMemberRequesting($circle, $member);
return;
}
}
/**
* onMemberInvited()
*
* Called when a member is invited to a circle.
* Broadcast an activity to the invited member and to the moderators of the circle.
*
* @param DeprecatedCircle $circle
* @param DeprecatedMember $member
*/
private function onMemberInvited(DeprecatedCircle $circle, DeprecatedMember $member) {
if ($circle->getType() !== DeprecatedCircle::CIRCLES_CLOSED) {
return;
}
$event = $this->generateEvent('circles_as_moderator');
$event->setSubject(
'member_invited', ['circle' => json_encode($circle), 'member' => json_encode($member)]
);
$this->publishEvent(
$event, array_merge(
[$member],
$this->membersRequest->forceGetMembers(
$circle->getUniqueId(), DeprecatedMember::LEVEL_MODERATOR, 0, true
)
)
);
$this->dispatch('\OCA\Circles::onMemberInvited', ['circle' => $circle, 'member' => $member]);
$this->notificationOnInvitation($circle, $member);
}
/**
* onMemberRequesting()
*
* Called when a member request an invitation to a private circle.
* Broadcast an activity to the requester and to the moderators of the circle.
*
* @param DeprecatedCircle $circle
* @param DeprecatedMember $member
*/
private function onMemberRequesting(DeprecatedCircle $circle, DeprecatedMember $member) {
if ($circle->getType() !== DeprecatedCircle::CIRCLES_CLOSED) {
return;
}
$event = $this->generateEvent('circles_as_moderator');
$event->setSubject(
'member_request_invitation',
['circle' => json_encode($circle), 'member' => json_encode($member)]
);
$this->publishEvent(
$event, array_merge(
[$member],
$this->membersRequest->forceGetMembers(
$circle->getUniqueId(), DeprecatedMember::LEVEL_MODERATOR, 0, true
)
)
);
$this->dispatch('\OCA\Circles::onMemberRequesting', ['circle' => $circle, 'member' => $member]);
$this->notificationOnRequest($circle, $member);
}
/**
* onMemberLeaving()
*
* Called when a member is removed from a circle.
* Broadcast an activity to the leaving member and to the moderators of the circle.
* We won't do anything if the circle is PERSONAL
*
* @param DeprecatedCircle $circle
* @param DeprecatedMember $member
*/
public function onMemberLeaving(DeprecatedCircle $circle, DeprecatedMember $member) {
if ($circle->getType() === DeprecatedCircle::CIRCLES_PERSONAL) {
return;
}
$event = $this->generateEvent('circles_as_member');
$event->setSubject(
($this->userId === $member->getUserId()) ? 'member_left' : 'member_remove',
['circle' => json_encode($circle), 'member' => json_encode($member)]
);
$this->publishEvent(
$event, array_merge(
[$member],
$this->membersRequest->forceGetMembers(
$circle->getUniqueId(), DeprecatedMember::LEVEL_MODERATOR, 0, true
)
)
);
$this->dispatch('\OCA\Circles::onMemberLeaving', ['circle' => $circle, 'member' => $member]);
$this->deleteNotification('membership', $member->getMemberId());
$this->deleteNotification('membership_request', $member->getMemberId());
}
/**
* onMemberLevel()
*
* Called when a member have his level changed.
* Broadcast an activity to all moderator of the circle, and the member if he is demoted.
* If the level is Owner, we identify the event as a Coup d'Etat and we broadcast all members.
*
* @param DeprecatedCircle $circle
* @param DeprecatedMember $member
*/
public function onMemberLevel(DeprecatedCircle $circle, DeprecatedMember $member) {
if ($member->getLevel() === DeprecatedMember::LEVEL_OWNER) {
$this->onMemberOwner($circle, $member);
return;
}
$event = $this->generateEvent('circles_as_moderator');
$event->setSubject(
'member_level',
['circle' => json_encode($circle), 'member' => json_encode($member)]
);
$mods =
$this->membersRequest->forceGetMembers($circle->getUniqueId(), DeprecatedMember::LEVEL_MODERATOR, 0, true);
$this->membersRequest->avoidDuplicateMembers($mods, [$member]);
$this->publishEvent($event, $mods);
$this->dispatch('\OCA\Circles::onMemberLevel', ['circle' => $circle, 'member' => $member]);
}
/**
* onMemberOwner()
*
* Called when the owner rights of a circle have be given to another member.
*
* @param DeprecatedCircle $circle
* @param DeprecatedMember $member
*/
public function onMemberOwner(DeprecatedCircle $circle, DeprecatedMember $member) {
$event = $this->generateEvent('circles_as_moderator');
$event->setSubject(
'member_owner',
['circle' => json_encode($circle), 'member' => json_encode($member)]
);
$this->publishEvent(
$event,
$this->membersRequest->forceGetMembers($circle->getUniqueId(), DeprecatedMember::LEVEL_MEMBER, 0, true)
);
$this->dispatch('\OCA\Circles::onMemberOwner', ['circle' => $circle, 'member' => $member]);
}
/**
* onGroupLink()
*
* Called when a group is linked to a circle.
* Broadcast an activity to the member of the linked group and to the moderators of the circle.
* We won't do anything if the circle is PERSONAL
*
* @param DeprecatedCircle $circle
* @param DeprecatedMember $group
*/
public function onGroupLink(DeprecatedCircle $circle, DeprecatedMember $group) {
if ($circle->getType() === DeprecatedCircle::CIRCLES_PERSONAL) {
return;
}
$event = $this->generateEvent('circles_as_moderator');
$event->setSubject(
'group_link',
['circle' => json_encode($circle), 'group' => json_encode($group)]
);
$mods =
$this->membersRequest->forceGetMembers($circle->getUniqueId(), DeprecatedMember::LEVEL_MODERATOR, 0, true);
$this->membersRequest->avoidDuplicateMembers(
$mods, $this->membersRequest->getGroupMemberMembers($group)
);
$this->publishEvent($event, $mods);
$this->dispatch('\OCA\Circles::onGroupLink', ['circle' => $circle, 'group' => $group]);
}
/**
* onGroupUnlink()
*
* Called when a group is unlinked from a circle.
* Broadcast an activity to the member of the unlinked group and to the moderators of the
* circle. We won't do anything if the circle is PERSONAL
*
* @param DeprecatedCircle $circle
* @param DeprecatedMember $group
*/
public function onGroupUnlink(DeprecatedCircle $circle, DeprecatedMember $group) {
if ($circle->getType() === DeprecatedCircle::CIRCLES_PERSONAL) {
return;
}
$event = $this->generateEvent('circles_as_moderator');
$event->setSubject(
'group_unlink',
['circle' => json_encode($circle), 'group' => json_encode($group)]
);
$mods =
$this->membersRequest->forceGetMembers($circle->getUniqueId(), DeprecatedMember::LEVEL_MODERATOR, 0, true);
$this->membersRequest->avoidDuplicateMembers(
$mods, $this->membersRequest->getGroupMemberMembers($group)
);
$this->publishEvent($event, $mods);
$this->dispatch('\OCA\Circles::onGroupUnlink', ['circle' => $circle, 'group' => $group]);
}
/**
* onGroupLevel()
*
* Called when a linked group have his level changed.
* Broadcast an activity to all moderator of the circle, and the group members in case of
* demotion.
*
* @param DeprecatedCircle $circle
* @param DeprecatedMember $group
*/
public function onGroupLevel(DeprecatedCircle $circle, DeprecatedMember $group) {
if ($circle->getType() === DeprecatedCircle::CIRCLES_PERSONAL) {
return;
}
$event = $this->generateEvent('circles_as_moderator');
$event->setSubject(
'group_level',
['circle' => json_encode($circle), 'group' => json_encode($group)]
);
$mods =
$this->membersRequest->forceGetMembers($circle->getUniqueId(), DeprecatedMember::LEVEL_MODERATOR, 0, true);
$this->membersRequest->avoidDuplicateMembers(
$mods, $this->membersRequest->getGroupMemberMembers($group)
);
$this->publishEvent($event, $mods);
$this->dispatch('\OCA\Circles::onGroupLevel', ['circle' => $circle, 'group' => $group]);
}
/**
* onLinkRequestSent()
*
* Called when a request to generate a link with a remote circle is sent.
* Broadcast an activity to the moderators of the circle.
*
* @param DeprecatedCircle $circle
* @param FederatedLink $link
*/
public function onLinkRequestSent(DeprecatedCircle $circle, FederatedLink $link) {
$event = $this->generateEvent('circles_as_moderator');
$event->setSubject(
'link_request_sent',
['circle' => $circle->getJson(false, true), 'link' => $link->getJson()]
);
$this->publishEvent(
$event,
$this->membersRequest->forceGetMembers($link->getCircleId(), DeprecatedMember::LEVEL_MODERATOR, 0, true)
);
$this->dispatch('\OCA\Circles::onLinkRequestSent', ['circle' => $circle, 'link' => $link]);
}
/**
* onLinkRequestReceived()
*
* Called when a request to generate a link from a remote host is received.
* Broadcast an activity to the moderators of the circle.
*
* @param DeprecatedCircle $circle
* @param FederatedLink $link
*/
public function onLinkRequestReceived(DeprecatedCircle $circle, FederatedLink $link) {
$event = $this->generateEvent('circles_as_moderator');
$event->setSubject(
'link_request_received',
['circle' => $circle->getJson(false, true), 'link' => $link->getJson()]
);
$this->publishEvent(
$event,
$this->membersRequest->forceGetMembers($link->getCircleId(), DeprecatedMember::LEVEL_MODERATOR, 0, true)
);
$this->dispatch('\OCA\Circles::onLinkRequestReceived', ['circle' => $circle, 'link' => $link]);
}
/**
* onLinkRequestRejected()
*
* Called when a request to generate a link from a remote host is dismissed.
* Broadcast an activity to the moderators of the circle.
*
* @param DeprecatedCircle $circle
* @param FederatedLink $link
*/
public function onLinkRequestRejected(DeprecatedCircle $circle, FederatedLink $link) {
$event = $this->generateEvent('circles_as_moderator');
$event->setSubject(
'link_request_rejected',
['circle' => $circle->getJson(false, true), 'link' => $link->getJson()]
);
$this->publishEvent(
$event,
$this->membersRequest->forceGetMembers($link->getCircleId(), DeprecatedMember::LEVEL_MODERATOR, 0, true)
);
$this->dispatch('\OCA\Circles::onLinkRequestRejected', ['circle' => $circle, 'link' => $link]);
}
/**
* onLinkRequestCanceled()
*
* Called when a request to generate a link from a remote host is dismissed.
* Broadcast an activity to the moderators of the circle.
*
* @param DeprecatedCircle $circle
* @param FederatedLink $link
*/
public function onLinkRequestCanceled(DeprecatedCircle $circle, FederatedLink $link) {
$event = $this->generateEvent('circles_as_moderator');
$event->setSubject(
'link_request_canceled',
['circle' => $circle->getJson(false, true), 'link' => $link->getJson()]
);
$this->publishEvent(
$event,
$this->membersRequest->forceGetMembers($link->getCircleId(), DeprecatedMember::LEVEL_MODERATOR, 0, true)
);
$this->dispatch('\OCA\Circles::onLinkRequestCanceled', ['circle' => $circle, 'link' => $link]);
}
/**
* onLinkRequestAccepted()
*
* Called when a request to generate a link from a remote host is accepted.
* Broadcast an activity to the moderators of the circle.
*
* @param DeprecatedCircle $circle
* @param FederatedLink $link
*/
public function onLinkRequestAccepted(DeprecatedCircle $circle, FederatedLink $link) {
$event = $this->generateEvent('circles_as_moderator');
$event->setSubject(
'link_request_accepted',
['circle' => $circle->getJson(false, true), 'link' => $link->getJson()]
);
$this->publishEvent(
$event,
$this->membersRequest->forceGetMembers($link->getCircleId(), DeprecatedMember::LEVEL_MODERATOR, 0, true)
);
$this->dispatch('\OCA\Circles::onLinkRequestAccepted', ['circle' => $circle, 'link' => $link]);
}
/**
* onLinkRequestAccepting()
*
* Called when a link is Up and Running.
* Broadcast an activity to the moderators of the circle.
*
* @param DeprecatedCircle $circle
* @param FederatedLink $link
*/
public function onLinkRequestAccepting(DeprecatedCircle $circle, FederatedLink $link) {
$event = $this->generateEvent('circles_as_moderator');
$event->setSubject(
'link_request_accepting',
['circle' => $circle->getJson(false, true), 'link' => $link->getJson()]
);
$this->publishEvent(
$event,
$this->membersRequest->forceGetMembers($link->getCircleId(), DeprecatedMember::LEVEL_MODERATOR, 0, true)
);
$this->dispatch('\OCA\Circles::onLinkRequestAccepting', ['circle' => $circle, 'link' => $link]);
}
/**
* onLinkUp()
*
* Called when a link is Up and Running.
* Broadcast an activity to the moderators of the circle.
*
* @param DeprecatedCircle $circle
* @param FederatedLink $link
*/
public function onLinkUp(DeprecatedCircle $circle, FederatedLink $link) {
$event = $this->generateEvent('circles_as_moderator');
$event->setSubject(
'link_up',
['circle' => $circle->getJson(false, true), 'link' => $link->getJson()]
);
$this->publishEvent(
$event,
$this->membersRequest->forceGetMembers($link->getCircleId(), DeprecatedMember::LEVEL_MODERATOR, 0, true)
);
$this->dispatch('\OCA\Circles::onLinkUp', ['circle' => $circle, 'link' => $link]);
}
/**
* onLinkDown()
*
* Called when a link is closed (usually by remote).
* Broadcast an activity to the moderators of the circle.
*
* @param DeprecatedCircle $circle
* @param FederatedLink $link
*/
public function onLinkDown(DeprecatedCircle $circle, FederatedLink $link) {
$event = $this->generateEvent('circles_as_moderator');
$event->setSubject(
'link_down',
['circle' => $circle->getJson(false, true), 'link' => $link->getJson()]
);
$this->publishEvent(
$event,
$this->membersRequest->forceGetMembers($link->getCircleId(), DeprecatedMember::LEVEL_MODERATOR, 0, true)
);
$this->dispatch('\OCA\Circles::onLinkDown', ['circle' => $circle, 'link' => $link]);
}
/**
* onLinkRemove()
*
* Called when a link is removed.
* Subject is based on the current status of the Link.
* Broadcast an activity to the moderators of the circle.
*
* @param DeprecatedCircle $circle
* @param FederatedLink $link
*/
public function onLinkRemove(DeprecatedCircle $circle, FederatedLink $link) {
$event = $this->generateEvent('circles_as_moderator');
if ($link->getStatus() === FederatedLink::STATUS_LINK_DOWN) {
return;
}
$subject = 'link_remove';
if ($link->getStatus() === FederatedLink::STATUS_LINK_REQUESTED) {
$subject = 'link_request_removed';
} elseif ($link->getStatus() === FederatedLink::STATUS_REQUEST_SENT) {
$subject = 'link_request_canceling';
}
$event->setSubject(
$subject, ['circle' => $circle->getJson(false, true), 'link' => $link->getJson()]
);
$this->publishEvent(
$event,
$this->membersRequest->forceGetMembers($link->getCircleId(), DeprecatedMember::LEVEL_MODERATOR, 0, true)
);
$this->dispatch('\OCA\Circles::onLinkRemove', ['circle' => $circle, 'link' => $link]);
}
/**
* onSettingsChange()
*
* Called when the circle's settings are changed
*
* @param DeprecatedCircle $circle
* @param array $oldSettings
*/
public function onSettingsChange(DeprecatedCircle $circle, array $oldSettings = []) {
$this->dispatch(
'\OCA\Circles::onSettingsChange', ['circle' => $circle, 'oldSettings' => $oldSettings]
);
}
/**
* generateEvent()
* Create an Activity Event with the basic settings for the app.
*
* @param $type
*
* @return \OCP\Activity\IEvent
*/
private function generateEvent($type) {
$event = $this->activityManager->generateEvent();
$event->setApp(Application::APP_ID)
->setType($type);
// if ($this->userId === null) {
// $event->setAuthor($this->userId);
// }
return $event;
}
/**
* Publish the event to the users.
*
* @param IEvent $event
* @param array $users
*/
private function publishEvent(IEvent $event, array $users) {
foreach ($users as $user) {
if ($user instanceof IUser) {
$userId = $user->getUID();
} elseif ($user instanceof DeprecatedMember) {
$userId = $user->getUserId();
} else {
continue;
}
$event->setAffectedUser($userId);
$this->activityManager->publish($event);
}
}
/**
* @param DeprecatedCircle $circle
* @param DeprecatedMember $member
*/
private function notificationOnInvitation(DeprecatedCircle $circle, DeprecatedMember $member) {
$this->deleteNotification('membership_request', $member->getMemberId());
if ($member->getType() !== DeprecatedMember::TYPE_USER) {
return;
}
$notification = $this->createNotification(
$circle, $circle->getViewer(), $member->getUserId(), 'invitation', 'membership',
$member->getMemberId()
);
$declineAction = $notification->createAction();
$declineUrl =
$this->urlGenerator->linkToRoute('circles.Circles.leave', ['uniqueId' => $circle->getUniqueId()]);
$declineAction->setLabel('refuse')
->setLink($this->urlGenerator->getAbsoluteURL($declineUrl), 'GET');
$notification->addAction($declineAction);
$acceptAction = $notification->createAction();
$acceptUrl =
$this->urlGenerator->linkToRoute('circles.Circles.join', ['uniqueId' => $circle->getUniqueId()]);
$acceptAction->setLabel('accept')
->setLink($this->urlGenerator->getAbsoluteURL($acceptUrl), 'GET');
$notification->addAction($acceptAction);
$this->notificationManager->notify($notification);
}
/**
* @param DeprecatedCircle $circle
* @param DeprecatedMember $author
*/
private function notificationOnRequest(DeprecatedCircle $circle, DeprecatedMember $author) {
$members = $this->membersRequest->forceGetMembers($circle->getUniqueId(), DeprecatedMember::LEVEL_MODERATOR);
foreach ($members as $member) {
$notification = $this->createNotification(
$circle, $author, $member->getUserId(), 'request_new', 'membership_request',
$author->getMemberId()
);
$declineAction = $notification->createAction();
$declineUrl = $this->urlGenerator->linkToRoute(
'circles.Members.removeMemberById', ['memberId' => $author->getMemberId()]
);
$declineAction->setLabel('refuse')
->setLink($this->urlGenerator->getAbsoluteURL($declineUrl), 'DELETE');
$notification->addAction($declineAction);
$acceptAction = $notification->createAction();
$acceptUrl = $this->urlGenerator->linkToRoute(
'circles.Members.addMemberById', ['memberId' => $author->getMemberId()]
);
$acceptAction->setLabel('accept')
->setLink($this->urlGenerator->getAbsoluteURL($acceptUrl), 'PUT');
$notification->addAction($acceptAction);
$this->notificationManager->notify($notification);
}
}
/**
* @param DeprecatedCircle $circle
* @param DeprecatedMember $member
*/
private function notificationOnMemberNew(DeprecatedCircle $circle, DeprecatedMember $member) {
$this->deleteNotification('membership_request', $member->getMemberId());
$this->deleteNotification('membership', $member->getMemberId());
if ($this->userId === $member->getUserId()) {
return;
}
$notification =
$this->createNotification(
$circle, $circle->getViewer(), $member->getUserId(), 'member_new', 'membership',
$member->getMemberId()
);
$leave = $notification->createAction();
$leaveUrl =
$this->urlGenerator->linkToRoute('circles.Circles.leave', ['uniqueId' => $circle->getUniqueId()]);
$leave->setLabel('leave')
->setLink($this->urlGenerator->getAbsoluteURL($leaveUrl), 'GET');
$notification->addAction($leave);
$this->notificationManager->notify($notification);
}
/**
* @param string $object
* @param string $objectId
*/
public function deleteNotification(string $object, string $objectId) {
if ($objectId === '') {
return;
}
$notification = $this->notificationManager->createNotification();
$notification->setApp('circles')
->setObject($object, $objectId);
$this->notificationManager->markProcessed($notification);
}
/**
* @param DeprecatedCircle $circle
* @param DeprecatedMember $author
* @param string $userId
* @param string $subject
* @param string $object
* @param string $objectId
*
* @return INotification
*/
private function createNotification(
DeprecatedCircle $circle, DeprecatedMember $author, string $userId, string $subject, string $object, string $objectId
) {
$authorName = $author->getCachedName();
if ($authorName === '') {
$authorName = $author->getUserId();
}
$now = $this->time->getDateTime();
$notification = $this->notificationManager->createNotification();
$notification->setApp('circles')
->setDateTime($now)
->setUser($userId)
->setObject($object, $objectId)
->setSubject(
$subject, [$authorName, $circle->getName(), json_encode($circle)]
);
return $notification;
}
/**
* @param string $context
* @param array $arguments
*/
private function dispatch(string $context, $arguments) {
$this->eventDispatcher->dispatch($context, new GenericEvent(null, $arguments));
}
}