from fastapi import APIRouter, Depends, status from sqlalchemy.ext.asyncio import AsyncSession from app.auth.schemas import ( AuthUserResponse, LoginRequest, MessageResponse, RegisterRequest, RequestPasswordResetRequest, ResendVerificationRequest, ResetPasswordRequest, TokenResponse, VerifyEmailRequest, ) from app.auth.service import ( get_current_user, get_email_sender, login_user, register_user, request_password_reset, resend_verification_email, reset_password, verify_email, ) from app.database.session import get_db from app.email.service import EmailService from app.users.models import User router = APIRouter(prefix="/auth", tags=["auth"]) @router.post("/register", response_model=MessageResponse, status_code=status.HTTP_201_CREATED) async def register( payload: RegisterRequest, db: AsyncSession = Depends(get_db), email_service: EmailService = Depends(get_email_sender), ) -> MessageResponse: await register_user(db, payload, email_service) return MessageResponse(message="Registration successful. Verification email sent.") @router.post("/login", response_model=TokenResponse) async def login(payload: LoginRequest, db: AsyncSession = Depends(get_db)) -> TokenResponse: return await login_user(db, payload) @router.post("/verify-email", response_model=MessageResponse) async def verify_email_endpoint(payload: VerifyEmailRequest, db: AsyncSession = Depends(get_db)) -> MessageResponse: await verify_email(db, payload) return MessageResponse(message="Email verified successfully.") @router.post("/resend-verification", response_model=MessageResponse) async def resend_verification( payload: ResendVerificationRequest, db: AsyncSession = Depends(get_db), email_service: EmailService = Depends(get_email_sender), ) -> MessageResponse: await resend_verification_email(db, payload, email_service) return MessageResponse(message="If the account exists, a verification email was sent.") @router.post("/request-password-reset", response_model=MessageResponse) async def request_password_reset_endpoint( payload: RequestPasswordResetRequest, db: AsyncSession = Depends(get_db), email_service: EmailService = Depends(get_email_sender), ) -> MessageResponse: await request_password_reset(db, payload, email_service) return MessageResponse(message="If the account exists, a reset email was sent.") @router.post("/reset-password", response_model=MessageResponse) async def reset_password_endpoint(payload: ResetPasswordRequest, db: AsyncSession = Depends(get_db)) -> MessageResponse: await reset_password(db, payload) return MessageResponse(message="Password reset successfully.") @router.get("/me", response_model=AuthUserResponse) async def me(current_user: User = Depends(get_current_user)) -> AuthUserResponse: return current_user