diff --git a/goosebit/api/v1/devices/device/responses.py b/goosebit/api/v1/devices/device/responses.py index 1b03945f..b252936d 100644 --- a/goosebit/api/v1/devices/device/responses.py +++ b/goosebit/api/v1/devices/device/responses.py @@ -7,6 +7,7 @@ class DeviceLogResponse(BaseModel): log: str | None + progress: int | None class DeviceResponse(DeviceSchema): diff --git a/goosebit/api/v1/devices/device/routes.py b/goosebit/api/v1/devices/device/routes.py index 3ef4c33c..b0cc4c46 100644 --- a/goosebit/api/v1/devices/device/routes.py +++ b/goosebit/api/v1/devices/device/routes.py @@ -29,4 +29,4 @@ async def device_get(_: Request, device: Device = Depends(get_device)) -> Device async def device_logs(_: Request, device: Device = Depends(get_device)) -> DeviceLogResponse: if device is None: raise HTTPException(404) - return DeviceLogResponse(log=device.last_log) + return DeviceLogResponse(log=device.last_log, progress=device.progress) diff --git a/goosebit/ui/bff/devices/device/__init__.py b/goosebit/ui/bff/devices/device/__init__.py new file mode 100644 index 00000000..6096e388 --- /dev/null +++ b/goosebit/ui/bff/devices/device/__init__.py @@ -0,0 +1 @@ +from .routes import router # noqa : F401 diff --git a/goosebit/ui/bff/devices/device/routes.py b/goosebit/ui/bff/devices/device/routes.py new file mode 100644 index 00000000..54f73ce6 --- /dev/null +++ b/goosebit/ui/bff/devices/device/routes.py @@ -0,0 +1,16 @@ +from __future__ import annotations + +from fastapi import APIRouter, Security + +from goosebit.api.v1.devices.device import routes +from goosebit.auth import validate_user_permissions + +router = APIRouter(prefix="/{dev_id}") + +router.add_api_route( + "/log", + routes.device_logs, + methods=["GET"], + dependencies=[Security(validate_user_permissions, scopes=["device.read"])], + name="bff_device_logs", +) diff --git a/goosebit/ui/bff/devices/routes.py b/goosebit/ui/bff/devices/routes.py index bb8d2e94..b802487e 100644 --- a/goosebit/ui/bff/devices/routes.py +++ b/goosebit/ui/bff/devices/routes.py @@ -19,10 +19,12 @@ from goosebit.ui.bff.common.util import parse_datatables_query from ..common.responses import DTColumnDescription, DTColumns +from . import device from .requests import DevicesPatchRequest from .responses import BFFDeviceResponse router = APIRouter(prefix="/devices") +router.include_router(device.router) @router.get( diff --git a/goosebit/ui/static/js/logs.js b/goosebit/ui/static/js/logs.js index 963c7c2c..7808aa64 100644 --- a/goosebit/ui/static/js/logs.js +++ b/goosebit/ui/static/js/logs.js @@ -1,25 +1,10 @@ -document.addEventListener("DOMContentLoaded", () => { - const logs_ws = create_ws(`/realtime/logs/${device}`); +document.addEventListener("DOMContentLoaded", async () => { + const res = await get_request(`/ui/bff/devices/${device}/log`); - logs_ws.addEventListener("message", (event) => { - const res = JSON.parse(event.data); + const logElem = document.getElementById("device-log"); + logElem.textContent = res.log; - const logElem = document.getElementById("device-log"); - if (res.clear) { - logElem.textContent = ""; - } - logElem.textContent += res.log; - - const progressElem = document.getElementById("install-progress"); - progressElem.style.width = `${res.progress}%`; - progressElem.innerHTML = `${res.progress}%`; - }); + const progressElem = document.getElementById("install-progress"); + progressElem.style.width = `${res.progress}%`; + progressElem.innerHTML = `${res.progress}%`; }); - -function create_ws(s) { - const l = window.location; - const protocol = l.protocol === "https:" ? "wss://" : "ws://"; - const port = l.port !== "80" || l.port !== "443" ? l.port : ""; - const url = `${protocol}${l.hostname}:${port}${s}`; - return new WebSocket(url); -}