Tstore/app/Http/Controllers/Admin/VersionController.php

108 lines
3.1 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\PublishZipVersionRequest;
use App\Http\Requests\Admin\StoreVersionRequest;
use App\Models\Package;
use App\Models\Version;
use App\Services\AdminPackageService;
use App\Services\RepoFormatter;
use App\Services\VersionPublishService;
use Illuminate\Http\JsonResponse;
class VersionController extends Controller
{
public function __construct(
private readonly AdminPackageService $service,
private readonly VersionPublishService $publishService,
) {
}
public function index(string $type, string $slug): JsonResponse
{
$package = $this->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;
}
}