{"elements":[{"id":7004,"title":"API REST","body":"<section class=\"da-section\">\n  <div class=\"container\">\n    <h2>Endpoint Standard<\/h2>\n    <p class=\"lead\">DressAPI genera automaticamente endpoint RESTful per ogni tabella del database, esponendo le operazioni CRUD standard attraverso i metodi HTTP. Ogni risorsa &egrave; immediatamente accessibile con filtri, paginazione, ordinamento e risoluzione delle relazioni, senza configurazione aggiuntiva.<\/p>\n\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\">\n          <tr><th>Metodo<\/th><th>Endpoint<\/th><th>Descrizione<\/th><\/tr>\n        <\/thead>\n        <tbody>\n          <tr><td><span class=\"badge bg-info\">OPTIONS<\/span><\/td><td><code>\/info\/modules<\/code><\/td><td>Lista moduli disponibili<\/td><\/tr>\n          <tr><td><span class=\"badge bg-success\">GET<\/span><\/td><td><code>\/{modulo}<\/code><\/td><td>Lista elementi<\/td><\/tr>\n          <tr><td><span class=\"badge bg-success\">GET<\/span><\/td><td><code>\/{modulo}\/{id}<\/code><\/td><td>Singolo elemento<\/td><\/tr>\n          <tr><td><span class=\"badge bg-success\">GET<\/span><\/td><td><code>\/{modulo}\/{id}\/full<\/code><\/td><td>Elemento con relazioni risolte<\/td><\/tr>\n          <tr><td><span class=\"badge bg-success\">GET<\/span><\/td><td><code>\/{modulo}\/picklist<\/code><\/td><td>Dati per dropdown (id + name)<\/td><\/tr>\n          <tr><td><span class=\"badge bg-primary\">POST<\/span><\/td><td><code>\/{modulo}<\/code><\/td><td>Crea elemento<\/td><\/tr>\n          <tr><td><span class=\"badge bg-warning text-dark\">PUT\/PATCH<\/span><\/td><td><code>\/{modulo}\/{id}<\/code><\/td><td>Modifica elemento<\/td><\/tr>\n          <tr><td><span class=\"badge bg-danger\">DELETE<\/span><\/td><td><code>\/{modulo}\/{id}<\/code><\/td><td>Elimina elemento<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <h3 class=\"mt-5\">Query via URL<\/h3>\n\n    <h4 class=\"mt-4\">Paginazione<\/h4>\n    <ul>\n      <li><code>\/p\/{pagina}<\/code> &ndash; Pagina specifica<\/li>\n      <li><code>\/p\/{pagina},{per_pagina}<\/code> &ndash; Pagina con numero elementi<\/li>\n    <\/ul>\n\n    <h4 class=\"mt-4\">Ordinamento<\/h4>\n    <ul>\n      <li><code>\/ob\/{campo}<\/code> &ndash; Ordine ascendente<\/li>\n      <li><code>\/ob\/{campo}-DESC<\/code> &ndash; Ordine discendente<\/li>\n    <\/ul>\n\n    <h4 class=\"mt-4\">Filtri<\/h4>\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\">\n          <tr><th>Operatore<\/th><th>Sintassi<\/th><th>Esempio<\/th><\/tr>\n        <\/thead>\n        <tbody>\n          <tr><td>Uguale<\/td><td><code>\/{campo}={valore}<\/code><\/td><td><code>\/product\/status=active<\/code><\/td><\/tr>\n          <tr><td>Maggiore<\/td><td><code>\/{campo}&gt;{valore}<\/code><\/td><td><code>\/product\/price&gt;50<\/code><\/td><\/tr>\n          <tr><td>Minore<\/td><td><code>\/{campo}&lt;{valore}<\/code><\/td><td><code>\/product\/price&lt;100<\/code><\/td><\/tr>\n          <tr><td>Maggiore o uguale<\/td><td><code>\/{campo}&gt;={valore}<\/code><\/td><td><code>\/product\/price&gt;=10<\/code><\/td><\/tr>\n          <tr><td>Minore o uguale<\/td><td><code>\/{campo}&lt;={valore}<\/code><\/td><td><code>\/product\/price&lt;=50<\/code><\/td><\/tr>\n          <tr><td>Contiene (LIKE)<\/td><td><code>\/{campo}~{valore}<\/code><\/td><td><code>\/product\/name~shirt<\/code><\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <h4 class=\"mt-4\">Flag speciali<\/h4>\n    <ul>\n      <li><code>\/full<\/code> &ndash; Restituisce info complete con nomi risolti delle foreign key<\/li>\n      <li><code>\/form<\/code> &ndash; Dati predisposti per form di modifica<\/li>\n    <\/ul>\n\n    <h3 class=\"mt-5\">Gestione Relazioni (Architettura Atomica)<\/h3>\n    <p>DressAPI gestisce le relazioni tra tabelle con richieste separate e atomiche, ottimizzando cache e trasporto dati:<\/p>\n    <ol>\n      <li><strong>Richiesta principale<\/strong> (<code>GET \/{modulo}<\/code>): restituisce dati + <code>structure<\/code> (metadati campi) + <code>related_tables<\/code><\/li>\n      <li><strong>Flag <code>\/full<\/code><\/strong>: risolve gli ID delle FK nei nomi leggibili<\/li>\n      <li><strong>Picklist<\/strong> (<code>GET \/{modulo}\/picklist<\/code>): array <code>[{id, name}]<\/code> per popolare dropdown<\/li>\n      <li><strong>Relatedlist<\/strong> (<code>GET \/{modulo}\/relatedlist<\/code>): elementi delle tabelle correlate<\/li>\n    <\/ol>\n\n    <h3 class=\"mt-5\">Struttura della risposta<\/h3>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">JSON Response<\/div>\n{\n  <span class=\"str\">\"elements\"<\/span>: [...],           <span class=\"cm\">\/\/ Dati<\/span>\n  <span class=\"str\">\"structure\"<\/span>: {...},          <span class=\"cm\">\/\/ Definizione campi (tipo, html_type, null, ecc.)<\/span>\n  <span class=\"str\">\"permissions\"<\/span>: {...},        <span class=\"cm\">\/\/ Permessi CRUD dell'utente corrente<\/span>\n  <span class=\"str\">\"relations\"<\/span>: {...},          <span class=\"cm\">\/\/ Opzioni FK per i form<\/span>\n  <span class=\"str\">\"related_tables\"<\/span>: [...],     <span class=\"cm\">\/\/ Tabelle con relazioni verso questa<\/span>\n  <span class=\"str\">\"page_info\"<\/span>: {\n    <span class=\"str\">\"pagination\"<\/span>: {...},       <span class=\"cm\">\/\/ Metadati paginazione<\/span>\n    <span class=\"str\">\"module\"<\/span>: {...}            <span class=\"cm\">\/\/ Info modulo<\/span>\n  }\n}\n    <\/div>\n\n    <h3 class=\"mt-5\">Formati di output<\/h3>\n    <p>Il formato viene determinato dall'header <code>Accept<\/code>:<\/p>\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\">\n          <tr><th>Accept Header<\/th><th>Formato<\/th><\/tr>\n        <\/thead>\n        <tbody>\n          <tr><td><code>application\/json<\/code><\/td><td>JSON (default)<\/td><\/tr>\n          <tr><td><code>application\/xml<\/code><\/td><td>XML<\/td><\/tr>\n          <tr><td><code>text\/html<\/code><\/td><td>HTML (modalit&agrave; CMS)<\/td><\/tr>\n          <tr><td><code>text\/plain<\/code><\/td><td>Testo semplice<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section class=\"da-section text-center\">\n  <a href=\"\/tutorials\" class=\"btn btn-outline-primary\">&larr; Torna ai Tutorial<\/a>\n<\/section>\n\n\n<!-- ============================================================ -->\n<!-- Section: Curl Examples -->\n<!-- ============================================================ -->\n<section class=\"da-section da-section-alt\">\n  <div class=\"container\">\n    <h2 class=\"text-center mb-5\">Esempi con Curl<\/h2>\n\n    <h3 class=\"mb-3\">Login e Salvataggio del Token<\/h3>\n    <p>La risposta al login e' <strong>testo puro<\/strong> &mdash; il token JWT direttamente, senza involucro JSON. Si puo' salvare in una variabile shell o in un file.<\/p>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">Login e salvataggio token<\/div>\n<span class=\"cm\"># Store token in a shell variable<\/span>\nTOKEN=$(<span class=\"fn\">curl<\/span> <span class=\"str\">-s<\/span> -X <span class=\"kw\">POST<\/span> https:\/\/api.example.com\/sign \n  -d <span class=\"str\">\"dusername=admin&amp;dpassword=secret\"<\/span>)\n\n<span class=\"cm\"># Or store it in a file<\/span>\n<span class=\"fn\">curl<\/span> <span class=\"str\">-s<\/span> -X <span class=\"kw\">POST<\/span> https:\/\/api.example.com\/sign \n  -d <span class=\"str\">\"dusername=admin&amp;dpassword=secret\"<\/span> &gt; \/tmp\/jwt_token.txt\n\n<span class=\"cm\"># Via \/login alias (if configured in _route table)<\/span>\nTOKEN=$(<span class=\"fn\">curl<\/span> <span class=\"str\">-s<\/span> -X <span class=\"kw\">POST<\/span> https:\/\/api.example.com\/login \n  -d <span class=\"str\">\"dusername=admin&amp;dpassword=secret\"<\/span>)<\/div>\n\n    <h3 class=\"mt-4 mb-3\">Verifica del Token<\/h3>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">Verifica token<\/div>\n<span class=\"cm\"># Print the stored token<\/span>\n<span class=\"fn\">echo<\/span> <span class=\"str\">$TOKEN<\/span>\n<span class=\"cm\"># eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...<\/span>\n\n<span class=\"cm\"># Or from file<\/span>\n<span class=\"fn\">cat<\/span> \/tmp\/jwt_token.txt<\/div>\n\n    <h3 class=\"mt-4 mb-3\">Operazioni CRUD via Curl<\/h3>\n\n    <h4 class=\"mt-3\"><span class=\"badge bg-success\">GET<\/span> Lista di tutti gli elementi<\/h4>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">GET - List<\/div>\n<span class=\"fn\">curl<\/span> <span class=\"str\">-s<\/span> \n  -H <span class=\"str\">\"Authorization: Bearer $TOKEN\"<\/span> \n  -H <span class=\"str\">\"Accept: application\/json\"<\/span> \n  <span class=\"str\">\"https:\/\/api.example.com\/products\"<\/span><\/div>\n\n    <h4 class=\"mt-3\"><span class=\"badge bg-success\">GET<\/span> Singolo elemento<\/h4>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">GET - Single<\/div>\n<span class=\"fn\">curl<\/span> <span class=\"str\">-s<\/span> \n  -H <span class=\"str\">\"Authorization: Bearer $TOKEN\"<\/span> \n  -H <span class=\"str\">\"Accept: application\/json\"<\/span> \n  <span class=\"str\">\"https:\/\/api.example.com\/products\/42\"<\/span><\/div>\n\n    <h4 class=\"mt-3\"><span class=\"badge bg-primary\">POST<\/span> Crea elemento<\/h4>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">POST - Create<\/div>\n<span class=\"fn\">curl<\/span> <span class=\"str\">-s<\/span> -X <span class=\"kw\">POST<\/span> \n  -H <span class=\"str\">\"Authorization: Bearer $TOKEN\"<\/span> \n  -H <span class=\"str\">\"Content-Type: application\/json\"<\/span> \n  -H <span class=\"str\">\"Accept: application\/json\"<\/span> \n  -d <span class=\"str\">'{\"name\": \"New Product\", \"price\": 99.99}'<\/span> \n  <span class=\"str\">\"https:\/\/api.example.com\/products\"<\/span><\/div>\n\n    <h4 class=\"mt-3\"><span class=\"badge bg-warning text-dark\">PATCH<\/span> Aggiorna elemento<\/h4>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">PATCH - Update<\/div>\n<span class=\"fn\">curl<\/span> <span class=\"str\">-s<\/span> -X <span class=\"kw\">PATCH<\/span> \n  -H <span class=\"str\">\"Authorization: Bearer $TOKEN\"<\/span> \n  -H <span class=\"str\">\"Content-Type: application\/json\"<\/span> \n  -H <span class=\"str\">\"Accept: application\/json\"<\/span> \n  -d <span class=\"str\">'{\"price\": 89.99}'<\/span> \n  <span class=\"str\">\"https:\/\/api.example.com\/products\/42\"<\/span><\/div>\n\n    <h4 class=\"mt-3\"><span class=\"badge bg-danger\">DELETE<\/span> Elimina elemento<\/h4>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">DELETE - Remove<\/div>\n<span class=\"fn\">curl<\/span> <span class=\"str\">-s<\/span> -X <span class=\"kw\">DELETE<\/span> \n  -H <span class=\"str\">\"Authorization: Bearer $TOKEN\"<\/span> \n  -H <span class=\"str\">\"Accept: application\/json\"<\/span> \n  <span class=\"str\">\"https:\/\/api.example.com\/products\/42\"<\/span><\/div>\n\n    <h3 class=\"mt-4 mb-3\">Comandi di Debug<\/h3>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">Debug e risoluzione problemi<\/div>\n<span class=\"cm\"># Verbose mode - full HTTP dialog<\/span>\n<span class=\"fn\">curl<\/span> <span class=\"str\">-v<\/span> \n  -H <span class=\"str\">\"Authorization: Bearer $TOKEN\"<\/span> \n  <span class=\"str\">\"https:\/\/api.example.com\/products\"<\/span>\n\n<span class=\"cm\"># Show response headers<\/span>\n<span class=\"fn\">curl<\/span> <span class=\"str\">-s -i<\/span> \n  -H <span class=\"str\">\"Authorization: Bearer $TOKEN\"<\/span> \n  <span class=\"str\">\"https:\/\/api.example.com\/products\"<\/span>\n\n<span class=\"cm\"># Check HTTP status code only<\/span>\n<span class=\"fn\">curl<\/span> <span class=\"str\">-s -o \/dev\/null -w \"%{http_code}\"<\/span> \n  -H <span class=\"str\">\"Authorization: Bearer $TOKEN\"<\/span> \n  <span class=\"str\">\"https:\/\/api.example.com\/products\"<\/span>\n\n<span class=\"cm\"># Pretty-print JSON output<\/span>\n<span class=\"fn\">curl<\/span> <span class=\"str\">-s<\/span> \n  -H <span class=\"str\">\"Authorization: Bearer $TOKEN\"<\/span> \n  <span class=\"str\">\"https:\/\/api.example.com\/products\"<\/span> | <span class=\"fn\">python3<\/span> -m json.tool<\/div>\n\n    <div class=\"text-center mt-4\">\n      <a href=\"\/tutorials\" class=\"btn btn-outline-secondary\">&larr; Torna ai Tutorial<\/a>\n    <\/div>\n  <\/div>\n<\/section>\n<!-- ============================================================ -->\n<!-- Section: User Registration -->\n<!-- ============================================================ -->\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2 class=\"text-center mb-5\">Registrazione Utente<\/h2>\n\n    <h3 class=\"mb-3\"><span class=\"badge bg-primary\">POST<\/span> \/sign\/insert<\/h3>\n    <p>Crea un nuovo account utente. I campi di registrazione dipendono dalla struttura della tabella <code>_user<\/code> nel database.<\/p>\n\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">Richiesta di registrazione<\/div>\n<span class=\"fn\">curl<\/span> <span class=\"str\">-s<\/span> -X <span class=\"kw\">POST<\/span> https:\/\/api.example.com\/sign\/insert \n  -d <span class=\"str\">\"name=Mario&amp;surname=Rossi&amp;email=mario@example.com\"<\/span><\/div>\n\n    <h4 class=\"mt-4\">Campi della Richiesta<\/h4>\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\">\n          <tr>\n            <th>Campo<\/th>\n            <th>Tipo<\/th>\n            <th>Obbligatorio<\/th>\n            <th>Descrizione<\/th>\n          <\/tr>\n        <\/thead>\n        <tbody>\n          <tr><td><code>name<\/code><\/td><td>string<\/td><td>Si<\/td><td>Nome<\/td><\/tr>\n          <tr><td><code>surname<\/code><\/td><td>string<\/td><td>Si<\/td><td>Cognome<\/td><\/tr>\n          <tr><td><code>email<\/code><\/td><td>string<\/td><td>Si<\/td><td>Indirizzo email (usato per la verifica)<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <h3 class=\"mt-4 mb-3\">Flusso di Verifica Email<\/h3>\n    <p>Dopo la registrazione, il sistema invia un'email di verifica contenente un <code>key_code<\/code> univoco. L'utente clicca il link per attivare il proprio account.<\/p>\n\n    <h4 class=\"mt-3\"><span class=\"badge bg-success\">GET<\/span> \/verify\/{key_code}<\/h4>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">Verifica email<\/div>\n<span class=\"cm\"># The user receives this link via email<\/span>\n<span class=\"fn\">curl<\/span> <span class=\"str\">-s<\/span> https:\/\/api.example.com\/verify\/abc123def456\n\n<span class=\"cm\"># The \/verify alias is configured in the _route table<\/span>\n<span class=\"cm\"># It routes to CSignController::Read_Verify()<\/span><\/div>\n\n    <div class=\"text-center mt-4\">\n      <a href=\"\/tutorials\" class=\"btn btn-outline-secondary\">&larr; Torna ai Tutorial<\/a>\n    <\/div>\n  <\/div>\n<\/section>\n<!-- ============================================================ -->\n<!-- Section: Password Reset -->\n<!-- ============================================================ -->\n<section class=\"da-section da-section-alt\">\n  <div class=\"container\">\n    <h2 class=\"text-center mb-5\">Reset della Password<\/h2>\n\n    <h3 class=\"mb-3\">Passo 1: Richiedi Link di Reset<\/h3>\n    <h4><span class=\"badge bg-warning text-dark\">PATCH<\/span> \/sign\/send-reset-password<\/h4>\n    <p>Invia un'email di reset password all'indirizzo specificato. Per sicurezza, la risposta e' sempre generica indipendentemente dall'esistenza dell'email nel sistema.<\/p>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">Richiedi link di reset<\/div>\n<span class=\"fn\">curl<\/span> <span class=\"str\">-s<\/span> -X <span class=\"kw\">PATCH<\/span> https:\/\/api.example.com\/sign\/send-reset-password \n  -d <span class=\"str\">\"email=user@example.com\"<\/span><\/div>\n\n    <h3 class=\"mt-4 mb-3\">Passo 2: Imposta Nuova Password<\/h3>\n    <h4><span class=\"badge bg-warning text-dark\">PATCH<\/span> \/sign\/set-password<\/h4>\n    <p>Usa il token ricevuto via email per impostare una nuova password. Sia <code>password<\/code> che <code>password_confirm<\/code> devono coincidere.<\/p>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">Imposta nuova password<\/div>\n<span class=\"fn\">curl<\/span> <span class=\"str\">-s<\/span> -X <span class=\"kw\">PATCH<\/span> https:\/\/api.example.com\/sign\/set-password \n  -d <span class=\"str\">\"token=RESET_TOKEN_HERE&amp;password=newpassword&amp;password_confirm=newpassword\"<\/span><\/div>\n\n    <div class=\"text-center mt-4\">\n      <a href=\"\/tutorials\" class=\"btn btn-outline-secondary\">&larr; Torna ai Tutorial<\/a>\n    <\/div>\n  <\/div>\n<\/section>\n<!-- ============================================================ -->\n<!-- Section: Error Response Format -->\n<!-- ============================================================ -->\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2 class=\"text-center mb-5\">Formato Risposta di Errore<\/h2>\n\n    <p>Tutti i messaggi API (errori, avvisi, conferme) vengono restituiti nell'array <code>messages<\/code>. Ogni messaggio ha un campo <code>text<\/code> e un campo <code>type<\/code>.<\/p>\n\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">Struttura risposta errore<\/div>\n{\n    <span class=\"str\">\"messages\"<\/span>: [\n        {\n            <span class=\"str\">\"text\"<\/span>: <span class=\"str\">\"Invalid login\"<\/span>,\n            <span class=\"str\">\"type\"<\/span>: <span class=\"str\">\"danger\"<\/span>\n        }\n    ]\n}<\/div>\n\n    <h4 class=\"mt-4\">Tipi di Messaggio<\/h4>\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\">\n          <tr>\n            <th>Tipo<\/th>\n            <th>Significato<\/th>\n          <\/tr>\n        <\/thead>\n        <tbody>\n          <tr><td><code>success<\/code><\/td><td>Operazione completata con successo<\/td><\/tr>\n          <tr><td><code>info<\/code><\/td><td>Messaggio informativo<\/td><\/tr>\n          <tr><td><code>warning<\/code><\/td><td>Avviso non bloccante<\/td><\/tr>\n          <tr><td><code>danger<\/code><\/td><td>Errore<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <h4 class=\"mt-4\">Risposta con elementi e messaggi<\/h4>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">Risposta combinata<\/div>\n{\n    <span class=\"str\">\"elements\"<\/span>: [...],\n    <span class=\"str\">\"messages\"<\/span>: [\n        {<span class=\"str\">\"text\"<\/span>: <span class=\"str\">\"Results filtered\"<\/span>, <span class=\"str\">\"type\"<\/span>: <span class=\"str\">\"info\"<\/span>}\n    ]\n}<\/div>\n\n    <div class=\"text-center mt-4\">\n      <a href=\"\/tutorials\" class=\"btn btn-outline-secondary\">&larr; Torna ai Tutorial<\/a>\n    <\/div>\n  <\/div>\n<\/section>\n<!-- ============================================================ -->\n<!-- Section: HTTP Status Codes -->\n<!-- ============================================================ -->\n<section class=\"da-section da-section-alt\">\n  <div class=\"container\">\n    <h2 class=\"text-center mb-5\">Codici di Stato HTTP<\/h2>\n\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\">\n          <tr>\n            <th>Codice<\/th>\n            <th>Stato<\/th>\n            <th>Descrizione<\/th>\n          <\/tr>\n        <\/thead>\n        <tbody>\n          <tr>\n            <td><span class=\"badge bg-success\">200<\/span><\/td>\n            <td>OK<\/td>\n            <td>Richiesta riuscita. La risposta contiene i dati richiesti.<\/td>\n          <\/tr>\n          <tr>\n            <td><span class=\"badge bg-success\">201<\/span><\/td>\n            <td>Created<\/td>\n            <td>Risorsa creata con successo. La risposta contiene l'ID del nuovo elemento.<\/td>\n          <\/tr>\n          <tr>\n            <td><span class=\"badge bg-success\">204<\/span><\/td>\n            <td>No Content<\/td>\n            <td>Richiesta riuscita ma nessun contenuto da restituire (es. dopo DELETE).<\/td>\n          <\/tr>\n          <tr>\n            <td><span class=\"badge bg-danger\">400<\/span><\/td>\n            <td>Bad Request<\/td>\n            <td>Sintassi della richiesta malformata o parametri non validi.<\/td>\n          <\/tr>\n          <tr>\n            <td><span class=\"badge bg-danger\">401<\/span><\/td>\n            <td>Unauthorized<\/td>\n            <td>Autenticazione richiesta. Token mancante, scaduto o non valido.<\/td>\n          <\/tr>\n          <tr>\n            <td><span class=\"badge bg-danger\">403<\/span><\/td>\n            <td>Forbidden<\/td>\n            <td>Autenticato ma permessi insufficienti (restrizione ACL).<\/td>\n          <\/tr>\n          <tr>\n            <td><span class=\"badge bg-danger\">404<\/span><\/td>\n            <td>Not Found<\/td>\n            <td>Risorsa non trovata. Il modulo o l'ID elemento non esiste.<\/td>\n          <\/tr>\n          <tr>\n            <td><span class=\"badge bg-danger\">409<\/span><\/td>\n            <td>Conflict<\/td>\n            <td>Conflitto con dati esistenti (es. campo univoco duplicato).<\/td>\n          <\/tr>\n          <tr>\n            <td><span class=\"badge bg-danger\">422<\/span><\/td>\n            <td>Unprocessable Entity<\/td>\n            <td>Errore di validazione. Campi obbligatori mancanti o valori non validi.<\/td>\n          <\/tr>\n          <tr>\n            <td><span class=\"badge bg-danger\">500<\/span><\/td>\n            <td>Internal Server Error<\/td>\n            <td>Errore lato server. Controllare i log del server per i dettagli.<\/td>\n          <\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <div class=\"text-center mt-4\">\n      <a href=\"\/tutorials\" class=\"btn btn-outline-secondary\">&larr; Torna ai Tutorial<\/a>\n    <\/div>\n  <\/div>\n<\/section>\n<!-- ============================================================ -->\n<!-- Section: Picklist Endpoint -->\n<!-- ============================================================ -->\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2 class=\"text-center mb-5\">Endpoint Picklist<\/h2>\n\n    <h3 class=\"mb-3\"><span class=\"badge bg-success\">GET<\/span> \/{module}\/picklist<\/h3>\n    <p>Restituisce una lista compatta di record con <code>id<\/code> ed etichetta di visualizzazione, progettata per popolare i dropdown HTML <code>&lt;select&gt;<\/code>. Questo e' il meccanismo principale per caricare dati correlati &mdash; i riferimenti alle chiavi esterne vengono risolti tramite chiamate picklist separate invece di essere incorporati nella risposta principale.<\/p>\n\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">Richiesta e risposta<\/div>\n<span class=\"cm\"># Request<\/span>\n<span class=\"fn\">curl<\/span> <span class=\"str\">-s<\/span> \n  -H <span class=\"str\">\"Authorization: Bearer $TOKEN\"<\/span> \n  <span class=\"str\">\"https:\/\/api.example.com\/categories\/picklist\"<\/span>\n\n<span class=\"cm\"># Response<\/span>\n[\n    {<span class=\"str\">\"id\"<\/span>: <span class=\"str\">1<\/span>, <span class=\"str\">\"name\"<\/span>: <span class=\"str\">\"Category A\"<\/span>},\n    {<span class=\"str\">\"id\"<\/span>: <span class=\"str\">2<\/span>, <span class=\"str\">\"name\"<\/span>: <span class=\"str\">\"Category B\"<\/span>},\n    {<span class=\"str\">\"id\"<\/span>: <span class=\"str\">3<\/span>, <span class=\"str\">\"name\"<\/span>: <span class=\"str\">\"Category C\"<\/span>}\n]<\/div>\n\n    <p class=\"mt-3\"><strong>Pattern di utilizzo:<\/strong> Quando un record contiene <code>id_category<\/code> (chiave esterna), recupera i nomi di visualizzazione con <code>GET \/categories\/picklist<\/code>. Questo pattern si applica a tutti i frontend (CMS, Vue, React, Angular, Ajax).<\/p>\n\n    <div class=\"text-center mt-4\">\n      <a href=\"\/tutorials\" class=\"btn btn-outline-secondary\">&larr; Torna ai Tutorial<\/a>\n    <\/div>\n  <\/div>\n<\/section>\n<!-- ============================================================ -->\n<!-- Section: Structure Endpoint -->\n<!-- ============================================================ -->\n<section class=\"da-section da-section-alt\">\n  <div class=\"container\">\n    <h2 class=\"text-center mb-5\">Endpoint Struttura<\/h2>\n\n    <h3 class=\"mb-3\"><span class=\"badge bg-info\">OPTIONS<\/span> \/{module}\/structure<\/h3>\n    <p>Restituisce le definizioni complete dei campi per un modulo, inclusi tipi di database, vincoli, nomi di visualizzazione e riferimenti a chiavi esterne. Questo viene usato per costruire dinamicamente form e validare dati lato client.<\/p>\n\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">Richiesta e risposta<\/div>\n<span class=\"cm\"># Request<\/span>\n<span class=\"fn\">curl<\/span> <span class=\"str\">-s<\/span> -X <span class=\"kw\">OPTIONS<\/span> \n  -H <span class=\"str\">\"Authorization: Bearer $TOKEN\"<\/span> \n  <span class=\"str\">\"https:\/\/api.example.com\/products\/structure\"<\/span>\n\n<span class=\"cm\"># Response<\/span>\n{\n    <span class=\"str\">\"fields\"<\/span>: {\n        <span class=\"str\">\"id\"<\/span>:          {<span class=\"str\">\"type\"<\/span>: <span class=\"str\">\"INT\"<\/span>, <span class=\"str\">\"primary\"<\/span>: <span class=\"kw\">true<\/span>},\n        <span class=\"str\">\"name\"<\/span>:        {<span class=\"str\">\"type\"<\/span>: <span class=\"str\">\"VARCHAR\"<\/span>, <span class=\"str\">\"max\"<\/span>: <span class=\"str\">100<\/span>, <span class=\"str\">\"required\"<\/span>: <span class=\"kw\">true<\/span>},\n        <span class=\"str\">\"price\"<\/span>:       {<span class=\"str\">\"type\"<\/span>: <span class=\"str\">\"DECIMAL\"<\/span>, <span class=\"str\">\"required\"<\/span>: <span class=\"kw\">true<\/span>},\n        <span class=\"str\">\"id_category\"<\/span>: {<span class=\"str\">\"type\"<\/span>: <span class=\"str\">\"INT\"<\/span>, <span class=\"str\">\"ref\"<\/span>: <span class=\"str\">\"categories:id-name\"<\/span>},\n        <span class=\"str\">\"description\"<\/span>: {<span class=\"str\">\"type\"<\/span>: <span class=\"str\">\"TEXT\"<\/span>, <span class=\"str\">\"html_type\"<\/span>: <span class=\"str\">\"richtext\"<\/span>}\n    }\n}<\/div>\n\n    <h4 class=\"mt-4\">Proprietà dei Campi<\/h4>\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\">\n          <tr>\n            <th>Proprieta<\/th>\n            <th>Tipo<\/th>\n            <th>Descrizione<\/th>\n          <\/tr>\n        <\/thead>\n        <tbody>\n          <tr><td><code>type<\/code><\/td><td>string<\/td><td>Tipo database (VARCHAR, INT, TEXT, DATE, DECIMAL, ENUM, ecc.)<\/td><\/tr>\n          <tr><td><code>display_name<\/code><\/td><td>string<\/td><td>Nome leggibile del campo<\/td><\/tr>\n          <tr><td><code>required<\/code><\/td><td>string<\/td><td>\"YES\" o \"NO\"<\/td><\/tr>\n          <tr><td><code>null<\/code><\/td><td>string<\/td><td>Se il campo accetta NULL (\"YES\" o \"NO\")<\/td><\/tr>\n          <tr><td><code>max<\/code><\/td><td>int<\/td><td>Lunghezza massima per campi stringa<\/td><\/tr>\n          <tr><td><code>default<\/code><\/td><td>mixed<\/td><td>Valore predefinito<\/td><\/tr>\n          <tr><td><code>ref<\/code><\/td><td>string<\/td><td>Riferimento chiave esterna \"tabella:pk-display\"<\/td><\/tr>\n          <tr><td><code>options<\/code><\/td><td>string<\/td><td>Valori separati da pipe per campi ENUM (es. \"draft|published|archived\")<\/td><\/tr>\n          <tr><td><code>html_type<\/code><\/td><td>string<\/td><td>Tipo di input HTML suggerito (text, richtext, date, ecc.)<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n\n    <div class=\"text-center mt-4\">\n      <a href=\"\/tutorials\" class=\"btn btn-outline-secondary\">&larr; Torna ai Tutorial<\/a>\n    <\/div>\n  <\/div>\n<\/section>\n<!-- ============================================================ -->\n<!-- Section: Helper Shell Scripts -->\n<!-- ============================================================ -->\n<section class=\"da-section\">\n  <div class=\"container\">\n    <h2 class=\"text-center mb-5\">Script Shell di Supporto<\/h2>\n\n    <h3 class=\"mb-3\">login.sh<\/h3>\n    <p>Un semplice script per autenticarsi e salvare il token JWT in un file per il riutilizzo da parte di altri script.<\/p>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">login.sh<\/div>\n<span class=\"cm\">#!\/bin\/bash<\/span>\n<span class=\"fn\">curl<\/span> <span class=\"str\">-s<\/span> -X <span class=\"kw\">POST<\/span> https:\/\/api.example.com\/login \n  -d <span class=\"str\">\"dusername=$1&amp;dpassword=$2\"<\/span> &gt; \/tmp\/jwt_token.txt\n<span class=\"fn\">echo<\/span> <span class=\"str\">\"Token saved to \/tmp\/jwt_token.txt\"<\/span><\/div>\n    <p class=\"mt-2\"><strong>Utilizzo:<\/code><\/p>\n\n    <h3 class=\"mt-4 mb-3\">api.sh<\/h3>\n    <p>Uno script generico per richieste API che legge il token dal file e formatta l'output JSON. Supporta qualsiasi metodo HTTP ed endpoint.<\/p>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">api.sh<\/div>\n<span class=\"cm\">#!\/bin\/bash<\/span>\nMETHOD=${1:-GET}\nENDPOINT=$2\n\n<span class=\"fn\">curl<\/span> <span class=\"str\">-s<\/span> -X <span class=\"str\">\"$METHOD\"<\/span> \n  -H <span class=\"str\">\"Authorization: Bearer $(cat \/tmp\/jwt_token.txt)\"<\/span> \n  -H <span class=\"str\">\"Accept: application\/json\"<\/span> \n  <span class=\"str\">\"https:\/\/api.example.com\/$ENDPOINT\"<\/span> | <span class=\"fn\">python3<\/span> -m json.tool<\/div>\n    <p class=\"mt-2\"><strong>Utilizzo:<\/strong><\/p>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">Esempi di utilizzo<\/div>\n<span class=\"cm\"># List all products<\/span>\n.\/api.sh <span class=\"kw\">GET<\/span> <span class=\"str\">products<\/span>\n\n<span class=\"cm\"># Get single product<\/span>\n.\/api.sh <span class=\"kw\">GET<\/span> <span class=\"str\">products\/42<\/span>\n\n<span class=\"cm\"># Get picklist for categories<\/span>\n.\/api.sh <span class=\"kw\">GET<\/span> <span class=\"str\">categories\/picklist<\/span>\n\n<span class=\"cm\"># Delete a product<\/span>\n.\/api.sh <span class=\"kw\">DELETE<\/span> <span class=\"str\">products\/42<\/span><\/div>\n\n    <div class=\"text-center mt-4\">\n      <a href=\"\/tutorials\" class=\"btn btn-outline-secondary\">&larr; Torna ai Tutorial<\/a>\n    <\/div>\n  <\/div>\n<\/section>","description":"Endpoint, filtri, paginazione e struttura risposte","meta_keywords":"","visible":"yes","status":"public","creation_date":"0000-00-00","id__user":1,"priority":0,"groupname":"TUTORIAL"}],"module":"pages","permissions":{"can_read":true},"main_item_title":"title","related_tables":[{"name":"Newsonpage","module":"newsonpage","FK":"id_cmspage","permissions":[]}],"page_info":{"table":"","key":"id","url":"\/pages","url_list":"\/pages","filters":{"id":["=","7004"]},"pagination":{"total_items":23,"page":1,"total_pages":2,"step":1,"items_per_page":20,"url_prev":"\/pages","url_next":"\/pages\/p\/2","url_tmpl":"\/pages\/p\/[[p]]","url_tmpl_with_order":"\/pages\/p\/[[p]]\/ob\/[[ob]]"},"order":{"field":"id","type":"DESC","url_tmpl":"\/pages\/p\/[[p]]"},"module":{"title":"Pages","description":"List of pages","name":"pages"},"current":{"title":"Pages","description":"List of pages","name":"pages","url":"\/tutorials\/api-rest"}},"components":{"alert":{"alert1":[{"type":"warning","message":"OK COMPONENT!"},{"type":"danger","message":"ERROR COMPONENT!"}]}},"messages":[]}