from datetime import datetime, timedelta from typing import Optional from jose import jwt from app.config import settings def create_access_token(user_id: str, expires_delta: Optional[timedelta] = None) -> str: """ Create a JWT access token. Args: user_id: User ID to encode in the token expires_delta: Optional custom expiration time delta Returns: Encoded JWT token string """ if expires_delta: expire = datetime.utcnow() + expires_delta else: expire = datetime.utcnow() + timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES) to_encode = { "sub": user_id, "exp": expire, "type": "access" } encoded_jwt = jwt.encode(to_encode, settings.SECRET_KEY, algorithm=settings.ALGORITHM) return encoded_jwt def create_refresh_token(user_id: str) -> str: """ Create a JWT refresh token with longer expiration. Args: user_id: User ID to encode in the token Returns: Encoded JWT refresh token string """ expire = datetime.utcnow() + timedelta(days=settings.REFRESH_TOKEN_EXPIRE_DAYS) to_encode = { "sub": user_id, "exp": expire, "type": "refresh" } encoded_jwt = jwt.encode(to_encode, settings.SECRET_KEY, algorithm=settings.ALGORITHM) return encoded_jwt def decode_token(token: str) -> dict: """ Decode and verify a JWT token. Args: token: JWT token string Returns: Decoded token payload Raises: JWTError: If token is invalid or expired """ payload = jwt.decode(token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM]) return payload