Skip to content

Commit 7553ccf

Browse files
authored
Update return schema of query interface (#492)
* Update return model of query interface * Update tree data return type hints * Update code generation and task return types * Fix inconsistency between ORM query result and schema
1 parent cf693cd commit 7553ccf

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+257
-234
lines changed

backend/app/admin/api/v1/auth/auth.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
from fastapi_limiter.depends import RateLimiter
88
from starlette.background import BackgroundTasks
99

10-
from backend.app.admin.schema.token import GetSwaggerToken
10+
from backend.app.admin.schema.token import GetLoginToken, GetNewToken, GetSwaggerToken
1111
from backend.app.admin.schema.user import AuthLoginParam
1212
from backend.app.admin.service.auth_service import auth_service
13-
from backend.common.response.response_schema import ResponseModel, response_base
13+
from backend.common.response.response_schema import ResponseModel, ResponseSchemaModel, response_base
1414
from backend.common.security.jwt import DependsJwtAuth
1515

1616
router = APIRouter()
@@ -30,13 +30,13 @@ async def swagger_login(obj: Annotated[HTTPBasicCredentials, Depends()]) -> GetS
3030
)
3131
async def user_login(
3232
request: Request, response: Response, obj: AuthLoginParam, background_tasks: BackgroundTasks
33-
) -> ResponseModel:
33+
) -> ResponseSchemaModel[GetLoginToken]:
3434
data = await auth_service.login(request=request, response=response, obj=obj, background_tasks=background_tasks)
3535
return response_base.success(data=data)
3636

3737

3838
@router.post('/token/new', summary='创建新 token', dependencies=[DependsJwtAuth])
39-
async def create_new_token(request: Request, response: Response) -> ResponseModel:
39+
async def create_new_token(request: Request, response: Response) -> ResponseSchemaModel[GetNewToken]:
4040
data = await auth_service.new_token(request=request, response=response)
4141
return response_base.success(data=data)
4242

backend/app/admin/api/v1/auth/captcha.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
from starlette.concurrency import run_in_threadpool
77

88
from backend.app.admin.conf import admin_settings
9-
from backend.common.response.response_schema import ResponseModel, response_base
9+
from backend.app.admin.schema.captcha import GetCaptchaDetail
10+
from backend.common.response.response_schema import ResponseSchemaModel, response_base
1011
from backend.database.redis import redis_client
1112

1213
router = APIRouter()
@@ -17,14 +18,17 @@
1718
summary='获取登录验证码',
1819
dependencies=[Depends(RateLimiter(times=5, seconds=10))],
1920
)
20-
async def get_captcha(request: Request) -> ResponseModel:
21+
async def get_captcha(request: Request) -> ResponseSchemaModel[GetCaptchaDetail]:
2122
"""
2223
此接口可能存在性能损耗,尽管是异步接口,但是验证码生成是IO密集型任务,使用线程池尽量减少性能损耗
2324
"""
2425
img_type: str = 'base64'
2526
img, code = await run_in_threadpool(img_captcha, img_byte=img_type)
2627
ip = request.state.ip
2728
await redis_client.set(
28-
f'{admin_settings.CAPTCHA_LOGIN_REDIS_PREFIX}:{ip}', code, ex=admin_settings.CAPTCHA_LOGIN_EXPIRE_SECONDS
29+
f'{admin_settings.CAPTCHA_LOGIN_REDIS_PREFIX}:{ip}',
30+
code,
31+
ex=admin_settings.CAPTCHA_LOGIN_EXPIRE_SECONDS,
2932
)
30-
return response_base.success(data={'image_type': img_type, 'image': img})
33+
data = GetCaptchaDetail(image_type=img_type, image=img)
34+
return response_base.success(data=data)

backend/app/admin/api/v1/log/login_log.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44

55
from fastapi import APIRouter, Depends, Query
66

