42 lines
2.3 KiB
Markdown
42 lines
2.3 KiB
Markdown
# Чистка: удалён мёртвый legacy-код загрузки напрямую (2026-08-26)
|
||
|
||
## Контекст
|
||
|
||
При разборе стресс-тестов выяснилось: я (AI) гонял HTTP-стресс через `POST /upload`
|
||
(прямой multipart), тогда как реальная загрузка в проде идёт через **ВМ-буфер**
|
||
(`PUT` на ВМ WebDAV → `POST /api/upload_refs` → `contracts_upload_sink`).
|
||
Прямой `/upload` — мёртвый legacy-эндпоинт, который фронт не вызывает.
|
||
|
||
## Что удалено (коммит `aa58522`, −176 строк)
|
||
|
||
- `site/routes/upload_bp.py`:
|
||
- эндпоинты `POST /upload` и `POST /unzip-upload`;
|
||
- функции `_check_ext`, `_unzip`, константа `ALLOWED`;
|
||
- пустой blueprint `upload_bp`.
|
||
- `site/routes/__init__.py`: регистрация `upload_bp`.
|
||
- `site/static/app.js`: мёртвые константы `UPLOAD_URL`, `CONVERT_URL`, `UNZIP_URL`.
|
||
- `tests/test_upload_security.py` — целиком (тестировал удалённые `_check_ext`/`_unzip`).
|
||
- `tests/test_routes.py`: классы `TestUpload`, `TestUnzipUpload`.
|
||
|
||
## Что оставлено (рабочее)
|
||
|
||
- `contracts_upload_sink` + `_store_and_parse` + `_convert` — sink для `/api/upload_refs` (VM-буфер).
|
||
- `pages_bp /upload/<path:filename>` — отдача ES-модулей `upload/frontend` (клиентский ZIP).
|
||
|
||
## Почему ревью Sonnet не заметило
|
||
|
||
Ревью искало сломанное (трассировки ошибок), а не мёртвый код. `/upload`/`/unzip-upload`
|
||
не падали и не давали 500 — просто не вызывались. Обнаруживаются только аудитом
|
||
«какие эндпоинты фронт реально дёргает».
|
||
|
||
## Проверки
|
||
|
||
- `py_compile` + `node -c app.js` — OK.
|
||
- `import app` — OK, 24 роута; `/upload` (POST) и `/unzip-upload` отсутствуют,
|
||
`/api/upload_refs` и `/upload/<path>` на месте.
|
||
- Юнит-тесты: 92 passed (было 102).
|
||
|
||
## Хвост
|
||
|
||
`tests/load/stress_http.py` — переписан на реальный путь (`PUT` на ВМ → `POST /api/upload_refs`).
|