Passed
Push — master ( 2b4444...81848a )
by Dmitriy
03:31
created

ComposerController::index()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 20
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 13
c 1
b 0
f 0
dl 0
loc 20
ccs 0
cts 17
cp 0
rs 9.8333
cc 3
nc 3
nop 1
crap 12
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Yiisoft\Yii\Debug\Api\Controller;
6
7
use Exception;
8
use InvalidArgumentException;
9
use Psr\Http\Message\ResponseInterface;
10
use Psr\Http\Message\ServerRequestInterface;
11
use Yiisoft\Aliases\Aliases;
12
use Yiisoft\DataResponse\DataResponseFactoryInterface;
13
use Yiisoft\Yii\Debug\Api\Inspector\Command\BashCommand;
14
use Yiisoft\Yii\Debug\Api\Inspector\CommandResponse;
15
16
final class ComposerController
17
{
18
    public function __construct(
19
        private DataResponseFactoryInterface $responseFactory,
20
    ) {
21
    }
22
23
    public function index(Aliases $aliases): ResponseInterface
24
    {
25
        $composerJsonPath = $aliases->get('@root/composer.json');
26
        $composerLockPath = $aliases->get('@root/composer.lock');
27
        if (!file_exists($composerJsonPath)) {
28
            throw new Exception(
29
                sprintf(
30
                    'Could not find composer.json by the path "%s".',
31
                    $composerJsonPath,
32
                )
33
            );
34
        }
35
        $result = [
36
            'json' => json_decode(file_get_contents($composerJsonPath), true, 512, JSON_THROW_ON_ERROR),
37
            'lock' => file_exists($composerLockPath)
38
                ? json_decode(file_get_contents($composerLockPath), true, 512, JSON_THROW_ON_ERROR)
39
                : null,
40
        ];
41
42
        return $this->responseFactory->createResponse($result);
43
    }
44
45
    public function inspect(ServerRequestInterface $request, Aliases $aliases): ResponseInterface
46
    {
47
        $package = $request->getQueryParams()['package'] ?? null;
48
        if ($package === null) {
49
            throw new InvalidArgumentException(
50
                sprintf(
51
                    'Query parameter "package" should not be empty.'
52
                )
53
            );
54
        }
55
        $command = new BashCommand($aliases, ['composer', 'show', $package, '--all', '--format=json']);
56
        $result = $command->run();
57
58
        return $this->responseFactory->createResponse([
59
            'status' => $result->getStatus(),
60
            'result' => $result->getStatus() === CommandResponse::STATUS_OK
61
                ? json_decode($result->getResult(), true, 512, JSON_THROW_ON_ERROR)
62
                : null,
63
            'errors' => $result->getErrors(),
64
        ]);
65
    }
66
67
    public function require(ServerRequestInterface $request, Aliases $aliases): ResponseInterface
68
    {
69
        $package = $request->getParsedBody()['package'] ?? null;
70
        $version = $request->getParsedBody()['version'] ?? null;
71
        $isDev = $request->getParsedBody()['isDev'] ?? false;
72
        if ($package === null) {
73
            throw new InvalidArgumentException(
74
                sprintf(
75
                    'Query parameter "package" should not be empty.'
76
                )
77
            );
78
        }
79
        $packageWithVersion = sprintf('%s:%s', $package, $version ?? '*');
80
        $command = new BashCommand($aliases, [
81
            'composer',
82
            'require',
83
            $packageWithVersion,
84
            '-n',
85
            ...$isDev ? ['--dev'] : [],
86
        ]);
87
        $result = $command->run();
88
89
        return $this->responseFactory->createResponse([
90
            'status' => $result->getStatus(),
91
            'result' => $result->getStatus() === CommandResponse::STATUS_OK
92
                ? json_decode($result->getResult(), true, 512, JSON_THROW_ON_ERROR)
93
                : null,
94
            'errors' => $result->getErrors(),
95
        ]);
96
    }
97
}
98