Skip to content

Commit 292f5d7

Browse files
authored
Optimize the request params of the service layer (#903)
1 parent ef871f3 commit 292f5d7

File tree

6 files changed

+43
-57
lines changed

6 files changed

+43
-57
lines changed

backend/app/admin/api/v1/sys/dept.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ async def get_dept_tree(
3030
phone: Annotated[str | None, Query(description='联系电话')] = None,
3131
status: Annotated[int | None, Query(description='状态')] = None,
3232
) -> ResponseSchemaModel[list[GetDeptTree]]:
33-
dept = await dept_service.get_tree(db=db, request=request, name=name, leader=leader, phone=phone, status=status)
33+
dept = await dept_service.get_tree(
34+
db=db, request_user=request.user, name=name, leader=leader, phone=phone, status=status
35+
)
3436
return response_base.success(data=dept)
3537

3638

backend/app/admin/api/v1/sys/user.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,9 @@ async def update_user_permission(
102102
async def update_user_password(
103103
db: CurrentSessionTransaction, request: Request, obj: ResetPasswordParam
104104
) -> ResponseModel:
105-
count = await user_service.update_password(db=db, request=request, obj=obj)
105+
count = await user_service.update_password(
106+
db=db, user_id=request.user.id, hash_password=request.user.password, obj=obj
107+
)
106108
if count > 0:
107109
return response_base.success()
108110
return response_base.fail()
@@ -126,7 +128,7 @@ async def update_user_nickname(
126128
request: Request,
127129
nickname: Annotated[str, Body(embed=True, description='用户昵称')],
128130
) -> ResponseModel:
129-
count = await user_service.update_nickname(db=db, request=request, nickname=nickname)
131+
count = await user_service.update_nickname(db=db, user_id=request.user.id, nickname=nickname)
130132
if count > 0:
131133
return response_base.success()
132134
return response_base.fail()
@@ -138,7 +140,7 @@ async def update_user_avatar(
138140
request: Request,
139141
avatar: Annotated[str, Body(embed=True, description='用户头像地址')],
140142
) -> ResponseModel:
141-
count = await user_service.update_avatar(db=db, request=request, avatar=avatar)
143+
count = await user_service.update_avatar(db=db, user_id=request.user.id, avatar=avatar)
142144
if count > 0:
143145
return response_base.success()
144146
return response_base.fail()
@@ -151,7 +153,7 @@ async def update_user_email(
151153
captcha: Annotated[str, Body(embed=True, description='邮箱验证码')],
152154
email: Annotated[str, Body(embed=True, description='用户邮箱')],
153155
) -> ResponseModel:
154-
count = await user_service.update_email(db=db, request=request, captcha=captcha, email=email)
156+
count = await user_service.update_email(db=db, user_id=request.user.id, captcha=captcha, email=email)
155157
if count > 0:
156158
return response_base.success()
157159
return response_base.fail()

backend/app/admin/crud/crud_dept.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
from collections.abc import Sequence
22

3-
from fastapi import Request
43
from sqlalchemy.ext.asyncio import AsyncSession
54
from sqlalchemy_crud_plus import CRUDPlus
65

76
from backend.app.admin.model import Dept
87
from backend.app.admin.schema.dept import CreateDeptParam, UpdateDeptParam
8+
from backend.app.admin.schema.user import GetUserInfoWithRelationDetail
99
from backend.common.security.permission import filter_data_permission
1010

1111

@@ -34,8 +34,8 @@ async def get_by_name(self, db: AsyncSession, name: str) -> Dept | None:
3434

3535
async def get_all(
3636
self,
37-
request: Request,
3837
db: AsyncSession,
38+
request_user: GetUserInfoWithRelationDetail,
3939
name: str | None,
4040
leader: str | None,
4141
phone: str | None,
@@ -44,8 +44,8 @@ async def get_all(
4444
"""
4545
获取所有部门
4646
47-
:param request: FastAPI 请求对象
4847
:param db: 数据库会话
48+
:param request_user: 请求用户
4949
:param name: 部门名称
5050
:param leader: 负责人
5151
:param phone: 联系电话
@@ -63,7 +63,7 @@ async def get_all(
6363
if status is not None:
6464
filters['status'] = status
6565

66-
data_filtered = await filter_data_permission(db, request)
66+
data_filtered = await filter_data_permission(db, request_user)
6767
return await self.select_models_order(db, 'sort', 'desc', data_filtered, **filters)
6868

6969
async def create(self, db: AsyncSession, obj: CreateDeptParam) -> None:

backend/app/admin/service/dept_service.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
from typing import Any
22

3-
from fastapi import Request
43
from sqlalchemy.ext.asyncio import AsyncSession
54

65
from backend.app.admin.crud.crud_dept import dept_dao
76
from backend.app.admin.model import Dept
87
from backend.app.admin.schema.dept import CreateDeptParam, UpdateDeptParam
8+
from backend.app.admin.schema.user import GetUserInfoWithRelationDetail
99
from backend.common.exception import errors
1010
from backend.core.conf import settings
1111
from backend.database.redis import redis_client
@@ -34,7 +34,7 @@ async def get(*, db: AsyncSession, pk: int) -> Dept:
3434
async def get_tree(
3535
*,
3636
db: AsyncSession,
37-
request: Request,
37+
request_user: GetUserInfoWithRelationDetail,
3838
name: str | None,
3939
leader: str | None,
4040
phone: str | None,
@@ -44,15 +44,15 @@ async def get_tree(
4444
获取部门树形结构
4545
4646
:param db: 数据库会话
47-
:param request: FastAPI 请求对象
47+
:param request_user: 请求用户
4848
:param name: 部门名称
4949
:param leader: 部门负责人
5050
:param phone: 联系电话
5151
:param status: 状态
5252
:return:
5353
"""
5454

55-
dept_select = await dept_dao.get_all(request, db, name, leader, phone, status)
55+
dept_select = await dept_dao.get_all(db, request_user, name, leader, phone, status)
5656
tree_data = get_tree_data(dept_select)
5757
return tree_data
5858

backend/app/admin/service/user_service.py

Lines changed: 20 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -200,93 +200,74 @@ async def reset_password(*, db: AsyncSession, pk: int, password: str) -> int:
200200
return count
201201

202202
@staticmethod
203-
async def update_nickname(*, db: AsyncSession, request: Request, nickname: str) -> int:
203+
async def update_nickname(*, db: AsyncSession, user_id: int, nickname: str) -> int:
204204
"""
205205
更新当前用户昵称
206206
207207
:param db: 数据库会话
208-
:param request: FastAPI 请求对象
208+
:param user_id: 用户 ID
209209
:param nickname: 用户昵称
210210
:return:
211211
"""
212-
token = get_token(request)
213-
token_payload = jwt_decode(token)
214-
user = await user_dao.get(db, token_payload.id)
215-
if not user:
216-
raise errors.NotFoundError(msg='用户不存在')
217-
count = await user_dao.update_nickname(db, token_payload.id, nickname)
218-
await redis_client.delete(f'{settings.JWT_USER_REDIS_PREFIX}:{user.id}')
212+
count = await user_dao.update_nickname(db, user_id, nickname)
213+
await redis_client.delete(f'{settings.JWT_USER_REDIS_PREFIX}:{user_id}')
219214
return count
220215

221216
@staticmethod
222-
async def update_avatar(*, db: AsyncSession, request: Request, avatar: str) -> int:
217+
async def update_avatar(*, db: AsyncSession, user_id: int, avatar: str) -> int:
223218
"""
224219
更新当前用户头像
225220
226221
:param db: 数据库会话
227-
:param request: FastAPI 请求对象
222+
:param user_id: 用户 ID
228223
:param avatar: 头像地址
229224
:return:
230225
"""
231-
token = get_token(request)
232-
token_payload = jwt_decode(token)
233-
user = await user_dao.get(db, token_payload.id)
234-
if not user:
235-
raise errors.NotFoundError(msg='用户不存在')
236-
count = await user_dao.update_avatar(db, token_payload.id, avatar)
237-
await redis_client.delete(f'{settings.JWT_USER_REDIS_PREFIX}:{user.id}')
226+
count = await user_dao.update_avatar(db, user_id, avatar)
227+
await redis_client.delete(f'{settings.JWT_USER_REDIS_PREFIX}:{user_id}')
238228
return count
239229

240230
@staticmethod
241-
async def update_email(*, db: AsyncSession, request: Request, captcha: str, email: str) -> int:
231+
async def update_email(*, db: AsyncSession, user_id: int, captcha: str, email: str) -> int:
242232
"""
243233
更新当前用户邮箱
244234
245235
:param db: 数据库会话
246-
:param request: FastAPI 请求对象
236+
:param user_id: 用户 ID
247237
:param captcha: 邮箱验证码
248238
:param email: 邮箱
249239
:return:
250240
"""
251-
token = get_token(request)
252-
token_payload = jwt_decode(token)
253-
user = await user_dao.get(db, token_payload.id)
254-
if not user:
255-
raise errors.NotFoundError(msg='用户不存在')
256241
captcha_code = await redis_client.get(f'{settings.EMAIL_CAPTCHA_REDIS_PREFIX}:{ctx.ip}')
257242
if not captcha_code:
258243
raise errors.RequestError(msg='验证码已失效,请重新获取')
259244
if captcha != captcha_code:
260245
raise errors.CustomError(error=CustomErrorCode.CAPTCHA_ERROR)
261246
await redis_client.delete(f'{settings.EMAIL_CAPTCHA_REDIS_PREFIX}:{ctx.ip}')
262-
count = await user_dao.update_email(db, token_payload.id, email)
263-
await redis_client.delete(f'{settings.JWT_USER_REDIS_PREFIX}:{user.id}')
247+
count = await user_dao.update_email(db, user_id, email)
248+
await redis_client.delete(f'{settings.JWT_USER_REDIS_PREFIX}:{user_id}')
264249
return count
265250

266251
@staticmethod
267-
async def update_password(*, db: AsyncSession, request: Request, obj: ResetPasswordParam) -> int:
252+
async def update_password(*, db: AsyncSession, user_id: int, hash_password: str, obj: ResetPasswordParam) -> int:
268253
"""
269254
更新当前用户密码
270255
271256
:param db: 数据库会话
272-
:param request: FastAPI 请求对象
257+
:param user_id: 用户 ID
258+
:param hash_password: 哈希密码
273259
:param obj: 密码重置参数
274260
:return:
275261
"""
276-
token = get_token(request)
277-
token_payload = jwt_decode(token)
278-
user = await user_dao.get(db, token_payload.id)
279-
if not user:
280-
raise errors.NotFoundError(msg='用户不存在')
281-
if not password_verify(obj.old_password, user.password):
262+
if not password_verify(obj.old_password, hash_password):
282263
raise errors.RequestError(msg='原密码错误')
283264
if obj.new_password != obj.confirm_password:
284265
raise errors.RequestError(msg='密码输入不一致')
285-
count = await user_dao.reset_password(db, user.id, obj.new_password)
266+
count = await user_dao.reset_password(db, user_id, obj.new_password)
286267
key_prefix = [
287-
f'{settings.TOKEN_REDIS_PREFIX}:{user.id}',
288-
f'{settings.TOKEN_REFRESH_REDIS_PREFIX}:{user.id}',
289-
f'{settings.JWT_USER_REDIS_PREFIX}:{user.id}',
268+
f'{settings.TOKEN_REDIS_PREFIX}:{user_id}',
269+
f'{settings.TOKEN_REFRESH_REDIS_PREFIX}:{user_id}',
270+
f'{settings.JWT_USER_REDIS_PREFIX}:{user_id}',
290271
]
291272
for prefix in key_prefix:
292273
await redis_client.delete_prefix(prefix)

backend/common/security/permission.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from sqlalchemy.ext.asyncio import AsyncSession
44

55
from backend.app.admin.crud.crud_data_scope import data_scope_dao
6+
from backend.app.admin.schema.user import GetUserInfoWithRelationDetail
67
from backend.common.context import ctx
78
from backend.common.enums import RoleDataRuleExpressionType, RoleDataRuleOperatorType
89
from backend.common.exception import errors
@@ -42,28 +43,28 @@ async def __call__(self, request: Request) -> None:
4243
ctx.permission = self.value
4344

4445

45-
async def filter_data_permission(db: AsyncSession, request: Request) -> ColumnElement[bool]: # noqa: C901
46+
async def filter_data_permission(db: AsyncSession, request_user: GetUserInfoWithRelationDetail) -> ColumnElement[bool]: # noqa: C901
4647
"""
4748
过滤数据权限,控制用户可见数据范围
4849
4950
使用场景:
5051
- 控制用户能看到哪些数据
5152
5253
:param db: 数据库会话
53-
:param request: FastAPI 请求对象
54+
:param request_user: 请求用户
5455
:return:
5556
"""
5657
# 是否过滤数据权限
57-
if request.user.is_superuser:
58+
if request_user.is_superuser:
5859
return or_(1 == 1)
5960

60-
for role in request.user.roles:
61+
for role in request_user.roles:
6162
if not role.is_filter_scopes:
6263
return or_(1 == 1)
6364

6465
# 获取数据范围
6566
data_scope_ids = set()
66-
for role in request.user.roles:
67+
for role in request_user.roles:
6768
for scope in role.scopes:
6869
if scope.status:
6970
data_scope_ids.add(scope.id)

0 commit comments

Comments
 (0)