Skip to content

Commit

Permalink
Update return schema of query interface (#492)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
wu-clan authored Jan 18, 2025
1 parent cf693cd commit 7553ccf
Show file tree
Hide file tree
Showing 55 changed files with 257 additions and 234 deletions.
8 changes: 4 additions & 4 deletions backend/app/admin/api/v1/auth/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
from fastapi_limiter.depends import RateLimiter
from starlette.background import BackgroundTasks

from backend.app.admin.schema.token import GetSwaggerToken
from backend.app.admin.schema.token import GetLoginToken, GetNewToken, GetSwaggerToken
from backend.app.admin.schema.user import AuthLoginParam
from backend.app.admin.service.auth_service import auth_service
from backend.common.response.response_schema import ResponseModel, response_base
from backend.common.response.response_schema import ResponseModel, ResponseSchemaModel, response_base
from backend.common.security.jwt import DependsJwtAuth

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


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

Expand Down
12 changes: 8 additions & 4 deletions backend/app/admin/api/v1/auth/captcha.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
from starlette.concurrency import run_in_threadpool

from backend.app.admin.conf import admin_settings
from backend.common.response.response_schema import ResponseModel, response_base
from backend.app.admin.schema.captcha import GetCaptchaDetail
from backend.common.response.response_schema import ResponseSchemaModel, response_base
from backend.database.redis import redis_client

router = APIRouter()
Expand All @@ -17,14 +18,17 @@
summary='获取登录验证码',
dependencies=[Depends(RateLimiter(times=5, seconds=10))],
)
async def get_captcha(request: Request) -> ResponseModel:
async def get_captcha(request: Request) -> ResponseSchemaModel[GetCaptchaDetail]:
"""
此接口可能存在性能损耗,尽管是异步接口,但是验证码生成是IO密集型任务,使用线程池尽量减少性能损耗
"""
img_type: str = 'base64'
img, code = await run_in_threadpool(img_captcha, img_byte=img_type)
ip = request.state.ip
await redis_client.set(
f'{admin_settings.CAPTCHA_LOGIN_REDIS_PREFIX}:{ip}', code, ex=admin_settings.CAPTCHA_LOGIN_EXPIRE_SECONDS
f'{admin_settings.CAPTCHA_LOGIN_REDIS_PREFIX}:{ip}',
code,
ex=admin_settings.CAPTCHA_LOGIN_EXPIRE_SECONDS,
)
return response_base.success(data={'image_type': img_type, 'image': img})
data = GetCaptchaDetail(image_type=img_type, image=img)
return response_base.success(data=data)
7 changes: 4 additions & 3 deletions backend/app/admin/api/v1/log/login_log.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@

from fastapi import APIRouter, Depends, Query

from backend.app.admin.schema.login_log import GetLoginLogDetail
from backend.app.admin.service.login_log_service import login_log_service
from backend.common.pagination import DependsPagination, paging_data
from backend.common.response.response_schema import ResponseModel, response_base
from backend.common.pagination import DependsPagination, PageData, paging_data
from backend.common.response.response_schema import ResponseModel, ResponseSchemaModel, response_base
from backend.common.security.jwt import DependsJwtAuth
from backend.common.security.permission import RequestPermission
from backend.common.security.rbac import DependsRBAC
Expand All @@ -28,7 +29,7 @@ async def get_pagination_login_logs(
username: Annotated[str | None, Query()] = None,
status: Annotated[int | None, Query()] = None,
ip: Annotated[str | None, Query()] = None,
) -> ResponseModel:
) -> ResponseSchemaModel[PageData[GetLoginLogDetail]]:
log_select = await login_log_service.get_select(username=username, status=status, ip=ip)
page_data = await paging_data(db, log_select)
return response_base.success(data=page_data)
Expand Down
7 changes: 4 additions & 3 deletions backend/app/admin/api/v1/log/opera_log.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@

from fastapi import APIRouter, Depends, Query

