feat: lint-archive endpoint, UI result inline v1.3.38
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
# Линтинг архива функции — 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
|
||||
Reference in New Issue
Block a user