48 lines
1.4 KiB
Python
48 lines
1.4 KiB
Python
|
|
from fastapi import APIRouter, Depends, Request
|
|||
|
|
from pydantic import BaseModel, EmailStr, Field
|
|||
|
|
from asyncpg import Connection
|
|||
|
|
|
|||
|
|
from app.api.dependencies.database import get_connection
|
|||
|
|
from app.db.repositories.users import UsersRepository
|
|||
|
|
from app.services.password_reset import send_reset_code_by_email, reset_password_with_code
|
|||
|
|
|
|||
|
|
# ❌ 不要再写 prefix,这里只负责声明相对路径
|
|||
|
|
router = APIRouter(tags=["auth-password"])
|
|||
|
|
|
|||
|
|
class PasswordForgotIn(BaseModel):
|
|||
|
|
email: EmailStr
|
|||
|
|
|
|||
|
|
@router.post("/forgot")
|
|||
|
|
async def forgot_password(
|
|||
|
|
payload: PasswordForgotIn,
|
|||
|
|
request: Request,
|
|||
|
|
conn: Connection = Depends(get_connection),
|
|||
|
|
):
|
|||
|
|
users_repo = UsersRepository(conn)
|
|||
|
|
await send_reset_code_by_email(request, conn, users_repo, payload.email)
|
|||
|
|
return {"ok": True}
|
|||
|
|
|
|||
|
|
class PasswordResetIn(BaseModel):
|
|||
|
|
email: EmailStr
|
|||
|
|
code: str = Field(min_length=4, max_length=12)
|
|||
|
|
password: str = Field(min_length=6)
|
|||
|
|
confirm_password: str = Field(min_length=6)
|
|||
|
|
|
|||
|
|
@router.post("/reset")
|
|||
|
|
async def reset_password(
|
|||
|
|
payload: PasswordResetIn,
|
|||
|
|
conn: Connection = Depends(get_connection),
|
|||
|
|
):
|
|||
|
|
if payload.password != payload.confirm_password:
|
|||
|
|
return {"ok": False, "detail": "两次输入的密码不一致"}
|
|||
|
|
|
|||
|
|
users_repo = UsersRepository(conn)
|
|||
|
|
await reset_password_with_code(
|
|||
|
|
conn,
|
|||
|
|
users_repo,
|
|||
|
|
email=payload.email,
|
|||
|
|
code=payload.code,
|
|||
|
|
new_password=payload.password,
|
|||
|
|
)
|
|||
|
|
return {"ok": True}
|