user(); if (!$user || !$user->roles()->where('name', 'ROLE_ADMIN')->exists()) { return response()->json(['message' => 'Forbidden'], 403); } return null; } public function index(Request $request): JsonResponse { $ranks = Rank::query() ->orderBy('name') ->get() ->map(fn (Rank $rank) => [ 'id' => $rank->id, 'name' => $rank->name, 'badge_type' => $rank->badge_type, 'badge_text' => $rank->badge_text, 'badge_image_url' => $rank->badge_image_path ? Storage::url($rank->badge_image_path) : null, ]); return response()->json($ranks); } public function store(Request $request): JsonResponse { if ($error = $this->ensureAdmin($request)) { return $error; } $data = $request->validate([ 'name' => ['required', 'string', 'max:100', 'unique:ranks,name'], 'badge_type' => ['nullable', 'in:text,image'], 'badge_text' => ['nullable', 'string', 'max:40'], ]); $badgeType = $data['badge_type'] ?? 'text'; $badgeText = $badgeType === 'text' ? ($data['badge_text'] ?? $data['name']) : null; $rank = Rank::create([ 'name' => $data['name'], 'badge_type' => $badgeType, 'badge_text' => $badgeText, ]); return response()->json([ 'id' => $rank->id, 'name' => $rank->name, 'badge_type' => $rank->badge_type, 'badge_text' => $rank->badge_text, 'badge_image_url' => null, ], 201); } public function update(Request $request, Rank $rank): JsonResponse { if ($error = $this->ensureAdmin($request)) { return $error; } $data = $request->validate([ 'name' => ['required', 'string', 'max:100', "unique:ranks,name,{$rank->id}"], 'badge_type' => ['nullable', 'in:text,image'], 'badge_text' => ['nullable', 'string', 'max:40'], ]); $badgeType = $data['badge_type'] ?? $rank->badge_type ?? 'text'; $badgeText = $badgeType === 'text' ? ($data['badge_text'] ?? $rank->badge_text ?? $data['name']) : null; if ($badgeType === 'text' && $rank->badge_image_path) { Storage::disk('public')->delete($rank->badge_image_path); $rank->badge_image_path = null; } $rank->update([ 'name' => $data['name'], 'badge_type' => $badgeType, 'badge_text' => $badgeText, ]); return response()->json([ 'id' => $rank->id, 'name' => $rank->name, 'badge_type' => $rank->badge_type, 'badge_text' => $rank->badge_text, 'badge_image_url' => $rank->badge_image_path ? Storage::url($rank->badge_image_path) : null, ]); } public function destroy(Request $request, Rank $rank): JsonResponse { if ($error = $this->ensureAdmin($request)) { return $error; } if ($rank->badge_image_path) { Storage::disk('public')->delete($rank->badge_image_path); } $rank->delete(); return response()->json(null, 204); } public function uploadBadgeImage(Request $request, Rank $rank): JsonResponse { if ($error = $this->ensureAdmin($request)) { return $error; } $data = $request->validate([ 'file' => ['required', 'image', 'mimes:jpg,jpeg,png,gif,webp', 'max:2048'], ]); if ($rank->badge_image_path) { Storage::disk('public')->delete($rank->badge_image_path); } $path = $data['file']->store('rank-badges', 'public'); $rank->badge_type = 'image'; $rank->badge_text = null; $rank->badge_image_path = $path; $rank->save(); return response()->json([ 'id' => $rank->id, 'badge_type' => $rank->badge_type, 'badge_text' => $rank->badge_text, 'badge_image_url' => Storage::url($path), ]); } }