generator client { provider = "prisma-client-js" } 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]) }