*/ class ReportApiController extends CommonApiController { /** * @var ReportModel|null */ protected $model; public function __construct(CorePermissions $security, Translator $translator, EntityResultHelper $entityResultHelper, RouterInterface $router, FormFactoryInterface $formFactory, AppVersion $appVersion, RequestStack $requestStack, ManagerRegistry $doctrine, ModelFactory $modelFactory, EventDispatcherInterface $dispatcher, CoreParametersHelper $coreParametersHelper, MauticFactory $factory) { $reportModel = $modelFactory->getModel('report'); \assert($reportModel instanceof ReportModel); $this->model = $reportModel; $this->entityClass = Report::class; $this->entityNameOne = 'report'; $this->entityNameMulti = 'reports'; $this->serializerGroups = ['reportList', 'reportDetails']; parent::__construct($security, $translator, $entityResultHelper, $router, $formFactory, $appVersion, $requestStack, $doctrine, $modelFactory, $dispatcher, $coreParametersHelper, $factory); } /** * Obtains a compiled report. * * @param int $id Report ID * * @return Response */ public function getEntityAction(Request $request, $id) { $entity = $this->model->getEntity($id); if (!$entity instanceof $this->entityClass) { return $this->notFound(); } $reportData = $this->model->getReportData($entity, $this->formFactory, $this->getOptionsFromRequest($request)); // Unset keys that we don't need to send back foreach (['graphs', 'contentTemplate', 'columns'] as $key) { unset($reportData[$key]); } // Include report metadata $reportData[$this->entityNameOne] = $entity; return $this->handleView( $this->view($reportData, Response::HTTP_OK) ); } public function getReportAction(Request $request, int $id): Response { return $this->getEntityAction($request, $id); } /** * This method is careful to add new options from the request to keep BC. * It originally loaded all rows without any filter or pagination applied. */ private function getOptionsFromRequest(Request $request): array { $options = ['paginate'=> false, 'ignoreGraphData' => true]; if ($request->query->has('dateFrom')) { $options['dateFrom'] = new \DateTimeImmutable($request->query->get('dateFrom'), new \DateTimeZone('UTC')); } if ($request->query->has('dateTo')) { $options['dateTo'] = new \DateTimeImmutable($request->query->get('dateTo'), new \DateTimeZone('UTC')); } if ($request->query->has('page')) { $options['page'] = $request->query->getInt('page'); $options['paginate'] = true; } if ($request->query->has('limit')) { $options['limit'] = $request->query->getInt('limit'); $options['paginate'] = true; } return $options; } }