ligbox-ops-platform/projects/ops-desk/api/app/domain_console_routes.py
Ligbox Spec Hub c1881f58e6 chore: sync Console SSO, DNS viewer, specs e infra docs pendentes
Inclui console handoff Desk↔Console (Spec 019), melhorias DNS Viewer (037),
OpenPanel/Nextcloud/VM116 deploy notes, contracts stack e sidebar actualizado.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-25 20:10:17 +00:00

69 lines
2.1 KiB
Python

"""Domain admin API proxy for Ligbox Console — Spec 035 / 037 V3."""
from __future__ import annotations
import os
from fastapi import APIRouter, Depends, HTTPException, Query
from app import auth
from app.dns_viewer import fetch_dns_viewer
from app.openpanel_dns import fetch_openpanel_bind_records
from app.permissions import can_read_dns_viewer
router = APIRouter(prefix="/api/v1/domain-console", tags=["domain-console"])
DNS_VIEWER_ENABLED = os.getenv("DNS_VIEWER_ENABLED", "1").lower() in ("1", "true", "yes")
STAFF_ROLES = frozenset(
{
"super_admin",
"ops_lead",
"devops",
"seo",
"technician",
"developer",
"noc",
"sales_admin",
"sales_support",
}
)
@router.get("/dns/viewer/{domain}")
async def domain_console_dns_viewer(
domain: str,
email_service: bool | None = Query(default=True),
include_public: bool = Query(default=True),
user: auth.DeskUser = Depends(auth.get_current_user),
):
"""DNS Viewer for Console /admin/dominio."""
if not DNS_VIEWER_ENABLED:
raise HTTPException(404, "DNS Viewer disabled")
if not can_read_dns_viewer(user.role):
raise HTTPException(403, "insufficient permissions")
domain = domain.lower().strip().rstrip(".")
payload = await fetch_dns_viewer(
domain,
role=user.role,
email_service=email_service,
include_public=include_public,
)
if user.role not in STAFF_ROLES:
payload["edit_links"] = [
link
for link in payload.get("edit_links", [])
if link.get("provider") not in ("cf_ligbox", "openpanel_admin", "openpanel_bind")
and link.get("audience") != "staff"
]
return payload
@router.get("/dns/openpanel/records")
async def domain_console_openpanel_records(
domain: str = Query(..., min_length=3),
user: auth.DeskUser = Depends(auth.get_current_user),
):
if not can_read_dns_viewer(user.role):
raise HTTPException(403, "insufficient permissions")
return fetch_openpanel_bind_records(domain.lower().strip().rstrip("."))