from fastapi import APIRouter, Depends, HTTPException from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer from jose import JWTError, jwt from models.user import Token, User, UserCreate, UserLogin from services.auth_service import ALGORITHM, SECRET_KEY, auth_service router = APIRouter() security = HTTPBearer() @router.post("/auth/register", response_model=Token) async def register(user_create: UserCreate): try: user = auth_service.create_user(user_create) return auth_service.get_token(user.username, user_create.password) except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) @router.post("/auth/login", response_model=Token) async def login(user_login: UserLogin): try: return auth_service.get_token(user_login.username, user_login.password) except ValueError: raise HTTPException(status_code=401, detail="Invalid username or password") def get_current_user( credentials: HTTPAuthorizationCredentials = Depends(security), ) -> User: try: payload = jwt.decode( credentials.credentials, SECRET_KEY, algorithms=[ALGORITHM] ) username: str = payload.get("sub") user_id: str = payload.get("user_id") if username is None or user_id is None: raise HTTPException(status_code=401, detail="Invalid token") user = auth_service.get_user_by_username(username) if not user or user.id != user_id: raise HTTPException(status_code=401, detail="User not found") return user except JWTError: raise HTTPException(status_code=401, detail="Invalid token") @router.get("/auth/me", response_model=User) async def get_me(current_user: User = Depends(get_current_user)): return current_user