From 54b5201fba2f1a6fae1bc932e1a9f4c03230932f Mon Sep 17 00:00:00 2001 From: Juan Antonio Osorio Date: Tue, 21 Jan 2025 10:14:44 +0200 Subject: [PATCH 1/2] Handle reserved keywords for workspaces (#672) This disallows the creation of workspaces with the names "default" and "active" Signed-off-by: Juan Antonio Osorio --- src/codegate/api/v1.py | 2 ++ src/codegate/pipeline/cli/commands.py | 2 ++ src/codegate/workspaces/crud.py | 12 +++++++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/codegate/api/v1.py b/src/codegate/api/v1.py index 1c112a781..439519e1f 100644 --- a/src/codegate/api/v1.py +++ b/src/codegate/api/v1.py @@ -69,6 +69,8 @@ async def create_workspace(request: v1_models.CreateWorkspaceRequest) -> v1_mode "Invalid workspace name. " "Please use only alphanumeric characters and dashes" ), ) + except crud.WorkspaceCrudError as e: + raise HTTPException(status_code=400, detail=str(e)) except Exception: raise HTTPException(status_code=500, detail="Internal server error") diff --git a/src/codegate/pipeline/cli/commands.py b/src/codegate/pipeline/cli/commands.py index aa4449b47..2a97b3b1d 100644 --- a/src/codegate/pipeline/cli/commands.py +++ b/src/codegate/pipeline/cli/commands.py @@ -186,6 +186,8 @@ async def _add_workspace(self, flags: Dict[str, str], args: List[str]) -> str: return "Invalid workspace name: It should be alphanumeric and dashes" except AlreadyExistsError: return f"Workspace **{new_workspace_name}** already exists" + except crud.WorkspaceCrudError: + return "An error occurred while adding the workspace" except Exception: return "An error occurred while adding the workspace" diff --git a/src/codegate/workspaces/crud.py b/src/codegate/workspaces/crud.py index 9fcc63dec..0af7b9505 100644 --- a/src/codegate/workspaces/crud.py +++ b/src/codegate/workspaces/crud.py @@ -17,6 +17,12 @@ class WorkspaceAlreadyActiveError(WorkspaceCrudError): pass +DEFAULT_WORKSPACE_NAME = "default" + +# These are reserved keywords that cannot be used for workspaces +RESERVED_WORKSPACE_KEYWORDS = [DEFAULT_WORKSPACE_NAME, "active"] + + class WorkspaceCrud: def __init__(self): @@ -29,6 +35,10 @@ async def add_workspace(self, new_workspace_name: str) -> Workspace: Args: name (str): The name of the workspace """ + if new_workspace_name == "": + raise WorkspaceCrudError("Workspace name cannot be empty.") + if new_workspace_name in RESERVED_WORKSPACE_KEYWORDS: + raise WorkspaceCrudError(f"Workspace name {new_workspace_name} is reserved.") db_recorder = DbRecorder() workspace_created = await db_recorder.add_workspace(new_workspace_name) return workspace_created @@ -102,7 +112,7 @@ async def soft_delete_workspace(self, workspace_name: str): """ if workspace_name == "": raise WorkspaceCrudError("Workspace name cannot be empty.") - if workspace_name == "default": + if workspace_name == DEFAULT_WORKSPACE_NAME: raise WorkspaceCrudError("Cannot delete default workspace.") selected_workspace = await self._db_reader.get_workspace_by_name(workspace_name) From 781de22c71c6f440dd622144204dcaf8bde4fb61 Mon Sep 17 00:00:00 2001 From: Alejandro Ponce de Leon Date: Tue, 21 Jan 2025 10:17:51 +0200 Subject: [PATCH 2/2] Rename migration files to be sequential (#674) Until now they began with the revision_id which made it hard to spot which migrations were sequential --- alembic.ini | 6 ++++++ ...0_init_db.py => 2025_01_15_1249-30d0144e1a50_init_db.py} | 0 ...=> 2025_01_16_1849-5c2f3eee5f90_introduce_workspaces.py} | 0 ..._01_20_1546-a692c8b52308_add_workspace_system_prompt.py} | 0 ...e.py => 2025_01_20_1727-8e4b4b8d1a88_add_soft_delete.py} | 0 ...-e6227073183d_merging_system_prompt_and_soft_deletes.py} | 0 6 files changed, 6 insertions(+) rename migrations/versions/{30d0144e1a50_init_db.py => 2025_01_15_1249-30d0144e1a50_init_db.py} (100%) rename migrations/versions/{5c2f3eee5f90_introduce_workspaces.py => 2025_01_16_1849-5c2f3eee5f90_introduce_workspaces.py} (100%) rename migrations/versions/{a692c8b52308_add_workspace_system_prompt.py => 2025_01_20_1546-a692c8b52308_add_workspace_system_prompt.py} (100%) rename migrations/versions/{8e4b4b8d1a88_add_soft_delete.py => 2025_01_20_1727-8e4b4b8d1a88_add_soft_delete.py} (100%) rename migrations/versions/{e6227073183d_merging_system_prompt_and_soft_deletes.py => 2025_01_20_1728-e6227073183d_merging_system_prompt_and_soft_deletes.py} (100%) diff --git a/alembic.ini b/alembic.ini index 68d4eab14..35bf35ebc 100644 --- a/alembic.ini +++ b/alembic.ini @@ -15,5 +15,11 @@ prepend_sys_path = . # version_locations. The default within new alembic.ini files is "os", which uses os.pathsep. version_path_separator = os # Use os.pathsep. +# template used to generate migration file names +file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s +# timezone to use when rendering the date within the migration file +# as well as the filename. +timezone = UTC + # DB connection string sqlalchemy.url = sqlite:///codegate_volume/db/codegate.db diff --git a/migrations/versions/30d0144e1a50_init_db.py b/migrations/versions/2025_01_15_1249-30d0144e1a50_init_db.py similarity index 100% rename from migrations/versions/30d0144e1a50_init_db.py rename to migrations/versions/2025_01_15_1249-30d0144e1a50_init_db.py diff --git a/migrations/versions/5c2f3eee5f90_introduce_workspaces.py b/migrations/versions/2025_01_16_1849-5c2f3eee5f90_introduce_workspaces.py similarity index 100% rename from migrations/versions/5c2f3eee5f90_introduce_workspaces.py rename to migrations/versions/2025_01_16_1849-5c2f3eee5f90_introduce_workspaces.py diff --git a/migrations/versions/a692c8b52308_add_workspace_system_prompt.py b/migrations/versions/2025_01_20_1546-a692c8b52308_add_workspace_system_prompt.py similarity index 100% rename from migrations/versions/a692c8b52308_add_workspace_system_prompt.py rename to migrations/versions/2025_01_20_1546-a692c8b52308_add_workspace_system_prompt.py diff --git a/migrations/versions/8e4b4b8d1a88_add_soft_delete.py b/migrations/versions/2025_01_20_1727-8e4b4b8d1a88_add_soft_delete.py similarity index 100% rename from migrations/versions/8e4b4b8d1a88_add_soft_delete.py rename to migrations/versions/2025_01_20_1727-8e4b4b8d1a88_add_soft_delete.py diff --git a/migrations/versions/e6227073183d_merging_system_prompt_and_soft_deletes.py b/migrations/versions/2025_01_20_1728-e6227073183d_merging_system_prompt_and_soft_deletes.py similarity index 100% rename from migrations/versions/e6227073183d_merging_system_prompt_and_soft_deletes.py rename to migrations/versions/2025_01_20_1728-e6227073183d_merging_system_prompt_and_soft_deletes.py