import html from fastapi import APIRouter, Depends from fastapi.responses import HTMLResponse from ..auth import require_user from ..config import DEFAULT_GITEA_ORG, get_gitea_public_url, read_env_value from ..templates.layout import page router = APIRouter() # Portal sections (the admin/agenda links shown in the navigation). role: minimum role that can # actually use the section; viewers may see read-only data where a section allows it. PORTAL_SECTIONS = [ ("fa-server", "Služby", "/portal/apps", "Přehled nasazených služeb: stav, dokumentace, prostředky (RAM/CPU), Git a akce.", "viewer (čtení) / developer / admin"), ("fa-list-check", "Úlohy", "/portal/jobs", "Fronta a historie úloh (nasazení, skripty) včetně stavů a logů.", "developer / admin"), ("fa-calendar-days", "Plánované skripty", "/portal/scheduled-scripts", "Cron-like skripty spouštěné na pozadí; úpravy jen pro administrátory.", "developer / admin"), ("fa-bell", "Alerting", "/portal/alerting/rules", "Pravidla alertů a jejich skripty; úpravy jen pro administrátory.", "developer / admin"), ("fa-gauge-high", "Přehled", "/portal/operations", "Operační přehled systému, běžící nasazení a stav služeb.", "admin"), ("fa-server", "Runtime Management", "/portal/admin/runtime", "Redeploy klíčových komponent (Portal, Tools, Webhook, Worker, Caddy, Gitea, Registry) přes job frontu.", "admin"), ("fa-diagram-project", "Migration Readiness", "/portal/migration-readiness", "Připravenost a deploy core služeb AppFactory.", "admin"), ("fa-rocket", "Nasazení", "/portal/deployments", "Historie deploy běhů, stavů a výstupů z deploy procesu.", "developer / admin"), ("fa-triangle-exclamation", "Incidenty", "/portal/incidents", "Evidované incidenty služeb.", "developer / admin"), ("fa-gears", "Workery", "/portal/workers", "Stav workerů zpracovávajících úlohy.", "admin"), ("fa-users", "Users", "/portal/admin/users", "Správa uživatelů a rolí (viewer / developer / admin).", "admin"), ("fa-clipboard-list", "Audit", "/portal/audit", "Auditní log akcí provedených v portálu.", "admin"), ("fa-box-archive", "Zálohy", "/portal/backups", "Vytváření, stažení a obnova záloh AppFactory. Obnova je jen pro administrátory.", "admin"), ] # Public / API endpoints not gated by the portal login. PUBLIC_ENDPOINTS = [ ("GET", "/apps", "Veřejný JSON katalog služeb (název + odkaz na dokumentaci). Routuje se přes Caddy."), ("GET", "/portal/health", "Health endpoint portálu (HTTP 200, pokud portál běží)."), ("GET", "/apps/<app-id>/docs", "Swagger/OpenAPI dokumentace konkrétní služby."), ("GET", "/apps/<app-id>/health", "Health endpoint konkrétní služby."), ] # Roles model. ROLES = [ ("viewer", "Pouze pro čtení: vidí jaké služby běží a jejich dokumentaci (Swagger). Bez Gitu, úprav, nasazení a mazání."), ("developer", "Vše co viewer + provozní workflow služeb: Git/klonování, nasazení, proměnné, prostředky, metadata. Nemůže mazat služby ani do Administrace."), ("admin", "Plný přístup: vše co developer + mazání služeb, správa záloh a jejich obnova, správa uživatelů, audit a admin-only operace."), ] @router.get("/developers", response_class=HTMLResponse) def developers_page(user=Depends(require_user)): section_rows = "" for icon, title, href, desc, roles in PORTAL_SECTIONS: section_rows += f""" {html.escape(title)} {html.escape(href)} {html.escape(desc)} {html.escape(roles)} """ endpoint_rows = "" for method, path, desc in PUBLIC_ENDPOINTS: endpoint_rows += f""" {html.escape(method)} {path} {html.escape(desc)} """ role_rows = "" for role, desc in ROLES: role_rows += f""" {html.escape(role)} {html.escape(desc)} """ gitea_url = get_gitea_public_url() gitea_org = read_env_value("GITEA_ORG", DEFAULT_GITEA_ORG) clone_base = gitea_url or "" clone_cmd = html.escape(f"git clone {clone_base}/{gitea_org}/.git", quote=True) return page( "Pro vývojáře", f"""

Pro vývojáře

Přehled všech sekcí portálu, veřejných endpointů a rolí. Portál běží za reverzní proxy na cestě /portal; jednotlivé služby na /apps/<app-id>.

Jak publikovat

Postup od založení nové služby po nasazení změn.

  1. Vytvořte novou službu. Otevřete formulář Nová služba; vznikne Gitea repozitář, workspace a první nasazení.
  2. Naklonujte repozitář.
    Přesný příkaz pro konkrétní službu (HTTP i SSH) najdete také na stránce Služby.
  3. Upravte kód. Buď se řiďte souborem AGENTS.md v kořenové složce projektu, nebo úpravy nechte provést AI (agent si AGENTS.md přečte sám).
  4. Commit a push. Zacommitujte a pushněte změny — build a nasazení se spustí automaticky (worker je vždy spuštěný a změnu rovnou zpracuje).
  5. Zkontrolujte výsledek. Stav nasazení a běh služby ověříte na stránce Služby (stav, health, dokumentace).

Sekce portálu (agendy)

{section_rows}
Sekce Odkaz Popis Role

Veřejné / API endpointy

{endpoint_rows}
Metoda Cesta Popis

Veřejný katalog /apps vrací JSON se seznamem služeb a odkazy na jejich dokumentaci.

Role a oprávnění

{role_rows}
Role Co může
""", user=user, )