From ddc0a8b42d674801c44a606ed559246e168c7bf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Tue, 23 Jun 2026 16:40:19 +0400 Subject: [PATCH] =?UTF-8?q?v1.0.157:=20VM=20API=20/api/supplements=20+=20/?= =?UTF-8?q?api/documents=20=E2=80=94=20index.cfm=20no=20longer=20calls=20L?= =?UTF-8?q?ucee=20api.cfm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/convert_server.py | 36 ++++++++++++++++++++++++++++++++++++ index.cfm | 20 +++++++++----------- 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/deploy/convert_server.py b/deploy/convert_server.py index 3f7ccb9..ec92fa4 100755 --- a/deploy/convert_server.py +++ b/deploy/convert_server.py @@ -10,6 +10,11 @@ from db import prompts as db_prompts from db.connection import DB_CONFIG db_prompts.seed_defaults() +# ── DB modules ──────────────────────────────────────────────────────────── +from db import supplements as db_supplements +from db import documents as db_documents +from db import spec_current as db_spec_current + # ── Services ────────────────────────────────────────────────────────────── from services.upload import handle_upload from services.unzip import handle_unzip @@ -35,6 +40,10 @@ class Handler(BaseHTTPRequestHandler): self._handle_process_v2(parsed) elif parsed.path == "/health": self._json({"ok": True, "db": DB_CONFIG["dbname"]}) + elif parsed.path == "/api/supplements": + self._handle_api_supplements(parsed) + elif parsed.path.startswith("/api/documents/"): + self._handle_api_document(parsed) else: self.send_error(404) @@ -79,6 +88,33 @@ class Handler(BaseHTTPRequestHandler): self.wfile.write(f"data: {json.dumps(data, ensure_ascii=False)}\n\n".encode()) self.wfile.flush() + # ── /api/supplements ────────────────────────────────────────────────── + + def _handle_api_supplements(self, parsed): + params = parse_qs(parsed.query) + cid = params.get("contract_id", [None])[0] + if not cid: + self._json({"ok": False, "error": "contract_id required"}, 400) + return + rows = db_supplements.list_by_contract(cid) + self._json({"ok": True, "supplements": rows}) + + # ── /api/documents/ ────────────────────────────────────────────── + + def _handle_api_document(self, parsed): + doc_id = parsed.path.split("/")[-1] + doc = db_documents.get(doc_id) + if not doc: + self._json({"ok": False, "error": "not found"}, 404) + return + self._json({ + "ok": True, + "id": doc["id"], + "filename": doc["filename"], + "status": doc["status"], + "elements_json": doc.get("elements_json"), + }) + # ── /upload ─────────────────────────────────────────────────────────── def _handle_upload(self): diff --git a/index.cfm b/index.cfm index d3fd4f9..e228184 100644 --- a/index.cfm +++ b/index.cfm @@ -75,7 +75,7 @@
Nubes - Сверка договоров — LLM AI-driven Event Sourcing v1.0.156 — Lucee + Сверка договоров — LLM AI-driven Event Sourcing v1.0.157 — Lucee
@@ -572,14 +572,11 @@ document.getElementById('llmBtn').addEventListener('click', function() { async function refreshSupps() { if (!contractId) { console.log('refreshSupps: no contractId'); return; } try { - var resp = await fetch('/api.cfm?action=query&sql=' + encodeURIComponent("SELECT s.id, s.type, s.document_id FROM supplements s WHERE s.contract_id='" + contractId + "'")); + var resp = await fetch(VM_API + '/api/supplements?contract_id=' + contractId); var data = await resp.json(); console.log('refreshSupps: data=', data); - console.log('refreshSupps: fileQueue doc_ids=', fileQueue.map(function(f){return f.doc_id;})); - if (data.OK && data.ROWS) { - data.ROWS.forEach(function(r) { - var supp = {}; - data.COLUMNS.forEach(function(c, ci) { supp[String(c).toLowerCase()] = r[c]; }); + if (data.ok && data.supplements) { + data.supplements.forEach(function(supp) { console.log('refreshSupps: supp=', supp); for (var i = 0; i < fileQueue.length; i++) { if (fileQueue[i].doc_id === supp.document_id) { @@ -646,13 +643,14 @@ async function showText(i) { if (docId) { try { - var qResp = await fetch('/api.cfm?action=query&sql=SELECT%20elements_json%20FROM%20documents%20WHERE%20id%3D\'' + docId + '\''); + var qResp = await fetch(VM_API + '/api/documents/' + docId); var qData = await qResp.json(); var elements = []; - if (qData.OK && qData.ROWS && qData.ROWS.length > 0) { - var ej = qData.ROWS[0].ELEMENTS_JSON; + if (qData.ok && qData.elements_json) { + var ej = qData.elements_json; if (typeof ej === 'object' && ej.Value) ej = ej.Value; - elements = JSON.parse(ej); + if (typeof ej === 'string') elements = JSON.parse(ej); + else elements = ej; } // Общий textify для обеих панелей