diff --git a/lib/Alchemy/Phrasea/Core/Event/Record/StatusChangedEvent.php b/lib/Alchemy/Phrasea/Core/Event/Record/StatusChangedEvent.php index fdd251a5b4..8c0ca75420 100644 --- a/lib/Alchemy/Phrasea/Core/Event/Record/StatusChangedEvent.php +++ b/lib/Alchemy/Phrasea/Core/Event/Record/StatusChangedEvent.php @@ -13,4 +13,26 @@ namespace Alchemy\Phrasea\Core\Event\Record; class StatusChangedEvent extends RecordEvent { + /** @var array */ + private $statusBefore; + + /** @var array */ + private $statusAfter; + + public function __construct(\record_adapter $record, array $statusBefore, array $statusAfter) + { + parent::__construct($record); + $this->statusBefore = $statusBefore; + $this->statusAfter = $statusAfter; + } + + public function getStatusBefore() + { + return $this->statusBefore; + } + + public function getStatusAfter() + { + return $this->statusAfter; + } } diff --git a/lib/Alchemy/Phrasea/Core/Event/Subscriber/WebhookRecordEventSubscriber.php b/lib/Alchemy/Phrasea/Core/Event/Subscriber/WebhookRecordEventSubscriber.php index e319bdc90e..0933ac4851 100644 --- a/lib/Alchemy/Phrasea/Core/Event/Subscriber/WebhookRecordEventSubscriber.php +++ b/lib/Alchemy/Phrasea/Core/Event/Subscriber/WebhookRecordEventSubscriber.php @@ -6,6 +6,7 @@ use Alchemy\Phrasea\Application; use Alchemy\Phrasea\Core\Event\Record\CollectionChangedEvent; use Alchemy\Phrasea\Core\Event\Record\RecordEvent; use Alchemy\Phrasea\Core\Event\Record\RecordEvents; +use Alchemy\Phrasea\Core\Event\Record\StatusChangedEvent; use Alchemy\Phrasea\Core\LazyLocator; use Alchemy\Phrasea\Core\PhraseaEvents; use Alchemy\Phrasea\Model\Entities\WebhookEvent; @@ -78,12 +79,31 @@ class WebhookRecordEventSubscriber implements EventSubscriberInterface } else { $this->app['logger']->error("Record not found when wanting to create webhook data!"); } - } - public function onRecordStatusChanged(RecordEvent $event) + public function onRecordStatusChanged(StatusChangedEvent $event) { - $this->createWebhookEvent($event, WebhookEvent::RECORD_STATUS_CHANGED); + $record = $this->convertToRecordAdapter($event->getRecord()); + + if ($record !== null) { + $eventData = [ + 'databox_id' => $event->getRecord()->getDataboxId(), + 'record_id' => $event->getRecord()->getRecordId(), + 'collection_name' => $record->getCollection()->get_name(), + 'record_type' => $event->getRecord()->isStory() ? "story" : "record", + 'before' => $event->getStatusBefore(), + 'after' => $event->getStatusAfter() + ]; + + $this->app['manipulator.webhook-event']->create( + WebhookEvent::RECORD_STATUS_CHANGED, + WebhookEvent::RECORD_TYPE, + $eventData, + [$event->getRecord()->getBaseId()] + ); + } else { + $this->app['logger']->error("Record not found when wanting to create webhook data!"); + } } /** diff --git a/lib/classes/record/adapter.php b/lib/classes/record/adapter.php index 1cd43a632d..bf40403e66 100644 --- a/lib/classes/record/adapter.php +++ b/lib/classes/record/adapter.php @@ -2362,6 +2362,14 @@ class record_adapter implements RecordInterface, cache_cacheableInterface */ public function setStatus($status) { + $statusBefore['status'] = []; + foreach ($this->getStatusStructure() as $bit => $st) { + $statusBefore['status'][] = [ + 'bit' => $bit, + 'state' => \databox_status::bitIsSet($this->getStatusBitField(), $bit), + ]; + } + $this->getDataboxConnection()->executeUpdate( 'UPDATE record SET moddate = NOW(), status = :status WHERE record_id=:record_id', ['status' => bindec($status), 'record_id' => $this->getRecordId()] @@ -2371,7 +2379,15 @@ class record_adapter implements RecordInterface, cache_cacheableInterface // modification date is now unknown, delete from cache to reload on another record $this->delete_data_from_cache(); - $this->dispatch(RecordEvents::STATUS_CHANGED, new StatusChangedEvent($this)); + $newStatus['status'] = []; + foreach ($this->getStatusStructure() as $bit => $st) { + $newStatus['status'][] = [ + 'bit' => $bit, + 'state' => \databox_status::bitIsSet($this->getStatusBitField(), $bit), + ]; + } + + $this->dispatch(RecordEvents::STATUS_CHANGED, new StatusChangedEvent($this, $statusBefore, $newStatus)); } /** diff --git a/tests/Alchemy/Tests/Phrasea/Webhook/Processor/FeedEntryProcessorTest.php b/tests/Alchemy/Tests/Phrasea/Webhook/Processor/FeedEntryProcessorTest.php index 282e9fb861..a89b6e1dc2 100644 --- a/tests/Alchemy/Tests/Phrasea/Webhook/Processor/FeedEntryProcessorTest.php +++ b/tests/Alchemy/Tests/Phrasea/Webhook/Processor/FeedEntryProcessorTest.php @@ -53,7 +53,7 @@ class FeedEntryProcessorTest extends \PhraseanetTestCase 'entry_id' => self::$DI['feed_public_entry']->getId(), 'url' => 'server_name', 'instance_name' => 'instance_name', - 'time' => new \DateTime() + 'event_time' => new \DateTime() ]); $event->setName(WebhookEvent::NEW_FEED_ENTRY); $event->setType(WebhookEvent::FEED_ENTRY_TYPE);