. */ namespace SP\Providers\Acl; use Exception; use SP\Core\Application; use SP\Core\Events\Event; use SP\Core\Events\EventReceiver; use SP\Core\Exceptions\SPException; use SP\Domain\Account\Services\AccountAclService; use SP\Domain\User\Services\UserGroupService; use SP\Domain\User\Services\UserProfileService; use SP\Domain\User\UserGroupServiceInterface; use SP\Domain\User\UserProfileServiceInterface; use SP\Providers\EventsTrait; use SP\Providers\Provider; use SplSubject; /** * Class AclHandler * * @package SP\Providers\Acl */ final class AclHandler extends Provider implements EventReceiver { use EventsTrait; public const EVENTS = [ 'edit.userProfile', 'edit.user', 'edit.userGroup', 'delete.user', 'delete.user.selection', ]; private string $events; private UserProfileService $userProfileService; private UserGroupService $userGroupService; public function __construct( Application $application, UserProfileServiceInterface $userProfileService, UserGroupServiceInterface $userGroupService ) { $this->userProfileService = $userProfileService; $this->userGroupService = $userGroupService; parent::__construct($application); } /** * Devuelve los eventos que implementa el observador * * @return array */ public function getEvents(): array { return self::EVENTS; } /** * Devuelve los eventos que implementa el observador en formato cadena * * @return string */ public function getEventsString(): string { return $this->events; } /** * Receive update from subject * * @link https://php.net/manual/en/splobserver.update.php * * @param SplSubject $subject
* The SplSubject notifying the observer of an update. *
* * @return void * @since 5.1.0 * @throws \SP\Core\Exceptions\SPException */ public function update(SplSubject $subject): void { $this->updateEvent('update', new Event($subject)); } /** * Evento de actualización * * @param string $eventType Nombre del evento * @param Event $event Objeto del evento * * @throws \SP\Core\Exceptions\SPException */ public function updateEvent(string $eventType, Event $event): void { switch ($eventType) { case 'edit.userProfile': $this->processUserProfile($event); break; case 'edit.user': case 'delete.user': case 'delete.user.selection': $this->processUser($event); break; case 'edit.userGroup': $this->processUserGroup($event); break; } } private function processUserProfile(Event $event): void { try { $eventMessage = $event->getEventMessage(); if (null === $eventMessage) { throw new SPException(__u('Unable to process event for user profile')); } $extra = $eventMessage->getExtra(); if (isset($extra['userProfileId'])) { foreach ($this->userProfileService->getUsersForProfile($extra['userProfileId'][0]) as $user) { AccountAclService::clearAcl($user->id); } } } catch (Exception $e) { processException($e); } } /** * @throws \SP\Core\Exceptions\SPException */ private function processUser(Event $event): void { $eventMessage = $event->getEventMessage(); if (null === $eventMessage) { throw new SPException(__u('Unable to process event for user')); } $extra = $eventMessage->getExtra(); if (isset($extra['userId'])) { foreach ($extra['userId'] as $id) { AccountAclService::clearAcl($id); } } } private function processUserGroup(Event $event): void { try { $eventMessage = $event->getEventMessage(); if (null === $eventMessage) { throw new SPException(__u('Unable to process event for user group')); } $extra = $eventMessage->getExtra(); if (isset($extra['userGroupId'])) { foreach ($this->userGroupService->getUsageByUsers($extra['userGroupId'][0]) as $user) { AccountAclService::clearAcl($user->id); } } } catch (Exception $e) { processException($e); } } public function initialize(): void { $this->events = $this->parseEventsToRegex(self::EVENTS); $this->initialized = true; } }