from backend.app.admin.schema.opera_log import GetOperaLogDetail
from backend.app.admin.service.opera_log_service import opera_log_service
from backend.common.pagination import DependsPagination, paging_data
from backend.common.response.response_schema import ResponseModel, response_base
from backend.common.pagination import DependsPagination, PageData, paging_data
from backend.common.response.response_schema import ResponseModel, ResponseSchemaModel, response_base
from backend.common.security.jwt import DependsJwtAuth
from backend.common.security.permission import RequestPermission
from backend.common.security.rbac import DependsRBAC
Expand All @@ -28,7 +29,7 @@ async def get_pagination_opera_logs(
username: Annotated[str | None, Query()] = None,
status: Annotated[int | None, Query()] = None,
ip: Annotated[str | None, Query()] = None,
) -> ResponseModel:
) -> ResponseSchemaModel[PageData[GetOperaLogDetail]]:
log_select = await opera_log_service.get_select(username=username, status=status, ip=ip)
page_data = await paging_data(db, log_select)
return response_base.success(data=page_data)
Expand Down
4 changes: 2 additions & 2 deletions backend/app/admin/api/v1/oauth2/github.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from backend.app.admin.conf import admin_settings
from backend.app.admin.service.oauth2_service import oauth2_service
from backend.common.enums import UserSocialType
from backend.common.response.response_schema import ResponseModel, response_base
from backend.common.response.response_schema import ResponseSchemaModel, response_base

router = APIRouter()

Expand All @@ -17,7 +17,7 @@


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

Expand Down
4 changes: 2 additions & 2 deletions backend/app/admin/api/v1/oauth2/linux_do.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from backend.app.admin.conf import admin_settings
from backend.app.admin.service.oauth2_service import oauth2_service
from backend.common.enums import UserSocialType
from backend.common.response.response_schema import ResponseModel, response_base
from backend.common.response.response_schema import ResponseSchemaModel, response_base

router = APIRouter()

Expand All @@ -20,7 +20,7 @@


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

Expand Down
12 changes: 6 additions & 6 deletions backend/app/admin/api/v1/sys/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@

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

from backend.app.admin.schema.api import CreateApiParam, UpdateApiParam
from backend.app.admin.schema.api import CreateApiParam, GetApiDetail, UpdateApiParam
from backend.app.admin.service.api_service import api_service
from backend.common.pagination import DependsPagination, paging_data
from backend.common.response.response_schema import ResponseModel, response_base
from backend.common.pagination import DependsPagination, PageData, paging_data
from backend.common.response.response_schema import ResponseModel, ResponseSchemaModel, response_base
from backend.common.security.jwt import DependsJwtAuth
from backend.common.security.permission import RequestPermission
from backend.common.security.rbac import DependsRBAC
Expand All @@ -17,13 +17,13 @@


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


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

Expand All @@ -42,7 +42,7 @@ async def get_pagination_apis(
name: Annotated[str | None, Query()] = None,
method: Annotated[str | None, Query()] = None,
path: Annotated[str | None, Query()] = None,
) -> ResponseModel:
) -> ResponseSchemaModel[PageData[GetApiDetail]]:
api_select = await api_service.get_select(request=request, name=name, method=method, path=path)
page_data = await paging_data(db, api_select)
return response_base.success(data=page_data)
Expand Down
33 changes: 18 additions & 15 deletions backend/app/admin/api/v1/sys/casbin.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,13 @@
DeleteAllPoliciesParam,
DeletePolicyParam,
DeleteUserRoleParam,
GetPolicyDetail,
UpdatePoliciesParam,
UpdatePolicyParam,
)
from backend.app.admin.service.casbin_service import casbin_service
from backend.common.pagination import DependsPagination, paging_data
from backend.common.response.response_schema import ResponseModel, response_base
from backend.common.pagination import DependsPagination, PageData, paging_data
from backend.common.response.response_schema import ResponseModel, ResponseSchemaModel, response_base
from backend.common.security.jwt import DependsJwtAuth
from backend.common.security.permission import RequestPermission
from backend.common.security.rbac import DependsRBAC
Expand All @@ -37,14 +38,16 @@ async def get_pagination_casbin(
db: CurrentSession,
ptype: Annotated[str | None, Query(description='策略类型, p / g')] = None,
sub: Annotated[str | None, Query(description='用户 uuid / 角色')] = None,
) -> ResponseModel:
) -> ResponseSchemaModel[PageData[GetPolicyDetail]]:
casbin_select = await casbin_service.get_casbin_list(ptype=ptype, sub=sub)
page_data = await paging_data(db, casbin_select)
return response_base.success(data=page_data)


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

