diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index b3e27da5..d796432f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -1,20 +1,26 @@ package net.gepafin.tendermanagement.dao; + import jakarta.persistence.criteria.Predicate; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; +import net.gepafin.tendermanagement.entities.FaqEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; +import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; +import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.repositories.AssignedApplicationsRepository; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.util.LoggingUtil; +import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; @@ -44,15 +50,20 @@ public class AssignedApplicationsDao { @Autowired private UserService userService; - + @Autowired private Validator validator; + @Autowired + private LoggingUtil loggingUtil; - public AssignedApplicationsResponse createAssignedApplications(Long applicationId, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest){ - log.info("Assigning application to pre-Instructor with details: {}", applicationId,userId); + @Autowired + private HttpServletRequest request; + + public AssignedApplicationsResponse createAssignedApplications(Long applicationId, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest) { + log.info("Assigning application to pre-Instructor with details: {}", applicationId, userId); AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); - if(assignedApplications!=null){ + if (assignedApplications != null) { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_ASSIGNED)); } ApplicationEntity application = applicationService.validateApplication(applicationId); @@ -64,8 +75,13 @@ public class AssignedApplicationsDao { Translator.toLocale(GepafinConstant.INVALID_APPLICATION_STATUS) ); } + ApplicationEntity oldApplicationEntity = Utils.getClonedEntityForData(application); application.setStatus(ApplicationStatusTypeEnum.EVALUATION.getValue()); applicationRepository.save(application); + + /** This code is responsible for adding a version history log for the "Create Application" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEntity).newData(application).build()); + UserEntity user = userService.validateUser(userId); AssignedApplicationsEntity assignment = createAssignmentEntity(application, user.getId(), assignedByUser, assignedApplicationsRequest); AssignedApplicationsResponse assignApplicationToInstructorResponse = convertEntityToResponse(assignment); @@ -74,28 +90,34 @@ public class AssignedApplicationsDao { return assignApplicationToInstructorResponse; } - public AssignedApplicationsEntity createAssignmentEntity(ApplicationEntity application, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest){ - AssignedApplicationsEntity assignApplication= new AssignedApplicationsEntity(); + public AssignedApplicationsEntity createAssignmentEntity(ApplicationEntity application, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest) { + AssignedApplicationsEntity assignApplication = new AssignedApplicationsEntity(); assignApplication.setApplication(application); assignApplication.setAssignedBy(assignedByUser.getId()); assignApplication.setUserId(userId); assignApplication.setStatus(AssignedApplicationEnum.OPEN.getValue()); - if(assignedApplicationsRequest.getStatus() != null) { - assignApplication.setStatus(assignedApplicationsRequest.getStatus().getValue()); + if (assignedApplicationsRequest.getStatus() != null) { + assignApplication.setStatus(assignedApplicationsRequest.getStatus().getValue()); } assignApplication.setNote(assignedApplicationsRequest.getNote()); assignApplication.setIsDeleted(false); assignApplication.setAssignedAt(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - AssignedApplicationsEntity assignedApplicationsEntity = saveAssignedApplication(assignApplication); + + AssignedApplicationsEntity assignedApplicationsEntity = saveAssignedApplication(assignApplication, null, VersionActionTypeEnum.INSERT); return assignedApplicationsEntity; } - public AssignedApplicationsEntity saveAssignedApplication(AssignedApplicationsEntity assignedApplicationsEntity){ - AssignedApplicationsEntity assignedApplication= assignedApplicationsRepository.save(assignedApplicationsEntity); + + public AssignedApplicationsEntity saveAssignedApplication(AssignedApplicationsEntity assignedApplicationsEntity, AssignedApplicationsEntity oldAssignedApplicationEntity, VersionActionTypeEnum actionTypeEnum) { + AssignedApplicationsEntity assignedApplication = assignedApplicationsRepository.save(assignedApplicationsEntity); + + /** This code is responsible for adding a version history log for the "Create Application" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(actionTypeEnum).oldData(oldAssignedApplicationEntity).newData(assignedApplication).build()); + return assignedApplication; } - public AssignedApplicationsResponse convertEntityToResponse(AssignedApplicationsEntity assignedApplications){ + public AssignedApplicationsResponse convertEntityToResponse(AssignedApplicationsEntity assignedApplications) { AssignedApplicationsResponse assignedApplicationsResponse = new AssignedApplicationsResponse(); assignedApplicationsResponse.setId(assignedApplications.getId()); assignedApplicationsResponse.setApplicationId(assignedApplications.getApplication().getId()); @@ -136,60 +158,65 @@ public class AssignedApplicationsDao { return assignedApplicationsResponse; } - public AssignedApplicationsEntity validateAssignedApplication(Long id){ - AssignedApplicationsEntity assignedApplication = assignedApplicationsRepository.findByIdAndIsDeletedFalse(id).orElseThrow(()-> - new ResourceNotFoundException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_MSG))); - return assignedApplication; + public AssignedApplicationsEntity validateAssignedApplication(Long id) { + AssignedApplicationsEntity assignedApplication = assignedApplicationsRepository.findByIdAndIsDeletedFalse(id).orElseThrow(() -> + new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_MSG))); + return assignedApplication; } public void deleteById(HttpServletRequest request, Long id) { log.info("Deleting assigned application with ID: {}", id); - AssignedApplicationsEntity assignedApplicationsEntity= validateAssignedApplication(id); + AssignedApplicationsEntity assignedApplicationsEntity = validateAssignedApplication(id); validator.validatePreInstructor(request, assignedApplicationsEntity.getUserId()); + AssignedApplicationsEntity oldAssignedApplicationEntity = Utils.getClonedEntityForData(assignedApplicationsEntity); assignedApplicationsEntity.setIsDeleted(true); - assignedApplicationsEntity= saveAssignedApplication(assignedApplicationsEntity); + assignedApplicationsEntity = saveAssignedApplication(assignedApplicationsEntity, oldAssignedApplicationEntity, VersionActionTypeEnum.DELETE); log.info("Assigned Application deleted with ID: {}", id); } - public List getAllAssignedApplications(HttpServletRequest request, Long userId) { - UserEntity user = validator.validateUser(request); - if(validator.checkIsPreInstructor() && userId == null) { - throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.USER_ID_NOT_NULL_MSG)); - } - if(userId != null) { - validator.validatePreInstructor(request, userId); - } - Specification spec = search(user.getHub().getId() ,userId); - List assignedApplicationsEntityList = assignedApplicationsRepository.findAll(spec); - return assignedApplicationsEntityList.stream() - .map(entity -> convertEntityToResponse(entity)) - .collect(Collectors.toList()); + public List getAllAssignedApplications(HttpServletRequest request, Long userId) { + UserEntity user = validator.validateUser(request); + if (validator.checkIsPreInstructor() && userId == null) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.USER_ID_NOT_NULL_MSG)); } - private Specification search(Long hubId, Long userId) { - return (root, query, builder) -> { - Predicate predicate = builder.isFalse(root.get("isDeleted")); - if (userId != null) { - predicate = builder.and(predicate, builder.equal(root.get("userId"), userId)); - } - predicate = builder.and(predicate, builder.equal(root.get("application").get("hubId"), hubId)); - return predicate; - }; + if (userId != null) { + validator.validatePreInstructor(request, userId); } + Specification spec = search(user.getHub().getId(), userId); + List assignedApplicationsEntityList = assignedApplicationsRepository.findAll(spec); + return assignedApplicationsEntityList.stream() + .map(entity -> convertEntityToResponse(entity)) + .collect(Collectors.toList()); + } + + private Specification search(Long hubId, Long userId) { + return (root, query, builder) -> { + Predicate predicate = builder.isFalse(root.get("isDeleted")); + if (userId != null) { + predicate = builder.and(predicate, builder.equal(root.get("userId"), userId)); + } + predicate = builder.and(predicate, builder.equal(root.get("application").get("hubId"), hubId)); + return predicate; + }; + } public AssignedApplicationsResponse updateAssignedApplication(HttpServletRequest request, - Long id, AssignedApplicationsRequest updateRequest) { - UserEntity updatedByUser = validator.validateUser(request); + Long id, AssignedApplicationsRequest updateRequest) { + UserEntity updatedByUser = validator.validateUser(request); log.info("Updating assigned application with ID: {}", id); AssignedApplicationsEntity existingAssignment = validateAssignedApplication(id); validator.validatePreInstructor(request, existingAssignment.getUserId()); + + AssignedApplicationsEntity oldAssignedApplicationEntity = Utils.getClonedEntityForData(existingAssignment); + setIfUpdated(existingAssignment::getNote, existingAssignment::setNote, updateRequest.getNote()); setIfUpdated(existingAssignment::getStatus, existingAssignment::setStatus, updateRequest.getStatus().name()); setIfUpdated(existingAssignment::getAssignedBy, existingAssignment::setAssignedBy, updatedByUser.getId()); existingAssignment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - AssignedApplicationsEntity updatedAssignment = saveAssignedApplication(existingAssignment); + AssignedApplicationsEntity updatedAssignment = saveAssignedApplication(existingAssignment, oldAssignedApplicationEntity, VersionActionTypeEnum.UPDATE); AssignedApplicationsResponse response = convertEntityToResponse(updatedAssignment); log.info("Assigned application updated successfully: {}", response); return response; diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 538a60a3..e199dc90 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -29,7 +29,13 @@ public enum UserActionContextEnum { CREATE_FAQ("CREATE_FAQ"), GET_FAQ("GET_FAQ"), UPDATE_FAQ_DETAILS("UPDATE_FAQ_DETAILS"), - DELETE_FAQ("DELETE_FAQ") + DELETE_FAQ("DELETE_FAQ"), + + /** Assigned Application action context **/ + CREATE_ASSIGNED_APPLICATION("CREATE_ASSIGNED_APPLICATION"), + DELETE_ASSIGNED_APPLICATION("DELETE_ASSIGNED_APPLICATION"), + GET_ASSIGNED_APPLICATION("GET_ASSIGNED_APPLICATION"), + UPDATE_ASSIGNED_APPLICATION_DETAILS("UPDATE_ASSIGNED_APPLICATION_DETAILS") ; private final String value; diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java index 90f989de..7f22337a 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java @@ -4,10 +4,14 @@ import jakarta.servlet.http.HttpServletRequest; import lombok.extern.log4j.Log4j2; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.enums.UserActionContextEnum; +import net.gepafin.tendermanagement.enums.UserActionLogsEnum; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; +import net.gepafin.tendermanagement.model.request.UserActionRequest; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.AssignedApplicationsService; +import net.gepafin.tendermanagement.util.LoggingUtil; import net.gepafin.tendermanagement.web.rest.api.AssignedApplicationsApi; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; @@ -25,11 +29,16 @@ public class AssignedApplicationsController implements AssignedApplicationsApi { @Autowired AssignedApplicationsService assignedApplicationsService; + @Autowired + private LoggingUtil loggingUtil; @Override public ResponseEntity> createAssignedApplications(HttpServletRequest request, Long applicationId, Long userId, AssignedApplicationsRequest assignedApplicationsRequest) { log.info("Assigning Application To PreInstructor"); - AssignedApplicationsResponse responseData = assignedApplicationsService.createAssignedApplications(request,applicationId,userId, assignedApplicationsRequest); + /** This code is responsible for creating user action logs for the "Create Assigned Applications" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.INSERT) + .actionContext(UserActionContextEnum.CREATE_ASSIGNED_APPLICATION).build()); + AssignedApplicationsResponse responseData = assignedApplicationsService.createAssignedApplications(request, applicationId, userId, assignedApplicationsRequest); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(responseData, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_ASSIGNED))); } @@ -37,7 +46,10 @@ public class AssignedApplicationsController implements AssignedApplicationsApi { @Override public ResponseEntity> deleteAssignedApplication(HttpServletRequest request, Long id) { log.info("Delete Assigned Application - Assigned Application ID: {}", id); - assignedApplicationsService.deleteApplication(request,id); + /** This code is responsible for creating user action logs for the "Delete Assigned Applications" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.DELETE).actionContext(UserActionContextEnum.DELETE_ASSIGNED_APPLICATION).build()); + + assignedApplicationsService.deleteApplication(request, id); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELETE_ASSIGNED_APPLICATION_SUCCESS_MSG))); } @@ -45,6 +57,9 @@ public class AssignedApplicationsController implements AssignedApplicationsApi { @Override public ResponseEntity>> getAllAssignedApplications(HttpServletRequest request, Long userId) { log.info("Get All Assigned Applications"); + /** This code is responsible for creating user action logs for the "get Assigned Applications" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) + .actionContext(UserActionContextEnum.GET_ASSIGNED_APPLICATION).build()); List applications = assignedApplicationsService.getAllAssignedApplications(request, userId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applications, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_ASSIGNED_APPLICATION_SUCCESS_MSG))); @@ -53,6 +68,9 @@ public class AssignedApplicationsController implements AssignedApplicationsApi { @Override public ResponseEntity> updateAssignedApplication(HttpServletRequest request, Long id, AssignedApplicationsRequest updateAssignedApplicationRequest) { log.info("Update Assigned Application"); + /** This code is responsible for "Updating Assigned Applications details" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE) + .actionContext(UserActionContextEnum.UPDATE_ASSIGNED_APPLICATION_DETAILS).build()); AssignedApplicationsResponse updateAssignedApplication = assignedApplicationsService.updateAssignedApplication(request, id, updateAssignedApplicationRequest); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(updateAssignedApplication, Status.SUCCESS, Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_UPDATE_SUCCESSFULLY_MSG))); @@ -61,6 +79,10 @@ public class AssignedApplicationsController implements AssignedApplicationsApi { @Override public ResponseEntity> getAssignedApplicationById(HttpServletRequest request, Long id) { log.info("Get Assigned Applications By Id"); + + /** This code is responsible for creating user action logs for the "get Assigned Applications by id" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) + .actionContext(UserActionContextEnum.GET_ASSIGNED_APPLICATION).build()); AssignedApplicationsResponse application = assignedApplicationsService.getAssignedApplicationById(request, id); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(application, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_ASSIGNED_APPLICATION_SUCCESS_MSG)));