acm / api /register.py
xiaolongmr
init
85270f9
Raw History Blame Contribute Delete
2.89 kB
from __future__ import annotations
import asyncio
import json
from fastapi import APIRouter, HTTPException, 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
proxy: str | None = None
total: int | None = None
threads: int | None = None
retry_attempts: int | None = None
registration_method: str | None = None
mode: str | None = None
target_quota: int | None = None
target_available: int | None = None
check_interval: int | None = None
class OutlookPoolResetRequest(BaseModel):
scope: str | 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)
try:
return {"register": register_service.start()}
except ValueError as error:
raise HTTPException(status_code=422, detail=str(error)) from error
@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.post("/api/register/outlook-pool/reset")
async def reset_outlook_pool(body: OutlookPoolResetRequest, authorization: str | None = Header(default=None)):
require_admin(authorization)
return {"register": register_service.reset_outlook_pool(body.scope or "all")}
@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