65 lines
2.0 KiB
Python
65 lines
2.0 KiB
Python
"""Composition service for permission-aware Dashboard summaries."""
|
|
|
|
from datetime import datetime, timezone
|
|
|
|
from app.dashboard.models import (
|
|
DashboardAccess,
|
|
DashboardOverviewData,
|
|
DashboardOverviewMeta,
|
|
DashboardOverviewResponse,
|
|
)
|
|
from app.inventory.service import InventoryService
|
|
from app.locations.service import LocationMapService
|
|
from app.repairs.center_service import RepairCenterService
|
|
|
|
|
|
class DashboardService:
|
|
"""Coordinate domain-owned summaries without introducing new rules."""
|
|
|
|
def __init__(
|
|
self,
|
|
inventory_service: InventoryService,
|
|
repair_center_service: RepairCenterService,
|
|
location_service: LocationMapService,
|
|
):
|
|
self.inventory_service = inventory_service
|
|
self.repair_center_service = repair_center_service
|
|
self.location_service = location_service
|
|
|
|
def get_overview(self, access: DashboardAccess) -> DashboardOverviewResponse:
|
|
fleet = (
|
|
self.inventory_service.summarize_fleet()
|
|
if access.can_view_miners
|
|
else None
|
|
)
|
|
repairs = (
|
|
self.repair_center_service.summarize_active_repairs()
|
|
if access.can_view_repairs
|
|
else None
|
|
)
|
|
locations = (
|
|
self.location_service.summarize_locations(
|
|
include_miner_counts=access.can_view_miners
|
|
)
|
|
if access.can_view_locations
|
|
else None
|
|
)
|
|
available_sections = [
|
|
name
|
|
for name, value in (
|
|
("fleet", fleet),
|
|
("repairs", repairs),
|
|
("locations", locations),
|
|
)
|
|
if value is not None
|
|
]
|
|
return DashboardOverviewResponse(
|
|
data=DashboardOverviewData(
|
|
fleet=fleet,
|
|
repairs=repairs,
|
|
locations=locations,
|
|
generated_at=datetime.now(timezone.utc),
|
|
),
|
|
meta=DashboardOverviewMeta(available_sections=available_sections),
|
|
)
|