forked from stacklok/codegate
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathv1.py
More file actions
69 lines (45 loc) · 2.28 KB
/
v1.py
File metadata and controls
69 lines (45 loc) · 2.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
from fastapi import APIRouter, Response
from fastapi.exceptions import HTTPException
from fastapi.routing import APIRoute
from codegate.api import v1_models
from codegate.pipeline.workspace import commands as wscmd
v1 = APIRouter()
wscrud = wscmd.WorkspaceCrud()
def uniq_name(route: APIRoute):
return f"v1_{route.name}"
@v1.get("/workspaces", tags=["Workspaces"], generate_unique_id_function=uniq_name)
async def list_workspaces() -> v1_models.ListWorkspacesResponse:
"""List all workspaces."""
wslist = await wscrud.get_workspaces()
resp = v1_models.ListWorkspacesResponse.from_db_workspaces(wslist)
return resp
@v1.get("/workspaces/active", tags=["Workspaces"], generate_unique_id_function=uniq_name)
async def list_active_workspaces() -> v1_models.ListActiveWorkspacesResponse:
"""List all active workspaces.
In it's current form, this function will only return one workspace. That is,
the globally active workspace."""
activews = await wscrud.get_active_workspace()
resp = v1_models.ListActiveWorkspacesResponse.from_db_workspaces(activews)
return resp
@v1.post("/workspaces/active", tags=["Workspaces"], generate_unique_id_function=uniq_name)
async def activate_workspace(request: v1_models.ActivateWorkspaceRequest, status_code=204):
"""Activate a workspace by name."""
activated = await wscrud.activate_workspace(request.name)
# TODO: Refactor
if not activated:
return HTTPException(status_code=409, detail="Workspace already active")
return Response(status_code=204)
@v1.post("/workspaces", tags=["Workspaces"], generate_unique_id_function=uniq_name, status_code=201)
async def create_workspace(request: v1_models.CreateWorkspaceRequest):
"""Create a new workspace."""
# Input validation is done in the model
created = await wscrud.add_workspace(request.name)
# TODO: refactor to use a more specific exception
if not created:
raise HTTPException(status_code=400, detail="Failed to create workspace")
return v1_models.Workspace(name=request.name)
@v1.delete("/workspaces/{workspace_name}", tags=["Workspaces"],
generate_unique_id_function=uniq_name, status_code=204)
async def delete_workspace(workspace_name: str):
"""Delete a workspace by name."""
raise NotImplementedError