PackageImporter::getPackages()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 14
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 10
c 1
b 0
f 0
nc 3
nop 3
dl 0
loc 14
rs 9.9332
1
<?php
2
3
namespace App\Composer;
4
5
use App\Document\Package;
6
use App\Document\Provider;
7
use Composer\Config;
8
use Composer\IO\IOInterface;
9
use Composer\Package\Dumper\ArrayDumper;
10
use Composer\Repository\ComposerRepository;
11
use Composer\Repository\VcsRepository;
12
use Doctrine\ODM\MongoDB\DocumentManager;
13
14
class PackageImporter
15
{
16
    private $factory;
17
    private $dm;
18
    private $mirrorUrl;
19
    private $packageDumper;
20
21
    public function __construct(DocumentManager $dm, string $mirrorUrl, Factory $factory, PackageDumper $packageDumper)
22
    {
23
        $this->dm = $dm;
24
        $this->mirrorUrl = $mirrorUrl;
25
        $this->factory = $factory;
26
        $this->packageDumper = $packageDumper;
27
    }
28
29
    public function import(Provider $provider): bool
30
    {
31
        $config = $this->factory->createConfig();
32
        $io = new LogIO();
33
        $io->loadConfiguration($config);
34
35
        $packages = $this->getPackages($provider, $config, $io);
36
37
        if (0 == count($packages)) {
38
            return false;
39
        }
40
41
        $dumper = new ArrayDumper();
42
43
        $provider->clearPackages();
44
45
        $replace = [];
46
47
        foreach ($packages as $package) {
48
            $data = $dumper->dump($package);
49
            $data['uid'] = uniqid();
50
            unset($data['notification-url']);
51
52
            // get provided packages
53
            if(isset($data['replace'])) {
54
                $replace = array_unique(array_merge($replace, array_keys($data['replace'])));
55
            }
56
57
            $document = new Package();
58
            $document
59
                ->setVersion($package->getPrettyVersion())
60
                ->setData($data);
61
62
            $provider->addPackage($document);
63
        }
64
65
        $provider->setReplace($replace);
66
        $provider->setLogs($io->getLogs());
67
68
        $provider->setSha256(hash('sha256', json_encode($this->packageDumper->dump($provider))));
69
70
        return true;
71
    }
72
73
    public function updateReplaceProviderSignature(Provider $provider) :void
74
    {
75
        foreach ($provider->getReplace() as $replaceName) {
76
            /** @var Provider $replacePackage */
77
            $replacePackage = $this->dm->getRepository('App:Provider')->find($replaceName);
78
            if($replacePackage) {
79
                $replacePackage->setSha256(hash('sha256', json_encode($this->packageDumper->dump($replacePackage))));
80
            }
81
        }
82
    }
83
84
    /**
85
     * @param Provider    $provider
86
     * @param Config      $config
87
     * @param IOInterface $io
88
     *
89
     * @return \Composer\Package\Package[]
90
     */
91
    private function getPackages(Provider $provider, Config $config, IOInterface $io): array
92
    {
93
        switch ($provider->getType()) {
94
            case Provider::TYPE_COMPOSER:
95
                $repository = new ComposerRepository(['url' => $this->mirrorUrl], $io, $config);
96
                break;
97
            case Provider::TYPE_VCS:
98
                $repository = new VcsRepository(['url' => $provider->getVcsUri()], $io, $config);
99
                break;
100
            default:
101
                throw new \LogicException('Invalid provider type');
102
        }
103
104
        return $repository->findPackages($provider->getName());
105
    }
106
}
107