// This is your Prisma schema file, // learn more about it in the docs: https://pris.ly/d/prisma-schema generator client { provider = "prisma-client-js" } datasource db { provider = "sqlite" } model User { id String @id @default(cuid()) email String @unique name String? password String sessions Session[] sharedSessions SessionShare[] sessionEvents SessionEvent[] // Moving Motivators relations motivatorSessions MovingMotivatorsSession[] sharedMotivatorSessions MMSessionShare[] motivatorSessionEvents MMSessionEvent[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model Session { id String @id @default(cuid()) title String collaborator String date DateTime @default(now()) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) items SwotItem[] actions Action[] shares SessionShare[] events SessionEvent[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([userId]) } enum SwotCategory { STRENGTH WEAKNESS OPPORTUNITY THREAT } model SwotItem { id String @id @default(cuid()) content String category SwotCategory order Int @default(0) sessionId String session Session @relation(fields: [sessionId], references: [id], onDelete: Cascade) actionLinks ActionLink[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([sessionId]) } model Action { id String @id @default(cuid()) title String description String? priority Int @default(0) status String @default("todo") dueDate DateTime? sessionId String session Session @relation(fields: [sessionId], references: [id], onDelete: Cascade) links ActionLink[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([sessionId]) } model ActionLink { id String @id @default(cuid()) actionId String action Action @relation(fields: [actionId], references: [id], onDelete: Cascade) swotItemId String swotItem SwotItem @relation(fields: [swotItemId], references: [id], onDelete: Cascade) @@unique([actionId, swotItemId]) @@index([actionId]) @@index([swotItemId]) } // ============================================ // Collaboration & Real-time // ============================================ enum ShareRole { VIEWER EDITOR } model SessionShare { id String @id @default(cuid()) sessionId String session Session @relation(fields: [sessionId], references: [id], onDelete: Cascade) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) role ShareRole @default(EDITOR) createdAt DateTime @default(now()) @@unique([sessionId, userId]) @@index([sessionId]) @@index([userId]) } model SessionEvent { id String @id @default(cuid()) sessionId String session Session @relation(fields: [sessionId], references: [id], onDelete: Cascade) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) type String // ITEM_CREATED, ITEM_UPDATED, ITEM_DELETED, ACTION_CREATED, etc. payload String // JSON payload createdAt DateTime @default(now()) @@index([sessionId, createdAt]) } // ============================================ // Moving Motivators Workshop // ============================================ enum MotivatorType { STATUS // Statut POWER // Pouvoir ORDER // Ordre ACCEPTANCE // Acceptation HONOR // Honneur MASTERY // Maîtrise SOCIAL // Relations sociales FREEDOM // Liberté CURIOSITY // Curiosité PURPOSE // But } model MovingMotivatorsSession { id String @id @default(cuid()) title String participant String // Nom du participant date DateTime @default(now()) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) cards MotivatorCard[] shares MMSessionShare[] events MMSessionEvent[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([userId]) } model MotivatorCard { id String @id @default(cuid()) type MotivatorType orderIndex Int // Position horizontale (1-10, importance) influence Int @default(0) // Position verticale (-3 à +3) sessionId String session MovingMotivatorsSession @relation(fields: [sessionId], references: [id], onDelete: Cascade) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@unique([sessionId, type]) // Une seule carte par type par session @@index([sessionId]) } model MMSessionShare { id String @id @default(cuid()) sessionId String session MovingMotivatorsSession @relation(fields: [sessionId], references: [id], onDelete: Cascade) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) role ShareRole @default(EDITOR) createdAt DateTime @default(now()) @@unique([sessionId, userId]) @@index([sessionId]) @@index([userId]) } model MMSessionEvent { id String @id @default(cuid()) sessionId String session MovingMotivatorsSession @relation(fields: [sessionId], references: [id], onDelete: Cascade) userId String user User @relation(fields: [userId], references: [id], onDelete: Cascade) type String // CARD_MOVED, CARD_INFLUENCE_CHANGED, etc. payload String // JSON payload createdAt DateTime @default(now()) @@index([sessionId, createdAt]) }