Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

perf: use list_subject_groups_detail instead of `list_subject_all_g… #2775

Merged
merged 1 commit into from
Aug 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions saas/backend/api/management/v2/views/subject.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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/<subject_type>/<subject_id>/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(
Expand Down
13 changes: 13 additions & 0 deletions saas/backend/component/iam.py
Original file line number Diff line number Diff line change
Expand Up @@ -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与用户组是否存在关系
Expand Down
Loading