Completed
Push — master ( 80501b...32cadd )
by Matt
05:48
created

ProblemController::throw()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 2
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 3
rs 10
1
<?php
2
3
namespace App\Controller\Admin;
4
5
use App\Entity\Wander;
6
use App\Repository\ImageRepository;
7
use App\Repository\ProblemRepository;
8
use App\Repository\WanderRepository;
9
use App\Service\ProblemService;
10
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
11
use Symfony\Component\HttpFoundation\Request;
12
use Symfony\Component\HttpFoundation\Response;
13
use Symfony\Component\Routing\Annotation\Route;
14
15
/**
16
 * @Route("/admin/problems", name="admin_problems_")
17
 */
18
class ProblemController extends AbstractController
19
{
20
    /**
21
     * @Route("/", name="index", methods={"GET"})
22
     */
23
    public function index(
24
        WanderRepository $wanderRepository,
25
        ImageRepository $imageRepository,
26
        ProblemRepository $problemRepository
27
        ): Response
28
    {
29
        // Problems that might take time/resources to find, that are
30
        // popped into a table on specific demand rather than every
31
        // time we load this page:
32
        $builtProblems = $problemRepository->findAll();
33
34
        // TODO: Might be sensible to do everything here into the problems
35
        // table, depending on how much we add to this.
36
        // Other issues, found on the fly:
37
        $qb = $wanderRepository->createQueryBuilder('w');
38
39
        // TODO: This doesn't work, as e.g. keywords being an empty array
40
        //
41
        $problems = $qb
42
            ->join('w.images', 'i')
43
            ->select('w AS wander')
44
            ->addSelect('COUNT(i) AS image_count')
45
            ->addSelect('SUM(CASE WHEN i.title IS NULL THEN 1 ELSE 0 END) AS no_title')
46
            ->addSelect('SUM(CASE WHEN i.latlng IS NULL THEN 1 ELSE 0 END) AS no_latlng')
47
            ->addSelect('SUM(CASE WHEN i.location IS NULL THEN 1 ELSE 0 END) AS no_location')
48
            ->addSelect('SUM(CASE WHEN i.rating IS NULL OR i.rating = 0 THEN 1 ELSE 0 END) AS no_rating')
49
            // TODO: This is a hideous bodge and will break when we finally give in and move
50
            // keywords and auto-tags to being related entities rather than a dirty PHP
51
            // array, but it's good enough for a problem admin page for now.
52
            //->addSelect("SUM(CASE WHEN i.keywords IS NULL OR i.keywords = 'a:0:{}' THEN 1 ELSE 0 END) AS no_keywords")
53
            ->addSelect("SUM(CASE WHEN i.tags is empty THEN 1 ELSE 0 END) AS no_tags")
54
            ->addSelect("SUM(CASE WHEN i.auto_tags IS NULL OR i.auto_tags = 'a:0:{}' THEN 1 ELSE 0 END) AS no_auto_tags")
55
56
            ->addSelect(
57
                "(SUM(CASE WHEN i.title IS NULL THEN 1 ELSE 0 END)) + " .
58
                "(SUM(CASE WHEN i.latlng IS NULL THEN 1 ELSE 0 END)) + " .
59
                "(SUM(CASE WHEN i.location IS NULL THEN 1 ELSE 0 END)) + " .
60
                "(SUM(CASE WHEN i.rating IS NULL OR i.rating = 0 THEN 1 ELSE 0 END)) + " .
61
                "(SUM(CASE WHEN i.tags is empty THEN 1 ELSE 0 END)) AS total_problems_excl_auto")
62
            ->addSelect(
63
                "(SUM(CASE WHEN i.title IS NULL THEN 1 ELSE 0 END)) + " .
64
                "(10 * SUM(CASE WHEN i.latlng IS NULL THEN 1 ELSE 0 END)) + " .
65
                "(2 * SUM(CASE WHEN i.location IS NULL THEN 1 ELSE 0 END)) + " .
66
                "(5 * SUM(CASE WHEN i.rating IS NULL OR i.rating = 0 THEN 1 ELSE 0 END)) + " .
67
                "(0.01 * SUM(CASE WHEN i.tags is empty THEN 1 ELSE 0 END)) + " .
68
                "(0.001 * SUM(CASE WHEN i.auto_tags IS NULL OR i.auto_tags = 'a:0:{}' THEN 1 ELSE 0 END)) AS weighted_problem_score")
69
            ->addGroupBy('w')
70
            ->having('no_title > 0')
71
            ->orHaving('no_latlng > 0')
72
            ->orHaving('no_location > 0')
73
            ->orHaving('no_tags > 0')
74
            ->orHaving('no_auto_tags > 0')
75
            ->orderBy('weighted_problem_score', 'desc')
76
            ->getQuery()
77
            ->getResult();
78
79
        $orphans = $imageRepository->findWithNoWander();
80
81
        return $this->render('admin/problems/index.html.twig', [
82
            'problems' => $problems,
83
            'orphans' => $orphans,
84
            'built_problems' => $builtProblems
85
        ]);
86
    }
87
88
    /**
89
     * @Route("/regenerate", name="regenerate", methods={"POST"})
90
     */
91
    public function regenerateProblems(Request $request, ProblemService $problemService): Response
92
    {
93
        if ($this->isCsrfTokenValid('problems_regenerate', $request->request->get('_token'))) {
94
            $problemService->createProblemReport();
95
        }
96
97
        return $this->redirectToRoute('admin_problems_index');
98
    }
99
100
101
    // TODO: These all share a lot of things in common, but I'm not sure
102
    // how much this is going to get used, so I'm keeping it fairly brain-dead
103
    // for now. Revisit later.
104
105
    /**
106
     * @Route("/no_title/wander/{id}", name="no_title", methods={"GET"})
107
     */
108
    public function noTitle(Wander $wander): Response
109
    {
110
        return $this->render('admin/problems/no_title.html.twig', [
111
            'wander' => $wander
112
        ]);
113
    }
114
    /**
115
     * @Route("/no_latlng/wander/{id}", name="no_latlng", methods={"GET"})
116
     */
117
    public function noLatlng(Wander $wander): Response
118
    {
119
        return $this->render('admin/problems/no_latlng.html.twig', [
120
            'wander' => $wander
121
        ]);
122
    }
123
    /**
124
     * @Route("/no_location/wander/{id}", name="no_location", methods={"GET"})
125
     */
126
    public function noLocation(Wander $wander): Response
127
    {
128
        return $this->render('admin/problems/no_location.html.twig', [
129
            'wander' => $wander
130
        ]);
131
    }
132
    /**
133
     * @Route("/no_rating/wander/{id}", name="no_rating", methods={"GET"})
134
     */
135
    public function noRating(Wander $wander): Response
136
    {
137
        return $this->render('admin/problems/no_rating.html.twig', [
138
            'wander' => $wander
139
        ]);
140
    }
141
142
    /**
143
     * @Route("/no_tags/wander/{id}", name="no_tags", methods={"GET"})
144
     */
145
    public function noTags(Wander $wander): Response
146
    {
147
        return $this->render('admin/problems/no_tags.html.twig', [
148
            'wander' => $wander
149
        ]);
150
    }
151
152
    /**
153
     * @Route("/no_auto_tags/wander/{id}", name="no_auto_tags", methods={"GET"})
154
     */
155
    public function noAutoTags(Wander $wander): Response
156
    {
157
        return $this->render('admin/problems/no_auto_tags.html.twig', [
158
            'wander' => $wander
159
        ]);
160
    }
161
162
    /**
163
     * @Route("/broken_links", name="broken_links", methods={"GET"})
164
     */
165
    public function brokenLinks(ProblemRepository $problemRepository): Response
166
    {
167
        $problems = $problemRepository->findAll();
168
        return $this->render('admin/problems/broken_links.html.twig', [
169
            'problems' => $problems
170
        ]);
171
    }
172
}
173