You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
orquestrador/admin_app/api/routes/reports.py

477 lines
15 KiB
Python

from fastapi import APIRouter, Depends, HTTPException, status
from admin_app.api.dependencies import get_settings, require_admin_permission
from admin_app.api.schemas import (
AdminBotFlowReportCatalogResponse,
AdminBotFlowReportOverviewResponse,
AdminBotFlowReportResponse,
AdminConversationTelemetryReportCatalogResponse,
AdminConversationTelemetryReportOverviewResponse,
AdminConversationTelemetryReportResponse,
AdminRentalReportCatalogResponse,
AdminRentalReportOverviewResponse,
AdminRentalReportResponse,
AdminReportDatasetListResponse,
AdminReportDatasetResponse,
AdminReportOverviewResponse,
AdminRevenueReportCatalogResponse,
AdminRevenueReportOverviewResponse,
AdminRevenueReportResponse,
AdminSalesReportCatalogResponse,
AdminSalesReportOverviewResponse,
AdminSalesReportResponse,
)
from admin_app.core import AdminSettings, AuthenticatedStaffPrincipal
from admin_app.services import ReportService
from shared.contracts import AdminPermission
router = APIRouter(prefix="/reports", tags=["reports"])
def _build_service(settings: AdminSettings) -> ReportService:
return ReportService(settings)
@router.get(
"/overview",
response_model=AdminReportOverviewResponse,
)
def reports_overview(
settings: AdminSettings = Depends(get_settings),
_: AuthenticatedStaffPrincipal = Depends(
require_admin_permission(AdminPermission.VIEW_REPORTS)
),
):
service = _build_service(settings)
payload = service.build_overview_payload()
return AdminReportOverviewResponse(
service="orquestrador-admin",
mode=payload["mode"],
metrics=payload["metrics"],
materialization=payload["materialization"],
report_families=payload["report_families"],
next_steps=payload["next_steps"],
)
@router.get(
"/datasets",
response_model=AdminReportDatasetListResponse,
)
def report_datasets(
settings: AdminSettings = Depends(get_settings),
_: AuthenticatedStaffPrincipal = Depends(
require_admin_permission(AdminPermission.VIEW_REPORTS)
),
):
service = _build_service(settings)
payload = service.list_datasets_payload()
return AdminReportDatasetListResponse(
service="orquestrador-admin",
source=payload["source"],
materialization=payload["materialization"],
datasets=payload["datasets"],
)
@router.get(
"/datasets/{dataset_key}",
response_model=AdminReportDatasetResponse,
)
def report_dataset_detail(
dataset_key: str,
settings: AdminSettings = Depends(get_settings),
_: AuthenticatedStaffPrincipal = Depends(
require_admin_permission(AdminPermission.VIEW_REPORTS)
),
):
service = _build_service(settings)
payload = service.get_dataset_payload(dataset_key)
if payload is None:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Dataset operacional nao encontrado para relatorio.",
)
return AdminReportDatasetResponse(
service="orquestrador-admin",
source=payload["source"],
materialization=payload["materialization"],
dataset=payload["dataset"],
)
@router.get(
"/sales/overview",
response_model=AdminSalesReportOverviewResponse,
)
def sales_reports_overview(
settings: AdminSettings = Depends(get_settings),
_: AuthenticatedStaffPrincipal = Depends(
require_admin_permission(AdminPermission.VIEW_REPORTS)
),
):
service = _build_service(settings)
payload = service.build_sales_overview_payload()
return AdminSalesReportOverviewResponse(
service="orquestrador-admin",
domain=payload["domain"],
mode=payload["mode"],
source_dataset_keys=payload["source_dataset_keys"],
metrics=payload["metrics"],
materialization=payload["materialization"],
reports=payload["reports"],
next_steps=payload["next_steps"],
)
@router.get(
"/sales/reports",
response_model=AdminSalesReportCatalogResponse,
)
def sales_reports_catalog(
settings: AdminSettings = Depends(get_settings),
_: AuthenticatedStaffPrincipal = Depends(
require_admin_permission(AdminPermission.VIEW_REPORTS)
),
):
service = _build_service(settings)
payload = service.list_sales_reports_payload()
return AdminSalesReportCatalogResponse(
service="orquestrador-admin",
domain=payload["domain"],
source=payload["source"],
materialization=payload["materialization"],
reports=payload["reports"],
)
@router.get(
"/sales/reports/{report_key}",
response_model=AdminSalesReportResponse,
)
def sales_report_detail(
report_key: str,
settings: AdminSettings = Depends(get_settings),
_: AuthenticatedStaffPrincipal = Depends(
require_admin_permission(AdminPermission.VIEW_REPORTS)
),
):
service = _build_service(settings)
payload = service.get_sales_report_payload(report_key)
if payload is None:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Relatorio de vendas nao encontrado.",
)
return AdminSalesReportResponse(
service="orquestrador-admin",
domain=payload["domain"],
source=payload["source"],
materialization=payload["materialization"],
report=payload["report"],
)
@router.get(
"/arrecadacao/overview",
response_model=AdminRevenueReportOverviewResponse,
)
def revenue_reports_overview(
settings: AdminSettings = Depends(get_settings),
_: AuthenticatedStaffPrincipal = Depends(
require_admin_permission(AdminPermission.VIEW_REPORTS)
),
):
service = _build_service(settings)
payload = service.build_revenue_overview_payload()
return AdminRevenueReportOverviewResponse(
service="orquestrador-admin",
area=payload["area"],
source_domain=payload["source_domain"],
mode=payload["mode"],
source_dataset_keys=payload["source_dataset_keys"],
metrics=payload["metrics"],
materialization=payload["materialization"],
reports=payload["reports"],
next_steps=payload["next_steps"],
)
@router.get(
"/arrecadacao/reports",
response_model=AdminRevenueReportCatalogResponse,
)
def revenue_reports_catalog(
settings: AdminSettings = Depends(get_settings),
_: AuthenticatedStaffPrincipal = Depends(
require_admin_permission(AdminPermission.VIEW_REPORTS)
),
):
service = _build_service(settings)
payload = service.list_revenue_reports_payload()
return AdminRevenueReportCatalogResponse(
service="orquestrador-admin",
area=payload["area"],
source_domain=payload["source_domain"],
source=payload["source"],
materialization=payload["materialization"],
reports=payload["reports"],
)
@router.get(
"/arrecadacao/reports/{report_key}",
response_model=AdminRevenueReportResponse,
)
def revenue_report_detail(
report_key: str,
settings: AdminSettings = Depends(get_settings),
_: AuthenticatedStaffPrincipal = Depends(
require_admin_permission(AdminPermission.VIEW_REPORTS)
),
):
service = _build_service(settings)
payload = service.get_revenue_report_payload(report_key)
if payload is None:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Relatorio de arrecadacao nao encontrado.",
)
return AdminRevenueReportResponse(
service="orquestrador-admin",
area=payload["area"],
source_domain=payload["source_domain"],
source=payload["source"],
materialization=payload["materialization"],
report=payload["report"],
)
@router.get(
"/locacao/overview",
response_model=AdminRentalReportOverviewResponse,
)
def rental_reports_overview(
settings: AdminSettings = Depends(get_settings),
_: AuthenticatedStaffPrincipal = Depends(
require_admin_permission(AdminPermission.VIEW_REPORTS)
),
):
service = _build_service(settings)
payload = service.build_rental_overview_payload()
return AdminRentalReportOverviewResponse(
service="orquestrador-admin",
area=payload["area"],
source_domain=payload["source_domain"],
mode=payload["mode"],
source_dataset_keys=payload["source_dataset_keys"],
metrics=payload["metrics"],
materialization=payload["materialization"],
reports=payload["reports"],
next_steps=payload["next_steps"],
)
@router.get(
"/locacao/reports",
response_model=AdminRentalReportCatalogResponse,
)
def rental_reports_catalog(
settings: AdminSettings = Depends(get_settings),
_: AuthenticatedStaffPrincipal = Depends(
require_admin_permission(AdminPermission.VIEW_REPORTS)
),
):
service = _build_service(settings)
payload = service.list_rental_reports_payload()
return AdminRentalReportCatalogResponse(
service="orquestrador-admin",
area=payload["area"],
source_domain=payload["source_domain"],
source=payload["source"],
materialization=payload["materialization"],
reports=payload["reports"],
)
@router.get(
"/locacao/reports/{report_key}",
response_model=AdminRentalReportResponse,
)
def rental_report_detail(
report_key: str,
settings: AdminSettings = Depends(get_settings),
_: AuthenticatedStaffPrincipal = Depends(
require_admin_permission(AdminPermission.VIEW_REPORTS)
),
):
service = _build_service(settings)
payload = service.get_rental_report_payload(report_key)
if payload is None:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Relatorio de locacao nao encontrado.",
)
return AdminRentalReportResponse(
service="orquestrador-admin",
area=payload["area"],
source_domain=payload["source_domain"],
source=payload["source"],
materialization=payload["materialization"],
report=payload["report"],
)
@router.get(
"/fluxo-bot/overview",
response_model=AdminBotFlowReportOverviewResponse,
)
def bot_flow_reports_overview(
settings: AdminSettings = Depends(get_settings),
_: AuthenticatedStaffPrincipal = Depends(
require_admin_permission(AdminPermission.VIEW_REPORTS)
),
):
service = _build_service(settings)
payload = service.build_bot_flow_overview_payload()
return AdminBotFlowReportOverviewResponse(
service="orquestrador-admin",
area=payload["area"],
source_domain=payload["source_domain"],
mode=payload["mode"],
source_dataset_keys=payload["source_dataset_keys"],
metrics=payload["metrics"],
materialization=payload["materialization"],
reports=payload["reports"],
next_steps=payload["next_steps"],
)
@router.get(
"/fluxo-bot/reports",
response_model=AdminBotFlowReportCatalogResponse,
)
def bot_flow_reports_catalog(
settings: AdminSettings = Depends(get_settings),
_: AuthenticatedStaffPrincipal = Depends(
require_admin_permission(AdminPermission.VIEW_REPORTS)
),
):
service = _build_service(settings)
payload = service.list_bot_flow_reports_payload()
return AdminBotFlowReportCatalogResponse(
service="orquestrador-admin",
area=payload["area"],
source_domain=payload["source_domain"],
source=payload["source"],
materialization=payload["materialization"],
reports=payload["reports"],
)
@router.get(
"/fluxo-bot/reports/{report_key}",
response_model=AdminBotFlowReportResponse,
)
def bot_flow_report_detail(
report_key: str,
settings: AdminSettings = Depends(get_settings),
_: AuthenticatedStaffPrincipal = Depends(
require_admin_permission(AdminPermission.VIEW_REPORTS)
),
):
service = _build_service(settings)
payload = service.get_bot_flow_report_payload(report_key)
if payload is None:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Relatorio operacional do fluxo do bot nao encontrado.",
)
return AdminBotFlowReportResponse(
service="orquestrador-admin",
area=payload["area"],
source_domain=payload["source_domain"],
source=payload["source"],
materialization=payload["materialization"],
report=payload["report"],
)
@router.get(
"/telemetria-conversacional/overview",
response_model=AdminConversationTelemetryReportOverviewResponse,
)
def conversation_telemetry_reports_overview(
settings: AdminSettings = Depends(get_settings),
_: AuthenticatedStaffPrincipal = Depends(
require_admin_permission(AdminPermission.VIEW_REPORTS)
),
):
service = _build_service(settings)
payload = service.build_conversation_telemetry_overview_payload()
return AdminConversationTelemetryReportOverviewResponse(
service="orquestrador-admin",
area=payload["area"],
source_domain=payload["source_domain"],
mode=payload["mode"],
source_dataset_keys=payload["source_dataset_keys"],
metrics=payload["metrics"],
materialization=payload["materialization"],
reports=payload["reports"],
next_steps=payload["next_steps"],
)
@router.get(
"/telemetria-conversacional/reports",
response_model=AdminConversationTelemetryReportCatalogResponse,
)
def conversation_telemetry_reports_catalog(
settings: AdminSettings = Depends(get_settings),
_: AuthenticatedStaffPrincipal = Depends(
require_admin_permission(AdminPermission.VIEW_REPORTS)
),
):
service = _build_service(settings)
payload = service.list_conversation_telemetry_reports_payload()
return AdminConversationTelemetryReportCatalogResponse(
service="orquestrador-admin",
area=payload["area"],
source_domain=payload["source_domain"],
source=payload["source"],
materialization=payload["materialization"],
reports=payload["reports"],
)
@router.get(
"/telemetria-conversacional/reports/{report_key}",
response_model=AdminConversationTelemetryReportResponse,
)
def conversation_telemetry_report_detail(
report_key: str,
settings: AdminSettings = Depends(get_settings),
_: AuthenticatedStaffPrincipal = Depends(
require_admin_permission(AdminPermission.VIEW_REPORTS)
),
):
service = _build_service(settings)
payload = service.get_conversation_telemetry_report_payload(report_key)
if payload is None:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Relatorio de telemetria conversacional nao encontrado.",
)
return AdminConversationTelemetryReportResponse(
service="orquestrador-admin",
area=payload["area"],
source_domain=payload["source_domain"],
source=payload["source"],
materialization=payload["materialization"],
report=payload["report"],
)