from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from pydantic import BaseModel, EmailStr from app.db.session import get_db from app.models.user import User from app.utils.auth import get_password_hash, verify_password, create_access_token router = APIRouter() class UserCreate(BaseModel): email: EmailStr password: str class UserLogin(BaseModel): email: EmailStr password: str class Token(BaseModel): access_token: str token_type: str class UserResponse(BaseModel): id: int email: str created_at: str class Config: orm_mode = True @router.post("/register", response_model=UserResponse) async def register(user: UserCreate, db: Session = Depends(get_db)): db_user = db.query(User).filter(User.email == user.email).first() if db_user: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Email already registered" ) hashed_password = get_password_hash(user.password) db_user = User( email=user.email, password_hash=hashed_password ) db.add(db_user) db.commit() db.refresh(db_user) return UserResponse( id=db_user.id, email=db_user.email, created_at=str(db_user.created_at) ) @router.post("/login", response_model=Token) async def login(user: UserLogin, db: Session = Depends(get_db)): db_user = db.query(User).filter(User.email == user.email).first() if not db_user or not verify_password(user.password, db_user.password_hash): raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="Incorrect email or password", headers={"WWW-Authenticate": "Bearer"}, ) access_token = create_access_token(data={"sub": db_user.email}) return {"access_token": access_token, "token_type": "bearer"}