fix: assign member hanya intern yg gk ada active project

This commit is contained in:
Rafi Athallah
2026-06-27 18:12:42 +07:00
parent 8145b0afc0
commit ccf192a14d
5 changed files with 201 additions and 85 deletions
@@ -131,27 +131,6 @@ class CertificateController {
}
}
async verifyCertificate(req, res) {
try {
const certificate_no = req.query.certificate_no || req.params.certificate_no;
const result = await certificateService.verifyCertificate(certificate_no);
if (result.err) {
return response(res, 'fail', result);
}
return response(res, 'success', result, 'Certificate validated successfully', SUCCESS.OK);
} catch (err) {
return response(
res,
'fail',
error(new InternalServerError(err.message)),
'Unexpected error occurred',
ERROR.INTERNAL_ERROR
);
}
}
async verifyCertificateByUuid(req, res) {
try {
const { uuid } = req.params;
@@ -160,23 +160,6 @@ class CertificateService {
}
}
async verifyCertificate(certificate_no) {
try {
if (!certificate_no) {
return error(new BadRequestError('Certificate number is required'));
}
const certificate = await certificateRepository.findByCertificateNo(certificate_no);
if (!certificate) {
return error(new NotFoundError('Certificate not found or invalid'));
}
return data(this.mapCertificate(certificate));
} catch (err) {
return error(err);
}
}
async verifyCertificateByUuid(uuid) {
try {
if (!uuid) {
@@ -547,13 +547,30 @@ class ProjectService {
return error(new NotFoundError("User not found or inactive"));
}
if (user.role !== "intern") {
return error(
new ForbiddenError("Access denied: only interns can be assigned to projects")
);
}
const activeMemberships = await projectRepository.findActiveMembershipsByUserIds([id_user]);
if (activeMemberships.length > 0) {
const activeProj = activeMemberships[0].project;
if (activeMemberships[0].id_project === parseInt(id_project)) {
return error(new ConflictError("User is already an active member of this project"));
} else {
return error(
new ConflictError(
`User is already an active member of another project: ${activeProj?.project_name || "Unknown Project"}`
)
);
}
}
const existingMembership = await projectRepository.findMembership(id_project, id_user);
let membership;
if (existingMembership) {
if (existingMembership.status === 'active') {
return error(new ConflictError("User is already an active member of this project"));
}
membership = await projectRepository.updateMembershipStatus(existingMembership.id, 'active');
} else {
membership = await projectRepository.assignMember(id_project, id_user);
-44
View File
@@ -267,50 +267,6 @@ router.get('/detail/:id', verifyJWT, certificateController.getCertificateDetail)
* description: Internal server error
*/
router.get('/project/:id_project', verifyJWT, isAdmin, certificateController.getProjectCertificates);
/**
* @swagger
* /certificate-api/verify:
* get:
* summary: Verify a certificate (Public)
* description: Verify the validity of a certificate number publicly without authentication.
* tags: [Certificate]
* parameters:
* - in: query
* name: certificate_no
* schema:
* type: string
* required: true
* description: The certificate number to verify
* example: "CERT/20260609/PRJ2/USR5"
* responses:
* 200:
* description: Certificate is valid
* content:
* application/json:
* schema:
* type: object
* properties:
* status:
* type: boolean
* example: true
* data:
* $ref: '#/components/schemas/Certificate'
* message:
* type: string
* example: "Certificate validated successfully"
* code:
* type: integer
* example: 200
* 400:
* description: Bad request (missing certificate number)
* 404:
* description: Certificate not found or invalid
* 500:
* description: Internal server error
*/
router.get('/verify', certificateController.verifyCertificate);
/**
* @swagger
* /certificate-api/verify-uuid/{uuid}: