import os from datetime import datetime, timezone from fastapi import APIRouter, Request from fastapi.responses import HTMLResponse from sqlmodel import select from .cashu import wallet from .db import ApiKey, create_session 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() 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: expiry_time_utc = ( datetime.fromtimestamp(key.key_expiry_time, tz=timezone.utc) if key.key_expiry_time is not None else None ) expiry_time_human_readable = ( expiry_time_utc.strftime("%Y-%m-%d %H:%M:%S") if expiry_time_utc else "" ) api_keys_table_rows.append( f"{key.hashed_key}{key.balance}{key.total_spent}{key.total_requests}{key.refund_address}{'{} ({} UTC)'.format(key.key_expiry_time, expiry_time_human_readable) if key.key_expiry_time else key.key_expiry_time}" ) # Calculate the total balance of all API keys using integer arithmetic to # avoid rounding issues. total_user_balance = sum(key.balance for key in api_keys) // 1000 # Fetch balance from cashu current_balance = await wallet().get_balance() owner_balance = current_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: {current_balance} sats

User Balance: {total_user_balance} sats

User's API Keys

{"".join(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) -> str: admin_cookie = request.cookies.get("admin_password") if admin_cookie and admin_cookie == os.getenv("ADMIN_PASSWORD"): return await dashboard(request) return admin_auth()