Redis очередь: /upload → RPUSH → 200 сразу, воркер → DB + парсинг, v1.38

This commit is contained in:
2026-06-17 22:28:10 +04:00
parent 72a7ac4345
commit 65c0c80687
5 changed files with 121 additions and 33 deletions
+18 -32
View File
@@ -14,6 +14,8 @@ import mimeutil
from test_routes import test_bp
from upload import upload_bp
from api import api_bp
import redis_client
import redis_worker
load_dotenv()
@@ -74,6 +76,7 @@ class ContractsApp:
def __init__(self):
self.app = Flask(__name__)
schema.ensure_schema()
redis_worker.start_worker()
self._add_routes()
def _add_routes(self):
@@ -156,44 +159,27 @@ class ContractsApp:
mime = mimeutil.guess_mime(filename) or "application/octet-stream"
cid = data.get("cid")
conn, err = db.connect()
if err:
return jsonify({"error": f"БД: {err}"}), 500
try:
cur = conn.cursor()
if cid:
contract_id = cid
else:
# Контракт — синхронно (быстро, нужно для следующих загрузок)
if not cid:
conn, err = db.connect()
if err:
return jsonify({"error": f"БД: {err}"}), 500
try:
cur = conn.cursor()
cur.execute(
"INSERT INTO contracts (number, client) VALUES (%s, %s) RETURNING id",
("б" + __import__("datetime").datetime.now().strftime("%Y%m%d-%H%M"), ""),
)
contract_id = cur.fetchone()[0]
cid = cur.fetchone()[0]
conn.commit()
cur.close()
finally:
db.put_conn(conn)
cur.execute(
"INSERT INTO documents (filename, mime_type, original_b64, status) VALUES (%s,%s,%s,'uploaded')",
(filename, mime, b64),
)
# Файл — в Redis (мгновенно)
redis_client.push({"filename": filename, "b64": b64, "mime": mime, "cid": str(cid)})
cur.execute("SELECT id FROM documents WHERE filename=%s AND status='uploaded' ORDER BY created_at DESC LIMIT 1", (filename,))
row = cur.fetchone()
doc_id = row[0] if row else None
if doc_id:
cur.execute(
"INSERT INTO supplements (contract_id, document_id, type) VALUES (%s,%s,'initial')",
(str(contract_id), str(doc_id)),
)
conn.commit()
cur.close()
except Exception as e:
try: conn.rollback()
except: pass
raise e
finally:
db.put_conn(conn)
return jsonify({"contract_id": str(contract_id), "doc_id": str(doc_id) if doc_id else None})
return jsonify({"contract_id": str(cid)})
except Exception as e:
_log("upload_outer_error", str(e))
return jsonify({"error": f"Крах: {e}"}), 500