Files
internify-be/prisma/schema.prisma
T
2026-06-25 21:11:13 +07:00

375 lines
11 KiB
Plaintext
Executable File

// 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")
}