Files
pichunt/prisma/schema.prisma
T
2025-07-31 21:31:11 +02:00

198 lines
4.8 KiB
Plaintext

generator client {
provider = "prisma-client-js"
output = "../app/generated/prisma"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String
role UserRole
emailConfirmedAt DateTime? @db.Timestamptz(3)
loginLinks UserLoginLinks[]
deactivated Boolean @default(false)
createdAt DateTime @default(now()) @db.Timestamptz(3)
updatedAt DateTime @updatedAt @db.Timestamptz(3)
deletedAt DateTime? @db.Timestamptz(3)
huntsCreated Hunt[]
huntsMember HuntMember[]
teamsOwner HuntTeam[]
teamsMember TeamMember[]
answers QuestAnswer[] @relation("AnswerMember")
reviews QuestAnswer[] @relation("AnswerReview")
}
enum UserRole {
USER
CREATOR
ADMIN
}
model UserLoginLinks {
id Int @id @default(autoincrement())
secret String
used Boolean @default(false)
user User @relation(fields: [userId], references: [id], onUpdate: Cascade, onDelete: Cascade)
userId Int
createdAt DateTime @default(now()) @db.Timestamptz(3)
}
model Hunt {
id Int @id @default(autoincrement())
name String
description String
virtual Boolean @default(false)
start DateTime? @db.Timestamptz(3)
end DateTime? @db.Timestamptz(3)
allowJoin Boolean @default(false)
revealPictures Boolean @default(false)
revealAnswers Boolean @default(false)
creator User @relation(fields: [creatorId], references: [id], onUpdate: Cascade, onDelete: Cascade)
creatorId Int
createdAt DateTime @default(now()) @db.Timestamptz(3)
updatedAt DateTime @updatedAt @db.Timestamptz(3)
deletedAt DateTime? @db.Timestamptz(3)
teams HuntTeam[]
members HuntMember[]
quests HuntQuest[]
@@index([creatorId])
}
model HuntMember {
hunt Hunt @relation(fields: [huntId], references: [id], onUpdate: Cascade, onDelete: Cascade)
huntId Int
member User @relation(fields: [memberId], references: [id], onUpdate: Cascade, onDelete: Cascade)
memberId Int
createdAt DateTime @default(now()) @db.Timestamptz(3)
@@unique([memberId, huntId])
@@index([memberId, huntId])
@@index([memberId])
@@index([huntId])
}
model HuntTeam {
id Int @id @default(autoincrement())
name String
description String @default("")
password String @default("")
hunt Hunt @relation(fields: [huntId], references: [id], onUpdate: Cascade, onDelete: Cascade)
huntId Int
owner User @relation(fields: [ownerId], references: [id], onUpdate: Cascade, onDelete: Cascade)
ownerId Int
createdAt DateTime @default(now()) @db.Timestamptz(3)
members TeamMember[]
answers QuestAnswer[]
@@index([ownerId])
@@index([huntId])
}
model TeamMember {
team HuntTeam @relation(fields: [teamId], references: [id], onUpdate: Cascade, onDelete: Cascade)
teamId Int
member User @relation(fields: [memberId], references: [id], onUpdate: Cascade, onDelete: Cascade)
memberId Int
createdAt DateTime @default(now()) @db.Timestamptz(3)
@@unique([memberId, teamId])
@@index([teamId])
@@index([memberId])
@@index([memberId, teamId])
}
enum TextType {
TEXT
WORD
NUMBER
INTEGER
}
model HuntQuest {
id Int @id @default(autoincrement())
title String
description String @default("")
question String?
image String?
location String?
locationLink String?
order Int @default(0)
optional Boolean @default(true)
pictureRequired Boolean @default(false)
textRequired Boolean @default(false)
textType TextType @default(TEXT)
textUnit String?
textSolution String?
points Int @default(10) @db.SmallInt
extraPoints Int? @db.SmallInt
extraText String?
hunt Hunt @relation(fields: [huntId], references: [id], onUpdate: Cascade, onDelete: Cascade)
huntId Int
answers QuestAnswer[]
@@index([huntId])
}
model QuestAnswer {
id Int @id @default(autoincrement())
text String?
picture String?
location String?
lat Decimal? @db.Decimal(10, 8)
lon Decimal? @db.Decimal(10, 8)
team HuntTeam @relation(fields: [teamId], references: [id], onUpdate: Cascade, onDelete: Cascade)
teamId Int
member User @relation("AnswerMember", fields: [memberId], references: [id], onUpdate: Cascade, onDelete: Cascade)
memberId Int
quest HuntQuest @relation(fields: [questId], references: [id], onUpdate: Cascade, onDelete: Cascade)
questId Int
createdAt DateTime @default(now()) @db.Timestamptz(3)
updatedAt DateTime @updatedAt @db.Timestamptz(3)
reviewer User? @relation("AnswerReview", fields: [reviewerId], references: [id], onUpdate: Cascade, onDelete: Cascade)
reviewerId Int?
score Int? @db.SmallInt
review String?
@@index([teamId])
@@index([memberId])
@@index([questId])
}