Source code for duck.etc.blueprints.dashboard.views
"""
View handlers for the dashboard blueprint.
Checks JWT authentication on every dashboard request.
Unauthenticated requests are served the LoginPage so auth is
handled in a single WebSocket-driven flow with no redirects.
"""
from duck.http.request import HttpRequest
from duck.contrib.auth import get_user_id, async_logout
from duck.contrib.jwt import JWTExpired, JWTInvalid
from duck.shortcuts import resolve, redirect
from .ui.pages.dashboard import DashboardPage
from .ui.pages.login import LoginPage, DASHBOARD_USER_ID
[docs]
async def dashboard(request: HttpRequest):
"""
Renders the live server dashboard if the request carries a valid JWT.
Calls async_get_user_from_jwt to extract and verify the token from
the request (cookie or Authorization header). Unauthenticated requests
receive the LoginPage; authenticated requests receive the DashboardPage.
Args:
request: The incoming HTTP request.
Returns:
A rendered DashboardPage or LoginPage component.
"""
try:
user_id = get_user_id(request, backend="jwt")
except (JWTInvalid, JWTExpired):
user_id = None
request.JWT.reset()
if str(user_id) == str(DASHBOARD_USER_ID):
return DashboardPage(request=request)
return LoginPage(request=request)
[docs]
async def logout(request: HttpRequest):
"""
Clears the JWT session and redirects to the dashboard login screen.
Args:
request: The incoming HTTP request.
Returns:
An HttpResponse redirect to the dashboard index (which will show
LoginPage since the JWT has been cleared).
"""
# Logout user
try:
await async_logout(request, backend="jwt")
except (JWTInvalid, JWTExpired):
request.JWT.reset()
pass
# Redirect user to dashboard URL
dashboard_url = resolve("dashboard.index")
return redirect(dashboard_url)