PHRAS-3598 Webhook - Emit improvement - Count and Log errors - stop to notify endpoint in error (#4209)

* deactivate webhook when many times undelivered

* fix

* fix log
This commit is contained in:
Aina Sitraka
2023-01-11 16:52:22 +03:00
committed by GitHub
parent 232224373d
commit fc278420a4
3 changed files with 50 additions and 4 deletions

View File

@@ -11,19 +11,18 @@
namespace Alchemy\Phrasea\Model\Manipulator;
use Alchemy\Phrasea\Application;
use Alchemy\Phrasea\Model\Entities\ApiApplication;
use Alchemy\Phrasea\Model\Entities\WebhookEvent;
use Alchemy\Phrasea\Model\Entities\WebhookEventDelivery;
use Alchemy\Phrasea\Model\Repositories\WebhookEventDeliveryRepository;
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\ORM\EntityRepository;
class WebhookEventDeliveryManipulator implements ManipulatorInterface
{
private $om;
private $repository;
public function __construct(ObjectManager $om, EntityRepository $repo)
public function __construct(ObjectManager $om, WebhookEventDeliveryRepository $repo)
{
$this->om = $om;
$this->repository = $repo;
@@ -65,4 +64,22 @@ class WebhookEventDeliveryManipulator implements ManipulatorInterface
$delivery->setDeliverTries($delivery->getDeliveryTries() + 1);
$this->update($delivery);
}
public function isWebhookDeactivate(ApiApplication $apiApplication)
{
$r = $this->repository->findUndeliveredEventsFromLastAppUpdate($apiApplication);
// if failed to deliver webhook to the url in 5 different events
// calculation based after app update ( any change on api application )
// so deactivate the webhook
if (count($r) >= 5) {
$apiApplication->setWebhookActive(false);
$this->om->persist($apiApplication);
$this->om->flush();
return true;
}
return false;
}
}

View File

@@ -23,7 +23,6 @@ use Doctrine\ORM\EntityRepository;
*/
class WebhookEventDeliveryRepository extends EntityRepository
{
/**
* @return WebhookEventDelivery[]
*/
@@ -40,6 +39,26 @@ class WebhookEventDeliveryRepository extends EntityRepository
return $qb->getQuery()->getResult();
}
/**
* @param $apiApplication
* @return WebhookEventDelivery[]
*/
public function findUndeliveredEventsFromLastAppUpdate(ApiApplication $apiApplication)
{
$qb = $this->createQueryBuilder('e');
$qb
->join('e.application', 'a')
->where('e.application = :app')
->andWhere($qb->expr()->eq('e.delivered', $qb->expr()->literal(false)))
->andWhere('e.deliveryTries = 3')
->andWhere('e.created > a.updated')
->setParameter(':app', $apiApplication)
;
return $qb->getQuery()->getResult();
}
/**
* @param ApiApplication $apiApplication
* @param int $count

View File

@@ -330,6 +330,16 @@ class WebhookWorker implements WorkerInterface
);
$app['webhook.delivery_payload_repository']->save($deliveryPayload);
// deactivate webhook for the app if it's always failed for different event
if ($app['manipulator.webhook-delivery']->isWebhookDeactivate($delivery->getThirdPartyApplication())) {
$message = sprintf('Webhook for app "%s" is deactivated, cannot deliver data in the url "%s" from different events (more than 5 times)',
$delivery->getThirdPartyApplication()->getName(),
$delivery->getThirdPartyApplication()->getWebhookUrl()
);
$app['alchemy_worker.message.publisher']->pushLog($message, 'info');
}
}
};