from typing import Annotated from datetime import datetime, timezone from fastapi import APIRouter, Depends, HTTPException from fastapi.security import OAuth2PasswordRequestForm from ..model.token import RefreshTokenPayload, Token from ..context import ContextDependency, Context from ..utils.jwt import AccessToken, RefreshToken router = APIRouter(tags=["token"]) @router.post("", response_model=Token) async def create_token( data: Annotated[OAuth2PasswordRequestForm, Depends()], ctx: Context = Depends(ContextDependency()), ): user = await ctx.repo.user.get(username=data.username) if user is None or not user.verify_password(data.password): raise HTTPException(status_code=401, detail="Unathorized") now = datetime.now(timezone.utc) access_token = AccessToken(sub=user.id, exp=AccessToken.calculate_exp(now)) refresh_token = RefreshToken(sub=user.id, exp=RefreshToken.calculate_exp(now)) return Token( access_token=access_token.encode(), refresh_token=refresh_token.encode(), ) @router.post("/refresh", response_model=Token) async def refresh_token( data: RefreshTokenPayload, ctx: Context = Depends(ContextDependency()), ): pass