| 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 |
| 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/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 |
|
|