This commit is contained in:
Yuri Kuznetsov
2024-11-11 17:15:10 +02:00
parent df1d2ba80b
commit 0531b7239c
13 changed files with 86 additions and 41 deletions
@@ -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();
@@ -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,
@@ -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<Entity>
@@ -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) {
@@ -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)
@@ -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.");
}
+2 -1
View File
@@ -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]];
@@ -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;
}
@@ -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;
}
@@ -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;
@@ -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,
]);
}
+10 -11
View File
@@ -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);
@@ -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) [];
}
}
@@ -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) [];
}
}