// 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-js" output = "../src/generated/prisma" } datasource db { provider = "mysql" url = env("DATABASE_URL") } model Admin { id Int @id @default(autoincrement()) nama_depan String @db.VarChar(255) nama_belakang String @db.VarChar(255) role Role @default(admin) email String @unique @db.VarChar(255) password String @db.Text signature String? @db.Text // singature untuk identifikasi auth jwt (best practice) profile_picture String? @db.Text professional_bio String? @db.Text projects Project[] notifications Notification[] @@map("admin") } model HasilResearch { id Int @id @default(autoincrement()) image_path String @db.Text nama_project String @db.VarChar(255) deskripsi String @db.VarChar(255) link_project String @db.Text created_at DateTime @default(now()) @@map("hasil_research") } model LamaranMagang { id Int @id @default(autoincrement()) id_mahasiswa Int id_lowongan_magang String @db.VarChar(255) status StatusLamaran batch Int? created_at DateTime @default(now()) update_at DateTime user User? batch_data Batch? @relation(fields: [batch], references: [id], map: "lamaran_magang_batch_foreign") mahasiswa Mahasiswa @relation(fields: [id_mahasiswa], references: [id], map: "lamaran_magang_id_mahasiswa_foreign") lowongan_magang LowonganMagang @relation(fields: [id_lowongan_magang], references: [id], map: "lamaran_magang_id_lowongan_magang_foreign") @@index([id_mahasiswa], map: "lamaran_magang_id_mahasiswa_foreign") @@index([id_lowongan_magang], map: "lamaran_magang_id_lowongan_magang_foreign") @@index([batch]) @@map("lamaran_magang") } model LowonganMagang { id String @id @db.VarChar(255) posisi String @db.VarChar(255) kelompok_peminatan String @db.VarChar(255) image_path String @db.Text jobdesk String @db.Text lokasi String @db.VarChar(255) kualifikasi String @db.Text benefit String @db.Text durasi_awal DateTime @db.Date durasi_akhir DateTime @db.Date id_batch Int batch Batch @relation(fields: [id_batch], references: [id], map: "lowongan_magang_id_batch_foreign") status_lowongan StatusLowongan paid PaidStatus created_at DateTime @default(now()) lamaran_magang LamaranMagang[] @@index([id_batch], map: "lowongan_magang_id_batch_foreign") @@map("lowongan_magang") } model Mahasiswa { id Int @id @default(autoincrement()) nama_depan String @db.VarChar(255) nama_belakang String? @db.VarChar(255) email String @unique @db.VarChar(255) kontak String @db.VarChar(255) jurusan String @db.VarChar(255) universitas String @db.VarChar(255) negara String @db.VarChar(255) role StudentRole @default(student) cv_path String @db.Text portofolio_path String @db.Text motivasi String @db.Text relevant_skills String @db.VarChar(255) user User? lamaran_magang LamaranMagang[] @@map("mahasiswa") } model Partnership { id Int @id @default(autoincrement()) nama_partner String @db.VarChar(255) image_path String @db.Text created_at DateTime @default(now()) @@map("partnership") } model Faq { id Int @id @default(autoincrement()) pertanyaan String @db.Text jawaban String @db.Text created_at DateTime @default(now()) @@map("faq") } model RiwayatPelamar { id Int @id @default(autoincrement()) batch Int negara String? @db.VarChar(255) posisi String? @db.VarChar(255) tahun Int jumlah Int pelamar_diterima Int pelamar_ditolak Int pelamar_diproses Int presentase_diterima Float presentase_ditolak Float presentase_diproses Float created_at DateTime @default(now()) @@unique([batch, negara, posisi]) @@index([batch]) @@index([negara]) @@index([posisi]) @@map("riwayat_pelamar") } model Feedback { id Int @id @default(autoincrement()) nama String @db.VarChar(255) universitas String @db.VarChar(255) pesan String @db.Text batch Int posisi String @db.VarChar(255) tahun Int image_path String @db.Text created_at DateTime @default(now()) @@map("feedback") } model Batch { id Int @id @default(autoincrement()) batch_number Int @unique is_active Boolean @default(false) created_at DateTime @default(now()) updated_at DateTime @updatedAt lowongan_magang LowonganMagang[] lamaranMagangs LamaranMagang[] @@index([is_active]) @@index([batch_number]) @@map("batch") } model User { id Int @id @default(autoincrement()) id_mahasiswa Int @unique id_lamaran_magang Int @unique full_name String @db.VarChar(255) email String @unique @db.VarChar(255) password String @db.Text role Role @default(intern) professional_bio String? @db.Text is_active Boolean @default(true) created_at DateTime @default(now()) updated_at DateTime @updatedAt mahasiswa Mahasiswa @relation(fields: [id_mahasiswa], references: [id], map: "user_id_mahasiswa_foreign") lamaran_magang LamaranMagang @relation(fields: [id_lamaran_magang], references: [id], map: "user_id_lamaran_magang_foreign") project_members ProjectMember[] task_submissions TaskSubmission[] certificates Certificate[] notifications Notification[] @@index([email]) @@map("user") } model Project { id Int @id @default(autoincrement()) id_admin Int //mentor project slug String @unique @db.VarChar(255) project_icon ProjectIcon @default(code) background_color String @default("#BA1A1A") @db.VarChar(20) project_name String @db.VarChar(255) description String @db.Text start_date DateTime @db.Date end_date DateTime @db.Date status ProjectStatus @default(active) certificate_template String? @db.Text created_at DateTime @default(now()) updated_at DateTime @updatedAt admin Admin @relation(fields: [id_admin], references: [id], map: "project_id_admin_foreign") members ProjectMember[] tasks Task[] certificates Certificate[] @@index([id_admin], map: "project_id_admin_foreign") @@index([status]) @@map("project") } model ProjectMember { id Int @id @default(autoincrement()) id_project Int id_user Int status ProjectMemberStatus @default(active) created_at DateTime @default(now()) updated_at DateTime @updatedAt project Project @relation(fields: [id_project], references: [id], map: "project_member_id_project_foreign") user User @relation(fields: [id_user], references: [id], map: "project_member_id_user_foreign") @@unique([id_project, id_user]) @@index([id_project], map: "project_member_id_project_foreign") @@index([id_user], map: "project_member_id_user_foreign") @@index([status]) @@map("project_member") } model Task { id Int @id @default(autoincrement()) id_project Int slug String @db.VarChar(255) title String @db.VarChar(255) description String @db.Text deadline_at DateTime submission_type SubmissionType created_at DateTime @default(now()) updated_at DateTime @updatedAt project Project @relation(fields: [id_project], references: [id], map: "task_id_project_foreign") submissions TaskSubmission[] @@unique([id_project, slug]) @@index([id_project], map: "task_id_project_foreign") @@index([deadline_at]) @@index([slug]) @@map("task") } model TaskSubmission { id Int @id @default(autoincrement()) id_task Int id_user Int file_path String? @db.Text url_link String? @db.Text submitted_at DateTime @default(now()) updated_at DateTime @updatedAt task Task @relation(fields: [id_task], references: [id], map: "task_submission_id_task_foreign") user User @relation(fields: [id_user], references: [id], map: "task_submission_id_user_foreign") @@unique([id_task, id_user]) @@index([id_task], map: "task_submission_id_task_foreign") @@index([id_user], map: "task_submission_id_user_foreign") @@map("task_submission") } enum Role { admin mentor intern } enum StudentRole { student } enum StatusLamaran { diterima diproses ditolak } enum StatusLowongan { dibuka ditutup } enum PaidStatus { paid unpaid } enum ProjectIcon { code chart cloud mobile gear users clipboard speedometer lightbulb shield } enum ProjectStatus { active completed archived } enum ProjectMemberStatus { active removed } enum SubmissionType { file_upload url_link } model Certificate { id Int @id @default(autoincrement()) uuid String @unique @default(uuid()) @db.VarChar(36) id_project Int id_user Int certificate_no String @unique @db.VarChar(255) issued_at DateTime @default(now()) project Project @relation(fields: [id_project], references: [id], map: "certificate_id_project_foreign") user User @relation(fields: [id_user], references: [id], map: "certificate_id_user_foreign") @@unique([id_project, id_user]) @@index([id_project], map: "certificate_id_project_foreign") @@index([id_user], map: "certificate_id_user_foreign") @@map("certificate") } model Notification { id Int @id @default(autoincrement()) id_user Int? // For interns id_admin Int? // For mentors/admins title String @db.VarChar(255) message String @db.Text is_read Boolean @default(false) created_at DateTime @default(now()) user User? @relation(fields: [id_user], references: [id], onDelete: Cascade) admin Admin? @relation(fields: [id_admin], references: [id], onDelete: Cascade) @@index([id_user]) @@index([id_admin]) @@map("notification") }