]> git.localhorst.tv Git - alttp.git/blob - app/Http/Controllers/TechniqueController.php
change footer
[alttp.git] / app / Http / Controllers / TechniqueController.php
1 <?php
2
3 namespace App\Http\Controllers;
4
5 use App\Models\Technique;
6 use App\Models\TechniqueMap;
7 use Illuminate\Database\Eloquent\Builder;
8 use Illuminate\Http\Request;
9
10 class TechniqueController extends Controller
11 {
12
13         public function byType(Request $request, $type) {
14                 $techs = Technique::where('index', true)->where('type', '=', $type);
15                 $this->applyFilter($request, $techs);
16                 return $techs->get()->toJson();
17         }
18
19         public function byTypeAndName(Request $request, $type, $name) {
20                 $tech = Technique::where('type', '=', $type)->where('name', '=', $name)->firstOrFail();
21                 $this->authorize('view', $tech);
22                 $tech->load(['chapters', 'relations']);
23                 return $tech->toJson();
24         }
25
26         public function forMap($map) {
27                 $techs = TechniqueMap::with(['technique', 'technique.relations'])->where('map', '=', $map);
28
29                 return $techs->get()->toJson();
30         }
31
32         public function search(Request $request) {
33                 $techs = Technique::where('index', '=', 1);
34                 $this->applyFilter($request, $techs);
35                 return $techs->get()->toJson();
36         }
37
38         public function single(Request $request, Technique $tech) {
39                 $this->authorize('view', $tech);
40                 $tech->load(['chapters', 'relations']);
41                 return $tech->toJson();
42         }
43
44         protected function applyFilter(Request $request, Builder $query) {
45                 $validatedData = $request->validate([
46                         'phrase' => 'string|nullable',
47                         'ruleset' => 'array|nullable',
48                         'ruleset.competitive' => 'boolean',
49                         'ruleset.mg' => 'boolean',
50                         'ruleset.nl' => 'boolean',
51                         'ruleset.owg' => 'boolean',
52                         'type' => 'string|nullable',
53                 ]);
54
55                 if (!empty($validatedData['type'])) {
56                         $query->where('type', '=', $validatedData['type']);
57                 }
58
59                 if (!empty($validatedData['phrase'])) {
60                         $search = $validatedData['phrase'];
61                         $query->where(function (Builder $query) use ($search) {
62                                 $query->where('title', 'LIKE', '%'.$search.'%')
63                                 ->orWhere('short', 'LIKE', '%'.$search.'%');
64                         });
65                 }
66
67                 if (isset($validatedData['ruleset'])) {
68                         $com = isset($validatedData['ruleset']['competitive']) && $validatedData['ruleset']['competitive'];
69                         $owg = isset($validatedData['ruleset']['owg']) && $validatedData['ruleset']['owg'];
70                         $mg = isset($validatedData['ruleset']['mg']) && $validatedData['ruleset']['mg'];
71                         $nl = isset($validatedData['ruleset']['nl']) && $validatedData['ruleset']['nl'];
72                         $any = $com || $owg || $mg || $nl;
73                         $all = $com && $owg && $mg && $nl;
74                         if ($any && !$all) {
75                                 $query->where(function(Builder $query) use ($com, $owg, $mg, $nl) {
76                                         $query->whereNull('rulesets');
77                                         if ($com) {
78                                                 $query->orWhere('rulesets->competitive', '=', true);
79                                         }
80                                         if ($owg) {
81                                                 $query->orWhere('rulesets->owg', '=', true);
82                                         }
83                                         if ($mg) {
84                                                 $query->orWhere('rulesets->mg', '=', true);
85                                         }
86                                         if ($nl) {
87                                                 $query->orWhere('rulesets->nl', '=', true);
88                                         }
89                                 });
90                         }
91                 }
92         }
93
94 }