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', ]); if (!empty($validatedData['type'])) { $query->where('type', '=', $validatedData['type']); } if (!empty($validatedData['phrase'])) { $search = $validatedData['phrase']; $query->where(function (Builder $query) use ($search) { $query->where('title', 'LIKE', '%'.$search.'%') ->orWhere('short', 'LIKE', '%'.$search.'%'); }); } 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); } }); } } } }