80 lines
3.2 KiB
Markdown
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
|