Skip to content

Commit 92aeb42

Browse files
committed
refactor: update get_workspace_groups method
Signed-off-by: Youngjin Jo <[email protected]>
1 parent c281966 commit 92aeb42

File tree

3 files changed

+88
-70
lines changed

3 files changed

+88
-70
lines changed

src/spaceone/identity/service/user_profile_service.py

+79-61
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import string
55
from typing import Dict, List, Union
66

7+
from mongoengine import QuerySet
78
from spaceone.core import config
89
from spaceone.core.service import *
910
from spaceone.core.service.utils import *
@@ -22,6 +23,7 @@
2223
from spaceone.identity.manager.user_manager import UserManager
2324
from spaceone.identity.manager.workspace_group_manager import WorkspaceGroupManager
2425
from spaceone.identity.manager.workspace_manager import WorkspaceManager
26+
from spaceone.identity.model import WorkspaceGroup
2527
from spaceone.identity.model.user.database import User
2628
from spaceone.identity.model.user.response import *
2729
from spaceone.identity.model.user_profile.request import *
@@ -416,75 +418,28 @@ def get_workspace_groups(
416418
) -> Union[MyWorkspaceGroupsResponse, dict]:
417419
"""Find user
418420
Args:
419-
params (UserWorkspacesRequest): {
420-
'user_id': 'str', # injected from auth (required)
421-
'domain_id': 'str' # injected from auth (required)
421+
params (UserProfileGetWorkspaceGroupsRequest): {
422+
'user_id': 'str', # injected from auth (required)
423+
'domain_id': 'str' # injected from auth (required)
422424
}
423425
Returns:
424-
MyWorkspaceResponse:
426+
MyWorkspaceGroupsResponse:
425427
"""
426-
rb_mgr = RoleBindingManager()
427-
allow_all = False
428-
429428
user_vo = self.user_mgr.get_user(params.user_id, params.domain_id)
429+
allow_all = user_vo.role_type == "DOMAIN_ADMIN"
430430

