From 299a462283120589b6daf871f11787c751c392bf Mon Sep 17 00:00:00 2001 From: ncoronel Date: Tue, 14 Jul 2026 14:21:04 -0300 Subject: [PATCH] feat: implement FeaturedGroup and FeaturedProduct controllers, requests, resources, and routes for managing featured products --- .../Controllers/FeaturedGroupController.php | 51 +++++++++++++++++++ .../Controllers/FeaturedProductController.php | 42 +++++++++++++++ .../Requests/StoreFeaturedGroupRequest.php | 21 ++++++++ .../Requests/StoreFeaturedProductRequest.php | 21 ++++++++ .../Requests/UpdateFeaturedGroupRequest.php | 21 ++++++++ .../Requests/UpdateFeaturedProductRequest.php | 20 ++++++++ .../Resources/FeaturedGroupResource.php | 20 ++++++++ .../Resources/FeaturedProductResource.php | 20 ++++++++ .../Product/Services/FeaturedGroupService.php | 25 +++++++++ app/Domains/Product/routes/api.php | 15 ++++++ routes/api.php | 1 + 11 files changed, 257 insertions(+) create mode 100644 app/Domains/Product/Controllers/FeaturedGroupController.php create mode 100644 app/Domains/Product/Controllers/FeaturedProductController.php create mode 100644 app/Domains/Product/Requests/StoreFeaturedGroupRequest.php create mode 100644 app/Domains/Product/Requests/StoreFeaturedProductRequest.php create mode 100644 app/Domains/Product/Requests/UpdateFeaturedGroupRequest.php create mode 100644 app/Domains/Product/Requests/UpdateFeaturedProductRequest.php create mode 100644 app/Domains/Product/Resources/FeaturedGroupResource.php create mode 100644 app/Domains/Product/Resources/FeaturedProductResource.php create mode 100644 app/Domains/Product/Services/FeaturedGroupService.php create mode 100644 app/Domains/Product/routes/api.php diff --git a/app/Domains/Product/Controllers/FeaturedGroupController.php b/app/Domains/Product/Controllers/FeaturedGroupController.php new file mode 100644 index 0000000..133f029 --- /dev/null +++ b/app/Domains/Product/Controllers/FeaturedGroupController.php @@ -0,0 +1,51 @@ +get(); + return FeaturedGroupResource::collection($groups); + } + + public function store(StoreFeaturedGroupRequest $request, string $tenant): FeaturedGroupResource + { + $group = $this->featuredGroupService->createGroup($tenant, $request->validated()); + return new FeaturedGroupResource($group); + } + + public function show(string $tenant, FeaturedGroup $featuredGroup): FeaturedGroupResource + { + abort_if($featuredGroup->tenant_codigo !== $tenant, 404); + return new FeaturedGroupResource($featuredGroup->load('featuredProducts')); + } + + public function update(UpdateFeaturedGroupRequest $request, string $tenant, FeaturedGroup $featuredGroup): FeaturedGroupResource + { + abort_if($featuredGroup->tenant_codigo !== $tenant, 404); + $group = $this->featuredGroupService->updateGroup($featuredGroup, $request->validated()); + return new FeaturedGroupResource($group); + } + + public function destroy(string $tenant, FeaturedGroup $featuredGroup): JsonResponse + { + abort_if($featuredGroup->tenant_codigo !== $tenant, 404); + $this->featuredGroupService->deleteGroup($featuredGroup); + return response()->json(null, 204); + } +} diff --git a/app/Domains/Product/Controllers/FeaturedProductController.php b/app/Domains/Product/Controllers/FeaturedProductController.php new file mode 100644 index 0000000..e7e7cba --- /dev/null +++ b/app/Domains/Product/Controllers/FeaturedProductController.php @@ -0,0 +1,42 @@ +tenant_codigo !== $tenant, 404); + return FeaturedProductResource::collection($featuredGroup->featuredProducts); + } + + public function store(StoreFeaturedProductRequest $request, string $tenant, FeaturedGroup $featuredGroup): FeaturedProductResource + { + abort_if($featuredGroup->tenant_codigo !== $tenant, 404); + $product = $featuredGroup->featuredProducts()->create($request->validated()); + return new FeaturedProductResource($product); + } + + public function update(UpdateFeaturedProductRequest $request, string $tenant, FeaturedGroup $featuredGroup, FeaturedProduct $featuredProduct): FeaturedProductResource + { + abort_if($featuredGroup->tenant_codigo !== $tenant || $featuredProduct->featured_group_id !== $featuredGroup->id, 404); + $featuredProduct->update($request->validated()); + return new FeaturedProductResource($featuredProduct); + } + + public function destroy(string $tenant, FeaturedGroup $featuredGroup, FeaturedProduct $featuredProduct): JsonResponse + { + abort_if($featuredGroup->tenant_codigo !== $tenant || $featuredProduct->featured_group_id !== $featuredGroup->id, 404); + $featuredProduct->delete(); + return response()->json(null, 204); + } +} diff --git a/app/Domains/Product/Requests/StoreFeaturedGroupRequest.php b/app/Domains/Product/Requests/StoreFeaturedGroupRequest.php new file mode 100644 index 0000000..0f60fd6 --- /dev/null +++ b/app/Domains/Product/Requests/StoreFeaturedGroupRequest.php @@ -0,0 +1,21 @@ + ['required', 'string', 'max:255'], + 'product_layout' => ['required', 'string', 'in:row,column_with_image,column_with_cart'], + ]; + } +} diff --git a/app/Domains/Product/Requests/StoreFeaturedProductRequest.php b/app/Domains/Product/Requests/StoreFeaturedProductRequest.php new file mode 100644 index 0000000..6c8aee6 --- /dev/null +++ b/app/Domains/Product/Requests/StoreFeaturedProductRequest.php @@ -0,0 +1,21 @@ + ['required', 'integer'], + 'order' => ['nullable', 'integer'], + ]; + } +} diff --git a/app/Domains/Product/Requests/UpdateFeaturedGroupRequest.php b/app/Domains/Product/Requests/UpdateFeaturedGroupRequest.php new file mode 100644 index 0000000..932b387 --- /dev/null +++ b/app/Domains/Product/Requests/UpdateFeaturedGroupRequest.php @@ -0,0 +1,21 @@ + ['sometimes', 'string', 'max:255'], + 'product_layout' => ['sometimes', 'string', 'in:row,column_with_image,column_with_cart'], + ]; + } +} diff --git a/app/Domains/Product/Requests/UpdateFeaturedProductRequest.php b/app/Domains/Product/Requests/UpdateFeaturedProductRequest.php new file mode 100644 index 0000000..c0aaec8 --- /dev/null +++ b/app/Domains/Product/Requests/UpdateFeaturedProductRequest.php @@ -0,0 +1,20 @@ + ['sometimes', 'integer'], + ]; + } +} diff --git a/app/Domains/Product/Resources/FeaturedGroupResource.php b/app/Domains/Product/Resources/FeaturedGroupResource.php new file mode 100644 index 0000000..5cb1c73 --- /dev/null +++ b/app/Domains/Product/Resources/FeaturedGroupResource.php @@ -0,0 +1,20 @@ + $this->id, + 'tenant_codigo' => $this->tenant_codigo, + 'group_name' => $this->group_name, + 'product_layout' => $this->product_layout, + 'featured_products' => FeaturedProductResource::collection($this->whenLoaded('featuredProducts')), + ]; + } +} diff --git a/app/Domains/Product/Resources/FeaturedProductResource.php b/app/Domains/Product/Resources/FeaturedProductResource.php new file mode 100644 index 0000000..3a9b486 --- /dev/null +++ b/app/Domains/Product/Resources/FeaturedProductResource.php @@ -0,0 +1,20 @@ + $this->id, + 'featured_group_id' => $this->featured_group_id, + 'product_id' => $this->product_id, + 'order' => $this->order, + // You can add a nested ProductResource here if needed and when loaded + ]; + } +} diff --git a/app/Domains/Product/Services/FeaturedGroupService.php b/app/Domains/Product/Services/FeaturedGroupService.php new file mode 100644 index 0000000..24a960f --- /dev/null +++ b/app/Domains/Product/Services/FeaturedGroupService.php @@ -0,0 +1,25 @@ +update($data); + return $group; + } + + public function deleteGroup(FeaturedGroup $group): bool|null + { + return $group->delete(); + } +} diff --git a/app/Domains/Product/routes/api.php b/app/Domains/Product/routes/api.php new file mode 100644 index 0000000..b26e5bc --- /dev/null +++ b/app/Domains/Product/routes/api.php @@ -0,0 +1,15 @@ +group(function (): void { + Route::apiResource('featured-groups', FeaturedGroupController::class); + Route::apiResource('featured-groups.products', FeaturedProductController::class) + ->only(['index', 'store', 'update', 'destroy']) + ->parameters([ + 'featured-groups' => 'featuredGroup', + 'products' => 'featuredProduct', + ]); +}); diff --git a/routes/api.php b/routes/api.php index 1f0305b..085f616 100644 --- a/routes/api.php +++ b/routes/api.php @@ -11,3 +11,4 @@ require __DIR__.'/../app/Domains/Purchase/routes/api.php'; require __DIR__.'/../app/Domains/Tenant/routes/api.php'; require __DIR__.'/../app/Domains/Integration/routes/api.php'; require __DIR__.'/../app/Domains/Menu/routes/api.php'; +require __DIR__.'/../app/Domains/Product/routes/api.php';