from typing import Annotated, Any from fastapi import APIRouter, Request, Response, Security from fastapi.responses import RedirectResponse from resonance_engine.api import auth, schemas, security router = APIRouter(tags=["Auth"]) @router.get("/auth/config", response_model=schemas.AuthConfig) def auth_config() -> schemas.AuthConfig: return schemas.AuthConfig.from_settings() @router.get( "/auth/me", response_model=security.Identity, ) def me( identity: Annotated[security.Identity, Security(security.authenticate)], ) -> Any: return identity @router.get( "/auth/login", include_in_schema=False, ) def login() -> RedirectResponse: return auth.begin_login() @router.get( "/oauth2/callback", include_in_schema=False, ) def callback( request: Request, code: str | None = None, state: str | None = None, error: str | None = None, error_description: str | None = None, ) -> Response: if error: return auth.oauth_error_page(error, error_description) if not code or not state: return auth.oauth_error_page("invalid_request", "Missing code or state") return auth.complete_login(request, code, state) @router.post( "/auth/refresh", include_in_schema=False, ) def refresh(request: Request) -> Response: return auth.refresh_session(request) @router.get( "/auth/logout", include_in_schema=False, ) def logout() -> RedirectResponse: return auth.logout()