This commit is contained in:
Yuri Kuznetsov
2022-10-14 14:06:22 +03:00
parent fa679b6dd2
commit f253e021d0
22 changed files with 2556 additions and 2489 deletions
@@ -29,7 +29,7 @@
namespace Espo\Classes\AssignmentNotificators;
use Espo\Services\Stream as StreamService;
use Espo\Tools\Stream\Service as StreamService;
use Espo\Core\Notification\AssignmentNotificator;
use Espo\Core\Notification\AssignmentNotificator\Params;
+3 -4
View File
@@ -36,7 +36,7 @@ use Espo\Core\{
Record\SearchParamsFetcher,
};
use Espo\Services\Stream as Service;
use Espo\Tools\Stream\Service as Service;
use stdClass;
@@ -44,9 +44,8 @@ class Stream
{
public static string $defaultAction = 'list';
private $service;
private $searchParamsFetcher;
private Service $service;
private SearchParamsFetcher $searchParamsFetcher;
public function __construct(
Service $service,
@@ -41,7 +41,7 @@ use Espo\Core\{
use Espo\Entities\User;
use Espo\Services\Stream as StreamService;
use Espo\Tools\Stream\Service as StreamService;
/**
* @implements LoaderInterface<Entity>
@@ -51,13 +51,9 @@ class FollowersLoader implements LoaderInterface
private const FOLLOWERS_LIMIT = 6;
private StreamService $streamService;
private Metadata $metadata;
private User $user;
private Acl $acl;
private Config $config;
public function __construct(
@@ -47,7 +47,7 @@ use Espo\Core\Utils\Crypt;
use Espo\Core\InjectableFactory;
use Espo\Core\Utils\Log;
use Espo\Services\Stream as StreamService;
use Espo\Tools\Stream\Service as StreamService;
use Espo\Services\EmailTemplate as EmailTemplateService;
use Espo\Entities\InboundEmail;
@@ -33,7 +33,7 @@ use Espo\Core\Mail\Account\Account;
use Espo\Core\Mail\Account\Hook\BeforeFetchResult;
use Espo\Core\Mail\Account\Hook\AfterFetch as AfterFetchInterface;
use Espo\Services\Stream as StreamService;
use Espo\Tools\Stream\Service as StreamService;
use Espo\Entities\Email;
use Espo\ORM\EntityManager;
@@ -41,7 +41,6 @@ use Espo\ORM\EntityManager;
class AfterFetch implements AfterFetchInterface
{
private EntityManager $entityManager;
private StreamService $streamService;
public function __construct(
+21 -20
View File
@@ -29,10 +29,11 @@
namespace Espo\Core\Mail;
use Espo\Core\Job\Job\Data as JobData;
use Espo\Core\Job\JobSchedulerFactory;
use Espo\Core\Mail\Importer\DuplicateFinder;
use Espo\Entities\Email;
use Espo\Entities\EmailFilter;
use Espo\Entities\Job;
use Espo\Modules\Crm\Entities\Account;
use Espo\Modules\Crm\Entities\Contact;
use Espo\Repositories\Email as EmailRepository;
@@ -56,6 +57,7 @@ use Espo\Modules\Crm\Entities\Lead;
use DateTime;
use DateTimeZone;
use Espo\Tools\Stream\Jobs\ProcessNoteAcl;
use Exception;
/**
@@ -64,6 +66,7 @@ use Exception;
class Importer
{
private const SUBJECT_MAX_LENGTH = 255;
private const PROCESS_ACL_DELAY_PERIOD = '5 seconds';
private EntityManager $entityManager;
private Config $config;
@@ -72,6 +75,7 @@ class Importer
private ParserFactory $parserFactory;
private LinkMultipleSaver $linkMultipleSaver;
private DuplicateFinder $duplicateFinder;
private JobSchedulerFactory $jobSchedulerFactory;
public function __construct(
EntityManager $entityManager,
@@ -79,13 +83,15 @@ class Importer
AssignmentNotificatorFactory $notificatorFactory,
ParserFactory $parserFactory,
LinkMultipleSaver $linkMultipleSaver,
DuplicateFinder $duplicateFinder
DuplicateFinder $duplicateFinder,
JobSchedulerFactory $jobSchedulerFactory
) {
$this->entityManager = $entityManager;
$this->config = $config;
$this->parserFactory = $parserFactory;
$this->linkMultipleSaver = $linkMultipleSaver;
$this->duplicateFinder = $duplicateFinder;
$this->jobSchedulerFactory = $jobSchedulerFactory;
$this->notificator = $notificatorFactory->create(Email::ENTITY_TYPE);
$this->filtersMatcher = new FiltersMatcher();
@@ -774,25 +780,20 @@ class Importer
// To grant access to the user who received the email.
$dt = new DateTime();
$dt->modify('+' . self::PROCESS_ACL_DELAY_PERIOD);
$dt->modify('+5 seconds');
$executeAt = $dt->format(DateTimeUtil::SYSTEM_DATE_TIME_FORMAT);
$job = $this->entityManager->getNewEntity(Job::ENTITY_TYPE);
$job->set([
'serviceName' => 'Stream',
'methodName' => 'processNoteAclJob',
'data' => [
'targetType' => Email::ENTITY_TYPE,
'targetId' => $duplicate->getId(),
],
'executeAt' => $executeAt,
'queue' => QueueName::Q1,
]);
$this->entityManager->saveEntity($job);
$this->jobSchedulerFactory
->create()
->setClassName(ProcessNoteAcl::class)
->setData(
JobData
::create()
->withTargetId($duplicate->getId())
->withTargetType(Email::ENTITY_TYPE)
)
->setQueue(QueueName::Q1)
->setTime($dt)
->schedule();
}
}
@@ -29,7 +29,7 @@
namespace Espo\Core\MassAction\Actions;
use Espo\Services\Stream as StreamService;
use Espo\Tools\Stream\Service as StreamService;
use Espo\Core\{
MassAction\QueryBuilder,
@@ -48,15 +48,11 @@ use Espo\{
class MassFollow implements MassAction
{
private $queryBuilder;
private $acl;
private $streamService;
private $entityManager;
private $user;
private QueryBuilder $queryBuilder;
private Acl $acl;
private StreamService $streamService;
private EntityManager $entityManager;
private User $user;
public function __construct(
QueryBuilder $queryBuilder,
@@ -29,7 +29,7 @@
namespace Espo\Core\MassAction\Actions;
use Espo\Services\Stream as StreamService;
use Espo\Tools\Stream\Service as StreamService;
use Espo\Core\{
MassAction\QueryBuilder,
@@ -47,13 +47,10 @@ use Espo\{
class MassUnfollow implements MassAction
{
private $queryBuilder;
private $streamService;
private $entityManager;
private $user;
private QueryBuilder $queryBuilder;
private StreamService $streamService;
private EntityManager $entityManager;
private User $user;
public function __construct(
QueryBuilder $queryBuilder,
+1 -1
View File
@@ -51,7 +51,7 @@ use Espo\ORM\Query\Part\WhereClause;
use Espo\Entities\User;
use Espo\Services\Stream as StreamService;
use Espo\Tools\Stream\Service as StreamService;
use Espo\Core\{
Acl,
@@ -31,7 +31,7 @@ namespace Espo\Hooks\Common;
use Espo\ORM\Entity;
use Espo\Services\Stream as Service;
use Espo\Tools\Stream\Service as Service;
/**
* Notes having `related` or `superParent` are subjects to access control
@@ -30,7 +30,7 @@
namespace Espo\Modules\Crm\Repositories;
use Espo\ORM\Entity;
use Espo\Services\Stream as StreamService;
use Espo\Tools\Stream\Service as StreamService;
use Espo\Core\Di;
/**
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -55,7 +55,7 @@ use Espo\ORM\EntityManager;
use Espo\Repositories\UserData as UserDataRepository;
use Espo\Services\EmailAccount as EmailAccountService;
use Espo\Services\InboundEmail as InboundEmailService;
use Espo\Services\Stream as StreamService;
use Espo\Tools\Stream\Service as StreamService;
use Exception;
use Laminas\Mail\Message;
use Throwable;
@@ -36,7 +36,7 @@ use Espo\Core\Notification\AssignmentNotificator\Params as AssignmentNotificator
use Espo\Core\Utils\Metadata;
use Espo\Core\Utils\Config;
use Espo\Services\Stream as StreamService;
use Espo\Tools\Stream\Service as StreamService;
use Espo\ORM\EntityManager;
use Espo\ORM\Entity;
@@ -62,11 +62,8 @@ class HookProcessor
private $hasStreamCache = [];
private Metadata $metadata;
private Config $config;
private EntityManager $entityManager;
private StreamService $streamService;
private AssignmentNotificatorFactory $notificatorFactory;
@@ -32,7 +32,7 @@ namespace Espo\Tools\Notification;
use Espo\Core\AclManager as InternalAclManager;
use Espo\Core\Acl\Table;
use Espo\Services\Stream as StreamService;
use Espo\Tools\Stream\Service as StreamService;
use Espo\ORM\EntityManager;
use Espo\ORM\Collection;
@@ -50,15 +50,11 @@ use Espo\Entities\Note;
*/
class NoteHookProcessor
{
private $streamService;
private $service;
private $entityManager;
private $user;
private $internalAclManager;
private StreamService $streamService;
private Service $service;
private EntityManager $entityManager;
private User $user;
private InternalAclManager $internalAclManager;
public function __construct(
StreamService $streamService,
@@ -30,7 +30,7 @@
namespace Espo\Tools\Stream;
use Espo\Core\Utils\Metadata;
use Espo\Services\Stream as Service;
use Espo\Tools\Stream\Service as Service;
use Espo\Entities\User;
use Espo\Entities\Preferences;
use Espo\Entities\Note;
@@ -53,31 +53,18 @@ use Espo\Core\ORM\Entity as CoreEntity;
*/
class HookProcessor
{
/**
* @var array<string,bool>
*/
/** @var array<string,bool> */
private $hasStreamCache = [];
/**
* @var array<string,bool>
*/
/** @var array<string,bool> */
private $isLinkObservableInStreamCache = [];
/**
* @var ?array<string,?string>
*/
/** @var ?array<string,?string> */
private $statusFields = null;
private Metadata $metadata;
private EntityManager $entityManager;
private Service $service;
private User $user;
private Preferences $preferences;
private JobSchedulerFactory $jobSchedulerFactory;
public function __construct(
@@ -508,8 +495,6 @@ class HookProcessor
if ($this->user->getId() === $assignedUserId) {
$entity->set('isFollowed', true);
}
return;
}
private function afterSaveStreamNotNew2(CoreEntity $entity): void
@@ -633,9 +618,9 @@ class HookProcessor
if ($audited) {
$note1 = $this->entityManager
->getRDBRepository('Note')
->getRDBRepository(Note::ENTITY_TYPE)
->where([
'type' => 'Relate',
'type' => Note::TYPE_RELATE,
'parentId' => $entity->getId(),
'parentType' => $entityType,
'relatedId' => $foreignEntity->getId(),
@@ -650,9 +635,9 @@ class HookProcessor
if ($auditedForeign) {
$note2 = $this->entityManager
->getRDBRepository('Note')
->getRDBRepository(Note::ENTITY_TYPE)
->where([
'type' => 'Relate',
'type' => Note::TYPE_RELATE,
'parentId' => $foreignEntity->getId(),
'parentType' => $foreignEntityType,
'relatedId' => $entity->getId(),
@@ -35,9 +35,11 @@ use Espo\Core\Job\Job\Data;
use Espo\Core\AclManager;
use Espo\Core\Acl\Exceptions\NotImplemented as AclNotImplemented;
use Espo\Entities\Note;
use Espo\ORM\Collection;
use Espo\ORM\EntityManager;
use Espo\Services\Stream as Service;
use Espo\Tools\Stream\Service as Service;
use Espo\Tools\Notification\Service as NotificationService;
use Espo\Entities\User;
@@ -47,13 +49,10 @@ use Espo\Entities\User;
*/
class AutoFollow implements Job
{
private $service;
private $notificationService;
private $aclManager;
private $entityManager;
private Service $service;
private NotificationService $notificationService;
private AclManager $aclManager;
private EntityManager $entityManager;
public function __construct(
Service $service,
@@ -69,6 +68,7 @@ class AutoFollow implements Job
public function run(Data $data): void
{
/** @var string[] $userIdList */
$userIdList = $data->get('userIdList') ?? [];
$entityType = $data->get('entityType');
$entityId = $data->get('entityId');
@@ -77,7 +77,7 @@ class AutoFollow implements Job
return;
}
$entity = $this->entityManager->getEntity($entityType, $entityId);
$entity = $this->entityManager->getEntityById($entityType, $entityId);
if (!$entity) {
return;
@@ -85,7 +85,7 @@ class AutoFollow implements Job
foreach ($userIdList as $i => $userId) {
/** @var User|null $user */
$user = $this->entityManager->getEntity('User', $userId);
$user = $this->entityManager->getEntityById(User::ENTITY_TYPE, $userId);
if (!$user) {
unset($userIdList[$i]);
@@ -121,9 +121,9 @@ class AutoFollow implements Job
$this->service->followEntityMass($entity, $userIdList);
/** @var iterable<\Espo\Entities\Note> $noteList */
/** @var Collection<Note> $noteList */
$noteList = $this->entityManager
->getRDBRepository('Note')
->getRDBRepository(Note::ENTITY_TYPE)
->where([
'parentType' => $entityType,
'parentId' => $entityId,
@@ -37,7 +37,7 @@ use Espo\Core\Acl\Exceptions\NotImplemented as AclNotImplemented;
use Espo\ORM\EntityManager;
use Espo\Services\Stream as Service;
use Espo\Tools\Stream\Service as Service;
use Espo\Entities\User;
/**
@@ -45,11 +45,9 @@ use Espo\Entities\User;
*/
class ControlFollowers implements Job
{
private $service;
private $aclManager;
private $entityManager;
private Service $service;
private AclManager $aclManager;
private EntityManager $entityManager;
public function __construct(
Service $service,
@@ -76,7 +74,7 @@ class ControlFollowers implements Job
return;
}
$idList = $this->service->getEntityFolowerIdList($entity);
$idList = $this->service->getEntityFollowerIdList($entity);
$userList = $this->entityManager
->getRDBRepository(User::ENTITY_TYPE)
@@ -0,0 +1,73 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2022 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* 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 General Public License version 3.
*
* In accordance with Section 7(b) of the GNU 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\ORM\EntityManager;
use Espo\Tools\Stream\Service as Service;
class ProcessNoteAcl implements Job
{
private Service $service;
private EntityManager $entityManager;
public function __construct(
Service $service,
EntityManager $entityManager
) {
$this->service = $service;
$this->entityManager = $entityManager;
}
public function run(Data $data): void
{
$targetType = $data->getTargetType();
$targetId = $data->getTargetId();
if (!$targetType || !$targetId) {
return;
}
if (!$this->entityManager->hasRepository($targetType)) {
return;
}
$entity = $this->entityManager->getEntityById($targetType, $targetId);
if (!$entity) {
return;
}
$this->service->processNoteAcl($entity, true);
}
}
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -30,7 +30,7 @@
namespace tests\integration\Espo\Note;
use Espo\{
Services\Stream as StreamService,
Tools\Stream\Service as StreamService,
ORM\EntityManager,
};
@@ -42,7 +42,7 @@ class AclTest extends \tests\integration\Core\BaseTestCase
$em = $this->getContainer()->get('entityManager');
/* @var $streamService StreamService*/
$streamService = $this->getContainer()->get('serviceFactory')->create('Stream');
$streamService = $this->getContainer()->get('injectableFactory')->create(StreamService::class);
$team1 = $em->createEntity('Team', [
'name' => 'team-1',
+6 -3
View File
@@ -37,6 +37,7 @@ use Espo\Core\Notification\AssignmentNotificator;
use Espo\ORM\Value\ValueAccessor;
use Espo\ORM\Value\ValueAccessorFactory;
use Espo\Core\{
Job\JobSchedulerFactory,
Mail\Importer,
Mail\Importer\Data as ImporterData,
Mail\MessageWrapper,
@@ -48,8 +49,7 @@ use Espo\Core\{
Repositories\Database,
Utils\Metadata,
Notification\AssignmentNotificatorFactory,
FieldProcessing\Relation\LinkMultipleSaver,
};
FieldProcessing\Relation\LinkMultipleSaver};
use Espo\ORM\Repository\RDBSelectBuilder;
@@ -142,6 +142,8 @@ class ImporterTest extends \PHPUnit\Framework\TestCase
$this->duplicateFinder = $this->createMock(Importer\DuplicateFinder::class);
$this->jobSchedulerFactory = $this->createMock(JobSchedulerFactory::class);
}
function testImport1()
@@ -183,7 +185,8 @@ class ImporterTest extends \PHPUnit\Framework\TestCase
$this->assignmentNotificatorFactory,
$this->parserFactory,
$this->linkMultipleSaver,
$this->duplicateFinder
$this->duplicateFinder,
$this->jobSchedulerFactory
);
$message = new MessageWrapper(0, null, null, $contents);