feat(task): submission dengan multiple files sebanyak 20 files

This commit is contained in:
Muhammad Zhafran Ilham
2026-07-04 17:03:15 +07:00
parent 177051ea89
commit ba352f4950
11 changed files with 419 additions and 46 deletions
@@ -0,0 +1,16 @@
-- CreateTable
CREATE TABLE `task_submission_file` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`id_submission` INTEGER NOT NULL,
`file_path` TEXT NOT NULL,
`original_name` VARCHAR(255) NULL,
`mime_type` VARCHAR(255) NULL,
`size_bytes` INTEGER NULL,
`created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `task_submission_file_id_submission_foreign`(`id_submission`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- AddForeignKey
ALTER TABLE `task_submission_file` ADD CONSTRAINT `task_submission_file_id_submission_foreign` FOREIGN KEY (`id_submission`) REFERENCES `task_submission`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
+18 -2
View File
@@ -277,8 +277,9 @@ model TaskSubmission {
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")
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")
files TaskSubmissionFile[]
@@unique([id_task, id_user])
@@index([id_task], map: "task_submission_id_task_foreign")
@@ -286,6 +287,21 @@ model TaskSubmission {
@@map("task_submission")
}
model TaskSubmissionFile {
id Int @id @default(autoincrement())
id_submission Int
file_path String @db.Text
original_name String? @db.VarChar(255)
mime_type String? @db.VarChar(255)
size_bytes Int?
created_at DateTime @default(now())
submission TaskSubmission @relation(fields: [id_submission], references: [id], onDelete: Cascade, map: "task_submission_file_id_submission_foreign")
@@index([id_submission], map: "task_submission_file_id_submission_foreign")
@@map("task_submission_file")
}
enum Role {
admin
mentor
+49 -6
View File
@@ -5,6 +5,7 @@ const { getProjectBackgroundColor } = require('../src/helpers/utils/projectTheme
// Diperlukan ketika isi databasenya masih kosong dan ingin menambahkan dummy data sebagai testing development [Rafi 08/06/2026 16:34]
async function main() {
await prisma.taskSubmissionFile.deleteMany({});
await prisma.taskSubmission.deleteMany({});
await prisma.projectMember.deleteMany({});
await prisma.user.deleteMany({});
@@ -288,12 +289,54 @@ async function main() {
});
// 15. TaskSubmission
await prisma.taskSubmission.createMany({
data: [
{ id_task: task1.id, id_user: user1.id, url_link: 'https://github.com/rafiathallah3' },
{ id_task: task2.id, id_user: user2.id, file_path: 'https://example.com/submission-alice.zip' },
{ id_task: task3.id, id_user: user3.id, url_link: 'https://github.com/bob/auth-gateway' }
]
await prisma.taskSubmission.create({
data: {
id_task: task1.id,
id_user: user1.id,
url_link: 'https://github.com/rafiathallah3',
},
});
await prisma.taskSubmission.create({
data: {
id_task: task2.id,
id_user: user2.id,
// Backward compatibility untuk frontend lama
file_path: '/uploads/task-submissions/alice-api-specification-part-1.pdf',
// Multi-file submission data
files: {
create: [
{
file_path: '/uploads/task-submissions/alice-api-specification-part-1.pdf',
original_name: 'alice-api-specification-part-1.pdf',
mime_type: 'application/pdf',
size_bytes: 204800,
},
{
file_path: '/uploads/task-submissions/alice-api-specification-part-2.pdf',
original_name: 'alice-api-specification-part-2.pdf',
mime_type: 'application/pdf',
size_bytes: 256000,
},
{
file_path: '/uploads/task-submissions/alice-api-specification-appendix.pdf',
original_name: 'alice-api-specification-appendix.pdf',
mime_type: 'application/pdf',
size_bytes: 128000,
},
],
},
},
});
await prisma.taskSubmission.create({
data: {
id_task: task3.id,
id_user: user3.id,
url_link: 'https://github.com/bob/auth-gateway',
},
});
}