rackham-meeting-analyzer/backend/app/api/auth.py
2025-11-03 08:15:51 -06:00

78 lines
2.1 KiB
Python

"""
Authentication API routes.
Handles user registration, login, and logout.
"""
from fastapi import APIRouter, Depends, HTTPException, status, Response
from motor.motor_asyncio import AsyncIOMotorDatabase
from app.core.deps import get_db, get_current_user, require_auth
from app.models.user import UserCreate, UserLogin, UserResponse
from app.services.auth import create_user, authenticate_user, create_access_token
router = APIRouter()
@router.post("/register", response_model=UserResponse, status_code=status.HTTP_201_CREATED)
async def register(
user_data: UserCreate,
db: AsyncIOMotorDatabase = Depends(get_db)
):
"""Register a new user account"""
user = await create_user(db, user_data)
return user
@router.post("/login")
async def login(
credentials: UserLogin,
response: Response,
db: AsyncIOMotorDatabase = Depends(get_db)
):
"""Login with email and password"""
user = await authenticate_user(db, credentials)
if user is None:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Invalid email or password"
)
# Create JWT token
access_token = create_access_token(user["_id"])
# Set HTTPOnly cookie
response.set_cookie(
key="access_token",
value=f"Bearer {access_token}",
httponly=True,
max_age=86400, # 24 hours
samesite="lax"
)
return {
"message": "Login successful",
"user": {
"_id": user["_id"],
"email": user["email"],
"full_name": user["full_name"]
},
"access_token": access_token
}
@router.post("/logout")
async def logout(response: Response):
"""Logout and clear authentication cookie"""
response.delete_cookie(key="access_token")
return {"message": "Logout successful"}
@router.get("/me", response_model=UserResponse)
async def get_me(user: dict = Depends(require_auth)):
"""Get current authenticated user"""
return UserResponse(
_id=user["_id"],
email=user["email"],
full_name=user["full_name"],
created_at=user["created_at"]
)