update to python fastpi
This commit is contained in:
216
Backend/src/routes/auth_routes.py
Normal file
216
Backend/src/routes/auth_routes.py
Normal file
@@ -0,0 +1,216 @@
|
||||
from fastapi import APIRouter, Depends, HTTPException, status, Cookie, Response
|
||||
from fastapi.responses import JSONResponse
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from ..config.database import get_db
|
||||
from ..services.auth_service import auth_service
|
||||
from ..schemas.auth import (
|
||||
RegisterRequest,
|
||||
LoginRequest,
|
||||
RefreshTokenRequest,
|
||||
ForgotPasswordRequest,
|
||||
ResetPasswordRequest,
|
||||
AuthResponse,
|
||||
TokenResponse,
|
||||
MessageResponse
|
||||
)
|
||||
from ..middleware.auth import get_current_user
|
||||
from ..models.user import User
|
||||
|
||||
router = APIRouter(prefix="/auth", tags=["auth"])
|
||||
|
||||
|
||||
@router.post("/register", status_code=status.HTTP_201_CREATED)
|
||||
async def register(
|
||||
request: RegisterRequest,
|
||||
response: Response,
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""Register new user"""
|
||||
try:
|
||||
result = await auth_service.register(
|
||||
db=db,
|
||||
name=request.name,
|
||||
email=request.email,
|
||||
password=request.password,
|
||||
phone=request.phone
|
||||
)
|
||||
|
||||
# Set refresh token as HttpOnly cookie
|
||||
response.set_cookie(
|
||||
key="refreshToken",
|
||||
value=result["refreshToken"],
|
||||
httponly=True,
|
||||
secure=False, # Set to True in production with HTTPS
|
||||
samesite="strict",
|
||||
max_age=7 * 24 * 60 * 60, # 7 days
|
||||
path="/"
|
||||
)
|
||||
|
||||
# Format response to match frontend expectations
|
||||
return {
|
||||
"status": "success",
|
||||
"message": "Registration successful",
|
||||
"data": {
|
||||
"token": result["token"],
|
||||
"user": result["user"]
|
||||
}
|
||||
}
|
||||
except ValueError as e:
|
||||
error_message = str(e)
|
||||
return JSONResponse(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
content={
|
||||
"status": "error",
|
||||
"message": error_message
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@router.post("/login")
|
||||
async def login(
|
||||
request: LoginRequest,
|
||||
response: Response,
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""Login user"""
|
||||
try:
|
||||
result = await auth_service.login(
|
||||
db=db,
|
||||
email=request.email,
|
||||
password=request.password,
|
||||
remember_me=request.rememberMe or False
|
||||
)
|
||||
|
||||
# Set refresh token as HttpOnly cookie
|
||||
max_age = 7 * 24 * 60 * 60 if request.rememberMe else 1 * 24 * 60 * 60
|
||||
response.set_cookie(
|
||||
key="refreshToken",
|
||||
value=result["refreshToken"],
|
||||
httponly=True,
|
||||
secure=False, # Set to True in production with HTTPS
|
||||
samesite="strict",
|
||||
max_age=max_age,
|
||||
path="/"
|
||||
)
|
||||
|
||||
# Format response to match frontend expectations
|
||||
return {
|
||||
"status": "success",
|
||||
"data": {
|
||||
"token": result["token"],
|
||||
"user": result["user"]
|
||||
}
|
||||
}
|
||||
except ValueError as e:
|
||||
error_message = str(e)
|
||||
status_code = status.HTTP_401_UNAUTHORIZED if "Invalid email or password" in error_message else status.HTTP_400_BAD_REQUEST
|
||||
return JSONResponse(
|
||||
status_code=status_code,
|
||||
content={
|
||||
"status": "error",
|
||||
"message": error_message
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@router.post("/refresh-token", response_model=TokenResponse)
|
||||
async def refresh_token(
|
||||
refreshToken: str = Cookie(None),
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""Refresh access token"""
|
||||
if not refreshToken:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
detail="Refresh token not found"
|
||||
)
|
||||
|
||||
try:
|
||||
result = await auth_service.refresh_access_token(db, refreshToken)
|
||||
return result
|
||||
except ValueError as e:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
detail=str(e)
|
||||
)
|
||||
|
||||
|
||||
@router.post("/logout", response_model=MessageResponse)
|
||||
async def logout(
|
||||
response: Response,
|
||||
refreshToken: str = Cookie(None),
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""Logout user"""
|
||||
if refreshToken:
|
||||
await auth_service.logout(db, refreshToken)
|
||||
|
||||
# Clear refresh token cookie
|
||||
response.delete_cookie(key="refreshToken", path="/")
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"message": "Logout successful"
|
||||
}
|
||||
|
||||
|
||||
@router.get("/profile")
|
||||
async def get_profile(
|
||||
current_user: User = Depends(get_current_user),
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""Get current user profile"""
|
||||
try:
|
||||
user = await auth_service.get_profile(db, current_user.id)
|
||||
return user
|
||||
except ValueError as e:
|
||||
if "User not found" in str(e):
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail=str(e)
|
||||
)
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail=str(e)
|
||||
)
|
||||
|
||||
|
||||
@router.post("/forgot-password", response_model=MessageResponse)
|
||||
async def forgot_password(
|
||||
request: ForgotPasswordRequest,
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""Send password reset link"""
|
||||
result = await auth_service.forgot_password(db, request.email)
|
||||
return {
|
||||
"status": "success",
|
||||
"message": result["message"]
|
||||
}
|
||||
|
||||
|
||||
@router.post("/reset-password", response_model=MessageResponse)
|
||||
async def reset_password(
|
||||
request: ResetPasswordRequest,
|
||||
db: Session = Depends(get_db)
|
||||
):
|
||||
"""Reset password with token"""
|
||||
try:
|
||||
result = await auth_service.reset_password(
|
||||
db=db,
|
||||
token=request.token,
|
||||
password=request.password
|
||||
)
|
||||
return {
|
||||
"status": "success",
|
||||
"message": result["message"]
|
||||
}
|
||||
except ValueError as e:
|
||||
status_code = status.HTTP_400_BAD_REQUEST
|
||||
if "User not found" in str(e):
|
||||
status_code = status.HTTP_404_NOT_FOUND
|
||||
raise HTTPException(
|
||||
status_code=status_code,
|
||||
detail=str(e)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user