diff --git a/pom.xml b/pom.xml index 08c677d0..f3424e44 100644 --- a/pom.xml +++ b/pom.xml @@ -225,6 +225,11 @@ 3.0.0 + + + org.springframework + spring-test + diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java index 2cf079bf..c9c19708 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationAmendmentRequestDao.java @@ -212,7 +212,7 @@ public class ApplicationAmendmentRequestDao { ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = new ApplicationAmendmentRequestEntity(); applicationAmendmentRequestEntity.setNote(applicationAmendmentRequest.getNote()); applicationAmendmentRequestEntity.setResponseDays(applicationAmendmentRequest.getResponseDays()); - if(applicationAmendmentRequest.getResponseDays()==null && applicationAmendmentRequest.getResponseDays() < 0){ + if(applicationAmendmentRequest.getResponseDays()==null || applicationAmendmentRequest.getResponseDays() < 0){ throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.RESPONSE_DAYS_NOT_NULL)); } applicationAmendmentRequestEntity.setEndDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now()).plusDays(applicationAmendmentRequest.getResponseDays())); @@ -897,7 +897,7 @@ public class ApplicationAmendmentRequestDao { ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity = validateApplicationAmendmentRequest(id); if (newResponseDays != null && newResponseDays > 0) { -ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(applicationAmendmentRequestEntity); + ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClonedEntityForData(applicationAmendmentRequestEntity); Long currentResponseDays = applicationAmendmentRequestEntity.getResponseDays() != null ? applicationAmendmentRequestEntity.getResponseDays() : 0L; applicationAmendmentRequestEntity.setResponseDays(currentResponseDays + newResponseDays); applicationAmendmentRequestEntity.setEndDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now().plusDays(applicationAmendmentRequestEntity.getResponseDays()))); @@ -1014,6 +1014,9 @@ ApplicationAmendmentRequestEntity oldApplicationAmendmentEntity = Utils.getClone ApplicationEvaluationEntity oldApplicationEvaluationEntity = Utils.getClonedEntityForData(applicationEvaluationEntity); applicationEvaluationEntity.setEndDate(endDate); + if(applicationEvaluationEntity.getSuspendedDays() == null) { + applicationEvaluationEntity.setSuspendedDays(0L); + } applicationEvaluationEntity.setSuspendedDays(applicationEvaluationEntity.getSuspendedDays()+suspendedDays); ApplicationEvaluationEntity applicationEvaluation = applicationEvaluationRepository.save(applicationEvaluationEntity); diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 0a92143b..7023b40b 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -147,7 +147,11 @@ public enum UserActionContextEnum { GET_FORM("GET_FORM"), CREATE_FORM("CREATE_FORM"), UPDATE_FORM("UPDATE_FORM"), - DELETE_FORM("DELETE_FORM"); + DELETE_FORM("DELETE_FORM"), + + /** scheduler action context **/ + AMENDMENT_EXPIRATION_SCHEDULER("AMENDMENT_EXPIRATION_SCHEDULER"), + EVALUATION_EXPIRATION_SCHEDULER("EVALUATION_EXPIRATION_SCHEDULER"); private final String value; diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionLogsEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionLogsEnum.java index f68f6ae9..6fdd86f5 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionLogsEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionLogsEnum.java @@ -10,7 +10,8 @@ public enum UserActionLogsEnum { VIEW("VIEW"), INSERT("INSERT"), DOWNLOAD("DOWNLOAD"), - UPLOAD("UPLOAD"); + UPLOAD("UPLOAD"), + SCHEDULER("SCHEDULER"); private final String value; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java index af46d7b5..a5443dd3 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationAmendmentRequestRepository.java @@ -1,6 +1,8 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; +import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; @@ -9,6 +11,7 @@ import org.springframework.data.repository.query.Param; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; +import java.util.Set; public interface ApplicationAmendmentRequestRepository extends JpaRepository, JpaSpecificationExecutor { Optional findByIdAndIsDeletedFalse(Long id); @@ -45,10 +48,22 @@ public interface ApplicationAmendmentRequestRepository extends JpaRepository findAllByApplicationEvaluationIdAndStatusAndIsDeletedFalse(Long id, String status); @Query("SELECT a FROM ApplicationAmendmentRequestEntity a " + - "WHERE a.applicationId = :applicationId " + - "AND a.isDeleted = false " + + "WHERE a.isDeleted = false " + "AND a.status <> 'CLOSE' " + "AND a.endDate < :currentTime") - List findActiveAmendments(Long applicationId, LocalDateTime currentTime); + List findAmendmentsDueForExpiration(LocalDateTime currentTime); + + + + @Query("SELECT DISTINCT a.applicationEvaluationEntity " + + "FROM ApplicationAmendmentRequestEntity a " + + "WHERE a.applicationEvaluationEntity.id IN :applicationEvaluationIds " + + "AND a.isDeleted = false " + + "AND NOT EXISTS ( " + + " SELECT 1 FROM ApplicationAmendmentRequestEntity activeAmendment" + + " WHERE activeAmendment.applicationEvaluationEntity.id = a.applicationEvaluationEntity.id " + + " AND activeAmendment.status <> 'CLOSE' " + + " AND activeAmendment.isDeleted = false) ") + Set findEvaluationsWithoutActiveAmendmentsByIds(@Param("applicationEvaluationIds") Set applicationEvaluationIds); } diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationAmendmentScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationAmendmentScheduler.java new file mode 100644 index 00000000..a3112a1c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationAmendmentScheduler.java @@ -0,0 +1,122 @@ +package net.gepafin.tendermanagement.scheduler; + +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.ApplicationAmendmentRequestDao; +import net.gepafin.tendermanagement.dao.EmailNotificationDao; +import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; +import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; +import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; +import net.gepafin.tendermanagement.enums.UserActionContextEnum; +import net.gepafin.tendermanagement.enums.UserActionLogsEnum; +import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; +import net.gepafin.tendermanagement.model.request.UserActionRequest; +import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; +import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository; +import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.util.LoggingUtil; +import net.gepafin.tendermanagement.util.Utils; + +@Component +public class ApplicationAmendmentScheduler { + + @Autowired + private HttpServletRequest httpServletRequest; + + @Autowired + private ApplicationAmendmentRequestRepository applicationAmendmentRepository; + + @Autowired + private EmailNotificationDao emailNotificationDao; + + @Autowired + private ApplicationAmendmentRequestDao applicationAmendmentRequestDao; + + @Autowired + private LoggingUtil loggingUtil; + + private static final Logger log = LoggerFactory.getLogger(ApplicationAmendmentScheduler.class); + + @Scheduled(cron = "0 0 1 * * ?") + public void processAmendmentExpirationScheduler() { + log.info("Starting the Application Amendment Expiration scheduler."); + try { + + Utils.setHttpServletRequestForScheduler(); + + /** This code is responsible for creating user action logs for the "Application Amendment Expiration scheduler" operation. **/ + loggingUtil.logUserActionWithoutToken( + UserActionRequest.builder().request(httpServletRequest).actionType(UserActionLogsEnum.SCHEDULER).actionContext(UserActionContextEnum.AMENDMENT_EXPIRATION_SCHEDULER).build()); + + List amendmentRequestList = applicationAmendmentRepository + .findAmendmentsDueForExpiration( + DateTimeUtil.DateServerToUTC(LocalDateTime.now()).with(LocalTime.MIN).plusSeconds(5)); + processAmendmentsForExpiration(amendmentRequestList); + log.info("Application Amendment Expiration scheduler completed successfully."); + } catch (Exception e) { + log.error("An error occurred during the Application Amendment Expiration scheduler: {}", e.getMessage(), e); + } + Utils.clearHttpServletRequest(); + } + + private void processAmendmentsForExpiration(List amendmentRequests) { + + log.info("Starting the process of expiring application amendments."); + amendmentRequests.forEach(request -> { + try { + ApplicationAmendmentRequestEntity oldAmendmentRequestEntity = Utils.getClonedEntityForData(request); + request.setStatus(ApplicationAmendmentRequestEnum.CLOSE.getValue()); + request = applicationAmendmentRepository.save(request); + + /** This code is responsible for adding a version history log for the "Update Application Amendment" operation. **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(httpServletRequest).actionType(VersionActionTypeEnum.UPDATE).oldData(oldAmendmentRequestEntity).newData(request).build()); + + emailNotificationDao.sendApplicationFailureNotificationEmail(request); + log.info("Updated status to CLOSED for ApplicationAmendmentRequest with ID: {}", request.getId()); + } catch (Exception e) { + log.error("Error expiring ApplicationAmendmentRequest with ID {}: {}", request.getId(), e.getMessage(), + e); + } + }); + log.info("Completed the process of updating expiring application amendments."); + + log.info("Starting the process of updating EndDate in ApplicationEvaluations."); + try { + Set applicationEvaluationIds = amendmentRequests.stream() + .map(request -> request.getApplicationEvaluationEntity().getId()).collect(Collectors.toSet()); + + Set evaluationsWithoutActiveAmendmentList = applicationAmendmentRepository + .findEvaluationsWithoutActiveAmendmentsByIds(applicationEvaluationIds); + evaluationsWithoutActiveAmendmentList.forEach(evaluation -> { + try { + applicationAmendmentRequestDao.calculateEndDateAndSuspensionDays(evaluation); + log.info("Updated EndDate and suspension days for ApplicationEvaluation with ID: {}", + evaluation.getId()); + } catch (Exception e) { + log.error("Error updating EndDate for ApplicationEvaluation with ID {}: {}", evaluation.getId(), + e.getMessage(), e); + } + }); + + log.info("Completed the process of updating EndDate in ApplicationEvaluations."); + } catch (Exception e) { + log.error("An error occurred while updating EndDate in ApplicationEvaluations: {}", e.getMessage(), e); + } + + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java index 54e641c9..94980dcd 100644 --- a/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java +++ b/src/main/java/net/gepafin/tendermanagement/scheduler/ApplicationEvaluationScheduler.java @@ -3,42 +3,93 @@ package net.gepafin.tendermanagement.scheduler; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; import net.gepafin.tendermanagement.enums.ApplicationEvaluationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.UserActionContextEnum; +import net.gepafin.tendermanagement.enums.UserActionLogsEnum; import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; +import net.gepafin.tendermanagement.model.request.UserActionRequest; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; import net.gepafin.tendermanagement.repositories.ApplicationEvaluationRepository; +import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.LoggingUtil; import net.gepafin.tendermanagement.util.Utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.List; +@Component public class ApplicationEvaluationScheduler { + @Autowired + private ApplicationEvaluationRepository applicationEvaluationRepository; - @Autowired - private ApplicationEvaluationRepository applicationEvaluationRepository; + @Autowired + private LoggingUtil loggingUtil; - @Autowired - private LoggingUtil loggingUtil; + @Autowired + private HttpServletRequest httpServletRequest; - @Autowired - private HttpServletRequest request; + private static final Logger log = LoggerFactory.getLogger(ApplicationEvaluationScheduler.class); - @Scheduled(cron = "0 0 1 * * ?") // Runs daily at midnight - public void updateExpiredEvaluations() { - LocalDateTime currentDate = LocalDateTime.now(); - List evaluations = applicationEvaluationRepository.findAllByIsDeletedFalseAndEndDateBefore(currentDate); + @Scheduled(cron = "0 0 2 * * ?") // Runs daily at midnight + public void updateExpiredEvaluations() { + log.info("Starting the Application Evaluation Expiration scheduler..."); + Utils.setHttpServletRequestForScheduler(); + try { + processExpiredEvaluation(); + log.info("Completed the process of updating expiring application evaluations."); + } catch (Exception e) { + log.error("An error occurred during the Application Evaluation Expiration scheduler: {}", e.getMessage(), + e); + } finally { + Utils.clearHttpServletRequest(); + } + } - for (ApplicationEvaluationEntity evaluation : evaluations) { - ApplicationEvaluationEntity oldApplicationEvaluationEntity = Utils.getClonedEntityForData(evaluation); - evaluation.setStatus(ApplicationEvaluationStatusTypeEnum.EXPIRED.getValue()); + private void processExpiredEvaluation() { + log.info("Starting the process of expiring application evaluations."); - /** This code is responsible for adding a version history log for the "Update Application Amendment" operation. **/ - loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEvaluationEntity).newData(evaluation).build()); - } - applicationEvaluationRepository.saveAll(evaluations); - } - } + // Logging user action for the scheduler operation + loggingUtil.logUserActionWithoutToken( + UserActionRequest.builder().request(httpServletRequest).actionType(UserActionLogsEnum.SCHEDULER) + .actionContext(UserActionContextEnum.EVALUATION_EXPIRATION_SCHEDULER).build()); + try { + List evaluations = applicationEvaluationRepository + .findAllByIsDeletedFalseAndEndDateBefore( + DateTimeUtil.DateServerToUTC(LocalDateTime.now()).with(LocalTime.MIN).plusSeconds(5)); + log.info("Found {} evaluations to process for expiration.", evaluations.size()); + + for (ApplicationEvaluationEntity evaluation : evaluations) { + try { + log.debug("Processing evaluation with ID: {}", evaluation.getId()); + + ApplicationEvaluationEntity oldApplicationEvaluationEntity = Utils + .getClonedEntityForData(evaluation); + + evaluation.setStatus(ApplicationEvaluationStatusTypeEnum.EXPIRED.getValue()); + evaluation = applicationEvaluationRepository.save(evaluation); + + // Logging version history for the update operation + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(httpServletRequest) + .actionType(VersionActionTypeEnum.UPDATE).oldData(oldApplicationEvaluationEntity) + .newData(evaluation).build()); + + log.info("Updated evaluation status to EXPIRED for ID: {}", evaluation.getId()); + } catch (Exception e) { + log.error("Error processing evaluation with ID: {}. Error: {}", evaluation.getId(), e.getMessage(), + e); + } + } + } catch (Exception e) { + log.error("An error occurred while fetching evaluations for expiration. Error: {}", e.getMessage(), e); + } + + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java b/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java deleted file mode 100644 index 521726a9..00000000 --- a/src/main/java/net/gepafin/tendermanagement/scheduler/NotificationScheduler.java +++ /dev/null @@ -1,76 +0,0 @@ -package net.gepafin.tendermanagement.scheduler; - -import net.gepafin.tendermanagement.dao.ApplicationAmendmentRequestDao; -import net.gepafin.tendermanagement.dao.EmailNotificationDao; -import net.gepafin.tendermanagement.entities.ApplicationAmendmentRequestEntity; -import net.gepafin.tendermanagement.entities.ApplicationEntity; -import net.gepafin.tendermanagement.entities.ApplicationEvaluationEntity; -import net.gepafin.tendermanagement.entities.UserEntity; -import net.gepafin.tendermanagement.enums.ApplicationAmendmentRequestEnum; -import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; -import net.gepafin.tendermanagement.repositories.ApplicationAmendmentRequestRepository; -import net.gepafin.tendermanagement.repositories.ApplicationEvaluationRepository; -import net.gepafin.tendermanagement.repositories.ApplicationRepository; -import net.gepafin.tendermanagement.repositories.UserRepository; -import net.gepafin.tendermanagement.util.DateTimeUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - -@Component -public class NotificationScheduler { - - @Autowired - UserRepository userRepository; - - @Autowired - ApplicationRepository applicationRepository; - - @Autowired - ApplicationAmendmentRequestRepository applicationAmendmentRepository; - - @Autowired - EmailNotificationDao emailNotificationDao; - - @Autowired - private ApplicationAmendmentRequestDao applicationAmendmentRequestDao; - - @Autowired - private ApplicationEvaluationRepository applicationEvaluationRepository; - - @Scheduled(cron = "0 0 1 * * ?") - void sendNotificationForRejectedApplicationToBeneficiary() { - - List applicationsList = applicationRepository.findByIsDeletedFalse(); - List amendmentRequestList = applicationAmendmentRepository.findByIsDeletedFalse(); - - LocalDateTime today = LocalDateTime.now(); - - for (ApplicationEntity application : applicationsList) { - List amendmentRequestEntities = applicationAmendmentRepository.findActiveAmendments(application.getId(), DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - List applicationAmendmentRequestEntities = new ArrayList<>(); - if (amendmentRequestEntities != null && Boolean.FALSE.equals(amendmentRequestEntities.isEmpty())) { - for (ApplicationAmendmentRequestEntity applicationAmendmentRequestEntity : amendmentRequestEntities) { - if (amendmentRequestEntities.size() == 1) { - applicationAmendmentRequestDao.calculateEndDateAndSuspensionDays(applicationAmendmentRequestEntity.getApplicationEvaluationEntity()); - } - application.setStatus(ApplicationStatusTypeEnum.REJECTED.getValue()); - applicationRepository.save(application); - applicationAmendmentRequestEntity.setStatus(ApplicationAmendmentRequestEnum.CLOSE.getValue()); - applicationAmendmentRepository.save(applicationAmendmentRequestEntity); - emailNotificationDao.sendApplicationFailureNotificationEmail(applicationAmendmentRequestEntity); - } - } - } - } - - private ApplicationAmendmentRequestEntity getAmendmentRequestForApplication(ApplicationEntity application, List amendmentRequestList) { - - return amendmentRequestList.stream().filter(request -> request.getApplicationId().equals(application.getId())).findFirst().orElse(null); - } -} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java index 4d3092a3..7329c5c3 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationAmendmentRequestServiceImpl.java @@ -20,6 +20,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundExceptio import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Optional; @@ -45,6 +46,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm } @Override + @Transactional(rollbackFor = Exception.class) public ApplicationAmendmentRequestResponse createApplicationAmendmentRequest(HttpServletRequest request, Long applicationEvaluationId , ApplicationAmendmentRequest applicationAmendmentRequest) { Optional entityOptional = applicationEvaluationRepository.findByIdAndIsDeletedFalse(applicationEvaluationId); entityOptional.ifPresent(applicationEvaluationEntity -> validator.validatePreInstructor(request, applicationEvaluationEntity.getUserId())); @@ -52,6 +54,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm } @Override + @Transactional(rollbackFor = Exception.class) public void deleteApplicationAmendmentRequest(HttpServletRequest request, Long id) { ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, @@ -86,6 +89,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm } @Override + @Transactional(rollbackFor = Exception.class) public ApplicationAmendmentRequestResponse updateApplicationAmendment(HttpServletRequest request, Long id, ApplicationAmendmentRequestBean applicationAmendmentRequestBean) { ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestDao.validateApplicationAmendmentRequest(id); @@ -110,6 +114,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm } @Override + @Transactional(rollbackFor = Exception.class) public ApplicationAmendmentRequestResponse closeAmendmentRequest(HttpServletRequest request, Long id, CloseAmendmentRequest closeAmendmentRequest) { ApplicationAmendmentRequestEntity amendment = applicationAmendmentRequestRepository.findByIdAndIsDeletedFalse(id) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, @@ -123,6 +128,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm } @Override + @Transactional(rollbackFor = Exception.class) public ApplicationAmendmentRequestResponse extendResponseDays(HttpServletRequest request, Long id, Long addedDays) { UserEntity user= validator.validateUser(request); return applicationAmendmentRequestDao.extendResponseDays(id, addedDays); @@ -132,6 +138,7 @@ public class ApplicationAmendmentRequestServiceImpl implements ApplicationAmendm return applicationAmendmentRequestDao.getAmendmentByApplicationId(request,applicationId,statuses); } @Override + @Transactional(rollbackFor = Exception.class) public ApplicationAmendmentRequestResponse updateApplicationAmendmentStatus(HttpServletRequest request, Long applicationAmendmentId, ApplicationAmendmentRequestEnum status) { return applicationAmendmentRequestDao.updateApplicationAmendmentStatus(applicationAmendmentId, status); diff --git a/src/main/java/net/gepafin/tendermanagement/util/LoggingUtil.java b/src/main/java/net/gepafin/tendermanagement/util/LoggingUtil.java index 53ed01cb..319795ec 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/LoggingUtil.java +++ b/src/main/java/net/gepafin/tendermanagement/util/LoggingUtil.java @@ -134,8 +134,12 @@ public class LoggingUtil { try { VersionHistoryEntity history = new VersionHistoryEntity(); String token = tokenProvider.extractTokenFromRequest(versionHistoryRequest.getRequest()); - Claims claims = tokenProvider.getClaimsFromToken(token); - Long userId = claims.get(GepafinConstant.USER_ID, Long.class); + if(versionHistoryRequest.getRequest() != null && token != null) + { + Claims claims = tokenProvider.getClaimsFromToken(token); + Long userId = claims.get(GepafinConstant.USER_ID, Long.class); + history.setUserId(userId); + } String oldData = Utils.convertEntityToJsonForLogging(versionHistoryRequest.getOldData()); String newData = Utils.convertEntityToJsonForLogging(versionHistoryRequest.getNewData()); history.setUserActionId(userActionId); @@ -144,7 +148,6 @@ public class LoggingUtil { history.setNewData(newData); history.setRecordId(recordId); history.setTableName(tableName); - history.setUserId(userId); versionHistoryRepository.save(history); } catch (Exception e) { log.error("Error logging version history: {}", e.getMessage(), e); diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 4949e5d5..7524c306 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -46,6 +46,9 @@ import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientNotFoundExcep import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientUnauthorizedException; import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientValidationException; import org.springframework.http.MediaType; +import org.springframework.mock.web.MockHttpServletRequest; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; @@ -564,4 +567,17 @@ public class Utils { return null; } } + + public static void setHttpServletRequestForScheduler() { + MockHttpServletRequest mockRequest = new MockHttpServletRequest(); + mockRequest.setRequestURI("/scheduled"); + mockRequest.setMethod("POST"); + ServletRequestAttributes attributes = new ServletRequestAttributes(mockRequest); + RequestContextHolder.setRequestAttributes(attributes); + } + + public static void clearHttpServletRequest() { + // Clear the RequestContextHolder after task execution + RequestContextHolder.resetRequestAttributes(); + } }