from fastapi import APIRouter,Depends from fastapi.responses import JSONResponse from fastapi import HTTPException from db_setup import get_session from sqlalchemy.ext.asyncio import AsyncSession from pydantic import BaseModel, EmailStr from forget_password.views import ForgetPassword from forget_password.permissions import ResetCredentials from forget_password.serializers import serialize_reset_token from users.plugins import create_reset_token from dotenv import load_dotenv load_dotenv() router = APIRouter() class ForgetPasswordRequest(BaseModel): email: EmailStr class ForgetPasswordVerify(BaseModel): email: EmailStr code: str class ForgetPasswordNew(BaseModel): password: str @router.post("/users/forget-password") async def request_reset_code(payload: ForgetPasswordRequest,session: AsyncSession = Depends(get_session)): try: service=ForgetPassword(session=session) data=await service.request_code(payload.email) return JSONResponse(content={"data":data,"status_code":200}) except HTTPException: raise except Exception as e: raise HTTPException(status_code=500,detail=str(e)) @router.post("/users/forget-password/verify-code") async def verify_reset_code(payload: ForgetPasswordVerify,session: AsyncSession = Depends(get_session)): try: service=ForgetPassword(session=session) email,code_id=await service.verify_code(payload.email,payload.code) tokens=serialize_reset_token(create_reset_token(email,code_id=code_id),email) return JSONResponse(content={**tokens,"status_code":200}) except HTTPException: raise except Exception as e: raise HTTPException(status_code=500,detail=str(e)) @router.post("/users/forget-password/new-password") async def set_new_password( payload: ForgetPasswordNew, credentials: ResetCredentials, session: AsyncSession = Depends(get_session), ): try: service=ForgetPassword(session=session) data=await service.set_new_password(credentials.credentials,payload.password) return JSONResponse(content={"data":data,"status_code":200}) except HTTPException: raise except Exception as e: raise HTTPException(status_code=500,detail=str(e))