feat: menambah dan memperbarui skema database untuk project, project member, dan task lms internify

This commit is contained in:
Muhammad Zhafran Ilham
2026-06-08 04:38:51 +07:00
parent fe74b2213d
commit 9bdb781f34
2 changed files with 251 additions and 0 deletions
@@ -0,0 +1,116 @@
-- AlterTable
ALTER TABLE `admin` ADD COLUMN `professional_bio` TEXT NULL,
ADD COLUMN `profile_picture` TEXT NULL,
MODIFY `role` ENUM('admin', 'intern') NOT NULL DEFAULT 'admin';
-- CreateTable
CREATE TABLE `user` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`id_mahasiswa` INTEGER NOT NULL,
`id_lamaran_magang` INTEGER NOT NULL,
`full_name` VARCHAR(255) NOT NULL,
`email` VARCHAR(255) NOT NULL,
`password` TEXT NOT NULL,
`role` ENUM('admin', 'intern') NOT NULL DEFAULT 'intern',
`professional_bio` TEXT NULL,
`is_active` BOOLEAN NOT NULL DEFAULT true,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
UNIQUE INDEX `user_id_mahasiswa_key`(`id_mahasiswa`),
UNIQUE INDEX `user_id_lamaran_magang_key`(`id_lamaran_magang`),
UNIQUE INDEX `user_email_key`(`email`),
INDEX `user_email_idx`(`email`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `project` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`id_admin` INTEGER NOT NULL,
`project_icon` ENUM('code', 'chart', 'cloud', 'mobile', 'gear', 'users', 'clipboard', 'speedometer', 'lightbulb', 'shield') NOT NULL DEFAULT 'code',
`project_name` VARCHAR(255) NOT NULL,
`description` TEXT NOT NULL,
`start_date` DATE NOT NULL,
`end_date` DATE NOT NULL,
`max_members` INTEGER NOT NULL DEFAULT 8,
`status` ENUM('active', 'completed', 'archived') NOT NULL DEFAULT 'active',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
INDEX `project_id_admin_foreign`(`id_admin`),
INDEX `project_status_idx`(`status`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `project_member` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`id_project` INTEGER NOT NULL,
`id_user` INTEGER NOT NULL,
`status` ENUM('active', 'removed') NOT NULL DEFAULT 'active',
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
INDEX `project_member_id_project_foreign`(`id_project`),
INDEX `project_member_id_user_foreign`(`id_user`),
INDEX `project_member_status_idx`(`status`),
UNIQUE INDEX `project_member_id_project_id_user_key`(`id_project`, `id_user`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `task` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`id_project` INTEGER NOT NULL,
`title` VARCHAR(255) NOT NULL,
`description` TEXT NOT NULL,
`deadline_at` DATETIME(3) NOT NULL,
`submission_type` ENUM('file_upload', 'url_link') NOT NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
INDEX `task_id_project_foreign`(`id_project`),
INDEX `task_deadline_at_idx`(`deadline_at`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `task_submission` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`id_task` INTEGER NOT NULL,
`id_user` INTEGER NOT NULL,
`file_path` TEXT NULL,
`url_link` TEXT NULL,
`submitted_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updated_at` DATETIME(3) NOT NULL,
INDEX `task_submission_id_task_foreign`(`id_task`),
INDEX `task_submission_id_user_foreign`(`id_user`),
UNIQUE INDEX `task_submission_id_task_id_user_key`(`id_task`, `id_user`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- AddForeignKey
ALTER TABLE `user` ADD CONSTRAINT `user_id_mahasiswa_foreign` FOREIGN KEY (`id_mahasiswa`) REFERENCES `mahasiswa`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `user` ADD CONSTRAINT `user_id_lamaran_magang_foreign` FOREIGN KEY (`id_lamaran_magang`) REFERENCES `lamaran_magang`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `project` ADD CONSTRAINT `project_id_admin_foreign` FOREIGN KEY (`id_admin`) REFERENCES `admin`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `project_member` ADD CONSTRAINT `project_member_id_project_foreign` FOREIGN KEY (`id_project`) REFERENCES `project`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `project_member` ADD CONSTRAINT `project_member_id_user_foreign` FOREIGN KEY (`id_user`) REFERENCES `user`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `task` ADD CONSTRAINT `task_id_project_foreign` FOREIGN KEY (`id_project`) REFERENCES `project`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `task_submission` ADD CONSTRAINT `task_submission_id_task_foreign` FOREIGN KEY (`id_task`) REFERENCES `task`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `task_submission` ADD CONSTRAINT `task_submission_id_user_foreign` FOREIGN KEY (`id_user`) REFERENCES `user`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
+135
View File
@@ -23,6 +23,11 @@ model Admin {
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[]
@@map("admin")
}
@@ -47,6 +52,7 @@ model LamaranMagang {
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")
@@ -95,6 +101,7 @@ model Mahasiswa {
motivasi String @db.Text
relevant_skills String @db.VarChar(255)
user User?
lamaran_magang LamaranMagang[]
@@map("mahasiswa")
@@ -170,8 +177,107 @@ model Batch {
@@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[]
@@index([email])
@@map("user")
}
model Project {
id Int @id @default(autoincrement())
id_admin Int //mentor project
project_icon ProjectIcon @default(code)
project_name String @db.VarChar(255)
description String @db.Text
start_date DateTime @db.Date
end_date DateTime @db.Date
max_members Int @default(8)
status ProjectStatus @default(active)
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[]
@@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
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[]
@@index([id_project], map: "task_id_project_foreign")
@@index([deadline_at])
@@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
intern
}
enum StudentRole {
@@ -193,3 +299,32 @@ 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
}