findPackage($type, $slug); $versions = $package->versions()->orderByDesc('published_at')->orderByDesc('id')->get(); return response()->json([ 'code' => 0, 'message' => 'ok', 'data' => [ 'package' => [ 'type' => $package->type, 'slug' => $package->slug, 'name' => $package->name, ], 'items' => $versions->map(fn ($version) => RepoFormatter::versionDetail($version))->values()->all(), ], ]); } public function store(StoreVersionRequest $request, string $type, string $slug): JsonResponse { $package = $this->findPackage($type, $slug); $version = $this->service->createVersion($package, $request->validated()); return response()->json([ 'code' => 0, 'message' => 'version created', 'data' => RepoFormatter::versionDetail($version), ], 201); } public function publish(PublishZipVersionRequest $request, string $type, string $slug): JsonResponse { $package = $this->findPackage($type, $slug); $version = $this->publishService->publishFromZip( $package, $request->file('package_file'), $request->validated() ); return response()->json([ 'code' => 0, 'message' => 'version published', 'data' => RepoFormatter::versionDetail($version), ], 201); } public function destroy(int $id): JsonResponse { $version = Version::query()->with('package')->find($id); if (!$version) { return response()->json([ 'code' => 404, 'message' => 'version not found', 'data' => null, ], 404); } $this->service->deleteVersion($version); return response()->json([ 'code' => 0, 'message' => 'version 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; } }