Skip to content

Commit fddfe69

Browse files
committed
Add versioned secure router
1 parent de15ec5 commit fddfe69

1 file changed

Lines changed: 39 additions & 1 deletion

File tree

src/blueapi/service/main.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,9 @@ async def inner(app: FastAPI):
9999
return inner
100100

101101

102-
secure_router = APIRouter()
103102
open_router = APIRouter()
103+
secure_router = APIRouter(deprecated=True)
104+
secure_router_v1 = APIRouter(prefix="/api/v1")
104105

105106

106107
def get_app(config: ApplicationConfig):
@@ -122,6 +123,7 @@ def get_app(config: ApplicationConfig):
122123
}
123124
app.include_router(open_router)
124125
app.include_router(secure_router, dependencies=dependencies)
126+
app.include_router(secure_router_v1, dependencies=dependencies)
125127
app.add_exception_handler(KeyError, on_key_error_404)
126128
app.add_exception_handler(jwt.PyJWTError, on_token_error_401)
127129
app.middleware("http")(add_version_headers)
@@ -188,6 +190,7 @@ def root_redirect() -> RedirectResponse:
188190
)
189191

190192

193+
@secure_router_v1.get("/environment", tags=[Tag.ENV])
191194
@secure_router.get("/environment", tags=[Tag.ENV])
192195
@start_as_current_span(TRACER, "runner")
193196
def get_environment(
@@ -197,6 +200,7 @@ def get_environment(
197200
return runner.state
198201

199202

203+
@secure_router_v1.delete("/environment", tags=[Tag.ENV])
200204
@secure_router.delete("/environment", tags=[Tag.ENV])
201205
async def delete_environment(
202206
background_tasks: BackgroundTasks,
@@ -227,6 +231,7 @@ def get_oidc_config(
227231
return config
228232

229233

234+
@secure_router_v1.get("/plans", tags=[Tag.PLAN])
230235
@secure_router.get("/plans", tags=[Tag.PLAN])
231236
@start_as_current_span(TRACER)
232237
def get_plans(runner: Annotated[WorkerDispatcher, Depends(_runner)]) -> PlanResponse:
@@ -235,6 +240,7 @@ def get_plans(runner: Annotated[WorkerDispatcher, Depends(_runner)]) -> PlanResp
235240
return PlanResponse(plans=plans)
236241

237242

243+
@secure_router_v1.get("/plans/{name}", tags=[Tag.PLAN])
238244
@secure_router.get("/plans/{name}", tags=[Tag.PLAN])
239245
@start_as_current_span(TRACER, "name")
240246
def get_plan_by_name(
@@ -244,6 +250,7 @@ def get_plan_by_name(
244250
return runner.run(interface.get_plan, name)
245251

246252

253+
@secure_router_v1.get("/devices", tags=[Tag.DEVICE])
247254
@secure_router.get("/devices", tags=[Tag.DEVICE])
248255
@start_as_current_span(TRACER)
249256
def get_devices(
@@ -254,6 +261,7 @@ def get_devices(
254261
return DeviceResponse(devices=devices)
255262

256263

264+
@secure_router_v1.get("/devices/{name}", tags=[Tag.DEVICE])
257265
@secure_router.get("/devices/{name}", tags=[Tag.DEVICE])
258266
@start_as_current_span(TRACER, "name")
259267
def get_device_by_name(
@@ -270,6 +278,7 @@ def get_device_by_name(
270278
)
271279

272280

281+
@secure_router_v1.post("/tasks", status_code=status.HTTP_201_CREATED, tags=[Tag.TASK])
273282
@secure_router.post("/tasks", status_code=status.HTTP_201_CREATED, tags=[Tag.TASK])
274283
@start_as_current_span(
275284
TRACER,
@@ -318,6 +327,9 @@ def submit_task(
318327
) from e
319328

320329

330+
@secure_router_v1.delete(
331+
"/tasks/{task_id}", status_code=status.HTTP_200_OK, tags=[Tag.TASK]
332+
)
321333
@secure_router.delete(
322334
"/tasks/{task_id}", status_code=status.HTTP_200_OK, tags=[Tag.TASK]
323335
)
@@ -337,6 +349,7 @@ def validate_task_status(v: str) -> TaskStatusEnum:
337349
return TaskStatusEnum(v_upper)
338350

339351

352+
@secure_router_v1.get("/tasks", status_code=status.HTTP_200_OK, tags=[Tag.TASK])
340353
@secure_router.get("/tasks", status_code=status.HTTP_200_OK, tags=[Tag.TASK])
341354
@start_as_current_span(TRACER)
342355
def get_tasks(
@@ -363,6 +376,11 @@ def get_tasks(
363376
return TasksListResponse(tasks=tasks)
364377

365378

379+
@secure_router_v1.put(
380+
"/worker/task",
381+
responses={status.HTTP_409_CONFLICT: {}},
382+
tags=[Tag.TASK],
383+
)
366384
@secure_router.put(
367385
"/worker/task",
368386
responses={status.HTTP_409_CONFLICT: {}},
@@ -397,6 +415,7 @@ def get_passthrough_headers(request: Request) -> dict[str, str]:
397415
}
398416

399417

418+
@secure_router_v1.get("/tasks/{task_id}", tags=[Tag.TASK])
400419
@secure_router.get("/tasks/{task_id}", tags=[Tag.TASK])
401420
@start_as_current_span(TRACER, "task_id")
402421
def get_task(
@@ -410,6 +429,10 @@ def get_task(
410429
return task
411430

412431

432+
@secure_router_v1.get(
433+
"/worker/task",
434+
tags=[Tag.TASK],
435+
)
413436
@secure_router.get(
414437
"/worker/task",
415438
tags=[Tag.TASK],
@@ -423,6 +446,10 @@ def get_active_task(
423446
return WorkerTask(task_id=task_id)
424447

425448

449+
@secure_router_v1.get(
450+
"/worker/state",
451+
tags=[Tag.TASK],
452+
)
426453
@secure_router.get(
427454
"/worker/state",
428455
tags=[Tag.TASK],
@@ -448,6 +475,15 @@ def get_state(runner: Annotated[WorkerDispatcher, Depends(_runner)]) -> WorkerSt
448475
}
449476

450477

478+
@secure_router_v1.put(
479+
"/worker/state",
480+
status_code=status.HTTP_202_ACCEPTED,
481+
responses={
482+
status.HTTP_400_BAD_REQUEST: {},
483+
status.HTTP_202_ACCEPTED: {},
484+
},
485+
tags=[Tag.TASK],
486+
)
451487
@secure_router.put(
452488
"/worker/state",
453489
status_code=status.HTTP_202_ACCEPTED,
@@ -506,6 +542,7 @@ def set_state(
506542
return runner.run(interface.get_worker_state)
507543

508544

545+
@secure_router_v1.get("/python_environment", tags=[Tag.ENV])
509546
@secure_router.get("/python_environment", tags=[Tag.ENV])
510547
@start_as_current_span(TRACER)
511548
def get_python_environment(
@@ -527,6 +564,7 @@ def health_probe() -> HealthProbeResponse:
527564
return HealthProbeResponse(status=Health.OK)
528565

529566

567+
@secure_router_v1.get("/logout", include_in_schema=False)
530568
@secure_router.get("/logout", include_in_schema=False)
531569
def logout(runner: Annotated[WorkerDispatcher, Depends(_runner)]) -> Response:
532570
"""Redirect to logout url"""

0 commit comments

Comments
 (0)