Files
flashcards-api/prisma/schema.prisma
2023-06-18 12:16:03 +02:00

158 lines
4.5 KiB
Plaintext

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)
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?
@@fulltext([name, email])
}
model RevokedToken {
id String @id @default(cuid())
userId String
token String @unique
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
grade Int @default(0)
shots Int @default(0)
questionImg String?
answerImg String?
answerVideo String?
questionVideo String?
comments String?
type String?
rating Int @default(0)
moreId String?
created DateTime @default(now())
updated DateTime @updatedAt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
decks Deck @relation(fields: [deckId], references: [id], onDelete: Cascade)
grades Grade[]
@@index([userId])
@@index([deckId])
}
model Deck {
id String @id @default(cuid())
userId String
name String
isPrivate Boolean @default(false)
shots Int @default(0)
cover String?
rating Int @default(0)
isDeleted Boolean?
isBlocked Boolean?
created DateTime @default(now())
updated DateTime @updatedAt
user User @relation(fields: [userId], references: [id])
Card Card[]
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])
}