generator client { provider = "prisma-client-js" } datasource db { provider = "mysql" url = env("DATABASE_URL") } model User { id String @id name String? @unique @db.VarChar(50) email String? @unique emailVerified DateTime? @map("email_verified") password String? phone String? @db.VarChar(13) address String? image String? role Role? createdAt DateTime @default(now()) @map("created_at") updateAt DateTime @updatedAt @map("updated_at") familyName String? givenName String? Account Account[] FasilitatorProfile FasilitatorProfile? KoasProfile KoasProfile? Like Like[] sender Notification[] @relation("Sender") recipient Notification[] @relation("Recipient") PasienProfile PasienProfile? Post Post[] Review Review[] sessions Session[] @@map("users") } model Account { type String? provider String scope String? access_token String? @db.Text expires_at Int? id_token String? @db.Text providerAccountId String @map("provider_account_id") refresh_token String? @db.Text token_type String? userId String @map("user_id") id String @id @default(cuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([provider, providerAccountId]) @@index([userId], map: "accounts_user_id_fkey") @@map("accounts") } model Session { id String @id @default(cuid()) expires DateTime sessionToken String @map("session_token") @db.Text userId String? @map("user_id") accessToken String? @map("access_token") @db.Text createdAt DateTime @default(now()) updatedAt DateTime @updatedAt user User? @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([userId], map: "sessions_user_id_fkey") @@map("sessions") } model Otp { id String @id @default(cuid()) email String otp String @unique expires DateTime createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@unique([email, otp]) @@map("otps") } model KoasProfile { id String @id @default(cuid()) userId String @unique @map("user_id") koasNumber String? @unique @map("koas_number") age String? gender String? departement String? university String? bio String? whatsappLink String? @map("whatsapp_link") status StatusKoas @default(Pending) createdAt DateTime @default(now()) @map("created_at") updateAt DateTime @updatedAt @map("updated_at") universityId String? experience Int? @default(0) Appointment Appointment[] University University? @relation(fields: [universityId], references: [id]) user User @relation(fields: [userId], references: [id], onDelete: Cascade) Notification Notification[] Post Post[] Review Review[] @@index([universityId], map: "koas-profile_universityId_fkey") @@map("koas_profile") } model PasienProfile { id String @id @default(cuid()) userId String @unique @map("user_id") age String? gender String? bio String? createdAt DateTime @default(now()) @map("created_at") updateAt DateTime @updatedAt @map("updated_at") Appointment Appointment[] user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@map("pasien_profile") } model FasilitatorProfile { id String @id @default(cuid()) userId String @unique @map("user_id") university String? user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@map("fasilitator_profile") } model University { id String @id @default(cuid()) name String alias String location String latitude Float? longitude Float? image String? createdAt DateTime @default(now()) @map("created_at") updateAt DateTime @updatedAt @map("updated_at") koasProfile KoasProfile[] @@map("universities") } model Post { id String @id @default(cuid()) userId String @map("user_id") koasId String @map("koas_id") treatmentId String @map("treatment_id") title String desc String @db.VarChar(500) patientRequirement Json? @map("patient_requirement") status StatusPost @default(Pending) published Boolean @default(false) createdAt DateTime @default(now()) @map("created_at") updateAt DateTime @updatedAt @map("updated_at") requiredParticipant Int @default(0) @map("required_participant") images Json? likes Like[] koas KoasProfile @relation(fields: [koasId], references: [id], onDelete: Cascade) treatment TreatmentType @relation(fields: [treatmentId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) Review Review[] Schedule Schedule[] @@index([userId], map: "user_id") @@index([koasId], map: "koas_id") @@index([treatmentId], map: "treatment_id") @@map("posts") } model Like { id String @id @default(cuid()) postId String @map("post_id") userId String @map("user_id") createdAt DateTime @default(now()) @map("created_at") Post Post @relation(fields: [postId], references: [id], onDelete: Cascade) user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@index([postId], map: "post_id") @@index([userId], map: "user_id") @@map("likes") } model Notification { id String @id @default(cuid()) message String createdAt DateTime @default(now()) koasId String? senderId String? status StatusNotification @default(Unread) title String updatedAt DateTime @updatedAt userId String? koasProfile KoasProfile? @relation(fields: [koasId], references: [id], onDelete: Cascade) sender User? @relation("Sender", fields: [senderId], references: [id], onDelete: Cascade) recipient User? @relation("Recipient", fields: [userId], references: [id], onDelete: Cascade) @@index([koasId], map: "notifications_koasId_fkey") @@index([senderId], map: "notifications_senderId_fkey") @@index([userId], map: "notifications_userId_fkey") @@map("notifications") } model TreatmentType { id String @id @default(cuid()) name String createdAt DateTime @default(now()) @map("created_at") updateAt DateTime @updatedAt @map("updated_at") alias String image String? Post Post[] @@map("treatment_types") } model Schedule { id String @id @default(cuid()) postId String @map("post_id") createdAt DateTime @default(now()) @map("created_at") dateEnd DateTime @map("date_end") dateStart DateTime @map("date_start") updateAt DateTime @updatedAt @map("updated_at") Appointment Appointment[] post Post @relation(fields: [postId], references: [id], onDelete: Cascade) timeslot Timeslot[] @@index([postId], map: "post_id") @@map("schedules") } model Timeslot { id String @id @default(cuid()) startTime String @map("start_time") endTime String @map("end_time") maxParticipants Int? @map("max_participants") currentParticipants Int @default(0) @map("current_participants") isAvailable Boolean @default(true) @map("is_available") scheduleId String @map("schedule_id") Appointment Appointment[] schedule Schedule @relation(fields: [scheduleId], references: [id], onDelete: Cascade) @@unique([scheduleId, startTime, endTime], name: "unique_timeslot") @@map("timeslots") } model Review { id String @id @default(cuid()) postId String @map("post_id") pasienId String @map("user_id") rating Decimal @default(0.000000000000000000000000000000) comment String? @db.VarChar(500) createdAt DateTime @default(now()) @map("created_at") koasId String? @map("koas_id") KoasProfile KoasProfile? @relation(fields: [koasId], references: [userId]) post Post @relation(fields: [postId], references: [id], onDelete: Cascade) user User @relation(fields: [pasienId], references: [id], onDelete: Cascade) @@index([postId], map: "post_id") @@index([pasienId], map: "pasien_Id") @@index([koasId], map: "koas_id") @@map("reviews") } model Appointment { id String @id @default(cuid()) pasienId String @map("pasien_id") koasId String @map("koas_id") scheduleId String @map("schedule_id") timeslotId String @map("timeslot_id") date String status StatusAppointment @default(Pending) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt koas KoasProfile @relation(fields: [koasId], references: [id], onDelete: Cascade) pasien PasienProfile @relation(fields: [pasienId], references: [id], onDelete: Cascade) schedule Schedule @relation(fields: [scheduleId], references: [id], onDelete: Cascade) timeslot Timeslot @relation(fields: [timeslotId], references: [id], onDelete: Cascade) @@index([koasId], map: "appointment_koas_id_fkey") @@index([pasienId], map: "appointment_pasien_id_fkey") @@index([scheduleId], map: "appointment_schedule_id_fkey") @@index([timeslotId], map: "appointment_timeslot_id_fkey") @@map("appointments") } model verificationrequest { id String @id token String @unique(map: "VerificationRequest_token_key") expires DateTime createdAt DateTime @default(now()) updatedAt DateTime email String @@unique([email, token], map: "VerificationRequest_email_token_key") } enum Role { Admin Koas Pasien Fasilitator @@map("roles") } enum StatusPost { Pending Open Closed @@map("status_post") } enum StatusKoas { Rejected Pending Approved @@map("status_koas") } enum StatusAppointment { Canceled Rejected Pending Confirmed Ongoing Completed @@map("status_appointment") } enum StatusNotification { Unread Read }