diff --git a/app/(app)/ideas/[id]/page.tsx b/app/(app)/ideas/[id]/page.tsx index 10439f2..d548a81 100644 --- a/app/(app)/ideas/[id]/page.tsx +++ b/app/(app)/ideas/[id]/page.tsx @@ -29,6 +29,7 @@ export default async function IdeaDetailPage({ params, searchParams }: PageProps include: { product: { select: { id: true, name: true, repo_url: true } }, pbi: { select: { id: true, code: true, title: true } }, + secondary_products: { include: { product: { select: { id: true, name: true } } } }, }, }) if (!idea) notFound() diff --git a/app/(app)/ideas/page.tsx b/app/(app)/ideas/page.tsx index 142e376..1b2c45d 100644 --- a/app/(app)/ideas/page.tsx +++ b/app/(app)/ideas/page.tsx @@ -16,7 +16,10 @@ export default async function IdeasPage() { const ideas = await prisma.idea.findMany({ where: { user_id: session.userId, archived: false }, orderBy: { created_at: 'desc' }, - include: { product: { select: { id: true, name: true, repo_url: true } } }, + include: { + product: { select: { id: true, name: true, repo_url: true } }, + secondary_products: { include: { product: { select: { id: true, name: true } } } }, + }, take: 200, }) diff --git a/app/api/ideas/route.ts b/app/api/ideas/route.ts index 84d1ad7..7da26ac 100644 --- a/app/api/ideas/route.ts +++ b/app/api/ideas/route.ts @@ -32,7 +32,10 @@ export async function GET(request: Request) { ...(productIdParam ? { product_id: productIdParam } : {}), ...(status ? { status } : {}), }, - include: { product: { select: { id: true, name: true, repo_url: true } } }, + include: { + product: { select: { id: true, name: true, repo_url: true } }, + secondary_products: { include: { product: { select: { id: true, name: true } } } }, + }, orderBy: { created_at: 'desc' }, take: 200, }) diff --git a/lib/idea-dto.ts b/lib/idea-dto.ts index b32d14a..3b6557c 100644 --- a/lib/idea-dto.ts +++ b/lib/idea-dto.ts @@ -9,6 +9,7 @@ import type { Idea, IdeaStatus, Product } from '@prisma/client' type IdeaWithProduct = Idea & { product: Pick | null pbi?: { id: string; code: string; title: string } | null + secondary_products?: { id: string; product_id: string; product: { id: string; name: string } }[] } export interface IdeaDto { @@ -21,6 +22,7 @@ export interface IdeaDto { product: { id: string; name: string; repo_url: string | null } | null pbi_id: string | null pbi?: { id: string; code: string; title: string } | null + secondary_products: { id: string; product_id: string; product: { id: string; name: string } }[] archived: boolean has_grill_md: boolean has_plan_md: boolean @@ -39,6 +41,7 @@ export function ideaToDto(idea: IdeaWithProduct & { status: IdeaStatus }): IdeaD product: idea.product, pbi_id: idea.pbi_id, pbi: idea.pbi ?? null, + secondary_products: idea.secondary_products ?? [], archived: idea.archived, // Geen md-content in lijst-payloads (kan groot zijn) — enkel een vlag. has_grill_md: idea.grill_md !== null, diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 87f12af..352e5c2 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -188,6 +188,7 @@ model Product { claude_questions ClaudeQuestion[] claude_jobs ClaudeJob[] ideas Idea[] + idea_products IdeaProduct[] @@unique([user_id, name]) @@unique([user_id, code]) @@ -416,10 +417,11 @@ model Idea { created_at DateTime @default(now()) updated_at DateTime @updatedAt - questions ClaudeQuestion[] - jobs ClaudeJob[] - logs IdeaLog[] - user_questions UserQuestion[] + questions ClaudeQuestion[] + jobs ClaudeJob[] + logs IdeaLog[] + user_questions UserQuestion[] + secondary_products IdeaProduct[] @@unique([user_id, code]) @@index([user_id, archived, status]) @@ -427,6 +429,20 @@ model Idea { @@map("ideas") } +model IdeaProduct { + id String @id @default(cuid()) + idea_id String + product_id String + created_at DateTime @default(now()) + + idea Idea @relation(fields: [idea_id], references: [id], onDelete: Cascade) + product Product @relation(fields: [product_id], references: [id], onDelete: Cascade) + + @@unique([idea_id, product_id]) + @@index([product_id]) + @@map("idea_products") +} + model IdeaLog { id String @id @default(cuid()) idea Idea @relation(fields: [idea_id], references: [id], onDelete: Cascade)