Optimize the request params of the service layer (#903)

This commit is contained in:
Wu Clan
2025-11-08 16:24:19 +08:00
committed by GitHub
parent ef871f3b5c
commit 292f5d7e48
6 changed files with 43 additions and 57 deletions
+4 -4
View File
@@ -1,11 +1,11 @@
from typing import Any
from fastapi import Request
from sqlalchemy.ext.asyncio import AsyncSession
from backend.app.admin.crud.crud_dept import dept_dao
from backend.app.admin.model import Dept
from backend.app.admin.schema.dept import CreateDeptParam, UpdateDeptParam
from backend.app.admin.schema.user import GetUserInfoWithRelationDetail
from backend.common.exception import errors
from backend.core.conf import settings
from backend.database.redis import redis_client
@@ -34,7 +34,7 @@ class DeptService:
async def get_tree(
*,
db: AsyncSession,
request: Request,
request_user: GetUserInfoWithRelationDetail,
name: str | None,
leader: str | None,
phone: str | None,
@@ -44,7 +44,7 @@ class DeptService:
获取部门树形结构
:param db: 数据库会话
:param request: FastAPI 请求对象
:param request_user: 请求用户
:param name: 部门名称
:param leader: 部门负责人
:param phone: 联系电话
@@ -52,7 +52,7 @@ class DeptService:
:return:
"""
dept_select = await dept_dao.get_all(request, db, name, leader, phone, status)
dept_select = await dept_dao.get_all(db, request_user, name, leader, phone, status)
tree_data = get_tree_data(dept_select)
return tree_data
+20 -39
View File
@@ -200,93 +200,74 @@ class UserService:
return count
@staticmethod
async def update_nickname(*, db: AsyncSession, request: Request, nickname: str) -> int:
async def update_nickname(*, db: AsyncSession, user_id: int, nickname: str) -> int:
"""
更新当前用户昵称
:param db: 数据库会话
:param request: FastAPI 请求对象
:param user_id: 用户 ID
:param nickname: 用户昵称
:return:
"""
token = get_token(request)
token_payload = jwt_decode(token)
user = await user_dao.get(db, token_payload.id)
if not user:
raise errors.NotFoundError(msg='用户不存在')
count = await user_dao.update_nickname(db, token_payload.id, nickname)
await redis_client.delete(f'{settings.JWT_USER_REDIS_PREFIX}:{user.id}')
count = await user_dao.update_nickname(db, user_id, nickname)
await redis_client.delete(f'{settings.JWT_USER_REDIS_PREFIX}:{user_id}')
return count
@staticmethod
async def update_avatar(*, db: AsyncSession, request: Request, avatar: str) -> int:
async def update_avatar(*, db: AsyncSession, user_id: int, avatar: str) -> int:
"""
更新当前用户头像
:param db: 数据库会话
:param request: FastAPI 请求对象
:param user_id: 用户 ID
:param avatar: 头像地址
:return:
"""
token = get_token(request)
token_payload = jwt_decode(token)
user = await user_dao.get(db, token_payload.id)
if not user:
raise errors.NotFoundError(msg='用户不存在')
count = await user_dao.update_avatar(db, token_payload.id, avatar)
await redis_client.delete(f'{settings.JWT_USER_REDIS_PREFIX}:{user.id}')
count = await user_dao.update_avatar(db, user_id, avatar)
await redis_client.delete(f'{settings.JWT_USER_REDIS_PREFIX}:{user_id}')
return count
@staticmethod
async def update_email(*, db: AsyncSession, request: Request, captcha: str, email: str) -> int:
async def update_email(*, db: AsyncSession, user_id: int, captcha: str, email: str) -> int:
"""
更新当前用户邮箱
:param db: 数据库会话
:param request: FastAPI 请求对象
:param user_id: 用户 ID
:param captcha: 邮箱验证码
:param email: 邮箱
:return:
"""
token = get_token(request)
token_payload = jwt_decode(token)
user = await user_dao.get(db, token_payload.id)
if not user:
raise errors.NotFoundError(msg='用户不存在')
captcha_code = await redis_client.get(f'{settings.EMAIL_CAPTCHA_REDIS_PREFIX}:{ctx.ip}')
if not captcha_code:
raise errors.RequestError(msg='验证码已失效,请重新获取')
if captcha != captcha_code:
raise errors.CustomError(error=CustomErrorCode.CAPTCHA_ERROR)
await redis_client.delete(f'{settings.EMAIL_CAPTCHA_REDIS_PREFIX}:{ctx.ip}')
count = await user_dao.update_email(db, token_payload.id, email)
await redis_client.delete(f'{settings.JWT_USER_REDIS_PREFIX}:{user.id}')
count = await user_dao.update_email(db, user_id, email)
await redis_client.delete(f'{settings.JWT_USER_REDIS_PREFIX}:{user_id}')
return count
@staticmethod
async def update_password(*, db: AsyncSession, request: Request, obj: ResetPasswordParam) -> int:
async def update_password(*, db: AsyncSession, user_id: int, hash_password: str, obj: ResetPasswordParam) -> int:
"""
更新当前用户密码
:param db: 数据库会话
:param request: FastAPI 请求对象
:param user_id: 用户 ID
:param hash_password: 哈希密码
:param obj: 密码重置参数
:return:
"""
token = get_token(request)
token_payload = jwt_decode(token)
user = await user_dao.get(db, token_payload.id)
if not user:
raise errors.NotFoundError(msg='用户不存在')
if not password_verify(obj.old_password, user.password):
if not password_verify(obj.old_password, hash_password):
raise errors.RequestError(msg='原密码错误')
if obj.new_password != obj.confirm_password:
raise errors.RequestError(msg='密码输入不一致')
count = await user_dao.reset_password(db, user.id, obj.new_password)
count = await user_dao.reset_password(db, user_id, obj.new_password)
key_prefix = [
f'{settings.TOKEN_REDIS_PREFIX}:{user.id}',
f'{settings.TOKEN_REFRESH_REDIS_PREFIX}:{user.id}',
f'{settings.JWT_USER_REDIS_PREFIX}:{user.id}',
f'{settings.TOKEN_REDIS_PREFIX}:{user_id}',
f'{settings.TOKEN_REFRESH_REDIS_PREFIX}:{user_id}',
f'{settings.JWT_USER_REDIS_PREFIX}:{user_id}',
]
for prefix in key_prefix:
await redis_client.delete_prefix(prefix)