From fb8d8d5bbd1bf0378ac0845192aac58330d0d55a Mon Sep 17 00:00:00 2001 From: nannan00 <17491932+nannan00@users.noreply.github.com> Date: Tue, 13 Aug 2024 16:09:41 +0800 Subject: [PATCH] perf: use `list_subject_groups_detail` instead of `list_subject_all_group` --- saas/backend/api/management/v2/views/subject.py | 8 +++----- saas/backend/component/iam.py | 13 +++++++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/saas/backend/api/management/v2/views/subject.py b/saas/backend/api/management/v2/views/subject.py index 057a2c466..12cadbb2c 100644 --- a/saas/backend/api/management/v2/views/subject.py +++ b/saas/backend/api/management/v2/views/subject.py @@ -28,7 +28,7 @@ from backend.apps.subject_template.models import SubjectTemplateGroup from backend.biz.group import GroupBiz from backend.common.error_codes import error_codes -from backend.component.iam import list_all_subject_groups +from backend.component.iam import list_subject_groups_detail from backend.service.constants import GroupMemberType from backend.service.models import Subject from backend.util.time import utc_string_to_timestamp @@ -134,16 +134,14 @@ def _get_subject_group_dict(subject: Subject, group_ids: List[int]) -> Dict[int, """ 从后台查询加入的用户组详情 """ - # Note: 可能有性能问题,部分用户加入的用户组可能过多,后续可考虑后台支持 group_ids 过滤查询 - # 这里参考了 [web api] /api/v1/roles/group_members///groups/ - groups = list_all_subject_groups(subject.type, subject.id) + # Note: 后台支持 group_ids 过滤查询,但最多 100,数据量过多则需要分多次查询 + groups = list_subject_groups_detail(subject.type, subject.id, group_ids) return { int(one["id"]): { "expired_at": one["expired_at"], "created_at": utc_string_to_timestamp(one["created_at"]), } for one in groups - if int(one["id"]) in group_ids } @swagger_auto_schema( diff --git a/saas/backend/component/iam.py b/saas/backend/component/iam.py index 6ba901d88..43c496df7 100644 --- a/saas/backend/component/iam.py +++ b/saas/backend/component/iam.py @@ -603,6 +603,19 @@ def unfreeze_subjects(subjects: List[Dict]) -> None: return _call_iam_api(http_delete, url_path, data=subjects) +def list_subject_groups_detail(subject_type: str, subject_id: str, group_ids: List[int]) -> List[Dict]: + """ + 查询Subject与用户组的详情(包括加入时间和过期时间) + """ + url_path = "/api/v1/web/subjects-groups/detail" + data = { + "type": subject_type, + "id": subject_id, + "group_ids": ",".join(map(str, group_ids)), + } + return _call_iam_api(http_get, url_path, data=data) + + def check_subject_groups_belong(subject_type: str, subject_id: str, group_ids: List[int]) -> Dict[str, bool]: """ 校验Subject与用户组是否存在关系