from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from passlib.context import CryptContext from datetime import datetime, timedelta from app.models.user import User from app.schemas.user import UserCreate, UserLogin, Token from app.services.auth import create_access_token from app.api.dependencies import get_db router = APIRouter() # hashing pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") @router.post("/signup", response_model=Token) def signup(user: UserCreate, db: Session = Depends(get_db)): if not user.passwords_match: raise HTTPException(status_code=400, detail="Passwords do not match") existing_user = db.query(User).filter( (User.username == user.username) | (User.email == user.email)).first() if existing_user: raise HTTPException(status_code=400, detail="Username or email already taken") hashed_password = pwd_context.hash(user.password) new_user = User( username=user.username, email=user.email, hashed_password=hashed_password, dob=user.dob, country_of_origin=user.country_of_origin ) db.add(new_user) db.commit() db.refresh(new_user) access_token = create_access_token(data={"sub": new_user.username}) return {"access_token": access_token, "token_type": "bearer"} @router.post("/login", response_model=Token) def login(user: UserLogin, db: Session = Depends(get_db)): db_user = db.query(User).filter(User.username == user.username).first() if not db_user or not pwd_context.verify(user.password, db_user.hashed_password): raise HTTPException(status_code=400, detail="Invalid credentials") access_token = create_access_token(data={"sub": db_user.username}) return {"access_token": access_token, "token_type": "bearer"}