Expand All @@ -57,7 +60,7 @@ async def get_all_policies(role: Annotated[int | None, Query(description='角色
DependsRBAC,
],
)
async def create_policy(p: CreatePolicyParam) -> ResponseModel:
async def create_policy(p: CreatePolicyParam) -> ResponseSchemaModel[bool]:
"""
p 策略:
Expand All @@ -79,7 +82,7 @@ async def create_policy(p: CreatePolicyParam) -> ResponseModel:
DependsRBAC,
],
)
async def create_policies(ps: list[CreatePolicyParam]) -> ResponseModel:
async def create_policies(ps: list[CreatePolicyParam]) -> ResponseSchemaModel[bool]:
data = await casbin_service.create_policies(ps=ps)
return response_base.success(data=data)

Expand All @@ -92,7 +95,7 @@ async def create_policies(ps: list[CreatePolicyParam]) -> ResponseModel:
DependsRBAC,
],
)
async def update_policy(obj: UpdatePolicyParam) -> ResponseModel:
async def update_policy(obj: UpdatePolicyParam) -> ResponseSchemaModel[bool]:
data = await casbin_service.update_policy(obj=obj)
return response_base.success(data=data)

Expand All @@ -105,7 +108,7 @@ async def update_policy(obj: UpdatePolicyParam) -> ResponseModel:
DependsRBAC,
],
)
async def update_policies(obj: UpdatePoliciesParam) -> ResponseModel:
async def update_policies(obj: UpdatePoliciesParam) -> ResponseSchemaModel[bool]:
data = await casbin_service.update_policies(obj=obj)
return response_base.success(data=data)

Expand All @@ -118,7 +121,7 @@ async def update_policies(obj: UpdatePoliciesParam) -> ResponseModel:
DependsRBAC,
],
)
async def delete_policy(p: DeletePolicyParam) -> ResponseModel:
async def delete_policy(p: DeletePolicyParam) -> ResponseSchemaModel[bool]:
data = await casbin_service.delete_policy(p=p)
return response_base.success(data=data)

Expand All @@ -131,7 +134,7 @@ async def delete_policy(p: DeletePolicyParam) -> ResponseModel:
DependsRBAC,
],
)
async def delete_policies(ps: list[DeletePolicyParam]) -> ResponseModel:
async def delete_policies(ps: list[DeletePolicyParam]) -> ResponseSchemaModel[bool]:
data = await casbin_service.delete_policies(ps=ps)
return response_base.success(data=data)

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


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

Expand All @@ -165,7 +168,7 @@ async def get_all_groups() -> ResponseModel:
DependsRBAC,
],
)
async def create_group(g: CreateUserRoleParam) -> ResponseModel:
async def create_group(g: CreateUserRoleParam) -> ResponseSchemaModel[bool]:
"""
g 策略 (**依赖 p 策略**):
Expand All @@ -187,7 +190,7 @@ async def create_group(g: CreateUserRoleParam) -> ResponseModel:
DependsRBAC,
],
)
async def create_groups(gs: list[CreateUserRoleParam]) -> ResponseModel:
async def create_groups(gs: list[CreateUserRoleParam]) -> ResponseSchemaModel[bool]:
data = await casbin_service.create_groups(gs=gs)
return response_base.success(data=data)

Expand All @@ -200,7 +203,7 @@ async def create_groups(gs: list[CreateUserRoleParam]) -> ResponseModel:
DependsRBAC,
],
)
async def delete_group(g: DeleteUserRoleParam) -> ResponseModel:
async def delete_group(g: DeleteUserRoleParam) -> ResponseSchemaModel[bool]:
data = await casbin_service.delete_group(g=g)
return response_base.success(data=data)

Expand All @@ -213,7 +216,7 @@ async def delete_group(g: DeleteUserRoleParam) -> ResponseModel:
DependsRBAC,
],
)
async def delete_groups(gs: list[DeleteUserRoleParam]) -> ResponseModel:
async def delete_groups(gs: list[DeleteUserRoleParam]) -> ResponseSchemaModel[bool]:
data = await casbin_service.delete_groups(gs=gs)
return response_base.success(data=data)

Expand Down
Loading

0 comments on commit 7553ccf

Please sign in to comment.