refactor: nambahin role mentor di admin account dan ngeremove max_member di project

This commit is contained in:
Rafi Athallah
2026-06-14 20:26:53 +07:00
parent edc287968d
commit 94bbc18224
10 changed files with 937 additions and 381 deletions
@@ -74,6 +74,10 @@ class ProjectRepository {
};
}
if (actor?.role === "mentor") {
where.id_admin = parseInt(actor.id);
}
return prisma.project.findMany({
where,
orderBy: {
+19 -14
View File
@@ -14,9 +14,9 @@ class ProjectService {
return error(new BadRequestError("Admin ID is required"));
}
if (actor.role !== "admin") {
if (actor.role !== "admin" && actor.role !== "mentor") {
return error(
new ForbiddenError("Access denied: only admin can create project"),
new ForbiddenError("Access denied: only admin or mentor can create project"),
);
}
@@ -65,7 +65,6 @@ class ProjectService {
description: projectData.description || "",
start_date: projectData.start_date,
end_date: projectData.end_date,
max_members: 8,
status: "active",
};
@@ -95,7 +94,6 @@ class ProjectService {
description: project.description,
start_date: project.start_date,
end_date: project.end_date,
max_members: project.max_members,
status: project.status,
admin: this.mapAdmin(project.admin),
total_members: project.members?.length || 0,
@@ -135,9 +133,9 @@ class ProjectService {
return error(new BadRequestError("Admin ID is required"));
}
if (actor.role !== "admin") {
if (actor.role !== "admin" && actor.role !== "mentor") {
return error(
new ForbiddenError("Access denied: only admin can update project"),
new ForbiddenError("Access denied: only admin or mentor can update project"),
);
}
@@ -188,9 +186,9 @@ class ProjectService {
return error(new BadRequestError("Admin ID is required"));
}
if (actor.role !== "admin") {
if (actor.role !== "admin" && actor.role !== "mentor") {
return error(
new ForbiddenError("Access denied: only admin can archive project"),
new ForbiddenError("Access denied: only admin or mentor can archive project"),
);
}
@@ -223,6 +221,16 @@ class ProjectService {
return null;
}
if (actor.role === "mentor") {
const project = await projectRepository.findById(idProject);
if (!project || project.id_admin !== parseInt(actor.id)) {
return new ForbiddenError(
"Access denied: you are not the mentor of this project",
);
}
return null;
}
if (actor.role === "intern") {
const membership = await projectRepository.checkActiveMember(
idProject,
@@ -259,7 +267,6 @@ class ProjectService {
description: project.description,
start_date: project.start_date,
end_date: project.end_date,
max_members: project.max_members,
status: project.status,
admin: this.mapAdmin(project.admin),
members:
@@ -328,7 +335,6 @@ class ProjectService {
description: project.description,
start_date: project.start_date,
end_date: project.end_date,
max_members: project.max_members,
status: project.status,
admin: this.mapAdmin(project.admin),
total_members: project.members?.length || 0,
@@ -393,7 +399,7 @@ class ProjectService {
return error(new BadRequestError("Admin ID is required"));
}
if (actor.role !== "admin") {
if (actor.role !== "admin" && actor.role !== "mentor") {
return error(
new ForbiddenError("Access denied: only mentors/admins can view their created projects"),
);
@@ -408,7 +414,6 @@ class ProjectService {
description: project.description,
start_date: project.start_date,
end_date: project.end_date,
max_members: project.max_members,
status: project.status,
admin: this.mapAdmin(project.admin),
total_members: project.members?.length || 0,
@@ -429,7 +434,7 @@ class ProjectService {
return error(new BadRequestError("Admin ID is required"));
}
if (actor.role !== "admin") {
if (actor.role !== "admin" && actor.role !== "mentor") {
return error(
new ForbiddenError("Access denied: only admin/mentor can access interns list"),
);
@@ -465,7 +470,7 @@ class ProjectService {
return error(new BadRequestError("Admin ID is required"));
}
if (actor.role !== "admin") {
if (actor.role !== "admin" && actor.role !== "mentor") {
return error(
new ForbiddenError("Access denied: only mentors/admins can assign members"),
);