Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
56 changes: 56 additions & 0 deletions src/API/Controllers/BaseController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?php

namespace API\Controllers;

use ApiPlatform\Metadata\Operation;
use ApiPlatform\Metadata\Post;
use ApiPlatform\State\ProcessorInterface;
use DTO\DataTablesLoadRequest\Column;
use DTO\DataTablesLoadRequest\DataTablesLoadRequest;
use DTO\DataTablesLoadResponse\DataTablesLoadResponse;
use Models\Module;
use Util\Query;

use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;

use Exception;

class InvalidInputException extends Exception {
public function __construct(\CuyZ\Valinor\Mapper\MappingError $error) {
$messages = $error->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<T> $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);
}
}
}
45 changes: 39 additions & 6 deletions src/API/Controllers/DataTablesController.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,46 @@
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,
)]
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) {
Expand All @@ -45,17 +73,22 @@ 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
{
// Informazioni fondamentali
$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);
Expand All @@ -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);
}
Expand All @@ -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)) {
Expand Down
30 changes: 24 additions & 6 deletions src/DTO/DataTablesLoadRequest/DataTablesLoadRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/DTO/DataTablesLoadResponse/DataTablesLoadResponse.php
Original file line number Diff line number Diff line change
Expand Up @@ -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] : [],
];
}
}
Loading