Dental Care
This commit is contained in:
228
prisma/schema.prisma
Normal file
228
prisma/schema.prisma
Normal file
@@ -0,0 +1,228 @@
|
||||
|
||||
datasource db {
|
||||
provider = "mongodb"
|
||||
url = env("DATABASE_URL")
|
||||
}
|
||||
|
||||
generator client {
|
||||
provider = "prisma-client-js"
|
||||
}
|
||||
|
||||
enum role {
|
||||
patient
|
||||
dentist
|
||||
admin
|
||||
}
|
||||
|
||||
enum AppointmentStatus {
|
||||
pending
|
||||
confirmed
|
||||
cancelled
|
||||
completed
|
||||
rescheduled
|
||||
}
|
||||
|
||||
enum PaymentStatus {
|
||||
pending
|
||||
paid
|
||||
failed
|
||||
refunded
|
||||
}
|
||||
|
||||
enum PaymentMethod {
|
||||
card
|
||||
e_wallet
|
||||
bank_transfer
|
||||
cash
|
||||
}
|
||||
|
||||
model User {
|
||||
id String @id @map("_id")
|
||||
name String
|
||||
email String
|
||||
emailVerified Boolean @default(false)
|
||||
image String?
|
||||
role role @default(patient)
|
||||
phone String?
|
||||
address String?
|
||||
dateOfBirth DateTime?
|
||||
medicalHistory String?
|
||||
stripeCustomerId String? // Stripe customer ID
|
||||
// Dentist-specific fields
|
||||
specialization String?
|
||||
qualifications String?
|
||||
experience Int? // Years of experience
|
||||
workingHours Json? // {monday: {start: "9:00", end: "17:00"}, ...}
|
||||
isAvailable Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @default(now()) @updatedAt
|
||||
sessions Session[]
|
||||
accounts Account[]
|
||||
// Relations
|
||||
appointmentsAsPatient Appointment[] @relation("PatientAppointments")
|
||||
appointmentsAsDentist Appointment[] @relation("DentistAppointments")
|
||||
payments Payment[]
|
||||
notifications Notification[]
|
||||
chatMessages ChatMessage[]
|
||||
|
||||
@@unique([email])
|
||||
@@map("user")
|
||||
}
|
||||
|
||||
model Service {
|
||||
id String @id @map("_id") // Use custom ID from seed data
|
||||
name String
|
||||
description String?
|
||||
duration Int // in minutes
|
||||
price String // Price range or single price (e.g., "₱500 – ₱1,500" or "₱1,500")
|
||||
category String
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
appointments Appointment[]
|
||||
|
||||
@@map("service")
|
||||
}
|
||||
|
||||
model Appointment {
|
||||
id String @id @default(auto()) @map("_id") @db.ObjectId
|
||||
patientId String
|
||||
dentistId String
|
||||
serviceId String // Changed to String to match Service.id
|
||||
date DateTime
|
||||
timeSlot String // e.g., "09:00-10:00"
|
||||
status AppointmentStatus @default(pending)
|
||||
notes String?
|
||||
cancelReason String?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
// Relations
|
||||
patient User @relation("PatientAppointments", fields: [patientId], references: [id], onDelete: Cascade)
|
||||
dentist User @relation("DentistAppointments", fields: [dentistId], references: [id], onDelete: Cascade)
|
||||
service Service @relation(fields: [serviceId], references: [id], onDelete: Cascade)
|
||||
payment Payment?
|
||||
|
||||
@@map("appointment")
|
||||
}
|
||||
|
||||
model Payment {
|
||||
id String @id @default(auto()) @map("_id") @db.ObjectId
|
||||
appointmentId String @unique @db.ObjectId
|
||||
userId String
|
||||
amount Float
|
||||
method PaymentMethod
|
||||
status PaymentStatus @default(pending)
|
||||
transactionId String?
|
||||
paidAt DateTime?
|
||||
stripeCustomerId String?
|
||||
stripeServicesId String?
|
||||
stripePaymentIntentId String?
|
||||
stripePriceId String?
|
||||
stripeSubscriptionId String?
|
||||
stripeInvoiceId String?
|
||||
stripeRefundId String?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
// Relations
|
||||
appointment Appointment @relation(fields: [appointmentId], references: [id], onDelete: Cascade)
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@map("payment")
|
||||
}
|
||||
|
||||
model Notification {
|
||||
id String @id @default(auto()) @map("_id") @db.ObjectId
|
||||
userId String
|
||||
title String
|
||||
message String
|
||||
type String // email, sms, push
|
||||
isRead Boolean @default(false)
|
||||
sentAt DateTime @default(now())
|
||||
createdAt DateTime @default(now())
|
||||
// Relations
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@map("notification")
|
||||
}
|
||||
|
||||
model ChatMessage {
|
||||
id String @id @default(auto()) @map("_id") @db.ObjectId
|
||||
userId String
|
||||
message String
|
||||
isFromUser Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
// Relations
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@map("chat_message")
|
||||
}
|
||||
|
||||
model Session {
|
||||
id String @id @map("_id")
|
||||
expiresAt DateTime
|
||||
token String
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
ipAddress String?
|
||||
userAgent String?
|
||||
userId String
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
|
||||
activeOrganizationId String?
|
||||
|
||||
impersonatedBy String?
|
||||
|
||||
@@unique([token])
|
||||
@@map("session")
|
||||
}
|
||||
|
||||
model Account {
|
||||
id String @id @map("_id")
|
||||
accountId String
|
||||
providerId String
|
||||
userId String
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
accessToken String?
|
||||
refreshToken String?
|
||||
idToken String?
|
||||
accessTokenExpiresAt DateTime?
|
||||
refreshTokenExpiresAt DateTime?
|
||||
scope String?
|
||||
password String?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@map("account")
|
||||
}
|
||||
|
||||
model Verification {
|
||||
id String @id @map("_id")
|
||||
identifier String
|
||||
value String
|
||||
expiresAt DateTime
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @default(now()) @updatedAt
|
||||
|
||||
@@map("verification")
|
||||
}
|
||||
|
||||
model Subscription {
|
||||
id String @id @default(auto()) @map("_id") @db.ObjectId
|
||||
plan String
|
||||
referenceId String @unique
|
||||
stripeCustomerId String?
|
||||
stripeSubscriptionId String?
|
||||
status String @default("incomplete")
|
||||
periodStart DateTime?
|
||||
periodEnd DateTime?
|
||||
cancelAtPeriodEnd Boolean @default(false)
|
||||
seats Int?
|
||||
trialStart DateTime?
|
||||
trialEnd DateTime?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
|
||||
@@map("subscription")
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user