Simplify setup flow and public API docs

This commit is contained in:
StasonJatham committed 2026-05-21 17:58:20 +02:00
1 parent 2e401124e8
commit 97a76aa91e
12 files changed
+119 -140

No files matched your search

+4
View File
@@ -127,6 +127,7 @@ async def delete_hostname(dashboard_secret: ManagementSlugPath, store: StoreDep,
summary="Read operator dashboard summary",
description="Requires admin HTTP Basic auth. Returns the same high-level data shown in the operator console.",
tags=["admin"],
include_in_schema=False,
responses={401: {"model": ErrorResponse}},
)
async def read_admin(
@@ -161,6 +162,7 @@ async def read_admin(
summary="List operator hostnames",
description="Requires admin HTTP Basic auth.",
tags=["admin"],
include_in_schema=False,
responses={401: {"model": ErrorResponse}},
)
async def list_admin_hostnames(
@@ -185,6 +187,7 @@ async def list_admin_hostnames(
summary="List operator update history",
description="Requires admin HTTP Basic auth. Supports offset pagination or keyset pagination with before.",
tags=["admin"],
include_in_schema=False,
responses={401: {"model": ErrorResponse}},
)
async def list_admin_events(
@@ -210,6 +213,7 @@ async def list_admin_events(
summary="List operator DNS records",
description="Requires admin HTTP Basic auth.",
tags=["admin"],
include_in_schema=False,
responses={401: {"model": ErrorResponse}},
)
async def list_admin_records(
+14 -2
View File
@@ -50,7 +50,7 @@ def manage_dashboard(
account = get_active_management_account(store, management_slug)
csrf_token = dashboard_csrf_token(management_slug, account)
if not management_account_is_accepted(account):
return _render_pending_management_page(settings, management_slug, account, csrf_token)
return _render_pending_management_page(service, settings, management_slug, account, csrf_token, request_ip=client_ip(request, settings))
if not has_management_access(request, settings, management_slug, account):
return _render_management_unlock_page(management_slug, account, csrf_token)
message = "Hostname registered. Add the update URL to your router." if activated else None
@@ -79,22 +79,26 @@ async def activate_dashboard(
except BadIpError:
return HTMLResponse(
_render_pending_management_page(
service,
settings,
management_slug,
account,
dashboard_csrf_token(management_slug, account),
"Registration needs a public source IP. Try again from your home connection or use the API with myip.",
client_ip(request, settings),
),
status_code=400,
)
except DnsProviderError:
return HTMLResponse(
_render_pending_management_page(
service,
settings,
management_slug,
account,
dashboard_csrf_token(management_slug, account),
"DNS registration failed. The hostname was not registered.",
client_ip(request, settings),
),
status_code=500,
)
@@ -124,7 +128,15 @@ async def rotate_dashboard_secrets(
account = await get_active_management_account_async(store, management_slug)
if not management_account_is_accepted(account):
return HTMLResponse(
_render_pending_management_page(settings, management_slug, account, dashboard_csrf_token(management_slug, account), "Register this hostname first."),
_render_pending_management_page(
service,
settings,
management_slug,
account,
dashboard_csrf_token(management_slug, account),
"Register this hostname first.",
client_ip(request, settings),
),
status_code=400,
)
if not has_management_access(request, settings, management_slug, account):
-2
View File
@@ -92,7 +92,6 @@ async def render_management_page_async(
account: ManagementAccount,
csrf_token: str,
message: str | None = None,
created_account: dict[str, str] | None = None,
request_ip: str | None = None,
) -> str:
return await run_in_threadpool(
@@ -103,7 +102,6 @@ async def render_management_page_async(
account,
csrf_token,
message,
created_account,
request_ip,
)
+5 -5
View File
@@ -1,7 +1,7 @@
from __future__ import annotations
from fastapi import APIRouter, Request
from fastapi.responses import HTMLResponse, PlainTextResponse, Response
from fastapi.responses import HTMLResponse, PlainTextResponse, RedirectResponse, Response
from starlette.concurrency import run_in_threadpool
from ..dependencies import ServiceDep, SettingsDep
@@ -13,15 +13,15 @@ router = APIRouter()
@router.get("/", response_class=HTMLResponse, include_in_schema=False)
def index(request: Request, settings: SettingsDep, service: ServiceDep) -> str:
return _render_public_home(service, settings, None, None, client_ip(request, settings))
def index(request: Request, settings: SettingsDep) -> str:
return _render_public_home(settings, None, client_ip(request, settings))
@router.post("/", response_class=HTMLResponse, include_in_schema=False)
async def create_hostname(request: Request, settings: SettingsDep, service: ServiceDep) -> str:
async def create_hostname(request: Request, settings: SettingsDep, service: ServiceDep) -> RedirectResponse:
await request_form(request, settings)
account = await run_in_threadpool(service.create_managed_account)
return _render_public_home(service, settings, account, None, client_ip(request, settings))
return RedirectResponse(service.dashboard_url(account), status_code=303)
@router.get("/healthz", response_class=PlainTextResponse, include_in_schema=False)