7+
from backend.app.admin.schema.login_log import GetLoginLogDetail
78
from backend.app.admin.service.login_log_service import login_log_service
8-
from backend.common.pagination import DependsPagination, paging_data
9-
from backend.common.response.response_schema import ResponseModel, response_base
9+
from backend.common.pagination import DependsPagination, PageData, paging_data
10+
from backend.common.response.response_schema import ResponseModel, ResponseSchemaModel, response_base
1011
from backend.common.security.jwt import DependsJwtAuth
1112
from backend.common.security.permission import RequestPermission
1213
from backend.common.security.rbac import DependsRBAC
@@ -28,7 +29,7 @@ async def get_pagination_login_logs(
2829
username: Annotated[str | None, Query()] = None,
2930
status: Annotated[int | None, Query()] = None,
3031
ip: Annotated[str | None, Query()] = None,
31-
) -> ResponseModel:
32+
) -> ResponseSchemaModel[PageData[GetLoginLogDetail]]:
3233
log_select = await login_log_service.get_select(username=username, status=status, ip=ip)
3334
page_data = await paging_data(db, log_select)
3435
return response_base.success(data=page_data)

backend/app/admin/api/v1/log/opera_log.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44

55
from fastapi import APIRouter, Depends, Query
66

7+
from backend.app.admin.schema.opera_log import GetOperaLogDetail
78
from backend.app.admin.service.opera_log_service import opera_log_service
8-
from backend.common.pagination import DependsPagination, paging_data
9-
from backend.common.response.response_schema import ResponseModel, response_base
9+
from backend.common.pagination import DependsPagination, PageData, paging_data
10+
from backend.common.response.response_schema import ResponseModel, ResponseSchemaModel, response_base
1011
from backend.common.security.jwt import DependsJwtAuth
1112
from backend.common.security.permission import RequestPermission
1213
from backend.common.security.rbac import DependsRBAC
@@ -28,7 +29,7 @@ async def get_pagination_opera_logs(
2829
username: Annotated[str | None, Query()] = None,
2930
status: Annotated[int | None, Query()] = None,
3031
ip: Annotated[str | None, Query()] = None,
31-
) -> ResponseModel:
32+
) -> ResponseSchemaModel[PageData[GetOperaLogDetail]]:
3233
log_select = await opera_log_service.get_select(username=username, status=status, ip=ip)
3334
page_data = await paging_data(db, log_select)
3435
return response_base.success(data=page_data)

backend/app/admin/api/v1/oauth2/github.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from backend.app.admin.conf import admin_settings
99
from backend.app.admin.service.oauth2_service import oauth2_service
1010
from backend.common.enums import UserSocialType
11-
from backend.common.response.response_schema import ResponseModel, response_base
11+
from backend.common.response.response_schema import ResponseSchemaModel, response_base
1212

1313
router = APIRouter()
1414

@@ -17,7 +17,7 @@
1717

1818

1919
@router.get('', summary='获取 Github 授权链接')
20-
async def github_auth2() -> ResponseModel:
20+
async def github_auth2() -> ResponseSchemaModel[str]:
2121
auth_url = await _github_client.get_authorization_url(redirect_uri=admin_settings.OAUTH2_GITHUB_REDIRECT_URI)
2222
return response_base.success(data=auth_url)
2323

backend/app/admin/api/v1/oauth2/linux_do.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from backend.app.admin.conf import admin_settings
99
from backend.app.admin.service.oauth2_service import oauth2_service
1010
from backend.common.enums import UserSocialType
11-
from backend.common.response.response_schema import ResponseModel, response_base
11+
from backend.common.response.response_schema import ResponseSchemaModel, response_base
1212

1313
router = APIRouter()
1414

@@ -20,7 +20,7 @@
2020

2121

2222
@router.get('', summary='获取 Linux Do 授权链接')
23-
async def linux_do_auth2() -> ResponseModel:
23+
async def linux_do_auth2() -> ResponseSchemaModel[str]:
2424
auth_url = await _linux_do_client.get_authorization_url(redirect_uri=admin_settings.OAUTH2_LINUX_DO_REDIRECT_URI)
2525
return response_base.success(data=auth_url)
2626

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44

55
from fastapi import APIRouter, Depends, Path, Query, Request
66

7-
from backend.app.admin.schema.api import CreateApiParam, UpdateApiParam
7+
from backend.app.admin.schema.api import CreateApiParam, GetApiDetail, UpdateApiParam
88
from backend.app.admin.service.api_service import api_service
9-
from backend.common.pagination import DependsPagination, paging_data
10-
from backend.common.response.response_schema import ResponseModel, response_base
9+
from backend.common.pagination import DependsPagination, PageData, paging_data
10+
from backend.common.response.response_schema import ResponseModel, ResponseSchemaModel, response_base
1111
from backend.common.security.jwt import DependsJwtAuth
1212
from backend.common.security.permission import RequestPermission
1313
from backend.common.security.rbac import DependsRBAC
@@ -17,13 +17,13 @@
1717

