From 0a663645c638b54e3965ba6922537cee2bbfe212 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Mon, 29 Jun 2026 18:03:28 +0400 Subject: [PATCH] =?UTF-8?q?docs:=20Opus=20analysis=20=E2=80=94=20reuse=20m?= =?UTF-8?q?ain=20upload=20logic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../opus-drhider-reuse-analysis-2026-06-29.md | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 History/opus-drhider-reuse-analysis-2026-06-29.md diff --git a/History/opus-drhider-reuse-analysis-2026-06-29.md b/History/opus-drhider-reuse-analysis-2026-06-29.md new file mode 100644 index 0000000..06bedd2 --- /dev/null +++ b/History/opus-drhider-reuse-analysis-2026-06-29.md @@ -0,0 +1,56 @@ +# Opus — анализ: переиспользовать логику загрузки Сверки для DrHider + +Файл: `/home/naeel/nubes/contracts/contracts-flask/History/opus-drhider-reuse-analysis-2026-06-29.md` + +29.06.2026 + +## Ключевые выводы + +### 1. JS: копировать паттерн, не 1:1 + +Основная загрузка в `/home/naeel/nubes/contracts/contracts-flask/deploy/files.js`: +- `XMLHttpRequest` + `FormData` + `xhr.upload.onprogress` +- Один файл, ждёт JSON с `doc_id` +- Умеет `.doc → /convert-doc` + +Для DrHider адаптировать: +- `files.forEach(f => fd.append('files', f, f.name))` — много файлов +- `xhr.responseType = 'blob'` — ждём ZIP +- `onload` → скачивание ZIP +- POST на `VM_API + '/api/drhider'` +- Drag&drop оставить из текущего drhider.html + +### 2. parse_multipart — для ОДНОГО файла + +`/home/naeel/nubes/contracts/contracts-flask/deploy/services/upload.py:parse_multipart` берёт `fs["files"]`, если список — `item[0]`. Только первый файл. + +Нужен мульти-парсер той же техникой: `cgi.FieldStorage` + пройти по всем элементам `fs["files"]`. + +### 3. _handle_drhider: заменить JSON/base64 на multipart + +Локальная правка ~15 строк: +- `content_type = self.headers.get("Content-Type")` +- `cl = Content-Length`, `raw = self.rfile.read(cl)` +- Мульти-парс → `files` +- Остальное не трогать: `obfuscate_files(files, llm_client=_VMLLM())` + отправка ZIP + +### 4. Nginx: нужен CORS + timeout + +Текущий `/api/` — 30s timeout, без CORS для OPTIONS. +Для `/api/drhider`: +- `client_max_body_size 100m` +- `proxy_read_timeout 300s` +- CORS: preflight OPTIONS + `Access-Control-Allow-Origin` + +### 5. Рассинхрон бэкендов + +drhider.html шлёт на относительный `/api/drhider` → managed Flask. +Нужно: слать на `https://contracts.kube5s.ru/api/drhider` (VM напрямую). +Flask-обработчик убрать. + +## План правок + +1. `/home/naeel/nubes/contracts/contracts-flask/site/templates/drhider.html` — JS: XHR+FormData вместо fetch+JSON, URL на VM +2. `/home/naeel/nubes/contracts/contracts-flask/deploy/convert_server.py` — `_handle_drhider`: multipart вместо JSON +3. `/etc/nginx/sites-enabled/nginx-contracts.conf` — CORS для `/api/drhider` +4. `/home/naeel/nubes/contracts/contracts-flask/site/app.py` — убрать `/api/drhider`