import json import os import sqlite3 from pathlib import Path from flask import Flask, jsonify, request, send_file from flask_cors import CORS from pydantic import ValidationError from werkzeug.utils import secure_filename from db.InitDB import DB_PATH, init_db from models import AIRequest # Создаем приложение Flask app = Flask(__name__) CORS(app) init_db() METADATA_DIR = Path(os.environ.get("METADATA_DIR") or Path(__file__).parent / ".metadata") RESULT_DIR = Path(os.environ.get("RESULT_DIR") or Path(__file__).parent / ".results") @app.route('/AI', methods=['POST'], strict_slashes=False) def ai_request(): try: payload = AIRequest( id=request.form.get("id", ""), text=request.form.get("text", ""), file=[], ) except ValidationError as e: return jsonify({"error": e.errors()}), 422 try: request_dir = METADATA_DIR / (secure_filename(payload.id) or "unknown") request_dir.mkdir(parents=True, exist_ok=True) for file in request.files.getlist("files"): filename = secure_filename(file.filename) if not filename: continue path = request_dir / filename file.save(path) payload.file.append(str(path)) with sqlite3.connect(DB_PATH) as conn: conn.execute( "INSERT INTO requests (id, text, file) VALUES (?, ?, ?)", (payload.id, payload.text, json.dumps(payload.file)), ) conn.commit() return jsonify(payload.model_dump()), 200 except sqlite3.IntegrityError: return jsonify({"error": f"task {payload.id} already exists"}), 409 except Exception as e: return jsonify({"error": str(e)}), 500 @app.route("/AI/", methods=["GET"]) def req_status(id): try: with sqlite3.connect(DB_PATH) as conn: row = conn.execute( "SELECT status, result FROM requests WHERE id = ?", (id,) ).fetchone() except Exception as e: return jsonify({"error": str(e)}), 500 if row is None: return jsonify({"error": f"task {id} not found"}), 404 status, result = row if status not in ("OK", "ОК"): return jsonify({"id": id, "status": status}), 200 if not result: return jsonify({"error": f"task {id} is OK but has no result file"}), 500 path = Path(result) if not path.is_absolute(): path = RESULT_DIR / path if not path.is_file(): return jsonify({"error": f"result file not found: {path}"}), 404 try: return send_file(path, as_attachment=True, download_name=path.name) except Exception as e: return jsonify({"error": str(e)}), 500 @app.route('/health', methods=['GET']) def health_check(): """Проверка работоспособности API""" return {"status": "ok", "message": "API is running"}, 200