datasource db { provider = "mysql" url = env("DATABASE_URL") 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) 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? AccessToken AccessToken[] RefreshToken RefreshToken[] @@fulltext([name, email]) } model AccessToken { id String @id @default(cuid()) userId String token String @unique expiresAt DateTime isRevoked Boolean @default(false) user User @relation(fields: [userId], references: [id]) @@index([userId]) } model RefreshToken { id String @id @default(cuid()) userId String token String @unique expiresAt DateTime isRevoked Boolean @default(false) user User @relation(fields: [userId], references: [id]) @@index([userId]) } model Card { id String @id @default(cuid()) deckId String userId String question String answer String grade Int shots Int questionImg String? answerImg String? answerVideo String? questionVideo String? comments String? type String? rating Int moreId String? created DateTime @default(now()) updated DateTime @updatedAt user User @relation(fields: [userId], references: [id]) decks Deck @relation(fields: [deckId], references: [id]) grades Grade[] // One-to-many relation @@index([userId]) @@index([deckId]) } model Deck { id String @id @default(cuid()) userId String userName String name String private Boolean path String grade Int shots Int cardsCount Int deckCover String? type String rating Int moreId String? isDeleted Boolean? isBlocked Boolean? created DateTime @default(now()) updated DateTime @updatedAt user User @relation(fields: [userId], references: [id]) Card Card[] // One-to-many relation Grade Grade[] @@index([userId]) } model Grade { id String @id @default(cuid()) deckId String cardId String userId String grade Int shots Int moreId String? created DateTime @default(now()) updated DateTime @updatedAt user User @relation(fields: [userId], references: [id]) card Card @relation(fields: [cardId], references: [id]) decks Deck @relation(fields: [deckId], references: [id]) @@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]) @@index([userId]) }