Files
2026-07-23 17:45:44 +08:00

82 lines
2.4 KiB
Python

import time
from datetime import datetime
from sqlalchemy import select
from chongming_worker import rpc_method
from chongming_password import hash_password, verify_password
from ..models.pydantic import (
ChangePasswordPostRequest,
ChangePasswordPostResponse
)
from ..models.auth import Users
@rpc_method(
subject="auth.change_password",
method="POST",
summary="修改密码",
response_model=ChangePasswordPostResponse,
)
async def change_password(change_password_post_request: ChangePasswordPostRequest) -> ChangePasswordPostResponse:
from ..global_var import db
if db is None:
raise RuntimeError("Database not initialized")
user_id = change_password_post_request.user_id
old_password = change_password_post_request.old_password
new_password = change_password_post_request.new_password
if not old_password:
return ChangePasswordPostResponse(
result="fail",
message="旧密码不能为空",
timestamp=time.time()
)
if not new_password:
return ChangePasswordPostResponse(
result="fail",
message="新密码不能为空",
timestamp=time.time()
)
if old_password == new_password:
return ChangePasswordPostResponse(
result="fail",
message="新密码不能与旧密码相同",
timestamp=time.time()
)
async with db.get_session() as session:
stmt = select(Users).filter_by(id=user_id)
result = await session.execute(stmt)
user: Users | None = result.scalar_one_or_none()
if user is None:
return ChangePasswordPostResponse(
result="fail",
message="用户不存在",
timestamp=time.time()
)
# 验证旧密码
if not verify_password(old_password, user.hashed_password):
return ChangePasswordPostResponse(
result="fail",
message="旧密码错误",
timestamp=time.time()
)
# 更新密码
user.hashed_password = hash_password(new_password)
user.updated_at = datetime.now()
session.add(user)
await session.commit()
return ChangePasswordPostResponse(
result="success",
message="密码修改成功",
timestamp=time.time()
)