diff --git a/app/api/realtime/notifications/route.ts b/app/api/realtime/notifications/route.ts index 7a6befa..4fad600 100644 --- a/app/api/realtime/notifications/route.ts +++ b/app/api/realtime/notifications/route.ts @@ -132,7 +132,9 @@ export async function GET(request: NextRequest) { status: 'open', expires_at: { gt: new Date() }, product_id: { in: products.map((p) => p.id) }, - story_id: { not: null }, + // Skip idea-questions (story_id NULL) — story-questions only here. + // Narrowing happens in the flatMap below — Prisma 7 rejects + // `story_id: { not: null }` at runtime. }, orderBy: { created_at: 'desc' }, take: 100, diff --git a/components/notifications/notifications-bridge.tsx b/components/notifications/notifications-bridge.tsx index ef7a9fe..e600838 100644 --- a/components/notifications/notifications-bridge.tsx +++ b/components/notifications/notifications-bridge.tsx @@ -28,7 +28,10 @@ export async function NotificationsBridge({ userId }: NotificationsBridgeProps) status: 'open', expires_at: { gt: new Date() }, product_id: { in: productIds }, - story_id: { not: null }, + // Skip idea-questions (story_id NULL): they have a separate + // realtime channel and aren't shown in this product-scoped bell. + // Narrowing happens in the flatMap below — Prisma 7 rejects + // `story_id: { not: null }` at runtime. }, orderBy: { created_at: 'desc' }, take: 100, diff --git a/lib/insights/verify-stats.ts b/lib/insights/verify-stats.ts index c09806b..0de209f 100644 --- a/lib/insights/verify-stats.ts +++ b/lib/insights/verify-stats.ts @@ -40,7 +40,9 @@ export async function getVerifyResultStats( status: 'DONE' as const, verify_result: { not: null as null }, finished_at: { gt: cutoff }, - task_id: { not: null }, + // Note: task_id can now be NULL on idea-jobs (M12). The toTopJob mapper + // filters them out via .filter(Boolean). Keeping a where-side filter + // (`task_id: { not: null }`) is rejected by Prisma 7 runtime. } const [grouped, rawEmpty, rawDivergent] = await Promise.all([