72 lines
2.6 KiB
Python
72 lines
2.6 KiB
Python
"""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"])}
|