""" POST /api/process/{sid} — обработать ВСЕ файлы сессии по одному. Блокирует до завершения. Результат сохраняется в сессии. """ import io, zipfile, traceback from flask import Blueprint, jsonify from drhider import obfuscate_files, LLMClient from drhider.builder import build_zip, build_mapping_csv from session import get_files, store_result process_bp = Blueprint("process", __name__, url_prefix="/api") @process_bp.route("/process/", methods=["POST"]) def process(sid): files = get_files(sid) if files is None: return jsonify({"ok": False, "error": "Session not found"}), 404 if not files: return jsonify({"ok": False, "error": "No files"}), 400 try: llm = LLMClient() all_results = [] all_mapping = {} for fname, content in files: zip_data, _csv = obfuscate_files([(fname, content, "")], llm_client=llm) with zipfile.ZipFile(io.BytesIO(zip_data)) as zf: for name in zf.namelist(): if name == "mapping.csv": csv_text = zf.read(name).decode("utf-8") lines = csv_text.strip().split("\n") if len(lines) > 1: for line in lines[1:]: parts = line.split(",", 2) if len(parts) >= 3: all_mapping[parts[1]] = parts[2] elif not name.endswith("/"): all_results.append((name, zf.read(name))) csv_str = build_mapping_csv(all_mapping) if all_mapping else "" final_zip = build_zip(all_results, mapping_csv=csv_str) store_result(sid, final_zip) return jsonify({"ok": True, "status": "done", "files": len(all_results)}) except Exception as e: traceback.print_exc() return jsonify({"ok": False, "error": str(e)}), 500