#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ PerToolBox Server - 用户路由 Copyright (C) 2024 Sea Network Technology Studio Author: Canglan License: AGPL v3 """ from fastapi import APIRouter, HTTPException, Request from ...dependencies import CurrentUserDependency, DbDependency from ...models import User from ...schemas import UserResponse, UserUpdateRequest from ...utils.security import hash_password, verify_password from ...utils.logger import logger from ...middleware.rate_limit import rate_limit router = APIRouter(prefix="/api/v1/user", tags=["user"]) @router.get("/profile", response_model=UserResponse) @rate_limit(requests=50, period=60) async def get_profile( request: Request, # 添加 request 参数 current_user: CurrentUserDependency ): """获取当前用户信息""" return current_user @router.put("/profile", response_model=UserResponse) @rate_limit(requests=20, period=60) async def update_profile( request: Request, # 添加 request 参数 req: UserUpdateRequest, current_user: CurrentUserDependency, db: DbDependency ): """更新用户信息""" if req.username: current_user.username = req.username if req.avatar: current_user.avatar = req.avatar db.commit() db.refresh(current_user) logger.info(f"用户信息更新: {current_user.id}") return current_user @router.post("/change-password") @rate_limit(requests=10, period=60) async def change_password( request: Request, # 添加 request 参数 old_password: str, new_password: str, current_user: CurrentUserDependency, db: DbDependency ): """修改密码""" if not verify_password(old_password, current_user.password_hash): raise HTTPException(status_code=400, detail="原密码错误") current_user.password_hash = hash_password(new_password) db.commit() logger.info(f"密码修改: {current_user.id}") return {"success": True, "message": "密码已修改"}