Skip to content

Commit 8345c68

Browse files
committed
Allow to use different URL to publish and subscribe
1 parent 320b978 commit 8345c68

File tree

7 files changed

+28
-11
lines changed

7 files changed

+28
-11
lines changed

src/Bridge/Doctrine/EventListener/PublishMercureUpdatesListener.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
use ApiPlatform\Core\Api\IriConverterInterface;
1717
use ApiPlatform\Core\Api\ResourceClassResolverInterface;
18+
use ApiPlatform\Core\Api\UrlGeneratorInterface;
1819
use ApiPlatform\Core\Exception\InvalidArgumentException;
1920
use ApiPlatform\Core\Exception\RuntimeException;
2021
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
@@ -146,7 +147,7 @@ private function storeEntityToPublish($entity, string $property): void
146147
}
147148

148149
if ('deletedEntities' === $property) {
149-
$this->deletedEntities[$this->iriConverter->getIriFromItem($entity)] = $value;
150+
$this->deletedEntities[$this->iriConverter->getIriFromItem($entity, UrlGeneratorInterface::ABS_URL)] = $value;
150151

151152
return;
152153
}
@@ -166,7 +167,7 @@ private function publishUpdate($entity, array $targets, bool $deleted = false):
166167
$iri = $entity;
167168
$data = json_encode(['@id' => $iri]);
168169
} else {
169-
$iri = $this->iriConverter->getIriFromItem($entity);
170+
$iri = $this->iriConverter->getIriFromItem($entity, UrlGeneratorInterface::ABS_URL);
170171
$data = $this->serializer->serialize($entity, 'jsonld');
171172
}
172173

src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ public function load(array $configs, ContainerBuilder $container)
144144
$this->registerHttpCache($container, $config, $loader, $useDoctrine);
145145
$this->registerValidatorConfiguration($container, $config, $loader);
146146
$this->registerDataCollector($container, $config, $loader);
147-
$this->registerMercureConfiguration($container, $loader, $useDoctrine);
147+
$this->registerMercureConfiguration($container, $config, $loader, $useDoctrine);
148148
}
149149

