diff --git a/README.md b/README.md index d4afcfe..7c29f3d 100644 --- a/README.md +++ b/README.md @@ -301,6 +301,55 @@ No actix-web, o `fs::Files` já define MIME por extensão, mas registre antes: "application/manifest+json")` e um `wrap_fn` que sobrepõe `Cache-Control` quando o caminho for `/sw.js`. (No `tower-http` `SetResponseHeaderLayer` com `Match` por path é o caminho limpo.) +## Gerenciador de arquivos (anexos) + +Árvore de pastas estilo sistema de arquivos + arquivos com **associação opcional +a uma nota** (sem nota = avulso). Abra com **Ctrl+J**, menu **Arquivo → +Gerenciador de arquivos…** ou o botão **📎 Anexo** (modo seletor: clicar num +arquivo insere no editor e vincula à nota). + +- **Persistência (disc)**: `data/folders.json` (árvore `parent`), `data/files.json` + (metadados: nome, pasta, nota, tamanho, MIME, SHA-256) e blobs em + `data/files/.` — a extensão física de tipos perigosos (html/js/svg) é + neutralizada (`.bin`/`.img`); o MIME real só vive no metadado. +- **API**: + - `POST /api/files/upload` — multipart (`file`, opcionais `folder_id`, `note_id`) → 201 com `url` + - `GET /api/files/tree` — hierarquia JSON (pastas aninhadas + arquivos + raiz) + - `GET /api/files/static/{id}` — serve com MIME real, **ETag (SHA-256) e Range** + (vídeos fazem seek), `CSP: sandbox` + `nosniff`; tipos não-inline-seguros + (html/svg/js…) vão como **`Content-Disposition: attachment`** — anexar um + `.html` malicioso **não executa same-origin** (stored-XSS mitigado) + - `PUT /api/files/{id}/move` — `{folder, note, name}` (mover/associar/desvincular/renomear) + - `DELETE /api/files/{id}` · `POST/PUT/DELETE /api/folders[/{id}]` (com anti-ciclo) + - Limite: 64 MiB/arquivo; nomes sanitizados (`filepath.Base` + whitelist); ids + gerados — path do disco nunca aparece na URL. +- **Editor**: colar (Ctrl+V) imagem/arquivo do clipboard faz upload automático e + insere `![…](url)` / `![]()` / link conforme o formato; arrastar-e-soltar + funciona no editor e no gerenciador; no WYSIWYG a inserção é visual (``/ + `