Skip to content

Commit e0d5d84

Browse files
authored
Feature/improve (#2)
1 parent 630a768 commit e0d5d84

15 files changed

+1075
-0
lines changed
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
namespace Yoanm\SymfonyJsonRpcHttpServerOpenAPIDoc\DependencyInjection;
3+
4+
use Symfony\Component\Config\FileLocator;
5+
use Symfony\Component\DependencyInjection\ContainerBuilder;
6+
use Symfony\Component\DependencyInjection\Extension\ExtensionInterface;
7+
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
8+
9+
/**
10+
* Class JsonRpcHttpServerOpenAPIDocExtension
11+
*/
12+
class JsonRpcHttpServerOpenAPIDocExtension implements ExtensionInterface
13+
{
14+
// Extension identifier (used in configuration for instance)
15+
const EXTENSION_IDENTIFIER = 'json_rpc_http_server_open_api_doc';
16+
17+
/**
18+
* {@inheritdoc}
19+
*/
20+
public function load(array $configs, ContainerBuilder $container)
21+
{
22+
$loader = new YamlFileLoader(
23+
$container,
24+
new FileLocator(__DIR__.'/../Resources/config')
25+
);
26+
$loader->load('services.sdk.yaml');
27+
$loader->load('services.public.yaml');
28+
}
29+
30+
/**
31+
* {@inheritdoc}
32+
*/
33+
public function getNamespace()
34+
{
35+
return 'http://example.org/schema/dic/'.$this->getAlias();
36+
}
37+
38+
/**
39+
* {@inheritdoc}
40+
*/
41+
public function getXsdValidationBasePath()
42+
{
43+
return '';
44+
}
45+
46+
/**
47+
* {@inheritdoc}
48+
*/
49+
public function getAlias()
50+
{
51+
return self::EXTENSION_IDENTIFIER;
52+
}
53+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
namespace Yoanm\SymfonyJsonRpcHttpServerOpenAPIDoc\Event;
3+
4+
use Yoanm\JsonRpcServerDoc\Model\HttpServerDoc;
5+
use Yoanm\SymfonyJsonRpcHttpServerDoc\Event\DocEvent;
6+
7+
/**
8+
* Class OpenAPIDocCreatedEvent
9+
*/
10+
class OpenAPIDocCreatedEvent extends DocEvent
11+
{
12+
const EVENT_NAME = 'json_rpc_http_server_openapi_doc.array_created';
13+
14+
/** @var array */
15+
private $openAPIDoc;
16+
/** @var HttpServerDoc|null */
17+
private $serverDoc;
18+
19+
/**
20+
* @param array $openAPIDoc
21+
* @param HttpServerDoc|null $serverDoc
22+
*/
23+
public function __construct(array $openAPIDoc, HttpServerDoc $serverDoc = null)
24+
{
25+
$this->openAPIDoc = $openAPIDoc;
26+
$this->serverDoc = $serverDoc;
27+
}
28+
29+
/**
30+
* @return HttpServerDoc
31+
*/
32+
public function getOpenAPIDoc()
33+
{
34+
return $this->openAPIDoc;
35+
}
36+
37+
/**
38+
* @return HttpServerDoc|null
39+
*/
40+
public function getServerDoc()
41+
{
42+
return $this->serverDoc;
43+
}
44+
45+
/**
46+
* @param array $openAPIDoc
47+
*
48+
* @return OpenAPIDocCreatedEvent
49+
*/
50+
public function setOpenAPIDoc(array $openAPIDoc)
51+
{
52+
$this->openAPIDoc = $openAPIDoc;
53+
54+
return $this;
55+
}
56+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
namespace Yoanm\SymfonyJsonRpcHttpServerOpenAPIDoc;
3+
4+
use Symfony\Component\HttpKernel\Bundle\Bundle;
5+
6+
/**
7+
* Class JsonRpcHttpServerOpenAPIDocBundle
8+
*/
9+
class JsonRpcHttpServerOpenAPIDocBundle extends Bundle
10+
{
11+
}

src/Provider/DocProvider.php

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php
2+
namespace Yoanm\SymfonyJsonRpcHttpServerOpenAPIDoc\Provider;
3+
4+
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
5+
use Yoanm\JsonRpcHttpServerOpenAPIDoc\Normalizer\DocNormalizer;
6+
use Yoanm\JsonRpcServerDoc\Model\HttpServerDoc;
7+
use Yoanm\SymfonyJsonRpcHttpServerDoc\Creator\HttpServerDocCreator;
8+
use Yoanm\SymfonyJsonRpcHttpServerDoc\Provider\DocProviderInterface;
9+
use Yoanm\SymfonyJsonRpcHttpServerOpenAPIDoc\Event\OpenAPIDocCreatedEvent;
10+
11+
/**
12+
* Class DocProvider
13+
*/
14+
class DocProvider implements DocProviderInterface
15+
{
16+
/** @var EventDispatcherInterface */
17+
private $dispatcher;
18+
/** @var HttpServerDocCreator */
19+
private $HttpServerDocCreator;
20+
/** @var DocNormalizer */
21+
private $docNormalizer;
22+
23+
/**
24+
* @param EventDispatcherInterface $dispatcher
25+
* @param HttpServerDocCreator $HttpServerDocCreator
26+
* @param DocNormalizer $docNormalizer
27+
*/
28+
public function __construct(
29+
EventDispatcherInterface $dispatcher,
30+
HttpServerDocCreator $HttpServerDocCreator,
31+
DocNormalizer $docNormalizer
32+
) {
33+
$this->dispatcher = $dispatcher;
34+
$this->HttpServerDocCreator = $HttpServerDocCreator;
35+
$this->docNormalizer = $docNormalizer;
36+
}
37+
38+
/**
39+
* @param string|null $host
40+
*
41+
* @return array
42+
*/
43+
public function getDoc($host = null)
44+
{
45+
$rawDoc = $this->HttpServerDocCreator->create($host);
46+
47+
$openApiDoc = $this->docNormalizer->normalize($rawDoc);
48+
49+
$event = new OpenAPIDocCreatedEvent($openApiDoc, $rawDoc);
50+
$this->dispatcher->dispatch($event::EVENT_NAME, $event);
51+
52+
return $event->getOpenAPIDoc();
53+
}
54+
55+
/**
56+
* {@inheritdoc}
57+
*/
58+
public function supports($filename, $host = null)
59+
{
60+
return 'openapi.json' === $filename;
61+
}
62+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
services:
2+
_defaults:
3+
public: true
4+
5+
json_rpc_http_server_open_api_doc.provider:
6+
class: Yoanm\SymfonyJsonRpcHttpServerOpenAPIDoc\Provider\DocProvider
7+
arguments:
8+
- '@event_dispatcher'
9+
- '@json_rpc_http_server_doc.creator.http_server'
10+
- '@json_rpc_http_server_open_api_doc_sdk.normalizer.doc'
11+
tags: ['json_rpc_server_doc.doc_provider']
12+
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
services:
2+
_defaults:
3+
public: true
4+
5+
6+
# Def resolver
7+
json_rpc_http_server_open_api_doc_sdk.resolver.definition_ref:
8+
class: Yoanm\JsonRpcHttpServerOpenAPIDoc\Resolver\DefinitionRefResolver
9+
10+
11+
# Normalizer
12+
json_rpc_http_server_open_api_doc_sdk.normalizer.doc:
13+
class: Yoanm\JsonRpcHttpServerOpenAPIDoc\Normalizer\DocNormalizer
14+
arguments:
15+
- '@json_rpc_http_server_open_api_doc_sdk.normalizer.component.request_doc'
16+
- '@json_rpc_http_server_open_api_doc_sdk.normalizer.component.response'
17+
- '@json_rpc_http_server_open_api_doc_sdk.normalizer.component.external_schema_list'
18+
- '@json_rpc_http_server_open_api_doc_sdk.normalizer.component.operation'
19+
20+
## Components
21+
json_rpc_http_server_open_api_doc_sdk.normalizer.component.schema_type:
22+
class: Yoanm\JsonRpcHttpServerOpenAPIDoc\Normalizer\Component\SchemaTypeNormalizer
23+
json_rpc_http_server_open_api_doc_sdk.normalizer.component.parameter_doc:
24+
class: Yoanm\JsonRpcHttpServerOpenAPIDoc\Normalizer\Component\TypeDocNormalizer
25+
arguments:
26+
- '@json_rpc_http_server_open_api_doc_sdk.normalizer.component.schema_type'
27+
json_rpc_http_server_open_api_doc_sdk.normalizer.component.shape:
28+
class: Yoanm\JsonRpcHttpServerOpenAPIDoc\Normalizer\Component\ShapeNormalizer
29+
arguments:
30+
- '@json_rpc_http_server_open_api_doc_sdk.resolver.definition_ref'
31+
json_rpc_http_server_open_api_doc_sdk.normalizer.component.error:
32+
class: Yoanm\JsonRpcHttpServerOpenAPIDoc\Normalizer\Component\ErrorDocNormalizer
33+
arguments:
34+
- '@json_rpc_http_server_open_api_doc_sdk.resolver.definition_ref'
35+
- '@json_rpc_http_server_open_api_doc_sdk.normalizer.component.parameter_doc'
36+
- '@json_rpc_http_server_open_api_doc_sdk.normalizer.component.shape'
37+
json_rpc_http_server_open_api_doc_sdk.normalizer.component.external_schema_list:
38+
class: Yoanm\JsonRpcHttpServerOpenAPIDoc\Normalizer\Component\ExternalSchemaListDocNormalizer
39+
arguments:
40+
- '@json_rpc_http_server_open_api_doc_sdk.resolver.definition_ref'
41+
- '@json_rpc_http_server_open_api_doc_sdk.normalizer.component.parameter_doc'
42+
- '@json_rpc_http_server_open_api_doc_sdk.normalizer.component.error'
43+
json_rpc_http_server_open_api_doc_sdk.normalizer.component.request_doc:
44+
class: Yoanm\JsonRpcHttpServerOpenAPIDoc\Normalizer\Component\RequestDocNormalizer
45+
arguments:
46+
- '@json_rpc_http_server_open_api_doc_sdk.resolver.definition_ref'
47+
- '@json_rpc_http_server_open_api_doc_sdk.normalizer.component.shape'
48+
json_rpc_http_server_open_api_doc_sdk.normalizer.component.response:
49+
class: Yoanm\JsonRpcHttpServerOpenAPIDoc\Normalizer\Component\ResponseDocNormalizer
50+
arguments:
51+
- '@json_rpc_http_server_open_api_doc_sdk.resolver.definition_ref'
52+
- '@json_rpc_http_server_open_api_doc_sdk.normalizer.component.shape'
53+
json_rpc_http_server_open_api_doc_sdk.normalizer.component.operation:
54+
class: Yoanm\JsonRpcHttpServerOpenAPIDoc\Normalizer\Component\OperationDocNormalizer
55+
arguments:
56+
- '@json_rpc_http_server_open_api_doc_sdk.resolver.definition_ref'
57+
- '@json_rpc_http_server_open_api_doc_sdk.normalizer.component.request_doc'
58+
- '@json_rpc_http_server_open_api_doc_sdk.normalizer.component.response'
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
<?php
2+
namespace Tests\Common\DependencyInjection;
3+
4+
use Matthias\SymfonyDependencyInjectionTest\PhpUnit\AbstractExtensionTestCase;
5+
use Symfony\Component\DependencyInjection\Definition;
6+
use Yoanm\JsonRpcServer\Domain\Model\MethodResolverInterface;
7+
use Yoanm\SymfonyJsonRpcHttpServer\DependencyInjection\JsonRpcHttpServerExtension;
8+
9+
abstract class AbstractTestClass extends AbstractExtensionTestCase
10+
{
11+
// Public services
12+
const EXPECTED_ENDPOINT_SERVICE_ID = 'json_rpc_http_server.endpoint';
13+
const EXPECTED_SERVICE_NAME_RESOLVER_SERVICE_ID = 'json_rpc_http_server.resolver.service_name';
14+
15+
// Public tags
16+
const EXPECTED_METHOD_RESOLVER_TAG = 'json_rpc_http_server.method_resolver';
17+
const EXPECTED_JSONRPC_METHOD_TAG = 'json_rpc_http_server.jsonrpc_method';
18+
19+
const EXPECTED_JSONRPC_METHOD_TAG_METHOD_NAME_KEY = 'method';
20+
21+
const EXPECTED_METHOD_MANAGER_SERVICE_ID = 'json_rpc_http_server.sdk.app.manager.method';
22+
const EXPECTED_METHOD_RESOLVER_STUB_SERVICE_ID = 'json_rpc_http_server.infra.resolver.method';
23+
24+
const EXPECTED_HTTP_ENDPOINT_PATH_CONTAINER_PARAM = 'json_rpc_http_server.http_endpoint_path';
25+
26+
/**
27+
* {@inheritdoc}
28+
*/
29+
protected function getContainerExtensions()
30+
{
31+
return [
32+
new JsonRpcHttpServerExtension()
33+
];
34+
}
35+
36+
protected function load(array $configurationValues = [])
37+
{
38+
parent::load($configurationValues);
39+
40+
// And then compile container to have correct injection
41+
$this->compile();
42+
}
43+
44+
45+
protected function assertEndpointIsUsable()
46+
{
47+
// Retrieving this service will imply to load all related dependencies
48+
// Any binding issues will be raised
49+
$this->assertNotNull($this->container->get(self::EXPECTED_ENDPOINT_SERVICE_ID));
50+
}
51+
52+
/**
53+
* @param $jsonRpcMethodServiceId
54+
*/
55+
protected function assertJsonRpcMethodServiceIsAvailable($jsonRpcMethodServiceId)
56+
{
57+
$this->assertNotNull($this->container->get($jsonRpcMethodServiceId));
58+
}
59+
60+
/**
61+
* @return Definition
62+
*/
63+
protected function createJsonRpcMethodDefinition()
64+
{
65+
return (new Definition(\stdClass::class))
66+
->setPrivate(false);
67+
}
68+
69+
/**
70+
* @param Definition $definition
71+
* @param string $methodName
72+
*/
73+
protected function addJsonRpcMethodTag(Definition $definition, $methodName)
74+
{
75+
$definition->addTag(
76+
self::EXPECTED_JSONRPC_METHOD_TAG,
77+
[self::EXPECTED_JSONRPC_METHOD_TAG_METHOD_NAME_KEY => $methodName]
78+
);
79+
}
80+
81+
/**
82+
* @return Definition
83+
*/
84+
protected function createCustomMethodResolverDefinition()
85+
{
86+
$customResolverService = new Definition($this->prophesize(MethodResolverInterface::class)->reveal());
87+
$customResolverService->addTag(self::EXPECTED_METHOD_RESOLVER_TAG);
88+
89+
return $customResolverService;
90+
}
91+
}

0 commit comments

Comments
 (0)