diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 3a2dd9e4..4d2e341c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -211,8 +211,13 @@ public class CallDao { } private void softDeleteEvaluationCriteria(EvaluationCriteriaEntity evaluationCriteriaEntity) { + EvaluationCriteriaEntity oldEvaluationCriteriaEntity = Utils.getClonedEntityForData(evaluationCriteriaEntity); evaluationCriteriaEntity.setIsDeleted(true); evaluationCriteriaRepository.save(evaluationCriteriaEntity); + + /** This code is responsible for adding a version history log for the "soft delete evaluation criteria" operation **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldEvaluationCriteriaEntity).newData(evaluationCriteriaEntity).build()); + List list = criteriaFormFieldRepository .findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaEntity.getId()) .stream() @@ -269,13 +274,18 @@ public class CallDao { .forEach(this::softDeleteDocument); List documentEntities = documentReqList.stream() .map(req -> convertToDocumentEntity(req, sourceId)).collect(Collectors.toList()); - documentRepository.saveAll(documentEntities); +// documentRepository.saveAll(documentEntities); return documentEntities; } private void softDeleteDocument(DocumentEntity documentEntity) { + DocumentEntity oldDocumentEntity = Utils.getClonedEntityForData(documentEntity); documentEntity.setIsDeleted(true); - documentRepository.save(documentEntity); + documentEntity = documentRepository.save(documentEntity); + + /** This code is responsible for adding a version history log for the "soft delete for document" operation **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldDocumentEntity).newData(documentEntity).build()); + } @@ -476,8 +486,14 @@ public class CallDao { public CallResponse createCallStep2(CallEntity callEntity, CreateCallRequestStep2 createCallRequest, UserEntity user) { // validateUpdate(callEntity); - setIfUpdated(callEntity::getThreshold, callEntity::setThreshold, createCallRequest.getThreshold()); - callRepository.save(callEntity); + if(createCallRequest.getThreshold() != null && Boolean.FALSE.equals(createCallRequest.getThreshold().equals(callEntity.getThreshold()))) { + CallEntity oldCallEntity = Utils.getClonedEntityForData(callEntity); + setIfUpdated(callEntity::getThreshold, callEntity::setThreshold, createCallRequest.getThreshold()); + callEntity = callRepository.save(callEntity); + + /** This code is responsible for adding a version history log for the "update call step 2" operation **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCallEntity).newData(callEntity).build()); + } convertToEvaluationCriteriaEntities(createCallRequest.getCriteria(), callEntity, LookUpDataTypeEnum.EVALUATION_CRITERIA); convertToDocumentEntities(createCallRequest.getDocs(), callEntity.getId(), DocumentTypeEnum.DOCUMENT); @@ -486,14 +502,6 @@ public class CallDao { updateLookUpData(callEntity, createCallRequest.getCheckList(), LookUpDataTypeEnum.CHECKLIST); -// List faqEntities = faqRepository.findByCallIdAndIsDeletedFalse(callEntity.getId()); -// List amiedTo = callTargetAudienceChecklistRepository -// .findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), LookUpDataTypeEnum.AIMED_TO.getValue()).stream() -// .map(this::convertToLookUpDataResponseBean).toList(); -// createCallResponseBean = assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, -// documentEntities, faqEntities, imageEntities); -// createCallResponseBean.setAimedTo(amiedTo); -// createCallResponseBean.setCheckList(checkList); CallResponse createCallResponseBean = getCallResponseBean(callEntity); createCallResponseBean.setCurrentStep(GepafinConstant.STEP_2); return createCallResponseBean; @@ -535,6 +543,7 @@ public class CallDao { } public CallResponse updateCallStep1(CallEntity callEntity, UpdateCallRequestStep1 updateCallRequest, UserEntity userEntity) { + CallEntity oldCallEntity = Utils.getClonedEntityForData(callEntity); isValidDateRange(updateCallRequest, callEntity); setIfUpdated(callEntity::getName, callEntity::setName, updateCallRequest.getName()); setIfUpdated(callEntity::getDescriptionShort, callEntity::setDescriptionShort, @@ -570,6 +579,11 @@ public class CallDao { setIfUpdated(callEntity::getStartTime, callEntity::setStartTime, DateTimeUtil.parseTime(updateCallRequest.getStartTime())); setIfUpdated(callEntity::getEndTime, callEntity::setEndTime, DateTimeUtil.parseTime(updateCallRequest.getEndTime())); setIfUpdated(callEntity::getConfidi, callEntity::setConfidi, updateCallRequest.getConfidi()); + callEntity = callRepository.save(callEntity); + + /** This code is responsible for adding a version history log for the "update call step 1" operation **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCallEntity).newData(callEntity).build()); + updateLookUpData(callEntity, updateCallRequest.getAimedTo(), LookUpDataTypeEnum.AIMED_TO); updateFaq(updateCallRequest.getFaq(), callEntity, userEntity, LookUpDataTypeEnum.FAQ); CallResponse createCallResponseBean = getCallResponseBean(callEntity); @@ -578,8 +592,14 @@ public class CallDao { } private void softDeleteFaq(FaqEntity faqEntity) { + + FaqEntity oldFaqEntity = Utils.getClonedEntityForData(faqEntity); + faqEntity.setIsDeleted(true); faqRepository.save(faqEntity); + + /** This code is responsible for adding a version history log for the "soft delete faq" operation **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldFaqEntity).newData(faqEntity).build()); } private void updateLookUpData(CallEntity callEntity, List lookupDataReqList, LookUpDataTypeEnum type) { @@ -628,8 +648,12 @@ public class CallDao { private void softDeleteCallTargetAudienceChecklist( CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity) { + CallTargetAudienceChecklistEntity oldCallTargetAudienceChecklistEntity = Utils.getClonedEntityForData(callTargetAudienceChecklistEntity); callTargetAudienceChecklistEntity.setIsDeleted(true); callTargetAudienceChecklistRepository.save(callTargetAudienceChecklistEntity); + + /** This code is responsible for adding a version history log for the "soft delete for aimedTo or Checklist" operation **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.SOFT_DELETE).oldData(oldCallTargetAudienceChecklistEntity).newData(callTargetAudienceChecklistEntity).build()); } public CallDetailsResponseBean convertToCallDetailsResponseBean(CallEntity callEntity) { @@ -741,13 +765,18 @@ public class CallDao { public CallResponse validateCallData(CallEntity callEntity) { + CallEntity oldCallEntity = Utils.getClonedEntityForData(callEntity); validateUpdate(callEntity); CallResponse callResponseBean = getCallResponseBean(callEntity); FlowResponseBean flowResponseBean = flowDao.getFlowByCallId(callEntity.getId()); List formResponseBean = formDao.getFormsByCallId(callEntity); CallValidatorServiceImpl.validateResponse(callResponseBean,flowResponseBean,formResponseBean); callEntity.setStatus(CallStatusEnum.READY_TO_PUBLISH.getValue()); - callRepository.save(callEntity); + callEntity = callRepository.save(callEntity); + + /** This code is responsible for adding a version history log for the "validate call" operation **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCallEntity).newData(callEntity).build()); + callResponseBean.setCurrentStep(GepafinConstant.VALIDATE_REQUEST); callResponseBean.setStatus(CallStatusEnum.valueOf(callEntity.getStatus())); return callResponseBean; @@ -761,10 +790,15 @@ public class CallDao { // } public CallResponse updateCallStatus(CallEntity callEntity, CallStatusEnum statusReq) { + CallEntity oldCallEntity = Utils.getClonedEntityForData(callEntity); CallStatusEnum currentStatus = CallStatusEnum.valueOf(callEntity.getStatus()); validateStatusChange(currentStatus, statusReq); callEntity.setStatus(statusReq.getValue()); callEntity = callRepository.save(callEntity); + + /** This code is responsible for adding a version history log for the "update call status" operation **/ + loggingUtil.addVersionHistory(VersionHistoryRequest.builder().request(request).actionType(VersionActionTypeEnum.UPDATE).oldData(oldCallEntity).newData(callEntity).build()); + return convertToCallResponseBean(callEntity); } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index be56c433..41c76a23 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -3,7 +3,12 @@ package net.gepafin.tendermanagement.enums; import com.fasterxml.jackson.annotation.JsonValue; public enum UserActionContextEnum { - CREATE_CALL("CREATE_CALL"),; + CREATE_CALL_STEP_1("CREATE_CALL_STEP_1"), + UPDATE_CALL_STEP_1("UPDATE_CALL_STEP_1"), + UPDATE_CALL_STEP_2("UPDATE_CALL_STEP_2"), + VALIDATE_CALL("VALIDATE_CALL"), + UPDATE_CALL_STATUS("UPDATE_CALL_STATUS"), + GET_CALL("GET_CALL"); private final String value; diff --git a/src/main/java/net/gepafin/tendermanagement/util/LoggingUtil.java b/src/main/java/net/gepafin/tendermanagement/util/LoggingUtil.java index ecab52e4..fcddb98a 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/LoggingUtil.java +++ b/src/main/java/net/gepafin/tendermanagement/util/LoggingUtil.java @@ -1,10 +1,7 @@ package net.gepafin.tendermanagement.util; -import com.fasterxml.jackson.databind.ObjectMapper; import io.jsonwebtoken.Claims; import jakarta.persistence.Table; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import net.gepafin.tendermanagement.config.CachedBodyHttpServletRequest; import net.gepafin.tendermanagement.config.jwt.TokenProvider; @@ -14,13 +11,11 @@ import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.entities.VersionHistoryEntity; import net.gepafin.tendermanagement.model.request.UserActionRequest; import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; -import net.gepafin.tendermanagement.model.util.LogResponse; import net.gepafin.tendermanagement.repositories.UserActionsRepository; import net.gepafin.tendermanagement.repositories.VersionHistoryRepository; import net.gepafin.tendermanagement.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; import org.springframework.web.context.annotation.RequestScope; @Slf4j diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index 28088304..4171ef8b 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -2,12 +2,10 @@ package net.gepafin.tendermanagement.web.rest.api.impl; import java.util.List; -import lombok.extern.slf4j.Slf4j; import net.gepafin.tendermanagement.enums.CallStatusEnum; import net.gepafin.tendermanagement.enums.UserActionContextEnum; import net.gepafin.tendermanagement.enums.UserActionLogsEnum; import net.gepafin.tendermanagement.model.request.UserActionRequest; -import net.gepafin.tendermanagement.repositories.UserActionsRepository; import net.gepafin.tendermanagement.util.LoggingUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; @@ -45,8 +43,9 @@ public class CallApiController implements CallApi { @Override public ResponseEntity> createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest) { - /** This code is responsible for creating user action logs for the "Create Call" operation. **/ - loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.INSERT).actionContext(UserActionContextEnum.CREATE_CALL).build()); + /** This code is responsible for creating user action logs for the "Create Call Step 1" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.INSERT) + .actionContext(UserActionContextEnum.CREATE_CALL_STEP_1).build()); CallResponse createCallResponseBean = callService.createCallStep1(request, createCallRequest); return ResponseEntity.status(HttpStatus.CREATED) @@ -55,6 +54,11 @@ public class CallApiController implements CallApi { @Override public ResponseEntity> createCallStep2(HttpServletRequest request, Long callId, CreateCallRequestStep2 createCallRequest) { + + /** This code is responsible for creating user action logs for the "Create or update Call step 2" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE) + .actionContext(UserActionContextEnum.UPDATE_CALL_STEP_2).build()); + CallResponse createCallResponseBean = callService.createCallStep2(request, callId, createCallRequest); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_CREATED_SUCCESSFULLY_MSG))); @@ -62,6 +66,11 @@ public class CallApiController implements CallApi { @Override public ResponseEntity> updateCallStep1(HttpServletRequest request, Long callId, UpdateCallRequestStep1 updateCallRequest) { + + /** This code is responsible for creating user action logs for the "update Call step 1" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE) + .actionContext(UserActionContextEnum.UPDATE_CALL_STEP_1).build()); + CallResponse createCallResponseBean = callService.updateCallStep1(request, callId, updateCallRequest); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_UPDATE_SUCCESSFULLY_MSG))); @@ -69,6 +78,11 @@ public class CallApiController implements CallApi { @Override @Transactional(readOnly = true) public ResponseEntity> getCallById(HttpServletRequest request, Long callId,Long companyId) { + + /** This code is responsible for creating user action logs for the "get Call by id" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) + .actionContext(UserActionContextEnum.GET_CALL).build()); + CallResponse createCallResponseBean = callService.getCallById(request, callId,companyId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); @@ -76,6 +90,12 @@ public class CallApiController implements CallApi { @Override public ResponseEntity>> getAllCalls(HttpServletRequest request,Long companyId) { + + + /** This code is responsible for creating user action logs for the "get Calls" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) + .actionContext(UserActionContextEnum.GET_CALL).build()); + List calls = callService.getAllCalls(request,companyId); return ResponseEntity.status(HttpStatus.OK) @@ -84,6 +104,13 @@ public class CallApiController implements CallApi { } @Override public ResponseEntity> validateCallData(HttpServletRequest request, Long callId) { + + + /** This code is responsible for creating user action logs for the "validate Call" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE) + .actionContext(UserActionContextEnum.VALIDATE_CALL).build()); + + CallResponse call = callService.validateCallData(request, callId); return ResponseEntity.status(HttpStatus.OK) @@ -91,11 +118,21 @@ public class CallApiController implements CallApi { } @Override public ResponseEntity> updateCallStatus(HttpServletRequest request, Long callId, CallStatusEnum status) { + + /** This code is responsible for creating user action logs for the "update Call status" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.UPDATE) + .actionContext(UserActionContextEnum.UPDATE_CALL_STATUS).build()); + CallResponse updateCall = callService.updateCallStatus(request, callId, status); return ResponseEntity.ok(new Response<>(updateCall, Status.SUCCESS, Translator.toLocale(GepafinConstant.UPDATE_CALL_STATUS_SUCCESS_MSG))); } @Override public ResponseEntity downloadCallDocumentsAsZip(HttpServletRequest request, Long callId) { + + /** This code is responsible for creating user action logs for the "download Call documents " operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW) + .actionContext(UserActionContextEnum.GET_CALL).build()); + byte[] zipFile = callService.downloadCallDocumentsAsZip(request, callId); HttpHeaders headers = new HttpHeaders();