diff --git a/src/modules/project/services/project.service.js b/src/modules/project/services/project.service.js index f49bed2..ac987d9 100644 --- a/src/modules/project/services/project.service.js +++ b/src/modules/project/services/project.service.js @@ -534,10 +534,10 @@ class ProjectService { const { id_project, id_user } = payload; if (!id_project || !id_user) { - return error(new BadRequestError("Project ID and User ID are required")); + return error(new BadRequestError("Project ID/slug and User ID are required")); } - const project = await projectRepository.findById(id_project); + const project = await projectRepository.findByIdOrSlug(id_project); if (!project) { return error(new NotFoundError("Project not found")); } @@ -556,7 +556,7 @@ class ProjectService { const activeMemberships = await projectRepository.findActiveMembershipsByUserIds([id_user]); if (activeMemberships.length > 0) { const activeProj = activeMemberships[0].project; - if (activeMemberships[0].id_project === parseInt(id_project)) { + if (activeMemberships[0].id_project === project.id) { return error(new ConflictError("User is already an active member of this project")); } else { return error( @@ -567,7 +567,7 @@ class ProjectService { } } - const existingMembership = await projectRepository.findMembership(id_project, id_user); + const existingMembership = await projectRepository.findMembership(project.id, id_user); let membership; if (existingMembership) { @@ -603,10 +603,10 @@ class ProjectService { const { id_project, id_user } = payload; if (!id_project || !id_user) { - return error(new BadRequestError("Project ID and User ID are required")); + return error(new BadRequestError("Project ID/slug and User ID are required")); } - const project = await projectRepository.findById(id_project); + const project = await projectRepository.findByIdOrSlug(id_project); if (!project) { return error(new NotFoundError("Project not found")); } @@ -616,7 +616,13 @@ class ProjectService { return error(new NotFoundError("User not found or inactive")); } - const existingMembership = await projectRepository.findMembership(id_project, id_user); + if (user.role !== "intern") { + return error( + new ForbiddenError("Access denied: only interns can be removed from projects") + ); + } + + const existingMembership = await projectRepository.findMembership(project.id, id_user); if (!existingMembership || existingMembership.status !== 'active') { return error(new BadRequestError("User is not an active member of this project")); diff --git a/src/routes/project.routes.js b/src/routes/project.routes.js index 4146f0a..459a47c 100644 --- a/src/routes/project.routes.js +++ b/src/routes/project.routes.js @@ -825,8 +825,15 @@ router.get('/interns', verifyJWT, isMentorOrAdmin, projectController.getInterns) * - id_user * properties: * id_project: - * type: integer - * example: 1 + * oneOf: + * - type: integer + * example: 1 + * description: Project ID + * - type: string + * example: internify-lms + * description: Project slug + * description: Project ID or project slug + * example: internify-platform-dev * id_user: * type: integer * example: 2 @@ -872,8 +879,15 @@ router.post('/assign-member', verifyJWT, isMentorOrAdmin, projectController.assi * - id_user * properties: * id_project: - * type: integer - * example: 1 + * oneOf: + * - type: integer + * example: 1 + * description: Project ID + * - type: string + * example: internify-lms + * description: Project slug + * description: Project ID or slug + * example: internify-lms * id_user: * type: integer * example: 2