with(['categories', 'latestStableVersion']); if ($type = $request->query('type')) { $query->where('type', $type); } if ($status = $request->query('status')) { $query->where('status', $status); } if ($keyword = trim((string) $request->query('keyword', ''))) { $query->where(function ($q) use ($keyword) { $q->where('name', 'like', '%' . $keyword . '%') ->orWhere('slug', 'like', '%' . $keyword . '%') ->orWhere('summary', 'like', '%' . $keyword . '%'); }); } $result = $query->orderByDesc('sort_order')->orderByDesc('updated_at') ->paginate(min(max((int) $request->query('size', 20), 1), 100)); return response()->json([ 'code' => 0, 'message' => 'ok', 'data' => [ 'page' => $result->currentPage(), 'size' => $result->perPage(), 'total' => $result->total(), 'items' => collect($result->items())->map(fn ($package) => RepoFormatter::packageDetail($package))->values()->all(), ], ]); } public function store(StorePackageRequest $request): JsonResponse { $package = $this->service->createPackage($request->validated()); return response()->json([ 'code' => 0, 'message' => 'package created', 'data' => RepoFormatter::packageDetail($package->load(['versions', 'screenshots', 'categories'])), ], 201); } public function update(StorePackageRequest $request, string $type, string $slug): JsonResponse { $package = $this->findPackage($type, $slug); $package = $this->service->updatePackage($package, $request->validated()); return response()->json([ 'code' => 0, 'message' => 'package updated', 'data' => RepoFormatter::packageDetail($package->load(['versions', 'screenshots', 'categories'])), ]); } public function updateStatus(Request $request, string $type, string $slug): JsonResponse { $validated = $request->validate([ 'status' => ['required', Rule::in(['draft', 'published', 'hidden', 'deprecated'])], ]); $package = $this->findPackage($type, $slug); $package = $this->service->updateStatus($package, $validated['status']); return response()->json([ 'code' => 0, 'message' => 'package status updated', 'data' => RepoFormatter::packageDetail($package->load(['versions', 'screenshots', 'categories'])), ]); } public function destroy(string $type, string $slug): JsonResponse { $package = $this->findPackage($type, $slug); $package->delete(); return response()->json([ 'code' => 0, 'message' => 'package deleted', 'data' => null, ]); } private function findPackage(string $type, string $slug): Package { $package = Package::query() ->where('type', $type) ->where('slug', $slug) ->first(); if (!$package) { abort(response()->json([ 'code' => 404, 'message' => 'package not found', 'data' => null, ], 404)); } return $package; } }