Completed
Push — master ( 20d2a7...83241b )
by Anton
01:20
created

Http/Controllers/Api/Requirements/Post/Action.php (1 issue)

Labels
Severity

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
/*
4
 * This file is part of Laravel Paket.
5
 *
6
 * (c) Anton Komarev <[email protected]>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
declare(strict_types=1);
13
14
namespace Cog\Laravel\Paket\Http\Controllers\Api\Requirements\Post;
15
16
use Cog\Contracts\Paket\Job\Repositories\JobRepository as JobRepositoryContract;
17
use Cog\Laravel\Paket\Job\Entities\Job;
18
use Cog\Laravel\Paket\Requirement\Entities\Requirement;
19
use Cog\Laravel\Paket\Requirement\Events\RequirementInstalling;
20
use Cog\Laravel\Paket\Support\Composer;
21
use Illuminate\Contracts\Support\Responsable as ResponsableContract;
22
use Illuminate\Support\Arr;
23
use Illuminate\Validation\ValidationException;
24
use MCStreetguy\ComposerParser\Factory as ComposerParser;
25
26
final class Action
27
{
28
    public function __invoke(JobRepositoryContract $jobs, Composer $composer, Request $request): ResponsableContract
29
    {
30
        $name = $request->input('name');
31
        $version = $request->input('version');
32
        $isDevelopment = (bool) $request->input('isDevelopment');
33
34
        $requirement = new Requirement($name, $version, $isDevelopment);
0 ignored issues
show
It seems like $name defined by $request->input('name') on line 30 can also be of type array or null; however, Cog\Laravel\Paket\Requir...uirement::__construct() does only seem to accept string, maybe add an additional type check?

If a method or function can return multiple different values and unless you are sure that you only can receive a single value in this context, we recommend to add an additional type check:

/**
 * @return array|string
 */
function returnsDifferentValues($x) {
    if ($x) {
        return 'foo';
    }

    return array();
}

$x = returnsDifferentValues($y);
if (is_array($x)) {
    // $x is an array.
}

If this a common case that PHP Analyzer should handle natively, please let us know by opening an issue.

Loading history...
35
36
        $installedRequirements = $this->getInstalledRequirements();
37
38
        $installedRequirement = Arr::first($installedRequirements, function (array $value) use ($name) {
39
            return $value['name'] === $name;
40
        });
41
42
        if (!is_null($installedRequirement)) {
43
            if ($version === $installedRequirement['version'] && $installedRequirement['isDevelopment'] === $isDevelopment) {
44
                $error = ValidationException::withMessages([
45
                    'name' => [
46
                        "Package `{$name}` v{$version} already installed",
47
                    ],
48
                ]);
49
                throw $error;
50
            }
51
        }
52
53
        $job = Job::ofType('ComposerInstall');
54
55
        $jobs
56
            ->store($job, $requirement);
57
58
        event(new RequirementInstalling($requirement, $job));
59
60
        return new Response($requirement, $job);
61
    }
62
63
    private function getInstalledRequirements(): array
64
    {
65
        $lockFile = ComposerParser::parseLockfile(base_path('composer.lock'));
66
67
        $packages = $lockFile->getPackages()->getData();
68
        $devPackages = $lockFile->getPackagesDev()->getData();
69
70
        foreach ($packages as &$package) {
71
            $package['isDevelopment'] = false;
72
        }
73
        foreach ($devPackages as &$package) {
74
            $package['isDevelopment'] = true;
75
        }
76
77
        return array_merge($packages, $devPackages);
78
    }
79
}
80