from __future__ import annotations import asyncio import json from fastapi import APIRouter, Header from fastapi.responses import StreamingResponse from pydantic import BaseModel from api.support import require_admin from services.register_service import register_service class RegisterConfigRequest(BaseModel): mail: dict | None = None hero_sms: dict | None = None proxy: str | None = None total: int | None = None threads: int | None = None mode: str | None = None target_quota: int | None = None target_available: int | None = None check_interval: int | None = None def create_router() -> APIRouter: router = APIRouter() @router.get("/api/register") async def get_register_config(authorization: str | None = Header(default=None)): require_admin(authorization) return {"register": register_service.get()} @router.post("/api/register") async def update_register_config(body: RegisterConfigRequest, authorization: str | None = Header(default=None)): require_admin(authorization) return {"register": register_service.update(body.model_dump(exclude_none=True))} @router.post("/api/register/start") async def start_register(authorization: str | None = Header(default=None)): require_admin(authorization) return {"register": register_service.start()} @router.post("/api/register/codex/start") async def start_codex_register(authorization: str | None = Header(default=None)): require_admin(authorization) return {"register": register_service.start_codex()} @router.post("/api/register/stop") async def stop_register(authorization: str | None = Header(default=None)): require_admin(authorization) return {"register": register_service.stop()} @router.post("/api/register/reset") async def reset_register(authorization: str | None = Header(default=None)): require_admin(authorization) return {"register": register_service.reset()} @router.get("/api/register/events") async def register_events(token: str = ""): require_admin(f"Bearer {token}") async def stream(): last = "" while True: payload = json.dumps(register_service.get(), ensure_ascii=False) if payload != last: last = payload yield f"data: {payload}\n\n" await asyncio.sleep(0.5) return StreamingResponse(stream(), media_type="text/event-stream") return router