From 9b9de7bb8a04c38b74f69a723664c4ce82fe46b8 Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Sat, 24 Jan 2026 13:52:43 +0100 Subject: [PATCH] Update DataTables helper to use controller --- composer.json | 3 +- src/API/Controllers/BaseController.php | 56 +++++++++++++++++++ src/API/Controllers/DataTablesController.php | 45 +++++++++++++-- .../DataTablesLoadRequest.php | 30 ++++++++-- .../DataTablesLoadResponse.php | 2 +- 5 files changed, 122 insertions(+), 14 deletions(-) create mode 100644 src/API/Controllers/BaseController.php diff --git a/composer.json b/composer.json index bffffe0f4..17cd026e5 100644 --- a/composer.json +++ b/composer.json @@ -28,7 +28,8 @@ "ext-simplexml": "*", "ext-xsl": "*", "ext-zip": "*", - "api-platform/laravel": "^4.1", + "api-platform/laravel": "^4.2.14", + "cuyz/valinor": "^2.3", "davidepastore/codice-fiscale": "^0.10.0", "devcode-it/ical-easy-reader": "dev-main", "devcode-it/sdd_ita": "dev-master", diff --git a/src/API/Controllers/BaseController.php b/src/API/Controllers/BaseController.php new file mode 100644 index 000000000..3d6bc3fda --- /dev/null +++ b/src/API/Controllers/BaseController.php @@ -0,0 +1,56 @@ +messages(); + + $formatted = []; + foreach ($messages as $message) { + $formatted[] = str_replace(". for", " for", $message->withBody('{original_message} for parameter "{node_path}"')->toString()); + } + + parent::__construct("Invalid input: ".implode("\n", $formatted)); + } +} + +abstract class BaseController extends Controller +{ + /** + * @template T + * @param class-string $class_reference + * @return T + */ + public function _cast(Request $request, string $class_reference): mixed + { + try { + return (new \CuyZ\Valinor\MapperBuilder()) + ->allowUndefinedValues() + ->allowSuperfluousKeys() + ->allowScalarValueCasting() + ->mapper() + ->map( + $class_reference, + [...$request->route()->parameters(), ...$request->all()] + ); + } catch (\CuyZ\Valinor\Mapper\MappingError $error) { + throw new InvalidInputException($error); + } + } +} diff --git a/src/API/Controllers/DataTablesController.php b/src/API/Controllers/DataTablesController.php index d5d7da8fa..3a75632ab 100644 --- a/src/API/Controllers/DataTablesController.php +++ b/src/API/Controllers/DataTablesController.php @@ -11,9 +11,14 @@ use Models\Module; use Util\Query; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; +use Illuminate\Routing\Controller; + + #[Post( uriTemplate: '/datatables/list/{id_module}/{id_plugin}/{id_parent}', - processor: DataTablesController::class, + controller: DataTablesController::class, input: DataTablesLoadRequest::class, output: DataTablesLoadResponse::class, )] @@ -21,8 +26,31 @@ class DataTablesResource { } -final class DataTablesController implements ProcessorInterface +final class DataTablesController extends BaseController { + public function __invoke(Request $request): JsonResponse + { + $data = $this->_cast($request, DataTablesLoadRequest::class); + + $id_module = (int) $data->getIdModule(); + $id_plugin = (int) $data->getIdPlugin(); + $id_parent = (int) $data->getIdParent(); + + $module = \Modules::get($id_module); + \Modules::setCurrent($id_module); + + $plugin = null; + if (!empty($id_plugin)) { + \Plugins::setCurrent($id_plugin); + $plugin = \Plugins::get($id_plugin); + } + + $structure = $plugin ?? $module; + + return new JsonResponse($this->retrieveRecords($structure, $data, $id_module, $id_plugin, $id_parent)); + } + + /* public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = []): DataTablesLoadResponse { if (!$data instanceof DataTablesLoadRequest) { @@ -45,7 +73,7 @@ public function process(mixed $data, Operation $operation, array $uriVariables = $structure = $plugin ?? $module; return $this->retrieveRecords($structure, $data, $id_module, $id_plugin, $id_parent); - } + }*/ protected function retrieveRecords($structure, DataTablesLoadRequest $data, $id_module, $id_plugin, $id_parent): DataTablesLoadResponse { @@ -53,9 +81,14 @@ protected function retrieveRecords($structure, DataTablesLoadRequest $data, $id_ $order = $data->order ? $data->order[0] : []; if (!empty($order)) { - $order['column'] = $order['column'] - 1; + $order->column = $order->column - 1; } + $order_array = [ + 'column' => $order->column ?? null, + 'dir' => $order->dir->value ?? null, + ]; + $query_structure = Query::readQuery($structure); $response = new DataTablesLoadResponse($data->draw); @@ -80,7 +113,7 @@ protected function retrieveRecords($structure, DataTablesLoadRequest $data, $id_ $response->recordsTotal = database()->fetchNum($query); // CONTEGGIO RECORD FILTRATI (senza LIMIT) - $query_filtered = Query::getQuery($structure, $search, $order, [], $query_structure); + $query_filtered = Query::getQuery($structure, $search, $order_array, [], $query_structure); if (empty($id_plugin)) { $query_filtered = \Modules::replaceAdditionals($id_module, $query_filtered); } @@ -97,7 +130,7 @@ protected function retrieveRecords($structure, DataTablesLoadRequest $data, $id_ 'length' => $data->length, ]; // RISULTATI VISIBILI (con LIMIT) - $query = Query::getQuery($structure, $search, $order, $limit, $query_structure); + $query = Query::getQuery($structure, $search, $order_array, $limit, $query_structure); // Filtri derivanti dai permessi (eventuali) if (empty($id_plugin)) { diff --git a/src/DTO/DataTablesLoadRequest/DataTablesLoadRequest.php b/src/DTO/DataTablesLoadRequest/DataTablesLoadRequest.php index 54dc7a6b2..4d8cd6735 100644 --- a/src/DTO/DataTablesLoadRequest/DataTablesLoadRequest.php +++ b/src/DTO/DataTablesLoadRequest/DataTablesLoadRequest.php @@ -6,23 +6,41 @@ final class DataTablesLoadRequest { + // Private properties are from the route + private ?int $id_module = 0; + private ?int $id_plugin = 0; + private ?int $id_parent = 0; + public int $draw = 0; public int $start = 0; public int $length = 200; - /** - * @var Search - */ - public array $search; // Deserialization is not working correctly + + public Search $search; /** * @var OrderItem[] */ - public array $order = []; // Deserialization is not working correctly + public array $order = []; /** * @var Column[] */ - public array $columns = []; // Deserialization is not working correctly + public array $columns = []; public ?string $_ = null; + public function getIdModule(): int + { + return $this->id_module; + } + + public function getIdPlugin(): int + { + return $this->id_plugin; + } + + public function getIdParent(): int + { + return $this->id_parent; + } + public function getDraw(): int { return $this->draw; diff --git a/src/DTO/DataTablesLoadResponse/DataTablesLoadResponse.php b/src/DTO/DataTablesLoadResponse/DataTablesLoadResponse.php index 069eb9537..ecf22daf1 100644 --- a/src/DTO/DataTablesLoadResponse/DataTablesLoadResponse.php +++ b/src/DTO/DataTablesLoadResponse/DataTablesLoadResponse.php @@ -31,7 +31,7 @@ public function toArray(): array 'data' => $this->data, 'summable' => $this->summable, 'avg' => $this->avg, - 'error' => $this->error, + $this->error ? ['error' => $this->error] : [], ]; } }