fix: workspace delete mixed-content error via top-level endpoint

- Add top-level DELETE /workspaces/{workspace_id} endpoint (avoids nested path)
- Frontend deleteWorkspace now uses /workspaces/{id}/?force=... (no project/repo needed)
- Update useWorkspaceActions, ProjectsPage, WorkspacesPage to match new signature

Quality gates: ruff clean, tsc --noEmit clean, pytest workspaces API (9 passed, 1 skipped)
This commit is contained in:
2026-06-01 20:03:24 +02:00
parent 9a036f1968
commit 95efa5d029
6 changed files with 46 additions and 24 deletions
+3 -7
View File
@@ -17,8 +17,6 @@ export interface UseWorkspaceActionsResult {
data: CreateWorkspaceRequest,
) => Promise<Workspace>;
delete: (
projectId: string,
repoId: string,
workspace: Workspace,
onRefresh: () => Promise<void>,
) => Promise<void>;
@@ -61,14 +59,12 @@ export function useWorkspaceActions(): UseWorkspaceActionsResult {
const deleteAction = useCallback(
async (
projectId: string,
repoId: string,
workspace: Workspace,
onRefresh: () => Promise<void>,
) => {
setLoadingId(workspace.id);
try {
await deleteWorkspace(projectId, repoId, workspace.id);
await deleteWorkspace(workspace.id);
await onRefresh();
} catch (err) {
const error = err as ApiError;
@@ -81,7 +77,7 @@ export function useWorkspaceActions(): UseWorkspaceActionsResult {
`\n\nDelete workspace and all instances?`,
);
if (confirmed) {
await deleteWorkspace(projectId, repoId, workspace.id, true);
await deleteWorkspace(workspace.id, true);
await onRefresh();
}
} else {
@@ -118,7 +114,7 @@ export function useWorkspaceActions(): UseWorkspaceActionsResult {
`${message}\n\nDelete this workspace?`,
);
if (confirmed) {
await deleteWorkspace(projectId, repoId, workspace.id, true);
await deleteWorkspace(workspace.id, true);
await onRefresh();
}
} else {