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
| Hashed Key |
Balance (mSats) |
Total Spent (mSats) |
Total Requests |
Refund Address |
Refund Time |
{api_keys_table_rows}
"""
@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()