Passed
Pull Request — main (#442)
by MusikAnimal
08:42 queued 04:18
created

LargestPagesController::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
nc 1
nop 3
dl 0
loc 5
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types = 1);
4
5
namespace App\Controller;
6
7
use App\Model\LargestPages;
8
use App\Repository\LargestPagesRepository;
9
use Symfony\Component\HttpFoundation\JsonResponse;
10
use Symfony\Component\HttpFoundation\Response;
11
use Symfony\Component\Routing\Annotation\Route;
12
13
/**
14
 * This controller serves the search form and results for the Largest Pages tool.
15
 * @codeCoverageIgnore
16
 */
17
class LargestPagesController extends XtoolsController
18
{
19
    /**
20
     * Get the name of the tool's index route. This is also the name of the associated model.
21
     * @return string
22
     * @codeCoverageIgnore
23
     */
24
    public function getIndexRoute(): string
25
    {
26
        return 'LargestPages';
27
    }
28
29
    /**
30
     * The search form.
31
     * @Route("/largestpages", name="LargestPages")
32
     * @return Response
33
     */
34
    public function indexAction(): Response
35
    {
36
        // Redirect if required params are given.
37
        if (isset($this->params['project'])) {
38
            return $this->redirectToRoute('LargestPagesResult', $this->params);
39
        }
40
41
        return $this->render('largestPages/index.html.twig', array_merge([
42
            'xtPage' => 'LargestPages',
43
            'xtPageTitle' => 'tool-largestpages',
44
            'xtSubtitle' => 'tool-largestpages-desc',
45
46
            // Defaults that will get overriden if in $this->params.
47
            'project' => $this->project,
48
            'namespace' => 'all',
49
            'include_pattern' => '',
50
            'exclude_pattern' => '',
51
        ], $this->params));
52
    }
53
54
    /**
55
     * Instantiate a LargestPages object.
56
     * @param LargestPagesRepository $largestPagesRepo
57
     * @return LargestPages
58
     */
59
    protected function getLargestPages(LargestPagesRepository $largestPagesRepo): LargestPages
60
    {
61
        $this->params['include_pattern'] = $this->request->get('include_pattern', '');
62
        $this->params['exclude_pattern'] = $this->request->get('exclude_pattern', '');
63
        $largestPages = new LargestPages(
64
            $largestPagesRepo,
65
            $this->project,
66
            $this->namespace,
67
            $this->params['include_pattern'],
68
            $this->params['exclude_pattern']
69
        );
70
        $largestPages->setRepository($largestPagesRepo);
71
        return $largestPages;
72
    }
73
74
    /**
75
     * Display the largest pages on the requested project.
76
     * @Route(
77
     *     "/largestpages/{project}/{namespace}",
78
     *     name="LargestPagesResult",
79
     *     defaults={
80
     *         "namespace"="all"
81
     *     }
82
     * )
83
     * @param LargestPagesRepository $largestPagesRepo
84
     * @return Response
85
     * @codeCoverageIgnore
86
     */
87
    public function resultsAction(LargestPagesRepository $largestPagesRepo): Response
88
    {
89
        $ret = [
90
            'xtPage' => 'LargestPages',
91
            'xtTitle' => $this->project->getDomain(),
92
            'lp' => $this->getLargestPages($largestPagesRepo),
93
        ];
94
95
        return $this->getFormattedResponse('largestPages/result', $ret);
96
    }
97
98
    /************************ API endpoints ************************/
99
100
    /**
101
     * Get the largest pages on the requested project.
102
     * @Route(
103
     *     "/api/project/largest_pages/{project}/{namespace}",
104
     *     name="ProjectApiLargestPages",
105
     *     defaults={
106
     *         "namespace"="all"
107
     *     }
108
     * )
109
     * @param LargestPagesRepository $largestPagesRepo
110
     * @return JsonResponse
111
     */
112
    public function resultsApiAction(LargestPagesRepository $largestPagesRepo): JsonResponse
113
    {
114
        $this->recordApiUsage('project/largest_pages');
115
        $lp = $this->getLargestPages($largestPagesRepo);
116
117
        $pages = [];
118
        foreach ($lp->getResults() as $index => $page) {
119
            $pages[] = [
120
                'rank' => $index + 1,
121
                'page_title' => $page->getTitle(true),
122
                'length' => $page->getLength(),
123
            ];
124
        }
125
126
        return $this->getFormattedApiResponse([
127
            'pages' => $pages,
128
        ]);
129
    }
130
}
131