150150
/**
@@ -523,13 +523,15 @@ private function registerDataCollector(ContainerBuilder $container, array $confi
523523
$loader->load('data_collector.xml');
524524
}
525525

526-
private function registerMercureConfiguration(ContainerBuilder $container, XmlFileLoader $loader, bool $useDoctrine)
526+
private function registerMercureConfiguration(ContainerBuilder $container, array $config, XmlFileLoader $loader, bool $useDoctrine)
527527
{
528-
if (!$container->hasParameter('mercure.default_hub')) {
528+
if (!$config['mercure']['enabled'] || !$container->hasParameter('mercure.default_hub')) {
529529
return;
530530
}
531531

532532
$loader->load('mercure.xml');
533+
$container->getDefinition('api_platform.mercure.listener.response.add_link_header')->addArgument($config['mercure']['hub_url'] ?? '%mercure.default_hub%');
534+
533535
if ($useDoctrine) {
534536
$loader->load('doctrine_orm_mercure_publisher.xml');
535537
}

src/Bridge/Symfony/Bundle/DependencyInjection/Configuration.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
use Symfony\Component\Config\Definition\ConfigurationInterface;
2424
use Symfony\Component\Config\Definition\Exception\InvalidConfigurationException;
2525
use Symfony\Component\HttpFoundation\Response;
26+
use Symfony\Component\Mercure\Update;
2627
use Symfony\Component\Serializer\Exception\ExceptionInterface;
2728

2829
/**
@@ -218,6 +219,13 @@ public function getConfigTreeBuilder()
218219
->end()
219220
->end()
220221

222+
->arrayNode('mercure')
223+
->{class_exists(Update::class) ? 'canBeDisabled' : 'canBeEnabled'}()
224+
->children()
225+
->scalarNode('hub_url')->defaultNull()->info('The URL send in the Link HTTP header. If not set, will default to the URL for the Symfony\'s bundle default hub.')
226+
->end()
227+
->end()
228+
221229
->end();
222230

223231
$this->addExceptionToStatusSection($rootNode);

src/Bridge/Symfony/Bundle/Resources/config/mercure.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
<service id="api_platform.mercure.listener.response.add_link_header" class="ApiPlatform\Core\Mercure\EventListener\AddLinkHeaderListener">
1111
<argument type="service" id="api_platform.metadata.resource.metadata_factory" />
12-
<argument>%mercure.default_hub%</argument>
1312

1413
<tag name="kernel.event_listener" event="kernel.response" method="onKernelResponse" />
1514
</service>

tests/Bridge/Doctrine/EventListener/PublishMercureUpdatesListenerTest.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
use ApiPlatform\Core\Api\IriConverterInterface;
1717
use ApiPlatform\Core\Api\ResourceClassResolverInterface;
18+
use ApiPlatform\Core\Api\UrlGeneratorInterface;
1819
use ApiPlatform\Core\Bridge\Doctrine\EventListener\PublishMercureUpdatesListener;
1920
use ApiPlatform\Core\Exception\InvalidArgumentException;
2021
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
@@ -57,10 +58,10 @@ public function testPublishUpdate()
5758
$resourceClassResolverProphecy->isResourceClass(DummyFriend::class)->willReturn(true);
5859

5960
$iriConverterProphecy = $this->prophesize(IriConverterInterface::class);
60-
$iriConverterProphecy->getIriFromItem($toInsert)->willReturn('/dummies/1')->shouldBeCalled();
61-
$iriConverterProphecy->getIriFromItem($toUpdate)->willReturn('/dummies/2')->shouldBeCalled();
62-
$iriConverterProphecy->getIriFromItem($toDelete)->willReturn('/dummies/3')->shouldBeCalled();
63-
$iriConverterProphecy->getIriFromItem($toDeleteExpressionLanguage)->willReturn('/dummy_friends/4')->shouldBeCalled();
61+
$iriConverterProphecy->getIriFromItem($toInsert, UrlGeneratorInterface::ABS_URL)->willReturn('http://example.com/dummies/1')->shouldBeCalled();
62+
$iriConverterProphecy->getIriFromItem($toUpdate, UrlGeneratorInterface::ABS_URL)->willReturn('http://example.com/dummies/2')->shouldBeCalled();
63+
$iriConverterProphecy->getIriFromItem($toDelete, UrlGeneratorInterface::ABS_URL)->willReturn('http://example.com/dummies/3')->shouldBeCalled();
64+
$iriConverterProphecy->getIriFromItem($toDeleteExpressionLanguage, UrlGeneratorInterface::ABS_URL)->willReturn('http://example.com/dummy_friends/4')->shouldBeCalled();
6465

6566
$resourceMetadataFactoryProphecy = $this->prophesize(ResourceMetadataFactoryInterface::class);
6667
$resourceMetadataFactoryProphecy->create(Dummy::class)->willReturn(new ResourceMetadata(null, null, null, null, null, ['mercure' => true]));
@@ -101,7 +102,7 @@ public function testPublishUpdate()
101102
$listener->onFlush($eventArgs);
102103
$listener->postFlush();
103104

104-
$this->assertSame(['/dummies/1', '/dummies/2', '/dummies/3', '/dummy_friends/4'], $topics);
105+
$this->assertSame(['http://example.com/dummies/1', 'http://example.com/dummies/2', 'http://example.com/dummies/3', 'http://example.com/dummy_friends/4'], $topics);
105106
$this->assertSame([[], [], [], ['foo', 'bar']], $targets);
106107
}
107108

tests/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtensionTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -757,6 +757,8 @@ private function getBaseContainerBuilderProphecy()
757757
$containerBuilderProphecy->getParameter('api_platform.metadata_cache')->willReturn(true)->shouldBeCalled();
758758
$containerBuilderProphecy->hasParameter('mercure.default_hub')->willReturn(true)->shouldBeCalled();
759759

760+
$containerBuilderProphecy->getDefinition('api_platform.mercure.listener.response.add_link_header')->willReturn(new Definition());
761+
760762
return $containerBuilderProphecy;
761763
}
762764
}

tests/Bridge/Symfony/Bundle/DependencyInjection/ConfigurationTest.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,10 @@ public function testDefaultConfig()
143143
'vary' => ['Accept'],
144144
'public' => null,
145145
],
146+
'mercure' => [
147+
'enabled' => true,
148+
'hub_url' => null,
149+
],
146150
'allow_plain_identifiers' => false,
147151
'resource_class_directories' => [],
148152
], $config);

0 commit comments

Comments
 (0)