Files
planner/prisma/schema.prisma

308 lines
7.9 KiB
Plaintext

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
generator client {
provider = "prisma-client"
output = "../src/lib/generated/prisma"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
enum Role {
COUPLE
PLANNER
}
enum RsvpStatus {
PENDING
ACCEPTED
DECLINED
}
enum VendorStatus {
RESEARCHING
CONTACTING
RESPONDED
PROPOSAL_RECEIVED
NEGOTIATING
CONTRACT_SENT
CONTRACT_SIGNED
DECLINED
BACKUP
}
enum FileKind {
CONTRACT
PROPOSAL
OTHER
}
model User {
id String @id @default(cuid())
email String @unique
name String
username String @unique
password String? // hashed pw, optional for OIDC
authProvider String?
providerId String?
isAdmin Boolean @default(false)
createdAt DateTime @default(now())
memberships Membership[]
fileUploads FileUpload[]
allowedOrigins AllowedOrigin[]
@@unique([authProvider, providerId])
}
model Project {
id String @id @default(cuid())
name String @unique
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
archivedAt DateTime?
memberships Membership[]
invites InviteToken[]
events Event[]
households Household[]
}
model Membership {
id String @id @default(cuid())
role Role
createdAt DateTime @default(now())
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
userId String
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
projectId String
event Event? @relation(fields: [eventId], references: [id], onDelete: Cascade)
eventId String?
@@index([userId])
@@index([projectId])
}
model InviteToken {
id String @id @default(cuid())
email String
role Role
token String @unique
expiresAt DateTime
acceptedAt DateTime?
createdAt DateTime @default(now())
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
projectId String
event Event? @relation(fields: [eventId], references: [id], onDelete: Cascade)
eventId String?
@@index([email])
}
model Event {
id String @id @default(cuid())
slug String @unique
name String
date DateTime?
notes String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
projectId String
memberships Membership[]
invites InviteToken[]
todos EventTodo[]
eventGuests EventGuest[]
eventVendors EventVendor[]
registryItems RegistryItem[]
fileUploads FileUpload[]
@@index([projectId])
}
model EventTodo {
id String @id @default(cuid())
name String
complete Boolean @default(false)
dueDate DateTime?
notes String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
event Event @relation(fields: [eventId], references: [id], onDelete: Cascade)
eventId String
@@index([eventId])
}
model Address {
id String @id @default(cuid())
line1 String
line2 String?
city String
state String
postalCode String
country String @default("United States")
household Household?
vendor Vendor?
}
model Household {
id String @id @default(cuid())
name String
token String @unique @default(uuid())
notes String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
project Project @relation(fields: [projectId], references: [id], onDelete: Cascade)
projectId String
address Address @relation(fields: [addressId], references: [id])
addressId String @unique
guests Guest[]
@@index([projectId])
}
model Guest {
id String @id @default(cuid())
firstName String
lastName String?
email String?
phone String?
notes String?
side String?
congratulated Boolean @default(false)
isPlaceHolder Boolean @default(false)
createdAt DateTime @default(now())
household Household @relation(fields: [householdId], references: [id], onDelete: Cascade)
householdId String
eventGuest EventGuest[]
@@index([householdId])
}
model EventGuest {
id String @id @default(cuid())
rsvp RsvpStatus @default(PENDING)
respodedAt DateTime?
createdAt DateTime @default(now())
event Event @relation(fields: [eventId], references: [id], onDelete: Cascade)
eventId String
guest Guest @relation(fields: [guestId], references: [id], onDelete: Cascade)
guestId String
@@unique([eventId, guestId])
@@index([guestId])
}
model VendorCategory {
id String @id @default(cuid())
name String
description String?
color String? @default("#3B82F6")
vendors Vendor[]
}
model Vendor {
id String @id @default(cuid())
slug String @unique
name String
description String?
website String?
contactPerson String?
email String?
phone String?
notes String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
category VendorCategory? @relation(fields: [categoryId], references: [id], onDelete: SetNull)
categoryId String?
address Address? @relation(fields: [addressId], references: [id])
addressId String? @unique
eventVendors EventVendor[]
}
model EventVendor {
id String @id @default(cuid())
status VendorStatus @default(RESEARCHING)
bookedDate DateTime?
quotedPrice Decimal?
finalCost Decimal?
depositPaid Decimal?
depositDueDate DateTime?
finalPaymentDue DateTime?
paymentNotes String?
notes String?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
event Event @relation(fields: [eventId], references: [id], onDelete: Cascade)
eventId String
vendor Vendor @relation(fields: [vendorId], references: [id], onDelete: Restrict)
vendorId String
fileUploads FileUpload[]
@@unique([vendorId, eventId])
@@index([vendorId])
}
model FileUpload {
id String @id @default(cuid())
originalName String
storageKey String @unique
mimeType String
size Int
kind FileKind @default(OTHER)
uploadedAt DateTime @default(now())
uploadedBy User @relation(fields: [uploadedById], references: [id])
uploadedById String
event Event? @relation(fields: [eventId], references: [id], onDelete: Cascade)
eventId String?
eventVendor EventVendor? @relation(fields: [eventVendorId], references: [id], onDelete: Cascade)
eventVendorId String?
}
model RegistryItem {
id String @id @default(cuid())
slug String
name String
url String
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
event Event? @relation(fields: [eventId], references: [id], onDelete: Cascade)
eventId String?
@@unique([eventId, slug])
}
model AllowedOrigin {
id String @id @default(cuid())
origin String @unique
isDefault Boolean @default(false)
createdAt DateTime @default(now())
addedBy User? @relation(fields: [addedById], references: [id], onDelete: SetNull)
addedById String?
}