69 lines
2.4 KiB
Python
69 lines
2.4 KiB
Python
import os
|
|
from flask import Blueprint, jsonify, request
|
|
import db
|
|
|
|
test_bp = Blueprint("test", __name__)
|
|
|
|
|
|
@test_bp.route("/test", methods=["GET", "POST"])
|
|
def test():
|
|
"""Тестовый слой: проверка БД и выполнение запросов."""
|
|
|
|
# GET — статус
|
|
if request.method == "GET":
|
|
conn, err = db.connect()
|
|
return jsonify({
|
|
"db": "ok" if conn else f"fail: {err}",
|
|
"actions": [
|
|
"GET /test — статус БД",
|
|
"POST /test createdb — создать БД",
|
|
"POST /test tables — список таблиц",
|
|
"POST /test SQL:... — выполнить запрос",
|
|
],
|
|
})
|
|
|
|
# POST — выполнить действие
|
|
data = request.get_json(silent=True) or {}
|
|
action = data.get("action", "status")
|
|
|
|
if action == "status":
|
|
conn, err = db.connect()
|
|
return jsonify({"db": "ok" if conn else f"fail: {err}"})
|
|
|
|
if action == "tables":
|
|
result, err = db.query(
|
|
"SELECT table_name FROM information_schema.tables WHERE table_schema='public' ORDER BY table_name"
|
|
)
|
|
if err:
|
|
return jsonify({"error": err}), 500
|
|
return jsonify({"tables": [r[0] for r in result["rows"]]})
|
|
|
|
if action == "createdb":
|
|
try:
|
|
conn = db._pg_connect("postgres")
|
|
conn.autocommit = True
|
|
cur = conn.cursor()
|
|
db_name = data.get("name") or os.environ.get("DB_NAME", "contracts")
|
|
cur.execute("SELECT 1 FROM pg_database WHERE datname = %s", (db_name,))
|
|
if cur.fetchone():
|
|
msg = f"DB '{db_name}' already exists"
|
|
else:
|
|
cur.execute(db.sql.SQL("CREATE DATABASE {}").format(db.sql.Identifier(db_name)))
|
|
msg = f"DB '{db_name}' created"
|
|
cur.close()
|
|
conn.close()
|
|
return jsonify({"result": msg})
|
|
except Exception as e:
|
|
return jsonify({"error": str(e)}), 500
|
|
|
|
if action == "sql":
|
|
sql_text = data.get("sql", "")
|
|
if not sql_text:
|
|
return jsonify({"error": "no sql"}), 400
|
|
result, err = db.query(sql_text)
|
|
if err:
|
|
return jsonify({"error": err}), 500
|
|
return jsonify(result)
|
|
|
|
return jsonify({"error": f"unknown action: {action}"}), 400
|