1818

1919
@router.get('/all', summary='获取所有接口', dependencies=[DependsJwtAuth])
20-
async def get_all_apis() -> ResponseModel:
20+
async def get_all_apis() -> ResponseSchemaModel[list[GetApiDetail]]:
2121
data = await api_service.get_all()
2222
return response_base.success(data=data)
2323

2424

2525
@router.get('/{pk}', summary='获取接口详情', dependencies=[DependsJwtAuth])
26-
async def get_api(pk: Annotated[int, Path(...)]) -> ResponseModel:
26+
async def get_api(pk: Annotated[int, Path(...)]) -> ResponseSchemaModel[GetApiDetail]:
2727
api = await api_service.get(pk=pk)
2828
return response_base.success(data=api)
2929

@@ -42,7 +42,7 @@ async def get_pagination_apis(
4242
name: Annotated[str | None, Query()] = None,
4343
method: Annotated[str | None, Query()] = None,
4444
path: Annotated[str | None, Query()] = None,
45-
) -> ResponseModel:
45+
) -> ResponseSchemaModel[PageData[GetApiDetail]]:
4646
api_select = await api_service.get_select(request=request, name=name, method=method, path=path)
4747
page_data = await paging_data(db, api_select)
4848
return response_base.success(data=page_data)

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

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@
1111
DeleteAllPoliciesParam,
1212
DeletePolicyParam,
1313
DeleteUserRoleParam,
14+
GetPolicyDetail,
1415
UpdatePoliciesParam,
1516
UpdatePolicyParam,
1617
)
1718
from backend.app.admin.service.casbin_service import casbin_service
18-
from backend.common.pagination import DependsPagination, paging_data
19-
from backend.common.response.response_schema import ResponseModel, response_base
19+
from backend.common.pagination import DependsPagination, PageData, paging_data
20+
from backend.common.response.response_schema import ResponseModel, ResponseSchemaModel, response_base
2021
from backend.common.security.jwt import DependsJwtAuth
2122
from backend.common.security.permission import RequestPermission
2223
from backend.common.security.rbac import DependsRBAC
@@ -37,14 +38,16 @@ async def get_pagination_casbin(
3738
db: CurrentSession,
3839
ptype: Annotated[str | None, Query(description='策略类型, p / g')] = None,
3940
sub: Annotated[str | None, Query(description='用户 uuid / 角色')] = None,
40-
) -> ResponseModel:
41+
) -> ResponseSchemaModel[PageData[GetPolicyDetail]]:
4142
casbin_select = await casbin_service.get_casbin_list(ptype=ptype, sub=sub)
4243
page_data = await paging_data(db, casbin_select)
4344
return response_base.success(data=page_data)
4445

4546

4647
@router.get('/policies', summary='获取所有P权限策略', dependencies=[DependsJwtAuth])
47-
async def get_all_policies(role: Annotated[int | None, Query(description='角色ID')] = None) -> ResponseModel:
48+
async def get_all_policies(
49+
role: Annotated[int | None, Query(description='角色ID')] = None,
50+
) -> ResponseSchemaModel[list[GetPolicyDetail]]:
4851
policies = await casbin_service.get_policy_list(role=role)
4952
return response_base.success(data=policies)
5053

