diff --git a/bootstrap.php b/bootstrap.php index 67ca60d..d45f799 100644 --- a/bootstrap.php +++ b/bootstrap.php @@ -16,6 +16,7 @@ use CultuurNet\UDB3\EventSourcing\ExecutionContextMetadataEnricher; use CultuurNet\UDB3\LabelCollection; use CultuurNet\UDB3\SimpleEventBus; +use CultuurNet\UDB3\UiTPASService\Broadway\Saga\StaticallyConfiguredSagaNamespacedEventsMetadataFactory; use CultuurNet\UDB3\UiTPASService\Permissions\DefaultEventPermission; use CultuurNet\UDB3\UiTPASService\Permissions\UDB3EventPermission; use CultuurNet\UDB3\UiTPASService\Sync\SyncCommandHandler; @@ -409,9 +410,11 @@ function ($app) { $app->extend( 'uitpas_command_bus_out', function (CommandBusInterface $commandBus, Application $app) { - // @todo Subscribe command handlers here. + $uitpasSync = isset($app['config']['uitpas_sync']) ? (bool) $app['config']['uitpas_sync'] : true; + if ($uitpasSync) { + $commandBus->subscribe($app['uitpas_sync_command_handler']); + } - $commandBus->subscribe($app['uitpas_sync_command_handler']); $commandBus->subscribe($app['uitpas_aggregate_command_handler']); return $commandBus; @@ -467,7 +470,7 @@ function (Application $app) { $app['saga_repository'], new Broadway\UuidGenerator\Rfc4122\Version4Generator() ), - new \Broadway\Saga\Metadata\StaticallyConfiguredSagaMetadataFactory(), + new StaticallyConfiguredSagaNamespacedEventsMetadataFactory(), new EventDispatcher() ); } diff --git a/config.dist.yml b/config.dist.yml index e118e06..dafdc12 100644 --- a/config.dist.yml +++ b/config.dist.yml @@ -19,3 +19,4 @@ jwt: file: public.pem validation: iss: http://culudb-jwt-provider.dev +uitpas_sync: true # Optional, defaults to true if not defined diff --git a/src/Broadway/Saga/NamespacedEventsMetadata.php b/src/Broadway/Saga/NamespacedEventsMetadata.php new file mode 100644 index 0000000..a39d6ba --- /dev/null +++ b/src/Broadway/Saga/NamespacedEventsMetadata.php @@ -0,0 +1,46 @@ +criteria = $criteria; + } + + /** + * {@inheritDoc} + */ + public function handles($event) + { + $eventName = get_class($event); + + return isset($this->criteria[$eventName]); + } + + /** + * {@inheritDoc} + */ + public function criteria($event) + { + $eventName = get_class($event); + + if (! isset($this->criteria[$eventName])) { + throw new \RuntimeException(sprintf("No criteria for event '%s'.", $eventName)); + } + + return $this->criteria[$eventName]($event); + } +} diff --git a/src/Broadway/Saga/StaticallyConfiguredSagaNamespacedEventsMetadataFactory.php b/src/Broadway/Saga/StaticallyConfiguredSagaNamespacedEventsMetadataFactory.php new file mode 100644 index 0000000..03f9cf5 --- /dev/null +++ b/src/Broadway/Saga/StaticallyConfiguredSagaNamespacedEventsMetadataFactory.php @@ -0,0 +1,29 @@ +name); + $label = new Label($label); return $this->uitpasLabels->contains($label); } ); diff --git a/src/UiTPASEventSaga.php b/src/UiTPASEventSaga.php index 0e4546a..1699ded 100644 --- a/src/UiTPASEventSaga.php +++ b/src/UiTPASEventSaga.php @@ -11,9 +11,7 @@ use CultuurNet\UDB3\Cdb\EventItemFactory; use CultuurNet\UDB3\Cdb\PriceDescriptionParser; use CultuurNet\UDB3\Event\Events\EventCreated; -use CultuurNet\UDB3\Event\Events\EventCreatedFromCdbXml; use CultuurNet\UDB3\Event\Events\EventImportedFromUDB2; -use CultuurNet\UDB3\Event\Events\EventUpdatedFromCdbXml; use CultuurNet\UDB3\Event\Events\EventUpdatedFromUDB2; use CultuurNet\UDB3\Event\Events\OrganizerDeleted; use CultuurNet\UDB3\Event\Events\OrganizerUpdated; @@ -96,25 +94,22 @@ public static function configuration() ); }; - $cdbXmlEventCallback = function ($event) { - /* @var EventUpdatedFromUDB2|EventUpdatedFromCdbXml $event */ + $updateFromUdb2Callback = function (EventUpdatedFromUDB2 $event) { return new Criteria( ['uitpasAggregateId' => (string) $event->getEventId()] ); }; return [ - 'EventCreated' => $initialEventCallback, - 'EventImportedFromUDB2' => $initialEventCallback, - 'EventCreatedFromCdbXml' => $initialEventCallback, - 'EventUpdatedFromUDB2' => $cdbXmlEventCallback, - 'EventUpdatedFromCdbXml' => $cdbXmlEventCallback, - 'OrganizerUpdated' => $offerEventCallback, - 'OrganizerDeleted' => $offerEventCallback, - 'PriceInfoUpdated' => $offerEventCallback, - 'UiTPASAggregateCreated' => $uitpasAggregateEventCallback, - 'DistributionKeysUpdated' => $uitpasAggregateEventCallback, - 'DistributionKeysCleared' => $uitpasAggregateEventCallback, + EventCreated::class => $initialEventCallback, + EventImportedFromUDB2::class => $initialEventCallback, + EventUpdatedFromUDB2::class => $updateFromUdb2Callback, + OrganizerUpdated::class => $offerEventCallback, + OrganizerDeleted::class => $offerEventCallback, + PriceInfoUpdated::class => $offerEventCallback, + UiTPASAggregateCreated::class => $uitpasAggregateEventCallback, + DistributionKeysUpdated::class => $uitpasAggregateEventCallback, + DistributionKeysCleared::class => $uitpasAggregateEventCallback, ]; } @@ -151,27 +146,6 @@ public function handleEventImportedFromUDB2(EventImportedFromUDB2 $eventImported return $state; } - /** - * @param EventCreatedFromCdbXml $eventCreatedFromCdbXml - * @param State $state - * @return State - */ - public function handleEventCreatedFromCdbXml(EventCreatedFromCdbXml $eventCreatedFromCdbXml, State $state) - { - $state->set('uitpasAggregateId', $eventCreatedFromCdbXml->getEventId()); - $state->set('syncCount', 0); - - $state = $this->updateStateFromCdbXml( - $state, - (string) $eventCreatedFromCdbXml->getEventXmlString(), - (string) $eventCreatedFromCdbXml->getCdbXmlNamespaceUri() - ); - - $this->triggerSyncWhenConditionsAreMet($state); - - return $state; - } - /** * @param EventUpdatedFromUDB2 $eventUpdatedFromUDB2 * @param State $state @@ -190,24 +164,6 @@ public function handleEventUpdatedFromUDB2(EventUpdatedFromUDB2 $eventUpdatedFro return $state; } - /** - * @param EventUpdatedFromCdbXml $eventUpdatedFromCdbXml - * @param State $state - * @return State - */ - public function handleEventUpdatedFromCdbXml(EventUpdatedFromCdbXml $eventUpdatedFromCdbXml, State $state) - { - $state = $this->updateStateFromCdbXml( - $state, - (string) $eventUpdatedFromCdbXml->getEventXmlString(), - (string) $eventUpdatedFromCdbXml->getCdbXmlNamespaceUri() - ); - - $this->triggerSyncWhenConditionsAreMet($state); - - return $state; - } - /** * @param OrganizerUpdated $organizerUpdated * @param State $state diff --git a/tests/Specification/IsUiTPASOrganizerAccordingToJSONLDTest.php b/tests/Specification/IsUiTPASOrganizerAccordingToJSONLDTest.php index 71bd20c..367f1ad 100644 --- a/tests/Specification/IsUiTPASOrganizerAccordingToJSONLDTest.php +++ b/tests/Specification/IsUiTPASOrganizerAccordingToJSONLDTest.php @@ -130,24 +130,12 @@ public function it_returns_true_for_organizers_with_an_exact_uitpas_label_match( $expectedLabelLogContext = $expectedLogContext + [ 'uitpas_labels' => $this->uitpasLabels->asArray(), 'extracted_organizer_labels' => [ - (object) [ - 'uuid' => '71945e50-2158-4922-94d2-fd1da6286b51', - 'name' => 'foo', - ], - (object) [ - 'uuid' => '12dabcf9-9598-4e8d-8642-c1af42698875', - 'name' => 'UiTPAS', - ], - (object) [ - 'uuid' => '9fac1824-8c65-4d0e-845f-9bef03fa05a1', - 'name' => 'bar', - ], + 'foo', + 'UiTPAS', + 'bar', ], 'organizer_uitpas_labels' => [ - (object) [ - 'uuid' => '12dabcf9-9598-4e8d-8642-c1af42698875', - 'name' => 'UiTPAS', - ], + 'UiTPAS', ], ]; @@ -175,24 +163,12 @@ public function it_returns_true_for_organizers_with_a_case_insensitive_uitpas_la $expectedLabelLogContext = $expectedLogContext + [ 'uitpas_labels' => $this->uitpasLabels->asArray(), 'extracted_organizer_labels' => [ - (object) [ - 'uuid' => '71945e50-2158-4922-94d2-fd1da6286b51', - 'name' => 'foo', - ], - (object) [ - 'uuid' => '12dabcf9-9598-4e8d-8642-c1af42698875', - 'name' => 'uitpas', - ], - (object) [ - 'uuid' => '9fac1824-8c65-4d0e-845f-9bef03fa05a1', - 'name' => 'bar', - ], + 'foo', + 'uitpas', + 'bar', ], 'organizer_uitpas_labels' => [ - (object) [ - 'uuid' => '12dabcf9-9598-4e8d-8642-c1af42698875', - 'name' => 'uitpas', - ], + 'uitpas', ], ]; @@ -220,14 +196,8 @@ public function it_returns_false_for_organizers_without_uitpas_label() $expectedLabelLogContext = $expectedLogContext + [ 'uitpas_labels' => $this->uitpasLabels->asArray(), 'extracted_organizer_labels' => [ - (object) [ - 'uuid' => '71945e50-2158-4922-94d2-fd1da6286b51', - 'name' => 'foo', - ], - (object) [ - 'uuid' => '9fac1824-8c65-4d0e-845f-9bef03fa05a1', - 'name' => 'bar', - ], + 'foo', + 'bar', ], 'organizer_uitpas_labels' => [], ]; diff --git a/tests/Specification/samples/organizer-with-lowercase-uitpas-label b/tests/Specification/samples/organizer-with-lowercase-uitpas-label index 62b85b0..24f7d60 100644 --- a/tests/Specification/samples/organizer-with-lowercase-uitpas-label +++ b/tests/Specification/samples/organizer-with-lowercase-uitpas-label @@ -1,17 +1,8 @@ { "@id": "http://example.com/organizers/dba1c53d-582c-4081-a78c-b4848f9e3653", "labels": [ - { - "uuid": "71945e50-2158-4922-94d2-fd1da6286b51", - "name": "foo" - }, - { - "uuid": "12dabcf9-9598-4e8d-8642-c1af42698875", - "name": "uitpas" - }, - { - "uuid": "9fac1824-8c65-4d0e-845f-9bef03fa05a1", - "name": "bar" - } + "foo", + "uitpas", + "bar" ] } diff --git a/tests/Specification/samples/organizer-with-syntax-error b/tests/Specification/samples/organizer-with-syntax-error index 4599eeb..aa75943 100644 --- a/tests/Specification/samples/organizer-with-syntax-error +++ b/tests/Specification/samples/organizer-with-syntax-error @@ -1,11 +1,5 @@ { "@id": "http://example.com/organizers/dba1c53d-582c-4081-a78c-b4848f9e3653", "labels": [ - { - "uuid": "71945e50-2158-4922-94d2-fd1da6286b51", - "name": "foo" - }, - { - "uuid": "12dabcf9-9598-4e8d-8642-c1af42698875", - "name": "uitpas" - }, + "foo", + "uitpas", diff --git a/tests/Specification/samples/organizer-with-uitpas-label b/tests/Specification/samples/organizer-with-uitpas-label index ede2106..9083678 100644 --- a/tests/Specification/samples/organizer-with-uitpas-label +++ b/tests/Specification/samples/organizer-with-uitpas-label @@ -1,17 +1,8 @@ { "@id": "http://example.com/organizers/dba1c53d-582c-4081-a78c-b4848f9e3653", "labels": [ - { - "uuid": "71945e50-2158-4922-94d2-fd1da6286b51", - "name": "foo" - }, - { - "uuid": "12dabcf9-9598-4e8d-8642-c1af42698875", - "name": "UiTPAS" - }, - { - "uuid": "9fac1824-8c65-4d0e-845f-9bef03fa05a1", - "name": "bar" - } + "foo", + "UiTPAS", + "bar" ] } diff --git a/tests/Specification/samples/organizer-without-uitpas-label b/tests/Specification/samples/organizer-without-uitpas-label index c00dba6..319f442 100644 --- a/tests/Specification/samples/organizer-without-uitpas-label +++ b/tests/Specification/samples/organizer-without-uitpas-label @@ -1,13 +1,7 @@ { "@id": "http://example.com/organizers/dba1c53d-582c-4081-a78c-b4848f9e3653", "labels": [ - { - "uuid": "71945e50-2158-4922-94d2-fd1da6286b51", - "name": "foo" - }, - { - "uuid": "9fac1824-8c65-4d0e-845f-9bef03fa05a1", - "name": "bar" - } + "foo", + "bar" ] } diff --git a/tests/UiTPASEventSagaTest.php b/tests/UiTPASEventSagaTest.php index 391a662..4ef57cc 100644 --- a/tests/UiTPASEventSagaTest.php +++ b/tests/UiTPASEventSagaTest.php @@ -5,7 +5,6 @@ use Broadway\CommandHandling\CommandBusInterface; use Broadway\CommandHandling\Testing\TraceableCommandBus; use Broadway\EventDispatcher\EventDispatcher; -use Broadway\Saga\Metadata\StaticallyConfiguredSagaMetadataFactory; use Broadway\Saga\MultipleSagaManager; use Broadway\Saga\State\InMemoryRepository; use Broadway\Saga\State\StateManager; @@ -22,21 +21,19 @@ use CultuurNet\UDB3\Cdb\CdbId\EventCdbIdExtractor; use CultuurNet\UDB3\Cdb\PriceDescriptionParser; use CultuurNet\UDB3\Event\Events\EventCreated; -use CultuurNet\UDB3\Event\Events\EventCreatedFromCdbXml; use CultuurNet\UDB3\Event\Events\EventImportedFromUDB2; -use CultuurNet\UDB3\Event\Events\EventUpdatedFromCdbXml; use CultuurNet\UDB3\Event\Events\EventUpdatedFromUDB2; use CultuurNet\UDB3\Event\Events\OrganizerDeleted; use CultuurNet\UDB3\Event\Events\OrganizerUpdated; use CultuurNet\UDB3\Event\Events\PriceInfoUpdated; use CultuurNet\UDB3\Event\EventType; -use CultuurNet\UDB3\EventXmlString; use CultuurNet\UDB3\Location\Location; use CultuurNet\UDB3\PriceInfo\BasePrice; use CultuurNet\UDB3\PriceInfo\Price; use CultuurNet\UDB3\PriceInfo\PriceInfo; use CultuurNet\UDB3\PriceInfo\Tariff; use CultuurNet\UDB3\Title; +use CultuurNet\UDB3\UiTPASService\Broadway\Saga\StaticallyConfiguredSagaNamespacedEventsMetadataFactory; use CultuurNet\UDB3\UiTPASService\UiTPASAggregate\Command\ClearDistributionKeys; use CultuurNet\UDB3\UiTPASService\UiTPASAggregate\Command\CreateUiTPASAggregate; use CultuurNet\UDB3\UiTPASService\Sync\Command\RegisterUiTPASEvent; @@ -188,7 +185,7 @@ protected function createScenario() $sagaStateRepository, [$saga], new StateManager($sagaStateRepository, new Version4Generator()), - new StaticallyConfiguredSagaMetadataFactory(), + new StaticallyConfiguredSagaNamespacedEventsMetadataFactory(), new EventDispatcher() ); return new Scenario($this, $sagaManager, $traceableCommandBus); @@ -636,42 +633,6 @@ public function it_creates_a_new_uitpas_aggregate_and_registers_an_uitpas_event_ ); } - /** - * @test - */ - public function it_creates_a_new_uitpas_aggregate_and_registers_an_uitpas_event_for_events_created_from_cdbxml() - { - $cdbXml = file_get_contents(__DIR__ . '/cdbxml-samples/event-with-uitpas-organizer-and-price.xml'); - - $cdbXmlNamespaceUri = 'http://www.cultuurdatabank.com/XMLSchema/CdbXSD/3.3/FINAL'; - - $expectedPriceInfo = new PriceInfo( - new BasePrice( - Price::fromFloat(5.5), - Currency::fromNative('EUR') - ) - ); - - $this->scenario - ->when( - new EventCreatedFromCdbXml( - new StringLiteral($this->eventId), - new EventXmlString($cdbXml), - new StringLiteral($cdbXmlNamespaceUri) - ) - ) - ->then( - [ - new CreateUiTPASAggregate($this->eventId, []), - new RegisterUiTPASEvent( - $this->eventId, - $this->uitpasOrganizerId, - $expectedPriceInfo - ), - ] - ); - } - /** * @test */ @@ -710,50 +671,6 @@ public function it_updates_an_uitpas_event_when_updated_from_udb2() ); } - /** - * @test - */ - public function it_updates_an_uitpas_event_when_updated_from_cdbxml() - { - $cdbXml = file_get_contents(__DIR__ . '/cdbxml-samples/event-with-uitpas-organizer-and-price.xml'); - - $cdbXmlNamespaceUri = 'http://www.cultuurdatabank.com/XMLSchema/CdbXSD/3.3/FINAL'; - - $expectedPriceInfo = new PriceInfo( - new BasePrice( - Price::fromFloat(5.5), - Currency::fromNative('EUR') - ) - ); - - $this->scenario - ->given( - [ - $this->eventCreated, - new OrganizerUpdated($this->eventId, $this->uitpasOrganizerId), - new PriceInfoUpdated($this->eventId, $this->priceInfo), - $this->uitpasAggregateCreated, - ] - ) - ->when( - new EventUpdatedFromCdbXml( - new StringLiteral($this->eventId), - new EventXmlString($cdbXml), - new StringLiteral($cdbXmlNamespaceUri) - ) - ) - ->then( - [ - new UpdateUiTPASEvent( - $this->eventId, - $this->uitpasOrganizerId, - $expectedPriceInfo, - $this->distributionKeys - ), - ] - ); - } - /** * @test */