namespace App\Http\Controllers;
use App\Models\Technique;
+use App\Models\TechniqueMap;
+use App\Models\TechniqueTranslation;
use Illuminate\Database\Eloquent\Builder;
+use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Http\Request;
class TechniqueController extends Controller
{
+ public function byType(Request $request, $type) {
+ $techs = Technique::where('index', true)->where('type', '=', $type);
+ $this->applyFilter($request, $techs);
+ return $techs->get()->toJson();
+ }
+
+ public function byTypeAndName(Request $request, $type, $name) {
+ $tech = Technique::where('type', '=', $type)->where('name', '=', $name)->firstOrFail();
+ $this->authorize('view', $tech);
+ $tech->load(['chapters', 'relations']);
+ return $tech->toJson();
+ }
+
+ public function forMap($map) {
+ $techs = TechniqueMap::with(['technique', 'technique.relations'])->where('map', '=', $map);
+
+ return $techs->get()->toJson();
+ }
+
public function search(Request $request) {
+ $techs = Technique::where('index', '=', 1);
+ $this->applyFilter($request, $techs);
+ return $techs->get()->toJson();
+ }
+
+ public function single(Request $request, Technique $tech) {
+ $this->authorize('view', $tech);
+ $tech->load(['chapters', 'relations']);
+ return $tech->toJson();
+ }
+
+ public function update(Request $request, Technique $content) {
+ $this->authorize('update', $content);
+
+ $validatedData = $request->validate([
+ 'attribution' => 'string',
+ 'description' => 'string',
+ 'language' => 'string|in:de,en',
+ 'parent_id' => 'integer|exists:App\\Models\\Technique,id',
+ 'short' => 'string',
+ 'title' => 'string',
+ ]);
+
+ if ($validatedData['language'] == 'en') {
+ $this->applyLocalizedValues($validatedData, $content);
+ $content->save();
+ } else {
+ $translation = $this->getTranslation($content, $validatedData['language']);
+ $this->applyLocalizedValues($validatedData, $translation);
+ $translation->save();
+ }
+
+ $result = isset($validatedData['parent_id']) ? Technique::findOrFail($validatedData['parent_id']) : $content->fresh();
+ $result->load(['chapters', 'relations']);
+ return $result->toJson();
+ }
+
+ public function web(Request $request, $type, $name) {
+ $tech = Technique::where('type', '=', $type)->where('name', '=', $name)->first();
+ if ($tech) {
+ $view = view('app')
+ ->with('title', $tech->getTranslatedProperty('title'))
+ ->with('description', $tech->getTranslatedProperty('short'));
+ if ($tech->image) {
+ $view = $view->with('image', url($tech->image));
+ } else if ($tech->gif) {
+ $view = $view->with('image', url($tech->gif));
+ }
+ return $view;
+ }
+ $url_map = [
+ 'dungeon' => 'dungeons',
+ 'location' => 'locations',
+ 'mode' => 'modes',
+ 'ruleset' => 'rulesets',
+ 'tech' => 'tech',
+ ];
+ $tech = Technique::where('name', '=', $name)->whereIn('type', array_keys($url_map))->first();
+ if ($tech && isset($url_map[$tech->type])) {
+ return redirect('/'.$url_map[$tech->type].'/'.$tech->name);
+ }
+ throw new ModelNotFoundException();
+ }
+
+ private function applyLocalizedValues($validatedData, $content) {
+ foreach (['attribution', 'description', 'short', 'title'] as $name) {
+ if (isset($validatedData[$name])) {
+ $content->{$name} = $validatedData[$name];
+ }
+ }
+ }
+
+ private function getTranslation(Technique $content, $language) {
+ foreach ($content->translations as $translation) {
+ if ($translation->locale == $language) {
+ return $translation;
+ }
+ }
+ $translation = new TechniqueTranslation();
+ $translation->technique_id = $content->id;
+ $translation->locale = $language;
+ return $translation;
+ }
+
+ protected function applyFilter(Request $request, Builder $query) {
$validatedData = $request->validate([
'phrase' => 'string|nullable',
+ 'ruleset' => 'array|nullable',
+ 'ruleset.competitive' => 'boolean',
+ 'ruleset.mg' => 'boolean',
+ 'ruleset.nl' => 'boolean',
+ 'ruleset.owg' => 'boolean',
'type' => 'string|nullable',
]);
- $techs = Technique::where('index', '=', 1);
-
if (!empty($validatedData['type'])) {
- $techs = $techs->where('type', '=', $validatedData['type']);
+ $query->where('type', '=', $validatedData['type']);
}
if (!empty($validatedData['phrase'])) {
$search = $validatedData['phrase'];
- $techs = $techs->where(function (Builder $query) use ($search) {
+ $query->where(function (Builder $query) use ($search) {
$query->where('title', 'LIKE', '%'.$search.'%')
->orWhere('short', 'LIKE', '%'.$search.'%');
});
}
- return $techs->get()->toJson();
- }
-
- public function single(Request $request, Technique $tech) {
- $this->authorize('view', $tech);
- $tech->load('chapters');
- return $tech->toJson();
+ if (isset($validatedData['ruleset'])) {
+ $com = isset($validatedData['ruleset']['competitive']) && $validatedData['ruleset']['competitive'];
+ $owg = isset($validatedData['ruleset']['owg']) && $validatedData['ruleset']['owg'];
+ $mg = isset($validatedData['ruleset']['mg']) && $validatedData['ruleset']['mg'];
+ $nl = isset($validatedData['ruleset']['nl']) && $validatedData['ruleset']['nl'];
+ $any = $com || $owg || $mg || $nl;
+ $all = $com && $owg && $mg && $nl;
+ if ($any && !$all) {
+ $query->where(function(Builder $query) use ($com, $owg, $mg, $nl) {
+ $query->whereNull('rulesets');
+ if ($com) {
+ $query->orWhere('rulesets->competitive', '=', true);
+ }
+ if ($owg) {
+ $query->orWhere('rulesets->owg', '=', true);
+ }
+ if ($mg) {
+ $query->orWhere('rulesets->mg', '=', true);
+ }
+ if ($nl) {
+ $query->orWhere('rulesets->nl', '=', true);
+ }
+ });
+ }
+ }
}
}