from typing import Annotated from fastapi import APIRouter, Depends from fastapi.security import OAuth2PasswordRequestForm from datetime import datetime from fooder.model.token import TokenResponse from fooder.context import ContextDependency, Context from fooder.controller import UserController from fooder.controller.token import TokenController router = APIRouter(tags=["token"]) def gen_token_response(token_ctrl: TokenController, now: datetime) -> TokenResponse: access_token, refresh_token = token_ctrl.generate_token_pair(now) return TokenResponse( access_token=access_token.encode(), refresh_token=refresh_token.encode(), ) @router.post("", response_model=TokenResponse) async def token_create( data: Annotated[OAuth2PasswordRequestForm, Depends()], ctx: Context = Depends(ContextDependency()), ) -> TokenResponse: now = ctx.clock() user_ctrl = await UserController.session_start(ctx, data.username, data.password) return gen_token_response(user_ctrl.token_ctrl(), now) @router.post("/refresh", response_model=TokenResponse) async def token_refresh( refresh_token: str, ctx: Context = Depends(ContextDependency()), ) -> TokenResponse: now = ctx.clock() token_ctrl = TokenController.from_refresh_token(ctx, refresh_token) return gen_token_response(token_ctrl, now)