. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ namespace Espo\Tools\Stream\Jobs; use Espo\Core\Job\Job; use Espo\Core\Job\Job\Data; use Espo\Core\AclManager; use Espo\Core\Acl\Exceptions\NotImplemented as AclNotImplemented; use Espo\ORM\EntityManager; use Espo\Tools\Stream\Service as Service; use Espo\Entities\User; /** * Unfollows users that don't have access. */ class ControlFollowers implements Job { private Service $service; private AclManager $aclManager; private EntityManager $entityManager; public function __construct( Service $service, AclManager $aclManager, EntityManager $entityManager ) { $this->service = $service; $this->aclManager = $aclManager; $this->entityManager = $entityManager; } public function run(Data $data): void { $entityType = $data->get('entityType'); $entityId = $data->get('entityId'); if (!$entityId || !$entityType) { return; } $entity = $this->entityManager->getEntity($entityType, $entityId); if (!$entity) { return; } $idList = $this->service->getEntityFollowerIdList($entity); $userList = $this->entityManager ->getRDBRepository(User::ENTITY_TYPE) ->where([ 'id' => $idList, ]) ->find(); foreach ($userList as $user) { /** @var string $userId */ $userId = $user->getId(); if (!$user->isActive()) { $this->service->unfollowEntity($entity, $userId); continue; } if ($user->isPortal()) { continue; } try { $hasAccess = $this->aclManager->checkEntityStream($user, $entity); } catch (AclNotImplemented $e) { $hasAccess = false; } if ($hasAccess) { continue; } $this->service->unfollowEntity($entity, $userId); } } }