whenLoaded('pricings', function () { return $this->pricings->min('price'); }); $osIds = $this->whenLoaded('operatingSystems', function () { return $this->operatingSystems->pluck('id')->toArray(); }); return [ 'id' => $this->id, 'uuid' => $this->uuid, 'name' => $this->name, 'slug' => $this->slug, 'thumbnail' => $this->thumbnail, 'product_type' => $this->product_type, 'page_type' => $this->resolvePageType($this->product_type), 'product_categories_id' => $this->whenLoaded('category', fn() => $this->category?->id), 'category' => $this->whenLoaded('category', fn() => $this->category?->name), 'cpu' => $this->cpu, 'ram' => $this->ram, 'disk' => $this->disk, 'bandwidth' => $this->bandwidth, 'setup_fee' => $this->setup_fee, 'min_price' => $minPrice, 'billing_type' => $this->whenLoaded('pricings', function () { $hasOnetime = $this->pricings->where('billing_cycle', 'onetime')->isNotEmpty(); $hasRecurring = $this->pricings->where('billing_cycle', '!=', 'onetime')->isNotEmpty(); return ($hasOnetime && !$hasRecurring) ? 'onetime' : 'recurring'; }), 'currency' => $this->whenLoaded('pricings', fn () => $this->pricings->first()?->currency ?? 'VND'), 'price_monthly' => $this->whenLoaded('pricings', fn () => optional($this->pricings->firstWhere('billing_cycle', 'monthly'))->price), 'price_quarterly' => $this->whenLoaded('pricings', fn () => optional($this->pricings->firstWhere('billing_cycle', 'quarterly'))->price), 'price_semiannually' => $this->whenLoaded('pricings', fn () => optional($this->pricings->firstWhere('billing_cycle', 'semiannually'))->price), 'price_annually' => $this->whenLoaded('pricings', fn () => optional($this->pricings->firstWhere('billing_cycle', 'annually'))->price), 'price_biennially' => $this->whenLoaded('pricings', fn () => optional($this->pricings->firstWhere('billing_cycle', 'biennially'))->price), 'price_triennially' => $this->whenLoaded('pricings', fn () => optional($this->pricings->firstWhere('billing_cycle', 'triennially'))->price), 'price_onetime' => $this->whenLoaded('pricings', fn () => optional($this->pricings->firstWhere('billing_cycle', 'onetime'))->price), 'is_active' => $this->is_active, 'created_at' => $this->created_at, 'os_ids' => $osIds, 'module_host_id' => $this->module_host_id, 'module_datastore_id' => $this->module_datastore_id, ]; } private function resolvePageType(?string $productType): string { return match ($productType) { 'vps', 'cloud' => 'service_vps', 'hosting', 'email', 'ssl' => 'service_hosting', 'domain' => 'service_domain', 'blog' => 'blog', default => 'service_vps', }; } }