# L’API dell’admin del CMS di Total.js: gestire un sito da codice, backup e ripristino

> L’API JSON dietro l’admin del CMS su /admin/: il formato delle chiamate, le azioni di ogni plugin e i loro permessi, il caricamento di file e le tre route per backup, ripristino e svuotamento, compreso ciò che clear fa davvero.

Framework: cms
Product: CMS (cms@8071e48)
Language: it
Content-SHA256: 4c43b81ea6621d5dd0238d96016adc171b1378311423d54ac0ea92bdfc9893c6
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: 
Review: not-recorded

Tutto ciò che fa l’interfaccia dell’admin passa da un unico endpoint: `POST /admin/` con il corpo `{ "schema": "<name>", "data": { ... } }` (le route API di Total.js, vedi [route API](/en/total5/api-routes/)). L’indirizzo viene dalla riga `$api : /admin/` del file `config`. Autenticati con il cookie di sessione (`POST /admin/` con `schema: "login"` e `login` e `password`), con l’intestazione `x-token` o tramite OpenPlatform ([installazione e primo avvio](/en/cms/install-and-first-start/)).

## Le azioni

| Plugin | Chiamate (`schema`) | Permesso |
|---|---|---|
| Account | `login`, `logout`, `admin_read`, `admin_save` (nome, login, password), `account` | la sessione |
| Pages | `pages_list`, `pages_read`, `pages_save`, `pages_clone`, `pages_remove`, `pages_links`, `pages_html` (legge l’HTML), `pages_save_html` (`id`, `html`, fino a 5 MB), `pages_copy` (`from`, `to`) | `pages` |
| Layouts | `layouts_list`, `layouts_read`, `layouts_save`, `layouts_clone`, `layouts_remove`, `layouts_html`, `layouts_save_html`, `layouts_import` | `layouts` |
| Widgets | `widgets_list`, `widgets_read`, `widgets_save`, `widgets_remove`, `widgets_detail` | `widgets` |
| Navigation | `nav_list`, `nav_read`, `nav_save`, `nav_remove`, `nav_editor` | `navigation` |
| Redirects | `redirects_list`, `redirects_read`, `redirects_save` (`url`, `target`, `permanent`), `redirects_remove` | `redirects` |
| Variables | `variables_read`, `variables_save` (`vars`) | `variables` |
| Posts | `posts`, `posts_read`, `posts_create`, `posts_update`, `posts_remove`, `posts_clear`, `posts_categories` | `posts` |
| Files | `files_list`, `files_rename`, `files_clear`, `files_remove`, e i caricamenti qui sotto | `files` |
| Settings | `settings_read`, `settings_save`, `settings_test` (prova le impostazioni SMTP), `chatgpt` | `settings` |
| Dashboard | `dashboard_online`, `dashboard_referers`, `dashboard_browsers`, `dashboard_pages`, `dashboard_stats` | nessuno |

Il permesso `admin` (e ogni utente con il flag `sa`, incluso il *Bot* del token) può usarle tutte. Una chiamata senza permesso riceve un errore, e `login` è l’unica chiamata che non richiede una sessione.

Crea una pagina e il suo contenuto:

```json
{ "schema": "pages_save", "data": { "name": "About", "layoutid": "<layout id>", "url": "/about/", "title": "About us" } }
{ "schema": "pages_save_html", "data": { "id": "<page id>", "html": "<h1>About us</h1>" } }
```

`pages_save` risponde `{ "success": true }`; leggi l’id con `pages_list`. Per un layout, `layouts_save` risponde con l’id del layout in `value`. Quando in un aggiornamento manca un campo, il campo viene svuotato (un `title` che non invii viene salvato vuoto), quindi invia il record completo.

## Caricare file

`POST /admin/upload/` accetta un caricamento multipart (fino a 10 MB) e `POST /admin/upload/base64/` un corpo JSON con un data URI (png, jpeg o gif). Entrambi rispondono con un elenco di `{ id, name, type, ext, size, url }`, dove `url` è `/download/<id>.<ext>`.

## Backup, ripristino e svuotamento

Tre route di `controllers/api.js` agiscono sull’intero sito e richiedono il permesso `admin`:

| Route | Cosa fa |
|---|---|
| `GET /admin/backup/` | scarica tutto l’archivio di file (metadati, HTML di pagine e layout, file e post) come un unico file di testo con il nome del sito e la data |
| `POST /admin/restore/` | carica un file così (fino a 100 MB) e lo carica nel sito. |
| `GET /admin/clear/` | **elimina il contenuto del sito.** Scarta l’archivio di file e lo ricarica, quindi pagine, layout, widget e il resto vengono rimossi

Fai un backup prima di provarne una qualsiasi, non aprire mai `/admin/clear/` in un browser per curiosità e tieni privato il token: con quello, un solo `GET` svuota il sito.
