diff --git a/vehicle-data-platform/apps/api/internal/platform/handler_test.go b/vehicle-data-platform/apps/api/internal/platform/handler_test.go index 8d788199..16ca9ee6 100644 --- a/vehicle-data-platform/apps/api/internal/platform/handler_test.go +++ b/vehicle-data-platform/apps/api/internal/platform/handler_test.go @@ -259,6 +259,15 @@ func TestHandlerVehicleServiceIncludesVehicleLevelStatus(t *testing.T) { if body.Data.ServiceStatus.OnlineSourceCount != 1 || body.Data.ServiceStatus.SourceCount != 3 { t.Fatalf("vehicle service should expose source counts, got %+v body=%s", body.Data.ServiceStatus, rec.Body.String()) } + if body.Data.Resolution == nil || body.Data.Resolution.ServiceStatus == nil || body.Data.Resolution.ServiceStatus.Title != body.Data.ServiceStatus.Title { + t.Fatalf("resolution should reuse canonical vehicle service status, resolution=%+v service=%+v", body.Data.Resolution, body.Data.ServiceStatus) + } + if body.Data.Identity == nil || body.Data.Identity.ServiceStatus == nil || body.Data.Identity.ServiceStatus.Title != body.Data.ServiceStatus.Title { + t.Fatalf("identity should reuse canonical vehicle service status, identity=%+v service=%+v", body.Data.Identity, body.Data.ServiceStatus) + } + if body.Data.RealtimeSummary == nil || body.Data.RealtimeSummary.ServiceStatus == nil || body.Data.RealtimeSummary.ServiceStatus.Title != body.Data.ServiceStatus.Title { + t.Fatalf("realtime summary should reuse canonical vehicle service status, summary=%+v service=%+v", body.Data.RealtimeSummary, body.Data.ServiceStatus) + } } func TestHandlerVehicleServiceIncludesUnifiedOverview(t *testing.T) { diff --git a/vehicle-data-platform/apps/api/internal/platform/service.go b/vehicle-data-platform/apps/api/internal/platform/service.go index c86febd2..b5ba6afd 100644 --- a/vehicle-data-platform/apps/api/internal/platform/service.go +++ b/vehicle-data-platform/apps/api/internal/platform/service.go @@ -291,6 +291,16 @@ func (s *Service) VehicleDetail(ctx context.Context, vin string, protocol string sourceStatus := vehicleSourceStatus(vehicles.Items, realtime.Items, history.Items, raw.Items, mileage.Items) sourceStatus = s.enrichVehicleSourceStatus(ctx, queryVIN, sourceStatus) sourceStatus = completeVehicleSourceStatus(sourceStatus, protocol) + serviceStatus := buildVehicleServiceStatus(true, sourceStatus) + resolution.ServiceStatus = serviceStatus + if identity != nil { + identity.ServiceStatus = serviceStatus + } + if summary != nil { + summary.ServiceStatus = serviceStatus + } + serviceOverview := buildVehicleServiceOverview(resolvedVIN, keyword, &resolution, identity, summary, sourceStatus, history, raw, mileage, quality) + serviceOverview.ServiceStatus = serviceStatus return VehicleDetail{ VIN: resolvedVIN, LookupKey: keyword, @@ -298,8 +308,8 @@ func (s *Service) VehicleDetail(ctx context.Context, vin string, protocol string Resolution: &resolution, Identity: identity, RealtimeSummary: summary, - ServiceStatus: buildVehicleServiceStatus(true, sourceStatus), - ServiceOverview: buildVehicleServiceOverview(resolvedVIN, keyword, &resolution, identity, summary, sourceStatus, history, raw, mileage, quality), + ServiceStatus: serviceStatus, + ServiceOverview: serviceOverview, SourceConsistency: buildVehicleSourceConsistency(sourceStatus, realtime.Items, protocol), Sources: sourceNames(sourceStatus), SourceStatus: sourceStatus,