@@ -57,7 +60,7 @@ async def get_all_policies(role: Annotated[int | None, Query(description='角色
5760
DependsRBAC,
5861
],
5962
)
60-
async def create_policy(p: CreatePolicyParam) -> ResponseModel:
63+
async def create_policy(p: CreatePolicyParam) -> ResponseSchemaModel[bool]:
6164
"""
6265
p 策略:
6366
@@ -79,7 +82,7 @@ async def create_policy(p: CreatePolicyParam) -> ResponseModel:
7982
DependsRBAC,
8083
],
8184
)
82-
async def create_policies(ps: list[CreatePolicyParam]) -> ResponseModel:
85+
async def create_policies(ps: list[CreatePolicyParam]) -> ResponseSchemaModel[bool]:
8386
data = await casbin_service.create_policies(ps=ps)
8487
return response_base.success(data=data)
8588

@@ -92,7 +95,7 @@ async def create_policies(ps: list[CreatePolicyParam]) -> ResponseModel:
9295
DependsRBAC,
9396
],
9497
)
95-
async def update_policy(obj: UpdatePolicyParam) -> ResponseModel:
98+
async def update_policy(obj: UpdatePolicyParam) -> ResponseSchemaModel[bool]:
9699
data = await casbin_service.update_policy(obj=obj)
97100
return response_base.success(data=data)
98101

@@ -105,7 +108,7 @@ async def update_policy(obj: UpdatePolicyParam) -> ResponseModel:
105108
DependsRBAC,
106109
],
107110
)
108-
async def update_policies(obj: UpdatePoliciesParam) -> ResponseModel:
111+
async def update_policies(obj: UpdatePoliciesParam) -> ResponseSchemaModel[bool]:
109112
data = await casbin_service.update_policies(obj=obj)
110113
return response_base.success(data=data)
111114

@@ -118,7 +121,7 @@ async def update_policies(obj: UpdatePoliciesParam) -> ResponseModel:
118121
DependsRBAC,
119122
],
120123
)
121-
async def delete_policy(p: DeletePolicyParam) -> ResponseModel:
124+
async def delete_policy(p: DeletePolicyParam) -> ResponseSchemaModel[bool]:
122125
data = await casbin_service.delete_policy(p=p)
123126
return response_base.success(data=data)
124127

@@ -131,7 +134,7 @@ async def delete_policy(p: DeletePolicyParam) -> ResponseModel:
131134
DependsRBAC,
132135
],
133136
)
134-
async def delete_policies(ps: list[DeletePolicyParam]) -> ResponseModel:
137+
async def delete_policies(ps: list[DeletePolicyParam]) -> ResponseSchemaModel[bool]:
135138
data = await casbin_service.delete_policies(ps=ps)
136139
return response_base.success(data=data)
137140

@@ -152,7 +155,7 @@ async def delete_all_policies(sub: DeleteAllPoliciesParam) -> ResponseModel:
152155

153156

154157
@router.get('/groups', summary='获取所有G权限策略', dependencies=[DependsJwtAuth])
155-
async def get_all_groups() -> ResponseModel:
158+
async def get_all_groups() -> ResponseSchemaModel[list]:
156159
data = await casbin_service.get_group_list()
157160
return response_base.success(data=data)
158161

@@ -165,7 +168,7 @@ async def get_all_groups() -> ResponseModel:
165168
DependsRBAC,
166169
],
167170
)
168-
async def create_group(g: CreateUserRoleParam) -> ResponseModel:
171+
async def create_group(g: CreateUserRoleParam) -> ResponseSchemaModel[bool]:
169172
"""
170173
g 策略 (**依赖 p 策略**):
171174
@@ -187,7 +190,7 @@ async def create_group(g: CreateUserRoleParam) -> ResponseModel:
187190
DependsRBAC,
188191
],
189192
)
190-
async def create_groups(gs: list[CreateUserRoleParam]) -> ResponseModel:
193+
async def create_groups(gs: list[CreateUserRoleParam]) -> ResponseSchemaModel[bool]:
191194
data = await casbin_service.create_groups(gs=gs)
192195
return response_base.success(data=data)
193196

@@ -200,7 +203,7 @@ async def create_groups(gs: list[CreateUserRoleParam]) -> ResponseModel:
200203
DependsRBAC,
201204
],
202205
)
203-
async def delete_group(g: DeleteUserRoleParam) -> ResponseModel:
206+
async def delete_group(g: DeleteUserRoleParam) -> ResponseSchemaModel[bool]:
204207
data = await casbin_service.delete_group(g=g)
205208
return response_base.success(data=data)
206209

@@ -213,7 +216,7 @@ async def delete_group(g: DeleteUserRoleParam) -> ResponseModel:
213216
DependsRBAC,
214217
],
215218
)
216-
async def delete_groups(gs: list[DeleteUserRoleParam]) -> ResponseModel:
219+
async def delete_groups(gs: list[DeleteUserRoleParam]) -> ResponseSchemaModel[bool]:
217220
data = await casbin_service.delete_groups(gs=gs)
218221
return response_base.success(data=data)
219222

0 commit comments

Comments
 (0)