feat: scaffold holiday booking project
This commit is contained in:
227
prisma/schema.prisma
Normal file
227
prisma/schema.prisma
Normal file
@@ -0,0 +1,227 @@
|
||||
generator client {
|
||||
provider = "prisma-client-js"
|
||||
}
|
||||
|
||||
datasource db {
|
||||
provider = "postgresql"
|
||||
url = env("DATABASE_URL")
|
||||
}
|
||||
|
||||
enum BookingStatus {
|
||||
PENDING_PAYMENT
|
||||
PAYMENT_RECEIVED
|
||||
CONFIRMED
|
||||
CANCELLED
|
||||
FAILED
|
||||
}
|
||||
|
||||
enum PaymentStatus {
|
||||
REQUIRES_PAYMENT
|
||||
COMPLETED
|
||||
FAILED
|
||||
REFUNDED
|
||||
}
|
||||
|
||||
enum AvailabilityBlockReason {
|
||||
MAINTENANCE
|
||||
OWNER_BLOCKED
|
||||
BASE_RULE
|
||||
OTHER
|
||||
}
|
||||
|
||||
enum ContentPageStatus {
|
||||
DRAFT
|
||||
PUBLISHED
|
||||
ARCHIVED
|
||||
}
|
||||
|
||||
model SiteSettings {
|
||||
id String @id @default(cuid())
|
||||
businessName String
|
||||
tagline String?
|
||||
contactEmail String?
|
||||
contactPhone String?
|
||||
defaultSeoTitle String?
|
||||
defaultSeoDescription String?
|
||||
bookingHoldMinutes Int @default(30)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
}
|
||||
|
||||
model Property {
|
||||
id String @id @default(cuid())
|
||||
slug String @unique
|
||||
title String
|
||||
summary String
|
||||
longDescription String
|
||||
locationText String
|
||||
sleeps Int
|
||||
bedrooms Int
|
||||
bathrooms Int
|
||||
petsAllowed Boolean @default(false)
|
||||
published Boolean @default(false)
|
||||
featured Boolean @default(false)
|
||||
minStayNights Int?
|
||||
checkInTime String?
|
||||
checkOutTime String?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
images PropertyImage[]
|
||||
amenities PropertyAmenity[]
|
||||
pricingRules PricingRule[]
|
||||
availability AvailabilityBlock[]
|
||||
bookings Booking[]
|
||||
enquiries Enquiry[]
|
||||
testimonials Testimonial[]
|
||||
}
|
||||
|
||||
model PropertyImage {
|
||||
id String @id @default(cuid())
|
||||
propertyId String
|
||||
url String
|
||||
altText String
|
||||
displayOrder Int @default(0)
|
||||
primaryImage Boolean @default(false)
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
property Property @relation(fields: [propertyId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@index([propertyId, displayOrder])
|
||||
}
|
||||
|
||||
model Amenity {
|
||||
id String @id @default(cuid())
|
||||
slug String @unique
|
||||
name String
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
properties PropertyAmenity[]
|
||||
}
|
||||
|
||||
model PropertyAmenity {
|
||||
propertyId String
|
||||
amenityId String
|
||||
|
||||
property Property @relation(fields: [propertyId], references: [id], onDelete: Cascade)
|
||||
amenity Amenity @relation(fields: [amenityId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@id([propertyId, amenityId])
|
||||
@@index([amenityId])
|
||||
}
|
||||
|
||||
model PricingRule {
|
||||
id String @id @default(cuid())
|
||||
propertyId String
|
||||
label String?
|
||||
basePriceCents Int
|
||||
weekendPriceCents Int?
|
||||
guestDeltaCents Int?
|
||||
validFrom DateTime?
|
||||
validTo DateTime?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
property Property @relation(fields: [propertyId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@index([propertyId, validFrom, validTo])
|
||||
}
|
||||
|
||||
model AvailabilityBlock {
|
||||
id String @id @default(cuid())
|
||||
propertyId String
|
||||
startDate DateTime
|
||||
endDate DateTime
|
||||
reason AvailabilityBlockReason @default(OTHER)
|
||||
notes String?
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
property Property @relation(fields: [propertyId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@index([propertyId, startDate, endDate])
|
||||
}
|
||||
|
||||
model Booking {
|
||||
id String @id @default(cuid())
|
||||
propertyId String
|
||||
firstName String
|
||||
lastName String
|
||||
email String
|
||||
phone String?
|
||||
arrivalDate DateTime
|
||||
departureDate DateTime
|
||||
adults Int
|
||||
children Int @default(0)
|
||||
pets Int @default(0)
|
||||
specialRequests String?
|
||||
termsAccepted Boolean @default(false)
|
||||
holdExpiresAt DateTime?
|
||||
totalCents Int
|
||||
currency String @default("GBP")
|
||||
status BookingStatus @default(PENDING_PAYMENT)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
property Property @relation(fields: [propertyId], references: [id], onDelete: Restrict)
|
||||
payment Payment?
|
||||
|
||||
@@index([propertyId, arrivalDate, departureDate])
|
||||
@@index([status])
|
||||
}
|
||||
|
||||
model Payment {
|
||||
id String @id @default(cuid())
|
||||
bookingId String @unique
|
||||
stripeCheckoutSessionId String? @unique
|
||||
stripePaymentIntentId String? @unique
|
||||
stripeEventId String? @unique
|
||||
amountCents Int
|
||||
currency String @default("GBP")
|
||||
status PaymentStatus @default(REQUIRES_PAYMENT)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
booking Booking @relation(fields: [bookingId], references: [id], onDelete: Cascade)
|
||||
}
|
||||
|
||||
model Enquiry {
|
||||
id String @id @default(cuid())
|
||||
propertyId String?
|
||||
name String
|
||||
email String
|
||||
phone String?
|
||||
message String
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
property Property? @relation(fields: [propertyId], references: [id], onDelete: SetNull)
|
||||
|
||||
@@index([propertyId, createdAt])
|
||||
}
|
||||
|
||||
model Testimonial {
|
||||
id String @id @default(cuid())
|
||||
propertyId String?
|
||||
authorName String
|
||||
content String
|
||||
rating Int?
|
||||
published Boolean @default(false)
|
||||
displayOrder Int @default(0)
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
property Property? @relation(fields: [propertyId], references: [id], onDelete: SetNull)
|
||||
|
||||
@@index([published, displayOrder])
|
||||
}
|
||||
|
||||
model ContentPage {
|
||||
id String @id @default(cuid())
|
||||
slug String @unique
|
||||
title String
|
||||
body String
|
||||
status ContentPageStatus @default(DRAFT)
|
||||
seoTitle String?
|
||||
seoDescription String?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user