datasource db { provider = "postgresql" url = env("DATABASE_URL") // uncomment next line if you use Prisma <5.10 directUrl = env("DATABASE_URL_UNPOOLED") relationMode = "prisma" } generator client { provider = "prisma-client-js" previewFeatures = ["fullTextSearch", "fullTextIndex"] } model verification { id String @id @default(cuid()) userId String @unique isEmailVerified Boolean @default(false) verificationToken String? @unique @default(uuid()) verificationTokenExpiry DateTime? verificationEmailsSent Int @default(0) user user @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([userId]) } model user { id String @id @default(uuid()) email String @unique password String isAdmin Boolean @default(false) isEmailVerified Boolean @default(false) name String @db.VarChar(40) avatar String? deckCount Int @default(0) isDeleted Boolean? @default(false) deleteTime Int? created DateTime @default(now()) updated DateTime @updatedAt cards card[] decks deck[] grades grade[] generalChatMessages GeneralChatMessage[] verification verification? revokedToken revokedToken[] RefreshToken refreshToken[] resetPassword resetPassword? favoriteDecks favoriteDeck[] attempts cardAttempt[] @@index([email]) @@index([id]) } model revokedToken { id String @id @default(cuid()) userId String token String @unique @db.VarChar(500) revokedAt DateTime @default(now()) user user @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([userId]) } model refreshToken { id String @id @default(cuid()) userId String token String @unique @db.VarChar(255) expiresAt DateTime isRevoked Boolean @default(false) user user @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([userId]) } model resetPassword { id String @id @default(cuid()) userId String @unique resetPasswordToken String? @unique @default(uuid()) resetPasswordTokenExpiry DateTime? resetPasswordEmailsSent Int @default(0) user user @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([userId]) } model card { id String @id @default(cuid()) deckId String userId String question String @db.Text answer String @db.Text shots Int @default(0) questionImg String? @db.VarChar(500) answerImg String? @db.VarChar(500) answerVideo String? @db.VarChar(500) questionVideo String? @db.VarChar(500) comments String? type String? moreId String? created DateTime @default(now()) updated DateTime @updatedAt author user @relation(fields: [userId], references: [id], onDelete: Cascade) decks deck @relation(fields: [deckId], references: [id], onDelete: Cascade) grades grade[] attempts cardAttempt[] @@index([userId]) @@index([deckId]) } model deck { id String @id @default(cuid()) userId String name String isPrivate Boolean @default(false) cover String? @db.VarChar(500) created DateTime @default(now()) updated DateTime @updatedAt author user @relation(fields: [userId], references: [id], onDelete: Cascade) card card[] grades grade[] favoritedBy favoriteDeck[] @@index([userId]) } model grade { id String @id @default(cuid()) deckId String cardId String userId String grade Int shots Int created DateTime @default(now()) updated DateTime @updatedAt user user @relation(fields: [userId], references: [id], onDelete: Cascade) card card @relation(fields: [cardId], references: [id], onDelete: Cascade) deck deck @relation(fields: [deckId], references: [id], onDelete: Cascade) @@unique([cardId, userId]) @@index([userId]) @@index([deckId]) @@index([cardId]) } model GeneralChatMessage { id String @id @default(cuid()) userId String userName String isAdmin Boolean avatar String? message String created DateTime @default(now()) updated DateTime @updatedAt user user @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([userId]) } model fileEntity { id Int @id @default(autoincrement()) fileName String @db.VarChar(500) fileUrl String @db.VarChar(500) key String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } model favoriteDeck { id String @id @default(cuid()) userId String deckId String user user @relation(fields: [userId], references: [id], onDelete: Cascade) deck deck @relation(fields: [deckId], references: [id], onDelete: Cascade) @@unique([userId, deckId]) @@index([userId]) @@index([deckId]) } model cardAttempt { id String @id @default(cuid()) userId String cardId String attemptCount Int @default(1) lastAttempt DateTime @default(now()) user user @relation(fields: [userId], references: [id], onDelete: Cascade) card card @relation(fields: [cardId], references: [id], onDelete: Cascade) @@unique([userId, cardId]) @@index([userId]) @@index([cardId]) }