where('tenant_code', $tenant->codigo) ->orderBy('group_order') ->get(); return response()->json($featuredGroups->map( fn (FeaturedGroup $featuredGroup): array => (new CatalogFeaturedGroupResource( $featuredGroup, $this->featuredItemsResponse($featuredGroup, 1), ))->resolve() )); } public function featuredGroupItems( FeaturedGroupPageRequest $request, Tenant $tenant, FeaturedGroup $featuredGroup, ): JsonResponse { abort_unless($featuredGroup->tenant_code === $tenant->codigo, 404); $page = (int) $request->validated('page', 1); return response()->json($this->featuredItemsResponse($featuredGroup, $page)); } public function show( CatalogItemDetailRequest $request, Tenant $tenant, CatalogItem $catalogItem, CatalogService $catalogService, ): CatalogItemDetailResource { abort_unless($catalogItem->tenant_code === $tenant->codigo, 404); $variantId = $request->validated('variant_id'); return CatalogItemDetailResource::make( $catalogService->getDetail( $catalogItem, $variantId === null ? null : (int) $variantId, ) ); } public function store( StoreCatalogItemRequest $request, Tenant $tenant, CatalogService $catalogService, ): JsonResponse { $catalogItem = $catalogService->create([ ...$request->validated(), 'tenant_code' => $tenant->codigo, ]); return CatalogItemResource::make($catalogItem) ->response() ->setStatusCode(201); } /** @return array */ private function featuredItemsResponse(FeaturedGroup $featuredGroup, int $page): array { if ($featuredGroup->group_layout !== GroupLayout::Paginated) { $featuredItems = $this->featuredItemsQuery($featuredGroup)->get(); $featuredItems->each( fn ($featuredItem) => $featuredItem->setRelation('featuredGroup', $featuredGroup) ); return CatalogFeaturedItemResource::collection($featuredItems)->resolve(); } $paginator = $this->paginateFeaturedItems($featuredGroup, $page); $paginator->getCollection()->each( fn ($featuredItem) => $featuredItem->setRelation('featuredGroup', $featuredGroup) ); return CatalogFeaturedItemResource::collection($paginator) ->response() ->getData(true); } private function paginateFeaturedItems( FeaturedGroup $featuredGroup, int $page, ): LengthAwarePaginator { $paginator = $this->featuredItemsQuery($featuredGroup)->paginate( perPage: self::ITEMS_PER_PAGE, pageName: 'page', page: $page, ); return $paginator->withPath(route('catalog.featured-groups.items.index', [ 'tenant' => $featuredGroup->tenant_code, 'featuredGroup' => $featuredGroup->id, ])); } /** @return HasMany */ private function featuredItemsQuery(FeaturedGroup $featuredGroup): HasMany { return $featuredGroup->featuredItems()->with([ 'catalogItem.inventory', 'catalogItem.attachments', 'catalogItem.variants.inventory', 'catalogItem.variants.attachments', 'catalogItem.variants.definitions.itemAttribute.attribute', 'catalogItem.bundleComponents.catalogItem', 'catalogItem.bundleComponents.variant.catalogItem', ]); } }