Test Failed
Pull Request — master (#58)
by Dmitriy
02:36
created

DefaultController::generate()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 19
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
eloc 14
c 0
b 0
f 0
dl 0
loc 19
ccs 0
cts 14
cp 0
rs 9.7998
cc 2
nc 2
nop 1
crap 6
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Yii\Gii\Controller;
6
7
use Exception;
8
use Psr\Http\Message\ResponseInterface;
9
use Throwable;
10
use Yiisoft\DataResponse\DataResponse;
11
use Yiisoft\DataResponse\DataResponseFactoryInterface;
12
use Yiisoft\Http\Status;
13
use Yiisoft\RequestModel\Attribute\Query;
14
use Yiisoft\Yii\Gii\CodeFile;
15
use Yiisoft\Yii\Gii\CodeFileSaver;
16
use Yiisoft\Yii\Gii\Exception\InvalidGeneratorCommandException;
17
use Yiisoft\Yii\Gii\Generator\AbstractGenerator;
18
use Yiisoft\Yii\Gii\GeneratorInterface;
19
use Yiisoft\Yii\Gii\Request\GeneratorRequest;
20
21
final class DefaultController
22
{
23
    public function __construct(private DataResponseFactoryInterface $responseFactory)
24
    {
25
    }
26
27
    public function get(GeneratorRequest $request): ResponseInterface
28
    {
29
        $generator = $request->getGenerator();
30
        $params = [
31
            'name' => $generator::getName(),
32
            'description' => $generator::getDescription(),
33
            'commandClass' => $generator::getCommandClass(),
34
            //            'templatePath' => $generator->getTemplatePath(),
35
            //            'templates' => $generator->getTemplates(),
36
            'directory' => $generator->getDirectory(),
37
        ];
38
39
        return $this->responseFactory->createResponse($params);
40
    }
41
42
    public function generate(GeneratorRequest $request, CodeFileSaver $codeFileSaver): ResponseInterface
43
    {
44
        /** @var GeneratorInterface $generator */
45
        $generator = $request->getGenerator();
46
        $command = new ($generator::getCommandClass())();
0 ignored issues
show
Bug introduced by
A parse error occurred: Syntax error, unexpected '(' on line 46 at column 23
Loading history...
47
        $answers = $request->getAnswers();
48
        try {
49
            $files = $generator->generate($command);
50
        } catch (InvalidGeneratorCommandException $e) {
51
            return $this->createErrorResponse($e);
52
        }
53
        $params = [];
54
        $results = [];
55
        $params['hasError'] = !$codeFileSaver->save($command, $files, (array) $answers, $results);
56
        $params['results'] = $results;
57
        return $this->responseFactory->createResponse($params);
58
    }
59
60
    public function preview(GeneratorRequest $request, #[Query('file')] ?string $file = null): ResponseInterface
61
    {
62
        /** @var GeneratorInterface $generator */
63
        $generator = $request->getGenerator();
64
        $command = new ($generator::getCommandClass())();
65
        try {
66
            $files = $generator->generate($command);
67
        } catch (InvalidGeneratorCommandException $e) {
68
            return $this->createErrorResponse($e);
69
        }
70
        if ($file !== null) {
71
            foreach ($files as $generatedFile) {
72
                if ($generatedFile->getId() === $file) {
73
                    $content = $generatedFile->preview();
74
                    return $this->responseFactory->createResponse(
75
                        ['content' => $content ?: 'Preview is not available for this file type.']
76
                    );
77
                }
78
            }
79
            return $this->responseFactory->createResponse(
80
                ['message' => "Code file not found: $file"],
81
                Status::UNPROCESSABLE_ENTITY
82
            );
83
        }
84
        return $this->responseFactory->createResponse(['files' => $files, 'operations' => CodeFile::OPERATIONS_MAP]);
85
    }
86
87
    public function diff(GeneratorRequest $request, #[Query('file')] string $file): ResponseInterface
88
    {
89
        /** @var GeneratorInterface $generator */
90
        $generator = $request->getGenerator();
91
        $command = new ($generator::getCommandClass())();
92
        try {
93
            $files = $generator->generate($command);
94
        } catch (InvalidGeneratorCommandException $e) {
95
            return $this->createErrorResponse($e);
96
        }
97
98
        foreach ($files as $generatedFile) {
99
            if ($generatedFile->getId() === $file) {
100
                return $this->responseFactory->createResponse(['diff' => $generatedFile->diff()]);
101
            }
102
        }
103
        return $this->responseFactory->createResponse(
104
            ['message' => "Code file not found: $file"],
105
            Status::UNPROCESSABLE_ENTITY
106
        );
107
    }
108
109
    private function createErrorResponse(InvalidGeneratorCommandException $e): DataResponse
110
    {
111
        return $this->responseFactory->createResponse(
112
        // TODO: fix
113
            ['errors' => $e->getResult()->getErrorMessagesIndexedByAttribute()],
114
            Status::UNPROCESSABLE_ENTITY
115
        );
116
    }
117
}
118