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()