Issues (28)

src/Controller/RepoController.php (1 issue)

Severity
1
<?php
2
3
namespace App\Controller;
4
5
use App\Composer\DistDownloader;
6
use App\Composer\PackageDumper;
7
use App\Composer\PackageImporter;
8
use App\Document\Download;
9
use App\Document\Provider;
10
use Doctrine\ODM\MongoDB\DocumentManager;
11
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
12
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
13
use Symfony\Component\HttpFoundation\BinaryFileResponse;
14
use Symfony\Component\HttpFoundation\Request;
15
use Symfony\Component\HttpFoundation\Response;
16
use Symfony\Component\Routing\Annotation\Route;
17
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
18
19
/**
20
 * Provide routes for composer.
21
 *
22
 * @Route("", name="repo_", defaults={"_format": "json"})
23
 */
24
class RepoController extends AbstractController
25
{
26
    /**
27
     * @Route("/packages.json", name="index")
28
     */
29
    public function index(DocumentManager $dm): Response
30
    {
31
        $rs = [
32
            'packages' => [],
33
            'providers' => $dm->getRepository('App:Provider')->getProvidersAndSha256(),
34
            'providers-url' => $this->generateCleanUrl('repo_provider', ['provider' => '%package%', 'hash' => '%hash%']),
35
            'search' => $this->generateCleanUrl('repo_search', ['q' => '%query%']),
36
            'notify-batch' => $this->generateCleanUrl('repo_notify_batch'),
37
            'mirrors' => [
38
                [
39
                    'dist-url' => $this->generateCleanUrl('repo_mirror', [
40
                        'package' => '%package%',
41
                        'version' => '%version%',
42
                        'reference' => '%reference%',
43
                        'type' => '%type%',
44
                    ]),
45
                    'preferred' => true,
46
                ],
47
            ],
48
        ];
49
50
        if ($this->isGranted('ROLE_MANAGER')) {
51
            $rs['providers-lazy-url'] = $this->generateCleanUrl('repo_lazy', ['package' => '%package%']);
52
        }
53
54
        return $this->json($rs);
55
    }
56
57
    /**
58
     * @Route("/p/search.json", name="search")
59
     */
60
    public function search(Request $request, DocumentManager $dm): Response
61
    {
62
        $query = $request->get('q');
63
        $providers = $dm->getRepository('App:Provider')->search(1, $query);
64
65
        $rs = [];
66
67
        /** @var \App\Document\Provider $provider */
68
        foreach ($providers as $provider) {
69
            $rs[] = [
70
                'name' => $provider->getName(),
71
                'description' => $provider->getDescription(),
72
                'downloads' => $provider->getDownloads(),
73
            ];
74
        }
75
76
        return $this->json(['results' => $rs]);
77
    }
78
79
    /**
80
     * @Route("/p/downloads", name="notify_batch")
81
     */
82
    public function notifyBatch(Request $request, DocumentManager $dm): Response
83
    {
84
        $downloads = json_decode($request->getContent(), true);
85
86
        if (isset($downloads['downloads'])) {
87
            foreach ($downloads['downloads'] as $package) {
88
                /** @var Provider $provider */
89
                $provider = $dm->getRepository('App:Provider')->find($package['name']);
90
91
                if (!$provider) {
92
                    continue;
93
                }
94
                $provider->setDownloads($provider->getDownloads() + 1);
95
96
                if ($package['name'] && $package['version']) {
97
                    $download = new Download();
98
                    $download
99
                        ->setDate(new \DateTime())
100
                        ->setProvider($package['name'])
101
                        ->setVersion($package['version']);
102
103
                    $dm->persist($download);
104
                }
105
            }
106
107
            $dm->flush();
108
        }
109
110
        return new Response('', Response::HTTP_OK);
111
    }
112
113
    /**
114
     * @Route("/p/dist/{package}/{version}/{reference}.{type}", name="mirror", requirements={"package": ".+"})
115
     */
116
    public function mirror(string $package, string $version, string $reference, string $type, DistDownloader $distDownloader): Response
117
    {
118
        $file = $distDownloader->download($package, $version, $reference, $type);
119
120
        return new BinaryFileResponse($file);
121
    }
122
123
    /**
124
     * @Route("/p/{provider}${hash}.json", name="provider", requirements={"provider": ".+"})
125
     */
126
    public function provider(Provider $provider, $hash, PackageDumper $packageDumper): Response
0 ignored issues
show
The parameter $hash is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

126
    public function provider(Provider $provider, /** @scrutinizer ignore-unused */ $hash, PackageDumper $packageDumper): Response

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
127
    {
128
        return new Response(json_encode($packageDumper->dump($provider)));
129
    }
130
131
    /**
132
     * @Route("/p/{package}.json", name="lazy", requirements={"package": ".+"})
133
     * @IsGranted("ROLE_MANAGER")
134
     */
135
    public function providerLazy($package, PackageImporter $packageImporter, DocumentManager $dm, PackageDumper $packageDumper): Response
136
    {
137
        $provider = new Provider();
138
        $provider->setType(Provider::TYPE_COMPOSER);
139
        $provider->setName($package);
140
141
        if (!$packageImporter->import($provider)) {
142
            throw $this->createNotFoundException();
143
        }
144
145
        $dm->persist($provider);
146
        $dm->flush();
147
148
        $packageImporter->updateReplaceProviderSignature($provider);
149
        $dm->flush();
150
151
        return new Response(json_encode($packageDumper->dump($provider)));
152
    }
153
154
    private function generateCleanUrl(string $route, array $parameters = [], int $referenceType = UrlGeneratorInterface::ABSOLUTE_URL): string
155
    {
156
        $url = $this->generateUrl($route, $parameters, $referenceType);
157
158
        return strtr($url, ['%25' => '%', '%24' => '$']);
159
    }
160
}
161