Add PropController, StorePropRequest, UpdatePropRequest, PropResource, and PropableModels; define API routes for props management

This commit is contained in:
2026-06-22 12:45:23 -03:00
parent 054a3a81eb
commit cde27c0d34
7 changed files with 210 additions and 0 deletions

View File

@@ -0,0 +1,70 @@
<?php
namespace App\Domains\Prop\Controllers;
use App\Domains\Prop\Models\Prop;
use App\Domains\Prop\Requests\StorePropRequest;
use App\Domains\Prop\Requests\UpdatePropRequest;
use App\Domains\Prop\Resources\PropResource;
use App\Domains\Prop\Support\PropableModels;
use App\Http\Controllers\Controller;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class PropController extends Controller
{
public function index(string $propableType): JsonResponse
{
$modelClass = PropableModels::resolveOrFail($propableType);
return PropResource::collection(
Prop::query()->forModel($modelClass)->latest()->get()
)->response();
}
public function store(StorePropRequest $request, string $propableType): JsonResponse
{
$modelClass = PropableModels::resolveOrFail($propableType);
/** @var Prop $prop */
$prop = $modelClass::createProp($request->validated());
return PropResource::make($prop)->response()->setStatusCode(201);
}
public function show(string $propableType, Prop $prop): PropResource
{
$modelClass = PropableModels::resolveOrFail($propableType);
$prop = $this->resolveScopedProp($prop, $modelClass);
return PropResource::make($prop);
}
public function update(UpdatePropRequest $request, string $propableType, Prop $prop): PropResource
{
$modelClass = PropableModels::resolveOrFail($propableType);
$prop = $this->resolveScopedProp($prop, $modelClass);
$prop->update($request->validated());
return PropResource::make($prop);
}
public function destroy(string $propableType, Prop $prop): Response
{
$modelClass = PropableModels::resolveOrFail($propableType);
$prop = $this->resolveScopedProp($prop, $modelClass);
$prop->delete();
return response()->noContent();
}
protected function resolveScopedProp(Prop $prop, string $modelClass): Prop
{
if ($prop->propable_type !== $modelClass) {
throw new NotFoundHttpException('Prop not found for the given model type.');
}
return $prop;
}
}