From 2236c4bd45f2b0bcd1589c88e87fad1f0040d524 Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Sat, 24 Jan 2026 13:52:43 +0100 Subject: [PATCH 1/7] Update DataTables helper to use controller --- composer.json | 3 +- src/API/Controllers/BaseController.php | 56 +++++++++++++ src/API/Controllers/DataTablesController.php | 79 +++++++++++++------ src/DTO/DataTablesLoadRequest/Column.php | 13 --- .../DataTablesLoadRequest.php | 36 +++++++-- src/DTO/DataTablesLoadRequest/OrderItem.php | 9 --- src/DTO/DataTablesLoadRequest/Search.php | 8 -- .../DataTablesLoadResponse.php | 2 +- 8 files changed, 142 insertions(+), 64 deletions(-) create mode 100644 src/API/Controllers/BaseController.php diff --git a/composer.json b/composer.json index c3a6a08d7a..c65acf34f6 100644 --- a/composer.json +++ b/composer.json @@ -34,7 +34,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 0000000000..3d6bc3fda9 --- /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 7e4beec4ae..fcae21183b 100644 --- a/src/API/Controllers/DataTablesController.php +++ b/src/API/Controllers/DataTablesController.php @@ -2,18 +2,20 @@ 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; + + #[Post( uriTemplate: '/datatables/list/{id_module}/{id_plugin}/{id_parent}', - processor: DataTablesController::class, + controller: DataTablesController::class, input: DataTablesLoadRequest::class, output: DataTablesLoadResponse::class, )] @@ -21,11 +23,34 @@ class DataTablesResource { } -final class DataTablesController implements ProcessorInterface +final class DataTablesController extends BaseController { - public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = []): DataTablesLoadResponse + public function __invoke(Request $request): JsonResponse { - if (!$data instanceof DataTablesLoadRequest) { + $request_body = $this->_cast($request, DataTablesLoadRequest::class); + + $id_module = (int) $request_body->getIdModule(); + $id_plugin = (int) $request_body->getIdPlugin(); + $id_parent = (int) $request_body->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, $request_body, $id_module, $id_plugin, $id_parent)); + } + + /* + public function process(mixed $request, Operation $operation, array $uriVariables = [], array $context = []): DataTablesLoadResponse + { + if (!$request instanceof DataTablesLoadRequest) { throw new \InvalidArgumentException(); } @@ -44,21 +69,23 @@ public function process(mixed $data, Operation $operation, array $uriVariables = $structure = $plugin ?? $module; - return $this->retrieveRecords($structure, $data, $id_module, $id_plugin, $id_parent); - } + return $this->retrieveRecords($structure, $request, $id_module, $id_plugin, $id_parent); + }*/ - private function retrieveRecords($structure, DataTablesLoadRequest $data, $id_module, $id_plugin, $id_parent): DataTablesLoadResponse + private function retrieveRecords($structure, DataTablesLoadRequest $request, $id_module, $id_plugin, $id_parent): DataTablesLoadResponse { // Informazioni fondamentali - $order = $data->order ? $data->order[0] : []; + $order = $request->order ? $request->order[0] : []; if (!empty($order)) { - $order['column'] = $order['column'] - 1; + $order->column = $order->column - 1; } + $order_array = $order->toArray(); + $query_structure = Query::readQuery($structure); - $response = new DataTablesLoadResponse($data->draw); + $response = new DataTablesLoadResponse($request->draw); $query = Query::getQuery($structure, [], [], [], $query_structure); if (empty($query)) { @@ -67,7 +94,7 @@ private function retrieveRecords($structure, DataTablesLoadRequest $data, $id_mo // Ricerca $search = []; - $columns = $data->columns; + $columns = $request->columns; array_shift($columns); for ($i = 0; $i < count($columns); ++$i) { $col = Column::fromArray($columns[$i]); @@ -80,7 +107,7 @@ private function retrieveRecords($structure, DataTablesLoadRequest $data, $id_mo $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); } @@ -93,11 +120,11 @@ private function retrieveRecords($structure, DataTablesLoadRequest $data, $id_mo $response->avg = Query::getAverages($structure, $search); $limit = [ - 'start' => $data->start, - 'length' => $data->length, + 'start' => $request->start, + 'length' => $request->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)) { @@ -154,7 +181,7 @@ private function getSingleRow($r, $query_structure, $align, $id_module, $id_plug $result = [ 'id' => $r['id'], - '', // Colonna ID + '', // Colonna ID ]; foreach ($query_structure['fields'] as $pos => $field) { @@ -162,9 +189,9 @@ private function getSingleRow($r, $query_structure, $align, $id_module, $id_plug if (!empty($r['_bg_'])) { if (preg_match('/-light$/', (string) $r['_bg_'])) { - $column['data-background'] = substr((string) $r['_bg_'], 0, -6); // Remove the "-light" suffix from the word + $column['request-background'] = substr((string) $r['_bg_'], 0, -6); // Remove the "-light" suffix from the word } else { - $column['data-background'] = $r['_bg_']; + $column['request-background'] = $r['_bg_']; } } @@ -211,7 +238,7 @@ private function getSingleRow($r, $query_structure, $align, $id_module, $id_plug } $column['class'] = 'text-center small'; - $column['data-background'] = $r[$field]; + $column['request-background'] = $r[$field]; } // Icona di stampa @@ -245,8 +272,8 @@ private function getSingleRow($r, $query_structure, $align, $id_module, $id_plug } // Colore del testo - if (!empty($column['data-background'])) { - $column['data-color'] ??= color_inverse(trim((string) $column['data-background'])); + if (!empty($column['request-background'])) { + $column['request-color'] ??= color_inverse(trim((string) $column['request-background'])); } elseif (preg_match('/^mailto_(.+?)$/', trim((string) $field), $m)) { $column['class'] = ''; $value = ($r[$field] ? ' '.$r[$field].'' : ''); @@ -269,13 +296,13 @@ private function getSingleRow($r, $query_structure, $align, $id_module, $id_plug // Link per i moduli if (empty($id_plugin)) { - $column['data-link'] = base_path_osm().'/editor.php?id_module='.$id_module.'&id_record='.$id_record.$hash; + $column['request-link'] = base_path_osm().'/editor.php?id_module='.$id_module.'&id_record='.$id_record.$hash; } // Link per i plugin else { - $column['data-link'] = base_path_osm().'/add.php?id_module='.$id_module.'&id_record='.$id_record.'&id_plugin='.$id_plugin.'&id_parent='.$id_parent.'&edit=1'.$hash; + $column['request-link'] = base_path_osm().'/add.php?id_module='.$id_module.'&id_record='.$id_record.'&id_plugin='.$id_plugin.'&id_parent='.$id_parent.'&edit=1'.$hash; - $column['data-type'] = 'dialog'; + $column['request-type'] = 'dialog'; } } diff --git a/src/DTO/DataTablesLoadRequest/Column.php b/src/DTO/DataTablesLoadRequest/Column.php index 37d6a9113d..756e4f4191 100644 --- a/src/DTO/DataTablesLoadRequest/Column.php +++ b/src/DTO/DataTablesLoadRequest/Column.php @@ -15,19 +15,6 @@ public function __construct( ) { } - public static function fromArray(array $input = []): self - { - $data = isset($input['data']) ? (string) $input['data'] : ''; - $name = isset($input['name']) ? (string) $input['name'] : null; - $searchable = isset($input['searchable']) ? filter_var($input['searchable'], FILTER_VALIDATE_BOOLEAN) : true; - $orderable = isset($input['orderable']) ? filter_var($input['orderable'], FILTER_VALIDATE_BOOLEAN) : true; - $search = isset($input['search']) && is_array($input['search']) - ? Search::fromArray($input['search']) - : null; - - return new self($data, $name, $searchable, $orderable, $search); - } - public function getData(): string { return $this->data; diff --git a/src/DTO/DataTablesLoadRequest/DataTablesLoadRequest.php b/src/DTO/DataTablesLoadRequest/DataTablesLoadRequest.php index 54dc7a6b23..b67acbe2f8 100644 --- a/src/DTO/DataTablesLoadRequest/DataTablesLoadRequest.php +++ b/src/DTO/DataTablesLoadRequest/DataTablesLoadRequest.php @@ -4,25 +4,49 @@ namespace DTO\DataTablesLoadRequest; +use Symfony\Component\Serializer\Attribute\Ignore; + final class DataTablesLoadRequest { + // Private properties are from the route + // We must use Ignore on the getters to prevent them from being serialized + 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; + #[Ignore] + public function getIdModule(): int + { + return $this->id_module; + } + + #[Ignore] + public function getIdPlugin(): int + { + return $this->id_plugin; + } + + #[Ignore] + public function getIdParent(): int + { + return $this->id_parent; + } + public function getDraw(): int { return $this->draw; diff --git a/src/DTO/DataTablesLoadRequest/OrderItem.php b/src/DTO/DataTablesLoadRequest/OrderItem.php index 0556dbfb25..b1546c2c7e 100644 --- a/src/DTO/DataTablesLoadRequest/OrderItem.php +++ b/src/DTO/DataTablesLoadRequest/OrderItem.php @@ -14,15 +14,6 @@ public function __construct(public int $column = 0, public ?string $name = null, { } - public static function fromArray(array $input = []): self - { - $col = isset($input['column']) ? (int) $input['column'] : 0; - $name = isset($input['name']) && $input['name'] !== '' ? (string) $input['name'] : null; - $dirStr = isset($input['dir']) ? (string) $input['dir'] : SortDirection::ASC->value; - - return new self($col, $name, SortDirection::from($dirStr)); - } - public function getColumnIndex(): int { return $this->column; diff --git a/src/DTO/DataTablesLoadRequest/Search.php b/src/DTO/DataTablesLoadRequest/Search.php index 4b1cbc6033..9e841d4dc3 100644 --- a/src/DTO/DataTablesLoadRequest/Search.php +++ b/src/DTO/DataTablesLoadRequest/Search.php @@ -10,14 +10,6 @@ public function __construct(public string $value, public bool $regex = false) { } - public static function fromArray(array $input = []): self - { - $value = isset($input['value']) ? (string) $input['value'] : ''; - $regex = isset($input['regex']) ? filter_var($input['regex'], FILTER_VALIDATE_BOOLEAN) : false; - - return new self($value, $regex); - } - public function getValue(): string { return $this->value; diff --git a/src/DTO/DataTablesLoadResponse/DataTablesLoadResponse.php b/src/DTO/DataTablesLoadResponse/DataTablesLoadResponse.php index 069eb95375..ecf22daf12 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] : [], ]; } } From bb725d5c7cf134af9ec473d3572db2f7f1e8e4d1 Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Sat, 7 Feb 2026 09:49:10 +0100 Subject: [PATCH 2/7] Update Impostazioni to use controller system --- ...ider.php => GetImpostazioneController.php} | 17 ++++++------- ...der.php => ListImpostazioniController.php} | 24 +++++++++---------- ... => ListSezioniImpostazioniController.php} | 11 +++++---- ...r.php => UpdateImpostazioneController.php} | 23 +++++++++--------- .../src/API/ImpostazioneResource.php | 17 +++++++------ 5 files changed, 46 insertions(+), 46 deletions(-) rename modules/impostazioni/src/API/Controllers/{GetImpostazioneProvider.php => GetImpostazioneController.php} (58%) rename modules/impostazioni/src/API/Controllers/{ListImpostazioniProvider.php => ListImpostazioniController.php} (58%) rename modules/impostazioni/src/API/Controllers/{ListSezioniImpostazioniProvider.php => ListSezioniImpostazioniController.php} (71%) rename modules/impostazioni/src/API/Controllers/{UpdateImpostazioneProcessor.php => UpdateImpostazioneController.php} (58%) diff --git a/modules/impostazioni/src/API/Controllers/GetImpostazioneProvider.php b/modules/impostazioni/src/API/Controllers/GetImpostazioneController.php similarity index 58% rename from modules/impostazioni/src/API/Controllers/GetImpostazioneProvider.php rename to modules/impostazioni/src/API/Controllers/GetImpostazioneController.php index 4faa7551a5..d87d6e2578 100644 --- a/modules/impostazioni/src/API/Controllers/GetImpostazioneProvider.php +++ b/modules/impostazioni/src/API/Controllers/GetImpostazioneController.php @@ -2,29 +2,30 @@ namespace Modules\Impostazioni\API\Controllers; -use ApiPlatform\Metadata\Operation; -use ApiPlatform\State\ProviderInterface; -use Illuminate\Auth\Access\AuthorizationException; -use Illuminate\Support\Facades\Auth; +use API\Controllers\BaseController; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; use Models\Setting; use Modules\Impostazioni\API\ImpostazioneResource; +use Illuminate\Auth\Access\AuthorizationException; +use Illuminate\Support\Facades\Auth; -final class GetImpostazioneProvider implements ProviderInterface +final class GetImpostazioneController extends BaseController { - public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?ImpostazioneResource + public function __invoke(Request $request): JsonResponse { $user = Auth::user(); if (!$user || !$user->is_admin) { throw new AuthorizationException(); } - $setting = Setting::find($uriVariables['id']); + $setting = Setting::find($request->route('id')); if (!$setting) { return null; } $response = ImpostazioneResource::fromModel($setting); - return $response; + return new JsonResponse($response); } } diff --git a/modules/impostazioni/src/API/Controllers/ListImpostazioniProvider.php b/modules/impostazioni/src/API/Controllers/ListImpostazioniController.php similarity index 58% rename from modules/impostazioni/src/API/Controllers/ListImpostazioniProvider.php rename to modules/impostazioni/src/API/Controllers/ListImpostazioniController.php index f7506ffb7f..76821210fa 100644 --- a/modules/impostazioni/src/API/Controllers/ListImpostazioniProvider.php +++ b/modules/impostazioni/src/API/Controllers/ListImpostazioniController.php @@ -2,32 +2,32 @@ namespace Modules\Impostazioni\API\Controllers; -use ApiPlatform\Metadata\Operation; -use ApiPlatform\State\ParameterNotFound; -use ApiPlatform\State\ProviderInterface; +use API\Controllers\BaseController; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Support\Facades\Auth; use Models\Setting; use Modules\Impostazioni\API\ImpostazioneResource; -final class ListImpostazioniProvider implements ProviderInterface +final class ListImpostazioniController extends BaseController { - public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?array + public function __invoke(Request $request): JsonResponse { - $user = Auth::user(); + $user = Auth::user(); if (!$user || !$user->is_admin) { throw new AuthorizationException(); } - - $sezione = $operation->getParameters()->get('sezione')->getValue(); - $search = $operation->getParameters()->get('ricerca')->getValue(); + + $sezione = $request->query('sezione'); + $search = $request->query('ricerca'); // Trova le impostazioni che corrispondono alla ricerca - if (!$search instanceof ParameterNotFound) { + if (!empty($search)) { $impostazioni = Setting::where('nome', 'like', '%'.$search.'%') ->orWhere('sezione', 'like', '%'.$search.'%') ->get(); - } elseif (!$sezione instanceof ParameterNotFound) { + } elseif (!empty($sezione)) { $impostazioni = Setting::where('sezione', $sezione)->get(); } else { $impostazioni = Setting::all(); @@ -38,6 +38,6 @@ public function provide(Operation $operation, array $uriVariables = [], array $c $results[] = ImpostazioneResource::fromModel($impostazione); } - return $results; + return new JsonResponse($results); } } diff --git a/modules/impostazioni/src/API/Controllers/ListSezioniImpostazioniProvider.php b/modules/impostazioni/src/API/Controllers/ListSezioniImpostazioniController.php similarity index 71% rename from modules/impostazioni/src/API/Controllers/ListSezioniImpostazioniProvider.php rename to modules/impostazioni/src/API/Controllers/ListSezioniImpostazioniController.php index ddd033b725..026a4bbdea 100644 --- a/modules/impostazioni/src/API/Controllers/ListSezioniImpostazioniProvider.php +++ b/modules/impostazioni/src/API/Controllers/ListSezioniImpostazioniController.php @@ -2,16 +2,17 @@ namespace Modules\Impostazioni\API\Controllers; -use ApiPlatform\Metadata\Operation; -use ApiPlatform\State\ProviderInterface; +use API\Controllers\BaseController; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Support\Facades\Auth; use Models\Setting; use Modules\Impostazioni\API\Models\ListSezioniImpostazioniResponse; -final class ListSezioniImpostazioniProvider implements ProviderInterface +final class ListSezioniImpostazioniController extends BaseController { - public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?ListSezioniImpostazioniResponse + public function __invoke(Request $request): JsonResponse { $user = Auth::user(); if (!$user || !$user->is_admin) { @@ -30,6 +31,6 @@ public function provide(Operation $operation, array $uriVariables = [], array $c $response->sezioni[$gruppo->nome] = $gruppo->numero; } - return $response; + return new JsonResponse($response); } } diff --git a/modules/impostazioni/src/API/Controllers/UpdateImpostazioneProcessor.php b/modules/impostazioni/src/API/Controllers/UpdateImpostazioneController.php similarity index 58% rename from modules/impostazioni/src/API/Controllers/UpdateImpostazioneProcessor.php rename to modules/impostazioni/src/API/Controllers/UpdateImpostazioneController.php index 4f7050d9dd..37c7944b58 100644 --- a/modules/impostazioni/src/API/Controllers/UpdateImpostazioneProcessor.php +++ b/modules/impostazioni/src/API/Controllers/UpdateImpostazioneController.php @@ -2,39 +2,38 @@ namespace Modules\Impostazioni\API\Controllers; -use ApiPlatform\Metadata\Operation; -use ApiPlatform\State\ProcessorInterface; -use Illuminate\Auth\Access\AuthorizationException; -use Illuminate\Support\Facades\Auth; +use API\Controllers\BaseController; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; use Models\Setting; use Modules\Impostazioni\API\Models\UpdateImpostazioneRequest; use Modules\Impostazioni\API\Models\UpdateImpostazioneResponse; +use Illuminate\Auth\Access\AuthorizationException; +use Illuminate\Support\Facades\Auth; -final class UpdateImpostazioneProcessor implements ProcessorInterface +final class UpdateImpostazioneController extends BaseController { - public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = []): UpdateImpostazioneResponse + public function __invoke(Request $request): JsonResponse { $user = Auth::user(); if (!$user || !$user->is_admin) { throw new AuthorizationException(); } - if (!$data instanceof UpdateImpostazioneRequest) { - throw new \InvalidArgumentException(); - } + $data = $this->_cast($request, UpdateImpostazioneRequest::class); - $id = $uriVariables['id']; + $id = $request->route('id'); $response = new UpdateImpostazioneResponse(); $impostazione = Setting::find($id); if (!$impostazione->editable) { $response->edited = true; - return $response; + return new JsonResponse($response); } $response->edited = \Settings::setValue($impostazione->id, $data->valore); - return $response; + return new JsonResponse($response); } } diff --git a/modules/impostazioni/src/API/ImpostazioneResource.php b/modules/impostazioni/src/API/ImpostazioneResource.php index 4a71f4a5c6..c416a6c556 100644 --- a/modules/impostazioni/src/API/ImpostazioneResource.php +++ b/modules/impostazioni/src/API/ImpostazioneResource.php @@ -8,10 +8,10 @@ use ApiPlatform\Metadata\Put; use ApiPlatform\Metadata\QueryParameter; use Models\Setting; -use Modules\Impostazioni\API\Controllers\GetImpostazioneProvider; -use Modules\Impostazioni\API\Controllers\ListImpostazioniProvider; -use Modules\Impostazioni\API\Controllers\ListSezioniImpostazioniProvider; -use Modules\Impostazioni\API\Controllers\UpdateImpostazioneProcessor; +use Modules\Impostazioni\API\Controllers\GetImpostazioneController; +use Modules\Impostazioni\API\Controllers\ListImpostazioniController; +use Modules\Impostazioni\API\Controllers\ListSezioniImpostazioniController; +use Modules\Impostazioni\API\Controllers\UpdateImpostazioneController; use Modules\Impostazioni\API\Models\ListSezioniImpostazioniResponse; use Modules\Impostazioni\API\Models\UpdateImpostazioneRequest; use Modules\Impostazioni\API\Models\UpdateImpostazioneResponse; @@ -21,12 +21,12 @@ operations: [ new Get( uriTemplate: '/impostazioni/sezioni', - provider: ListSezioniImpostazioniProvider::class, + controller: ListSezioniImpostazioniController::class, output: ListSezioniImpostazioniResponse::class, ), new GetCollection( uriTemplate: '/impostazioni', - provider: ListImpostazioniProvider::class, + controller: ListImpostazioniController::class, paginationEnabled: false, parameters: [ 'ricerca' => new QueryParameter(property: 'hydra:freetextQuery', required: false), @@ -35,12 +35,11 @@ ), new Get( uriTemplate: '/impostazione/{id}', - provider: GetImpostazioneProvider::class, + controller: GetImpostazioneController::class, ), new Put( uriTemplate: '/impostazione/{id}', - provider: GetImpostazioneProvider::class, - processor: UpdateImpostazioneProcessor::class, + controller: UpdateImpostazioneController::class, input: UpdateImpostazioneRequest::class, output: UpdateImpostazioneResponse::class, ), From cf77e21711cff0b7f2c60d943d3ec8c125ff0833 Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Sat, 7 Feb 2026 09:50:10 +0100 Subject: [PATCH 3/7] Disable provider/processor auto-discovery --- src/Providers/AppServiceProvider.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Providers/AppServiceProvider.php b/src/Providers/AppServiceProvider.php index f5a3f600fc..b9cb7875dd 100644 --- a/src/Providers/AppServiceProvider.php +++ b/src/Providers/AppServiceProvider.php @@ -40,6 +40,8 @@ public function boot(): void $translator->setLocale($lang, $formatter); } + /* + Disable: we should use controllers for better performance // Register all Providers and Processors from Modules and Plugins foreach (get_declared_classes() as $className) { if (str_contains($className, 'Modules\\') || str_contains($className, 'API\\') || str_contains($className, 'Plugins\\')) { @@ -51,5 +53,6 @@ public function boot(): void } } } + */ } } From 7a6bb396c956e6fdccac02135048967536ebfdda Mon Sep 17 00:00:00 2001 From: Thomas Zilio Date: Sat, 28 Feb 2026 07:35:20 +0100 Subject: [PATCH 4/7] Add support for ApiPlatform home --- package.json | 3 ++- src/Controllers/APIForUIController.php | 27 +++++++++++++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 2c51a41321..d18c756f4b 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,8 @@ "setup-corepack": "npm install -g corepack && corepack enable", "export-openapi": "php artisan api:openapi:export --output=openapi.json", "fix-openapi-js": "node -e \"require('fs').writeFileSync('assets/api/src/main.js', \\\"import * as API from './index';global.window.API = API;\\\");\"", - "update-openapi-client": "npm run-script export-openapi && npx @openapitools/openapi-generator-cli generate -i openapi.json -g javascript -o assets/api --skip-validate-spec && npm run-script fix-openapi-js && cd ./assets/api && npm install && npx babel src -d dist && cd ../.. && npx browserify -y ./assets/api/dist/main.js -o ./assets/dist/js/api.js" + "copy-vendor-css-folder": "node -e \"const fs = require('fs'); const sourceFolder = './vendor/api-platform/laravel/public'; const destFolder = './assets/dist/apiplatform'; const copyFolder = (src, dest) => { if (!fs.existsSync(dest)) fs.mkdirSync(dest); fs.readdirSync(src).forEach(file => { const srcFile = path.join(src, file); const destFile = path.join(dest, file); if (fs.statSync(srcFile).isDirectory()) copyFolder(srcFile, destFile); else fs.copyFileSync(srcFile, destFile); }); }; copyFolder(sourceFolder, destFolder);\"", + "update-openapi-client": "npm run copy-vendor-css-folder && npm run-script export-openapi && npx @openapitools/openapi-generator-cli generate -i openapi.json -g javascript -o assets/api --skip-validate-spec && npm run-script fix-openapi-js && cd ./assets/api && npm install && npx babel src -d dist && cd ../.. && npx browserify -y ./assets/api/dist/main.js -o ./assets/dist/js/api.js" }, "packageManager": "yarn@4.12.0" } diff --git a/src/Controllers/APIForUIController.php b/src/Controllers/APIForUIController.php index 2942449bfc..6eff104662 100644 --- a/src/Controllers/APIForUIController.php +++ b/src/Controllers/APIForUIController.php @@ -15,10 +15,27 @@ class APIForUIController extends PageController #[Where('path', '(.*)')] public function __invoke(Request $request, ?string $path = null) { - $tokens = Auth::user()->getApiTokens(); + $user = Auth::user(); + if (!$user) { + throw new AuthorizationException(); + } + + $tokens = $user->getApiTokens(); // Determine actual API path - $url = str_replace('api-for-ui/', '', $request->fullUrl()); + $urlPieces = explode('/', $request->fullUrl()); + $apiForUIIndex = array_search('api-for-ui', $urlPieces); + + if ($apiForUIIndex === false) { // This should never happen due to the route definition + return response()->json(['error' => 'Invalid API path'], 400); + } + + $pathLength = count($urlPieces) - 1 - (int) $apiForUIIndex; + + // Only remove the api-for-ui part and keep the rest of the path + $prefix = implode('/', array_slice($urlPieces, 0, $apiForUIIndex)); + array_splice($urlPieces, $apiForUIIndex, 1); + $url = implode('/', $urlPieces); // Create a new Guzzle client $client = new Client(); @@ -36,7 +53,7 @@ public function __invoke(Request $request, ?string $path = null) $formattedHeaders['X-API-Key'] = $tokens[0]['token']; try { - // Make the GET request + // Make the request $response = $client->request($request->method(), $url, [ 'headers' => $formattedHeaders, 'json' => $request->all(), @@ -44,6 +61,10 @@ public function __invoke(Request $request, ?string $path = null) // Get the body of the response $body = $response->getBody(); + if ($pathLength == 1 && str_ends_with($url, "/api")) { + return str_replace("/vendor/api-platform", str_replace("/public", "", $prefix)."/assets/dist/apiplatform", $body); + } + $data = json_decode($body, true); // Decode JSON to array // Return the response data From 72546c4711abe1c1a63ba078ff5ca5feb3f01fdd Mon Sep 17 00:00:00 2001 From: Dasc3er Date: Wed, 8 Jul 2026 21:09:51 +0200 Subject: [PATCH 5/7] Cleanup auth checks --- config.example.php | 1 - .../Controllers/GetImpostazioneController.php | 12 +- .../ListImpostazioniController.php | 14 +-- .../ListSezioniImpostazioniController.php | 12 +- .../UpdateImpostazioneController.php | 14 +-- src/API/Controllers/BaseController.php | 109 +++++++++++++++--- src/API/Controllers/DataTablesController.php | 28 +++-- src/Middlewares/APIAuthMiddleware.php | 8 +- src/Models/Module.php | 15 ++- 9 files changed, 148 insertions(+), 65 deletions(-) diff --git a/config.example.php b/config.example.php index a7a784d394..7c4920e7aa 100755 --- a/config.example.php +++ b/config.example.php @@ -37,7 +37,6 @@ // Impostazioni di debug $debug = false; -$api_development = false; // Se true, disabilita l'autenticazione dell'API $disable_hooks = false; diff --git a/modules/impostazioni/src/API/Controllers/GetImpostazioneController.php b/modules/impostazioni/src/API/Controllers/GetImpostazioneController.php index d87d6e2578..230834b847 100644 --- a/modules/impostazioni/src/API/Controllers/GetImpostazioneController.php +++ b/modules/impostazioni/src/API/Controllers/GetImpostazioneController.php @@ -7,17 +7,12 @@ use Illuminate\Http\Request; use Models\Setting; use Modules\Impostazioni\API\ImpostazioneResource; -use Illuminate\Auth\Access\AuthorizationException; -use Illuminate\Support\Facades\Auth; final class GetImpostazioneController extends BaseController { public function __invoke(Request $request): JsonResponse { - $user = Auth::user(); - if (!$user || !$user->is_admin) { - throw new AuthorizationException(); - } + $this->init($request); $setting = Setting::find($request->route('id')); if (!$setting) { @@ -28,4 +23,9 @@ public function __invoke(Request $request): JsonResponse return new JsonResponse($response); } + + protected function hasAccess($request): bool + { + return $this->hasModuleReadAccess('Impostazioni'); + } } diff --git a/modules/impostazioni/src/API/Controllers/ListImpostazioniController.php b/modules/impostazioni/src/API/Controllers/ListImpostazioniController.php index 76821210fa..5286581d30 100644 --- a/modules/impostazioni/src/API/Controllers/ListImpostazioniController.php +++ b/modules/impostazioni/src/API/Controllers/ListImpostazioniController.php @@ -5,8 +5,6 @@ use API\Controllers\BaseController; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -use Illuminate\Auth\Access\AuthorizationException; -use Illuminate\Support\Facades\Auth; use Models\Setting; use Modules\Impostazioni\API\ImpostazioneResource; @@ -14,11 +12,8 @@ final class ListImpostazioniController extends BaseController { public function __invoke(Request $request): JsonResponse { - $user = Auth::user(); - if (!$user || !$user->is_admin) { - throw new AuthorizationException(); - } - + $this->init($request); + $sezione = $request->query('sezione'); $search = $request->query('ricerca'); @@ -40,4 +35,9 @@ public function __invoke(Request $request): JsonResponse return new JsonResponse($results); } + + protected function hasAccess($request): bool + { + return $this->hasModuleReadAccess('Impostazioni'); + } } diff --git a/modules/impostazioni/src/API/Controllers/ListSezioniImpostazioniController.php b/modules/impostazioni/src/API/Controllers/ListSezioniImpostazioniController.php index 026a4bbdea..b96c3d0eb4 100644 --- a/modules/impostazioni/src/API/Controllers/ListSezioniImpostazioniController.php +++ b/modules/impostazioni/src/API/Controllers/ListSezioniImpostazioniController.php @@ -5,8 +5,6 @@ use API\Controllers\BaseController; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; -use Illuminate\Auth\Access\AuthorizationException; -use Illuminate\Support\Facades\Auth; use Models\Setting; use Modules\Impostazioni\API\Models\ListSezioniImpostazioniResponse; @@ -14,10 +12,7 @@ final class ListSezioniImpostazioniController extends BaseController { public function __invoke(Request $request): JsonResponse { - $user = Auth::user(); - if (!$user || !$user->is_admin) { - throw new AuthorizationException(); - } + $this->init($request); $gruppi = Setting::selectRaw('sezione AS nome, COUNT(id) AS numero') ->groupBy(['sezione']) @@ -33,4 +28,9 @@ public function __invoke(Request $request): JsonResponse return new JsonResponse($response); } + + protected function hasAccess($request): bool + { + return $this->hasModuleReadAccess('Impostazioni'); + } } diff --git a/modules/impostazioni/src/API/Controllers/UpdateImpostazioneController.php b/modules/impostazioni/src/API/Controllers/UpdateImpostazioneController.php index 37c7944b58..be8fbc4501 100644 --- a/modules/impostazioni/src/API/Controllers/UpdateImpostazioneController.php +++ b/modules/impostazioni/src/API/Controllers/UpdateImpostazioneController.php @@ -8,19 +8,12 @@ use Models\Setting; use Modules\Impostazioni\API\Models\UpdateImpostazioneRequest; use Modules\Impostazioni\API\Models\UpdateImpostazioneResponse; -use Illuminate\Auth\Access\AuthorizationException; -use Illuminate\Support\Facades\Auth; final class UpdateImpostazioneController extends BaseController { public function __invoke(Request $request): JsonResponse { - $user = Auth::user(); - if (!$user || !$user->is_admin) { - throw new AuthorizationException(); - } - - $data = $this->_cast($request, UpdateImpostazioneRequest::class); + $data = $this->init($request, UpdateImpostazioneRequest::class); $id = $request->route('id'); $response = new UpdateImpostazioneResponse(); @@ -36,4 +29,9 @@ public function __invoke(Request $request): JsonResponse return new JsonResponse($response); } + + protected function hasAccess($request): bool + { + return $this->hasModuleWriteAccess('Impostazioni'); + } } diff --git a/src/API/Controllers/BaseController.php b/src/API/Controllers/BaseController.php index 3d6bc3fda9..7a2f6c23ef 100644 --- a/src/API/Controllers/BaseController.php +++ b/src/API/Controllers/BaseController.php @@ -2,44 +2,90 @@ 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\Auth\Access\AuthorizationException; use Illuminate\Http\Request; use Illuminate\Routing\Controller; +use Illuminate\Support\Facades\Auth; +use Models\Module; +use Models\Plugin; -use Exception; - -class InvalidInputException extends Exception { - public function __construct(\CuyZ\Valinor\Mapper\MappingError $error) { +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()); + $formatted[] = str_replace('. for', ' for', $message->withBody('{original_message} for parameter "{node_path}"')->toString()); } - parent::__construct("Invalid input: ".implode("\n", $formatted)); + parent::__construct('Invalid input: '.implode("\n", $formatted)); } } abstract class BaseController extends Controller { + abstract protected function hasAccess($request): bool; + + protected function _auth($request): void + { + if (!$this->hasAccess($request)) { + throw new AuthorizationException(); + } + } + + protected function hasModuleReadAccess($name): bool + { + $structure = $this->getModule($name); + + return $structure && ($structure->permission == 'r' || $structure->permission == 'rw'); + } + + protected function hasModuleWriteAccess($name): bool + { + $structure = $this->getModule($name); + + return $structure && $structure->permission == 'rw'; + } + + protected function hasPluginReadAccess($name): bool + { + $structure = $this->getPlugin($name); + + return $structure && ($structure->permission == 'r' || $structure->permission == 'rw'); + } + + protected function hasPluginWriteAccess($name): bool + { + $structure = $this->getPlugin($name); + + return $structure && $structure->permission == 'rw'; + } + /** + * @template T + * + * @param class-string|Request $class_reference + * + * @return T + */ + protected function init(Request $request, ?string $class_reference = null): mixed + { + $parsed_request = $class_reference ? $this->_cast($request, $class_reference) : $request; + $this->_auth($request); + + return $parsed_request; + } + + /**class_reference * @template T * @param class-string $class_reference * @return T */ - public function _cast(Request $request, string $class_reference): mixed + protected function _cast(Request $request, string $class_reference): mixed { - try { + try { return (new \CuyZ\Valinor\MapperBuilder()) ->allowUndefinedValues() ->allowSuperfluousKeys() @@ -53,4 +99,29 @@ public function _cast(Request $request, string $class_reference): mixed throw new InvalidInputException($error); } } + + private function getModule($name): ?Module + { + if (!Auth::user()) { + return null; + } + + $structure = Module::where('name', $name)->first(); + \Modules::setCurrent($structure->id); + + return $structure; + } + + private function getPlugin($name): ?Plugin + { + if (!Auth::user()) { + return null; + } + + $structure = Plugin::where('name', $name)->first(); + \Plugins::setCurrent($structure->id); + \Modules::setCurrent($structure->id_module_from); + + return $structure; + } } diff --git a/src/API/Controllers/DataTablesController.php b/src/API/Controllers/DataTablesController.php index fcae21183b..14dfeee336 100644 --- a/src/API/Controllers/DataTablesController.php +++ b/src/API/Controllers/DataTablesController.php @@ -6,12 +6,11 @@ use DTO\DataTablesLoadRequest\Column; use DTO\DataTablesLoadRequest\DataTablesLoadRequest; use DTO\DataTablesLoadResponse\DataTablesLoadResponse; -use Models\Module; -use Util\Query; - +use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; - +use Models\Module; +use Util\Query; #[Post( uriTemplate: '/datatables/list/{id_module}/{id_plugin}/{id_parent}', @@ -27,7 +26,7 @@ final class DataTablesController extends BaseController { public function __invoke(Request $request): JsonResponse { - $request_body = $this->_cast($request, DataTablesLoadRequest::class); + $request_body = $this->init($request, DataTablesLoadRequest::class); $id_module = (int) $request_body->getIdModule(); $id_plugin = (int) $request_body->getIdPlugin(); @@ -35,7 +34,7 @@ public function __invoke(Request $request): JsonResponse $module = \Modules::get($id_module); \Modules::setCurrent($id_module); - + $plugin = null; if (!empty($id_plugin)) { \Plugins::setCurrent($id_plugin); @@ -44,7 +43,22 @@ public function __invoke(Request $request): JsonResponse $structure = $plugin ?? $module; - return new JsonResponse($this->retrieveRecords($structure, $request_body, $id_module, $id_plugin, $id_parent)); + if (!$structure->permission == 'r' && !$structure->permission == 'rw') { + throw new AuthorizationException(); + } + + $type = $structure['option']; + + if (!empty($type) && $type != 'menu' && $type != 'custom') { + return new JsonResponse($this->retrieveRecords($structure, $request_body, $id_module, $id_plugin, $id_parent)); + } + + throw new AuthorizationException(); + } + + protected function hasAccess($request): bool + { + return true; } /* diff --git a/src/Middlewares/APIAuthMiddleware.php b/src/Middlewares/APIAuthMiddleware.php index 9051c69ac4..d6ab847fa7 100644 --- a/src/Middlewares/APIAuthMiddleware.php +++ b/src/Middlewares/APIAuthMiddleware.php @@ -7,6 +7,7 @@ use Models\User; use Models\UserTokens; use Symfony\Component\HttpFoundation\Response; +use Illuminate\Auth\AuthenticationException; class APIAuthMiddleware { @@ -37,11 +38,6 @@ public function handle(Request $request, \Closure $next): Response } } - // Disabilita autenticazione su base delle opzioni - if (config('osm.api_development', false) && !$request->headers->has('X-API-Key')) { - return $next($request); - } - - return response()->json(['error' => 'Unauthenticated.'], 401); + throw new AuthenticationException(); } } diff --git a/src/Models/Module.php b/src/Models/Module.php index cba13b00a9..c00b642dd0 100755 --- a/src/Models/Module.php +++ b/src/Models/Module.php @@ -118,15 +118,20 @@ public function getPlaceholders($id_record, $options = []) */ public function getPermissionAttribute() { - if (auth_osm()->getUser()->is_admin) { + $user = auth_osm()->getUser(); + if ($user->is_admin) { return 'rw'; } - $group = auth_osm()->getUser()->group->id; - - $pivot = $this->pivot ?: $this->groups->first(fn ($item) => $item->id == $group)->pivot; + $pivot = $this->pivot; // Se già disponibile, utilizza + if(!$pivot) { + $group = $user->group->id; + $match = $this->groups->first(fn ($item) => $item->id == $group); + $pivot = $match ? $match->pivot : null; + } - return $pivot->permessi ?: '-'; + $default = '-'; + return $pivot ? ($pivot->permessi ?: $default) : $default; } /** From b9684dcadca9a9b46cff9de63d1221a2cc647113 Mon Sep 17 00:00:00 2001 From: Dasc3er Date: Sat, 11 Jul 2026 18:50:31 +0200 Subject: [PATCH 6/7] Migliora impostazioni Laravel --- config/filesystems.php | 2 +- config/logging.php | 26 +++++++++++--------------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/config/filesystems.php b/config/filesystems.php index 0b67cfd6eb..a01fe04280 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -39,7 +39,7 @@ 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), - 'url' => config('app.url').'/files', + 'url' => rtrim(config('app.url'), '/').'/storage', 'visibility' => 'public', 'throw' => false, 'report' => false, diff --git a/config/logging.php b/config/logging.php index cd0304213e..a77140d546 100644 --- a/config/logging.php +++ b/config/logging.php @@ -6,6 +6,7 @@ use Monolog\Processor\PsrLogMessageProcessor; return [ + /* |-------------------------------------------------------------------------- | Default Log Channel @@ -17,7 +18,7 @@ | */ - 'default' => env('LOG_CHANNEL', 'daily'), + 'default' => env('LOG_CHANNEL', 'stack'), /* |-------------------------------------------------------------------------- @@ -50,39 +51,32 @@ */ 'channels' => [ + 'stack' => [ 'driver' => 'stack', 'channels' => explode(',', (string) env('LOG_STACK', 'single')), 'ignore_exceptions' => false, ], - /* - * Tutti i log applicativi (Laravel + logger_osm()) scrivono in logs/ - * nella root del progetto, insieme a error.log e cron-*.log. - * Non usare storage_path() per i log: in OpenSTAManager - * puoi trovare tutto in logs/ e non in storage/logs/. - * La cartella storage/logs/ viene mantenuta vuota perché Laravel - * la ricrea automaticamente al bootstrap. - */ 'single' => [ 'driver' => 'single', - 'path' => base_path_osm().'logs/app.log', + 'path' => storage_path('logs/laravel.log'), 'level' => env('LOG_LEVEL', 'debug'), 'replace_placeholders' => true, ], 'daily' => [ 'driver' => 'daily', - 'path' => base_path_osm().'logs/app.log', + 'path' => storage_path('logs/laravel.log'), 'level' => env('LOG_LEVEL', 'debug'), - 'days' => env('LOG_DAILY_DAYS', 30), + 'days' => env('LOG_DAILY_DAYS', 14), 'replace_placeholders' => true, ], 'slack' => [ 'driver' => 'slack', 'url' => env('LOG_SLACK_WEBHOOK_URL'), - 'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'), + 'username' => env('LOG_SLACK_USERNAME', env('APP_NAME', 'Laravel')), 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), 'level' => env('LOG_LEVEL', 'critical'), 'replace_placeholders' => true, @@ -130,7 +124,9 @@ ], 'emergency' => [ - 'path' => base_path_osm().'logs/app.log', + 'path' => storage_path('logs/laravel.log'), ], + ], -]; + +]; \ No newline at end of file From b6a63b474f706f8d4c9439c45ce1a9eedf868b84 Mon Sep 17 00:00:00 2001 From: valentina Date: Fri, 17 Jul 2026 17:48:42 +0200 Subject: [PATCH 7/7] fix: ripristina attributi data-* in DataTablesController, log path OSM, rimuove dead code e fromArray obsoleto --- config/logging.php | 18 ++++++-- src/API/Controllers/DataTablesController.php | 46 ++++--------------- .../DataTablesLoadResponse.php | 2 +- 3 files changed, 24 insertions(+), 42 deletions(-) diff --git a/config/logging.php b/config/logging.php index a77140d546..27dc2e1e79 100644 --- a/config/logging.php +++ b/config/logging.php @@ -58,25 +58,33 @@ 'ignore_exceptions' => false, ], + /* + * Tutti i log applicativi (Laravel + logger_osm()) scrivono in logs/ + * nella root del progetto, insieme a error.log e cron-*.log. + * Non usare storage_path() per i log: in OpenSTAManager + * puoi trovare tutto in logs/ e non in storage/logs/. + * La cartella storage/logs/ viene mantenuta vuota perché Laravel + * la ricrea automaticamente al bootstrap. + */ 'single' => [ 'driver' => 'single', - 'path' => storage_path('logs/laravel.log'), + 'path' => base_path_osm().'logs/app.log', 'level' => env('LOG_LEVEL', 'debug'), 'replace_placeholders' => true, ], 'daily' => [ 'driver' => 'daily', - 'path' => storage_path('logs/laravel.log'), + 'path' => base_path_osm().'logs/app.log', 'level' => env('LOG_LEVEL', 'debug'), - 'days' => env('LOG_DAILY_DAYS', 14), + 'days' => env('LOG_DAILY_DAYS', 30), 'replace_placeholders' => true, ], 'slack' => [ 'driver' => 'slack', 'url' => env('LOG_SLACK_WEBHOOK_URL'), - 'username' => env('LOG_SLACK_USERNAME', env('APP_NAME', 'Laravel')), + 'username' => env('LOG_SLACK_USERNAME', 'Laravel Log'), 'emoji' => env('LOG_SLACK_EMOJI', ':boom:'), 'level' => env('LOG_LEVEL', 'critical'), 'replace_placeholders' => true, @@ -124,7 +132,7 @@ ], 'emergency' => [ - 'path' => storage_path('logs/laravel.log'), + 'path' => base_path_osm().'logs/app.log', ], ], diff --git a/src/API/Controllers/DataTablesController.php b/src/API/Controllers/DataTablesController.php index 14dfeee336..1f8aa3357f 100644 --- a/src/API/Controllers/DataTablesController.php +++ b/src/API/Controllers/DataTablesController.php @@ -3,7 +3,6 @@ namespace API\Controllers; use ApiPlatform\Metadata\Post; -use DTO\DataTablesLoadRequest\Column; use DTO\DataTablesLoadRequest\DataTablesLoadRequest; use DTO\DataTablesLoadResponse\DataTablesLoadResponse; use Illuminate\Auth\Access\AuthorizationException; @@ -61,31 +60,6 @@ protected function hasAccess($request): bool return true; } - /* - public function process(mixed $request, Operation $operation, array $uriVariables = [], array $context = []): DataTablesLoadResponse - { - if (!$request instanceof DataTablesLoadRequest) { - throw new \InvalidArgumentException(); - } - - $id_module = !empty($uriVariables['id_module']) ? $uriVariables['id_module'] : null; - $id_plugin = !empty($uriVariables['id_plugin']) ? $uriVariables['id_plugin'] : null; - $id_parent = !empty($uriVariables['id_parent']) ? $uriVariables['id_parent'] : null; - - $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 $this->retrieveRecords($structure, $request, $id_module, $id_plugin, $id_parent); - }*/ - private function retrieveRecords($structure, DataTablesLoadRequest $request, $id_module, $id_plugin, $id_parent): DataTablesLoadResponse { // Informazioni fondamentali @@ -111,7 +85,7 @@ private function retrieveRecords($structure, DataTablesLoadRequest $request, $id $columns = $request->columns; array_shift($columns); for ($i = 0; $i < count($columns); ++$i) { - $col = Column::fromArray($columns[$i]); + $col = $columns[$i]; if (!empty($col->search->value) || $col->search->value == '0') { $search[$query_structure['fields'][$i]] = $col->search->value; } @@ -195,7 +169,7 @@ private function getSingleRow($r, $query_structure, $align, $id_module, $id_plug $result = [ 'id' => $r['id'], - '', // Colonna ID + '', // Colonna ID ]; foreach ($query_structure['fields'] as $pos => $field) { @@ -203,9 +177,9 @@ private function getSingleRow($r, $query_structure, $align, $id_module, $id_plug if (!empty($r['_bg_'])) { if (preg_match('/-light$/', (string) $r['_bg_'])) { - $column['request-background'] = substr((string) $r['_bg_'], 0, -6); // Remove the "-light" suffix from the word + $column['data-background'] = substr((string) $r['_bg_'], 0, -6); // Remove the "-light" suffix from the word } else { - $column['request-background'] = $r['_bg_']; + $column['data-background'] = $r['_bg_']; } } @@ -252,7 +226,7 @@ private function getSingleRow($r, $query_structure, $align, $id_module, $id_plug } $column['class'] = 'text-center small'; - $column['request-background'] = $r[$field]; + $column['data-background'] = $r[$field]; } // Icona di stampa @@ -286,8 +260,8 @@ private function getSingleRow($r, $query_structure, $align, $id_module, $id_plug } // Colore del testo - if (!empty($column['request-background'])) { - $column['request-color'] ??= color_inverse(trim((string) $column['request-background'])); + if (!empty($column['data-background'])) { + $column['data-color'] ??= color_inverse(trim((string) $column['data-background'])); } elseif (preg_match('/^mailto_(.+?)$/', trim((string) $field), $m)) { $column['class'] = ''; $value = ($r[$field] ? ' '.$r[$field].'' : ''); @@ -310,13 +284,13 @@ private function getSingleRow($r, $query_structure, $align, $id_module, $id_plug // Link per i moduli if (empty($id_plugin)) { - $column['request-link'] = base_path_osm().'/editor.php?id_module='.$id_module.'&id_record='.$id_record.$hash; + $column['data-link'] = base_path_osm().'/editor.php?id_module='.$id_module.'&id_record='.$id_record.$hash; } // Link per i plugin else { - $column['request-link'] = base_path_osm().'/add.php?id_module='.$id_module.'&id_record='.$id_record.'&id_plugin='.$id_plugin.'&id_parent='.$id_parent.'&edit=1'.$hash; + $column['data-link'] = base_path_osm().'/add.php?id_module='.$id_module.'&id_record='.$id_record.'&id_plugin='.$id_plugin.'&id_parent='.$id_parent.'&edit=1'.$hash; - $column['request-type'] = 'dialog'; + $column['data-type'] = 'dialog'; } } diff --git a/src/DTO/DataTablesLoadResponse/DataTablesLoadResponse.php b/src/DTO/DataTablesLoadResponse/DataTablesLoadResponse.php index ecf22daf12..069eb95375 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, - $this->error ? ['error' => $this->error] : [], + 'error' => $this->error, ]; } }