@@ -89,7 +89,7 @@ async def _is_workspace_active(
8989 """
9090 # TODO: All of this should be done within a transaction.
9191
92- selected_workspace = await self ._db_reader .get_workspace_by_name (workspace_name )
92+ selected_workspace = await self ._db_reader .get_non_deleted_workspace_by_name (workspace_name )
9393 if not selected_workspace :
9494 raise WorkspaceDoesNotExistError (f"Workspace { workspace_name } does not exist." )
9595
@@ -118,7 +118,7 @@ async def activate_workspace(self, workspace_name: str):
118118 async def update_workspace_system_prompt (
119119 self , workspace_name : str , sys_prompt_lst : List [str ]
120120 ) -> Workspace :
121- selected_workspace = await self ._db_reader .get_workspace_by_name (workspace_name )
121+ selected_workspace = await self ._db_reader .get_non_deleted_workspace_by_name (workspace_name )
122122 if not selected_workspace :
123123 raise WorkspaceDoesNotExistError (f"Workspace { workspace_name } does not exist." )
124124
@@ -132,7 +132,7 @@ async def update_workspace_system_prompt(
132132 updated_workspace = await db_recorder .update_workspace (workspace_update )
133133 return updated_workspace
134134
135- async def soft_delete_workspace (self , workspace_name : str ):
135+ async def soft_delete_workspace (self , workspace_name : str ) -> None :
136136 """
137137 Soft delete a workspace
138138 """
@@ -141,11 +141,11 @@ async def soft_delete_workspace(self, workspace_name: str):
141141 if workspace_name == DEFAULT_WORKSPACE_NAME :
142142 raise WorkspaceCrudError ("Cannot delete default workspace." )
143143
144- selected_workspace = await self ._db_reader .get_workspace_by_name (workspace_name )
144+ selected_workspace = await self ._db_reader .get_non_deleted_workspace_by_name (workspace_name )
145145 if not selected_workspace :
146146 raise WorkspaceDoesNotExistError (f"Workspace { workspace_name } does not exist." )
147147
148- # Check if workspace is active, if it is, make the default workspace active
148+ # Check if workspace is active, if it is, avoid deleting it
149149 active_workspace = await self ._db_reader .get_active_workspace ()
150150 if active_workspace and active_workspace .id == selected_workspace .id :
151151 raise WorkspaceCrudError ("Cannot delete active workspace." )
@@ -157,8 +157,30 @@ async def soft_delete_workspace(self, workspace_name: str):
157157 raise WorkspaceCrudError (f"Error deleting workspace { workspace_name } " )
158158 return
159159
160+ async def hard_delete_workspace (self , workspace_name : str ) -> None :
161+ """
162+ Soft delete a workspace
163+ """
164+ if workspace_name == "" :
165+ raise WorkspaceCrudError ("Workspace name cannot be empty." )
166+
167+ selected_workspace = await self ._db_reader .get_workspace_by_name (workspace_name )
168+ if not selected_workspace :
169+ raise WorkspaceDoesNotExistError (f"Workspace { workspace_name } does not exist." )
170+
171+ # Check if workspace is soft deleted, if it is not, don't delete it
172+ if not selected_workspace .deleted_at :
173+ raise WorkspaceCrudError ("Cannot delete workspace that is not soft-deleted." )
174+
175+ db_recorder = DbRecorder ()
176+ try :
177+ _ = await db_recorder .hard_delete_workspace (selected_workspace )
178+ except Exception :
179+ raise WorkspaceCrudError (f"Error deleting workspace { workspace_name } " )
180+ return
181+
160182 async def get_workspace_by_name (self , workspace_name : str ) -> Workspace :
161- workspace = await self ._db_reader .get_workspace_by_name (workspace_name )
183+ workspace = await self ._db_reader .get_non_deleted_workspace_by_name (workspace_name )
162184 if not workspace :
163185 raise WorkspaceDoesNotExistError (f"Workspace { workspace_name } does not exist." )
164186 return workspace
0 commit comments