From 40164bd4a087e11b839ff21af17dc326c6168129 Mon Sep 17 00:00:00 2001 From: piyushkag Date: Tue, 14 Jan 2025 18:43:25 +0530 Subject: [PATCH] Done ticket GEPAFINBE-137 --- .../constants/GepafinConstant.java | 14 ++ .../tendermanagement/dao/ApplicationDao.java | 137 +++++++++++++- .../gepafin/tendermanagement/dao/CallDao.java | 174 ++++++++++++++++-- .../tendermanagement/dao/NotificationDao.java | 125 +++++++++++++ .../enums/UserActionContextEnum.java | 8 +- .../ApplicationPageableRequestBean.java | 14 ++ .../request/CallPageableRequestBean.java | 14 ++ .../model/request/GlobalFilters.java | 18 ++ .../request/NotificationRequestBean.java | 14 ++ .../model/response/PageableResponseBean.java | 13 ++ .../tendermanagement/model/util/SortBy.java | 12 ++ .../repositories/CallRepository.java | 3 +- .../repositories/NotificationRepository.java | 9 +- .../service/ApplicationService.java | 15 +- .../tendermanagement/service/CallService.java | 6 + .../service/NotificationService.java | 5 + .../service/impl/ApplicationServiceImpl.java | 18 +- .../service/impl/CallServiceImpl.java | 10 +- .../service/impl/NotificationServiceImpl.java | 15 ++ .../gepafin/tendermanagement/util/Utils.java | 13 ++ .../web/rest/api/ApplicationApi.java | 24 ++- .../web/rest/api/CallApi.java | 18 +- .../web/rest/api/NotificationApi.java | 14 ++ .../api/impl/ApplicationApiController.java | 18 +- .../web/rest/api/impl/CallApiController.java | 18 +- .../api/impl/NotificationApiController.java | 21 +++ 26 files changed, 697 insertions(+), 53 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/ApplicationPageableRequestBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/CallPageableRequestBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/GlobalFilters.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/NotificationRequestBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/PageableResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/util/SortBy.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 6cce9e90..52a2c8ec 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -354,5 +354,19 @@ public class GepafinConstant { public static final String NOTIFICATION_DELETED_SUCCESSFULLY="notification.deleted.successfully"; public static final String NOTIFICATION_UPDATED_SUCCESSFULLY="notification.updated.successfully"; public static final String USER_WITH_COMPANY_NOT_FOUND = "user.with.company.not.found"; + public static final String STATUS = "status"; + public static final String CALL="call"; + public static final String TITLE="title"; + public static final String MESSAGE="message"; + public static final String HUB_ID="hubId"; + public static final String ID="id"; + public static final String IS_DELETED="isDeleted"; + public static final String COMPANY_ID="companyId"; + public static final String COMMENTS="comments"; + public static final String DESCRIPTION_LONG="descriptionLong"; + public static final String DESCRIPTION_SHORT="descriptionShort"; + public static final String HUB="hub"; + public static final String NAME="name"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 0b0edf19..0c25b277 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -1,18 +1,16 @@ package net.gepafin.tendermanagement.dao; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.Root; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum; import net.gepafin.tendermanagement.enums.*; -import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean; -import net.gepafin.tendermanagement.model.request.ApplicationRequest; -import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; -import net.gepafin.tendermanagement.model.request.EmailLogRequest; -import net.gepafin.tendermanagement.model.request.NotificationReq; -import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.*; +import net.gepafin.tendermanagement.model.util.SortBy; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.service.ApplicationEvaluationService; @@ -37,6 +35,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; @@ -54,6 +54,8 @@ import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import static org.apache.commons.lang3.StringUtils.isEmpty; + @Component public class ApplicationDao { @@ -1349,4 +1351,127 @@ public class ApplicationDao { throw new RuntimeException("Error while creating ZIP file", e); } } + + public PageableResponseBean> getAllApplicationByPagination(UserEntity userEntity, Long callId, Long companyId, ApplicationPageableRequestBean applicationPageableRequestBean) { + Integer pageNo = null; + Integer pageLimit = null; + if (applicationPageableRequestBean.getGlobalFilters() != null) { + pageNo = applicationPageableRequestBean.getGlobalFilters().getPage(); + pageLimit = applicationPageableRequestBean.getGlobalFilters().getLimit(); + } + if (pageLimit == null || pageLimit <= 0) { + pageLimit = GepafinConstant.DEFAULT_PAGE_LIMIT; + } + if (pageNo == null || pageNo <= 0) { + pageNo = GepafinConstant.DEFAULT_PAGE; + } + Specification spec = search(callId, companyId, applicationPageableRequestBean, userEntity); + Page entityPage = applicationRepository.findAll(spec, PageRequest.of(pageNo - 1, pageLimit)); + // Prepare the response + + + List applicationResponses = entityPage.getContent().stream() + .map(application -> { + ApplicationResponse response = getApplicationResponse(application); + return response; + }) + .collect(Collectors.toList()); + + + PageableResponseBean> pageableResponseBean = new PageableResponseBean<>(); + pageableResponseBean.setBody(applicationResponses); + pageableResponseBean.setCurrentPage(entityPage.getNumber() + 1); // Page numbers typically start from 0, so add 1 for user-friendly indexing + pageableResponseBean.setTotalPages(entityPage.getTotalPages()); + pageableResponseBean.setTotalRecords(entityPage.getTotalElements()); + pageableResponseBean.setPageSize(entityPage.getSize()); + + return pageableResponseBean; + } + + public Specification search(Long callId, Long companyId, ApplicationPageableRequestBean applicationPageableRequestBean, UserEntity userEntity) { + return (root, query, criteriaBuilder) -> { + + List predicates = getPredicates(applicationPageableRequestBean, criteriaBuilder, root, callId, companyId, userEntity); + SortBy sortBy = new SortBy(GepafinConstant.CREATED_DATE, true); + + if (applicationPageableRequestBean.getGlobalFilters() != null + && applicationPageableRequestBean.getGlobalFilters().getSortBy() != null && + applicationPageableRequestBean.getGlobalFilters().getSortBy().getColumnName() != null && Boolean.FALSE.equals( + isEmpty(applicationPageableRequestBean.getGlobalFilters().getSortBy().getColumnName()))) { + sortBy.setColumnName(applicationPageableRequestBean.getGlobalFilters().getSortBy().getColumnName()); + sortBy.setSortDesc(true); + if (applicationPageableRequestBean.getGlobalFilters().getSortBy().getSortDesc() != null) { + sortBy.setSortDesc(applicationPageableRequestBean.getGlobalFilters().getSortBy().getSortDesc()); + } + } + + query.orderBy(criteriaBuilder.desc(root.get(sortBy.getColumnName()))); + if (Boolean.FALSE.equals(sortBy.getSortDesc())) { + query.orderBy(criteriaBuilder.asc(root.get(sortBy.getColumnName()))); + } + return query.where(criteriaBuilder.and(predicates.toArray(new Predicate[0]))).getRestriction(); + }; + } + + + private List getPredicates(ApplicationPageableRequestBean applicationPageableRequestBean, + CriteriaBuilder criteriaBuilder, Root root, Long callId, Long companyId, UserEntity userEntity) { + + Integer year = null; + String search = null; + if (applicationPageableRequestBean.getGlobalFilters() != null) { + year = applicationPageableRequestBean.getGlobalFilters().getYear(); + search = applicationPageableRequestBean.getGlobalFilters().getSearch(); + } + List predicates = new ArrayList<>(); + + Boolean isBeneficiary = validator.checkIsBeneficiary(); + if (isBeneficiary) { + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.USER_ID), userEntity.getId())); + } + if (year != null && year > 0) { + int filterYear = applicationPageableRequestBean.getGlobalFilters().getYear(); + +// Create LocalDateTime boundaries for the start and end of the year + LocalDateTime startOfYear = LocalDateTime.of(filterYear, 1, 1, 0, 0); + LocalDateTime endOfYear = LocalDateTime.of(filterYear, 12, 31, 23, 59, 59); + +// Add the range comparison to filter records within the year + predicates.add(criteriaBuilder.between(root.get(GepafinConstant.CREATED_DATE), startOfYear, endOfYear)); + + } + // Search in `title` and `message` (if search term is provided) + if (search != null && !search.isEmpty()) { + Predicate titlePredicate = criteriaBuilder.like( + criteriaBuilder.upper(root.get(GepafinConstant.COMMENTS)), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(titlePredicate)); + } + + // Filter by `status` (if status list is provided) + if (applicationPageableRequestBean.getStatus() != null && !applicationPageableRequestBean.getStatus().isEmpty()) { + List statusValues = applicationPageableRequestBean.getStatus().stream() + .map(ApplicationStatusTypeEnum::name) // Convert enum to string + .toList(); + predicates.add(root.get(GepafinConstant.STATUS).in(statusValues)); + } + + if (callId != null) { + CallEntity call = callService.validateCall(callId); + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.CALL).get(GepafinConstant.ID), callId)); + } + + // Optional companyId filter + if (companyId != null) { + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.COMPANY_ID), companyId)); + } + predicates.add(criteriaBuilder.isFalse(root.get(GepafinConstant.IS_DELETED))); + + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.HUB_ID), userEntity.getHub().getId())); + + + return predicates; + + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 7382f1c6..0f7a9f5a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -12,14 +12,15 @@ import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.*; -import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; -import net.gepafin.tendermanagement.enums.NotificationTypeEnum; -import net.gepafin.tendermanagement.enums.VersionActionTypeEnum; -import net.gepafin.tendermanagement.model.request.NotificationReq; -import net.gepafin.tendermanagement.model.request.VersionHistoryRequest; +import net.gepafin.tendermanagement.enums.*; +import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.*; +import net.gepafin.tendermanagement.model.util.SortBy; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.*; import net.gepafin.tendermanagement.util.DateTimeUtil; @@ -28,6 +29,9 @@ import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; import org.h2.util.IOUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -35,15 +39,6 @@ import org.springframework.util.StringUtils; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; -import net.gepafin.tendermanagement.enums.CallStatusEnum; -import net.gepafin.tendermanagement.enums.DocumentTypeEnum; -import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; -import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; -import net.gepafin.tendermanagement.model.request.DocumentReq; -import net.gepafin.tendermanagement.model.request.EvaluationCriteriaReq; -import net.gepafin.tendermanagement.model.request.FaqReq; -import net.gepafin.tendermanagement.model.request.LookUpDataReq; -import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.service.impl.CallValidatorServiceImpl; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; @@ -51,6 +46,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.Status; import static net.gepafin.tendermanagement.enums.RoleStatusEnum.ROLE_SUPER_ADMIN; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; +import static org.apache.commons.lang3.StringUtils.isEmpty; import static org.hibernate.internal.util.collections.CollectionHelper.listOf; @Component @@ -917,4 +913,154 @@ public class CallDao { return callEntity; } + public PageableResponseBean> getAllCallsByPagination(HttpServletRequest request,UserEntity user,Long companyId , Boolean onlyPreferredCall, CallPageableRequestBean callPageableRequestBean) { + Integer pageNo = null; + Integer pageLimit = null; + if (callPageableRequestBean.getGlobalFilters() != null) { + pageNo = callPageableRequestBean.getGlobalFilters().getPage(); + pageLimit = callPageableRequestBean.getGlobalFilters().getLimit(); + } + if (pageLimit == null || pageLimit <= 0) { + pageLimit = GepafinConstant.DEFAULT_PAGE_LIMIT; + } + if (pageNo == null || pageNo <= 0) { + pageNo = GepafinConstant.DEFAULT_PAGE; + } + if (Boolean.TRUE.equals(onlyPreferredCall) && companyId == null) { + throw new CustomValidationException( + Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.COMPANY_ID_REQUIRED_FOR_PREFERRED_CALL) + ); + } + Specification spec = search(user, callPageableRequestBean); + Page entityPage; + if (Boolean.TRUE.equals(onlyPreferredCall)) { + validator.validateUserWithCompany(request, companyId); + UserWithCompanyEntity userWithCompanyEntity = companyService.getUserWithCompany(user.getId(), companyId); + List preferredCalls = beneficiaryPreferredCallRepository + .findByUserIdAndUserWithCompanyIdAndIsDeletedFalse(user.getId(), userWithCompanyEntity.getId()); + List preferredCallIds = preferredCalls.stream() + .map(BeneficiaryPreferredCallEntity::getCallId) + .collect(Collectors.toList()); + + // Add preferredCallIds filtering to the specification + spec = spec.and((root, query, criteriaBuilder) -> + root.get(GepafinConstant.ID).in(preferredCallIds) + ); + } + entityPage = callRepository.findAll(spec, PageRequest.of(pageNo - 1, pageLimit)); + List callIds=new ArrayList<>(); + if(entityPage!=null && entityPage.getContent()!=null && Boolean.FALSE.equals(entityPage.getContent().isEmpty())) { + callIds = entityPage.getContent().stream().map(CallEntity::getId).collect(Collectors.toList()); + } + Map preferredCallsMap = + getBeneficiaryPreferredCallsForUser(request,user, callIds, companyId); + + List callDetailsResponseBeans = entityPage.getContent().stream() + .map(callEntity -> { + CallDetailsResponseBean responseBean = convertToCallDetailsResponseBean(callEntity); + String key = user.getId() + "_" + callEntity.getId(); + BeneficiaryPreferredCallEntity preferredCall = preferredCallsMap.get(key); + Long preferredId = preferredCall != null ? preferredCall.getId() : null; + responseBean.setPreferredCallId(preferredId); + + return responseBean; + }) + .collect(Collectors.toList()); + + + PageableResponseBean> pageableResponseBean = new PageableResponseBean<>(); + pageableResponseBean.setBody(callDetailsResponseBeans); + pageableResponseBean.setCurrentPage(entityPage.getNumber() + 1); // Page numbers typically start from 0, so add 1 for user-friendly indexing + pageableResponseBean.setTotalPages(entityPage.getTotalPages()); + pageableResponseBean.setTotalRecords(entityPage.getTotalElements()); + pageableResponseBean.setPageSize(entityPage.getSize()); + + return pageableResponseBean; + } + + public Specification search(UserEntity userEntity, CallPageableRequestBean callPageableRequestBean) { + return (root, query, criteriaBuilder) -> { + + List predicates = getPredicates(callPageableRequestBean, criteriaBuilder, root, userEntity); + SortBy sortBy = new SortBy(GepafinConstant.CREATED_DATE, true); + + if (callPageableRequestBean.getGlobalFilters() != null + && callPageableRequestBean.getGlobalFilters().getSortBy() != null && + callPageableRequestBean.getGlobalFilters().getSortBy().getColumnName() != null && Boolean.FALSE.equals( + isEmpty(callPageableRequestBean.getGlobalFilters().getSortBy().getColumnName()))) { + sortBy.setColumnName(callPageableRequestBean.getGlobalFilters().getSortBy().getColumnName()); + sortBy.setSortDesc(true); + if (callPageableRequestBean.getGlobalFilters().getSortBy().getSortDesc() != null) { + sortBy.setSortDesc(callPageableRequestBean.getGlobalFilters().getSortBy().getSortDesc()); + } + } + + query.orderBy(criteriaBuilder.desc(root.get(sortBy.getColumnName()))); + if (Boolean.FALSE.equals(sortBy.getSortDesc())) { + query.orderBy(criteriaBuilder.asc(root.get(sortBy.getColumnName()))); + } + return query.where(criteriaBuilder.and(predicates.toArray(new Predicate[0]))).getRestriction(); + }; + } + + + private List getPredicates(CallPageableRequestBean callPageableRequestBean, + CriteriaBuilder criteriaBuilder, Root root, UserEntity userEntity) { + + Integer year = null; + String search = null; + if (callPageableRequestBean.getGlobalFilters() != null) { + year = callPageableRequestBean.getGlobalFilters().getYear(); + search = callPageableRequestBean.getGlobalFilters().getSearch(); + } + List predicates = new ArrayList<>(); + if (year != null && year > 0) { + int filterYear = callPageableRequestBean.getGlobalFilters().getYear(); + +// Create LocalDateTime boundaries for the start and end of the year + LocalDateTime startOfYear = LocalDateTime.of(filterYear, 1, 1, 0, 0); + LocalDateTime endOfYear = LocalDateTime.of(filterYear, 12, 31, 23, 59, 59); + +// Add the range comparison to filter records within the year + predicates.add(criteriaBuilder.between(root.get(GepafinConstant.CREATED_DATE), startOfYear, endOfYear)); + + } + // Search in `title` and `message` (if search term is provided) + if (search != null && !search.isEmpty()) { + Predicate descriptionShort = criteriaBuilder.like( + criteriaBuilder.upper(root.get(GepafinConstant.DESCRIPTION_SHORT)), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(descriptionShort)); + + Predicate descriptionLong = criteriaBuilder.like( + criteriaBuilder.upper(root.get(GepafinConstant.DESCRIPTION_LONG)), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(descriptionLong)); + + Predicate name = criteriaBuilder.like( + criteriaBuilder.upper(root.get(GepafinConstant.NAME)), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(name)); + + + } + + // Filter by `status` (if status list is provided) + if (callPageableRequestBean.getStatus() != null && !callPageableRequestBean.getStatus().isEmpty()) { + List statusValues = callPageableRequestBean.getStatus().stream() + .map(CallStatusEnum::name) // Convert enum to string + .toList(); + predicates.add(root.get(GepafinConstant.STATUS).in(statusValues)); + } + + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.HUB).get(GepafinConstant.ID), userEntity.getHub().getId())); + + + return predicates; + + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java index 9acacdb0..3944246c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/NotificationDao.java @@ -1,5 +1,9 @@ package net.gepafin.tendermanagement.dao; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.Expression; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; import lombok.extern.slf4j.Slf4j; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; @@ -12,8 +16,12 @@ import net.gepafin.tendermanagement.entities.UserWithCompanyEntity; import net.gepafin.tendermanagement.enums.NotificationEnum; import net.gepafin.tendermanagement.enums.NotificationTypeEnum; import net.gepafin.tendermanagement.enums.RoleStatusEnum; +import net.gepafin.tendermanagement.model.request.GlobalFilters; import net.gepafin.tendermanagement.model.request.NotificationReq; +import net.gepafin.tendermanagement.model.request.NotificationRequestBean; import net.gepafin.tendermanagement.model.response.NotificationResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; +import net.gepafin.tendermanagement.model.util.SortBy; import net.gepafin.tendermanagement.repositories.NotificationRepository; import net.gepafin.tendermanagement.repositories.NotificationTypeRepository; import net.gepafin.tendermanagement.repositories.UserRepository; @@ -23,9 +31,16 @@ import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.opensaml.xmlsec.signature.G; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.domain.Specification; import org.springframework.messaging.simp.SimpMessagingTemplate; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import java.time.LocalDateTime; import java.util.ArrayList; @@ -34,6 +49,7 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import static org.apache.commons.lang3.StringUtils.isEmpty; import static org.hibernate.internal.util.collections.CollectionHelper.listOf; @Component @@ -275,4 +291,113 @@ public class NotificationDao { return notificationEntities.stream().map(this::convertNotificationEntityToNotificationResponse).toList(); } + + public PageableResponseBean> getAllNotification(Long userId, NotificationRequestBean notificationRequestBean) { + Integer pageNo = null; + Integer pageLimit = null; + if (notificationRequestBean.getGlobalFilters() != null) { + pageNo = notificationRequestBean.getGlobalFilters().getPage(); + pageLimit = notificationRequestBean.getGlobalFilters().getLimit(); + } + if (pageLimit == null || pageLimit <= 0) { + pageLimit = GepafinConstant.DEFAULT_PAGE_LIMIT; + } + if (pageNo == null || pageNo <= 0) { + pageNo = GepafinConstant.DEFAULT_PAGE; + } + Specification spec = search(userId, notificationRequestBean); + Page entityPage = notificationRepository.findAll(spec, PageRequest.of(pageNo - 1, pageLimit)); + // Prepare the response + + + List notificationResponses = entityPage.getContent().stream() + .map(notification -> { + NotificationResponse response = convertNotificationEntityToNotificationResponse(notification); + return response; + }) + .collect(Collectors.toList()); + + + PageableResponseBean> pageableResponseBean = new PageableResponseBean<>(); + pageableResponseBean.setBody(notificationResponses); + pageableResponseBean.setCurrentPage(entityPage.getNumber() + 1); // Page numbers typically start from 0, so add 1 for user-friendly indexing + pageableResponseBean.setTotalPages(entityPage.getTotalPages()); + pageableResponseBean.setTotalRecords(entityPage.getTotalElements()); + pageableResponseBean.setPageSize(entityPage.getSize()); + + return pageableResponseBean; + } + + public Specification search(Long userId, NotificationRequestBean notificationRequestBean) { + return (root, query, criteriaBuilder) -> { + + List predicates = getPredicates(notificationRequestBean, criteriaBuilder, root, userId); + SortBy sortBy = new SortBy(GepafinConstant.CREATED_DATE, true); + + if (notificationRequestBean.getGlobalFilters() != null + && notificationRequestBean.getGlobalFilters().getSortBy() != null && + notificationRequestBean.getGlobalFilters().getSortBy().getColumnName() != null && Boolean.FALSE.equals( + isEmpty(notificationRequestBean.getGlobalFilters().getSortBy().getColumnName()))) { + sortBy.setColumnName(notificationRequestBean.getGlobalFilters().getSortBy().getColumnName()); + sortBy.setSortDesc(true); + if (notificationRequestBean.getGlobalFilters().getSortBy().getSortDesc() != null) { + sortBy.setSortDesc(notificationRequestBean.getGlobalFilters().getSortBy().getSortDesc()); + } + } + + query.orderBy(criteriaBuilder.desc(root.get(sortBy.getColumnName()))); + if (Boolean.FALSE.equals(sortBy.getSortDesc())) { + query.orderBy(criteriaBuilder.asc(root.get(sortBy.getColumnName()))); + } + return query.where(criteriaBuilder.and(predicates.toArray(new Predicate[0]))).getRestriction(); + }; + } + + + private List getPredicates(NotificationRequestBean notificationRequestBean, + CriteriaBuilder criteriaBuilder, Root root, Long userId) { + + Integer year = null; + String search = null; + if (notificationRequestBean.getGlobalFilters() != null) { + year = notificationRequestBean.getGlobalFilters().getYear(); + search = notificationRequestBean.getGlobalFilters().getSearch(); + } + List predicates = new ArrayList<>(); + if (year != null && year > 0) { + int filterYear = notificationRequestBean.getGlobalFilters().getYear(); + + // Create LocalDateTime boundaries for the start and end of the year + LocalDateTime startOfYear = LocalDateTime.of(filterYear, 1, 1, 0, 0); + LocalDateTime endOfYear = LocalDateTime.of(filterYear, 12, 31, 23, 59, 59); + + // Add the range comparison to filter records within the year + predicates.add(criteriaBuilder.between(root.get(GepafinConstant.CREATED_DATE), startOfYear, endOfYear)); + + } + // Search in `title` and `message` (if search term is provided) + if (search != null && !search.isEmpty()) { + Predicate titlePredicate = criteriaBuilder.like( + criteriaBuilder.upper(root.get(GepafinConstant.TITLE)), + "%" + search.toUpperCase() + "%" + ); + Predicate messagePredicate = criteriaBuilder.like( + criteriaBuilder.upper(root.get(GepafinConstant.MESSAGE)), + "%" + search.toUpperCase() + "%" + ); + predicates.add(criteriaBuilder.or(titlePredicate, messagePredicate)); + } + + // Filter by `status` (if status list is provided) + if (notificationRequestBean.getStatus() != null && !notificationRequestBean.getStatus().isEmpty()) { + List statusValues = notificationRequestBean.getStatus().stream() + .map(NotificationEnum::name) // Convert enum to string + .toList(); + predicates.add(root.get(GepafinConstant.STATUS).in(statusValues)); + } + predicates.add(criteriaBuilder.isFalse(root.get(GepafinConstant.IS_DELETED))); + + predicates.add(criteriaBuilder.equal(root.get(GepafinConstant.USER_ID), userId)); + return predicates; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java index 20f917fe..2408cb9c 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/UserActionContextEnum.java @@ -161,7 +161,13 @@ public enum UserActionContextEnum { /** appointment action context **/ CHECK_OR_CREATE_NDG_CODE("CHECK_OR_CREATE_NDG_CODE"), CREATE_APPOINTMENT("CREATE_APPOINTMENT"), - UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM("UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM"); + UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM("UPLOAD_DOCUMENT_TO_EXTERNAL_SYSTEM"), + + GET_ALL_NOTIFICATION_BY_PAGINATION("GET_ALL_NOTIFICATION_BY_PAGINATION"), + GET_ALL_CALL_BY_PAGINATION("GET_ALL_CALL_BY_PAGINATION"), + GET_ALL_APPLICATION_BY_PAGINATION("GET_ALL_APPLICATION_BY_PAGINATION"); + + private final String value; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationPageableRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationPageableRequestBean.java new file mode 100644 index 00000000..dcb2aebc --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ApplicationPageableRequestBean.java @@ -0,0 +1,14 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; + +import java.util.List; + +@Data +public class ApplicationPageableRequestBean { + + private GlobalFilters globalFilters; + + private List status; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CallPageableRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/CallPageableRequestBean.java new file mode 100644 index 00000000..8b848c85 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CallPageableRequestBean.java @@ -0,0 +1,14 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.CallStatusEnum; + +import java.util.List; + +@Data +public class CallPageableRequestBean { + + private GlobalFilters globalFilters; + + private List status; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/GlobalFilters.java b/src/main/java/net/gepafin/tendermanagement/model/request/GlobalFilters.java new file mode 100644 index 00000000..d036a68d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/GlobalFilters.java @@ -0,0 +1,18 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.model.util.SortBy; + + +@Data +public class GlobalFilters { + private Integer year; + + private Integer page; + + private String search; + + private Integer limit; + + private SortBy sortBy; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/NotificationRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/NotificationRequestBean.java new file mode 100644 index 00000000..6e8c0389 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/NotificationRequestBean.java @@ -0,0 +1,14 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.NotificationEnum; + +import java.util.List; + +@Data +public class NotificationRequestBean { + + private GlobalFilters globalFilters; + + private List status; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/PageableResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/PageableResponseBean.java new file mode 100644 index 00000000..f4b92929 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/PageableResponseBean.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +@Data +public class PageableResponseBean { + + private T body; + private Long totalRecords; + private int currentPage; + private int totalPages; + private int pageSize; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/util/SortBy.java b/src/main/java/net/gepafin/tendermanagement/model/util/SortBy.java new file mode 100644 index 00000000..5e4032a6 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/util/SortBy.java @@ -0,0 +1,12 @@ +package net.gepafin.tendermanagement.model.util; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class SortBy { + + String columnName; + Boolean sortDesc; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java index 833e1d68..dc53bad7 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.CallEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -9,7 +10,7 @@ import java.math.BigDecimal; import java.util.List; @Repository -public interface CallRepository extends JpaRepository { +public interface CallRepository extends JpaRepository, JpaSpecificationExecutor { // public CallEntity findByIdAndStatusNotIn(Long id, List status); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/NotificationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/NotificationRepository.java index bce3ba68..254547f4 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/NotificationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/NotificationRepository.java @@ -1,12 +1,18 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.NotificationEntity; +import org.apache.poi.ss.formula.functions.T; import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.util.List; -public interface NotificationRepository extends JpaRepository { +public interface NotificationRepository extends JpaRepository , JpaSpecificationExecutor { NotificationEntity findByIdAndIsDeletedFalse(Long id); @@ -17,4 +23,5 @@ public interface NotificationRepository extends JpaRepository findByUserIdAndIsDeletedFalseAndStatusIn(Long userId, List statuses); List findByUserWithCompanyIdAndUserIdAndIsDeletedFalse(Long userWithCompanyId, Long userId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java index 3ab94ae2..24935ca9 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java @@ -2,18 +2,17 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.model.request.ApplicationPageableRequestBean; import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; -import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationResponse; -import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationSignedDocumentResponse; -import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; +import net.gepafin.tendermanagement.model.response.*; import java.util.List; +import net.gepafin.tendermanagement.model.util.Response; +import org.springframework.http.ResponseEntity; import org.springframework.web.multipart.MultipartFile; public interface ApplicationService { @@ -41,5 +40,9 @@ public interface ApplicationService { public void deleteSignedDocument(HttpServletRequest request, Long applicationId); public ApplicationResponse validateApplication(HttpServletRequest request, Long applicationId); + byte[] downloadApplicationDocumentsAsZip(HttpServletRequest request, Long applicationId); -} + + PageableResponseBean> getAllApplicationByPagination(HttpServletRequest request, Long callId, Long companyId, ApplicationPageableRequestBean applicationPageableRequestBean); + + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index 8762d576..b12a3398 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -5,11 +5,13 @@ import java.util.List; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.enums.CallStatusEnum; +import net.gepafin.tendermanagement.model.request.CallPageableRequestBean; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; import net.gepafin.tendermanagement.model.response.CallResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; public interface CallService { @@ -30,5 +32,9 @@ public interface CallService { CallEntity validateCall(Long callId); CallEntity validatePublishedCall(Long callId, Long hubId); + byte[] downloadCallDocumentsAsZip(HttpServletRequest request, Long callId); + + PageableResponseBean> getAllCallsByPagination(HttpServletRequest request, Long companyId , Boolean onlyPreferredCall,CallPageableRequestBean callPageableRequestBean); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/NotificationService.java b/src/main/java/net/gepafin/tendermanagement/service/NotificationService.java index ca5927c0..940d753e 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/NotificationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/NotificationService.java @@ -2,8 +2,12 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.enums.NotificationEnum; +import net.gepafin.tendermanagement.model.request.GlobalFilters; import net.gepafin.tendermanagement.model.request.NotificationReq; +import net.gepafin.tendermanagement.model.request.NotificationRequestBean; import net.gepafin.tendermanagement.model.response.NotificationResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; +import org.springframework.data.domain.Page; import java.util.List; @@ -20,4 +24,5 @@ public interface NotificationService { public List getNotificationsByCompanyIdAndUserId(Long userId, Long companyId, List statuses); + PageableResponseBean> getAllNotification(HttpServletRequest request,Long userId, NotificationRequestBean notificationRequestBean); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java index 6a3d827b..c5d937a2 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -8,15 +8,12 @@ import net.gepafin.tendermanagement.dao.FlowFormDao; import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.CompanyEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.model.request.ApplicationPageableRequestBean; import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; -import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationResponse; -import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationSignedDocumentResponse; -import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; @@ -128,5 +125,14 @@ public class ApplicationServiceImpl implements ApplicationService { public byte[] downloadApplicationDocumentsAsZip(HttpServletRequest request, Long applicationId) { return applicationDao.downloadApplicationDocumentsAsZip(request,applicationId); } - + + @Override + public PageableResponseBean> getAllApplicationByPagination(HttpServletRequest request, Long callId, Long companyId, ApplicationPageableRequestBean applicationPageableRequestBean) { + UserEntity userEntity = validator.validateUser(request); + if (companyId != null) { + validator.validateUserWithCompany(request, companyId); + } + return applicationDao.getAllApplicationByPagination(userEntity,callId,companyId,applicationPageableRequestBean); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index 38fd9562..07823f1c 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -5,11 +5,13 @@ import net.gepafin.tendermanagement.dao.CallDao; import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.CallStatusEnum; +import net.gepafin.tendermanagement.model.request.CallPageableRequestBean; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; import net.gepafin.tendermanagement.model.response.CallResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.util.Validator; @@ -102,5 +104,11 @@ public class CallServiceImpl implements CallService { validator.validateUserWithCall(user, callId); return callDao.downloadCallDocumentsAsZip(callId); } - + + @Override + public PageableResponseBean> getAllCallsByPagination(HttpServletRequest request,Long companyId , Boolean onlyPreferredCall, CallPageableRequestBean callPageableRequestBean) { + UserEntity user = validator.validateUser(request); + return callDao.getAllCallsByPagination(request,user,companyId,onlyPreferredCall,callPageableRequestBean); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/NotificationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/NotificationServiceImpl.java index 86eaa5cf..bb9f167d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/NotificationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/NotificationServiceImpl.java @@ -3,11 +3,17 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import net.gepafin.tendermanagement.dao.NotificationDao; +import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.NotificationEnum; +import net.gepafin.tendermanagement.model.request.GlobalFilters; import net.gepafin.tendermanagement.model.request.NotificationReq; +import net.gepafin.tendermanagement.model.request.NotificationRequestBean; import net.gepafin.tendermanagement.model.response.NotificationResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import net.gepafin.tendermanagement.service.NotificationService; +import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import java.util.List; @@ -21,6 +27,9 @@ public class NotificationServiceImpl implements NotificationService { @Autowired private NotificationDao notificationDao; + @Autowired + private Validator validator; + @Override public NotificationResponse sendNotification(Long userId, NotificationReq notificationReq, Long companyId) { @@ -59,4 +68,10 @@ public class NotificationServiceImpl implements NotificationService { public List getNotificationsByCompanyIdAndUserId(Long userId, Long companyId, List statuses) { return notificationDao.getNotificationByCompanyIdAndUserId(userId, companyId, statuses); } + + @Override + public PageableResponseBean> getAllNotification(HttpServletRequest request, Long userId, NotificationRequestBean notificationRequestBean) { + UserEntity userEntity = validator.validateUser(request); + return notificationDao.getAllNotification(userId,notificationRequestBean); + } } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index b126e6dd..e1df59bf 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -25,6 +25,7 @@ import jakarta.persistence.OneToMany; import jakarta.persistence.OneToOne; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.GlobalFilters; import org.apache.commons.collections4.MapUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -690,4 +691,16 @@ public class Utils { public static String createChannelForUserAndCompany(Long userId, Long companyId) { return GepafinConstant.COMMON_SINGLE_CHANNEL_PREFIX + userId + GepafinConstant.COMPANY_PREFIX + companyId; } + public static GlobalFilters setPageNumberAndLimit(GlobalFilters globalFilters){ + if (globalFilters == null) { + if (globalFilters.getLimit() == null || globalFilters.getLimit() <= 0) { + globalFilters.setLimit(GepafinConstant.DEFAULT_PAGE_LIMIT); + } + + if (globalFilters.getPage() == null || globalFilters.getPage() <= 0) { + globalFilters.setPage(GepafinConstant.DEFAULT_PAGE); + } + } + return globalFilters; + } } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java index d72f4daf..6b98b3f3 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java @@ -2,6 +2,9 @@ package net.gepafin.tendermanagement.web.rest.api; import java.util.List; +import net.gepafin.tendermanagement.model.request.ApplicationPageableRequestBean; +import net.gepafin.tendermanagement.model.request.NotificationRequestBean; +import net.gepafin.tendermanagement.model.response.*; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; @@ -19,12 +22,6 @@ import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; -import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationResponse; -import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationSignedDocumentResponse; -import net.gepafin.tendermanagement.model.response.CompanyDelegationResponse; -import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; @@ -59,7 +56,7 @@ public interface ApplicationApi { @GetMapping(value = "/{applicationId}", produces = "application/json") ResponseEntity> getApplicationByFormId(HttpServletRequest request, @Parameter(description = "The application id", required = true) @PathVariable(value = "applicationId", required = true) Long applicationId,@Parameter(description = "The form id", required = false) @RequestParam(value = "formId",required = false) Long formId); - @Operation(summary = "Api to get all applications", + @Operation(summary = "Api to get all applications (deprecated)", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -213,5 +210,18 @@ public interface ApplicationApi { @GetMapping(value = "/{applicationId}/documents/zip") ResponseEntity downloadApplicationDocumentsAsZip(HttpServletRequest httpServletRequest, @Parameter(required = true) @PathVariable("applicationId") Long applicationId); + + + @Operation(summary = "Api to get all application by pagination.", responses = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = @ExampleObject(value = + ErrorConstants.NOTFOUND_ERROR_EXAMPLE))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = @ExampleObject(value = + ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE))), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = @ExampleObject(value = + ErrorConstants.BADREQUEST_ERROR_EXAMPLE))) }) + @PostMapping( value = "/pagination", consumes = "application/json", produces = "application/json") + ResponseEntity>>> getAllApplicationByPagination(HttpServletRequest request,@Parameter(description = "The call id", required = false) @RequestParam(value = "callId", required = false) Long callId, + @Parameter(description = "The company id", required = false) @RequestParam(value = "companyId", required = false) Long companyId, @RequestBody ApplicationPageableRequestBean applicationPageableRequestBean); + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index 5a7d0384..e14ed8e7 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -3,6 +3,9 @@ package net.gepafin.tendermanagement.web.rest.api; import java.util.List; import net.gepafin.tendermanagement.enums.CallStatusEnum; +import net.gepafin.tendermanagement.model.request.CallPageableRequestBean; +import net.gepafin.tendermanagement.model.response.ApplicationResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -89,7 +92,7 @@ public interface CallApi { @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId,@RequestParam(value = "companyId", required = false) Long companyId); - @Operation(summary = "Api to get all calls", + @Operation(summary = "Api to get all calls (deprecated)", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -149,4 +152,17 @@ public interface CallApi { ResponseEntity downloadCallDocumentsAsZip(HttpServletRequest httpServletRequest, @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId); + + @Operation(summary = "Api to get all calls by pagination.", responses = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = @ExampleObject(value = + ErrorConstants.NOTFOUND_ERROR_EXAMPLE))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = @ExampleObject(value = + ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE))), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = @ExampleObject(value = + ErrorConstants.BADREQUEST_ERROR_EXAMPLE))) }) + @PostMapping(value = "/pagination", consumes = "application/json", produces = "application/json") + ResponseEntity>>> getAllCallsByPagination(HttpServletRequest request,@RequestParam(value = "companyId", required = false) Long companyId , @RequestParam(value = "onlyPreferredCall", required = false, defaultValue = "false") Boolean onlyPreferredCall, @RequestBody CallPageableRequestBean callPageableRequestBean); + + + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/NotificationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/NotificationApi.java index ca059499..44bc0e84 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/NotificationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/NotificationApi.java @@ -7,10 +7,14 @@ import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.enums.NotificationEnum; +import net.gepafin.tendermanagement.model.request.GlobalFilters; import net.gepafin.tendermanagement.model.request.NotificationReq; +import net.gepafin.tendermanagement.model.request.NotificationRequestBean; import net.gepafin.tendermanagement.model.response.NotificationResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.data.domain.Page; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; @@ -96,6 +100,16 @@ public interface NotificationApi { @Parameter(description = "The company ID", required = true) @PathVariable(value = "companyId") Long companyId, @Parameter(description = "The notification status", required = false) @RequestParam(value = "status", required = false) List statuses); + @Operation(summary = "Api to get all notification by pagination.", responses = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = @ExampleObject(value = + ErrorConstants.NOTFOUND_ERROR_EXAMPLE))), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = @ExampleObject(value = + ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE))), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = @ExampleObject(value = + ErrorConstants.BADREQUEST_ERROR_EXAMPLE))) }) + @PostMapping(value = "/user/{userId}/pagination", consumes = "application/json", produces = "application/json") + ResponseEntity>>> getAllNotification(HttpServletRequest request,@Parameter(description = "The user id", required = true) @PathVariable(value = "userId") Long userId, @RequestBody NotificationRequestBean notificationRequestBean); + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java index 3223dda7..ccf386c7 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java @@ -5,16 +5,13 @@ 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.ApplicationPageableRequestBean; import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.request.UserActionRequest; -import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationResponse; -import net.gepafin.tendermanagement.model.response.ApplicationResponseBean; -import net.gepafin.tendermanagement.model.response.ApplicationSignedDocumentResponse; -import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; +import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.PdfService; @@ -229,4 +226,15 @@ public class ApplicationApiController implements ApplicationApi { return new ResponseEntity<>(zipFile, headers, HttpStatus.OK); } + @Override + public ResponseEntity>>> getAllApplicationByPagination(HttpServletRequest request, Long callId, Long companyId, ApplicationPageableRequestBean applicationPageableRequestBean) { + + /** This code is responsible for creating user action logs for the "get all notification by pagination" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_ALL_APPLICATION_BY_PAGINATION).build()); + + PageableResponseBean> pageableResponseBean=applicationService + .getAllApplicationByPagination(request, callId,companyId,applicationPageableRequestBean); + return ResponseEntity.status(HttpStatus.OK).body(new Response<>(pageableResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG))); + } + } 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 18d2657f..85de9a1c 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 @@ -5,7 +5,8 @@ import java.util.List; 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.model.request.*; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import net.gepafin.tendermanagement.util.LoggingUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; @@ -14,14 +15,12 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; -import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; -import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; import net.gepafin.tendermanagement.model.response.CallResponse; import net.gepafin.tendermanagement.model.util.Response; @@ -151,5 +150,16 @@ public class CallApiController implements CallApi { return new ResponseEntity<>(zipFile, headers, HttpStatus.OK); } + @Override + public ResponseEntity>>> getAllCallsByPagination(HttpServletRequest request, Long companyId , Boolean onlyPreferredCall, CallPageableRequestBean callPageableRequestBean) { + + /** This code is responsible for creating user action logs for the "get all call by pagination" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_ALL_CALL_BY_PAGINATION).build()); + + PageableResponseBean> callsByPagination=callService.getAllCallsByPagination(request,companyId,onlyPreferredCall,callPageableRequestBean); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(callsByPagination, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); + } + } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/NotificationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/NotificationApiController.java index d2047d7a..549b6517 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/NotificationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/NotificationApiController.java @@ -4,13 +4,21 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.enums.NotificationEnum; +import net.gepafin.tendermanagement.enums.UserActionContextEnum; +import net.gepafin.tendermanagement.enums.UserActionLogsEnum; +import net.gepafin.tendermanagement.model.request.GlobalFilters; import net.gepafin.tendermanagement.model.request.NotificationReq; +import net.gepafin.tendermanagement.model.request.NotificationRequestBean; +import net.gepafin.tendermanagement.model.request.UserActionRequest; import net.gepafin.tendermanagement.model.response.NotificationResponse; +import net.gepafin.tendermanagement.model.response.PageableResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.NotificationService; +import net.gepafin.tendermanagement.util.LoggingUtil; import net.gepafin.tendermanagement.web.rest.api.NotificationApi; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; @@ -25,6 +33,9 @@ public class NotificationApiController implements NotificationApi { @Autowired private NotificationService notificationService; + @Autowired + LoggingUtil loggingUtil; + public ResponseEntity> sendNotification(HttpServletRequest request, NotificationReq notificationReq, Long userId, Long companyId) { NotificationResponse notificationData = notificationService.sendNotification(userId, notificationReq, companyId); @@ -71,4 +82,14 @@ public class NotificationApiController implements NotificationApi { .body(new Response<>(notificationResponses, Status.SUCCESS, Translator.toLocale(GepafinConstant.NOTIFICATION_FETCHED_SUCCESSFULLY))); } + @Override + public ResponseEntity>>> getAllNotification(HttpServletRequest request,Long userId, NotificationRequestBean notificationRequestBean) { + + /** This code is responsible for creating user action logs for the "get all notification by pagination" operation. **/ + loggingUtil.logUserAction(UserActionRequest.builder().request(request).actionType(UserActionLogsEnum.VIEW).actionContext(UserActionContextEnum.GET_ALL_NOTIFICATION_BY_PAGINATION).build()); + + PageableResponseBean> notificationResponses=notificationService.getAllNotification(request, userId,notificationRequestBean); + return ResponseEntity.status(HttpStatus.OK).body(new Response<>(notificationResponses, Status.SUCCESS, Translator.toLocale(GepafinConstant.NOTIFICATION_FETCHED_SUCCESSFULLY))); + } + } \ No newline at end of file