feat(catalog): add tenant-scoped product attributes and variant definitions

This commit is contained in:
2026-06-24 15:08:13 -03:00
parent 689d115a8f
commit c6e5177df1
15 changed files with 630 additions and 0 deletions

View File

@@ -0,0 +1,85 @@
<?php
namespace App\Domains\Catalog\Controllers;
use App\Domains\Catalog\Models\ProductAttribute;
use App\Domains\Catalog\Requests\StoreProductAttributeRequest;
use App\Domains\Catalog\Requests\UpdateProductAttributeRequest;
use App\Domains\Catalog\Resources\ProductAttributeResource;
use App\Domains\Catalog\Support\ProductAttributeType;
use App\Http\Controllers\Controller;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
class ProductAttributeController extends Controller
{
public function index(): JsonResponse
{
$query = ProductAttribute::query()->with('options')->latest();
if (request()->filled('tenant_codigo')) {
$query->where('tenant_codigo', request('tenant_codigo'));
}
return ProductAttributeResource::collection($query->get())->response();
}
public function store(StoreProductAttributeRequest $request): JsonResponse
{
$attribute = DB::transaction(function () use ($request): ProductAttribute {
$validated = $request->validated();
$options = $validated['options'] ?? [];
unset($validated['options']);
$type = ProductAttributeType::from((string) $validated['type']);
if (! $type->supportsOptions()) {
$validated['metadata_schema'] = null;
$options = [];
}
/** @var ProductAttribute $attribute */
$attribute = ProductAttribute::query()->create($validated);
$attribute->options()->createMany($options);
return $attribute->load('options');
});
return ProductAttributeResource::make($attribute)->response()->setStatusCode(201);
}
public function show(ProductAttribute $productAttribute): ProductAttributeResource
{
return ProductAttributeResource::make($productAttribute->load('options'));
}
public function update(UpdateProductAttributeRequest $request, ProductAttribute $productAttribute): ProductAttributeResource
{
$productAttribute = DB::transaction(function () use ($request, $productAttribute): ProductAttribute {
$validated = $request->validated();
$options = $validated['options'] ?? [];
unset($validated['options']);
$type = ProductAttributeType::from((string) $validated['type']);
if (! $type->supportsOptions()) {
$validated['metadata_schema'] = null;
$options = [];
}
$productAttribute->update($validated);
$productAttribute->options()->delete();
$productAttribute->options()->createMany($options);
return $productAttribute->load('options');
});
return ProductAttributeResource::make($productAttribute);
}
public function destroy(ProductAttribute $productAttribute): Response
{
$productAttribute->delete();
return response()->noContent();
}
}