SheetProcessUseCase::createCommands()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
cc 1
eloc 2
c 0
b 0
f 0
nc 1
nop 2
dl 0
loc 4
ccs 0
cts 0
cp 0
crap 2
rs 10
1
<?php declare(strict_types=1);
2
/*
3
 * This file is part of FlexPHP.
4
 *
5
 * (c) Freddie Gar <[email protected]>
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
namespace FlexPHP\Generator\Domain\UseCases;
11
12
use FlexPHP\Generator\Domain\Messages\Requests\CreateCommandFileRequest;
13
use FlexPHP\Generator\Domain\Messages\Requests\CreateConcreteGatewayFileRequest;
14
use FlexPHP\Generator\Domain\Messages\Requests\CreateConstraintFileRequest;
15
use FlexPHP\Generator\Domain\Messages\Requests\CreateControllerFileRequest;
16
use FlexPHP\Generator\Domain\Messages\Requests\CreateEntityFileRequest;
17
use FlexPHP\Generator\Domain\Messages\Requests\CreateFactoryFileRequest;
18
use FlexPHP\Generator\Domain\Messages\Requests\CreateFormTypeFileRequest;
19
use FlexPHP\Generator\Domain\Messages\Requests\CreateGatewayFileRequest;
20
use FlexPHP\Generator\Domain\Messages\Requests\CreateJavascriptFileRequest;
21
use FlexPHP\Generator\Domain\Messages\Requests\CreateRepositoryFileRequest;
22
use FlexPHP\Generator\Domain\Messages\Requests\CreateRequestFileRequest;
23 4
use FlexPHP\Generator\Domain\Messages\Requests\CreateResponseFileRequest;
24
use FlexPHP\Generator\Domain\Messages\Requests\CreateTemplateFileRequest;
25 4
use FlexPHP\Generator\Domain\Messages\Requests\CreateTranslateFileRequest;
26
use FlexPHP\Generator\Domain\Messages\Requests\CreateUseCaseFileRequest;
27 3
use FlexPHP\Generator\Domain\Messages\Requests\SheetProcessRequest;
28 3
use FlexPHP\Generator\Domain\Messages\Responses\CreateCommandFileResponse;
29 3
use FlexPHP\Generator\Domain\Messages\Responses\CreateConcreteGatewayFileResponse;
30
use FlexPHP\Generator\Domain\Messages\Responses\CreateConstraintFileResponse;
31 3
use FlexPHP\Generator\Domain\Messages\Responses\CreateControllerFileResponse;
32
use FlexPHP\Generator\Domain\Messages\Responses\CreateEntityFileResponse;
33 3
use FlexPHP\Generator\Domain\Messages\Responses\CreateFactoryFileResponse;
34 3
use FlexPHP\Generator\Domain\Messages\Responses\CreateFormTypeFileResponse;
35
use FlexPHP\Generator\Domain\Messages\Responses\CreateGatewayFileResponse;
36
use FlexPHP\Generator\Domain\Messages\Responses\CreateJavascriptFileResponse;
37 3
use FlexPHP\Generator\Domain\Messages\Responses\CreateRepositoryFileResponse;
38 3
use FlexPHP\Generator\Domain\Messages\Responses\CreateRequestFileResponse;
39
use FlexPHP\Generator\Domain\Messages\Responses\CreateResponseFileResponse;
40 3
use FlexPHP\Generator\Domain\Messages\Responses\CreateTemplateFileResponse;
41 3
use FlexPHP\Generator\Domain\Messages\Responses\CreateTranslateFileResponse;
42 3
use FlexPHP\Generator\Domain\Messages\Responses\CreateUseCaseFileResponse;
43
use FlexPHP\Generator\Domain\Messages\Responses\SheetProcessResponse;
44
use FlexPHP\Schema\Constants\Action;
45
use FlexPHP\Schema\Schema;
46 3
use FlexPHP\Schema\SchemaInterface;
47
48 3
final class SheetProcessUseCase
49 3
{
50 3
    public function execute(SheetProcessRequest $request): SheetProcessResponse
51
    {
52
        $name = $request->name;
53
        $schema = Schema::fromFile($request->path);
54
        $actions = [];
55
56
        $actions[] = $schema->hasAction(Action::INDEX) || $schema->hasAction(Action::FILTER) ? 'index' : null;
57
        $actions[] = $schema->hasAction(Action::CREATE) ? 'create' : null;
58
        $actions[] = $schema->hasAction(Action::READ) ? 'read' : null;
59 3
        $actions[] = $schema->hasAction(Action::UPDATE) || $schema->hasAction(Action::PATCH) ? 'update' : null;
60
        $actions[] = $schema->hasAction(Action::DELETE) ? 'delete' : null;
61 3
62 3
        if ($name === 'Users') {
63
            $actions = \array_merge($actions, ['login']);
64
        }
65
66
        $actions = \array_values(\array_filter($actions));
67
68
        $controller = $this->createController($schema, $actions);
69
        $entity = $this->createEntity($schema);
70
        $gateway = $this->createGateway($schema, $actions);
71
        $concreteGateway = $this->createConcreteGateway($schema, $actions);
72
        $factory = $this->createFactory($schema);
73
        $repository = $this->createRepository($schema, $actions);
74
        $constraint = $this->createConstraint($schema);
75
        $translate = $this->createTranslate($schema);
76
        $formType = $this->createFormType($schema);
77
        $requests = $this->createRequests($schema, $actions);
78
        $responses = $this->createResponses($schema, $actions);
79
        $useCases = $this->createUseCases($schema, $actions);
80
        $commands = $this->createCommands($schema, $actions);
81
        $templates = $this->createTemplates($schema);
82
        $javascript = null;
83
        $filterForm = null;
84
85
        if (!empty($schema->fkRelations())) {
86
            $javascript = $this->createJavascript($schema);
87
        }
88
89
        if ($schema->hasAction(Action::FILTER)) {
90
            $filterForm = $this->createFilterForm($schema);
91
        }
92
93
        return new SheetProcessResponse([
94
            'controller' => $controller->file,
95
            'entity' => $entity->file,
96
            'gateway' => $gateway->file,
97
            'concreteGateway' => $concreteGateway->file,
98
            'factory' => $factory->file,
99
            'repository' => $repository->file,
100
            'constraint' => $constraint->file,
101
            'translate' => $translate->file,
102
            'formType' => $formType->file,
103
            'requests' => $requests->files,
104
            'responses' => $responses->files,
105
            'useCases' => $useCases->files,
106
            'commands' => $commands->files,
107
            'templates' => $templates->files,
108
            'javascript' => $javascript->file ?? null,
109
            'filterForm' => $filterForm->file ?? null,
110
        ]);
111
    }
112
113
    private function createController(SchemaInterface $schema, array $actions): CreateControllerFileResponse
114
    {
115
        return (new CreateControllerFileUseCase())->execute(
116
            new CreateControllerFileRequest($schema, $actions)
117
        );
118
    }
119
120
    private function createConstraint(SchemaInterface $schema): CreateConstraintFileResponse
121
    {
122
        return (new CreateConstraintFileUseCase())->execute(
123
            new CreateConstraintFileRequest($schema)
124
        );
125
    }
126
127
    private function createTranslate(SchemaInterface $schema): CreateTranslateFileResponse
128
    {
129
        return (new CreateTranslateFileUseCase())->execute(
130
            new CreateTranslateFileRequest($schema)
131
        );
132
    }
133
134
    private function createFormType(SchemaInterface $schema): CreateFormTypeFileResponse
135
    {
136
        return (new CreateFormTypeFileUseCase())->execute(
137
            new CreateFormTypeFileRequest($schema)
138
        );
139
    }
140
141
    private function createFilterForm(SchemaInterface $schema): CreateFormTypeFileResponse
142
    {
143
        return (new CreateFilterFormFileUseCase())->execute(
144
            new CreateFormTypeFileRequest($schema)
145
        );
146
    }
147
148
    private function createEntity(SchemaInterface $schema): CreateEntityFileResponse
149
    {
150
        return (new CreateEntityFileUseCase())->execute(
151
            new CreateEntityFileRequest($schema)
152
        );
153
    }
154
155
    private function createGateway(SchemaInterface $schema, array $actions): CreateGatewayFileResponse
156
    {
157
        return (new CreateGatewayFileUseCase())->execute(
158
            new CreateGatewayFileRequest($schema, $actions)
159
        );
160
    }
161
162
    private function createConcreteGateway(SchemaInterface $schema, array $actions): CreateConcreteGatewayFileResponse
163
    {
164
        return (new CreateConcreteGatewayFileUseCase())->execute(
165
            new CreateConcreteGatewayFileRequest($schema, 'MySQL', $actions)
166
        );
167
    }
168
169
    private function createFactory(SchemaInterface $schema): CreateFactoryFileResponse
170
    {
171
        return (new CreateFactoryFileUseCase())->execute(
172
            new CreateFactoryFileRequest($schema)
173
        );
174
    }
175
176
    private function createRepository(SchemaInterface $schema, array $actions): CreateRepositoryFileResponse
177
    {
178
        return (new CreateRepositoryFileUseCase())->execute(
179
            new CreateRepositoryFileRequest($schema, $actions)
180
        );
181
    }
182
183
    private function createUseCases(SchemaInterface $schema, array $actions): CreateUseCaseFileResponse
184
    {
185
        return (new CreateUseCaseFileUseCase())->execute(
186
            new CreateUseCaseFileRequest($schema, $actions)
187
        );
188
    }
189
190
    private function createRequests(SchemaInterface $schema, array $actions): CreateRequestFileResponse
191
    {
192
        return (new CreateRequestFileUseCase())->execute(
193
            new CreateRequestFileRequest($schema, $actions)
194
        );
195
    }
196
197
    private function createResponses(SchemaInterface $schema, array $actions): CreateResponseFileResponse
198
    {
199
        return (new CreateResponseFileUseCase())->execute(
200
            new CreateResponseFileRequest($schema, $actions)
201
        );
202
    }
203
204
    private function createCommands(SchemaInterface $schema, array $actions): CreateCommandFileResponse
205
    {
206
        return (new CreateCommandFileUseCase())->execute(
207
            new CreateCommandFileRequest($schema, $actions)
208
        );
209
    }
210
211
    private function createTemplates(SchemaInterface $schema): CreateTemplateFileResponse
212
    {
213
        return (new CreateTemplateFileUseCase())->execute(
214
            new CreateTemplateFileRequest($schema)
215
        );
216
    }
217
218
    private function createJavascript(SchemaInterface $schema): CreateJavascriptFileResponse
219
    {
220
        return (new CreateJavascriptFileUseCase())->execute(
221
            new CreateJavascriptFileRequest($schema)
222
        );
223
    }
224
}
225