feat(api): роутеры API v1 и WebSocket-поток метрик (Refs #19)
- ops: health/ready/metrics без аутентификации (503 = схема Error). - auth: login/logout/session, cookie-сессия + CSRF-токен. - status/config/routing/devices+logs: все эндпоинты контракта. - ws/metrics: /api/v1/metrics/stream, токен в заголовке или query.
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
"""Маршрутизация: правила, режим, GeoIP, импорт."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Any
|
||||
|
||||
from fastapi import APIRouter, Depends
|
||||
|
||||
from awg_api.deps import StateDep, require_token
|
||||
from awg_api.schemas import (
|
||||
GeoIpUpdateRequest,
|
||||
ImportRequest,
|
||||
ModeUpdateRequest,
|
||||
RoutingRuleCreate,
|
||||
RoutingRuleUpdate,
|
||||
)
|
||||
|
||||
router = APIRouter(
|
||||
prefix="/api/v1/routing", tags=["routing"], dependencies=[Depends(require_token)]
|
||||
)
|
||||
|
||||
|
||||
@router.get("/rules")
|
||||
async def list_rules(
|
||||
state: StateDep,
|
||||
enabled: bool | None = None,
|
||||
kind: str | None = None,
|
||||
) -> dict[str, Any]:
|
||||
return state.list_rules(enabled=enabled, kind=kind)
|
||||
|
||||
|
||||
@router.post("/rules", status_code=201)
|
||||
async def create_rule(payload: RoutingRuleCreate, state: StateDep) -> dict[str, Any]:
|
||||
return state.create_rule(payload)
|
||||
|
||||
|
||||
@router.get("/rules/{rule_id}")
|
||||
async def get_rule(rule_id: str, state: StateDep) -> dict[str, Any]:
|
||||
return state.get_rule(rule_id)
|
||||
|
||||
|
||||
@router.put("/rules/{rule_id}")
|
||||
async def update_rule(rule_id: str, payload: RoutingRuleUpdate, state: StateDep) -> dict[str, Any]:
|
||||
return state.update_rule(rule_id, payload)
|
||||
|
||||
|
||||
@router.delete("/rules/{rule_id}", status_code=204)
|
||||
async def delete_rule(rule_id: str, state: StateDep) -> None:
|
||||
state.delete_rule(rule_id)
|
||||
|
||||
|
||||
@router.put("/mode")
|
||||
async def put_mode(payload: ModeUpdateRequest, state: StateDep) -> dict[str, Any]:
|
||||
return state.set_mode(payload.mode)
|
||||
|
||||
|
||||
@router.post("/geoip/update")
|
||||
async def update_geoip(
|
||||
state: StateDep, payload: GeoIpUpdateRequest | None = None
|
||||
) -> dict[str, Any]:
|
||||
force = bool(payload.force) if payload is not None else False
|
||||
return state.update_geoip(force=force)
|
||||
|
||||
|
||||
@router.post("/import")
|
||||
async def import_config(payload: ImportRequest, state: StateDep) -> dict[str, Any]:
|
||||
return state.import_config(payload)
|
||||
Reference in New Issue
Block a user