This commit is contained in:
Yuri Kuznetsov
2021-06-11 13:04:08 +03:00
parent 3c6b485321
commit d29e2f3994
3 changed files with 43 additions and 38 deletions
+11 -10
View File
@@ -101,7 +101,8 @@ class Manager
{
$data = [];
$list = $this->entityManager->getRepository('Webhook')
$list = $this->entityManager
->getRDBRepository('Webhook')
->select(['event'])
->groupBy(['event'])
->where([
@@ -135,7 +136,7 @@ class Manager
public function removeEvent(string $event): void
{
$notExists = !$this->entityManager
->getRepository('Webhook')
->getRDBRepository('Webhook')
->select(['id'])
->where([
'event' => $event,
@@ -159,7 +160,7 @@ class Manager
protected function logDebugEvent(string $event, Entity $entity): void
{
$this->log->debug("Webhook: {$event} on record {$entity->id}.");
$this->log->debug("Webhook: {$event} on record {$entity->getId()}.");
}
/**
@@ -176,7 +177,7 @@ class Manager
$this->entityManager->createEntity('WebhookEventQueueItem', [
'event' => $event,
'targetType' => $entity->getEntityType(),
'targetId' => $entity->id,
'targetId' => $entity->getId(),
'data' => $entity->getValueMap(),
]);
@@ -197,9 +198,9 @@ class Manager
$this->entityManager->createEntity('WebhookEventQueueItem', [
'event' => $event,
'targetType' => $entity->getEntityType(),
'targetId' => $entity->id,
'targetId' => $entity->getId(),
'data' => (object) [
'id' => $entity->id,
'id' => $entity->getId(),
],
]);
@@ -229,13 +230,13 @@ class Manager
return;
}
$data->id = $entity->id;
$data->id = $entity->getId();
if ($this->eventExists($event)) {
$this->entityManager->createEntity('WebhookEventQueueItem', [
'event' => $event,
'targetType' => $entity->getEntityType(),
'targetId' => $entity->id,
'targetId' => $entity->getId(),
'data' => $data,
]);
@@ -268,7 +269,7 @@ class Manager
if ($isChanged) {
$itemData = (object) [];
$itemData->id = $entity->id;
$itemData->id = $entity->getId();
$attributeList = $this->fieldUtil->getAttributeList($entity->getEntityType(), $field);
@@ -283,7 +284,7 @@ class Manager
$this->entityManager->createEntity('WebhookEventQueueItem', [
'event' => $itemEvent,
'targetType' => $entity->getEntityType(),
'targetId' => $entity->id,
'targetId' => $entity->getId(),
'data' => $itemData,
]);
+21 -20
View File
@@ -52,15 +52,15 @@ use DateTime;
*/
class Queue
{
const EVENT_PORTION_SIZE = 20;
private const EVENT_PORTION_SIZE = 20;
const PORTION_SIZE = 20;
private const PORTION_SIZE = 20;
const BATCH_SIZE = 50;
private const BATCH_SIZE = 50;
const MAX_ATTEMPT_NUMBER = 4;
private const MAX_ATTEMPT_NUMBER = 4;
const FAIL_ATTEMPT_PERIOD = '10 minutes';
private const FAIL_ATTEMPT_PERIOD = '10 minutes';
private $sender;
@@ -97,7 +97,7 @@ class Queue
$portionSize = $this->config->get('webhookQueueEventPortionSize', self::EVENT_PORTION_SIZE);
$itemList = $this->entityManager
->getRepository('WebhookEventQueueItem')
->getRDBRepository('WebhookEventQueueItem')
->where([
'isProcessed' => false,
])
@@ -119,7 +119,7 @@ class Queue
protected function createQueueFromEvent(WebhookEventQueueItem $item): void
{
$webhookList = $this->entityManager
->getRepository('Webhook')
->getRDBRepository('Webhook')
->where([
'event' => $item->get('event'),
'isActive' => true,
@@ -129,7 +129,7 @@ class Queue
foreach ($webhookList as $webhook) {
$this->entityManager->createEntity('WebhookQueueItem', [
'webhookId' => $webhook->id,
'webhookId' => $webhook->getId(),
'event' => $item->get('event'),
'targetId' => $item->get('targetId'),
'targetType' => $item->get('targetType'),
@@ -145,7 +145,8 @@ class Queue
$portionSize = $this->config->get('webhookQueuePortionSize', self::PORTION_SIZE);
$batchSize = $this->config->get('webhookBatchSize', self::BATCH_SIZE);
$groupedItemList = $this->entityManager->getRepository('WebhookQueueItem')
$groupedItemList = $this->entityManager
->getRDBRepository('WebhookQueueItem')
->select(['webhookId', 'number'])
->where([
'number=s' => [
@@ -171,7 +172,7 @@ class Queue
$webhookId = $group->get('webhookId');
$itemList = $this->entityManager
->getRepository('WebhookQueueItem')
->getRDBRepository('WebhookQueueItem')
->where([
'webhookId' => $webhookId,
'status' => 'Pending',
@@ -206,10 +207,9 @@ class Queue
continue;
}
else {
$forbiddenAttributeList = $this->aclManager
->getScopeForbiddenAttributeList($user, $webhook->get('entityType'));
}
$forbiddenAttributeList = $this->aclManager
->getScopeForbiddenAttributeList($user, $webhook->get('entityType'));
}
$actualItemList = [];
@@ -222,7 +222,7 @@ class Queue
if ($this->entityManager->hasRepository($targetType)) {
$target = $this->entityManager
->getRepository($targetType)
->getRDBRepository($targetType)
->where([
'id' => $item->get('targetId')
])
@@ -273,8 +273,9 @@ class Queue
$this->failQueueItemList($itemList, true);
$this->log->error(
"Webhook Queue: Webhook {$webhook->id} sending failed. Error: " . $e->getMessage()
"Webhook Queue: Webhook '" . $webhook->getId() . "' sending failed. Error: " . $e->getMessage()
);
return;
}
@@ -299,7 +300,7 @@ class Queue
protected function logSending(Webhook $webhook, int $code): void
{
$this->log->debug("Webhook Queue: Webhook {$webhook->id} sent, response code: {$code}.");
$this->log->debug("Webhook Queue: Webhook '" . $webhook->getId() . "' sent, response code: {$code}.");
}
protected function failQueueItemList(array $itemList, bool $force = false): void
@@ -318,16 +319,16 @@ class Queue
protected function deleteQueueItem(WebhookQueueItem $item): void
{
$this->entityManager->getRepository('WebhookQueueItem')->deleteFromDb($item->id);
$this->entityManager->getRepository('WebhookQueueItem')->deleteFromDb($item->getId());
}
protected function dropWebhook(Webhook $webhook): void
{
$itemList = $this->entityManager
->getRepository('WebhookQueueItem')
->getRDBRepository('WebhookQueueItem')
->where([
'status' => 'Pending',
'webhookId' => $webhook->id,
'webhookId' => $webhook->getId(),
])
->order('number')
->find();
+11 -8
View File
@@ -40,9 +40,9 @@ use Espo\Core\{
*/
class Sender
{
const CONNECT_TIMEOUT = 5;
private const CONNECT_TIMEOUT = 5;
const TIMEOUT = 10;
private const TIMEOUT = 10;
private $config;
@@ -99,10 +99,13 @@ class Sender
$code = intval($code);
}
if ($errorNumber = curl_errno($handler)) {
if (in_array($errorNumber, [\CURLE_OPERATION_TIMEDOUT, \CURLE_OPERATION_TIMEOUTED])) {
$code = 408;
}
$errorNumber = curl_errno($handler);
if (
$errorNumber &&
in_array($errorNumber, [\CURLE_OPERATION_TIMEDOUT, \CURLE_OPERATION_TIMEOUTED])
) {
$code = 408;
}
curl_close($handler);
@@ -110,8 +113,8 @@ class Sender
return $code;
}
protected function buildSignature(Webhook $webhook, string $payload, string $secretKey): string
private function buildSignature(Webhook $webhook, string $payload, string $secretKey): string
{
return base64_encode($webhook->id . ':' . hash_hmac('sha256', $payload, $secretKey, true));
return base64_encode($webhook->getId() . ':' . hash_hmac('sha256', $payload, $secretKey, true));
}
}