From 0531b7239c8ec56fb231832d72b954368188c52d Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Mon, 11 Nov 2024 17:15:10 +0200 Subject: [PATCH] ref --- .../Core/Authentication/Authentication.php | 7 ++-- .../Core/Console/Commands/AuthTokenCheck.php | 3 +- .../FieldProcessing/Link/NotJoinedLoader.php | 5 +-- .../Functions/RecordGroup/FindOneType.php | 3 +- .../Formula/Functions/SetAttributeType.php | 3 +- application/Espo/Core/Htmlizer/Htmlizer.php | 3 +- .../Select/AccessControl/Filters/OnlyOwn.php | 3 +- .../Filters/PortalOnlyContact.php | 3 +- .../Select/Where/ItemGeneralConverter.php | 36 +++++++++---------- .../Core/Utils/Currency/DatabasePopulator.php | 3 +- application/Espo/Core/Webhook/Queue.php | 21 ++++++----- .../Espo/Entities/WebhookEventQueueItem.php | 21 +++++++++++ .../Espo/Entities/WebhookQueueItem.php | 16 +++++++++ 13 files changed, 86 insertions(+), 41 deletions(-) diff --git a/application/Espo/Core/Authentication/Authentication.php b/application/Espo/Core/Authentication/Authentication.php index 2111e3194b..58d794f993 100644 --- a/application/Espo/Core/Authentication/Authentication.php +++ b/application/Espo/Core/Authentication/Authentication.php @@ -33,6 +33,7 @@ use Espo\Core\Exceptions\Forbidden; use Espo\Core\Exceptions\NotFound; use Espo\Core\Name\Field; use Espo\Core\Utils\Language\LanguageProxy; +use Espo\ORM\Name\Attribute; use Espo\Repositories\UserData as UserDataRepository; use Espo\Entities\Portal; use Espo\Entities\User; @@ -326,7 +327,7 @@ class Authentication ) { $authLogRecord = $this->entityManager ->getRDBRepository(AuthLogRecord::ENTITY_TYPE) - ->select(['id']) + ->select([Attribute::ID]) ->where(['authTokenId' => $authToken->getId()]) ->order('requestTime', true) ->findOne(); @@ -504,7 +505,7 @@ class Authentication ) { $concurrentAuthTokenList = $this->entityManager ->getRDBRepository(AuthTokenEntity::ENTITY_TYPE) - ->select(['id']) + ->select([Attribute::ID]) ->where([ 'userId' => $user->getId(), 'isActive' => true, @@ -740,7 +741,7 @@ class Authentication $user = $this->entityManager ->getRDBRepository(User::ENTITY_TYPE) ->select(['userName']) - ->where(['id' => $authToken->getUserId()]) + ->where([Attribute::ID => $authToken->getUserId()]) ->findOne(); return $user?->getUserName(); diff --git a/application/Espo/Core/Console/Commands/AuthTokenCheck.php b/application/Espo/Core/Console/Commands/AuthTokenCheck.php index 1dfcfe52f6..3ddd462dbc 100644 --- a/application/Espo/Core/Console/Commands/AuthTokenCheck.php +++ b/application/Espo/Core/Console/Commands/AuthTokenCheck.php @@ -35,6 +35,7 @@ use Espo\Core\Console\Command; use Espo\Core\Console\Command\Params; use Espo\Core\Console\IO; use Espo\Core\ORM\EntityManager; +use Espo\ORM\Name\Attribute; /** * @noinspection PhpUnused @@ -70,7 +71,7 @@ class AuthTokenCheck implements Command $user = $this->entityManager ->getRDBRepository(User::ENTITY_TYPE) - ->select('id') + ->select(Attribute::ID) ->where([ 'id' => $userId, 'isActive' => true, diff --git a/application/Espo/Core/FieldProcessing/Link/NotJoinedLoader.php b/application/Espo/Core/FieldProcessing/Link/NotJoinedLoader.php index 17b5dbda08..62b1dda511 100644 --- a/application/Espo/Core/FieldProcessing/Link/NotJoinedLoader.php +++ b/application/Espo/Core/FieldProcessing/Link/NotJoinedLoader.php @@ -35,6 +35,7 @@ use Espo\Core\FieldProcessing\Loader as LoaderInterface; use Espo\Core\FieldProcessing\Loader\Params; use Espo\Core\ORM\EntityManager; use Espo\ORM\Defs as OrmDefs; +use Espo\ORM\Name\Attribute; /** * @implements LoaderInterface @@ -80,8 +81,8 @@ class NotJoinedLoader implements LoaderInterface $foreignEntity = $this->entityManager ->getRDBRepository($foreignEntityType) - ->select(['id', 'name']) - ->where(['id' => $id]) + ->select([Attribute::ID, 'name']) + ->where([Attribute::ID => $id]) ->findOne(); if (!$foreignEntity) { diff --git a/application/Espo/Core/Formula/Functions/RecordGroup/FindOneType.php b/application/Espo/Core/Formula/Functions/RecordGroup/FindOneType.php index fe9ff61da1..2583529421 100644 --- a/application/Espo/Core/Formula/Functions/RecordGroup/FindOneType.php +++ b/application/Espo/Core/Formula/Functions/RecordGroup/FindOneType.php @@ -35,6 +35,7 @@ use Espo\Core\Formula\ArgumentList; use Espo\Core\Formula\Exceptions\Error as FormulaError; use Espo\Core\Formula\Functions\BaseFunction; use Espo\Core\Di; +use Espo\ORM\Name\Attribute; class FindOneType extends BaseFunction implements Di\EntityManagerAware, @@ -100,7 +101,7 @@ class FindOneType extends BaseFunction implements $queryBuilder->order($orderBy, $order); } - $queryBuilder->select(['id']); + $queryBuilder->select([Attribute::ID]); $entity = $this->entityManager ->getRDBRepository($entityType) diff --git a/application/Espo/Core/Formula/Functions/SetAttributeType.php b/application/Espo/Core/Formula/Functions/SetAttributeType.php index f9af5fa67d..9e162c5a88 100644 --- a/application/Espo/Core/Formula/Functions/SetAttributeType.php +++ b/application/Espo/Core/Formula/Functions/SetAttributeType.php @@ -30,6 +30,7 @@ namespace Espo\Core\Formula\Functions; use Espo\Core\Formula\Exceptions\Error; +use Espo\ORM\Name\Attribute; class SetAttributeType extends Base { @@ -49,7 +50,7 @@ class SetAttributeType extends Base throw new Error("SetAttribute: First argument is not string."); } - if ($name === 'id') { + if ($name === Attribute::ID) { throw new Error("Formula set-attribute: Not allowed to set `id` attribute."); } diff --git a/application/Espo/Core/Htmlizer/Htmlizer.php b/application/Espo/Core/Htmlizer/Htmlizer.php index 69f5819090..ddfc44a050 100644 --- a/application/Espo/Core/Htmlizer/Htmlizer.php +++ b/application/Espo/Core/Htmlizer/Htmlizer.php @@ -41,6 +41,7 @@ use Espo\Core\ORM\Type\FieldType; use Espo\Core\Select\SelectBuilderFactory; use Espo\Entities\Attachment; use Espo\Entities\User; +use Espo\ORM\Name\Attribute; use Espo\Repositories\Attachment as AttachmentRepository; use Espo\Core\Utils\Json; use Espo\Core\Acl; @@ -905,7 +906,7 @@ class Htmlizer } if ($orderBy === null) { - $orderBy = 'id'; + $orderBy = Attribute::ID; } return [[$orderBy, $order]]; diff --git a/application/Espo/Core/Select/AccessControl/Filters/OnlyOwn.php b/application/Espo/Core/Select/AccessControl/Filters/OnlyOwn.php index 810e9d2fe5..349c52c50d 100644 --- a/application/Espo/Core/Select/AccessControl/Filters/OnlyOwn.php +++ b/application/Espo/Core/Select/AccessControl/Filters/OnlyOwn.php @@ -33,6 +33,7 @@ use Espo\Core\Select\AccessControl\Filter; use Espo\Core\Select\Helpers\RelationQueryHelper; use Espo\Core\Select\Helpers\FieldHelper; use Espo\Entities\User; +use Espo\ORM\Name\Attribute; use Espo\ORM\Query\Part\Where\OrGroup; use Espo\ORM\Query\Part\WhereClause; use Espo\ORM\Query\Part\WhereItem; @@ -58,7 +59,7 @@ class OnlyOwn implements Filter } if (!$ownItem) { - $queryBuilder->where(['id' => null]); + $queryBuilder->where([Attribute::ID => null]); return; } diff --git a/application/Espo/Core/Select/AccessControl/Filters/PortalOnlyContact.php b/application/Espo/Core/Select/AccessControl/Filters/PortalOnlyContact.php index 19fa2c7f8a..afc0254f04 100644 --- a/application/Espo/Core/Select/AccessControl/Filters/PortalOnlyContact.php +++ b/application/Espo/Core/Select/AccessControl/Filters/PortalOnlyContact.php @@ -33,6 +33,7 @@ use Espo\Core\Select\AccessControl\Filter; use Espo\Core\Select\Helpers\FieldHelper; use Espo\Entities\User; use Espo\Modules\Crm\Entities\Contact; +use Espo\ORM\Name\Attribute; use Espo\ORM\Query\Part\Condition as Cond; use Espo\ORM\Query\Part\Expression as Expr; use Espo\ORM\Query\Part\Where\OrGroup; @@ -98,7 +99,7 @@ class PortalOnlyContact implements Filter $orGroup = $orBuilder->build(); if ($orGroup->getItemCount() === 0) { - $queryBuilder->where(['id' => null]); + $queryBuilder->where([Attribute::ID => null]); return; } diff --git a/application/Espo/Core/Select/Where/ItemGeneralConverter.php b/application/Espo/Core/Select/Where/ItemGeneralConverter.php index 718ed0e11b..415471aa36 100644 --- a/application/Espo/Core/Select/Where/ItemGeneralConverter.php +++ b/application/Espo/Core/Select/Where/ItemGeneralConverter.php @@ -411,7 +411,7 @@ class ItemGeneralConverter implements ItemConverter return [ $key => Select::fromRaw([ - 'select' => ['id'], + 'select' => [Attribute::ID], 'from' => $this->entityType, 'whereClause' => $whereClause, 'leftJoins' => $rawParams['leftJoins'] ?? [], @@ -439,7 +439,7 @@ class ItemGeneralConverter implements ItemConverter $subQueryBuilder = QueryBuilder::create() ->from($this->entityType) - ->select('id') + ->select(Attribute::ID) ->leftJoin($link); $alias = $link; @@ -464,7 +464,7 @@ class ItemGeneralConverter implements ItemConverter } return Cond::in( - Cond::column('id'), + Cond::column(Attribute::ID), $subQueryBuilder ->where($where) ->build() @@ -485,7 +485,7 @@ class ItemGeneralConverter implements ItemConverter $arrayAttribute = $attribute; $arrayEntityType = $this->entityType; - $idPart = 'id'; + $idPart = Attribute::ID; $isForeign = str_contains($attribute, '.'); @@ -1359,10 +1359,10 @@ class ItemGeneralConverter implements ItemConverter // Trade off is that if a foreign record is deleted but the middle table // is not yet deleted, it will give a non-actual result. $subQuery = QueryBuilder::create() - ->select('id') + ->select(Attribute::ID) ->from($this->entityType) ->leftJoin($middleEntityType, $alias, [ - "$alias.$nearKey:" => 'id', + "$alias.$nearKey:" => Attribute::ID, "$alias.deleted" => false, ]) ->where(["$alias.$key" => null]) @@ -1378,7 +1378,7 @@ class ItemGeneralConverter implements ItemConverter $relationType === Entity::HAS_CHILDREN ) { $subQuery = QueryBuilder::create() - ->select('id') + ->select(Attribute::ID) ->from($this->entityType) ->leftJoin($link, $alias) ->where([$alias . '.id' => null]) @@ -1411,10 +1411,10 @@ class ItemGeneralConverter implements ItemConverter // Trade off is that if a foreign record is deleted but the middle table // is not yet deleted, it will give a non-actual result. $subQuery = QueryBuilder::create() - ->select('id') + ->select(Attribute::ID) ->from($this->entityType) ->leftJoin($middleEntityType, $alias, [ - "$alias.$nearKey:" => 'id', + "$alias.$nearKey:" => Attribute::ID, "$alias.deleted" => false, ]) ->where(["$alias.$key!=" => null]) @@ -1430,7 +1430,7 @@ class ItemGeneralConverter implements ItemConverter $relationType == Entity::HAS_CHILDREN ) { $subQuery = QueryBuilder::create() - ->select('id') + ->select(Attribute::ID) ->from($this->entityType) ->leftJoin($link, $alias) ->where([$alias . '.id!=' => null]) @@ -1476,16 +1476,16 @@ class ItemGeneralConverter implements ItemConverter // Not joining a foreign table as it affects performance in MySQL. // MariaDB and PostgreSQL perform fast, MySQL – slow. return Cond::in( - Cond::column('id'), + Cond::column(Attribute::ID), QueryBuilder::create() - ->select('id') + ->select(Attribute::ID) ->from($this->entityType) ->leftJoin( Join::create($link, $alias) ->withConditions( Cond::equal( Cond::column("$alias.$nearKey"), - Cond::column('id') + Cond::column(Attribute::ID) ) ) ->withOnlyMiddle() @@ -1572,7 +1572,7 @@ class ItemGeneralConverter implements ItemConverter return Cond::not( Cond::exists( QueryBuilder::create() - ->select('id') + ->select(Attribute::ID) ->from($this->entityType, 'sq') ->join($link, $alias) ->where(["$alias.id" => $value]) @@ -1625,14 +1625,14 @@ class ItemGeneralConverter implements ItemConverter // Only-middle join performs slower on MariaDB. $sq = QueryBuilder::create() ->from($this->entityType) - ->select('id') + ->select(Attribute::ID) ->leftJoin($link) ->where([ $link . 'Middle.' . $key => $targetId, ]) ->build(); - $whereList[] = ['id=s' => $sq]; + $whereList[] = [Attribute::ID . '=s' => $sq]; } return $whereList; @@ -1644,12 +1644,12 @@ class ItemGeneralConverter implements ItemConverter foreach ($value as $targetId) { $sq = QueryBuilder::create() ->from($this->entityType) - ->select('id') + ->select(Attribute::ID) ->leftJoin($link) ->where([$link . '.id' => $targetId]) ->build(); - $whereList[] = ['id=s' => $sq]; + $whereList[] = [Attribute::ID . '=s' => $sq]; } return $whereList; diff --git a/application/Espo/Core/Utils/Currency/DatabasePopulator.php b/application/Espo/Core/Utils/Currency/DatabasePopulator.php index 7c61d859ab..fc6a245fed 100644 --- a/application/Espo/Core/Utils/Currency/DatabasePopulator.php +++ b/application/Espo/Core/Utils/Currency/DatabasePopulator.php @@ -32,6 +32,7 @@ namespace Espo\Core\Utils\Currency; use Espo\Entities\Currency; use Espo\ORM\EntityManager; use Espo\Core\Utils\Config; +use Espo\ORM\Name\Attribute; /** * Populates currency rates into database. @@ -64,7 +65,7 @@ class DatabasePopulator foreach ($currencyRates as $currencyName => $rate) { $this->entityManager->createEntity(Currency::ENTITY_TYPE, [ - 'id' => $currencyName, + Attribute::ID => $currencyName, 'rate' => $rate, ]); } diff --git a/application/Espo/Core/Webhook/Queue.php b/application/Espo/Core/Webhook/Queue.php index eb30844454..fa4ee4145a 100644 --- a/application/Espo/Core/Webhook/Queue.php +++ b/application/Espo/Core/Webhook/Queue.php @@ -40,8 +40,8 @@ use Espo\Core\Utils\Config; use Espo\Core\Utils\DateTime as DateTimeUtil; use Espo\Core\Utils\Log; use Espo\ORM\EntityManager; +use Espo\ORM\Name\Attribute; use Espo\ORM\Query\Part\Condition as Cond; - use Espo\ORM\Query\SelectBuilder; use Exception; use stdClass; @@ -97,7 +97,7 @@ class Queue $webhookList = $this->entityManager ->getRDBRepository(Webhook::ENTITY_TYPE) ->where([ - 'event' => $item->get('event'), + 'event' => $item->getEvent(), 'isActive' => true, ]) ->order(Field::CREATED_AT) @@ -106,11 +106,11 @@ class Queue foreach ($webhookList as $webhook) { $this->entityManager->createEntity(WebhookQueueItem::ENTITY_TYPE, [ 'webhookId' => $webhook->getId(), - 'event' => $item->get('event'), - 'targetId' => $item->get('targetId'), - 'targetType' => $item->get('targetType'), + 'event' => $item->getEvent(), + 'targetId' => $item->getTargetId(), + 'targetType' => $item->getTargetType(), 'status' => WebhookQueueItem::STATUS_PENDING, - 'data' => $item->get('data'), + 'data' => $item->getData(), 'attempts' => 0, ]); } @@ -168,8 +168,7 @@ class Queue ->limit(0, $batchSize) ->find(); - /** @var ?Webhook $webhook */ - $webhook = $this->entityManager->getEntityById(Webhook::ENTITY_TYPE, $webhookId); + $webhook = $this->entityManager->getRDBRepositoryByClass(Webhook::class)->getById($webhookId); if (!$webhook || !$webhook->isActive()) { foreach ($itemList as $item) { @@ -226,7 +225,7 @@ class Queue */ private function prepareItemData(WebhookQueueItem $item, ?User $user, array $forbiddenAttributeList): ?stdClass { - $targetType = $item->get('targetType'); + $targetType = $item->getTargetType(); $target = null; if ($this->entityManager->hasRepository($targetType)) { @@ -238,7 +237,7 @@ class Queue $target = $this->entityManager ->getRDBRepository($targetType) ->clone($query) - ->where(['id' => $item->get('targetId')]) + ->where([Attribute::ID => $item->getTargetId()]) ->findOne(); } @@ -256,7 +255,7 @@ class Queue } } - $data = $item->get('data') ?? (object) []; + $data = $item->getData(); foreach ($forbiddenAttributeList as $attribute) { unset($data->$attribute); diff --git a/application/Espo/Entities/WebhookEventQueueItem.php b/application/Espo/Entities/WebhookEventQueueItem.php index 5683b0be61..3b00eb6d29 100644 --- a/application/Espo/Entities/WebhookEventQueueItem.php +++ b/application/Espo/Entities/WebhookEventQueueItem.php @@ -30,6 +30,7 @@ namespace Espo\Entities; use Espo\Core\ORM\Entity; +use stdClass; class WebhookEventQueueItem extends Entity { @@ -41,4 +42,24 @@ class WebhookEventQueueItem extends Entity return $this; } + + public function getEvent(): string + { + return (string) $this->get('event'); + } + + public function getTargetType(): ?string + { + return $this->get('targetType'); + } + + public function getTargetId(): ?string + { + return $this->get('targetId'); + } + + public function getData(): stdClass + { + return $this->get('data') ?? (object) []; + } } diff --git a/application/Espo/Entities/WebhookQueueItem.php b/application/Espo/Entities/WebhookQueueItem.php index d1717bb8c4..9e45829038 100644 --- a/application/Espo/Entities/WebhookQueueItem.php +++ b/application/Espo/Entities/WebhookQueueItem.php @@ -31,6 +31,7 @@ namespace Espo\Entities; use Espo\Core\Field\DateTime; use Espo\Core\ORM\Entity; +use stdClass; class WebhookQueueItem extends Entity { @@ -84,4 +85,19 @@ class WebhookQueueItem extends Entity return $this; } + + public function getTargetType(): ?string + { + return $this->get('targetType'); + } + + public function getTargetId(): ?string + { + return $this->get('targetId'); + } + + public function getData(): stdClass + { + return $this->get('data') ?? (object) []; + } }