From 5513955453857ca5ea745eaa954766e2fc33fce1 Mon Sep 17 00:00:00 2001 From: Youngjin Jo Date: Sat, 28 Sep 2024 02:12:57 +0900 Subject: [PATCH] fix: remove code such that find mongodb nested document Signed-off-by: Youngjin Jo --- .../manager/workspace_group_user_manager.py | 3 +- .../identity/service/user_profile_service.py | 32 ++++++---- .../service/workspace_group_service.py | 27 ++++---- .../service/workspace_group_user_service.py | 6 +- .../identity/service/workspace_service.py | 62 +++++++++---------- 5 files changed, 68 insertions(+), 62 deletions(-) diff --git a/src/spaceone/identity/manager/workspace_group_user_manager.py b/src/spaceone/identity/manager/workspace_group_user_manager.py index 0bafe3c..0fbbacf 100644 --- a/src/spaceone/identity/manager/workspace_group_user_manager.py +++ b/src/spaceone/identity/manager/workspace_group_user_manager.py @@ -31,7 +31,6 @@ def stat_workspace_group_users( def check_user_role_type( old_users_in_workspace_group: List[Dict[str, str]], user_id: str, - command: str, ) -> None: user_role_type = "" for old_user in old_users_in_workspace_group: @@ -40,7 +39,7 @@ def check_user_role_type( if user_role_type == "WORKSPACE_MEMBER": _LOGGER.error( - f"User ID {user_id} does not have permission to {command} users to workspace group." + f"User ID {user_id} does not have permission to workspace group." ) raise ERROR_PERMISSION_DENIED() diff --git a/src/spaceone/identity/service/user_profile_service.py b/src/spaceone/identity/service/user_profile_service.py index f6460ad..e577366 100644 --- a/src/spaceone/identity/service/user_profile_service.py +++ b/src/spaceone/identity/service/user_profile_service.py @@ -436,16 +436,24 @@ def get_workspace_groups( workspace_group_vos = self.workspace_group_mgr.filter_workspace_groups( domain_id=params.domain_id ) + workspace_group_infos = [ + workspace_group_vo.to_dict() + for workspace_group_vo in workspace_group_vos + ] else: - # TODO: Need to check users__user_id is correct - workspace_group_vos = self.workspace_group_mgr.filter_workspace_groups( - users__user_id=params.user_id, - domain_id=params.domain_id, + query_filter = { + "filter": [ + {"key": "users.user_id", "value": params.user_id, "operator": "eq"}, + {"key": "domain_id", "value": params.domain_id, "operator": "eq"}, + ] + } + workspace_group_infos, _ = self.workspace_group_mgr.list_workspace_groups( + query_filter ) workspace_group_ids = [ - workspace_group_vo.workspace_group_id - for workspace_group_vo in workspace_group_vos + workspace_group_info["workspace_group_id"] + for workspace_group_info in workspace_group_infos ] rb_vos = rb_mgr.filter_role_bindings( @@ -457,16 +465,18 @@ def get_workspace_groups( role_bindings_info_map = {rb.workspace_group_id: rb.to_dict() for rb in rb_vos} workspace_group_user_ids = [] - for workspace_group in workspace_group_vos: - if workspace_group.users: - for user in workspace_group.users: + for workspace_group_info in workspace_group_infos: + if workspace_group_info["users"]: + for user in workspace_group_info["users"]: workspace_group_user_ids.append(user.user_id) workspace_groups_info = [] - for workspace_group_vo in workspace_group_vos: + for workspace_group_info in workspace_group_infos: workspace_group_dict = ( self.workspace_group_svc.add_user_name_and_state_to_users( - workspace_group_user_ids, workspace_group_vo, params.domain_id + workspace_group_user_ids, + workspace_group_info.to_dict(), + params.domain_id, ) ) workspace_groups_info.append(workspace_group_dict) diff --git a/src/spaceone/identity/service/workspace_group_service.py b/src/spaceone/identity/service/workspace_group_service.py index 8a0b5e5..17849f0 100644 --- a/src/spaceone/identity/service/workspace_group_service.py +++ b/src/spaceone/identity/service/workspace_group_service.py @@ -1,6 +1,6 @@ import logging from datetime import datetime -from typing import Dict, List, Union +from typing import Any, Dict, List, Union from spaceone.core.error import ERROR_INVALID_PARAMETER, ERROR_NOT_FOUND from spaceone.core.service import ( @@ -26,7 +26,6 @@ from spaceone.identity.manager.user_manager import UserManager from spaceone.identity.manager.workspace_group_manager import WorkspaceGroupManager from spaceone.identity.manager.workspace_manager import WorkspaceManager -from spaceone.identity.model import WorkspaceGroup from spaceone.identity.model.workspace_group.request import ( WorkspaceGroupAddUsersRequest, WorkspaceGroupCreateRequest, @@ -474,7 +473,8 @@ def delete_workspace_users_role_binding( workspace_id=workspace_group_workspace_ids, domain_id=domain_id, ) - rb_vos.delete() + for rb_vo in rb_vos: + self.rb_mgr.delete_role_binding_by_vo(rb_vo) def add_users_to_workspace_group( self, @@ -534,7 +534,7 @@ def add_users_to_workspace_group( def add_user_name_and_state_to_users( self, workspace_group_user_ids: List[str], - workspace_group_vo: WorkspaceGroup, + workspace_group_info: Dict[str, Any], domain_id: str, ) -> Dict[str, str]: """Add user's name and state to users in workspace group. @@ -542,7 +542,7 @@ def add_user_name_and_state_to_users( we need to add user's name and state to users in the Application layer. Args: workspace_group_user_ids: 'List[str]' - workspace_group_vo: 'WorkspaceGroup' + workspace_group_info: 'Dict[str, str]' domain_id: 'str' Returns: workspace_group_dict: @@ -558,17 +558,16 @@ def add_user_name_and_state_to_users( "state": user_vo.state, } - workspace_group_info = workspace_group_vo.to_dict() + wg_users = workspace_group_info.get("users", []) or [] + users = [] - if workspace_group_info.get("users", []): - users = [] - for user in workspace_group_info["users"]: - user_id = user["user_id"] - user["user_name"] = user_info_map[user_id]["name"] - user["state"] = user_info_map[user_id]["state"] - users.append(user) + for user in wg_users: + user_id = user.get("user_id", "") + user["user_name"] = user_info_map.get(user_id, {}).get("name", "") + user["state"] = user_info_map.get(user_id, {}).get("state", "") + users.append(user) - workspace_group_info["users"] = users + workspace_group_info["users"] = users return workspace_group_info diff --git a/src/spaceone/identity/service/workspace_group_user_service.py b/src/spaceone/identity/service/workspace_group_user_service.py index 33a94d0..7643133 100644 --- a/src/spaceone/identity/service/workspace_group_user_service.py +++ b/src/spaceone/identity/service/workspace_group_user_service.py @@ -108,7 +108,7 @@ def add( workspace_group_old_users_info = workspace_group_vo.users or [] if workspace_group_old_users_info: self.workspace_group_user_mgr.check_user_role_type( - workspace_group_old_users_info, user_id, command="add" + workspace_group_old_users_info, user_id ) role_map = self.workspace_group_svc.get_role_map(new_users_info_list, domain_id) @@ -187,7 +187,7 @@ def remove( workspace_group_users = workspace_group_vo.users self.workspace_group_user_mgr.check_user_role_type( - workspace_group_users, user_id, command="remove" + workspace_group_users, user_id ) old_users = workspace_group_dict["users"] @@ -233,7 +233,7 @@ def update_role( if user_vo.role_type == "USER": workspace_group_users = workspace_group_vo.users self.workspace_group_user_mgr.check_user_role_type( - workspace_group_users, user_id, command="update_role" + workspace_group_users, user_id ) target_user_vo = self.user_mgr.get_user(target_user_id, domain_id) diff --git a/src/spaceone/identity/service/workspace_service.py b/src/spaceone/identity/service/workspace_service.py index 3a5b98f..e0327c9 100644 --- a/src/spaceone/identity/service/workspace_service.py +++ b/src/spaceone/identity/service/workspace_service.py @@ -124,8 +124,8 @@ def change_workspace_group( workspace_group_vo = self.workspace_group_mgr.get_workspace_group( old_workspace_group_id, domain_id ) - self._remove_workspace_from_group( - workspace_id, old_workspace_group_id, domain_id + self._remove_workspace_from_group_with_workspace_vo( + workspace_vo, old_workspace_group_id, domain_id ) if is_updatable: @@ -416,7 +416,9 @@ def _add_workspace_to_group( if old_workspace_group_id: if old_workspace_group_id != workspace_group_id: - self._delete_role_bindings(old_workspace_group_id, domain_id) + self._delete_role_bindings( + workspace_id, old_workspace_group_id, domain_id + ) self._create_role_bindings( workspace_group_vo.users, @@ -472,38 +474,34 @@ def _add_workspace_to_group( return is_updatable - def _remove_workspace_from_group( - self, workspace_id: str, old_workspace_group_id: str, domain_id: str + def _remove_workspace_from_group_with_workspace_vo( + self, workspace_vo: Workspace, old_workspace_group_id: str, domain_id: str ) -> None: + workspace_id = workspace_vo.workspace_id self._delete_role_bindings(workspace_id, old_workspace_group_id, domain_id) - if old_workspace_group_id: - workspace_vo = self.workspace_mgr.get_workspace( - workspace_id=workspace_id, domain_id=domain_id - ) - if workspace_vo: - workspace_vo.changed_at = datetime.utcnow() - workspace_vo.workspace_group_id = None - - user_rb_ids = self.rb_mgr.stat_role_bindings( - query={ - "distinct": "user_id", - "filter": [ - {"k": "workspace_id", "v": workspace_id, "o": "eq"}, - {"k": "domain_id", "v": domain_id, "o": "eq"}, - ], - } - ).get("results", []) - user_rb_total_count = len(user_rb_ids) - - self.workspace_mgr.update_workspace_by_vo( - { - "user_count": user_rb_total_count, - "changed_at": workspace_vo.changed_at, - "workspace_group_id": None, - }, - workspace_vo, - ) + workspace_vo.changed_at = datetime.utcnow() + workspace_vo.workspace_group_id = None + + user_rb_ids = self.rb_mgr.stat_role_bindings( + query={ + "distinct": "user_id", + "filter": [ + {"k": "workspace_id", "v": workspace_id, "o": "eq"}, + {"k": "domain_id", "v": domain_id, "o": "eq"}, + ], + } + ).get("results", []) + user_rb_total_count = len(user_rb_ids) + + self.workspace_mgr.update_workspace_by_vo( + { + "user_count": user_rb_total_count, + "changed_at": workspace_vo.changed_at, + "workspace_group_id": None, + }, + workspace_vo, + ) def _delete_role_bindings( self, workspace_id: str, existing_workspace_group_id: str, domain_id: str