431-
if user_vo.role_type == "DOMAIN_ADMIN":
432-
allow_all = True
433-
434-
if allow_all:
435-
workspace_group_vos = self.workspace_group_mgr.filter_workspace_groups(
436-
domain_id=params.domain_id
437-
)
438-
workspace_group_infos = [
439-
workspace_group_vo.to_dict()
440-
for workspace_group_vo in workspace_group_vos
441-
]
442-
else:
443-
query_filter = {
444-
"filter": [
445-
{"key": "users.user_id", "value": params.user_id, "operator": "eq"},
446-
{"key": "domain_id", "value": params.domain_id, "operator": "eq"},
447-
]
448-
}
449-
workspace_group_infos, _ = self.workspace_group_mgr.list_workspace_groups(
450-
query_filter
451-
)
452-
431+
workspace_group_infos = self._get_workspace_group_infos(params, allow_all)
453432
workspace_group_ids = [
454-
workspace_group_info["workspace_group_id"]
455-
for workspace_group_info in workspace_group_infos
433+
info["workspace_group_id"] for info in workspace_group_infos
456434
]
457-
458-
rb_vos = rb_mgr.filter_role_bindings(
459-
user_id=params.user_id,
460-
domain_id=params.domain_id,
461-
workspace_group_id=workspace_group_ids,
462-
role_type=["WORKSPACE_OWNER", "WORKSPACE_MEMBER"],
435+
role_bindings_info_map = self._get_role_bindings_info(
436+
params, workspace_group_ids
463437
)
464-
role_bindings_info_map = {rb.workspace_group_id: rb.to_dict() for rb in rb_vos}
465-
466-
workspace_group_user_ids = []
467-
for workspace_group_info in workspace_group_infos:
468-
if not isinstance(workspace_group_info, dict):
469-
workspace_group_info = workspace_group_info.to_dict()
470-
if users := workspace_group_info.get("users", []) or []:
471-
for user in users:
472-
if isinstance(user, dict):
473-
workspace_group_user_ids.append(user.get("user_id"))
474-
elif hasattr(user, "user_id"):
475-
workspace_group_user_ids.append(user.user_id)
476-
477-
workspace_groups_info = []
478-
for workspace_group_info in workspace_group_infos:
479-
workspace_group_dict = (
480-
self.workspace_group_svc.add_user_name_and_state_to_users(
481-
workspace_group_user_ids,
482-
workspace_group_info,
483-
params.domain_id,
484-
)
485-
)
486-
workspace_groups_info.append(workspace_group_dict)
438+
workspace_group_user_ids = self._extract_user_ids(workspace_group_infos)
487439

440+
workspace_groups_info = self._add_user_name_and_state(
441+
workspace_group_infos, params.domain_id, workspace_group_user_ids
442+
)
488443
my_workspace_groups_info = self._get_my_workspace_groups_info(
489444
workspace_groups_info, role_bindings_info_map
490445
)
@@ -573,9 +528,72 @@ def _get_my_workspaces_info(
573528
my_workspaces_info.append(workspace_info)
574529
return my_workspaces_info
575530

531+
def _get_workspace_group_infos(
532+
self, params: UserProfileGetWorkspaceGroupsRequest, allow_all: bool
533+
) -> Union[QuerySet, List[Dict[str, str]]]:
534+
if allow_all:
535+
workspace_group_vos = self.workspace_group_mgr.filter_workspace_groups(
536+
domain_id=params.domain_id
537+
)
538+
return [vo.to_dict() for vo in workspace_group_vos]
539+
else:
540+
query_filter = {
541+
"filter": [
542+
{"key": "users.user_id", "value": params.user_id, "operator": "eq"},
543+
{"key": "domain_id", "value": params.domain_id, "operator": "eq"},
544+
]
545+
}
546+
return self.workspace_group_mgr.list_workspace_groups(query_filter)[0]
547+
548+
@staticmethod
549+
def _get_role_bindings_info(
550+
params: UserProfileGetWorkspaceGroupsRequest, workspace_group_ids: List[str]
551+
) -> Dict[str, Dict[str, str]]:
552+
rb_mgr = RoleBindingManager()
553+
rb_vos = rb_mgr.filter_role_bindings(
554+
user_id=params.user_id,
555+
domain_id=params.domain_id,
556+
workspace_group_id=workspace_group_ids,
557+
role_type=["WORKSPACE_OWNER", "WORKSPACE_MEMBER"],
558+
)
559+
return {rb.workspace_group_id: rb.to_dict() for rb in rb_vos}
560+
561+
@staticmethod
562+
def _extract_user_ids(
563+
workspace_group_infos: Union[QuerySet, List[Dict[str, str]]]
564+
) -> List[str]:
565+
workspace_group_user_ids = []
566+
for workspace_group_info in workspace_group_infos:
567+
if not isinstance(workspace_group_info, dict):
568+
workspace_group_info = workspace_group_info.to_dict()
569+
if users := workspace_group_info.get("users", []) or []:
570+
for user in users:
571+
if isinstance(user, dict):
572+
workspace_group_user_ids.append(user.get("user_id"))
573+
elif hasattr(user, "user_id"):
574+
workspace_group_user_ids.append(user.user_id)
575+
576+
return workspace_group_user_ids
577+
578+
def _add_user_name_and_state(
579+
self,
580+
workspace_group_infos: Union[QuerySet, List[Dict[str, str]]],
581+
domain_id: str,
582+
workspace_group_user_ids: List[str],
583+
) -> List[Union[WorkspaceGroup, Dict[str, str]]]:
584+
updated_workspace_group_infos = []
585+
for workspace_group_info in workspace_group_infos:
586+
updated_workspace_group_infos.append(
587+
self.workspace_group_svc.add_user_name_and_state_to_users(
588+
workspace_group_info, domain_id, workspace_group_user_ids
589+
)
590+
)
591+
return updated_workspace_group_infos
592+
576593
@staticmethod
577594
def _get_my_workspace_groups_info(
578-
workspace_groups_info: list, role_bindings_info_map: dict = None
595+
workspace_groups_info: List[Union[WorkspaceGroup, Dict[str, str]]],
596+
role_bindings_info_map: Dict[str, Dict[str, str]] = None,
579597
) -> List[Dict[str, str]]:
580598
my_workspace_groups_info = []
581599

src/spaceone/identity/service/workspace_group_service.py

+7-7
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import logging
22
from datetime import datetime
3-
from mongoengine import QuerySet
4-
from typing import Dict, List, Union, Any
3+
from typing import Any, Dict, List, Union
54

5+
from mongoengine import QuerySet
66
from spaceone.core.error import ERROR_INVALID_PARAMETER, ERROR_NOT_FOUND
77
from spaceone.core.service import (
88
BaseService,
@@ -244,7 +244,7 @@ def get(
244244
)
245245
)
246246
workspace_group_info = self.add_user_name_and_state_to_users(
247-
workspace_group_user_ids, workspace_group_vo, params.domain_id
247+
workspace_group_vo, params.domain_id, workspace_group_user_ids
248248
)
249249
return WorkspaceGroupResponse(**workspace_group_info)
250250

@@ -360,7 +360,7 @@ def process_add_users(
360360

361361
workspace_group_user_ids: List[str] = old_user_ids + new_user_ids
362362
workspace_group_user_info = self.add_user_name_and_state_to_users(
363-
workspace_group_user_ids, workspace_group_vo, domain_id
363+
workspace_group_vo, domain_id, workspace_group_user_ids
364364
)
365365

366366
return WorkspaceGroupResponse(**workspace_group_user_info)
@@ -571,17 +571,17 @@ def add_user(user_info, workspace_group_workspace_id=None):
571571

572572
def add_user_name_and_state_to_users(
573573
self,
574-
workspace_group_user_ids: List[str],
575574
workspace_group_info: Union[WorkspaceGroup, Dict[str, Any]],
576575
domain_id: str,
576+
workspace_group_user_ids: List[str],
577577
) -> Dict[str, Any]:
578578
"""Add user's name and state to users in workspace group.
579579
Since the user's name and state are not in user of workspace group in database,
580580
we need to add user's name and state to users in the Application layer.
581581
Args:
582-
workspace_group_user_ids: 'List[str]'
583582
workspace_group_info: 'Union[WorkspaceGroup, Dict[str, Any]]'
584583
domain_id: 'str'
584+
workspace_group_user_ids: 'List[str]'
585585
Returns:
586586
workspace_group_info: 'Dict[str, Any]'
587587
"""
@@ -711,7 +711,7 @@ def get_workspace_groups_info(
711711
workspace_group_vo
712712
)
713713
workspace_group_dict = self.add_user_name_and_state_to_users(
714-
workspace_group_user_ids, workspace_group_vo, domain_id
714+
workspace_group_vo, domain_id, workspace_group_user_ids
715715
)
716716
workspace_groups_info.append(workspace_group_dict)
717717
return workspace_groups_info

src/spaceone/identity/service/workspace_group_user_service.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import logging
2-
from typing import List, Union
2+
from typing import Union
33

44
from spaceone.core.service import (
55
BaseService,
@@ -202,7 +202,7 @@ def get(
202202

203203
workspace_group_dict = (
204204
self.workspace_group_svc.add_user_name_and_state_to_users(
205-
workspace_group_user_ids, workspace_group_vo, params.domain_id
205+
workspace_group_vo, params.domain_id, workspace_group_user_ids
206206
)
207207
)
208208
return WorkspaceGroupResponse(**workspace_group_dict)

0 commit comments

Comments
 (0)