Files
fission-console/doc/descriptions/lint-archive-flow.md
T

80 lines
3.2 KiB
Markdown

# Линтинг архива функции — flow (май 2026)
## Назначение
Пользователь может загрузить zip-архив с кодом функции.
Перед сохранением или после загрузки — архив можно прогнать через линтер,
чтобы убедиться что код синтаксически корректен.
Линтинг выполняется **на сервере** (в Kubernetes), а не на машине пользователя.
---
## Endpoint
```
POST /console/api/ai/lint-archive
Authorization: X-Auth-Token: <sub>
Content-Type: multipart/form-data
```
Поле: `archive` — zip-файл.
### Ограничения
- Максимальный размер zip-архива: **100 KB**
- Максимальный суммарный размер распакованных файлов: **100 KB** (защита от zip bomb)
- При превышении — HTTP 413
### Response (200 OK)
```json
{
"ok": true,
"results": [
{"file": "hello.py", "ok": true},
{"file": "bad.js", "ok": false, "output": "SyntaxError: Unexpected token (2:0)"}
]
}
```
### Response (ошибка)
```json
{"error": "архив слишком большой: максимум 100 KB"}
```
---
## Поддерживаемые языки
| Расширение | Язык | Линтер |
|-----------|---------|---------------------------|
| `.py` | Python | `python3 -m py_compile` |
| `.js` | Node.js | `node --check` |
| `.rb` | Ruby | `ruby -c` |
| `.php` | PHP | `php -l` |
Файлы с другими расширениями (`.json`, `.txt`, `.md`, `.yaml` и т.д.) — пропускаются.
Если в архиве нет ни одного поддерживаемого файла — HTTP 400.
---
## Реализация (backend)
Файл: `console/internal/api/lint_archive.go`
1. Архив читается в память (`bytes.Buffer`), без записи на диск.
2. zip открывается через `archive/zip.Reader` из буфера в памяти.
3. Проверяется суммарный распакованный размер — защита от zip bomb.
4. Каждый поддерживаемый файл читается из zip в память.
5. Записывается во временный файл в **`/dev/shm`** (RAM-backed tmpfs), fallback — `/tmp`.
6. Линтер запускается с таймаутом 10 секунд на файл.
7. Временный файл удаляется сразу после линтинга.
8. Путь к tmp-файлу скрыт от пользователя в выводе линтера.
---
## Что ещё нужно сделать
- [ ] UI: кнопка "Проверить архив" рядом с полем загрузки архива в форме создания функции
- [ ] Показывать результаты в UI (список файлов, статус, ошибки)
- [ ] Тесты: `scripts/test_fn_archives.sh` — добавить вызов lint-archive endpoint