Passed
Branch 3.0.0 (dcfee6)
by Pieter
02:48
created

ApieCore::getOpenApiSpecGenerator()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 8
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 10
rs 10
1
<?php
2
3
namespace W2w\Lib\Apie\Core;
4
5
use W2w\Lib\Apie\Apie;
6
use W2w\Lib\Apie\Core\Resources\ApiResources;
7
use W2w\Lib\Apie\OpenApiSchema\OpenApiSpecGenerator;
8
use W2w\Lib\Apie\OpenApiSchema\SchemaGenerator;
9
10
/**
11
 * Used by Apie to create the general Apie classes which you are not supposed to override in a plugin.
12
 *
13
 * @internal
14
 */
15
class ApieCore
16
{
17
    /**
18
     * @var Apie
19
     */
20
    private $apie;
21
22
    /**
23
     * @var ApiResourceRetriever|null
24
     */
25
    private $retriever;
26
27
    /**
28
     * @var ApiResourcePersister|null
29
     */
30
    private $persister;
31
32
    /**
33
     * @var ApiResourceMetadataFactory|null
34
     */
35
    private $metadataFactory;
36
37
    /**
38
     * @var IdentifierExtractor|null
39
     */
40
    private $identifierExtractor;
41
42
    /**
43
     * @var SchemaGenerator|null
44
     */
45
    private $schemaGenerator;
46
47
    public function __construct(Apie $apie)
48
    {
49
        $this->apie = $apie;
50
    }
51
52
    public function getOpenApiSpecGenerator(): OpenApiSpecGenerator
53
    {
54
        return new OpenApiSpecGenerator(
55
            new ApiResources($this->apie->getResources()),
56
            $this->getClassResourceConverter(),
57
            $this->apie->createInfo(),
58
            $this->getSchemaGenerator(),
59
            $this->getApiResourceMetadataFactory(),
60
            $this->getIdentifierExtractor(),
61
            ''
62
        );
63
    }
64
65
    public function getSchemaGenerator(): SchemaGenerator
66
    {
67
        if (!$this->schemaGenerator) {
68
            $this->schemaGenerator = new SchemaGenerator(
69
                $this->apie->getClassMetadataFactory(),
70
                $this->apie->getPropertyTypeExtractor(),
71
                $this->getClassResourceConverter(),
72
                $this->apie->getPropertyConverter()
73
            );
74
            foreach ($this->apie->getDefinedStaticData() as $class => $schema) {
75
                $this->schemaGenerator->defineSchemaForResource($class, $schema);
76
            }
77
            foreach ($this->apie->getDynamicSchemaLogic() as $class => $schema) {
78
                // TODO: make method in schema generator
79
            }
80
        }
81
        return $this->schemaGenerator;
82
    }
83
84
    public function getApiResourceFacade(): ApiResourceFacade
85
    {
86
        return new ApiResourceFacade(
87
            $this->getResourceRetriever(),
88
            $this->getResourcePersister(),
89
            $this->getClassResourceConverter(),
90
            $this->apie->getResourceSerializer(),
91
            $this->apie->getFormatRetriever()
92
        );
93
    }
94
95
    public function getResourceRetriever(): ApiResourceRetriever
96
    {
97
        if (!$this->retriever) {
98
            $this->retriever = new ApiResourceRetriever(
99
                $this->getApiResourceMetadataFactory()
100
            );
101
        }
102
        return $this->retriever;
103
    }
104
105
    public function getResourcePersister(): ApiResourcePersister
106
    {
107
        if (!$this->persister) {
108
            $this->persister = new ApiResourcePersister(
109
                $this->getApiResourceMetadataFactory()
110
            );
111
        }
112
        return $this->persister;
113
    }
114
115
    public function getApiResourceMetadataFactory(): ApiResourceMetadataFactory
116
    {
117
        if (!$this->metadataFactory) {
118
            $this->metadataFactory = new ApiResourceMetadataFactory(
119
                $this->apie->getAnnotationReader(),
120
                $this->apie->getApiResourceFactory()
121
            );
122
        }
123
        return $this->metadataFactory;
124
    }
125
126
    public function getIdentifierExtractor(): IdentifierExtractor
127
    {
128
        if (!$this->identifierExtractor) {
129
            $this->identifierExtractor = new IdentifierExtractor($this->apie->getPropertyAccessor());
130
        }
131
        return $this->identifierExtractor;
132
    }
133
134
    public function getClassResourceConverter(): ClassResourceConverter
135
    {
136
        return new ClassResourceConverter(
137
            $this->apie->getPropertyConverter(),
138
            new ApiResources($this->apie->getResources()),
139
            $this->apie->isDebug()
140
        );
141
    }
142
}
143