Skip to content

Commit ebb6151

Browse files
committed
elasticsearch
1 parent b0b3b19 commit ebb6151

File tree

5 files changed

+66
-22
lines changed

5 files changed

+66
-22
lines changed

src/Elasticsearch/Metadata/Document/Factory/AttributeDocumentMetadataFactory.php

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@
1414
namespace ApiPlatform\Elasticsearch\Metadata\Document\Factory;
1515

1616
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
17+
use ApiPlatform\Core\Metadata\Resource\ResourceMetadata;
1718
use ApiPlatform\Elasticsearch\Exception\IndexNotFoundException;
1819
use ApiPlatform\Elasticsearch\Metadata\Document\DocumentMetadata;
20+
use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
21+
use ApiPlatform\Metadata\Resource\ResourceMetadataCollection;
1922

2023
/**
2124
* Creates document's metadata using the attribute configuration.
@@ -26,10 +29,16 @@
2629
*/
2730
final class AttributeDocumentMetadataFactory implements DocumentMetadataFactoryInterface
2831
{
32+
/**
33+
* @var ResourceMetadataFactoryInterface|ResourceMetadataCollectionFactoryInterface
34+
*/
2935
private $resourceMetadataFactory;
3036
private $decorated;
3137

32-
public function __construct(ResourceMetadataFactoryInterface $resourceMetadataFactory, ?DocumentMetadataFactoryInterface $decorated = null)
38+
/**
39+
* @param ResourceMetadataFactoryInterface|ResourceMetadataCollectionFactoryInterface $resourceMetadataFactory
40+
*/
41+
public function __construct($resourceMetadataFactory, ?DocumentMetadataFactoryInterface $decorated = null)
3342
{
3443
$this->resourceMetadataFactory = $resourceMetadataFactory;
3544
$this->decorated = $decorated;
@@ -52,17 +61,22 @@ public function create(string $resourceClass): DocumentMetadata
5261
$resourceMetadata = null;
5362

5463
if (!$documentMetadata || null === $documentMetadata->getIndex()) {
64+
/** @var ResourceMetadata|ResourceMetadataCollection */
5565
$resourceMetadata = $this->resourceMetadataFactory->create($resourceClass);
5666

57-
if (null !== $index = $resourceMetadata->getAttribute('elasticsearch_index')) {
67+
$index = $resourceMetadata instanceof ResourceMetadata ? $resourceMetadata->getAttribute('elasticsearch_index') : ($resourceMetadata->getOperation()->getExtraProperties()['elasticsearch_index'] ?? null);
68+
69+
if (null !== $index) {
5870
$documentMetadata = $documentMetadata ? $documentMetadata->withIndex($index) : new DocumentMetadata($index);
5971
}
6072
}
6173

6274
if (!$documentMetadata || DocumentMetadata::DEFAULT_TYPE === $documentMetadata->getType()) {
75+
/** @var ResourceMetadata|ResourceMetadataCollection */
6376
$resourceMetadata = $resourceMetadata ?? $this->resourceMetadataFactory->create($resourceClass);
77+
$type = $resourceMetadata instanceof ResourceMetadata ? $resourceMetadata->getAttribute('elasticsearch_type') : ($resourceMetadata->getOperation()->getExtraProperties()['elasticsearch_type'] ?? null);
6478

65-
if (null !== $type = $resourceMetadata->getAttribute('elasticsearch_type')) {
79+
if (null !== $type) {
6680
$documentMetadata = $documentMetadata ? $documentMetadata->withType($type) : new DocumentMetadata(null, $type);
6781
}
6882
}

src/Elasticsearch/Metadata/Document/Factory/CatDocumentMetadataFactory.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,11 @@
1414
namespace ApiPlatform\Elasticsearch\Metadata\Document\Factory;
1515

1616
use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface;
17+
use ApiPlatform\Core\Metadata\Resource\ResourceMetadata;
1718
use ApiPlatform\Elasticsearch\Exception\IndexNotFoundException;
1819
use ApiPlatform\Elasticsearch\Metadata\Document\DocumentMetadata;
20+
use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
21+
use ApiPlatform\Metadata\Resource\ResourceMetadataCollection;
1922
use ApiPlatform\Util\Inflector;
2023
use Elasticsearch\Client;
2124
use Elasticsearch\Common\Exceptions\Missing404Exception;
@@ -32,10 +35,16 @@
3235
final class CatDocumentMetadataFactory implements DocumentMetadataFactoryInterface
3336
{
3437
private $client;
38+
/**
39+
* @var ResourceMetadataFactoryInterface|ResourceMetadataCollectionFactoryInterface
40+
*/
3541
private $resourceMetadataFactory;
3642
private $decorated;
3743

38-
public function __construct(Client $client, ResourceMetadataFactoryInterface $resourceMetadataFactory, ?DocumentMetadataFactoryInterface $decorated = null)
44+
/**
45+
* @param ResourceMetadataFactoryInterface|ResourceMetadataCollectionFactoryInterface $resourceMetadataFactory
46+
*/
47+
public function __construct(Client $client, $resourceMetadataFactory, ?DocumentMetadataFactoryInterface $decorated = null)
3948
{
4049
$this->client = $client;
4150
$this->resourceMetadataFactory = $resourceMetadataFactory;
@@ -60,7 +69,15 @@ public function create(string $resourceClass): DocumentMetadata
6069
return $documentMetadata;
6170
}
6271

63-
if (null === $resourceShortName = $this->resourceMetadataFactory->create($resourceClass)->getShortName()) {
72+
/** @var ResourceMetadata|ResourceMetadataCollection */
73+
$resourceMetadata = $this->resourceMetadataFactory->create($resourceClass);
74+
if ($resourceMetadata instanceof ResourceMetadata) {
75+
$resourceShortName = $resourceMetadata->getShortName();
76+
} else {
77+
$resourceShortName = $resourceMetadata->getOperation()->getShortName();
78+
}
79+
80+
if (null === $resourceShortName) {
6481
return $this->handleNotFound($documentMetadata, $resourceClass);
6582
}
6683

src/Elasticsearch/Metadata/Resource/Factory/ElasticsearchProviderResourceMetadataCollectionFactory.php

Lines changed: 27 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,14 @@
1313

1414
namespace ApiPlatform\Elasticsearch\Metadata\Resource\Factory;
1515

16-
use ApiPlatform\Elasticsearch\Exception\IndexNotFoundException;
17-
use ApiPlatform\Elasticsearch\Metadata\Document\Factory\DocumentMetadataFactoryInterface;
1816
use ApiPlatform\Elasticsearch\State\CollectionProvider;
1917
use ApiPlatform\Elasticsearch\State\ItemProvider;
2018
use ApiPlatform\Metadata\CollectionOperationInterface;
2119
use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
2220
use ApiPlatform\Metadata\Resource\ResourceMetadataCollection;
21+
use ApiPlatform\Util\Inflector;
22+
use Elasticsearch\Client;
23+
use Elasticsearch\Common\Exceptions\Missing404Exception;
2324

2425
final class ElasticsearchProviderResourceMetadataCollectionFactory implements ResourceMetadataCollectionFactoryInterface
2526
{
@@ -28,15 +29,12 @@ final class ElasticsearchProviderResourceMetadataCollectionFactory implements Re
2829
*/
2930
private $decorated;
3031

31-
/**
32-
* @var DocumentMetadataFactoryInterface
33-
*/
34-
private $documentMetadataFactory;
32+
private $client;
3533

36-
public function __construct(DocumentMetadataFactoryInterface $documentMetadataFactory, ResourceMetadataCollectionFactoryInterface $decorated)
34+
public function __construct(Client $client, ResourceMetadataCollectionFactoryInterface $decorated)
3735
{
38-
$this->documentMetadataFactory = $documentMetadataFactory;
3936
$this->decorated = $decorated;
37+
$this->client = $client;
4038
}
4139

4240
/**
@@ -46,17 +44,15 @@ public function create(string $resourceClass): ResourceMetadataCollection
4644
{
4745
$resourceMetadataCollection = $this->decorated->create($resourceClass);
4846

49-
try {
50-
$this->documentMetadataFactory->create($resourceClass);
51-
} catch (IndexNotFoundException $e) {
52-
return $resourceMetadataCollection;
53-
}
54-
5547
foreach ($resourceMetadataCollection as $i => $resourceMetadata) {
5648
$operations = $resourceMetadata->getOperations();
5749

5850
if ($operations) {
5951
foreach ($resourceMetadata->getOperations() as $operationName => $operation) {
52+
if ($this->hasIndices($operation->getShortName())) {
53+
$operation = $operation->withElasticsearch(true);
54+
}
55+
6056
if (null !== $operation->getProvider() || false === ($operation->getElasticsearch() ?? false)) {
6157
continue;
6258
}
@@ -71,6 +67,10 @@ public function create(string $resourceClass): ResourceMetadataCollection
7167

7268
if ($graphQlOperations) {
7369
foreach ($graphQlOperations as $operationName => $graphQlOperation) {
70+
if ($this->hasIndices($graphQlOperation->getShortName())) {
71+
$graphQlOperation = $graphQlOperation->withElasticsearch(true);
72+
}
73+
7474
if (null !== $graphQlOperation->getProvider() || false === ($graphQlOperation->getElasticsearch() ?? false)) {
7575
continue;
7676
}
@@ -86,4 +86,17 @@ public function create(string $resourceClass): ResourceMetadataCollection
8686

8787
return $resourceMetadataCollection;
8888
}
89+
90+
private function hasIndices(string $shortName): bool
91+
{
92+
$index = Inflector::tableize($shortName);
93+
94+
try {
95+
$this->client->cat()->indices(['index' => $index]);
96+
97+
return true;
98+
} catch (Missing404Exception $e) {
99+
return false;
100+
}
101+
}
89102
}

src/Symfony/Bundle/Resources/config/elasticsearch.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@
2424
</service>
2525

2626
<service id="api_platform.elasticsearch.metadata.document.metadata_factory.attribute" class="ApiPlatform\Elasticsearch\Metadata\Document\Factory\AttributeDocumentMetadataFactory" decorates="api_platform.elasticsearch.metadata.document.metadata_factory" decoration-priority="20" public="false">
27-
<argument type="service" id="api_platform.metadata.resource.metadata_factory" />
27+
<argument type="service" id="api_platform.metadata.resource.metadata_collection_factory.retro_compatible" />
2828
<argument type="service" id="api_platform.elasticsearch.metadata.document.metadata_factory.attribute.inner" />
2929
</service>
3030

3131
<service id="api_platform.elasticsearch.metadata.document.metadata_factory.cat" class="ApiPlatform\Elasticsearch\Metadata\Document\Factory\CatDocumentMetadataFactory" decorates="api_platform.elasticsearch.metadata.document.metadata_factory" decoration-priority="10" public="false">
3232
<argument type="service" id="api_platform.elasticsearch.client" />
33-
<argument type="service" id="api_platform.metadata.resource.metadata_factory" />
33+
<argument type="service" id="api_platform.metadata.resource.metadata_collection_factory.retro_compatible" />
3434
<argument type="service" id="api_platform.elasticsearch.metadata.document.metadata_factory.cat.inner" />
3535
</service>
3636

src/Symfony/Bundle/Resources/config/v3/elasticsearch.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
</service>
2626

2727
<service id="api_platform.elasticsearch.metadata.resource.metadata_collection_factory" class="ApiPlatform\Elasticsearch\Metadata\Resource\Factory\ElasticsearchProviderResourceMetadataCollectionFactory" decorates="api_platform.metadata.resource.metadata_collection_factory" decoration-priority="40">
28-
<argument type="service" id="api_platform.elasticsearch.metadata.document.metadata_factory" />
28+
<argument type="service" id="api_platform.elasticsearch.client" />
2929
<argument type="service" id="api_platform.elasticsearch.metadata.resource.metadata_collection_factory.inner" />
3030
</service>
3131

0 commit comments

Comments
 (0)