Files

96 lines
2.9 KiB
Python

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/<string:id>", 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