paginate($this->travelExportBuilder->build(), $query); } /** * Every travel date x hotel pair with its whole record, unfiltered, paginated. * * The website's product import. Same grain, envelope and failure behaviour as travels(); * the rows carry rooms, prices, services and selection groups instead of the * disposition subset, and nothing is dropped for the consumer. */ #[Route(path: '/products', name: 'api_exports_products', methods: ['GET'])] public function products( #[MapQueryString(validationFailedStatusCode: Response::HTTP_BAD_REQUEST)] ExportQuery $query = new ExportQuery(), ): JsonResponse { return $this->paginate($this->productExportBuilder->build(), $query); } private function paginate(Export $export, ExportQuery $query): JsonResponse { $total = count($export->rows); return $this->json([ 'data' => array_slice($export->rows, ($query->page - 1) * $query->perPage, $query->perPage), 'meta' => [ 'page' => $query->page, 'perPage' => $query->perPage, 'total' => $total, 'totalPages' => (int) ceil($total / $query->perPage), 'skipped' => $export->skipped, 'pickupsWithoutMasterData' => $export->pickupsWithoutMasterData, 'sourceGeneratedAt' => $export->sourceGeneratedAt?->format('c'), 'generatedAt' => $export->generatedAt->format('c'), ], ]); } }