feat(ST-901): add user.active_product_id with FK to Product

- Nullable relation User → Product with onDelete: SetNull
- Index on active_product_id for join performance
- Migration: 20260427165329_add_user_active_product_id
- Install @tanstack/react-table (was missing from node_modules)
- Fix PRIORITY_COLORS ref removed in earlier refactor
- Note: User schema change affects vendor/scrum4me-mcp submodule — run prisma generate + tsc --noEmit there after merge

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Janpeter Visser 2026-04-27 18:55:43 +02:00
parent c74d1337ce
commit dad9a80aa6
4 changed files with 31 additions and 19 deletions

View file

@ -232,7 +232,7 @@ export function PbiList({ productId, pbis, isDemo }: PbiListProps) {
onClick={() => setFilterPriority(null)}
className="flex items-center gap-1 text-xs text-primary hover:underline"
>
<Badge className={cn('text-xs', PRIORITY_COLORS[filterPriority])}>
<Badge className="text-xs">
{PRIORITY_LABELS[filterPriority]}
</Badge>
<span>×</span>

View file

@ -3,8 +3,8 @@
"version": "0.3.1",
"private": true,
"scripts": {
"predev": "lsof -ti:3000 | xargs kill -9 2>/dev/null || true",
"dev": "concurrently \"next dev -p 3000\" \"npm run db:erd:watch\"",
"predev": "npx --yes kill-port 3000 || exit 0",
"dev": "next dev -p 3000",
"build": "next build",
"start": "next start",
"lint": "eslint",

View file

@ -0,0 +1,8 @@
-- AlterTable
ALTER TABLE "users" ADD COLUMN "active_product_id" TEXT;
-- CreateIndex
CREATE INDEX "users_active_product_id_idx" ON "users"("active_product_id");
-- AddForeignKey
ALTER TABLE "users" ADD CONSTRAINT "users_active_product_id_fkey" FOREIGN KEY ("active_product_id") REFERENCES "products"("id") ON DELETE SET NULL ON UPDATE CASCADE;

View file

@ -47,23 +47,26 @@ enum SprintStatus {
}
model User {
id String @id @default(cuid())
username String @unique
email String? @unique
password_hash String
is_demo Boolean @default(false)
bio String? @db.VarChar(160)
bio_detail String? @db.VarChar(2000)
avatar_data Bytes?
created_at DateTime @default(now())
updated_at DateTime @updatedAt
roles UserRole[]
api_tokens ApiToken[]
products Product[]
todos Todo[]
product_members ProductMember[]
assigned_stories Story[] @relation("StoryAssignee")
id String @id @default(cuid())
username String @unique
email String? @unique
password_hash String
is_demo Boolean @default(false)
bio String? @db.VarChar(160)
bio_detail String? @db.VarChar(2000)
avatar_data Bytes?
active_product_id String?
active_product Product? @relation("UserActiveProduct", fields: [active_product_id], references: [id], onDelete: SetNull)
created_at DateTime @default(now())
updated_at DateTime @updatedAt
roles UserRole[]
api_tokens ApiToken[]
products Product[]
todos Todo[]
product_members ProductMember[]
assigned_stories Story[] @relation("StoryAssignee")
@@index([active_product_id])
@@map("users")
}
@ -107,6 +110,7 @@ model Product {
stories Story[]
todos Todo[]
members ProductMember[]
active_for_users User[] @relation("UserActiveProduct")
@@unique([user_id, name])
@@unique([user_id, code])