# API administracji CMS Total.js: zarządzanie stroną z kodu, kopia zapasowa i przywracanie

> API JSON stojące za administracją CMS pod /admin/: format wywołań, akcje każdej wtyczki i ich uprawnienia, wgrywanie plików oraz trzy trasy kopii zapasowej, przywracania i czyszczenia, w tym to, co clear naprawdę robi.

Framework: cms
Product: CMS (cms@8071e48)
Language: pl
Content-SHA256: 5acab8326be4c63cd6e52591eb6edbbf135ea68a72910107ad53dfc33ed582ee
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: 
Review: not-recorded

Wszystko, co robi interfejs administracji, przechodzi przez jeden endpoint: `POST /admin/` z treścią `{ "schema": "<name>", "data": { ... } }` (trasy API Total.js, zobacz [trasy API](/en/total5/api-routes/)). Adres pochodzi z linii `$api : /admin/` pliku `config`. Uwierzytelnij się ciasteczkiem sesji (`POST /admin/` z `schema: "login"` oraz `login` i `password`), nagłówkiem `x-token` albo przez OpenPlatform ([instalacja i pierwsze uruchomienie](/en/cms/install-and-first-start/)).

## Akcje

| Plugin | Wywołania (`schema`) | Uprawnienie |
|---|---|---|
| Account | `login`, `logout`, `admin_read`, `admin_save` (nazwa, login, hasło), `account` | sesja |
| Pages | `pages_list`, `pages_read`, `pages_save`, `pages_clone`, `pages_remove`, `pages_links`, `pages_html` (odczytuje HTML), `pages_save_html` (`id`, `html`, do 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`, i wgrywanie poniżej | `files` |
| Settings | `settings_read`, `settings_save`, `settings_test` (sprawdza ustawienia SMTP), `chatgpt` | `settings` |
| Dashboard | `dashboard_online`, `dashboard_referers`, `dashboard_browsers`, `dashboard_pages`, `dashboard_stats` | brak |

Uprawnienie `admin` (i każdy użytkownik z flagą `sa`, w tym *Bot* tokenu) ma dostęp do wszystkich. Wywołanie bez uprawnienia dostaje błąd, a `login` jest jedynym wywołaniem, które nie wymaga sesji.

Utwórz stronę i jej treść:

```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` odpowiada `{ "success": true }`; id odczytasz przez `pages_list`. Dla layoutu `layouts_save` odpowiada id layoutu w `value`. Gdy w aktualizacji brakuje pola, pole jest czyszczone (`title`, którego nie wyślesz, zapisze się puste), więc wysyłaj cały rekord.

## Wgrywanie plików

`POST /admin/upload/` przyjmuje wgranie multipart (do 10 MB), a `POST /admin/upload/base64/` treść JSON z data URI (png, jpeg lub gif). Oba odpowiadają listą `{ id, name, type, ext, size, url }`, gdzie `url` to `/download/<id>.<ext>`.

## Kopia zapasowa, przywracanie i czyszczenie

Trzy trasy z `controllers/api.js` działają na całej stronie i wymagają uprawnienia `admin`:

| Trasa | Co robi |
|---|---|
| `GET /admin/backup/` | pobiera cały magazyn plików (metadane, HTML stron i layoutów, pliki i wpisy) jako jeden plik tekstowy nazwany od strony i daty |
| `POST /admin/restore/` | wgrywa taki plik (do 100 MB) i go ładuje. |
| `GET /admin/clear/` | **usuwa zawartość strony.** Porzuca magazyn plików i ładuje go ponownie, więc strony, layouty, widżety i reszta są usuwane

Zrób kopię zapasową, zanim wypróbujesz którąkolwiek z nich, nigdy nie otwieraj `/admin/clear/` w przeglądarce z ciekawości i trzymaj token w tajemnicy: z nim pojedyncze `GET` opróżnia stronę.
