diff --git a/app/Domains/Catalog/Controllers/CategoryController.php b/app/Domains/Catalog/Controllers/CategoryController.php index e89a666..2847abf 100644 --- a/app/Domains/Catalog/Controllers/CategoryController.php +++ b/app/Domains/Catalog/Controllers/CategoryController.php @@ -10,6 +10,7 @@ use App\Domains\Tenant\Models\Tenant; use App\Http\Controllers\Controller; use Illuminate\Http\JsonResponse; use Illuminate\Http\Response; +use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; class CategoryController extends Controller @@ -18,7 +19,11 @@ class CategoryController extends Controller { return CategoryResource::collection( Category::query() - ->where('tenant_code', $tenant->codigo) + ->where(function ($query) use ($tenant): void { + $query + ->where('tenant_code', $tenant->codigo) + ->orWhereNull('tenant_code'); + }) ->with(['parent', 'subCategories', 'tenant']) ->orderByDesc('id') ->paginateFromRequest() @@ -47,6 +52,7 @@ class CategoryController extends Controller public function update(UpdateCategoryRequest $request, Tenant $tenant, Category $categoria): CategoryResource { $categoria = $this->resolveScopedCategory($tenant, $categoria); + $this->ensureCategoryIsMutable($categoria); $categoria->update($request->validated()); return CategoryResource::make($categoria->load(['parent', 'subCategories', 'tenant'])); @@ -55,6 +61,7 @@ class CategoryController extends Controller public function destroy(Tenant $tenant, Category $categoria): Response { $categoria = $this->resolveScopedCategory($tenant, $categoria); + $this->ensureCategoryIsMutable($categoria); $categoria->delete(); return response()->noContent(); @@ -62,10 +69,17 @@ class CategoryController extends Controller protected function resolveScopedCategory(Tenant $tenant, Category $category): Category { - if ($category->tenant_code !== $tenant->codigo) { + if ($category->tenant_code !== null && $category->tenant_code !== $tenant->codigo) { throw new NotFoundHttpException('Category not found for tenant.'); } return $category; } + + protected function ensureCategoryIsMutable(Category $category): void + { + if ($category->isGlobal()) { + throw new AccessDeniedHttpException('Global categories are read-only.'); + } + } } diff --git a/app/Domains/Catalog/Resources/BrandResource.php b/app/Domains/Catalog/Resources/BrandResource.php index 4bf0a04..a76d0aa 100644 --- a/app/Domains/Catalog/Resources/BrandResource.php +++ b/app/Domains/Catalog/Resources/BrandResource.php @@ -17,7 +17,6 @@ class BrandResource extends JsonResource { return [ 'id' => $this->id, - 'tenant_codigo' => $this->tenant_codigo, 'nombre' => $this->nombre, 'descripcion' => $this->descripcion, ]; diff --git a/app/Domains/Catalog/Resources/CategoryResource.php b/app/Domains/Catalog/Resources/CategoryResource.php index 609b0b4..2f73aa2 100644 --- a/app/Domains/Catalog/Resources/CategoryResource.php +++ b/app/Domains/Catalog/Resources/CategoryResource.php @@ -2,7 +2,6 @@ namespace App\Domains\Catalog\Resources; -use App\Domains\Tenant\Resources\TenantResource; use Illuminate\Http\Request; use Illuminate\Http\Resources\Json\JsonResource; @@ -18,15 +17,28 @@ class CategoryResource extends JsonResource { return [ 'id' => $this->id, - 'tenant_code' => $this->tenant_code, 'is_global' => $this->resource->isGlobal(), - 'tenant' => $this->resource->isGlobal() - ? null - : TenantResource::make($this->whenLoaded('tenant')), - 'categoria_id' => $this->categoria_id, 'nombre' => $this->nombre, - 'parent' => self::make($this->whenLoaded('parent')), - 'sub_categories' => self::collection($this->whenLoaded('subCategories')), + 'parent' => $this->whenLoaded('parent', fn () => $this->serializeRelatedCategory($this->parent)), + 'sub_categories' => $this->whenLoaded('subCategories', fn () => + $this->subCategories->map(fn ($category) => $this->serializeRelatedCategory($category))->values() + ), + ]; + } + + /** + * @return array|null + */ + protected function serializeRelatedCategory(?\App\Domains\Catalog\Models\Category $category): ?array + { + if ($category === null) { + return null; + } + + return [ + 'id' => $category->id, + 'is_global' => $category->isGlobal(), + 'nombre' => $category->nombre, ]; } }