119 lines
3.5 KiB
Python

import logging
from datetime import timedelta
from fastapi import APIRouter, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordRequestForm
from sqlalchemy.orm import Session
from app.core.config import settings
from app.core.database import get_db
from app.core.security import create_access_token, get_password_hash
from app.dependencies.auth import authenticate_user, get_current_active_user
from app.models.user import User, UserRole
from app.schemas.user import Token, UserCreate
from app.schemas.user import User as UserSchema
router = APIRouter()
logger = logging.getLogger(__name__)
@router.post("/login", response_model=Token)
async def login(
form_data: OAuth2PasswordRequestForm = Depends(),
db: Session = Depends(get_db)
):
"""
OAuth2 compatible token login, get an access token for future requests.
"""
user = authenticate_user(db, form_data.username, form_data.password)
if not user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Incorrect email or password",
headers={"WWW-Authenticate": "Bearer"},
)
access_token_expires = timedelta(minutes=settings.ACCESS_TOKEN_EXPIRE_MINUTES)
access_token = create_access_token(
subject=user.id, expires_delta=access_token_expires
)
logger.info(f"User {user.email} logged in successfully")
return {"access_token": access_token, "token_type": "bearer"}
@router.post("/register", response_model=UserSchema)
async def register(
user_in: UserCreate,
db: Session = Depends(get_db)
):
"""
Register a new user.
"""
# Check if user with this email already exists
user = db.query(User).filter(User.email == user_in.email).first()
if user:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="A user with this email already exists",
)
# Create new user
db_user = User(
email=user_in.email,
hashed_password=get_password_hash(user_in.password),
first_name=user_in.first_name,
last_name=user_in.last_name,
phone_number=user_in.phone_number,
role=UserRole.CUSTOMER,
is_active=True,
)
db.add(db_user)
db.commit()
db.refresh(db_user)
logger.info(f"New user registered with email: {db_user.email}")
return db_user
@router.post("/register/seller", response_model=UserSchema)
async def register_seller(
user_in: UserCreate,
db: Session = Depends(get_db)
):
"""
Register a new seller account.
"""
# Check if user with this email already exists
user = db.query(User).filter(User.email == user_in.email).first()
if user:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="A user with this email already exists",
)
# Create new seller user
db_user = User(
email=user_in.email,
hashed_password=get_password_hash(user_in.password),
first_name=user_in.first_name,
last_name=user_in.last_name,
phone_number=user_in.phone_number,
role=UserRole.SELLER,
is_active=True,
)
db.add(db_user)
db.commit()
db.refresh(db_user)
logger.info(f"New seller registered with email: {db_user.email}")
return db_user
@router.get("/me", response_model=UserSchema)
async def read_users_me(
current_user: User = Depends(get_current_active_user)
):
"""
Get current user information.
"""
return current_user