from fastapi import Header, Request, APIRouter, Depends, HTTPException, BackgroundTasks from sqlalchemy.orm import Session from app.schemas.user_schema import UserCreate from app.services.user_service import create_user from app.db.session import get_db from app.services.email_service import send_verification_email from app.security.turnstile import verify_turnstile_token from app.core.auth_dependancy import get_current_user from app.models.user_model import User from app.services.user_service import delete_user_account router = APIRouter(prefix="/users", tags=["Users"]) @router.post("/register") async def register( request: Request, user: UserCreate, background_tasks: BackgroundTasks, cf_turnstile_response: str = Header(None, alias="cf-turnstile-response"), db: Session = Depends(get_db) ): client_ip = request.client.host await verify_turnstile_token(cf_turnstile_response, client_ip) try: new_user, raw_token = create_user( db, email=user.email, username=user.username, password=user.password ) except ValueError as e: if str(e) == "email_exists": raise HTTPException(status_code=400, detail="email/user already exists") if str(e) == "username_exists": raise HTTPException(status_code=400, detail="Username is already taken") raise HTTPException(status_code=400, detail=str(e)) if raw_token: background_tasks.add_task(send_verification_email, new_user.email, raw_token) return { "message": "User Created Successfully! Please check your email to verify.", "user_id": new_user.id } @router.delete("/delete") def delete_account( db: Session = Depends(get_db), current_user: User = Depends(get_current_user) ): try: delete_user_account(db, current_user.id) return {"message": "Account successfully deleted"} except Exception as e: raise HTTPException(status_code=500, detail=str(e))