feat(project): menambahkan perhitungan task_done sebuah project untuk intern & admin

This commit is contained in:
Muhammad Zhafran Ilham
2026-06-26 00:09:15 +07:00
parent 119ab42afb
commit 6a69e5a055
3 changed files with 63 additions and 0 deletions
@@ -100,11 +100,18 @@ class ProjectRepository {
}, },
select: { select: {
id: true, id: true,
id_user: true,
}, },
}, },
tasks: { tasks: {
select: { select: {
id: true, id: true,
submissions: {
select: {
id: true,
id_user: true,
},
},
}, },
}, },
}, },
@@ -239,11 +246,21 @@ class ProjectRepository {
}, },
select: { select: {
id: true, id: true,
id_user: true,
}, },
}, },
tasks: { tasks: {
select: { select: {
id: true, id: true,
submissions: {
where: {
id_user: parseInt(internId),
},
select: {
id: true,
id_user: true,
},
},
}, },
}, },
}, },
@@ -315,11 +332,18 @@ class ProjectRepository {
}, },
select: { select: {
id: true, id: true,
id_user: true,
}, },
}, },
tasks: { tasks: {
select: { select: {
id: true, id: true,
submissions: {
select: {
id: true,
id_user: true,
},
},
}, },
}, },
}, },
@@ -127,6 +127,7 @@ class ProjectService {
admin: this.mapAdmin(project.admin), admin: this.mapAdmin(project.admin),
total_members: project.members?.length || 0, total_members: project.members?.length || 0,
total_tasks: project.tasks?.length || 0, total_tasks: project.tasks?.length || 0,
task_done: this.getProjectTaskDone(project, actor),
created_at: project.created_at, created_at: project.created_at,
updated_at: project.updated_at, updated_at: project.updated_at,
})); }));
@@ -387,6 +388,7 @@ class ProjectService {
admin: this.mapAdmin(project.admin), admin: this.mapAdmin(project.admin),
total_members: project.members?.length || 0, total_members: project.members?.length || 0,
total_tasks: project.tasks?.length || 0, total_tasks: project.tasks?.length || 0,
task_done: this.getProjectTaskDone(project, actor),
created_at: project.created_at, created_at: project.created_at,
updated_at: project.updated_at, updated_at: project.updated_at,
})); }));
@@ -470,6 +472,7 @@ class ProjectService {
admin: this.mapAdmin(project.admin), admin: this.mapAdmin(project.admin),
total_members: project.members?.length || 0, total_members: project.members?.length || 0,
total_tasks: project.tasks?.length || 0, total_tasks: project.tasks?.length || 0,
task_done: this.getProjectTaskDone(project, actor),
created_at: project.created_at, created_at: project.created_at,
updated_at: project.updated_at, updated_at: project.updated_at,
})); }));
@@ -581,6 +584,38 @@ class ProjectService {
return slug; return slug;
} }
getProjectTaskDone(project, actor = {}) {
const tasks = project.tasks || [];
if (tasks.length === 0) {
return 0;
}
if (actor.role === "intern") {
return tasks.filter((task) =>
task.submissions?.some(
(submission) => submission.id_user === parseInt(actor.id)
)
).length;
}
const activeMembers = project.members || [];
if (activeMembers.length === 0) {
return 0;
}
return tasks.filter((task) => {
const submittedUserIds = new Set(
(task.submissions || []).map((submission) => submission.id_user)
);
return activeMembers.every((member) =>
submittedUserIds.has(member.id_user)
);
}).length;
}
} }
module.exports = new ProjectService(); module.exports = new ProjectService();
+4
View File
@@ -165,6 +165,10 @@ const router = express.Router();
* total_tasks: * total_tasks:
* type: integer * type: integer
* example: 3 * example: 3
* task_done:
* type: integer
* example: 2
* description: Number of completed tasks. For interns, this counts tasks submitted by the logged-in intern. For admin/mentor, this counts tasks submitted by all active project members.
* created_at: * created_at:
* type: string * type: string
* format: date-time * format: date-time