85 lines
2.7 KiB
Python
85 lines
2.7 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from sqlalchemy.orm import Session
|
|
from src.config.database import get_db
|
|
from src.services.user_service import UserCRUD
|
|
from src.validation.auth_schemas import (
|
|
LoginRequest,
|
|
RegisterRequest,
|
|
RefreshTokenRequest,
|
|
ForgotPasswordRequest,
|
|
ResetPasswordRequest,
|
|
ChangePasswordRequest,
|
|
Token
|
|
)
|
|
from src.validation.user_schemas import UserResponse
|
|
|
|
router = APIRouter(prefix="/auth", tags=["Auth"])
|
|
|
|
def get_user_service(db: Session = Depends(get_db)) -> UserCRUD:
|
|
return UserCRUD(db)
|
|
|
|
@router.post("/register", response_model=UserResponse, status_code=status.HTTP_201_CREATED)
|
|
async def register(
|
|
user_in: RegisterRequest,
|
|
service: UserCRUD = Depends(get_user_service)
|
|
):
|
|
# Map RegisterRequest to UserCreate for the service
|
|
from src.validation.user_schemas import UserCreate
|
|
user_create = UserCreate(
|
|
username=user_in.username,
|
|
email=user_in.email,
|
|
password_hash=user_in.password, # UserService hashes it
|
|
first_name=user_in.first_name,
|
|
last_name=user_in.last_name,
|
|
role=user_in.role,
|
|
specialty=user_in.specialty,
|
|
npi=user_in.npi,
|
|
is_active=True
|
|
)
|
|
return await service.create(user_create)
|
|
|
|
@router.post("/login")
|
|
async def login(
|
|
login_data: LoginRequest,
|
|
service: UserCRUD = Depends(get_user_service)
|
|
):
|
|
return await service.login(login_data.username, login_data.password)
|
|
|
|
@router.post("/logout")
|
|
async def logout():
|
|
return {"message": "Successfully logged out"}
|
|
|
|
@router.post("/refresh")
|
|
async def refresh_token(
|
|
refresh_data: RefreshTokenRequest,
|
|
service: UserCRUD = Depends(get_user_service)
|
|
):
|
|
return await service.refreshToken(refresh_data.refresh_token)
|
|
|
|
@router.post("/forgot-password")
|
|
async def forgot_password(
|
|
data: ForgotPasswordRequest,
|
|
service: UserCRUD = Depends(get_user_service)
|
|
):
|
|
return await service.forgotPassword(data.email)
|
|
|
|
@router.post("/reset-password")
|
|
async def reset_password(
|
|
data: ResetPasswordRequest,
|
|
service: UserCRUD = Depends(get_user_service)
|
|
):
|
|
return await service.resetPassword(data.token, data.new_password)
|
|
|
|
@router.post("/change-password")
|
|
async def change_password(
|
|
data: ChangePasswordRequest,
|
|
service: UserCRUD = Depends(get_user_service)
|
|
):
|
|
return await service.changePassword(data.current_password, data.new_password)
|
|
|
|
@router.get("/me", response_model=UserResponse)
|
|
async def get_me(service: UserCRUD = Depends(get_user_service)):
|
|
# This usually requires a security dependency to get current user
|
|
# For alignment purposes, we'll keep it simple or hook into service
|
|
return await service.get_current_user()
|