22
33namespace Apitte \OpenApi \DI ;
44
5- use Apitte \Core \DI \Plugin \AbstractPlugin ;
6- use Apitte \Core \DI \Plugin \PluginCompiler ;
5+ use Apitte \Core \DI \Plugin \Plugin ;
76use Apitte \Core \Exception \Logical \InvalidArgumentException ;
87use Apitte \OpenApi \SchemaBuilder ;
98use Apitte \OpenApi \SchemaDefinition \ArrayDefinition ;
1514use Apitte \OpenApi \SchemaDefinition \NeonDefinition ;
1615use Apitte \OpenApi \SchemaDefinition \YamlDefinition ;
1716use Apitte \OpenApi \Tracy \SwaggerUIPanel ;
17+ use Contributte \DI \Helper \ExtensionDefinitionsHelper ;
18+ use Nette \DI \Definitions \Definition ;
19+ use Nette \DI \Definitions \Statement ;
1820use Nette \PhpGenerator \ClassType ;
21+ use Nette \Schema \Expect ;
22+ use Nette \Schema \Schema ;
1923use Nette \Utils \Strings ;
24+ use stdClass ;
2025
21- class OpenApiPlugin extends AbstractPlugin
26+ /**
27+ * @property-read stdClass $config
28+ */
29+ class OpenApiPlugin extends Plugin
2230{
2331
24- public const PLUGIN_NAME = 'openapi ' ;
25-
26- /** @var mixed[] */
27- protected $ defaults = [
28- 'definitions ' => null ,
29- 'definition ' => [],
30- 'files ' => [],
31- 'swaggerUi ' => [
32- 'url ' => null ,
33- 'expansion ' => SwaggerUIPanel::EXPANSION_LIST ,
34- 'filter ' => true ,
35- 'title ' => 'SwaggerUi ' ,
36- 'panel ' => true ,
37- ],
38- ];
39-
40- public function __construct (PluginCompiler $ compiler )
32+ public static function getName (): string
4133 {
42- parent ::__construct ($ compiler );
43- $ this ->name = self ::PLUGIN_NAME ;
34+ return 'openapi ' ;
35+ }
36+
37+ protected function getConfigSchema (): Schema
38+ {
39+ return Expect::structure ([
40+ 'definitions ' => Expect::arrayOf (Expect::type ('string|array| ' . Statement::class)),
41+ 'definition ' => Expect::array (),
42+ 'files ' => Expect::arrayOf ('string ' ),
43+ 'swaggerUi ' => Expect::structure ([
44+ 'url ' => Expect::string ()->nullable (),
45+ 'expansion ' => Expect::anyOf (...SwaggerUIPanel::EXPANSIONS )->default (SwaggerUIPanel::EXPANSION_LIST ),
46+ 'filter ' => Expect::bool (true ),
47+ 'title ' => Expect::string ('SwaggerUi ' ),
48+ 'panel ' => Expect::bool (true ),
49+ ]),
50+ ]);
4451 }
4552
4653 /**
@@ -50,7 +57,8 @@ public function loadPluginConfiguration(): void
5057 {
5158 $ builder = $ this ->getContainerBuilder ();
5259 $ global = $ this ->compiler ->getExtension ()->getConfig ();
53- $ config = $ this ->getConfig ();
60+ $ config = $ this ->config ;
61+ $ definitionHelper = new ExtensionDefinitionsHelper ($ this ->compiler ->getExtension ()->getCompiler ());
5462
5563 $ builder ->addDefinition ($ this ->prefix ('entityAdapter ' ))
5664 ->setFactory (EntityAdapter::class);
@@ -64,12 +72,12 @@ public function loadPluginConfiguration(): void
6472 $ schemaBuilder = $ builder ->addDefinition ($ this ->prefix ('schemaBuilder ' ))
6573 ->setFactory (SchemaBuilder::class);
6674
67- if ($ config[ ' definitions ' ] === null ) {
75+ if ($ config-> definitions === [] ) {
6876 $ schemaBuilder
6977 ->addSetup ('addDefinition ' , [new BaseDefinition ()])
7078 ->addSetup ('addDefinition ' , [$ entityDefinition ])
7179 ->addSetup ('addDefinition ' , [$ coreDefinition ]);
72- foreach ($ config[ ' files ' ] as $ file ) {
80+ foreach ($ config-> files as $ file ) {
7381 if (Strings::endsWith ($ file , '.neon ' )) {
7482 $ schemaBuilder ->addSetup ('addDefinition ' , [new NeonDefinition ($ file )]);
7583 } elseif (Strings::endsWith ($ file , '.yaml ' ) || Strings::endsWith ($ file , '.yml ' )) {
@@ -84,38 +92,45 @@ public function loadPluginConfiguration(): void
8492 }
8593 }
8694
87- $ schemaBuilder ->addSetup ('addDefinition ' , [new ArrayDefinition ($ config[ ' definition ' ] )]);
95+ $ schemaBuilder ->addSetup ('addDefinition ' , [new ArrayDefinition ($ config-> definition )]);
8896 } else {
89- foreach ($ config ['definitions ' ] as $ customDefinition ) {
90- $ schemaBuilder ->addSetup ('addDefinition ' , [$ customDefinition ]);
97+ foreach ($ config ->definitions as $ definitionName => $ definitionConfig ) {
98+ $ definitionPrefix = $ this ->prefix ('definition. ' . $ definitionName );
99+ $ definition = $ definitionHelper ->getDefinitionFromConfig ($ definitionConfig , $ definitionPrefix );
100+
101+ if ($ definition instanceof Definition) {
102+ $ definition ->setAutowired (false );
103+ }
104+
105+ $ schemaBuilder ->addSetup ('addDefinition ' , [$ definition ]);
91106 }
92107 }
93108
94- if ($ global[ ' debug ' ] !== true ) {
109+ if (! $ global-> debug ) {
95110 return ;
96111 }
97112
98- if ($ config[ ' swaggerUi ' ][ ' panel ' ] ) {
113+ if ($ config-> swaggerUi -> panel ) {
99114 $ builder ->addDefinition ($ this ->prefix ('swaggerUi.panel ' ))
100115 ->setFactory (SwaggerUIPanel::class)
101- ->addSetup ('setUrl ' , [$ config[ ' swaggerUi ' ][ ' url ' ] ])
102- ->addSetup ('setExpansion ' , [$ config[ ' swaggerUi ' ][ ' expansion ' ] ])
103- ->addSetup ('setFilter ' , [$ config[ ' swaggerUi ' ][ ' filter ' ] ])
104- ->addSetup ('setTitle ' , [$ config[ ' swaggerUi ' ][ ' title ' ] ])
116+ ->addSetup ('setUrl ' , [$ config-> swaggerUi -> url ])
117+ ->addSetup ('setExpansion ' , [$ config-> swaggerUi -> expansion ])
118+ ->addSetup ('setFilter ' , [$ config-> swaggerUi -> filter ])
119+ ->addSetup ('setTitle ' , [$ config-> swaggerUi -> title ])
105120 ->setAutowired (false );
106121 }
107122 }
108123
109124 public function afterPluginCompile (ClassType $ class ): void
110125 {
111126 $ global = $ this ->compiler ->getExtension ()->getConfig ();
112- if ($ global[ ' debug ' ] !== true ) {
127+ if (! $ global-> debug ) {
113128 return ;
114129 }
115- $ config = $ this ->getConfig () ;
130+ $ config = $ this ->config ;
116131
117132 $ initialize = $ class ->getMethod ('initialize ' );
118- if ($ config[ ' swaggerUi ' ][ ' panel ' ] ) {
133+ if ($ config-> swaggerUi -> panel ) {
119134 $ initialize ->addBody ('$this->getService(?)->addPanel($this->getService(?)); ' , [
120135 'tracy.bar ' ,
121136 $ this ->prefix ('swaggerUi.panel ' ),
0 commit comments