agent-control-center/backend/api/accounts.py

72 lines
2.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""API для получения данных об аккаунтах из 9Router"""
import sqlite3, json
from pathlib import Path
from fastapi import APIRouter
router = APIRouter(prefix="/api/v1/accounts", tags=["accounts"])
DB_PATH = Path.home() / "AppData/Roaming/9router/db/data.sqlite"
@router.get("")
def get_accounts():
"""Возвращает все аккаунты из 9Router с их статусом"""
if not DB_PATH.exists():
return {"accounts": [], "error": "9Router DB not found"}
conn = sqlite3.connect(str(DB_PATH))
conn.row_factory = sqlite3.Row
rows = conn.execute(
"SELECT id, provider, authType, name, email, isActive, data, updatedAt "
"FROM providerConnections ORDER BY provider, priority"
).fetchall()
conn.close()
accounts = []
for r in rows:
data = json.loads(r["data"]) if r["data"] else {}
error_code = data.get("errorCode")
accounts.append({
"id": r["id"],
"provider": r["provider"],
"auth_type": r["authType"],
"name": r["name"],
"email": r["email"],
"active": bool(r["isActive"]),
"status": "error" if error_code else ("ok" if data.get("testStatus") != "unavailable" else "unavailable"),
"error_code": error_code,
"last_error": data.get("lastError", "")[:100] if data.get("lastError") else None,
"updated": r["updatedAt"],
})
return {"accounts": accounts}
@router.get("/provider/{provider}")
def get_provider_accounts(provider: str):
"""Аккаунты конкретного провайдера"""
if not DB_PATH.exists():
return {"accounts": [], "error": "9Router DB not found"}
conn = sqlite3.connect(str(DB_PATH))
conn.row_factory = sqlite3.Row
rows = conn.execute(
"SELECT id, name, email, isActive, data FROM providerConnections "
"WHERE provider = ? ORDER BY priority", (provider,)
).fetchall()
conn.close()
accounts = []
for r in rows:
data = json.loads(r["data"]) if r["data"] else {}
error_code = data.get("errorCode")
backoff = data.get("backoffLevel", 0)
accounts.append({
"id": r["id"],
"name": r["name"],
"email": r["email"],
"active": bool(r["isActive"]),
"ok": not error_code and backoff == 0,
"error_code": error_code,
"backoff_level": backoff,
})
return {"provider": provider, "accounts": accounts, "total_ok": sum(1 for a in accounts if a["ok"])}