From 652a8e5d158d13f415d0c31f1b0de6de912f946c Mon Sep 17 00:00:00 2001 From: saravanakumardb1 Date: Thu, 19 Mar 2026 22:20:31 -0700 Subject: [PATCH] fix(platform-service): missing cosmos containers + NaN guard in cross-product limit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - cosmos-init.ts: add onboarding_events + onboarding_completions containers (onboarding repository references them but they were never registered) - telemetry cross-product route: parseInt(limit) could produce NaN when given non-numeric input — now clamps to 1-100 with default 20 --- services/platform-service/src/lib/cosmos-init.ts | 3 +++ services/platform-service/src/modules/telemetry/routes.ts | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/services/platform-service/src/lib/cosmos-init.ts b/services/platform-service/src/lib/cosmos-init.ts index 9dffd5a7..0e87c2b1 100644 --- a/services/platform-service/src/lib/cosmos-init.ts +++ b/services/platform-service/src/lib/cosmos-init.ts @@ -147,6 +147,9 @@ const CONTAINER_DEFS: Record = { diagnostic_insights: { partitionKeyPath: '/clusterId', defaultTtl: 90 * 86400 }, diagnostic_queries: { partitionKeyPath: '/userId', defaultTtl: 30 * 86400 }, proactive_alerts: { partitionKeyPath: '/productId', defaultTtl: 30 * 86400 }, + // Onboarding analytics (Phase 4.3) + onboarding_events: { partitionKeyPath: '/productId' }, + onboarding_completions: { partitionKeyPath: '/productId' }, // Broadcast Messaging & Surveys (see docs/roadmaps/not-started/platform_BROADCAST_SURVEY_ROADMAP.md) broadcasts: { partitionKeyPath: '/productId' }, broadcast_deliveries: { partitionKeyPath: '/userId', defaultTtl: 90 * 86400 }, diff --git a/services/platform-service/src/modules/telemetry/routes.ts b/services/platform-service/src/modules/telemetry/routes.ts index 34cbb15b..93f8f4e0 100644 --- a/services/platform-service/src/modules/telemetry/routes.ts +++ b/services/platform-service/src/modules/telemetry/routes.ts @@ -928,10 +928,14 @@ export async function telemetryRoutes(app: FastifyInstance) { throw new BadRequestError('Provide 1-20 product IDs'); } + const parsedLimit = limit ? parseInt(limit, 10) : 20; + const clampedLimit = + Number.isFinite(parsedLimit) && parsedLimit > 0 ? Math.min(parsedLimit, 100) : 20; + const [summary, daily, clusters] = await Promise.all([ repo.queryCrossProductSummary(productIds, from, to), repo.queryCrossProductDaily(productIds, from, to), - repo.queryCrossProductClusters(productIds, limit ? parseInt(limit, 10) : 20), + repo.queryCrossProductClusters(productIds, clampedLimit), ]); return { summary, daily, clusters };