73 lines
2.4 KiB
Python
73 lines
2.4 KiB
Python
"""Stable read-only public API endpoints."""
|
|
|
|
from typing import Optional
|
|
|
|
from fastapi import APIRouter, Depends, Path, Query
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.api.api_v1.endpoints import domains, tls_reports
|
|
from app.core.database import get_db
|
|
from app.core.security import require_api_token_scope
|
|
from app.services.api_tokens import READ_POSTURE_SCOPE, READ_REPORTS_SCOPE, READ_TLS_SCOPE
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/domains", response_model=domains.DomainSummaryResponse)
|
|
async def public_domain_summary(
|
|
db: Session = Depends(get_db),
|
|
_auth: dict = Depends(require_api_token_scope(READ_REPORTS_SCOPE)),
|
|
):
|
|
"""List monitored domains with report and DNS posture summary fields."""
|
|
return await domains.get_domains_summary(db=db)
|
|
|
|
|
|
@router.get(
|
|
"/domains/{domain_id}/posture",
|
|
response_model=domains.PostureDashboardResponse,
|
|
)
|
|
async def public_domain_posture(
|
|
domain_id: str = Path(..., title="The domain ID or name"),
|
|
refresh: bool = Query(False, title="Refresh cached DNS posture"),
|
|
db: Session = Depends(get_db),
|
|
_auth: dict = Depends(require_api_token_scope(READ_POSTURE_SCOPE)),
|
|
):
|
|
"""Return the stable evidence-first posture payload for one domain."""
|
|
return await domains.get_domain_posture_dashboard(
|
|
domain_id=domain_id,
|
|
refresh=refresh,
|
|
db=db,
|
|
)
|
|
|
|
|
|
@router.get(
|
|
"/domains/{domain_id}/reports",
|
|
response_model=domains.DomainReportsResponse,
|
|
)
|
|
async def public_domain_reports(
|
|
domain_id: str = Path(..., title="The domain ID or name"),
|
|
limit: int = Query(10, ge=1, le=200),
|
|
db: Session = Depends(get_db),
|
|
_auth: dict = Depends(require_api_token_scope(READ_REPORTS_SCOPE)),
|
|
):
|
|
"""Return recent DMARC aggregate report summaries for one domain."""
|
|
return await domains.get_domain_reports(domain_id=domain_id, limit=limit, db=db)
|
|
|
|
|
|
@router.get("/tls-reports/summary", response_model=tls_reports.TLSSummaryResponse)
|
|
async def public_tls_report_summary(
|
|
domain: Optional[str] = Query(default=None),
|
|
days: int = Query(default=30, ge=1, le=365),
|
|
limit: int = Query(default=10, ge=1, le=50),
|
|
db: Session = Depends(get_db),
|
|
_auth: dict = Depends(require_api_token_scope(READ_TLS_SCOPE)),
|
|
):
|
|
"""Return aggregate SMTP TLS reporting posture trends."""
|
|
return await tls_reports.tls_report_summary(
|
|
domain=domain,
|
|
days=days,
|
|
limit=limit,
|
|
db=db,
|
|
_auth=_auth,
|
|
)
|