import os from datetime import datetime, timezone from fastapi import APIRouter, Request from fastapi.responses import HTMLResponse from .cashu import _initialize_wallet admin_router = APIRouter(prefix="/admin") def login_form() -> str: return """
""" def info(content: str) -> str: return f"""
{content}
""" def admin_auth() -> str: if os.getenv("ADMIN_PASSWORD", "") == "": return info("Please set a secure ADMIN_PASSWORD= in your ENV variables.") else: return login_form() from sqlmodel import select from .db import ApiKey, create_session async def dashboard(request: Request) -> str: # fetch cashu / api-key data from database async with create_session() as session: result = await session.exec(select(ApiKey)) api_keys = result.all() api_keys_table_rows = [] for key in api_keys: if key.key_expiry_time is not None: expiry_time_utc = datetime.fromtimestamp(key.key_expiry_time, tz=timezone.utc) expiry_time_human_readable = expiry_time_utc.strftime('%Y-%m-%d %H:%M:%S') api_keys_table_rows.append( f"{key.hashed_key}{key.balance}{key.total_spent}{key.total_requests}{key.refund_address}{key.key_expiry_time} ({expiry_time_human_readable} UTC)" ) else: expiry_time_human_readable = "" api_keys_table_rows.append( f"{key.hashed_key}{key.balance}{key.total_spent}{key.total_requests}{key.refund_address}{key.key_expiry_time}" ) api_keys_table_rows = "".join(api_keys_table_rows) # Calculate the total balance of all API keys total_user_balance = int(sum(key.balance / 1000 for key in api_keys)) # Fetch balance from cashu wallet = await _initialize_wallet() wallet_balance = wallet.balance # calculate owner balance owner_balance = wallet_balance - total_user_balance return f"""

Admin Dashboard

Current Cashu Balance

Your Balance: {owner_balance} sats

The balance is calculated by subtracting the combined user balance from the total Cashu wallet balance.

Total Cashu Balance: {wallet_balance} sats

User Balance: {total_user_balance} sats

User's API Keys

{api_keys_table_rows}
Hashed Key Balance (mSats) Total Spent (mSats) Total Requests Refund Address Refund Time
""" @admin_router.get("/", response_class=HTMLResponse) async def admin(request: Request): admin_cookie = request.cookies.get("admin_password") if admin_cookie and admin_cookie == os.getenv("ADMIN_PASSWORD"): return await dashboard(request) return admin_auth()