import { sql } from 'drizzle-orm'; import { index, jsonb, text, timestamp } from 'drizzle-orm/pg-core'; import { cardsSchema } from './_schema.ts'; /** * Decks — Sammlungen von Karten. Eine Karte gehört zu genau einem Deck. * `fsrs_settings` ist ein JSONB-Slot für per-Deck-Overrides der globalen * FSRS-Defaults (siehe @cards/domain `FsrsSettings`). */ export const decks = cardsSchema.table( 'decks', { id: text('id').primaryKey(), userId: text('user_id').notNull(), name: text('name').notNull(), description: text('description'), color: text('color'), visibility: text('visibility', { enum: ['private', 'space', 'public'] }) .notNull() .default('private'), fsrsSettings: jsonb('fsrs_settings').notNull().default(sql`'{}'::jsonb`), contentHash: text('content_hash'), // Marketplace-Lineage (Phase 12 R3): wenn dieses private Deck via // `POST /api/v1/marketplace/decks/:slug/fork` aus einem // öffentlichen Deck entstanden ist, zeigen diese Pointer auf // die marketplace-Quelle. NULL = nicht-geforkt (einfach selbst // angelegt). Wird beim Smart-Merge-Pull benutzt um die richtige // Quelle nachzuladen. forkedFromMarketplaceDeckId: text('forked_from_marketplace_deck_id'), forkedFromMarketplaceVersionId: text('forked_from_marketplace_version_id'), createdAt: timestamp('created_at', { withTimezone: true, mode: 'date' }) .notNull() .defaultNow(), updatedAt: timestamp('updated_at', { withTimezone: true, mode: 'date' }) .notNull() .defaultNow(), }, (t) => ({ userIdx: index('decks_user_idx').on(t.userId), }) ); export type DeckRow = typeof decks.$inferSelect; export type DeckInsert = typeof decks.$inferInsert;