Archived
77 lines
2.6 KiB
Python
77 lines
2.6 KiB
Python
from __future__ import annotations
|
|||
|
|
|
||
|
|
from fastapi import APIRouter, Request
|
||
|
|
from fastapi.responses import HTMLResponse, PlainTextResponse, Response
|
||
|
|
from starlette.concurrency import run_in_threadpool
|
||
|
|
|
||
|
|
from ..dependencies import ServiceDep, SettingsDep
|
||
|
|
from ..security import client_ip
|
||
|
|
from ..web.forms import request_form
|
||
|
|
from ..web.templates_public import _render_api_docs_page, _render_privacy_page, _render_public_home
|
||
|
|
|
||
|
|
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))
|
||
|
|
|
||
|
|
|
||
|
|
@router.post("/", response_class=HTMLResponse, include_in_schema=False)
|
||
|
|
async def create_hostname(request: Request, settings: SettingsDep, service: ServiceDep) -> str:
|
||
|
|
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))
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/healthz", response_class=PlainTextResponse, include_in_schema=False)
|
||
|
|
def healthz() -> str:
|
||
|
|
return "ok"
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/privacy", response_class=HTMLResponse, include_in_schema=False)
|
||
|
|
def privacy(settings: SettingsDep) -> str:
|
||
|
|
return _render_privacy_page(settings)
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/docs", response_class=HTMLResponse, include_in_schema=False)
|
||
|
|
def api_docs(request: Request, settings: SettingsDep) -> str:
|
||
|
|
return _render_api_docs_page(settings, client_ip(request, settings))
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/robots.txt", response_class=PlainTextResponse, include_in_schema=False)
|
||
|
|
def robots_txt(settings: SettingsDep) -> str:
|
||
|
|
base_url = settings.public_base_url.rstrip("/")
|
||
|
|
admin_path = settings.admin_path.rstrip("/")
|
||
|
|
return "\n".join(
|
||
|
|
[
|
||
|
|
"User-agent: *",
|
||
|
|
f"Disallow: {admin_path}/",
|
||
|
|
"Disallow: /m/",
|
||
|
|
"Disallow: /api/",
|
||
|
|
"Disallow: /redoc",
|
||
|
|
"Disallow: /openapi.json",
|
||
|
|
f"Sitemap: {base_url}/sitemap.xml",
|
||
|
|
"",
|
||
|
|
]
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/sitemap.xml", include_in_schema=False)
|
||
|
|
def sitemap_xml(settings: SettingsDep) -> Response:
|
||
|
|
base_url = settings.public_base_url.rstrip("/")
|
||
|
|
body = f"""<?xml version="1.0" encoding="UTF-8"?>
|
||
|
|
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
||
|
|
<url>
|
||
|
|
<loc>{base_url}/</loc>
|
||
|
|
<changefreq>weekly</changefreq>
|
||
|
|
<priority>1.0</priority>
|
||
|
|
</url>
|
||
|
|
<url>
|
||
|
|
<loc>{base_url}/privacy</loc>
|
||
|
|
<changefreq>monthly</changefreq>
|
||
|
|
<priority>0.3</priority>
|
||
|
|
</url>
|
||
|
|
</urlset>
|
||
|
|
"""
|
||
|
|
return Response(body, media_type="application/xml")
|