Files
flashcards-api/prisma/schema.prisma

165 lines
4.8 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 @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[]
@@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? @db.VarChar(500)
isDeleted Boolean?
isBlocked Boolean?
created DateTime @default(now())
updated DateTime @updatedAt
cardsCount Int @default(0)
author user @relation(fields: [userId], references: [id], onDelete: Cascade)
card card[]
grades grade[]
@@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
}