*/ final readonly class GetDiscountFormDataQuery implements Query { /** * @param \App\Queries\Discounts\GetDiscountFormDataQueryInput $input */ #[\Override] public function __invoke(QueryInput $input): GetDiscountFormDataQueryOutput { Assert::isInstanceOf($input, GetDiscountFormDataQueryInput::class); $discountTypes = DiscountType::cases(); if ($input->discount !== null) { $selectedProds = Product::query() ->select(['id', 'name', 'picture']) ->where('discount_id', $input->discount->id) ->orderBy('name') ->get() ->map(fn (Product $p): DiscountProductDto => DiscountProductDto::fromModel($p)); $existingProds = Product::query() ->select(['id', 'name', 'picture']) ->whereNotIn('id', $selectedProds->pluck('id')) ->orderBy('name') ->get() ->map(fn (Product $p): DiscountProductDto => DiscountProductDto::fromModel($p)); $discountDto = DiscountDto::fromModel($input->discount); } else { $selectedProds = collect(); $existingProds = Product::query() ->select(['id', 'name', 'picture']) ->orderBy('name') ->get() ->map(fn (Product $p): DiscountProductDto => DiscountProductDto::fromModel($p)); $discountDto = null; } return new GetDiscountFormDataQueryOutput( discount: $discountDto, discountTypes: $discountTypes, existingProds: $existingProds, selectedProds: $selectedProds, ); } }