This commit is contained in:
Yuri Kuznetsov
2023-02-13 13:28:06 +02:00
parent 5f4643d725
commit e4285d1d2a
10 changed files with 78 additions and 125 deletions

View File

@@ -29,6 +29,7 @@
namespace Espo\Classes\MassAction\User;
use Espo\Core\ApplicationUser;
use Espo\Core\MassAction\Actions\MassUpdate as MassUpdateOriginal;
use Espo\Core\MassAction\QueryBuilder;
use Espo\Core\MassAction\Params;
@@ -50,16 +51,7 @@ use Espo\Tools\MassUpdate\Data as MassUpdateData;
class MassUpdate implements MassAction
{
private MassUpdateOriginal $massUpdateOriginal;
private QueryBuilder $queryBuilder;
private EntityManager $entityManager;
private Acl $acl;
private User $user;
private FileManager $fileManager;
private DataManager $dataManager;
private const PERMISSION = 'massUpdatePermission';
private const SYSTEM_USER_ID = 'system';
/** @var string[] */
private array $notAllowedAttributeList = [
@@ -72,22 +64,14 @@ class MassUpdate implements MassAction
];
public function __construct(
MassUpdateOriginal $massUpdateOriginal,
QueryBuilder $queryBuilder,
EntityManager $entityManager,
Acl $acl,
User $user,
FileManager $fileManager,
DataManager $dataManager
) {
$this->massUpdateOriginal = $massUpdateOriginal;
$this->queryBuilder = $queryBuilder;
$this->entityManager = $entityManager;
$this->acl = $acl;
$this->user = $user;
$this->fileManager = $fileManager;
$this->dataManager = $dataManager;
}
private MassUpdateOriginal $massUpdateOriginal,
private QueryBuilder $queryBuilder,
private EntityManager $entityManager,
private Acl $acl,
private User $user,
private FileManager $fileManager,
private DataManager $dataManager
) {}
/**
* @throws Forbidden
@@ -149,7 +133,7 @@ class MassUpdate implements MassAction
*/
private function checkEntity(Entity $entity, MassUpdateData $data): void
{
if ($entity->getId() === self::SYSTEM_USER_ID) {
if ($entity->getId() === ApplicationUser::SYSTEM_USER_ID) {
throw new Forbidden("Can't update 'system' user.");
}

View File

@@ -30,40 +30,31 @@
namespace Espo\Classes\Select\User\AccessControlFilters;
use Espo\ORM\Query\SelectBuilder;
use Espo\Core\{
Select\AccessControl\Filter,
AclManager,
Acl\Table,
};
use Espo\Core\Acl\Table;
use Espo\Core\AclManager;
use Espo\Core\Select\AccessControl\Filter;
use Espo\Entities\User;
class Mandatory implements Filter
{
private $user;
private $aclManager;
public function __construct(User $user, AclManager $aclManager)
{
$this->user = $user;
$this->aclManager = $aclManager;
}
public function __construct(
private User $user,
private AclManager $aclManager
) {}
public function apply(SelectBuilder $queryBuilder): void
{
if (!$this->user->isAdmin()) {
$queryBuilder->where([
'isActive' => true,
'type!=' => 'api',
'type!=' => User::TYPE_API,
]);
}
if ($this->aclManager->getPermissionLevel($this->user, 'portalPermission') !== Table::LEVEL_YES) {
$queryBuilder->where([
'OR' => [
'type!=' => 'portal',
'type!=' => User::TYPE_PORTAL,
'id' => $this->user->getId(),
]
]);
@@ -71,12 +62,12 @@ class Mandatory implements Filter
if (!$this->user->isSuperAdmin()) {
$queryBuilder->where([
'type!=' => 'super-admin'
'type!=' => User::TYPE_SUPER_ADMIN,
]);
}
$queryBuilder->where([
'type!=' => 'system'
'type!=' => User::TYPE_SYSTEM,
]);
}
}

View File

@@ -30,6 +30,7 @@
namespace Espo\Classes\Select\User\PrimaryFilters;
use Espo\Core\Select\Primary\Filter;
use Espo\Entities\User;
use Espo\ORM\Query\SelectBuilder;
class Internal implements Filter
@@ -37,7 +38,11 @@ class Internal implements Filter
public function apply(SelectBuilder $queryBuilder): void
{
$queryBuilder->where([
'type!=' => ['portal', 'api', 'system'],
'type!=' => [
User::TYPE_PORTAL,
User::TYPE_API,
User::TYPE_SYSTEM,
],
]);
}
}

View File

@@ -29,16 +29,12 @@
namespace Espo\Classes\Select\User\Where\ItemConverters;
use Espo\Core\{
Select\Where\ItemConverter,
Select\Where\Item,
};
use Espo\{
ORM\Query\SelectBuilder as QueryBuilder,
ORM\Query\Part\WhereItem as WhereClauseItem,
ORM\Query\Part\WhereClause,
};
use Espo\Core\Select\Where\Item;
use Espo\Core\Select\Where\ItemConverter;
use Espo\Entities\User;
use Espo\ORM\Query\Part\WhereClause;
use Espo\ORM\Query\Part\WhereItem as WhereClauseItem;
use Espo\ORM\Query\SelectBuilder as QueryBuilder;
class IsOfType implements ItemConverter
{
@@ -46,23 +42,21 @@ class IsOfType implements ItemConverter
{
$type = $item->getValue();
switch ($type) {
case 'internal':
return WhereClause::fromRaw([
'type!=' => ['portal', 'api', 'system'],
]);
case 'api':
return WhereClause::fromRaw([
'type' => 'api',
]);
case 'portal':
return WhereClause::fromRaw([
'type' => 'portal',
]);
}
return WhereClause::fromRaw(['id' => null]);
return match ($type) {
'internal' => WhereClause::fromRaw([
'type!=' => [
User::TYPE_PORTAL,
User::TYPE_API,
User::TYPE_SYSTEM,
],
]),
User::TYPE_API => WhereClause::fromRaw([
'type' => User::TYPE_API,
]),
User::TYPE_SYSTEM => WhereClause::fromRaw([
'type' => User::TYPE_SYSTEM,
]),
default => WhereClause::fromRaw(['id' => null]),
};
}
}

View File

@@ -41,14 +41,10 @@ class ApplicationUser
{
public const SYSTEM_USER_ID = 'system';
private Container $container;
private EntityManagerProxy $entityManagerProxy;
public function __construct(Container $container, EntityManagerProxy $entityManagerProxy)
{
$this->container = $container;
$this->entityManagerProxy = $entityManagerProxy;
}
public function __construct(
private Container $container,
private EntityManagerProxy $entityManagerProxy
) {}
/**
* Set up the system user as a current user. The system user is used when no user is logged in.

View File

@@ -29,39 +29,29 @@
namespace Espo\Core\Loaders;
use Espo\Core\{
Container\Loader,
ORM\EntityManager,
ApplicationState,
};
use Espo\Core\ApplicationState;
use Espo\Core\ApplicationUser as ApplicationUser;
use Espo\Core\Container\Loader;
use Espo\Core\ORM\EntityManager;
use Espo\Entities\{
Preferences as PreferencesService,
};
use Espo\Entities\Preferences as PreferencesEntity;
class Preferences implements Loader
{
private $entityManager;
public function __construct(
private EntityManager $entityManager,
private ApplicationState $applicationState
) {}
private $applicationState;
public function __construct(EntityManager $entityManager, ApplicationState $applicationState)
public function load(): PreferencesEntity
{
$this->entityManager = $entityManager;
$this->applicationState = $applicationState;
}
public function load(): PreferencesService
{
$id = 'system';
$id = ApplicationUser::SYSTEM_USER_ID;
if ($this->applicationState->hasUser()) {
$id = $this->applicationState->getUser()->getId();
}
/** @var PreferencesService $entity */
$entity = $this->entityManager->getEntity('Preferences', $id);
return $entity;
/** @var PreferencesEntity */
return $this->entityManager->getEntity(PreferencesEntity::ENTITY_TYPE, $id);
}
}

View File

@@ -29,6 +29,7 @@
namespace Espo\Core\MassAction\Actions;
use Espo\Core\ApplicationUser;
use Espo\Core\Exceptions\Forbidden;
use Espo\Core\MassAction\Data;
use Espo\Core\MassAction\MassAction;
@@ -40,19 +41,11 @@ use Espo\Entities\User;
class MassRecalculateFormula implements MassAction
{
private QueryBuilder $queryBuilder;
private EntityManager $entityManager;
private User $user;
public function __construct(
QueryBuilder $queryBuilder,
EntityManager $entityManager,
User $user
) {
$this->queryBuilder = $queryBuilder;
$this->entityManager = $entityManager;
$this->user = $user;
}
private QueryBuilder $queryBuilder,
private EntityManager $entityManager,
private User $user
) {}
public function process(Params $params, Data $data): Result
{
@@ -76,7 +69,7 @@ class MassRecalculateFormula implements MassAction
foreach ($collection as $entity) {
$this->entityManager->saveEntity($entity, [
'modifiedById' => 'system',
'modifiedById' => ApplicationUser::SYSTEM_USER_ID,
]);
/** @var string $id */

View File

@@ -59,6 +59,7 @@ class AddSystemUser implements RebuildAction
$user = $repository->getNew();
$user->set($attributes);
$user->set('id', $userId);
$repository->save($user);
}
}

View File

@@ -42,7 +42,6 @@ return [
'delete' => 'delete',
],
'systemUserAttributes' => [
'id' => 'system',
'userName' => 'system',
'firstName' => '',
'lastName' => 'System',

View File

@@ -29,6 +29,8 @@
namespace Espo\Tools\MassUpdate;
use Espo\Core\ApplicationUser;
use Espo\Core\Exceptions\NotFound;
use Espo\Core\MassAction\Params;
use Espo\Core\MassAction\Result;
use Espo\Core\MassAction\MassActionFactory;
@@ -44,12 +46,10 @@ use RuntimeException;
class MassUpdate
{
private MassActionFactory $massActionFactory;
private EntityManager $entityManager;
private const ACTION = 'massUpdate';
private const DEFAULT_USER_ID = 'system';
private const DEFAULT_USER_ID = ApplicationUser::SYSTEM_USER_ID;
public function __construct(MassActionFactory $massActionFactory, EntityManager $entityManager)
{
@@ -59,8 +59,8 @@ class MassUpdate
/**
* @param ?User $user Under what user to perform mass-update. If not specified, the system user will be used.
* Access control is applied for the user.
* @throws \Espo\Core\Exceptions\NotFound
* Access control is applied for the user.
* @throws NotFound
*/
public function process(Params $params, Data $data, ?User $user = null): Result
{