2026-03-31 19:19:04 +08:00
|
|
|
"""Announcement system routers."""
|
|
|
|
|
|
|
|
|
|
from __future__ import annotations
|
2025-12-10 20:52:44 +08:00
|
|
|
|
|
|
|
|
from fastapi import APIRouter
|
2026-03-31 19:19:04 +08:00
|
|
|
from starlette.routing import BaseRoute
|
2025-12-10 20:52:44 +08:00
|
|
|
|
|
|
|
|
from .routes import router as announcement_router
|
|
|
|
|
|
2026-03-31 19:19:04 +08:00
|
|
|
_RUST_OWNED_ANNOUNCEMENT_ROUTE_SIGNATURES = frozenset(
|
|
|
|
|
{
|
|
|
|
|
("GET", "/api/announcements"),
|
|
|
|
|
("GET", "/api/announcements/active"),
|
|
|
|
|
("POST", "/api/announcements"),
|
|
|
|
|
("GET", "/api/announcements/{announcement_id}"),
|
|
|
|
|
("PATCH", "/api/announcements/{announcement_id}/read-status"),
|
|
|
|
|
("PUT", "/api/announcements/{announcement_id}"),
|
|
|
|
|
("DELETE", "/api/announcements/{announcement_id}"),
|
|
|
|
|
("GET", "/api/announcements/users/me/unread-count"),
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _route_is_rust_owned(route: BaseRoute) -> bool:
|
|
|
|
|
path = getattr(route, "path", None)
|
|
|
|
|
methods = getattr(route, "methods", None)
|
|
|
|
|
if not isinstance(path, str) or not methods:
|
|
|
|
|
return False
|
|
|
|
|
return any(
|
|
|
|
|
(method, path) in _RUST_OWNED_ANNOUNCEMENT_ROUTE_SIGNATURES
|
|
|
|
|
for method in methods
|
|
|
|
|
if method not in {"HEAD", "OPTIONS"}
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _build_python_announcement_router() -> APIRouter:
|
|
|
|
|
router = APIRouter()
|
|
|
|
|
router.include_router(announcement_router)
|
|
|
|
|
router.routes = [route for route in router.routes if not _route_is_rust_owned(route)]
|
|
|
|
|
return router
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
python_announcement_router = _build_python_announcement_router()
|
|
|
|
|
router = python_announcement_router
|
2025-12-10 20:52:44 +08:00
|
|
|
|
2026-03-31 19:19:04 +08:00
|
|
|
__all__ = ["python_announcement_router", "router"]
|