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 { $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 = $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', ]) ->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, ])); } }