// 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? }