From f2a206991fe37ef063890e74544f4948cb12961a Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 25 Sep 2024 17:37:34 +0530 Subject: [PATCH 01/47] Add hubid for user --- .../constants/GepafinConstant.java | 6 + .../gepafin/tendermanagement/dao/HubDao.java | 92 +++++++++++++ .../gepafin/tendermanagement/dao/UserDao.java | 27 +++- .../tendermanagement/entities/HubEntity.java | 46 +++++++ .../entities/HubUserEntity.java | 22 +++ .../entities/UserHubEntity.java | 24 ++++ .../model/request/HubReq.java | 38 ++++++ .../model/response/HubResponseBean.java | 34 +++++ .../model/util/NanoIdUtils.java | 129 ++++++++++++++++++ .../repositories/HubRepository.java | 10 ++ .../repositories/UserHubRepository.java | 12 ++ .../tendermanagement/service/HubService.java | 16 +++ .../tendermanagement/service/UserService.java | 4 + .../service/impl/HubServiceImpl.java | 48 +++++++ .../service/impl/UserServiceImpl.java | 12 ++ .../tendermanagement/web/rest/api/HubApi.java | 100 ++++++++++++++ .../web/rest/api/UserApi.java | 32 +++++ .../web/rest/api/impl/HubApiController.java | 80 +++++++++++ .../web/rest/api/impl/UserApiController.java | 18 +++ .../db/changelog/db.changelog-1.0.0.xml | 53 +++++++ src/main/resources/message_en.properties | 9 ++ src/main/resources/message_it.properties | 7 + 22 files changed, 818 insertions(+), 1 deletion(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/HubDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/HubUserEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/UserHubEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/HubReq.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/HubResponseBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/util/NanoIdUtils.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/HubRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/UserHubRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/HubService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/HubServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/HubApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/HubApiController.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 395d883c..4a7560e5 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -157,4 +157,10 @@ public class GepafinConstant { public static final String IS_PIVA="isPIVA"; public static final String FAILED_RETAIN_FIELD="failed.retain.field"; + public static final String HUB_CREATE_SUCCESS = "hub_create_success"; + public static final String HUB_UPDATE_SUCCESS = "hub_update_success"; + public static final String HUB_GET_SUCCESS = "hub_get_success"; + public static final String HUB_GET_ALL_SUCCESS = "hub_get_all_success"; + public static final String HUB_DELETE_SUCCESS = "hub_delete_success"; + public static final String HUB_NOT_FOUND = "hub_not_found"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java b/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java new file mode 100644 index 00000000..3304b481 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java @@ -0,0 +1,92 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.HubEntity; +import net.gepafin.tendermanagement.model.request.HubReq; +import net.gepafin.tendermanagement.model.response.HubResponseBean; +import net.gepafin.tendermanagement.model.util.NanoIdUtils; +import net.gepafin.tendermanagement.repositories.HubRepository; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.UUID; + + +@Component +public class HubDao { + + @Autowired + private HubRepository hubRepository; + + public HubResponseBean createHub(HubReq hubReq) { + HubEntity hubEntity = createOrUpdateHubEntity(new HubEntity(), hubReq); + hubRepository.save(hubEntity); + return convertToHubResponseBean(hubEntity); + } + + public HubResponseBean updateHub(Long hubId, HubReq hubReq) { + HubEntity hubEntity = validateHub(hubId); + createOrUpdateHubEntity(hubEntity, hubReq); + return convertToHubResponseBean(hubEntity); + } + + public HubResponseBean getHubById(Long hubId) { + return convertToHubResponseBean(validateHub(hubId)); + } + + public List getAllHubs() { + List hubs = hubRepository.findAll(); + return hubs.stream().map(this::convertToHubResponseBean).toList(); + } + + public void deleteHub(Long hubId) { + HubEntity hubEntity = validateHub(hubId); + hubRepository.deleteById(hubId); + hubRepository.save(hubEntity); + } + + private HubEntity validateHub(Long hubId) { + return hubRepository.findById(hubId) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.HUB_NOT_FOUND))); + } + + private HubEntity createOrUpdateHubEntity(HubEntity hubEntity, HubReq hubReq) { + hubEntity.setCompanyName(hubReq.getCompanyName()); + hubEntity.setFirstName(hubReq.getFirstName()); + hubEntity.setLastName(hubReq.getLastName()); + hubEntity.setEmail(hubReq.getEmail()); + hubEntity.setCity(hubReq.getCity()); + hubEntity.setCountry(hubReq.getCountry()); + hubEntity.setVatNumber(hubReq.getVatNumber()); + hubEntity.setUniqueUuid(NanoIdUtils.randomNanoId()); + hubEntity.setDomainName(hubReq.getDomainName()); + hubEntity.setAppConfig(hubReq.getAppConfig() != null ? hubReq.getAppConfig().toString() : null); + hubEntity.setCreatedDate(hubEntity.getCreatedDate() == null ? LocalDateTime.now() : hubEntity.getCreatedDate()); + hubEntity.setUpdatedDate(LocalDateTime.now()); + return hubEntity; + } + + private HubResponseBean convertToHubResponseBean(HubEntity hubEntity) { + HubResponseBean responseBean = new HubResponseBean(); + responseBean.setId(hubEntity.getId()); + responseBean.setCompanyName(hubEntity.getCompanyName()); + responseBean.setFirstName(hubEntity.getFirstName()); + responseBean.setLastName(hubEntity.getLastName()); + responseBean.setEmail(hubEntity.getEmail()); + responseBean.setCity(hubEntity.getCity()); + responseBean.setCountry(hubEntity.getCountry()); + responseBean.setVatNumber(hubEntity.getVatNumber()); + responseBean.setUniqueUuid(hubEntity.getUniqueUuid()); + responseBean.setDomainName(hubEntity.getDomainName()); + responseBean.setAppConfig(hubEntity.getAppConfig()); + responseBean.setCreatedDate(hubEntity.getCreatedDate()); + responseBean.setUpdatedDate(hubEntity.getUpdatedDate()); + return responseBean; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 81033b05..8defef0a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -6,11 +6,13 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.entities.UserHubEntity; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; +import net.gepafin.tendermanagement.repositories.UserHubRepository; import net.gepafin.tendermanagement.repositories.UserRepository; import net.gepafin.tendermanagement.service.impl.AuthenticationService; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; @@ -22,7 +24,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Repository; import java.security.SecureRandom; +import java.util.ArrayList; import java.util.Base64; +import java.util.List; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; @@ -39,7 +43,8 @@ public class UserDao { @Autowired private PasswordEncoder passwordEncoder; - + @Autowired + private UserHubRepository userHubRepository; @Autowired private RoleDao roleDao; @@ -226,5 +231,25 @@ public class UserDao { log.info("User status updated to {} for user ID: {}", statusReq, userId); return convertUserEntityToUserResponse(userEntity); } + public List getUserByHubId(String hubId) { + log.info("Fetching users for hub ID: {}", hubId); + List userHubMappings = userHubRepository.findByHubId(hubId); + List userResponseBeans = new ArrayList<>(); + for (UserHubEntity mapping : userHubMappings) { + UserEntity userEntity = validateUser(mapping.getUserId()); + userResponseBeans.add(convertUserEntityToUserResponse(userEntity)); + } + return userResponseBeans; + } + public UserResponseBean createUserByHubId(String hubId, UserReq userReq) { + log.info("Creating user for hub ID: {}", hubId); + UserResponseBean createdUser = createUser(userReq); + UserHubEntity mapping = new UserHubEntity(); + mapping.setHubId(hubId); + mapping.setUserId(createdUser.getId()); + userHubRepository.save(mapping); + log.info("User created and mapped to hub ID: {} with User ID: {}", hubId, createdUser.getId()); + return createdUser; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java new file mode 100644 index 00000000..e6cb9301 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java @@ -0,0 +1,46 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; + + +@Entity +@Table(name="hub") +@Setter +@Getter +public class HubEntity extends BaseEntity{ + + + @Column(name = "COMPANY_NAME", length = 255,nullable = false) + private String companyName; + + @Column(name = "FIRST_NAME", length = 255) + private String firstName; + + @Column(name = "LAST_NAME", length = 255) + private String lastName; + + @Column(name = "EMAIL", length = 255,nullable = false) + private String email; + + @Column(name = "CITY", length = 255) + private String city; + + @Column(name = "COUNTRY", length = 255, nullable = false) + private String country; + + @Size(min=5,max=15) + @Column(name = "VAT_NUMBER", length = 255,nullable = false, unique = true) + private String vatNumber; + + @Column(name = "DOMAIN_NAME", length = 255) + private String domainName; + + @Column(name = "APP_CONFIG", columnDefinition = "TEXT") + private String appConfig; + + @Column(name = "UNIQUE_UUID", length = 255,nullable = false, unique = true) + private String uniqueUuid; +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/HubUserEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/HubUserEntity.java new file mode 100644 index 00000000..1bec68ce --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/HubUserEntity.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "hub_user") +@Getter +@Setter +public class HubUserEntity extends BaseEntity{ + + @ManyToOne + @JoinColumn(name = "hub_id", nullable = false) + private HubEntity hub; + + @ManyToOne + @JoinColumn(name = "user_id", nullable = false) + private UserEntity user; + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/UserHubEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/UserHubEntity.java new file mode 100644 index 00000000..8534218e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/UserHubEntity.java @@ -0,0 +1,24 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Entity +@Table(name = "USER_HUB") +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class UserHubEntity extends BaseEntity { + + @Column(name = "hub_id") + private String hubId; + + @Column(name = "user_id") + private Long userId; + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/HubReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/HubReq.java new file mode 100644 index 00000000..123c84fc --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/HubReq.java @@ -0,0 +1,38 @@ +package net.gepafin.tendermanagement.model.request; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.Getter; +import lombok.Setter; + +import java.util.Map; + + +@Getter +@Setter +public class HubReq { + + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private Long id; + + private String companyName; + + private String firstName; + + private String lastName; + + private String email; + + private String city; + + private String country; + + private String vatNumber; + + private String domainName; + + private Map appConfig; + + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private String uniqueUuid; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/HubResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/HubResponseBean.java new file mode 100644 index 00000000..881cdb8e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/HubResponseBean.java @@ -0,0 +1,34 @@ +package net.gepafin.tendermanagement.model.response; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; +import net.gepafin.tendermanagement.model.BaseBean; + +import java.util.Map; +@Getter +@Setter +public class HubResponseBean extends BaseBean { + + private String companyName; + + private String firstName; + + private String lastName; + + private String email; + + private String city; + + private String country; + + private String vatNumber; + + private String appConfig; + + private String domainName; + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private String uniqueUuid; + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/util/NanoIdUtils.java b/src/main/java/net/gepafin/tendermanagement/model/util/NanoIdUtils.java new file mode 100644 index 00000000..f2a8d5e7 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/util/NanoIdUtils.java @@ -0,0 +1,129 @@ +/** + * Copyright (c) 2017 The JNanoID Authors + * Copyright (c) 2017 Aventrix LLC + * Copyright (c) 2017 Andrey Sitnik + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package net.gepafin.tendermanagement.model.util; + +import java.security.SecureRandom; +import java.util.Random; + + +public final class NanoIdUtils { + + /** + * NanoIdUtils instances should NOT be constructed in standard programming. + * Instead, the class should be used as NanoIdUtils.randomNanoId();. + */ + private NanoIdUtils() { + //Do Nothing + } + + /** + * The default random number generator used by this class. + * Creates cryptographically strong NanoId Strings. + */ + public static final SecureRandom DEFAULT_NUMBER_GENERATOR = new SecureRandom(); + + /** + * The default alphabet used by this class. + * Creates url-friendly NanoId Strings using 64 unique symbols. + */ + public static final char[] DEFAULT_ALPHABET = + "_-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); + + /** + * The default size used by this class. + * Creates NanoId Strings with slightly more unique values than UUID v4. + */ + public static final int DEFAULT_SIZE = 21; + + /** + * Static factory to retrieve a url-friendly, pseudo randomly generated, NanoId String. + * + * The generated NanoId String will have 21 symbols. + * + * The NanoId String is generated using a cryptographically strong pseudo random number + * generator. + * + * @return A randomly generated NanoId String. + */ + public static String randomNanoId() { + return randomNanoId(DEFAULT_NUMBER_GENERATOR, DEFAULT_ALPHABET, DEFAULT_SIZE); + } + + /** + * Static factory to retrieve a NanoId String. + * + * The string is generated using the given random number generator. + * + * @param random The random number generator. + * @param alphabet The symbols used in the NanoId String. + * @param size The number of symbols in the NanoId String. + * @return A randomly generated NanoId String. + */ + public static String randomNanoId(final Random random, final char[] alphabet, final int size) { + + if (random == null) { + throw new IllegalArgumentException("random cannot be null."); + } + + if (alphabet == null) { + throw new IllegalArgumentException("alphabet cannot be null."); + } + + if (alphabet.length == 0 || alphabet.length >= 256) { + throw new IllegalArgumentException("alphabet must contain between 1 and 255 symbols."); + } + + if (size <= 0) { + throw new IllegalArgumentException("size must be greater than zero."); + } + + double value = (double) (alphabet.length - 1); + + final int mask = (2 << (int) Math.floor(Math.log(value) / Math.log(2))) - 1; + final int step = (int) Math.ceil(1.6 * mask * size / alphabet.length); + + final StringBuilder idBuilder = new StringBuilder(); + + while (true) { + + final byte[] bytes = new byte[step]; + random.nextBytes(bytes); + + for (int i = 0; i < step; i++) { + + final int alphabetIndex = bytes[i] & mask; + + if (alphabetIndex < alphabet.length) { + idBuilder.append(alphabet[alphabetIndex]); + if (idBuilder.length() == size) { + return idBuilder.toString(); + } + } + + } + + } + + } +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/HubRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/HubRepository.java new file mode 100644 index 00000000..36c3cf06 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/HubRepository.java @@ -0,0 +1,10 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.HubEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface HubRepository extends JpaRepository { + +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserHubRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserHubRepository.java new file mode 100644 index 00000000..2976ab0a --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserHubRepository.java @@ -0,0 +1,12 @@ +package net.gepafin.tendermanagement.repositories; + + + import net.gepafin.tendermanagement.entities.UserHubEntity; + import org.springframework.data.jpa.repository.JpaRepository; + + import java.util.List; + +public interface UserHubRepository extends JpaRepository { + List findByHubId(String hubId); + UserHubEntity findByHubIdAndUserId(String hubId, Long userId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/HubService.java b/src/main/java/net/gepafin/tendermanagement/service/HubService.java new file mode 100644 index 00000000..d04142a5 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/HubService.java @@ -0,0 +1,16 @@ +package net.gepafin.tendermanagement.service; + + +import net.gepafin.tendermanagement.model.request.HubReq; +import net.gepafin.tendermanagement.model.response.HubResponseBean; +import net.gepafin.tendermanagement.model.util.Response; + +import java.util.List; + +public interface HubService { + HubResponseBean createHub(HubReq hubReq); + HubResponseBean updateHub(Long hubId, HubReq hubReq); + HubResponseBean getHubById(Long hubId); + List getAllHubs(); + void deleteHub(Long hubId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/UserService.java b/src/main/java/net/gepafin/tendermanagement/service/UserService.java index f925d7dd..ca43b635 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/UserService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/UserService.java @@ -11,6 +11,8 @@ import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; +import java.util.List; + public interface UserService { UserResponseBean createUser(UserReq userReq); @@ -35,4 +37,6 @@ public interface UserService { UserResponseBean updateUserStatus(Long userId, UserStatusEnum statusReq); UserResponseBean getValidUser(HttpServletRequest request); + List getUserByHubId(String hubId); + UserResponseBean createUserByHubId(String hubId, UserReq userReq); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/HubServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/HubServiceImpl.java new file mode 100644 index 00000000..795cf6fc --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/HubServiceImpl.java @@ -0,0 +1,48 @@ +package net.gepafin.tendermanagement.service.impl; + +import net.gepafin.tendermanagement.dao.HubDao; +import net.gepafin.tendermanagement.model.request.HubReq; +import net.gepafin.tendermanagement.model.response.HubResponseBean; +import net.gepafin.tendermanagement.service.HubService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +public class HubServiceImpl implements HubService { + + @Autowired + private HubDao hubDao; + + @Override + @Transactional(rollbackFor = Exception.class) + public HubResponseBean createHub(HubReq hubReq) { + return hubDao.createHub(hubReq); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public HubResponseBean updateHub(Long hubId, HubReq hubReq) { + return hubDao.updateHub(hubId, hubReq); + } + + @Override + @Transactional(readOnly = true) + public HubResponseBean getHubById(Long hubId) { + return hubDao.getHubById(hubId); + } + + @Override + @Transactional(readOnly = true) + public List getAllHubs() { + return hubDao.getAllHubs(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteHub(Long hubId) { + hubDao.deleteHub(hubId); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java index 9dc8378e..7b949008 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java @@ -17,6 +17,7 @@ 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.Map; @@ -93,4 +94,15 @@ public class UserServiceImpl implements UserService { UserEntity user=tokenProvider.validateUser(userInfo); return userDao.getUserById(user.getId()); } + @Override + @Transactional(readOnly = true) + public List getUserByHubId(String hubId) { + return userDao.getUserByHubId(hubId); + } + @Override + @Transactional(rollbackFor = Exception.class) + public UserResponseBean createUserByHubId(String hubId, UserReq userReq) { + return userDao.createUserByHubId(hubId, userReq); + } + } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/HubApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/HubApi.java new file mode 100644 index 00000000..ea774ef7 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/HubApi.java @@ -0,0 +1,100 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.model.request.HubReq; +import net.gepafin.tendermanagement.model.response.HubResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.Parameter; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Validated +@RequestMapping("/hub") +public interface HubApi { + + @Operation(summary = "API to create a hub", 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) })) + }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + @PostMapping(value = "", produces = "application/json") + ResponseEntity> createHub(HttpServletRequest request, + @Parameter(description = "Hub request object", required = true) + @Valid @RequestBody HubReq hubReq); + + @Operation(summary = "API to update a hub", 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) })) + }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + @PutMapping(value = "/{hubId}", produces = "application/json") + ResponseEntity> updateHub(HttpServletRequest request, + @Parameter(description = "The hub id", required = true) + @PathVariable("hubId") Long hubId, + @Parameter(description = "Hub request object", required = true) + @Valid @RequestBody HubReq hubReq); + + @Operation(summary = "API to get a hub by id", 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) })) + }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + @GetMapping(value = "/{hubId}", produces = "application/json") + ResponseEntity> getHubById(HttpServletRequest request, + @Parameter(description = "The hub id", required = true) + @PathVariable("hubId") Long hubId); + + @Operation(summary = "API to get all hubs", 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) })) + }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + @GetMapping(value = "", produces = "application/json") + ResponseEntity>> getAllHubs(HttpServletRequest request); + + @Operation(summary = "API to delete a hub", 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) })) + }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + @DeleteMapping(value = "/{hubId}") + ResponseEntity> deleteHub(HttpServletRequest request, + @Parameter(description = "The hub id", required = true) + @PathVariable("hubId") Long hubId); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java index 8eaeca2d..f567752d 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java @@ -21,6 +21,8 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; + @Validated public interface UserApi { @@ -186,6 +188,36 @@ public interface UserApi { @GetMapping(value = "/me", produces = { "application/json" }) ResponseEntity> getValidUser(HttpServletRequest request); + @Operation(summary = "API to create user by hubId", + responses = { + @ApiResponse(responseCode = "200", description = "User created successfully"), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})) + }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + @RequestMapping(value = "/hub/{hubId}", + produces = {"application/json"}, + method = RequestMethod.POST) + ResponseEntity> createUserByHubId( + @Parameter(description = "The hubId", required = true) @PathVariable("hubId") String hubId, + @Parameter(description = "User request object for hubId", required = true) @Valid @RequestBody UserReq userReq); + + @Operation(summary = "Api to get user by hubId", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "User not found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)})) + }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + @RequestMapping(value = "/hub/{hubId}", + produces = {"application/json"}, + method = RequestMethod.GET) + ResponseEntity>> getUserByHubId( + @Parameter(description = "The hubId", required = true) @PathVariable("hubId") String hubId); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/HubApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/HubApiController.java new file mode 100644 index 00000000..72090f89 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/HubApiController.java @@ -0,0 +1,80 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.HubReq; +import net.gepafin.tendermanagement.model.response.HubResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.HubService; +import net.gepafin.tendermanagement.util.Validator; +import net.gepafin.tendermanagement.web.rest.api.HubApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +public class HubApiController implements HubApi { + + private final HubService hubService; + private final Validator validator; + + public HubApiController(HubService hubService, Validator validator) { + this.hubService = hubService; + this.validator = validator; + } + + @Override + public ResponseEntity> createHub(HttpServletRequest request, @Valid HubReq hubReq) { + validator.validateUser(request); + HubResponseBean hubResponse = hubService.createHub(hubReq); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(hubResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.HUB_CREATE_SUCCESS))); + } + + @Override + public ResponseEntity> updateHub(HttpServletRequest request, Long hubId, @Valid HubReq hubReq) { + validator.validateUser(request); + HubResponseBean hubResponse = hubService.updateHub(hubId, hubReq); + if (hubResponse != null) { + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(hubResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.HUB_UPDATE_SUCCESS))); + } else { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response<>(null, Status.NOT_FOUND, Translator.toLocale(GepafinConstant.HUB_NOT_FOUND))); + } + } + + @Override + public ResponseEntity> getHubById(HttpServletRequest request, Long hubId) { + validator.validateUser(request); + HubResponseBean hubResponse = hubService.getHubById(hubId); + if (hubResponse != null) { + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(hubResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.HUB_GET_SUCCESS))); + } else { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(new Response<>(null, Status.NOT_FOUND, Translator.toLocale(GepafinConstant.HUB_NOT_FOUND))); + } + } + + @Override + public ResponseEntity>> getAllHubs(HttpServletRequest request) { + validator.validateUser(request); + List hubs = hubService.getAllHubs(); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(hubs, Status.SUCCESS, Translator.toLocale(GepafinConstant.HUB_GET_ALL_SUCCESS))); + } + + @Override + public ResponseEntity> deleteHub(HttpServletRequest request, Long hubId) { + validator.validateUser(request); + hubService.deleteHub(hubId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.HUB_DELETE_SUCCESS))); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java index d036a7f0..872ebb2f 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java @@ -21,6 +21,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @RequestMapping("${openapi.gepafin.base-path:/v1/user}") @@ -124,4 +126,20 @@ public class UserApiController implements UserApi { .body(new Response<>(user, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_USER_SUCCESS_MSG))); } + @Override + public ResponseEntity> createUserByHubId( + @PathVariable("hubId") String hubId, + @Valid @RequestBody UserReq userReq) { + log.info("Create User by Hub ID - Hub ID: {}, Request Body: {}", hubId, userReq); + UserResponseBean createdUser = userService.createUserByHubId(hubId, userReq); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(createdUser, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_CREATED_SUCCESS_MSG))); + } + @Override + public ResponseEntity>> getUserByHubId(String hubId) { + log.info("Get User by Hub ID - Hub ID: {}", hubId); + List user = userService.getUserByHubId(hubId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(user, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_USER_SUCCESS_MSG))); + } } \ No newline at end of file diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index d7377f5c..14399deb 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -735,5 +735,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 981ed852..78c02cbf 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -184,3 +184,12 @@ valid.vat.number=The VAT number is not valid for field {0}. failed.retain.field=Failed to retain specific fields. application.is.incomplete = The application is incomplete. + +# Hub Messages +hub_create_success=Hub created successfully +hub_update_success=Hub updated successfully +hub_get_success=Hub retrieved successfully +hub_get_all_success=Hubs retrieved successfully +hub_delete_success=Hub deleted successfully +hub_not_found=Hub not found + diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 5a7899df..b081ffaf 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -176,3 +176,10 @@ validation.marca.da.bollo=Il campo {0} deve essere una Marca Da Bollo valida con validation.piva=Il numero di partita IVA per {0} deve essere lungo fino a 11 cifre. valid.vat.number=Il numero di partita IVA non � valido per il campo {0}. failed.retain.field=Impossibile conservare campi specifici. +# Hub Messages +hub_create_success=Hub creato con successo +hub_update_success=Hub aggiornato con successo +hub_get_success=Hub recuperato con successo +hub_get_all_success=Hub recuperati con successo +hub_delete_success=Hub eliminato con successo +hub_not_found=Hub non trovato From 43cbadfce992623fa6d13f34ded593cc4bc8855f Mon Sep 17 00:00:00 2001 From: rbonazzo-kz Date: Mon, 14 Oct 2024 07:14:05 +0200 Subject: [PATCH 02/47] change TimeZone --- .../java/net/gepafin/tendermanagement/util/DateTimeUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java b/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java index 92da73eb..1fdf6c1a 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java +++ b/src/main/java/net/gepafin/tendermanagement/util/DateTimeUtil.java @@ -24,7 +24,7 @@ public class DateTimeUtil { public static LocalDateTime DateServerToUTC(LocalDateTime systemDate) { ZonedDateTime ldtZoned = systemDate.atZone(ZoneId.systemDefault()); - LocalDateTime localDatetime = ldtZoned.withZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime(); + LocalDateTime localDatetime = ldtZoned.withZoneSameInstant(ZoneId.of("Europe/Rome")).toLocalDateTime(); return localDatetime; } From 4412e447fb9b6a62141dcf7de7bc3776536477c5 Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 17 Oct 2024 16:01:38 +0530 Subject: [PATCH 03/47] Done ticket GEPAFINBE-59 --- .../gepafin/tendermanagement/dao/CallDao.java | 17 +- .../dao/EvaluationCriteriaDao.java | 25 +- .../gepafin/tendermanagement/dao/FormDao.java | 234 ++++++++++++------ .../entities/CriteriaFormFieldEntity.java | 20 ++ .../model/request/ContentRequestBean.java | 2 + .../model/response/ContentResponseBean.java | 2 + .../CriteriaFormFieldRepository.java | 17 ++ .../service/EvaluationCriteriaService.java | 3 + .../impl/EvaluationCriteriaServiceImpl.java | 6 + .../web/rest/api/EvaluationCriteriaApi.java | 2 +- .../impl/EvaluationCriteriaApiController.java | 6 +- .../db/changelog/db.changelog-1.0.0.xml | 37 +++ 12 files changed, 281 insertions(+), 90 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/CriteriaFormFieldEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/CriteriaFormFieldRepository.java diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 13101423..1a5e78da 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -1,6 +1,5 @@ package net.gepafin.tendermanagement.dao; -import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; @@ -23,10 +22,6 @@ import net.gepafin.tendermanagement.util.Utils; import org.h2.util.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; @@ -34,6 +29,7 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.CallTargetAudienceChecklistEntity; +import net.gepafin.tendermanagement.entities.CriteriaFormFieldEntity; import net.gepafin.tendermanagement.entities.DocumentEntity; import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; import net.gepafin.tendermanagement.entities.FaqEntity; @@ -52,6 +48,7 @@ import net.gepafin.tendermanagement.model.request.LookUpDataReq; import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.repositories.CallRepository; import net.gepafin.tendermanagement.repositories.CallTargetAudienceChecklistRepository; +import net.gepafin.tendermanagement.repositories.CriteriaFormFieldRepository; import net.gepafin.tendermanagement.repositories.DocumentRepository; import net.gepafin.tendermanagement.repositories.EvaluationCriteriaRepository; import net.gepafin.tendermanagement.repositories.FaqRepository; @@ -93,14 +90,21 @@ public class CallDao { @Autowired private FaqService faqService; + @Autowired private FlowDao flowDao; + @Autowired private FormDao formDao; + @Value("${aws.s3.url.folder}") private String s3Folder; + @Autowired private AmazonS3Service amazonS3Service; + + @Autowired + private CriteriaFormFieldRepository criteriaFormFieldRepository; public CallResponse createCallStep1(CreateCallRequestStep1 createCallRequest, Long userId) { UserEntity userEntity = userService.validateUser(userId); @@ -208,6 +212,8 @@ public class CallDao { private void softDeleteEvaluationCriteria(EvaluationCriteriaEntity evaluationCriteriaEntity) { evaluationCriteriaEntity.setIsDeleted(true); evaluationCriteriaRepository.save(evaluationCriteriaEntity); + List list = criteriaFormFieldRepository.findByEvaluationCriteriaId(evaluationCriteriaEntity.getId()); + criteriaFormFieldRepository.deleteAll(list); } private EvaluationCriteriaEntity convertToEvaluationCriteriaEntity(EvaluationCriteriaReq criteriaReq, @@ -255,6 +261,7 @@ public class CallDao { private void softDeleteDocument(DocumentEntity documentEntity) { documentEntity.setIsDeleted(true); documentRepository.save(documentEntity); + } private DocumentEntity convertToDocumentEntity(DocumentReq documentReq,Long sourceId) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java index f747d38f..fbb0a7ba 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java @@ -3,17 +3,21 @@ package net.gepafin.tendermanagement.dao; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.CriteriaFormFieldEntity; import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; import net.gepafin.tendermanagement.entities.LookUpDataEntity; import net.gepafin.tendermanagement.model.request.EvaluationCriteriaRequest; import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; +import net.gepafin.tendermanagement.repositories.CriteriaFormFieldRepository; import net.gepafin.tendermanagement.repositories.EvaluationCriteriaRepository; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.LookUpDataService; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; + +import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.stereotype.Component; @Component @@ -27,6 +31,9 @@ public class EvaluationCriteriaDao { @Autowired private LookUpDataService lookUpDataService; + + @Autowired + private CriteriaFormFieldRepository criteriaFormFieldRepository; public EvaluationCriteriaResponseBean createEvaluationCriteria( EvaluationCriteriaRequest evaluationCriteriaRequest) { @@ -54,6 +61,12 @@ public class EvaluationCriteriaDao { .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); } + + public EvaluationCriteriaEntity validateEvaluationCriteria(Long id) { + return evaluationCriteriaRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND))); + } public EvaluationCriteriaResponseBean updateEvaluationCriteria(Long id, EvaluationCriteriaRequest request) { EvaluationCriteriaEntity entity = evaluationCriteriaRepository.findById(id) @@ -64,12 +77,12 @@ public class EvaluationCriteriaDao { } public void deleteEvaluationCriteria(Long id) { - try { evaluationCriteriaRepository.deleteById(id); - } catch (EmptyResultDataAccessException e) { - throw new ResourceNotFoundException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_NOT_FOUND)); - } + EvaluationCriteriaEntity evaluationCriteriaEntity = validateEvaluationCriteria(id); + evaluationCriteriaEntity.setIsDeleted(Boolean.TRUE); + evaluationCriteriaRepository.save(evaluationCriteriaEntity); + List list = criteriaFormFieldRepository.findByEvaluationCriteriaId(evaluationCriteriaEntity.getId()); + criteriaFormFieldRepository.deleteAll(list); } private EvaluationCriteriaResponseBean convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean( diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 84c9d9b1..c13545c2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -6,9 +6,9 @@ import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.ContentResponseBean; import net.gepafin.tendermanagement.model.response.FormResponseBean; -import net.gepafin.tendermanagement.model.response.VatNumberResponseBean; import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.service.CallService; +import net.gepafin.tendermanagement.service.EvaluationCriteriaService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.FieldValidator; import net.gepafin.tendermanagement.util.Utils; @@ -22,9 +22,12 @@ import org.springframework.util.CollectionUtils; import java.text.MessageFormat; import java.time.LocalDateTime; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; @Component @@ -53,13 +56,19 @@ public class FormDao { @Autowired private CallRepository callRepository; + + @Autowired + private CriteriaFormFieldRepository criteriaFormFieldRepository; + + @Autowired + private EvaluationCriteriaService evaluationCriteriaService; public FormEntity saveFormEntity(FormEntity formEntity){ formEntity=formRepository.save(formEntity); return formEntity; } - - public FormEntity convertFormRequestToFormEntity(Long callId,FormRequest formRequest){ + + public FormEntity convertFormRequestToFormEntity(Long callId,FormRequest formRequest) { FormEntity formEntity=new FormEntity(); CallEntity callEntity=callService.getCallEntityById(callId); formEntity.setCall(callEntity); @@ -68,16 +77,29 @@ public class FormDao { formEntity=saveFormEntity(formEntity); return formEntity; } - public FormResponseBean convertFormEntityToFormResponseBean(FormEntity formEntity){ + public FormResponseBean convertFormEntityToFormResponseBean(FormEntity formEntity) { FormResponseBean formResponseBean=new FormResponseBean(); formResponseBean.setId(formEntity.getId()); - formResponseBean.setContent(Utils.convertJsonStringToList(formEntity.getContent(), ContentResponseBean.class)); + formResponseBean.setContent(setContent(formEntity)); formResponseBean.setLabel(formEntity.getLabel()); formResponseBean.setCallId(formEntity.getCall().getId()); formResponseBean.setCallStatus(formEntity.getCall().getStatus()); return formResponseBean; } - public FormResponseBean createForm(Long callId,FormRequest formRequest){ + + private List setContent(FormEntity formEntity) { + List contentList = Utils.convertJsonStringToList(formEntity.getContent(), + ContentResponseBean.class); + contentList.forEach(data -> { + List criteriaIds = criteriaFormFieldRepository + .findByCallIdAndFormIdAndFormFieldId(formEntity.getCall().getId(), formEntity.getId(), data.getId()) + .stream().map(CriteriaFormFieldEntity::getEvaluationCriteriaId).toList(); + data.setCriteria(criteriaIds); + }); + return contentList; + } + + public FormResponseBean createForm(Long callId,FormRequest formRequest){ validateForm(formRequest); CallEntity callEntity=callService.validateCall(callId); List flowDataEntities=flowDataRepository.findByCallId(callId); @@ -90,80 +112,139 @@ public class FormDao { callRepository.save(callEntity); } FormEntity formEntity=convertFormRequestToFormEntity(callId,formRequest); + validateAndSaveCriteriaFormField(callEntity, formEntity, formRequest.getContent()); return convertFormEntityToFormResponseBean(formEntity); } - public void validateForm(FormRequest formRequest){ + + private void validateAndSaveCriteriaFormField(CallEntity callEntity, FormEntity formEntity, + List contentResponseBeans) { + + contentResponseBeans.forEach(content -> { + // Fetch existing records from the repository based on the call, form, and field ID + List existingCriteriaFields = criteriaFormFieldRepository + .findByCallIdAndFormIdAndFormFieldId(callEntity.getId(), formEntity.getId(), content.getId()); + + // Extract existing evaluation criteria IDs into a set for quick lookup + Set existingEvaluationCriteriaIds = existingCriteriaFields.stream() + .map(CriteriaFormFieldEntity::getEvaluationCriteriaId) + .collect(Collectors.toSet()); + + // Get the criteria list (handling null as an empty list for uniformity) + List criteriaList = Optional.ofNullable(content.getCriteria()).orElse(Collections.emptyList()); + + // Filter and create new entries for criteria that are not already present + criteriaList.stream() + .filter(criteriaId -> !existingEvaluationCriteriaIds.contains(criteriaId)) + .forEach(criteriaId -> createCriteriaFormField(callEntity, formEntity, content.getId(), criteriaId)); + + List toBeDeleted = existingCriteriaFields.stream() + .filter(criteriaFormField -> !criteriaList.contains(criteriaFormField.getEvaluationCriteriaId())) + .collect(Collectors.toList()); + + if (!toBeDeleted.isEmpty()) { + criteriaFormFieldRepository.deleteAll(toBeDeleted); + } + }); + } + + + private void createCriteriaFormField(CallEntity callEntity, FormEntity formEntity, + String formFieldId,Long evaluationCriteriaId) { + evaluationCriteriaService.validateEvaluationCriteria(evaluationCriteriaId); + CriteriaFormFieldEntity criteriaFormField = new CriteriaFormFieldEntity(); + criteriaFormField.setCallId(callEntity.getId()); + criteriaFormField.setFormId(formEntity.getId()); + criteriaFormField.setFormFieldId(formFieldId); + criteriaFormField.setEvaluationCriteriaId(evaluationCriteriaId); + criteriaFormFieldRepository.save(criteriaFormField); + + } + + public void validateForm(FormRequest formRequest){ if(formRequest.getContent()==null || formRequest.getLabel()==null ){ throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REQUIRED_PARAMETER_NOT_FOUND_FOR_FORM)); } } - public FormResponseBean updateForm(Long formId, FormRequest formRequest,Boolean forceDeleteFlow){ - ContentRequestBean contentRequestBean2=null; - String choosenField=null; - FormEntity formEntity = validateForm(formId); - callDao.validateUpdate(formEntity.getCall()); - List contentRequestBean = Utils.convertJsonStringToList(formEntity.getContent(), ContentRequestBean.class); - for (ContentRequestBean contentRequestBean1 : contentRequestBean) { - FlowDataEntity flowDataEntity = flowDataRepository.findByFormIdAndChoosenField(formEntity.getId(), contentRequestBean1.getId()); - if (flowDataEntity != null) { - choosenField = flowDataEntity.getChoosenField(); - if (Boolean.TRUE.equals(contentRequestBean1.getId().equals(choosenField))) { - contentRequestBean2 = contentRequestBean1; - break; - } - } - } - if (contentRequestBean2 != null) { - List settingRequestBeansDB = contentRequestBean2.getSettings(); - for (ContentRequestBean contentRequestBeanRequest : formRequest.getContent()) { - if (contentRequestBeanRequest.getId().equals(contentRequestBean2.getId())) { - for (SettingRequestBean settingRequestBeanRequest : contentRequestBeanRequest.getSettings()) { - for (SettingRequestBean settingRequestBeanDB : settingRequestBeansDB) { - if (settingRequestBeanRequest.getName().equals(settingRequestBeanDB.getName())) { - if (!settingRequestBeanRequest.getValue().equals(settingRequestBeanDB.getValue())) { - if (Boolean.TRUE.equals(forceDeleteFlow)) { - Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel()); - Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent())); - formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - formEntity = saveFormEntity(formEntity); - List flowDataEntities = flowDataRepository.findByCallId(formEntity.getCall().getId()); - List flowEdgesEntities = flowEdgesRepository.findByCallId(formEntity.getCall().getId()); - flowDataRepository.deleteAll(flowDataEntities); - flowEdgesRepository.deleteAll(flowEdgesEntities); - CallEntity callEntity = formEntity.getCall(); - callEntity.setInitialForm(null); - callEntity.setFinalForm(null); - callRepository.save(callEntity); - return convertFormEntityToFormResponseBean(formEntity); - } else { - throw new CustomValidationException( - Status.BAD_REQUEST, - Translator.toLocale(GepafinConstant.UPDATING_FORM_VALUE_IMPACT_ON_FLOW, choosenField) - ); - } - } - else { - Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel()); - Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent())); - formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - formEntity = saveFormEntity(formEntity); - return convertFormEntityToFormResponseBean(formEntity); - } - } - } - } - } - } - } - else { - Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel()); - Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent())); - formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - formEntity = saveFormEntity(formEntity); - return convertFormEntityToFormResponseBean(formEntity); - } - return convertFormEntityToFormResponseBean(formEntity); - } + + public FormResponseBean updateForm(Long formId, FormRequest formRequest, Boolean forceDeleteFlow) { + ContentRequestBean contentRequestBean2 = null; + String choosenField = null; + FormEntity formEntity = validateForm(formId); + callDao.validateUpdate(formEntity.getCall()); + List contentRequestBean = Utils.convertJsonStringToList(formEntity.getContent(), + ContentRequestBean.class); + for (ContentRequestBean contentRequestBean1 : contentRequestBean) { + FlowDataEntity flowDataEntity = flowDataRepository.findByFormIdAndChoosenField(formEntity.getId(), + contentRequestBean1.getId()); + if (flowDataEntity != null) { + choosenField = flowDataEntity.getChoosenField(); + if (Boolean.TRUE.equals(contentRequestBean1.getId().equals(choosenField))) { + contentRequestBean2 = contentRequestBean1; + break; + } + } + } + if (contentRequestBean2 != null) { + List settingRequestBeansDB = contentRequestBean2.getSettings(); + for (ContentRequestBean contentRequestBeanRequest : formRequest.getContent()) { + if (contentRequestBeanRequest.getId().equals(contentRequestBean2.getId())) { + for (SettingRequestBean settingRequestBeanRequest : contentRequestBeanRequest + .getSettings()) { + for (SettingRequestBean settingRequestBeanDB : settingRequestBeansDB) { + if (settingRequestBeanRequest.getName().equals(settingRequestBeanDB.getName())) { + if (!settingRequestBeanRequest.getValue() + .equals(settingRequestBeanDB.getValue())) { + if (Boolean.TRUE.equals(forceDeleteFlow)) { + Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, + formRequest.getLabel()); + Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, + setContentResponseBean(formRequest.getContent())); + formEntity.setUpdatedDate( + DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + formEntity = saveFormEntity(formEntity); + List flowDataEntities = flowDataRepository + .findByCallId(formEntity.getCall().getId()); + List flowEdgesEntities = flowEdgesRepository + .findByCallId(formEntity.getCall().getId()); + flowDataRepository.deleteAll(flowDataEntities); + flowEdgesRepository.deleteAll(flowEdgesEntities); + CallEntity callEntity = formEntity.getCall(); + callEntity.setInitialForm(null); + callEntity.setFinalForm(null); + callRepository.save(callEntity); + return convertFormEntityToFormResponseBean(formEntity); + } else { + throw new CustomValidationException(Status.BAD_REQUEST, + Translator.toLocale( + GepafinConstant.UPDATING_FORM_VALUE_IMPACT_ON_FLOW, + choosenField)); + } + } else { + Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, + formRequest.getLabel()); + Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, + setContentResponseBean(formRequest.getContent())); + formEntity + .setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + formEntity = saveFormEntity(formEntity); + return convertFormEntityToFormResponseBean(formEntity); + } + } + } + } + } + } + } else { + Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel()); + Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, + setContentResponseBean(formRequest.getContent())); + formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + formEntity = saveFormEntity(formEntity); + validateAndSaveCriteriaFormField(formEntity.getCall(), formEntity, formRequest.getContent()); + return convertFormEntityToFormResponseBean(formEntity); + } + return convertFormEntityToFormResponseBean(formEntity); + } public FormEntity validateForm(Long formId) { FormEntity formEntity = formRepository.findById(formId) @@ -200,7 +281,10 @@ public class FormDao { return formResponseBeanList; } public String setContentResponseBean(List contentRequestBeans){ - return Utils.convertListToJsonString(contentRequestBeans); + String stringContentRequest = Utils.convertListToJsonString(contentRequestBeans); + List cloneContentRequestBeans = Utils.convertJsonStringToList(stringContentRequest, ContentRequestBean.class); + cloneContentRequestBeans.forEach(data->data.setCriteria(null)); + return Utils.convertListToJsonString(cloneContentRequestBeans); } public void validateFormField(List applicationFormFieldRequestList, ApplicationEntity applicationEntity, FormEntity formEntity) { diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CriteriaFormFieldEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CriteriaFormFieldEntity.java new file mode 100644 index 00000000..72876b92 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/CriteriaFormFieldEntity.java @@ -0,0 +1,20 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import lombok.Data; + +@Entity +@Table(name = "criteria_form_field") +@Data +public class CriteriaFormFieldEntity extends BaseEntity { + + private Long callId; + + private Long formId; + + private String formFieldId; + + private Long evaluationCriteriaId; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ContentRequestBean.java b/src/main/java/net/gepafin/tendermanagement/model/request/ContentRequestBean.java index f0399ead..bd6fa7d7 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ContentRequestBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ContentRequestBean.java @@ -13,6 +13,8 @@ public class ContentRequestBean { private String label; private List settings; private Map validators; + private List criteria; + private String dynamicData; private Integer dbId; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ContentResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/ContentResponseBean.java index 6ee1367d..8fa685b0 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ContentResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ContentResponseBean.java @@ -13,5 +13,7 @@ public class ContentResponseBean { private String label; private List settings; private Map validators; + private List criteria; + private String dynamicData; private Integer dbId; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CriteriaFormFieldRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CriteriaFormFieldRepository.java new file mode 100644 index 00000000..88f67da8 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CriteriaFormFieldRepository.java @@ -0,0 +1,17 @@ +package net.gepafin.tendermanagement.repositories; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import net.gepafin.tendermanagement.entities.CriteriaFormFieldEntity; + +@Repository +public interface CriteriaFormFieldRepository extends JpaRepository{ + + List findByCallIdAndFormIdAndFormFieldId(Long callId, Long formId, String formFieldId); + + List findByEvaluationCriteriaId(Long evaluationCriteriaId); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/EvaluationCriteriaService.java b/src/main/java/net/gepafin/tendermanagement/service/EvaluationCriteriaService.java index 3c1e2b85..5853b97a 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/EvaluationCriteriaService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/EvaluationCriteriaService.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; import net.gepafin.tendermanagement.model.request.EvaluationCriteriaRequest; import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; @@ -13,4 +14,6 @@ public interface EvaluationCriteriaService { public EvaluationCriteriaResponseBean updateEvaluationCriteria(HttpServletRequest request,Long id, EvaluationCriteriaRequest evaluationCriteriaRequest); public void deleteEvaluationCriteria(HttpServletRequest request,Long id); + + public EvaluationCriteriaEntity validateEvaluationCriteria(Long id); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationCriteriaServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationCriteriaServiceImpl.java index 2aef9e5f..f597dcfe 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationCriteriaServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/EvaluationCriteriaServiceImpl.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.EvaluationCriteriaDao; +import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; import net.gepafin.tendermanagement.model.request.EvaluationCriteriaRequest; import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; import net.gepafin.tendermanagement.service.EvaluationCriteriaService; @@ -33,4 +34,9 @@ public class EvaluationCriteriaServiceImpl implements EvaluationCriteriaService public void deleteEvaluationCriteria(HttpServletRequest request,Long id) { evaluationCriteriaDao.deleteEvaluationCriteria(id); } + + @Override + public EvaluationCriteriaEntity validateEvaluationCriteria(Long id) { + return evaluationCriteriaDao.validateEvaluationCriteria(id); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java index 4274cccb..df527940 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/EvaluationCriteriaApi.java @@ -72,7 +72,7 @@ public interface EvaluationCriteriaApi { @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })) }) @DeleteMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE) - ResponseEntity deleteEvaluationCriteria(HttpServletRequest request, + ResponseEntity> deleteEvaluationCriteria(HttpServletRequest request, @Parameter(description = "evaluation criteria id", required = true) @PathVariable("id") Long id); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationCriteriaApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationCriteriaApiController.java index 6c6286ae..37e8b7a6 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationCriteriaApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/EvaluationCriteriaApiController.java @@ -57,10 +57,10 @@ public class EvaluationCriteriaApiController implements EvaluationCriteriaApi { } @Override - public ResponseEntity deleteEvaluationCriteria(HttpServletRequest request, Long id) { + public ResponseEntity> deleteEvaluationCriteria(HttpServletRequest request, Long id) { service.deleteEvaluationCriteria(request,id); + return ResponseEntity.status(HttpStatus.OK) - .header("Message", Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_DELETED_SUCCESSFULLY)) - .build(); + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.EVALUATION_CRITERIA_DELETED_SUCCESSFULLY))); } } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 609f117c..14d2f3c0 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -1101,4 +1101,41 @@ + + + + + + + + + + + + + + + + + + + + + From 07498ce1ef3507d6cacf48ffa30072656c1e2a19 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 17 Oct 2024 19:39:25 -0700 Subject: [PATCH 04/47] Updated SAML config --- .../tendermanagement/config/SamlConfig.java | 46 +++++++++++-------- .../config/SamlRequestFilter.java | 24 ++++++++++ .../config/SamlSuccessHandler.java | 28 +++++++++++ .../config/SecurityConfig.java | 31 ++++++------- 4 files changed, 94 insertions(+), 35 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/config/SamlRequestFilter.java diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java index c66e26f1..050c4167 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java @@ -41,6 +41,10 @@ import org.springframework.security.saml2.provider.service.web.DefaultRelyingPar import org.springframework.security.saml2.provider.service.web.RelyingPartyRegistrationResolver; import org.springframework.security.saml2.provider.service.web.authentication.OpenSaml4AuthenticationRequestResolver; import org.springframework.security.saml2.provider.service.web.authentication.Saml2AuthenticationRequestResolver; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import jakarta.servlet.http.HttpServletRequest; @Configuration public class SamlConfig { @@ -123,28 +127,34 @@ public class SamlConfig { return authnRequest; } -@Bean -public Saml2AuthenticationRequestResolver authenticationRequestResolver(RelyingPartyRegistrationRepository registrations) { - RelyingPartyRegistrationResolver registrationResolver = new DefaultRelyingPartyRegistrationResolver(registrations); - OpenSaml4AuthenticationRequestResolver authenticationRequestResolver = new OpenSaml4AuthenticationRequestResolver(registrationResolver); + @Bean + public Saml2AuthenticationRequestResolver authenticationRequestResolver(RelyingPartyRegistrationRepository registrations) { + RelyingPartyRegistrationResolver registrationResolver = new DefaultRelyingPartyRegistrationResolver(registrations); + OpenSaml4AuthenticationRequestResolver authenticationRequestResolver = new OpenSaml4AuthenticationRequestResolver(registrationResolver); - authenticationRequestResolver.setAuthnRequestCustomizer((context) -> { - // Set the required attributes - AuthnRequest authnRequest = context.getAuthnRequest(); - authnRequest.setID("_" + UUID.randomUUID().toString()); // Add a unique ID - authnRequest.setVersion(SAMLVersion.VERSION_20); // Ensure version is 2.0 - authnRequest.setProtocolBinding(SAMLConstants.SAML2_POST_BINDING_URI); // HTTP-POST + authenticationRequestResolver.setAuthnRequestCustomizer((context) -> { - // Set Authentication Context - authnRequest.setRequestedAuthnContext(buildRequestedAuthnContext()); + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); + String hubId = (String) request.getAttribute("hubId"); - // Log the SAML AuthnRequest after setting context - String samlRequest = SamlRequestLogger.convertSAMLObjectToString(authnRequest); - logger.info("SAML AuthnRequest after setting context: " + samlRequest); - }); + logger.info("Hub id " + hubId); + + // Continue with normal AuthnRequest configuration + AuthnRequest authnRequest = context.getAuthnRequest(); + authnRequest.setID("_" + UUID.randomUUID().toString()+":"+hubId); + authnRequest.setVersion(SAMLVersion.VERSION_20); + authnRequest.setProtocolBinding(SAMLConstants.SAML2_POST_BINDING_URI); + authnRequest.setRequestedAuthnContext(buildRequestedAuthnContext()); + + + // Log the SAML AuthnRequest after setting context + String samlRequest = SamlRequestLogger.convertSAMLObjectToString(authnRequest); + logger.info("SAML AuthnRequest after setting context: " + samlRequest); + }); + + return authenticationRequestResolver; + } - return authenticationRequestResolver; -} private RequestedAuthnContext buildRequestedAuthnContext() { AuthnContextClassRefBuilder authnContextClassRefBuilder = new AuthnContextClassRefBuilder(); diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlRequestFilter.java b/src/main/java/net/gepafin/tendermanagement/config/SamlRequestFilter.java new file mode 100644 index 00000000..a7b3a664 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlRequestFilter.java @@ -0,0 +1,24 @@ +package net.gepafin.tendermanagement.config; + +import java.io.IOException; + +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +@Component +public class SamlRequestFilter extends OncePerRequestFilter { + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + String hub = request.getParameter("hubId"); + if (hub != null) { + request.setAttribute("hubId", hub); // Store the hub ID as an attribute + } + filterChain.doFilter(request, response); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java index 868b0eae..c58318a2 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java @@ -1,9 +1,14 @@ package net.gepafin.tendermanagement.config; +import java.io.ByteArrayInputStream; import java.io.IOException; +import java.util.Base64; import java.util.List; import java.util.Map; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -13,6 +18,8 @@ import org.springframework.security.saml2.provider.service.authentication.Saml2A import org.springframework.security.saml2.provider.service.authentication.Saml2Authentication; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.stereotype.Component; +import org.w3c.dom.Document; +import org.w3c.dom.Element; import com.fasterxml.jackson.databind.ObjectMapper; @@ -62,6 +69,27 @@ public class SamlSuccessHandler implements AuthenticationSuccessHandler { samlResponseLogEntity.setToken(token); samlResponseLogRepository.save(samlResponseLogEntity); + + // Extracting raw SAML response + String samlResponse = samlAuth.getSaml2Response(); + logger.info("Raw SAML Response: " + samlResponse); + + // Parsing the SAML response as XML + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setNamespaceAware(true); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document document = builder.parse(new ByteArrayInputStream(Base64.getDecoder().decode(samlResponse))); + + // Extracting ID, InResponseTo, and IssueInstant from the Response element + Element responseElement = (Element) document.getElementsByTagNameNS("urn:oasis:names:tc:SAML:2.0:protocol", "Response").item(0); + String responseId = responseElement.getAttribute("ID"); + String inResponseTo = responseElement.getAttribute("InResponseTo"); + String issueInstant = responseElement.getAttribute("IssueInstant"); + + logger.info("SAML Response ID: " + responseId); + logger.info("InResponseTo: " + inResponseTo); + logger.info("IssueInstant: " + issueInstant); + String redirectUrl = feBaseUrl; logger.info("SAML login successful for user: " + principal.getName()); diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 89182902..090f3688 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -15,6 +15,7 @@ import org.springframework.security.config.annotation.web.configurers.AbstractHt import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.saml2.provider.service.web.Saml2WebSsoAuthenticationRequestFilter; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher; @@ -109,23 +110,19 @@ public class SecurityConfig { .requestMatchers("/v1/user/reset-password/initiate").permitAll() .requestMatchers("/v1/user/reset-password").permitAll() .anyRequest().authenticated()) - .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)) - .exceptionHandling(exceptionHandling -> exceptionHandling - .authenticationEntryPoint((request, response, authException) -> { - // Send 403 Forbidden when there is no JWT token provided - response.sendError(HttpServletResponse.SC_FORBIDDEN, "Forbidden: Authentication token is missing or invalid"); - }) - ) - .addFilterBefore(corsFilter(), UsernamePasswordAuthenticationFilter.class) - .addFilterBefore(new JWTFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class) - // Add SAML2 login configuration (for BENEFICIARI) - /* - * .saml2Login(saml -> saml.loginPage("/saml/login") // Entry point for SAML - * login .defaultSuccessUrl("/") // Redirect after successful SAML login ); - */ - .saml2Login(saml -> saml.defaultSuccessUrl("/").successHandler(samlSuccessHandler) - .failureHandler(samlFailureHandler)); - + .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)) + .exceptionHandling(exceptionHandling -> exceptionHandling + .authenticationEntryPoint((request, response, authException) -> { + // Send 403 Forbidden when there is no JWT token provided + response.sendError(HttpServletResponse.SC_FORBIDDEN, "Forbidden: Authentication token is missing or invalid"); + }) + ) + .addFilterBefore(corsFilter(), UsernamePasswordAuthenticationFilter.class) + .addFilterBefore(new JWTFilter(tokenProvider), UsernamePasswordAuthenticationFilter.class) + .addFilterBefore(new SamlRequestFilter(), Saml2WebSsoAuthenticationRequestFilter.class) // Add the custom SAML filter + .saml2Login(saml -> saml.defaultSuccessUrl("/") + .successHandler(samlSuccessHandler) + .failureHandler(samlFailureHandler)); return http.build(); } From d57ff4d0f5d8c13c92eb15c79442f6c8e0961c33 Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 17 Oct 2024 20:07:22 -0700 Subject: [PATCH 05/47] Updated config --- .../tendermanagement/config/SamlSuccessHandler.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java index c58318a2..d9eb870c 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java @@ -74,22 +74,22 @@ public class SamlSuccessHandler implements AuthenticationSuccessHandler { String samlResponse = samlAuth.getSaml2Response(); logger.info("Raw SAML Response: " + samlResponse); - // Parsing the SAML response as XML + // If samlResponse is already in XML format, do not Base64 decode it DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); DocumentBuilder builder = factory.newDocumentBuilder(); - Document document = builder.parse(new ByteArrayInputStream(Base64.getDecoder().decode(samlResponse))); - - // Extracting ID, InResponseTo, and IssueInstant from the Response element + Document document = builder.parse(new ByteArrayInputStream(samlResponse.getBytes())); // Remove the Base64 decoding + + // Extracting ID, InResponseTo, and IssueInstant from the Response element Element responseElement = (Element) document.getElementsByTagNameNS("urn:oasis:names:tc:SAML:2.0:protocol", "Response").item(0); String responseId = responseElement.getAttribute("ID"); String inResponseTo = responseElement.getAttribute("InResponseTo"); String issueInstant = responseElement.getAttribute("IssueInstant"); - + logger.info("SAML Response ID: " + responseId); logger.info("InResponseTo: " + inResponseTo); logger.info("IssueInstant: " + issueInstant); - + String redirectUrl = feBaseUrl; logger.info("SAML login successful for user: " + principal.getName()); From 162c87e0d5cbddbdbc1b03f0d781c5a7a85254e5 Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 18 Oct 2024 15:27:56 +0530 Subject: [PATCH 06/47] updated code --- .../constants/GepafinConstant.java | 1 + .../net/gepafin/tendermanagement/dao/CallDao.java | 8 ++++++-- .../dao/EvaluationCriteriaDao.java | 7 +++++-- .../net/gepafin/tendermanagement/dao/FormDao.java | 14 ++++++++++---- .../entities/CriteriaFormFieldEntity.java | 4 ++++ .../repositories/CriteriaFormFieldRepository.java | 4 ++-- .../resources/db/changelog/db.changelog-1.0.0.xml | 12 ++++++------ src/main/resources/message_en.properties | 2 ++ src/main/resources/message_it.properties | 2 ++ 9 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 38121a98..2ffb9604 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -233,5 +233,6 @@ public class GepafinConstant { public static final String CANNOT_DELETE_COMPANY_WITH_APPLICATION_SUBMITT = "application.in.submit.status.cannot.delete.company"; public static final String GET_USERS_SUCCESS_MSG = "get.users.success.msg"; public static final String CANNOT_CREATE_BENEFICIARY_USER="cannot.create.beneficiary.user"; + public static final String EVALUATIONCRITERIA_INVALID = "evaluationCriteria.invalid"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 1a5e78da..3bba946a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -212,8 +212,12 @@ public class CallDao { private void softDeleteEvaluationCriteria(EvaluationCriteriaEntity evaluationCriteriaEntity) { evaluationCriteriaEntity.setIsDeleted(true); evaluationCriteriaRepository.save(evaluationCriteriaEntity); - List list = criteriaFormFieldRepository.findByEvaluationCriteriaId(evaluationCriteriaEntity.getId()); - criteriaFormFieldRepository.deleteAll(list); + List list = criteriaFormFieldRepository + .findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaEntity.getId()) + .stream() + .peek(data -> data.setIsDeleted(Boolean.TRUE)) + .toList(); + criteriaFormFieldRepository.saveAll(list); } private EvaluationCriteriaEntity convertToEvaluationCriteriaEntity(EvaluationCriteriaReq criteriaReq, diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java index fbb0a7ba..b865121e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java @@ -81,8 +81,11 @@ public class EvaluationCriteriaDao { EvaluationCriteriaEntity evaluationCriteriaEntity = validateEvaluationCriteria(id); evaluationCriteriaEntity.setIsDeleted(Boolean.TRUE); evaluationCriteriaRepository.save(evaluationCriteriaEntity); - List list = criteriaFormFieldRepository.findByEvaluationCriteriaId(evaluationCriteriaEntity.getId()); - criteriaFormFieldRepository.deleteAll(list); + List list = criteriaFormFieldRepository.findByEvaluationCriteriaIdAndIsDeletedFalse(evaluationCriteriaEntity.getId()) + .stream() + .peek(data -> data.setIsDeleted(Boolean.TRUE)) + .toList();; + criteriaFormFieldRepository.saveAll(list); } private EvaluationCriteriaResponseBean convertEvaluationCriteriaEntityEvaluationCriteriaToResponseBean( diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index c13545c2..5c43855e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -92,7 +92,7 @@ public class FormDao { ContentResponseBean.class); contentList.forEach(data -> { List criteriaIds = criteriaFormFieldRepository - .findByCallIdAndFormIdAndFormFieldId(formEntity.getCall().getId(), formEntity.getId(), data.getId()) + .findByCallIdAndFormIdAndFormFieldIdAndIsDeletedFalse(formEntity.getCall().getId(), formEntity.getId(), data.getId()) .stream().map(CriteriaFormFieldEntity::getEvaluationCriteriaId).toList(); data.setCriteria(criteriaIds); }); @@ -122,7 +122,7 @@ public class FormDao { contentResponseBeans.forEach(content -> { // Fetch existing records from the repository based on the call, form, and field ID List existingCriteriaFields = criteriaFormFieldRepository - .findByCallIdAndFormIdAndFormFieldId(callEntity.getId(), formEntity.getId(), content.getId()); + .findByCallIdAndFormIdAndFormFieldIdAndIsDeletedFalse(callEntity.getId(), formEntity.getId(), content.getId()); // Extract existing evaluation criteria IDs into a set for quick lookup Set existingEvaluationCriteriaIds = existingCriteriaFields.stream() @@ -139,10 +139,11 @@ public class FormDao { List toBeDeleted = existingCriteriaFields.stream() .filter(criteriaFormField -> !criteriaList.contains(criteriaFormField.getEvaluationCriteriaId())) + .peek(data->data.setIsDeleted(Boolean.TRUE)) .collect(Collectors.toList()); if (!toBeDeleted.isEmpty()) { - criteriaFormFieldRepository.deleteAll(toBeDeleted); + criteriaFormFieldRepository.saveAll(toBeDeleted); } }); } @@ -150,11 +151,16 @@ public class FormDao { private void createCriteriaFormField(CallEntity callEntity, FormEntity formEntity, String formFieldId,Long evaluationCriteriaId) { - evaluationCriteriaService.validateEvaluationCriteria(evaluationCriteriaId); + EvaluationCriteriaEntity evaluationCriteria = evaluationCriteriaService.validateEvaluationCriteria(evaluationCriteriaId); + if (Boolean.FALSE.equals(evaluationCriteria.getCall().getId().equals(callEntity.getId()))) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.EVALUATIONCRITERIA_INVALID)); + } CriteriaFormFieldEntity criteriaFormField = new CriteriaFormFieldEntity(); criteriaFormField.setCallId(callEntity.getId()); criteriaFormField.setFormId(formEntity.getId()); criteriaFormField.setFormFieldId(formFieldId); + criteriaFormField.setIsDeleted(Boolean.FALSE); criteriaFormField.setEvaluationCriteriaId(evaluationCriteriaId); criteriaFormFieldRepository.save(criteriaFormField); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CriteriaFormFieldEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CriteriaFormFieldEntity.java index 72876b92..1177bbd2 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CriteriaFormFieldEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CriteriaFormFieldEntity.java @@ -1,5 +1,6 @@ package net.gepafin.tendermanagement.entities; +import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.Table; import lombok.Data; @@ -16,5 +17,8 @@ public class CriteriaFormFieldEntity extends BaseEntity { private String formFieldId; private Long evaluationCriteriaId; + + @Column(name ="IS_DELETED", nullable = false) + private Boolean isDeleted = false; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CriteriaFormFieldRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CriteriaFormFieldRepository.java index 88f67da8..7f63d5e2 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CriteriaFormFieldRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CriteriaFormFieldRepository.java @@ -10,8 +10,8 @@ import net.gepafin.tendermanagement.entities.CriteriaFormFieldEntity; @Repository public interface CriteriaFormFieldRepository extends JpaRepository{ - List findByCallIdAndFormIdAndFormFieldId(Long callId, Long formId, String formFieldId); + List findByCallIdAndFormIdAndFormFieldIdAndIsDeletedFalse(Long callId, Long formId, String formFieldId); - List findByEvaluationCriteriaId(Long evaluationCriteriaId); + List findByEvaluationCriteriaIdAndIsDeletedFalse(Long evaluationCriteriaId); } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 75455b59..5aada016 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -1113,6 +1113,9 @@ + + + @@ -1121,22 +1124,19 @@ baseColumnNames="call_id" referencedTableName="call" referencedColumnNames="id" - constraintName="fk_criteria_form_field_call_id" - onDelete="CASCADE"/> + constraintName="fk_criteria_form_field_call_id"/> + constraintName="fk_criteria_form_field_form_id"/> + constraintName="fk_criteria_form_field_evaluation_criteria_id"/> diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 683e335c..4ba49d72 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -253,6 +253,8 @@ get_login_attempt_se_msg=Login attempts fetched successfully. application.in.submit.status.cannot.delete.company=The company cannot be deleted because there are active applications in the SUBMITTED status. get.users.success.msg = Successfully fetched users. cannot.create.beneficiary.user = Creation of a Beneficiary user is not allowed. Please assign the appropriate role. +evaluationCriteria.invalid=This evaluation criterion does not belong to the current call. + diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 4731e451..7c9dd9bc 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -250,4 +250,6 @@ application.in.submit.status.cannot.delete.company=Non get.users.success.msg = Utenti recuperati con successo cannot.create.beneficiary.user = La creazione di un utente beneficiario non consentita. Si prega di assegnare il ruolo appropriato. +evaluationCriteria.invalid=Questo criterio di valutazione non appartiene alla chiamata corrente. + From 37e6f6cc33408b07f24aae57770587bab9530903 Mon Sep 17 00:00:00 2001 From: rajesh Date: Sat, 19 Oct 2024 12:43:59 +0530 Subject: [PATCH 07/47] updated file size configation --- src/main/resources/application.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 0206cb11..99b70232 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,8 +1,8 @@ spring.application.name=tendermanagement # Multipart Configuration -spring.servlet.multipart.max-file-size=15MB -spring.servlet.multipart.max-request-size=15MB +spring.servlet.multipart.max-file-size=300MB +spring.servlet.multipart.max-request-size=300MB spring.profiles.active=testing From 998c2ba01f729d4a91f1dfd7b19663a05fa57a72 Mon Sep 17 00:00:00 2001 From: harish Date: Sun, 20 Oct 2024 02:37:53 +0530 Subject: [PATCH 08/47] updated code --- .../tendermanagement/config/SamlConfig.java | 51 +++++++++++------- .../config/SamlFailureHandler.java | 52 +++++++++++++++---- .../config/SamlSuccessHandler.java | 38 ++++++++++---- .../tendermanagement/dao/ApplicationDao.java | 14 ++++- .../gepafin/tendermanagement/dao/HubDao.java | 6 ++- .../gepafin/tendermanagement/dao/UserDao.java | 8 +-- .../entities/ProtocolEntity.java | 3 ++ .../entities/SamlResponseEntity.java | 15 ++++++ .../enums/SamlResponseStatusEnum.java | 21 ++++++++ .../repositories/HubRepository.java | 5 ++ .../repositories/ProtocolRepository.java | 5 +- .../repositories/SamlResponseRepository.java | 4 ++ .../repositories/UserRepository.java | 6 +-- .../tendermanagement/service/HubService.java | 3 +- .../service/impl/AuthenticationService.java | 2 +- .../service/impl/HubServiceImpl.java | 6 +++ .../api/impl/CustomUserDetailsService.java | 2 +- 17 files changed, 187 insertions(+), 54 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/SamlResponseStatusEnum.java diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java index 050c4167..c69b7316 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java @@ -29,6 +29,7 @@ import org.opensaml.xmlsec.signature.support.SignatureConstants; import org.opensaml.xmlsec.signature.support.Signer; 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.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -45,6 +46,9 @@ import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.SamlResponseEntity; +import net.gepafin.tendermanagement.enums.SamlResponseStatusEnum; +import net.gepafin.tendermanagement.repositories.SamlResponseRepository; @Configuration public class SamlConfig { @@ -59,6 +63,9 @@ public class SamlConfig { @Value("${active.profile.folder}") String activeProfileFolder; + + @Autowired + private SamlResponseRepository samlResponseRepository; @Bean public RelyingPartyRegistrationRepository relyingPartyRegistrationRepository() { @@ -135,18 +142,24 @@ public class SamlConfig { authenticationRequestResolver.setAuthnRequestCustomizer((context) -> { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); - String hubId = (String) request.getAttribute("hubId"); + String hubUuid = (String) request.getAttribute("hubId"); - logger.info("Hub id " + hubId); + logger.info("Hub id " + hubUuid); + String inResponseTo = "_" + UUID.randomUUID().toString(); // Continue with normal AuthnRequest configuration AuthnRequest authnRequest = context.getAuthnRequest(); - authnRequest.setID("_" + UUID.randomUUID().toString()+":"+hubId); + authnRequest.setID(inResponseTo); authnRequest.setVersion(SAMLVersion.VERSION_20); authnRequest.setProtocolBinding(SAMLConstants.SAML2_POST_BINDING_URI); authnRequest.setRequestedAuthnContext(buildRequestedAuthnContext()); - + + SamlResponseEntity samlResponse = new SamlResponseEntity(); + samlResponse.setHubUuid(hubUuid); + samlResponse.setInResponseTo(inResponseTo); + samlResponse.setStatus(SamlResponseStatusEnum.INITIATED.getValue()); + samlResponseRepository.save(samlResponse); // Log the SAML AuthnRequest after setting context String samlRequest = SamlRequestLogger.convertSAMLObjectToString(authnRequest); logger.info("SAML AuthnRequest after setting context: " + samlRequest); @@ -156,21 +169,21 @@ public class SamlConfig { } -private RequestedAuthnContext buildRequestedAuthnContext() { - AuthnContextClassRefBuilder authnContextClassRefBuilder = new AuthnContextClassRefBuilder(); - AuthnContextClassRef authnContextClassRef = authnContextClassRefBuilder.buildObject( - SAMLConstants.SAML20_NS, AuthnContextClassRef.DEFAULT_ELEMENT_LOCAL_NAME, SAMLConstants.SAML20_PREFIX - ); - // Set the SPID Level 2 authentication context - authnContextClassRef.setURI("urn:oasis:names:tc:SAML:2.0:ac:classes:SecureRemotePassword"); - - RequestedAuthnContextBuilder requestedAuthnContextBuilder = new RequestedAuthnContextBuilder(); - RequestedAuthnContext requestedAuthnContext = requestedAuthnContextBuilder.buildObject(); - requestedAuthnContext.setComparison(AuthnContextComparisonTypeEnumeration.EXACT); - requestedAuthnContext.getAuthnContextClassRefs().add(authnContextClassRef); - - return requestedAuthnContext; -} + private RequestedAuthnContext buildRequestedAuthnContext() { + AuthnContextClassRefBuilder authnContextClassRefBuilder = new AuthnContextClassRefBuilder(); + AuthnContextClassRef authnContextClassRef = authnContextClassRefBuilder.buildObject( + SAMLConstants.SAML20_NS, AuthnContextClassRef.DEFAULT_ELEMENT_LOCAL_NAME, SAMLConstants.SAML20_PREFIX + ); + // Set the SPID Level 2 authentication context + authnContextClassRef.setURI("urn:oasis:names:tc:SAML:2.0:ac:classes:SecureRemotePassword"); + + RequestedAuthnContextBuilder requestedAuthnContextBuilder = new RequestedAuthnContextBuilder(); + RequestedAuthnContext requestedAuthnContext = requestedAuthnContextBuilder.buildObject(); + requestedAuthnContext.setComparison(AuthnContextComparisonTypeEnumeration.EXACT); + requestedAuthnContext.getAuthnContextClassRefs().add(authnContextClassRef); + + return requestedAuthnContext; + } public PrivateKey readPrivateKey() throws Exception { // Path to your private key PEM file diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java index 171b7e12..d2337ee9 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java @@ -1,9 +1,13 @@ package net.gepafin.tendermanagement.config; import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.commons.lang3.StringUtils; 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.security.core.AuthenticationException; import org.springframework.security.web.authentication.AuthenticationFailureHandler; @@ -11,6 +15,12 @@ import org.springframework.stereotype.Component; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.SamlResponseEntity; +import net.gepafin.tendermanagement.enums.SamlResponseStatusEnum; +import net.gepafin.tendermanagement.repositories.SamlResponseRepository; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; @Component public class SamlFailureHandler implements AuthenticationFailureHandler { @@ -20,16 +30,40 @@ public class SamlFailureHandler implements AuthenticationFailureHandler { @Value("${fe.base.url}") private String feBaseUrl; + @Autowired + private SamlResponseRepository samlResponseRepository; + @Override - public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, - AuthenticationException exception) throws IOException { - try { - logger.error("SAML login failed: " + exception.getMessage()); - + public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, + AuthenticationException exception) throws IOException { + try { + logger.error("SAML login failed: " + exception.getMessage()); + String inResponseTo = extractInResponseTo(feBaseUrl); + if (Boolean.FALSE.equals(StringUtils.isEmpty(inResponseTo))) { + SamlResponseEntity samlResponseLogEntity = samlResponseRepository + .findByInResponseToAndStatus(inResponseTo, SamlResponseStatusEnum.INITIATED.getValue()) + .orElseThrow(() -> new CustomValidationException(Status.BAD_REQUEST, + Translator.toLocale(GepafinConstant.INVALID_REQUEST))); + samlResponseLogEntity.setStatus(SamlResponseStatusEnum.FAILED.getValue()); + samlResponseRepository.save(samlResponseLogEntity); + } response.sendRedirect(feBaseUrl + "/login"); - } catch (Exception e) { - logger.error("Error processing SAML failure handler", e); - } - } + } catch (Exception e) { + logger.error("Error processing SAML failure handler", e); + } + } + + public static String extractInResponseTo(String message) { + String regex = "InResponseTo attribute \\[([a-zA-Z0-9\\-]+)\\]"; + + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(message); + + if (matcher.find()) { + return matcher.group(1); + } else { + return null; + } + } } diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java index d9eb870c..fb151c11 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java @@ -2,13 +2,13 @@ package net.gepafin.tendermanagement.config; import java.io.ByteArrayInputStream; import java.io.IOException; -import java.util.Base64; import java.util.List; import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -26,10 +26,13 @@ import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.HubEntity; import net.gepafin.tendermanagement.entities.SamlResponseEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.SamlResponseStatusEnum; import net.gepafin.tendermanagement.repositories.SamlResponseRepository; import net.gepafin.tendermanagement.repositories.UserRepository; +import net.gepafin.tendermanagement.service.HubService; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; @@ -47,6 +50,9 @@ public class SamlSuccessHandler implements AuthenticationSuccessHandler { @Value("${fe.base.url}") private String feBaseUrl; + + @Autowired + private HubService hubService; @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, @@ -59,16 +65,6 @@ public class SamlSuccessHandler implements AuthenticationSuccessHandler { Map> userAttributes = principal.getAttributes(); String token = Utils.generateSecureToken(); logger.info("SAML User Attributes: " + userAttributes); - - SamlResponseEntity samlResponseLogEntity = new SamlResponseEntity(); - samlResponseLogEntity.setAuthenticationObject(authentication.toString()); - - ObjectMapper objectMapper = new ObjectMapper(); - String userAttributesJson = objectMapper.writeValueAsString(userAttributes); - samlResponseLogEntity.setAuthenticationObject(userAttributesJson); - samlResponseLogEntity.setToken(token); - samlResponseLogRepository.save(samlResponseLogEntity); - // Extracting raw SAML response String samlResponse = samlAuth.getSaml2Response(); @@ -89,8 +85,28 @@ public class SamlSuccessHandler implements AuthenticationSuccessHandler { logger.info("SAML Response ID: " + responseId); logger.info("InResponseTo: " + inResponseTo); logger.info("IssueInstant: " + issueInstant); + + SamlResponseEntity samlResponseLogEntity = samlResponseLogRepository + .findByInResponseToAndStatus(inResponseTo, SamlResponseStatusEnum.INITIATED.getValue()) + .orElseThrow(() -> new CustomValidationException(Status.BAD_REQUEST, + Translator.toLocale(GepafinConstant.INVALID_REQUEST))); + ObjectMapper objectMapper = new ObjectMapper(); + String userAttributesJson = objectMapper.writeValueAsString(userAttributes); + + samlResponseLogEntity.setAuthenticationObject(userAttributesJson); + samlResponseLogEntity.setToken(token); + samlResponseLogEntity.setStatus(SamlResponseStatusEnum.SUCCESS.getValue()); + samlResponseLogEntity.setInResponseTo(inResponseTo); + samlResponseLogEntity.setSamlId(responseId); + samlResponseLogEntity.setIssueInstant(issueInstant); + samlResponseLogRepository.save(samlResponseLogEntity); + + HubEntity hub = hubService.getHubByUuid(samlResponseLogEntity.getHubUuid()); String redirectUrl = feBaseUrl; + if (Boolean.FALSE.equals(StringUtils.isEmpty(hub.getDomainName()))) { + redirectUrl = hub.getDomainName(); + } logger.info("SAML login successful for user: " + principal.getName()); String cf = userAttributes.get("CodiceFiscale").get(0).toString(); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 83c93371..1442e505 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -119,6 +119,9 @@ public class ApplicationDao { @Value("${aws.s3.url.folder.signed.document}") private String signedDocumentS3Folder; + + @Value("${default.hub.uuid}") + private String defaultHubUuid; public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long formId, Long applicationId) { @@ -602,8 +605,7 @@ public class ApplicationDao { if (totalSteps.intValue() != completedSteps) { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG)); } - Long maxProtocolNumber=protocolRepository.findMaxProtocolNumber(); - Long protocolNumber = (maxProtocolNumber != null) ? maxProtocolNumber + 1 : 1; + Long protocolNumber = getProtocolNumber(userEntity.getHub()); ProtocolEntity protocolEntity=createProtocolEntity(applicationEntity,protocolNumber); applicationEntity.setProtocol(protocolEntity); applicationEntity.setStatus(ApplicationStatusTypeEnum.SUBMIT.getValue()); @@ -618,6 +620,14 @@ public class ApplicationDao { return getApplicationResponse(applicationEntity); } + private Long getProtocolNumber(HubEntity hubEntity) { + Long maxProtocolNumber = protocolRepository.findMaxProtocolNumberAndHubId(hubEntity.getId()); + Long startNumber = 10000001L; + if(Boolean.FALSE.equals(defaultHubUuid.equals(hubEntity.getUniqueUuid()))) { + startNumber = 20000001L; + } + return (maxProtocolNumber != null) ? maxProtocolNumber + 1 : startNumber; + } public Integer calculateProgress(Long totalSteps, Long completedSteps) { if (FieldValidator.isNullOrZero(totalSteps)) { throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.TOTAL_STEPS_NOT_BE_ZERO)); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java b/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java index 3304b481..28c999ad 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java @@ -14,7 +14,6 @@ import org.springframework.stereotype.Component; import java.time.LocalDateTime; import java.util.List; -import java.util.UUID; @Component @@ -89,4 +88,9 @@ public class HubDao { responseBean.setUpdatedDate(hubEntity.getUpdatedDate()); return responseBean; } + + public HubEntity getHubByUuid(String hubUuid) { + return hubRepository.findByUniqueUuid(hubUuid).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.HUB_NOT_FOUND))); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index d690f673..cc9a959b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -114,7 +114,7 @@ public class UserDao { Translator.toLocale(GepafinConstant.VALIDATE_EMAIL)); } log.info("Creating user with email: {}", userReq.getEmail()); - if (userRepository.existsByEmailIgnoreCaseAndhubUniqueUuid(userReq.getEmail(), userReq.getHubUuid())) { + if (userRepository.existsByEmailIgnoreCaseAndHubUniqueUuid(userReq.getEmail(), userReq.getHubUuid())) { log.error("User creation failed: Email {} already exists", userReq.getEmail()); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.EMAIL_ALREADY_EXISTS)); @@ -301,7 +301,7 @@ public class UserDao { public String initiatePasswordReset(InitiatePasswordResetReq resetReq) { UserEntity user = userRepository - .findByEmailIgnoreCaseAndhubUniqueUuid(resetReq.getEmail(), resetReq.getHubUuid()) + .findByEmailIgnoreCaseAndHubUniqueUuid(resetReq.getEmail(), resetReq.getHubUuid()) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); @@ -314,7 +314,7 @@ public class UserDao { public Boolean resetPassword(ResetPasswordReq resetPasswordReq) { UserEntity user = userRepository - .findByEmailIgnoreCaseAndhubUniqueUuid(resetPasswordReq.getEmail(), resetPasswordReq.getHubUuid()) + .findByEmailIgnoreCaseAndHubUniqueUuid(resetPasswordReq.getEmail(), resetPasswordReq.getHubUuid()) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); @@ -338,7 +338,7 @@ public class UserDao { public Boolean changePassword(UserEntity userEntity, ChangePasswordRequest request) { UserEntity user = userRepository - .findByEmailIgnoreCaseAndhubUniqueUuid(request.getEmail(), userEntity.getHub().getUniqueUuid()) + .findByEmailIgnoreCaseAndHubUniqueUuid(request.getEmail(), userEntity.getHub().getUniqueUuid()) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ProtocolEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ProtocolEntity.java index 0924c922..ad57c1ee 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ProtocolEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ProtocolEntity.java @@ -24,5 +24,8 @@ public class ProtocolEntity extends BaseEntity { @Column(name="APPLICATION_ID") private Long applicationId; + + @Column(name="HUB_ID") + private Long hubId; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseEntity.java index 732edfd9..05535e97 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseEntity.java @@ -13,6 +13,21 @@ public class SamlResponseEntity extends BaseEntity{ @Column(name = "AUTHENTICATION_OBJECT") private String authenticationObject; + @Column(name = "IN_RESPONSE_TO") + private String inResponseTo; + + @Column(name = "ISSUE_INSTANT") + private String issueInstant; + + @Column(name = "SAML_ID") + private String samlId; + + @Column(name = "HUB_UUID") + private String hubUuid; + + @Column(name = "STATUS") + private String status; + @Column(name = "TOKEN") private String token; diff --git a/src/main/java/net/gepafin/tendermanagement/enums/SamlResponseStatusEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/SamlResponseStatusEnum.java new file mode 100644 index 00000000..27e58a4b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/SamlResponseStatusEnum.java @@ -0,0 +1,21 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum SamlResponseStatusEnum { + + SUCCESS("SUCCESS"), + FAILED("FAILED"), + INITIATED("INITIATED"); + + private String value; + + SamlResponseStatusEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/HubRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/HubRepository.java index 36c3cf06..cc54295a 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/HubRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/HubRepository.java @@ -1,10 +1,15 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.HubEntity; + +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface HubRepository extends JpaRepository { + + Optional findByUniqueUuid(String hubUuid); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ProtocolRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ProtocolRepository.java index b82fc311..419d69b8 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ProtocolRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ProtocolRepository.java @@ -3,11 +3,12 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.ProtocolEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository public interface ProtocolRepository extends JpaRepository { - @Query("SELECT MAX(p.protocolNumber) FROM ProtocolEntity p") - Long findMaxProtocolNumber(); + @Query("SELECT MAX(p.protocolNumber) FROM ProtocolEntity p where p.hubId = :hubId") + Long findMaxProtocolNumberAndHubId(@Param("hubId") Long hubId); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseRepository.java index 9183f339..3194ef1a 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseRepository.java @@ -1,5 +1,7 @@ package net.gepafin.tendermanagement.repositories; +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -10,4 +12,6 @@ public interface SamlResponseRepository extends JpaRepository findByInResponseToAndStatus(String inResponseTo, String status); + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java index caccc5ec..63e44a8b 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java @@ -1,7 +1,6 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.UserEntity; -import net.gepafin.tendermanagement.model.response.UserResponseBean; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -20,12 +19,13 @@ public interface UserRepository extends JpaRepository { Optional findByBeneficiaryCodiceFiscale(String codiceFiscale); boolean existsByBeneficiaryCodiceFiscale(String codiceFiscale); + UserEntity findByBeneficiaryId(Long beneficiaryId); Long countByStatusAndRoleEntityRoleType(String status, String roleName); List findByRoleEntityId(Long roleId); - Optional findByEmailIgnoreCaseAndhubUniqueUuid(String email, String hubId); + Optional findByEmailIgnoreCaseAndHubUniqueUuid(String email, String hubId); - boolean existsByEmailIgnoreCaseAndhubUniqueUuid(String email, String hubUuid); + boolean existsByEmailIgnoreCaseAndHubUniqueUuid(String email, String hubUuid); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/HubService.java b/src/main/java/net/gepafin/tendermanagement/service/HubService.java index d04142a5..61f203ea 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/HubService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/HubService.java @@ -1,9 +1,9 @@ package net.gepafin.tendermanagement.service; +import net.gepafin.tendermanagement.entities.HubEntity; import net.gepafin.tendermanagement.model.request.HubReq; import net.gepafin.tendermanagement.model.response.HubResponseBean; -import net.gepafin.tendermanagement.model.util.Response; import java.util.List; @@ -13,4 +13,5 @@ public interface HubService { HubResponseBean getHubById(Long hubId); List getAllHubs(); void deleteHub(Long hubId); + HubEntity getHubByUuid(String hubUuid); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java index 009a5296..95eb6763 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -81,7 +81,7 @@ public class AuthenticationService { Authentication authentication = this.authenticationManager.authenticate(authenticationToken); SecurityContextHolder.getContext().setAuthentication(authentication); log.info("Authentication successful for email: {}", loginReq.getEmail()); - user = userRepository.findByEmailIgnoreCaseAndhubUniqueUuid(loginReq.getEmail(), loginReq.getHubUuid()) + user = userRepository.findByEmailIgnoreCaseAndHubUniqueUuid(loginReq.getEmail(), loginReq.getHubUuid()) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); loginAttemptEntity.setUserId(user.getId()); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/HubServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/HubServiceImpl.java index 795cf6fc..9301db7e 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/HubServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/HubServiceImpl.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.service.impl; import net.gepafin.tendermanagement.dao.HubDao; +import net.gepafin.tendermanagement.entities.HubEntity; import net.gepafin.tendermanagement.model.request.HubReq; import net.gepafin.tendermanagement.model.response.HubResponseBean; import net.gepafin.tendermanagement.service.HubService; @@ -45,4 +46,9 @@ public class HubServiceImpl implements HubService { public void deleteHub(Long hubId) { hubDao.deleteHub(hubId); } + + @Override + public HubEntity getHubByUuid(String hubUuid) { + return hubDao.getHubByUuid(hubUuid); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java index a11157ac..d26ab560 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java @@ -35,7 +35,7 @@ public class CustomUserDetailsService implements UserDetailsService { String email = loginParts[0]; String hubId = loginParts[1]; - UserEntity user = userRepository.findByEmailIgnoreCaseAndhubUniqueUuid(email, hubId) + UserEntity user = userRepository.findByEmailIgnoreCaseAndHubUniqueUuid(email, hubId) .orElseThrow( () -> new UsernameNotFoundException("User " + email + " was not found in the database")); return createSpringSecurityUser(user); From f7e512908ab4018b7c8f5b3c0197b6968ebcbbf4 Mon Sep 17 00:00:00 2001 From: harish Date: Sun, 20 Oct 2024 02:39:04 +0530 Subject: [PATCH 09/47] updated code --- src/main/resources/application.properties | 2 +- .../db/changelog/db.changelog-1.0.0.xml | 112 +++++++++++++++--- 2 files changed, 99 insertions(+), 15 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ca5b8b20..411dcd33 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -64,5 +64,5 @@ default_System_Receiver_Email=antonio.manca@bflows.net gepafin_email=bandi@pec.gepafin.it rinaldo_email=rinaldo.bonazzo@bflows.net carlo_email=carlo.mancosu@bflows.net -default.hub.uuid=o2vf1aaz2MDrpMaHUTaUu +default.hub.uuid=p4lk3bcx1RStqTaIVVbXs diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index e0e8f025..f9b8c1ac 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -749,7 +749,7 @@ - + @@ -783,6 +783,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1181,21 +1209,77 @@ - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + From 13ddfeaabf4b867436e433729e49bd0df11a26a2 Mon Sep 17 00:00:00 2001 From: harish Date: Sun, 20 Oct 2024 11:34:15 +0530 Subject: [PATCH 10/47] updated code --- .../gepafin/tendermanagement/dao/HubDao.java | 4 +++ .../tendermanagement/service/HubService.java | 1 + .../service/impl/HubServiceImpl.java | 5 ++++ .../tendermanagement/web/rest/api/HubApi.java | 15 ++++++++++- .../web/rest/api/impl/HubApiController.java | 27 ++++++++++--------- 5 files changed, 38 insertions(+), 14 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java b/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java index 28c999ad..3d5d6e7d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java @@ -93,4 +93,8 @@ public class HubDao { return hubRepository.findByUniqueUuid(hubUuid).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.HUB_NOT_FOUND))); } + + public HubResponseBean getHubByHubUuid(String uuid) { + return convertToHubResponseBean(getHubByUuid(uuid)); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/HubService.java b/src/main/java/net/gepafin/tendermanagement/service/HubService.java index 61f203ea..397bc533 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/HubService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/HubService.java @@ -14,4 +14,5 @@ public interface HubService { List getAllHubs(); void deleteHub(Long hubId); HubEntity getHubByUuid(String hubUuid); + HubResponseBean getHubByHubUuid(String uuid); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/HubServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/HubServiceImpl.java index 9301db7e..513a89e4 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/HubServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/HubServiceImpl.java @@ -51,4 +51,9 @@ public class HubServiceImpl implements HubService { public HubEntity getHubByUuid(String hubUuid) { return hubDao.getHubByUuid(hubUuid); } + + @Override + public HubResponseBean getHubByHubUuid(String uuid) { + return hubDao.getHubByHubUuid(uuid); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/HubApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/HubApi.java index ea774ef7..de729daa 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/HubApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/HubApi.java @@ -64,7 +64,6 @@ public interface HubApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) - @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") @GetMapping(value = "/{hubId}", produces = "application/json") ResponseEntity> getHubById(HttpServletRequest request, @Parameter(description = "The hub id", required = true) @@ -97,4 +96,18 @@ public interface HubApi { ResponseEntity> deleteHub(HttpServletRequest request, @Parameter(description = "The hub id", required = true) @PathVariable("hubId") Long hubId); + + @Operation(summary = "API to get a hub by id", 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) })) + }) + @GetMapping(value = "/uuid/{uuid}", produces = "application/json") + ResponseEntity> getHubByUuid(HttpServletRequest request, + @Parameter(description = "The hub id", required = true) + @PathVariable("uuid") String uuid); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/HubApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/HubApiController.java index 72090f89..e08f9517 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/HubApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/HubApiController.java @@ -8,9 +8,10 @@ import net.gepafin.tendermanagement.model.request.HubReq; import net.gepafin.tendermanagement.model.response.HubResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.HubService; -import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.web.rest.api.HubApi; import net.gepafin.tendermanagement.web.rest.api.errors.Status; + +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RestController; @@ -20,17 +21,11 @@ import java.util.List; @RestController public class HubApiController implements HubApi { - private final HubService hubService; - private final Validator validator; - - public HubApiController(HubService hubService, Validator validator) { - this.hubService = hubService; - this.validator = validator; - } + @Autowired + private HubService hubService; @Override public ResponseEntity> createHub(HttpServletRequest request, @Valid HubReq hubReq) { - validator.validateUser(request); HubResponseBean hubResponse = hubService.createHub(hubReq); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(hubResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.HUB_CREATE_SUCCESS))); @@ -38,7 +33,7 @@ public class HubApiController implements HubApi { @Override public ResponseEntity> updateHub(HttpServletRequest request, Long hubId, @Valid HubReq hubReq) { - validator.validateUser(request); + HubResponseBean hubResponse = hubService.updateHub(hubId, hubReq); if (hubResponse != null) { return ResponseEntity.status(HttpStatus.OK) @@ -51,7 +46,7 @@ public class HubApiController implements HubApi { @Override public ResponseEntity> getHubById(HttpServletRequest request, Long hubId) { - validator.validateUser(request); + HubResponseBean hubResponse = hubService.getHubById(hubId); if (hubResponse != null) { return ResponseEntity.status(HttpStatus.OK) @@ -64,7 +59,7 @@ public class HubApiController implements HubApi { @Override public ResponseEntity>> getAllHubs(HttpServletRequest request) { - validator.validateUser(request); + List hubs = hubService.getAllHubs(); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(hubs, Status.SUCCESS, Translator.toLocale(GepafinConstant.HUB_GET_ALL_SUCCESS))); @@ -72,9 +67,15 @@ public class HubApiController implements HubApi { @Override public ResponseEntity> deleteHub(HttpServletRequest request, Long hubId) { - validator.validateUser(request); + hubService.deleteHub(hubId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.HUB_DELETE_SUCCESS))); } + @Override + public ResponseEntity> getHubByUuid(HttpServletRequest request, String uuid) { + HubResponseBean hubResponse = hubService.getHubByHubUuid(uuid); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(hubResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.HUB_GET_SUCCESS))); + } } From dffb17bb4c5113f0970f3cb52c01ac08e7c753a2 Mon Sep 17 00:00:00 2001 From: harish Date: Sun, 20 Oct 2024 12:07:36 +0530 Subject: [PATCH 11/47] added validations --- .../config/SamlSuccessHandler.java | 5 ++--- .../tendermanagement/dao/ApplicationDao.java | 13 +++++++++---- .../gepafin/tendermanagement/dao/PdfDao.java | 19 +------------------ .../gepafin/tendermanagement/dao/UserDao.java | 19 +++++++++++++++++-- .../service/impl/ApplicationServiceImpl.java | 12 +++++------- .../service/impl/UserServiceImpl.java | 10 ---------- .../web/rest/api/impl/HubApiController.java | 12 ++---------- .../db/changelog/db.changelog-1.0.0.xml | 4 ++++ 8 files changed, 40 insertions(+), 54 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java index fb151c11..3c5ed0fb 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java @@ -123,9 +123,9 @@ public class SamlSuccessHandler implements AuthenticationSuccessHandler { } } - public void validateToken(String token, String codiceFiscale) { + public void validateToken(String token, String codiceFiscale, String hubUuid) { SamlResponseEntity samlResponseLogEntity = samlResponseLogRepository.findByToken(token); - if (samlResponseLogEntity == null) { + if (samlResponseLogEntity == null || Boolean.FALSE.equals(hubUuid.equals(samlResponseLogEntity.getHubUuid()))) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_TOKEN_MSG)); } @@ -136,7 +136,6 @@ public class SamlSuccessHandler implements AuthenticationSuccessHandler { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_TOKEN_MSG)); } - samlResponseLogRepository.delete(samlResponseLogEntity); } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 1442e505..126277d0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -124,11 +124,12 @@ public class ApplicationDao { private String defaultHubUuid; - public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long formId, Long applicationId) { + public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId, Long applicationId) { FormEntity formEntity = formService.validateForm(formId); // callService.validatePublishedCall(formEntity.getCall().getId()); validateFormFields(applicationRequestBean,formEntity); ApplicationEntity applicationEntity = validateApplication(applicationId); + validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); if(Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.SUBMIT.getValue()))) { throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_SUBMITTED)); } @@ -232,10 +233,11 @@ public class ApplicationDao { return applicationFormFieldResponseBeans; } - public void deleteById(Long id) { + public void deleteById(HttpServletRequest request, Long id) { log.info("Deleting application with ID: {}", id); ApplicationEntity applicationEntity= validateApplication(id); + validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); applicationEntity.setIsDeleted(true); applicationEntity=saveApplicationEntity(applicationEntity); log.info("Application deleted with ID: {}", id); @@ -470,9 +472,10 @@ public class ApplicationDao { return applicationEntity; } - public ApplicationGetResponseBean getApplicationByFormId( Long applicationId, Long formId, UserEntity userEntity) { + public ApplicationGetResponseBean getApplicationByFormId(HttpServletRequest request, Long applicationId, Long formId) { List formApplicationResponses = new ArrayList<>(); List formEntities = new ArrayList<>(); + UserEntity userEntity = validator.validateUser(request); boolean isBeneficiary = isBeneficiary(userEntity); ApplicationEntity applicationEntity = isBeneficiary ? applicationRepository.findByIdAndUserIdAndIsDeletedFalse(applicationId, userEntity.getId()) @@ -577,8 +580,10 @@ public class ApplicationDao { } } - public ApplicationResponse updateApplicationStatus(UserEntity userEntity, Long applicationId, ApplicationStatusTypeEnum status) { + public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) { + UserEntity userEntity = validator.validateUser(request); ApplicationEntity applicationEntity = validateApplication(applicationId); + validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); if (ApplicationStatusTypeEnum.SUBMIT.getValue().equals(applicationEntity.getStatus())) { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_SUBMITTED_CANNOT_CHANGE)); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 17b57fc6..6fa9b56a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -2,12 +2,6 @@ package net.gepafin.tendermanagement.dao; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.itextpdf.kernel.colors.ColorConstants; -import com.itextpdf.kernel.colors.DeviceRgb; -import com.itextpdf.kernel.pdf.canvas.PdfCanvas; -import com.itextpdf.layout.properties.UnitValue; -import com.itextpdf.layout.renderer.CellRenderer; -import com.itextpdf.layout.renderer.DrawContext; import com.itextpdf.text.*; import com.itextpdf.text.Element; import com.itextpdf.text.Font; @@ -16,28 +10,17 @@ import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.*; import jakarta.servlet.http.HttpServletRequest; -import net.gepafin.tendermanagement.config.Translator; -import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; -import net.gepafin.tendermanagement.model.request.CustomPageEvent; import net.gepafin.tendermanagement.model.request.FieldLabelValuePairRequest; import net.gepafin.tendermanagement.model.response.*; -import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.util.Validator; -import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; -import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.itextpdf.layout.element.Table; -import com.itextpdf.layout.element.Cell; //import com.itextpdf.layout.element. -import java.awt.*; import java.io.ByteArrayOutputStream; -import java.io.FileOutputStream; -import java.io.IOException; import java.util.*; import java.util.List; import java.util.stream.Collectors; @@ -128,7 +111,7 @@ public class PdfDao { // addLabelValuePair(document, "Con il titolo di", "Rappresentante legale", regularFont); document.add(new Paragraph(" ")); - ApplicationGetResponseBean applicationGetResponseBean=applicationDao.getApplicationByFormId(applicationId,null, userEntity); + ApplicationGetResponseBean applicationGetResponseBean=applicationDao.getApplicationByFormId(request, applicationId, null); for(FormApplicationResponse formApplicationResponse: applicationGetResponseBean.getForm()) { document.add(new Paragraph(formApplicationResponse.getLabel(),sectionFont)); document.add(new Paragraph(" ")); // Add line break diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index cc9a959b..af116d87 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.dao; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import net.gepafin.tendermanagement.config.SamlSuccessHandler; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.BeneficiaryEntity; @@ -20,6 +21,7 @@ import net.gepafin.tendermanagement.repositories.UserRepository; import net.gepafin.tendermanagement.service.RoleService; import net.gepafin.tendermanagement.service.impl.AuthenticationService; import net.gepafin.tendermanagement.util.Utils; +import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; @@ -66,13 +68,19 @@ public class UserDao { @Value("${default.hub.uuid}") private String defaultHubUuid; + + @Autowired + private Validator validator; + + @Autowired + private SamlSuccessHandler samlSuccessHandler; public JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq) { if(StringUtils.isEmpty(userReq.getHubUuid())) { userReq.setHubUuid(defaultHubUuid); } - validateUserRequest(tempToken, userReq); + validateUserRequest(request, tempToken, userReq); validatePassword(userReq.getPassword(), userReq.getConfPassword(), tempToken); RoleEntity roleEntity = getRoleEntity(userReq.getRoleId()); @@ -107,7 +115,14 @@ public class UserDao { return beneficiaryEntity; } - private void validateUserRequest(String tempToken, UserReq userReq) { + private void validateUserRequest(HttpServletRequest request, String tempToken, UserReq userReq) { + + if (tempToken == null) { + validator.validateRequest(request,RoleStatusEnum.ROLE_SUPER_ADMIN); + }else { + samlSuccessHandler.validateToken(tempToken, userReq.getCodiceFiscale(), userReq.getHubUuid()); + } + RoleEntity role = roleService.validateRole(userReq.getRoleId()); if (Boolean.FALSE.equals(Utils.isValidEmail(userReq.getEmail()))) { throw new CustomValidationException(Status.VALIDATION_ERROR, 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 1ea6e7ea..382f5372 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -40,21 +40,19 @@ public class ApplicationServiceImpl implements ApplicationService { @Transactional(rollbackFor = Exception.class) public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long applicationId, Long formId) { - UserEntity userEntity = validator.validateUser(request); - return applicationDao.createApplication(applicationRequestBean, userEntity, formId, applicationId); + return applicationDao.createApplication(request, applicationRequestBean, formId, applicationId); } @Override @Transactional(readOnly = true) public ApplicationGetResponseBean getApplicationByFormId(HttpServletRequest request, Long applicationId,Long formId) { - UserEntity userEntity = validator.validateUser(request); - return applicationDao.getApplicationByFormId(applicationId,formId,userEntity); + return applicationDao.getApplicationByFormId(request, applicationId,formId); } @Override @Transactional(rollbackFor = Exception.class) public void deleteApplication(HttpServletRequest request, Long applicationId) { - applicationDao.deleteById(applicationId); + applicationDao.deleteById(request, applicationId); } @Override @@ -74,14 +72,14 @@ public class ApplicationServiceImpl implements ApplicationService { public NextOrPreviousFormResponse getNextOrPreviousForm(HttpServletRequest request, Long applicationId, Long formId, FormActionEnum action) { ApplicationEntity applicationEntity = validateApplication(applicationId); + validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); return flowFormDao.getNextOrPreviousForm(applicationEntity, formId, action); } @Override @Transactional(rollbackFor = Exception.class) public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) { - UserEntity userEntity = validator.validateUser(request); - return applicationDao.updateApplicationStatus(userEntity, applicationId, status); + return applicationDao.updateApplicationStatus(request, applicationId, status); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java index 51e92579..3079cee9 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java @@ -2,13 +2,11 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import net.gepafin.tendermanagement.config.SamlSuccessHandler; import net.gepafin.tendermanagement.dao.UserDao; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.LoginReq; import net.gepafin.tendermanagement.model.request.UpdateUserReq; import net.gepafin.tendermanagement.model.request.UserReq; -import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.UserSamlResponse; @@ -32,18 +30,10 @@ public class UserServiceImpl implements UserService { @Autowired private Validator validator; - - @Autowired - private SamlSuccessHandler samlSuccessHandler; @Override @Transactional(rollbackFor = Exception.class) public JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq) { - if (tempToken == null) { - validator.validateRequest(request,RoleStatusEnum.ROLE_SUPER_ADMIN); - }else { - samlSuccessHandler.validateToken(tempToken, userReq.getCodiceFiscale()); - } return userDao.createUser(request, tempToken, userReq); } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/HubApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/HubApiController.java index e08f9517..7e8828e0 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/HubApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/HubApiController.java @@ -35,26 +35,18 @@ public class HubApiController implements HubApi { public ResponseEntity> updateHub(HttpServletRequest request, Long hubId, @Valid HubReq hubReq) { HubResponseBean hubResponse = hubService.updateHub(hubId, hubReq); - if (hubResponse != null) { + return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(hubResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.HUB_UPDATE_SUCCESS))); - } else { - return ResponseEntity.status(HttpStatus.NOT_FOUND) - .body(new Response<>(null, Status.NOT_FOUND, Translator.toLocale(GepafinConstant.HUB_NOT_FOUND))); - } } @Override public ResponseEntity> getHubById(HttpServletRequest request, Long hubId) { HubResponseBean hubResponse = hubService.getHubById(hubId); - if (hubResponse != null) { + return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(hubResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.HUB_GET_SUCCESS))); - } else { - return ResponseEntity.status(HttpStatus.NOT_FOUND) - .body(new Response<>(null, Status.NOT_FOUND, Translator.toLocale(GepafinConstant.HUB_NOT_FOUND))); - } } @Override diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index f9b8c1ac..54ed8f4f 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -796,6 +796,8 @@ + + @@ -809,6 +811,8 @@ + + From 0f056d237fef8e36bffdcd589fe89898ebe0403b Mon Sep 17 00:00:00 2001 From: harish Date: Sun, 20 Oct 2024 13:30:37 +0530 Subject: [PATCH 12/47] updated code --- .../tendermanagement/dao/DashboardDao.java | 34 +++++++++---------- .../gepafin/tendermanagement/dao/UserDao.java | 6 ++-- .../repositories/UserRepository.java | 7 +++- .../tendermanagement/service/UserService.java | 4 +-- .../service/impl/DashboardServiceImpl.java | 3 +- .../service/impl/UserServiceImpl.java | 12 ++----- .../web/rest/api/UserApi.java | 17 +--------- .../web/rest/api/impl/UserApiController.java | 12 ++----- 8 files changed, 35 insertions(+), 60 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java index 5622aa8a..a849f67d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java @@ -32,23 +32,23 @@ public class DashboardDao { @Autowired private CompanyRepository companyRepository; - public SuperAdminWidgetResponseBean getDashboardWidget() { + public SuperAdminWidgetResponseBean getDashboardWidget(UserEntity requestedUserEntity) { SuperAdminWidgetResponseBean widgetResponseBean = new SuperAdminWidgetResponseBean(); - widgetResponseBean.setWidget1(createWidget1()); + widgetResponseBean.setWidget1(createWidget1(requestedUserEntity)); // List widgetBars = callRepository.findApplicationsPerCall(); // widgetResponseBean.setWidgetBars(widgetBars); return widgetResponseBean; } - private Widget1 createWidget1() { + private Widget1 createWidget1(UserEntity requestedUserEntity) { Widget1 widget1 = initializeWidget1(); - setActiveCalls(widget1); - setRegisteredUsers(widget1); - setTotalActiveFinancing(widget1); - setSubmittedApplications(widget1); - setDraftApplications(widget1); - setNumberOfCompanies(widget1); + setActiveCalls(widget1, requestedUserEntity); + setRegisteredUsers(widget1, requestedUserEntity); + setTotalActiveFinancing(widget1, requestedUserEntity); + setSubmittedApplications(widget1, requestedUserEntity); + setDraftApplications(widget1, requestedUserEntity); + setNumberOfCompanies(widget1, requestedUserEntity); return widget1; } @@ -59,41 +59,41 @@ public class DashboardDao { .build(); } - private void setActiveCalls(Widget1 widget1) { + private void setActiveCalls(Widget1 widget1, UserEntity requestedUserEntity) { Long activeCalls = callRepository.countByStatus(CallStatusEnum.PUBLISH.getValue()); if (activeCalls != null) { widget1.setNumberOfActiveCalls(activeCalls); } } - private void setRegisteredUsers(Widget1 widget1) { - Long activeUsers = userRepository.countByStatusAndRoleEntityRoleType(UserStatusEnum.ACTIVE.getValue(), - RoleStatusEnum.ROLE_BENEFICIARY.getValue()); + private void setRegisteredUsers(Widget1 widget1, UserEntity requestedUserEntity) { + Long activeUsers = userRepository.countByStatusAndRoleEntityRoleTypeAndHubId(UserStatusEnum.ACTIVE.getValue(), + RoleStatusEnum.ROLE_BENEFICIARY.getValue(), requestedUserEntity.getHub().getId()); if (activeUsers != null) { widget1.setNumberOfResgisteredUsers(activeUsers); } } - private void setTotalActiveFinancing(Widget1 widget1) { + private void setTotalActiveFinancing(Widget1 widget1, UserEntity requestedUserEntity) { BigDecimal totalActiveFinancing = callRepository.findTotalAmountOfPublishedCalls(); widget1.setTotalActiveFinancing(totalActiveFinancing); } - private void setSubmittedApplications(Widget1 widget1) { + private void setSubmittedApplications(Widget1 widget1, UserEntity requestedUserEntity) { Long submittedApplications = applicationRepository.countSubmittedApplications(); if (submittedApplications != null) { widget1.setNumberOfSubmittedApplications(submittedApplications); } } - private void setDraftApplications(Widget1 widget1) { + private void setDraftApplications(Widget1 widget1, UserEntity requestedUserEntity) { Long draftApplications = applicationRepository.countDraftApplications(); if (draftApplications != null) { widget1.setNumberOfDraftApplications(draftApplications); } } - private void setNumberOfCompanies(Widget1 widget1) { + private void setNumberOfCompanies(Widget1 widget1, UserEntity requestedUserEntity) { Long numberOfCompanies = companyRepository.countTotalCompanies(); if (numberOfCompanies != null) { widget1.setNumberOfCompany(numberOfCompanies); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index af116d87..dafd9cf7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -400,15 +400,15 @@ public class UserDao { return authService.validateNewUserToken(token); } - public List getAllUsers(Long roleId) { + public List getAllUsers(UserEntity user, Long roleId) { List users; if (roleId != null) { log.info("Fetching users by role ID: {}", roleId); RoleEntity roleEntity=roleService.validateRole(roleId); - users = userRepository.findByRoleEntityId(roleEntity.getId()); + users = userRepository.findByRoleEntityIdAndHubId(roleEntity.getId(), user.getHub().getId()); } else { log.info("Fetching all users"); - users = userRepository.findAll(); + users = userRepository.findByHubId(user.getHub().getId()); } List userResponseBeans = users.stream() .map(this::convertUserEntityToUserResponse) diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java index 63e44a8b..e474fccf 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java @@ -23,9 +23,14 @@ public interface UserRepository extends JpaRepository { UserEntity findByBeneficiaryId(Long beneficiaryId); Long countByStatusAndRoleEntityRoleType(String status, String roleName); - List findByRoleEntityId(Long roleId); Optional findByEmailIgnoreCaseAndHubUniqueUuid(String email, String hubId); boolean existsByEmailIgnoreCaseAndHubUniqueUuid(String email, String hubUuid); + + List findByRoleEntityIdAndHubId(Long roleId, Long hubId); + + List findByHubId(Long hubId); + + Long countByStatusAndRoleEntityRoleTypeAndHubId(String status, String roleName, Long hubId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/UserService.java b/src/main/java/net/gepafin/tendermanagement/service/UserService.java index 9e2c43ef..9a1bdf9a 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/UserService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/UserService.java @@ -38,8 +38,6 @@ public interface UserService { UserResponseBean updateUserStatus(Long userId, UserStatusEnum statusReq); UserResponseBean getValidUser(HttpServletRequest request); - - List getUserByHubId(String hubId); JWTToken validateExistingUserToken(HttpServletRequest request, String token); @@ -47,6 +45,6 @@ public interface UserService { UserEntity getUserByBeneficiaryId(Long beneficiaryId); public UserEntity getUserEntityById(Long userId); - List getAllUsers(Long roleId); + List getAllUsers(HttpServletRequest request, Long roleId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java index d0bd0217..1a6cd6fd 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java @@ -22,7 +22,8 @@ public class DashboardServiceImpl implements DashboardService { @Override public SuperAdminWidgetResponseBean getDashboardWidgetForSuperAdmin(HttpServletRequest request) { - return dashboardDao.getDashboardWidget(); + UserEntity userEntity=validator.validateUser(request); + return dashboardDao.getDashboardWidget(userEntity); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java index 3079cee9..3f325320 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java @@ -97,12 +97,6 @@ public class UserServiceImpl implements UserService { return userDao.getUserById(user.getId()); } - @Override - @Transactional(readOnly = true) - public List getUserByHubId(String hubId) { - return userDao.getUserByHubId(hubId); - } - @Override @Transactional(rollbackFor = Exception.class) public JWTToken validateExistingUserToken(HttpServletRequest request, String token) { @@ -123,8 +117,8 @@ public class UserServiceImpl implements UserService { } @Override @Transactional(readOnly = true) - public List getAllUsers(Long roleId) { - // Calling DAO Function - return userDao.getAllUsers(roleId); + public List getAllUsers(HttpServletRequest request, Long roleId) { + UserEntity user=validator.validateUser(request); + return userDao.getAllUsers(user, roleId); } } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java index bbd5859f..8982e45e 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java @@ -194,21 +194,6 @@ public interface UserApi { produces = { "application/json" }) ResponseEntity> getValidUser(HttpServletRequest request); - - @Operation(summary = "Api to get user by hubId", - responses = { - @ApiResponse(responseCode = "200", description = "OK"), - @ApiResponse(responseCode = "404", description = "User not found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { - @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE)})), - @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { - @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)})) - }) - @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") - @RequestMapping(value = "/hub/{hubId}", - produces = {"application/json"}, - method = RequestMethod.GET) - ResponseEntity>> getUserByHubId( - @Parameter(description = "The hubId", required = true) @PathVariable("hubId") String hubId); @Operation(summary = "Api to validate existing user from saml token", responses = { @@ -250,7 +235,7 @@ public interface UserApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) @RequestMapping(value = "", produces = {"application/json"}, method = RequestMethod.GET) @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") - ResponseEntity>> getAllUsers( + ResponseEntity>> getAllUsers(HttpServletRequest request, @Parameter( required = false)@RequestParam(value ="roleId", required = false) Long roleId); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java index 497967f3..413feaac 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java @@ -128,14 +128,6 @@ public class UserApiController implements UserApi { } - @Override - public ResponseEntity>> getUserByHubId(String hubId) { - log.info("Get User by Hub ID - Hub ID: {}", hubId); - List user = userService.getUserByHubId(hubId); - return ResponseEntity.status(HttpStatus.OK) - .body(new Response<>(user, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_USER_SUCCESS_MSG))); - } - @Override public ResponseEntity> validateExistingUserToken(HttpServletRequest request, String token) { log.info("User login attempt via spid token"); @@ -150,10 +142,10 @@ public class UserApiController implements UserApi { return ResponseEntity.ok(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.TOKEN_VALIDATE_SUCCESS_MSE))); } @Override - public ResponseEntity>> getAllUsers( + public ResponseEntity>> getAllUsers(HttpServletRequest request, Long roleId) { log.info("Get all Users by Role ID - Role ID: {}", roleId); - List users = userService.getAllUsers(roleId); + List users = userService.getAllUsers(request, roleId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(users, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_USERS_SUCCESS_MSG))); } From ca2a7c5ccfd3422c5b058df35c2ad515ddc6bfbd Mon Sep 17 00:00:00 2001 From: harish Date: Sun, 20 Oct 2024 15:26:43 +0530 Subject: [PATCH 13/47] updated mail properties --- .../tendermanagement/dao/ApplicationDao.java | 19 ++++++++++++++----- .../tendermanagement/util/Validator.java | 10 +++++++++- src/main/resources/application-dev.properties | 3 +++ .../application-production.properties | 4 ++++ src/main/resources/application.properties | 4 ++-- .../db/changelog/db.changelog-1.0.0.xml | 10 ++++++++++ 6 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 126277d0..0537d703 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -20,6 +20,7 @@ import net.gepafin.tendermanagement.service.CompanyService; import net.gepafin.tendermanagement.service.DocumentService; import net.gepafin.tendermanagement.service.FormService; import net.gepafin.tendermanagement.service.SystemEmailTemplatesService; +import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.FieldValidator; import net.gepafin.tendermanagement.util.MailUtil; @@ -122,6 +123,9 @@ public class ApplicationDao { @Value("${default.hub.uuid}") private String defaultHubUuid; + + @Autowired + private UserService userService; public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId, Long applicationId) { @@ -581,8 +585,8 @@ public class ApplicationDao { } public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) { - UserEntity userEntity = validator.validateUser(request); ApplicationEntity applicationEntity = validateApplication(applicationId); + UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); if (ApplicationStatusTypeEnum.SUBMIT.getValue().equals(applicationEntity.getStatus())) { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_SUBMITTED_CANNOT_CHANGE)); @@ -611,16 +615,18 @@ public class ApplicationDao { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG)); } Long protocolNumber = getProtocolNumber(userEntity.getHub()); - ProtocolEntity protocolEntity=createProtocolEntity(applicationEntity,protocolNumber); + ProtocolEntity protocolEntity = createProtocolEntity(applicationEntity,protocolNumber, userEntity.getHub().getId()); applicationEntity.setProtocol(protocolEntity); applicationEntity.setStatus(ApplicationStatusTypeEnum.SUBMIT.getValue()); applicationEntity.setSubmissionDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + applicationEntity = saveApplicationEntity(applicationEntity); sendMailToUserAndCompany(userEntity, applicationEntity); sendMailTodefaultSystemAndGepafin(userEntity, applicationEntity); } else { applicationEntity.setStatus(status.getValue()); + applicationEntity = saveApplicationEntity(applicationEntity); } - applicationEntity = saveApplicationEntity(applicationEntity); + return getApplicationResponse(applicationEntity); } @@ -706,7 +712,7 @@ public class ApplicationDao { } } - public ProtocolEntity createProtocolEntity(ApplicationEntity applicationEntity,Long protocolNumber){ + public ProtocolEntity createProtocolEntity(ApplicationEntity applicationEntity,Long protocolNumber, Long hubId){ ProtocolEntity protocolEntity=new ProtocolEntity(); protocolEntity.setCall(applicationEntity.getCall().getId()); LocalDateTime utcDateTime = DateTimeUtil.DateServerToUTC(LocalDateTime.now()); @@ -714,6 +720,7 @@ public class ApplicationDao { protocolEntity.setProtocolNumber(protocolNumber); protocolEntity.setTime(LocalTime.now()); protocolEntity.setApplicationId(applicationEntity.getId()); + protocolEntity.setHubId(hubId); protocolRepository.save(protocolEntity); return protocolEntity; } @@ -778,7 +785,9 @@ public class ApplicationDao { mailUtil.sendByMailGun(subject, body, List.of(defaultSystemReceiverEmail), null); mailUtil.sendByMailGun(subject, body, List.of(gepafinEmail), null); mailUtil.sendByMailGun(subject, body, List.of(rinaldoEmail), null); - mailUtil.sendByMailGun(subject, body, List.of(carloEmail), null); + if(validator.isProductionProfileActivated()) { + mailUtil.sendByMailGun(subject, body, List.of(carloEmail), null); + } } public ApplicationSignedDocumentResponse uploadSignedDocument(HttpServletRequest request, Long applicationId, diff --git a/src/main/java/net/gepafin/tendermanagement/util/Validator.java b/src/main/java/net/gepafin/tendermanagement/util/Validator.java index b4c36227..01ee7943 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Validator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Validator.java @@ -17,11 +17,13 @@ import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.UnauthorizedAccessException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; +import java.util.Arrays; import java.util.Map; @Component @@ -38,6 +40,9 @@ public class Validator { @Autowired private CallService callService; + + @Autowired + private Environment environment; public Map getUserInfoFromToken(HttpServletRequest request) { return tokenProvider.getUserInfoAndUserIdFromToken(request); @@ -114,6 +119,9 @@ public class Validator { return callEntity; } - + public Boolean isProductionProfileActivated() { + String[] activeProfiles = environment.getActiveProfiles(); + return Arrays.stream(activeProfiles).anyMatch("production"::equals); + } } diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 5b6ca7a9..f7ccb81a 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -9,3 +9,6 @@ spring.h2.console.enabled=true isVatCheckGloballyDisabled = false isMailSendingEnabled = true +default_System_Receiver_Email=antonio.manca@bflows.net +gepafin_email=rinaldo.bonazzo@bflows.net +rinaldo_email=rinaldo.bonazzo@bflows.net \ No newline at end of file diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties index 91fb1979..725d9c8a 100644 --- a/src/main/resources/application-production.properties +++ b/src/main/resources/application-production.properties @@ -15,3 +15,7 @@ fe.base.url=https://bandi.gepafin.it spid.ipd.base.url=https://login.regione.umbria.it active.profile.folder=production isMailSendingEnabled = true +default_System_Receiver_Email=antonio.manca@bflows.net +gepafin_email=bandi@pec.gepafin.it +rinaldo_email=rinaldo.bonazzo@bflows.net +carlo_email=carlo.mancosu@bflows.net diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 411dcd33..75ab20cf 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -61,8 +61,8 @@ apiKey=xkeysib-d15439fedd7ff36d86676ac248153fc2c496ed9b879ca9dc8cee9a27fa309087- #senderEmail=mailer@bflows.net isMailSendingEnabled = false default_System_Receiver_Email=antonio.manca@bflows.net -gepafin_email=bandi@pec.gepafin.it +gepafin_email=rinaldo.bonazzo@bflows.net rinaldo_email=rinaldo.bonazzo@bflows.net -carlo_email=carlo.mancosu@bflows.net +carlo_email=rinaldo.bonazzo@bflows.net default.hub.uuid=p4lk3bcx1RStqTaIVVbXs diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 54ed8f4f..ae704451 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -1286,4 +1286,14 @@ + + + + + + From fc51fb22009d635366015f44822499e24fb4cb8c Mon Sep 17 00:00:00 2001 From: harish Date: Mon, 21 Oct 2024 16:07:13 +0530 Subject: [PATCH 14/47] Fixed create user issue --- src/main/java/net/gepafin/tendermanagement/dao/UserDao.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index dafd9cf7..ae75d8bd 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -18,6 +18,7 @@ import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.repositories.BeneficiaryRepository; import net.gepafin.tendermanagement.repositories.UserRepository; +import net.gepafin.tendermanagement.service.HubService; import net.gepafin.tendermanagement.service.RoleService; import net.gepafin.tendermanagement.service.impl.AuthenticationService; import net.gepafin.tendermanagement.util.Utils; @@ -74,6 +75,9 @@ public class UserDao { @Autowired private SamlSuccessHandler samlSuccessHandler; + + @Autowired + private HubService hubService; public JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq) { @@ -211,8 +215,8 @@ public class UserDao { userEntity.setEmail(userReq.getEmail()); userEntity.setStatus(UserStatusEnum.ACTIVE.getValue()); userEntity.setBeneficiary(beneficiary); + userEntity.setHub(hubService.getHubByUuid(userReq.getHubUuid())); if (Boolean.FALSE.equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue().equals(roleEntity.getRoleType()))) { - userEntity.setFirstName(userReq.getFirstName()); userEntity.setLastName(userReq.getLastName()); userEntity.setOrganization(userReq.getOrganization()); From 3424921f3bfb8033a82b8dae1f81c1427e7b67fa Mon Sep 17 00:00:00 2001 From: Anisha Gokhru Date: Mon, 21 Oct 2024 18:46:58 +0530 Subject: [PATCH 15/47] The admin must be able to assign a submitted application to a pre-instructor user --- .../constants/GepafinConstant.java | 6 + .../tendermanagement/dao/ApplicationDao.java | 10 +- .../dao/AssignedApplicationsDao.java | 147 ++++++++++++++++++ .../entities/AssignedApplicationsEntity.java | 35 +++++ .../enums/AssignedApplicationEnum.java | 21 +++ .../request/AssignedApplicationsRequest.java | 10 ++ .../AssignedApplicationsResponse.java | 19 +++ .../AssignedApplicationsRepository.java | 13 ++ .../service/ApplicationService.java | 2 +- .../service/AssignedApplicationsService.java | 19 +++ .../service/impl/ApplicationServiceImpl.java | 6 +- .../impl/AssignedApplicationsServiceImpl.java | 57 +++++++ .../web/rest/api/ApplicationApi.java | 3 +- .../web/rest/api/AssignedApplicationsApi.java | 101 ++++++++++++ .../api/impl/ApplicationApiController.java | 4 +- .../impl/AssignedApplicationsController.java | 72 +++++++++ .../db/changelog/db.changelog-1.0.0.xml | 32 ++++ src/main/resources/message_en.properties | 6 + src/main/resources/message_it.properties | 8 +- 19 files changed, 561 insertions(+), 10 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/AssignedApplicationsEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/AssignedApplicationEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/AssignedApplicationsRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 55e82a43..3031f24d 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -233,5 +233,11 @@ public class GepafinConstant { public static final String CANNOT_DELETE_COMPANY_WITH_APPLICATION_SUBMITT = "application.in.submit.status.cannot.delete.company"; public static final String GET_USERS_SUCCESS_MSG = "get.users.success.msg"; + public static final String APPLICATION_ASSIGNED= "application.assigned.success.msg"; + public static final String APPLICATION_ALREADY_ASSIGNED = "application.already.assigned.msg"; + public static final String ASSIGNED_APPLICATION_NOT_FOUND_MSG="aasigned.application.not.found"; + public static final String DELETE_ASSIGNED_APPLICATION_SUCCESS_MSG = "assigned.application.deleted.success"; + public static final String GET_ASSIGNED_APPLICATION_SUCCESS_MSG = "assigned.application.get.success"; + public static final String ASSIGNED_APPLICATION_UPDATE_SUCCESSFULLY_MSG = "assigned.application.update.successfully"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index ad2ac4a2..c717d344 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -274,11 +274,11 @@ public class ApplicationDao { // return applicationResponses; // } - public List getAllApplications(UserEntity userEntity, Long callId, Long companyId) { + public List getAllApplications(UserEntity userEntity, Long callId, Long companyId,String status) { log.info("Fetching applications for RoleType: {}", userEntity.getRoleEntity().getRoleType()); - Specification spec = search(userEntity.getId(), callId, companyId); + Specification spec = search(userEntity.getId(), callId, companyId,status); List applicationEntities = applicationRepository.findAll(spec); @@ -288,7 +288,7 @@ public class ApplicationDao { } - private Specification search(Long userId, Long callId, Long companyId) { + private Specification search(Long userId, Long callId, Long companyId,String status) { return (root, query, builder) -> { Boolean isBeneficiary = validator.checkIsBeneficiary(); Predicate predicate = builder.isFalse(root.get("isDeleted")); @@ -301,6 +301,10 @@ public class ApplicationDao { if (companyId != null) { predicate = builder.and(predicate, builder.equal(root.get("company").get("id"), companyId)); } + if (status != null) { + predicate = builder.and(predicate, builder.equal(root.get("status"), status)); + } + return predicate; }; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java new file mode 100644 index 00000000..5f555ac3 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -0,0 +1,147 @@ +package net.gepafin.tendermanagement.dao; +import jakarta.persistence.criteria.Predicate; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; +import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; +import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; +import net.gepafin.tendermanagement.repositories.AssignedApplicationsRepository; +import net.gepafin.tendermanagement.service.ApplicationService; +import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +import static net.gepafin.tendermanagement.util.Utils.log; +import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; + +@Component +public class AssignedApplicationsDao { + + @Autowired + ApplicationService applicationService; + + @Autowired + AssignedApplicationsRepository assignedApplicationsRepository; + + @Autowired + UserService userService; + + public AssignedApplicationsResponse createAssignedApplications(Long applicationId, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest){ + log.info("Assigning application to pre-Instructor with details: {}", applicationId,userId); + + AssignedApplicationsEntity assignedApplications = assignedApplicationsRepository.findByApplicationIdAndIsDeletedFalse(applicationId).orElse(null); + if(assignedApplications!=null){ + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_ASSIGNED)); + } + ApplicationEntity application = applicationService.validateApplication(applicationId); + UserEntity user = userService.validateUser(userId); + AssignedApplicationsEntity assignment = createAssignmentEntity(application, user.getId(), assignedByUser, assignedApplicationsRequest); + AssignedApplicationsResponse assignApplicationToInstructorResponse = convertEntityToResponse(assignment, assignedApplicationsRequest); + + log.info("Application assigned succesfully {}", assignApplicationToInstructorResponse); + return assignApplicationToInstructorResponse; + } + + public AssignedApplicationsEntity createAssignmentEntity(ApplicationEntity application, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest){ + AssignedApplicationsEntity assignApplication= new AssignedApplicationsEntity(); + assignApplication.setApplication(application); + assignApplication.setAssignedBy(assignedByUser.getId()); + assignApplication.setUserId(userId); + assignApplication.setStatus(assignedApplicationsRequest.getStatus().getValue()); + assignApplication.setNote(assignedApplicationsRequest.getNote()); + assignApplication.setIsDeleted(false); + assignApplication.setAssignedAt(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + AssignedApplicationsEntity assignedApplicationsEntity = saveAssignedApplication(assignApplication); + return assignedApplicationsEntity; + + } + public AssignedApplicationsEntity saveAssignedApplication(AssignedApplicationsEntity assignedApplicationsEntity){ + AssignedApplicationsEntity assignedApplication= assignedApplicationsRepository.save(assignedApplicationsEntity); + return assignedApplication; + } + + public AssignedApplicationsResponse convertEntityToResponse(AssignedApplicationsEntity application, AssignedApplicationsRequest assignedApplicationsRequest){ + AssignedApplicationsResponse assignedApplicationsResponse = new AssignedApplicationsResponse(); + assignedApplicationsResponse.setId(application.getId()); + assignedApplicationsResponse.setApplicationId(application.getApplication().getId()); + assignedApplicationsResponse.setAssignedBy(application.getAssignedBy()); + assignedApplicationsResponse.setUserId(application.getUserId()); + assignedApplicationsResponse.setCreatedDate(application.getCreatedDate()); + assignedApplicationsResponse.setUpdatedDate(application.getUpdatedDate()); + assignedApplicationsResponse.setNote(application.getNote()); + assignedApplicationsResponse.setStatus(AssignedApplicationEnum.valueOf(application.getStatus())); + assignedApplicationsResponse.setAssignedAt(application.getAssignedAt()); + return assignedApplicationsResponse; + } + + public AssignedApplicationsEntity validateAssignedApplication(Long id){ + AssignedApplicationsEntity assignedApplication = assignedApplicationsRepository.findByIdAndIsDeletedFalse(id).orElseThrow(()-> + new ResourceNotFoundException(Status.NOT_FOUND,Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_NOT_FOUND_MSG))); + return assignedApplication; + } + + public void deleteById(Long id) { + log.info("Deleting assigned application with ID: {}", id); + AssignedApplicationsEntity assignedApplicationsEntity= validateAssignedApplication(id); + assignedApplicationsEntity.setIsDeleted(true); + assignedApplicationsEntity= saveAssignedApplication(assignedApplicationsEntity); + log.info("Assigned Application deleted with ID: {}", id); + } + + public List getAllAssignedApplications(Long userId){ + Specification spec = search(userId); + List assignedApplicationsEntityList = assignedApplicationsRepository.findAll(spec); + return assignedApplicationsEntityList.stream() + .map(entity -> convertEntityToResponse(entity, new AssignedApplicationsRequest())) + .collect(Collectors.toList()); + } + private Specification search(Long userId) { + return (root, query, builder) -> { + Predicate predicate = builder.isFalse(root.get("isDeleted")); + if (userId != null) { + predicate = builder.and(predicate, builder.equal(root.get("userId"), userId)); + } + return predicate; + }; + } + + + public AssignedApplicationsResponse updateAssignedApplication( + Long id, AssignedApplicationsRequest updateRequest, UserEntity updatedByUser) { + + log.info("Updating assigned application with ID: {}", id); + AssignedApplicationsEntity existingAssignment = validateAssignedApplication(id); + + setIfUpdated(existingAssignment::getNote, existingAssignment::setNote, updateRequest.getNote()); + setIfUpdated(existingAssignment::getStatus, existingAssignment::setStatus, updateRequest.getStatus().name()); + setIfUpdated(existingAssignment::getAssignedBy, existingAssignment::setAssignedBy, updatedByUser.getId()); + + existingAssignment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + + AssignedApplicationsEntity updatedAssignment = saveAssignedApplication(existingAssignment); + AssignedApplicationsResponse response = convertEntityToResponse(updatedAssignment, updateRequest); + log.info("Assigned application updated successfully: {}", response); + return response; + } + + public AssignedApplicationsResponse getAssignedApplicationById(Long id) { + log.info("Fetching assigned application with ID: {}", id); + AssignedApplicationsEntity assignedApplication = validateAssignedApplication(id); + AssignedApplicationsResponse response = convertEntityToResponse(assignedApplication, new AssignedApplicationsRequest()); + log.info("Assigned application fetched successfully: {}", response); + return response; + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/AssignedApplicationsEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/AssignedApplicationsEntity.java new file mode 100644 index 00000000..bd26f527 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/AssignedApplicationsEntity.java @@ -0,0 +1,35 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.Data; + +import java.time.LocalDateTime; + +@Entity +@Data +@Table(name = "assigned_applications") + +public class AssignedApplicationsEntity extends BaseEntity{ + + @ManyToOne + @JoinColumn(name = "APPLICATION_ID") + private ApplicationEntity application; + + @Column(name = "USER_ID") + private Long userId; + + @Column(name = "ASSIGNED_BY") + private Long assignedBy; + + @Column(name = "STATUS") + private String status; + + @Column(name = "NOTE") + private String note; + + @Column(name="IS_DELETED") + private Boolean isDeleted=false; + + @Column(nullable = false) + private LocalDateTime assignedAt; +} diff --git a/src/main/java/net/gepafin/tendermanagement/enums/AssignedApplicationEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/AssignedApplicationEnum.java new file mode 100644 index 00000000..e0cba98f --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/AssignedApplicationEnum.java @@ -0,0 +1,21 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum AssignedApplicationEnum { + ASSIGNED("ASSIGNED"), + APPROVED("APPROVED"), + REJECTED("REJECTED"); + + + private final String value; + + AssignedApplicationEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/AssignedApplicationsRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/AssignedApplicationsRequest.java new file mode 100644 index 00000000..ef4cd3c3 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/AssignedApplicationsRequest.java @@ -0,0 +1,10 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; + +@Data +public class AssignedApplicationsRequest { + private String note; + private AssignedApplicationEnum status; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java new file mode 100644 index 00000000..8714d94c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; +import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; +import net.gepafin.tendermanagement.model.BaseBean; + +import java.time.LocalDateTime; + +@Data +public class AssignedApplicationsResponse extends BaseBean { + private Long applicationId; + private Long userId; + private Long assignedBy; + private AssignedApplicationEnum status; + private String note; + private LocalDateTime assignedAt; +} + + diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java new file mode 100644 index 00000000..076b93a9 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/AssignedApplicationsRepository.java @@ -0,0 +1,13 @@ +package net.gepafin.tendermanagement.repositories; +import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.stereotype.Repository; +import java.util.Optional; + +@Repository +public interface AssignedApplicationsRepository extends JpaRepository, JpaSpecificationExecutor{ + Optional findByApplicationIdAndIsDeletedFalse(Long applicationId); + Optional findByIdAndIsDeletedFalse(Long id); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java index 2d914b64..62d62b88 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java @@ -22,7 +22,7 @@ public interface ApplicationService { ApplicationGetResponseBean getApplicationByFormId(HttpServletRequest request, Long applicationId,Long formId); - List getAllApplications(HttpServletRequest request,Long callId, Long companyId); + List getAllApplications(HttpServletRequest request,Long callId, Long companyId,String status); void deleteApplication(HttpServletRequest request, Long applicationId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java b/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java new file mode 100644 index 00000000..2e211916 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.service; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; +import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; + +import java.util.List; + +public interface AssignedApplicationsService { + + AssignedApplicationsResponse createAssignedApplications( + HttpServletRequest request, Long applicationId, Long userId, AssignedApplicationsRequest assignedApplicationsRequest); + + void deleteApplication(HttpServletRequest request, Long id); + + List getAllAssignedApplications(Long userId); + AssignedApplicationsResponse updateAssignedApplication(HttpServletRequest request, Long id, AssignedApplicationsRequest assignedApplicationsRequest); + AssignedApplicationsResponse getAssignedApplicationById(Long id); +} 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 1ea6e7ea..cf4e3169 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -87,12 +87,12 @@ public class ApplicationServiceImpl implements ApplicationService { @Override @Transactional(readOnly = true) - public List getAllApplications(HttpServletRequest request, Long callId, Long companyId) { + public List getAllApplications(HttpServletRequest request, Long callId, Long companyId , String status) { UserEntity userEntity = validator.validateUser(request); if (companyId != null) { validator.validateUserWithCompany(request, companyId); } - return applicationDao.getAllApplications(userEntity, callId, companyId); + return applicationDao.getAllApplications(userEntity, callId, companyId , status); } @Override @Transactional(rollbackFor = Exception.class) @@ -111,5 +111,7 @@ public class ApplicationServiceImpl implements ApplicationService { public void deleteSignedDocument(HttpServletRequest request, Long applicationId) { applicationDao.deleteSignedDocument(request, applicationId); } + + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java new file mode 100644 index 00000000..00733f07 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java @@ -0,0 +1,57 @@ +package net.gepafin.tendermanagement.service.impl; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.AssignedApplicationsDao; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; +import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; +import net.gepafin.tendermanagement.service.AssignedApplicationsService; +import net.gepafin.tendermanagement.util.Validator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +public class AssignedApplicationsServiceImpl implements AssignedApplicationsService { + + @Autowired + private Validator validator; + + @Autowired + private AssignedApplicationsDao assignedApplicationsDao; + + @Override + @Transactional(rollbackFor = Exception.class) + public AssignedApplicationsResponse createAssignedApplications(HttpServletRequest request, Long applicationId, Long userId, AssignedApplicationsRequest assignedApplicationsRequest) { + UserEntity assignedByUser= validator.validateUser(request); + return assignedApplicationsDao.createAssignedApplications(applicationId,userId,assignedByUser, assignedApplicationsRequest); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteApplication(HttpServletRequest request, Long id) { + assignedApplicationsDao.deleteById(id); + } + + @Override + @Transactional(readOnly = true) + public List getAllAssignedApplications(Long userId) { + return assignedApplicationsDao.getAllAssignedApplications(userId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public AssignedApplicationsResponse updateAssignedApplication(HttpServletRequest request, Long id , AssignedApplicationsRequest updatedAssignedApplicationRequest) { + UserEntity updatedByUser= validator.validateUser(request); + return assignedApplicationsDao.updateAssignedApplication(id,updatedAssignedApplicationRequest,updatedByUser); + } + + @Override + @Transactional(readOnly = true) + public AssignedApplicationsResponse getAssignedApplicationById(Long id) { + return assignedApplicationsDao.getAssignedApplicationById(id); + } + +} 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 e3be06c7..38da1d7e 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 @@ -71,7 +71,8 @@ public interface ApplicationApi { @GetMapping(value = "", produces = "application/json") ResponseEntity>> getAllApplications(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); + @Parameter(description = "The company id", required = false) @RequestParam(value = "companyId", required = false) Long companyId, + @Parameter(description = "Application status" ,required = false) @RequestParam(value = "status",required = false)String status); @Operation(summary = "Api to delete application", responses = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java new file mode 100644 index 00000000..dfbbfc37 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java @@ -0,0 +1,101 @@ +package net.gepafin.tendermanagement.web.rest.api; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; +import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; +import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean; +import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Validated +public interface AssignedApplicationsApi { + + @Operation(summary = "Api to assign a application to preInstructor", + 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 = "/application/{applicationId}") + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + public ResponseEntity> createAssignedApplications( + HttpServletRequest request, + @Parameter(description = "ID of the application", required = true) @PathVariable Long applicationId, + @Parameter(description = "The User ID", required = true) @RequestParam("userId") Long userId, + @Valid @RequestBody AssignedApplicationsRequest assignedApplicationsRequest + ); + + @Operation(summary = "Api to delete assigned application", + 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) })) }) + @DeleteMapping(value = "/{id}") + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + ResponseEntity> deleteAssignedApplication(HttpServletRequest request, + @Parameter(description = "The assigned application id", required = true) @PathVariable("id") Long id); + + @Operation(summary = "Api to get all assigned applications", + 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) })) }) + @GetMapping(value = "", produces = "application/json") + ResponseEntity>> getAllAssignedApplications(@Parameter(description = "The User ID", required = false) @RequestParam(value = "userId",required = false) Long userId); + + @Operation(summary = "Api to update assigned application", + 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) })) + }) + @PutMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + public ResponseEntity> updateAssignedApplication(HttpServletRequest request, + @Parameter(description = "The Assigned Application id", required = true) @PathVariable("id") Long id, + @Parameter(description = "Assigned Application request object", required = true) @Valid @RequestBody AssignedApplicationsRequest assignedApplicationsRequest); + + @Operation(summary = "Api to get an assigned application by id", + 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) })) }) + @GetMapping(value = "/{id}", produces = "application/json") + ResponseEntity> getAssignedApplicationById(@Parameter(description = "The assigned application id", required = true) @PathVariable(value = "id", required = true) Long id); + + + +} 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 f6e6d1e5..833e8651 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 @@ -76,8 +76,8 @@ public class ApplicationApiController implements ApplicationApi { } @Override - public ResponseEntity>> getAllApplications(HttpServletRequest request, Long callId, Long companyId) { - List applications = applicationService.getAllApplications(request, callId, companyId); + public ResponseEntity>> getAllApplications(HttpServletRequest request, Long callId, Long companyId, String status) { + List applications = applicationService.getAllApplications(request, callId, companyId,status); log.info("Get All Applications"); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applications, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG))); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java new file mode 100644 index 00000000..9c4f0ad4 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java @@ -0,0 +1,72 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.log4j.Log4j2; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; +import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.AssignedApplicationsService; +import net.gepafin.tendermanagement.web.rest.api.AssignedApplicationsApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/assignedApplication}") +@Log4j2 +public class AssignedApplicationsController implements AssignedApplicationsApi { + + @Autowired + AssignedApplicationsService assignedApplicationsService; + + @Override + public ResponseEntity> createAssignedApplications(HttpServletRequest request, Long applicationId, Long userId, AssignedApplicationsRequest assignedApplicationsRequest) { + log.info("Assigning Application To PreInstructor"); + AssignedApplicationsResponse responseData = assignedApplicationsService.createAssignedApplications(request,applicationId,userId, assignedApplicationsRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(responseData, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_ASSIGNED))); + } + + @Override + public ResponseEntity> deleteAssignedApplication(HttpServletRequest request, Long id) { + log.info("Delete Assigned Application - Assigned Application ID: {}", id); + assignedApplicationsService.deleteApplication(request,id); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELETE_ASSIGNED_APPLICATION_SUCCESS_MSG))); + } + + @Override + public ResponseEntity>> getAllAssignedApplications(Long userId) { + log.info("Get All Assigned Applications"); + List applications = assignedApplicationsService.getAllAssignedApplications(userId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(applications, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_ASSIGNED_APPLICATION_SUCCESS_MSG))); + } + + @Override + public ResponseEntity> updateAssignedApplication(HttpServletRequest request, Long id, AssignedApplicationsRequest updateAssignedApplicationRequest) { + log.info("Update Assigned Application"); + AssignedApplicationsResponse updateAssignedApplication = assignedApplicationsService.updateAssignedApplication(request, id, updateAssignedApplicationRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(updateAssignedApplication, Status.SUCCESS, Translator.toLocale(GepafinConstant.ASSIGNED_APPLICATION_UPDATE_SUCCESSFULLY_MSG))); + } + + @Override + public ResponseEntity> getAssignedApplicationById(Long id) { + log.info("Get Assigned Applications By Id"); + AssignedApplicationsResponse application = assignedApplicationsService.getAssignedApplicationById(id); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(application, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_ASSIGNED_APPLICATION_SUCCESS_MSG))); + } + + +} + + diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index ca567baa..fa9bcd53 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -1108,4 +1108,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index e453aed0..52b5f6fc 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -253,3 +253,9 @@ get_login_attempt_se_msg=Login attempts fetched successfully. application.in.submit.status.cannot.delete.company=The company cannot be deleted because there are active applications in the SUBMITTED status. get.users.success.msg = Successfully fetched users. +application.assigned.success.msg = Application assigned successfully. +application.already.assigned.msg = Application is already assigned. +aasigned.application.not.found=Assigned Application not found with the given ID. +assigned.application.deleted.success=Assigned Application successfully deleted. +assigned.application.get.success=Assigned Application details fetched successfully. +assigned.application.update.successfully=Assigned Application updated successfully. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index a3e1c9c2..1d0b3483 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -247,5 +247,11 @@ dashboard.widget.fetched.successfully=Widget dashboard recuperato correttamente. login_attempt_successfully_created= Tentativo di login creato con successo. get_login_attempt_se_msg=Lista dei tentativi di accesso recuperata correttamente. application.in.submit.status.cannot.delete.company=Non possibile eliminare l'azienda perch ci sono domande attive con stato SUBMITTED. +get.users.success.msg = Utenti recuperati con successo -get.users.success.msg = Utenti recuperati con successo \ No newline at end of file +application.assigned.success.msg =Domanda assegnata con successo +application.already.assigned.msg =La domanda gi assegnata +aasigned.application.not.found = Applicazione assegnata non trovata con l'ID specificato. +assigned.application.deleted.success =Applicazione assegnata eliminata con successo. +assigned.application.get.success =Dettagli dell'applicazione assegnata recuperati correttamente. +assigned.application.update.successfully = Applicazione assegnata aggiornata correttamente. \ No newline at end of file From 04c9867d18ba57e85ff4abe83f91ad381538d3ea Mon Sep 17 00:00:00 2001 From: rajesh Date: Mon, 21 Oct 2024 18:47:26 +0530 Subject: [PATCH 16/47] fixed super admin validation issue --- src/main/java/net/gepafin/tendermanagement/util/Validator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/util/Validator.java b/src/main/java/net/gepafin/tendermanagement/util/Validator.java index 01ee7943..09563378 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Validator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Validator.java @@ -113,7 +113,7 @@ public class Validator { public CallEntity validateUserWithCall(UserEntity user, Long callId) { CallEntity callEntity = callService.validateCall(callId); - if(user.getHub().getId().equals(callEntity.getHub().getId())) { + if(Boolean.FALSE.equals(user.getHub().getId().equals(callEntity.getHub().getId()))) { throw new ForbiddenAccessException(Status.FORBIDDEN, Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); } return callEntity; From b1f98415576cf5ff1069a1ef9ac5c177707fcdf0 Mon Sep 17 00:00:00 2001 From: nisha Date: Tue, 22 Oct 2024 15:17:24 +0530 Subject: [PATCH 17/47] Done ticket GEPAFINBE-38 --- .../constants/GepafinConstant.java | 2 + .../tendermanagement/dao/ApplicationDao.java | 49 ++++++++++--------- .../gepafin/tendermanagement/dao/PdfDao.java | 36 -------------- .../enums/ApplicationStatusTypeEnum.java | 2 + .../service/ApplicationService.java | 2 + .../service/impl/ApplicationServiceImpl.java | 8 ++- .../web/rest/api/ApplicationApi.java | 37 +++++++++----- .../api/impl/ApplicationApiController.java | 19 ++++--- src/main/resources/message_en.properties | 3 ++ src/main/resources/message_it.properties | 5 +- 10 files changed, 85 insertions(+), 78 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 38d8bb1a..05d0e343 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -241,5 +241,7 @@ public class GepafinConstant { public static final String HUB_DELETE_SUCCESS = "hub_delete_success"; public static final String HUB_NOT_FOUND = "hub_not_found"; public static final String EVALUATIONCRITERIA_INVALID = "evaluationCriteria.invalid"; + public static final String APPLICATION_NOT_IN_DRAFT_STATUS="application.not.in.draft.status"; + public static final String APPLICATION_ALREADY_ASSIGNED="application.already.assigned"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 0537d703..e358e6e6 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -595,25 +595,8 @@ public class ApplicationDao { if(Boolean.TRUE.equals(applicationEntity.getStatus().equals(status.getValue()))){ throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_IN_PREVIOUS_STATUS)); } - if (status.equals(ApplicationStatusTypeEnum.SUBMIT)) { + if (status.equals(ApplicationStatusTypeEnum.SUBMIT) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.READY.getValue()))) { callService.validatePublishedCall(applicationEntity.getCall().getId()); -// CallEntity callEntity = applicationEntity.getCall(); -// Long initialFormId = callEntity.getInitialForm(); -// Long finalFormId = callEntity.getFinalForm(); -//// if (initialFormId == null || finalFormId == null) { -//// throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG)); -//// } -// ApplicationFormEntity initialApplicationForm = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), initialFormId); -// ApplicationFormEntity finalApplicationForm = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(), finalFormId); -// if (initialApplicationForm == null || finalApplicationForm == null) { -// throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG)); -// } - List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId()); - Long totalSteps=flowFormDao.calculateTotalSteps(flowEdgesList); - Integer completedSteps=flowFormDao.getCompletedSteps(applicationEntity); - if (totalSteps.intValue() != completedSteps) { - throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG)); - } Long protocolNumber = getProtocolNumber(userEntity.getHub()); ProtocolEntity protocolEntity = createProtocolEntity(applicationEntity,protocolNumber, userEntity.getHub().getId()); applicationEntity.setProtocol(protocolEntity); @@ -622,11 +605,10 @@ public class ApplicationDao { applicationEntity = saveApplicationEntity(applicationEntity); sendMailToUserAndCompany(userEntity, applicationEntity); sendMailTodefaultSystemAndGepafin(userEntity, applicationEntity); - } else { applicationEntity.setStatus(status.getValue()); applicationEntity = saveApplicationEntity(applicationEntity); } - + return getApplicationResponse(applicationEntity); } @@ -798,8 +780,9 @@ public class ApplicationDao { ApplicationSignedDocumentEntity applicationSignedDocument = applicationSignedDocumentRepository .findByApplicationIdAndStatus(applicationId, ApplicationSignedDocumentStatusEnum.ACTIVE.getValue()); if (applicationSignedDocument != null) { - applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.INACTIVE.getValue()); - applicationSignedDocumentRepository.save(applicationSignedDocument); + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_ASSIGNED)); +// applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.INACTIVE.getValue()); +// applicationSignedDocumentRepository.save(applicationSignedDocument); } UploadFileOnAmazonS3Response uploadFileOnAmazonS3 = amazonS3Service.uploadFileOnAmazonS3(signedDocumentS3Folder, file); @@ -809,6 +792,8 @@ public class ApplicationDao { applicationSignedDocument.setFilePath(uploadFileOnAmazonS3.getFilePath()); applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.ACTIVE.getValue()); applicationSignedDocumentRepository.save(applicationSignedDocument); + applicationEntity.setStatus(ApplicationStatusTypeEnum.READY.getValue()); + applicationRepository.save(applicationEntity); return convertApplicationSignedDocumentToApplicationSignedDocumentResponse(applicationSignedDocument); } @@ -865,4 +850,24 @@ public class ApplicationDao { applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.INACTIVE.getValue()); applicationSignedDocumentRepository.save(applicationSignedDocument); } + + public ApplicationResponse validateApplication(HttpServletRequest request, Long applicationId) { + ApplicationEntity applicationEntity = validateApplication(applicationId); + UserEntity userEntity = userService.validateUser(applicationEntity.getUserId()); + validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); + if (Boolean.FALSE.equals(ApplicationStatusTypeEnum.DRAFT.getValue().equals(applicationEntity.getStatus()))) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_NOT_IN_DRAFT_STATUS)); + } + List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId()); + Long totalSteps=flowFormDao.calculateTotalSteps(flowEdgesList); + Integer completedSteps=flowFormDao.getCompletedSteps(applicationEntity); + if (totalSteps.intValue() != completedSteps) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG)); + } + + applicationEntity.setStatus(ApplicationStatusTypeEnum.AWAIT.getValue()); + applicationEntity = saveApplicationEntity(applicationEntity); + return getApplicationResponse(applicationEntity); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 6fa9b56a..18d3bf1e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -75,42 +75,6 @@ public class PdfDao { addColoredLines(writer,document,greyColor); document.add(new Paragraph(" ")); - // Application ID section (Centered) -// pageEvent.setTotalPages(writer.getPageNumber()); - String protocolNumber="XX00"; - if(applicationEntity.getProtocol()!=null) { - protocolNumber= String.valueOf(applicationEntity.getProtocol().getProtocolNumber()); - } - Paragraph appId = new Paragraph("ID domanda :" +protocolNumber); - appId.setAlignment(Element.ALIGN_RIGHT); - document.add(appId); - - document.add(new Paragraph(" ")); - - addColoredLines(writer,document,greenColor); - document.add(new Paragraph(" ")); - document.add(new Paragraph("\n")); // Add line break -// String companyName= companyEntity.getCompanyName(); -// String vatNumber=companyEntity.getVatNumber(); -// String address=companyEntity.getAddress(); -// // Section: Dati Anagrafici Azienda -// document.add(new Paragraph("Dati Anagrafici Azienda", sectionFont)); -// addLabelValuePair(document, "Codice ATECO", "SEZIONE C “ATTIVITÀ MANUFATTURIERE”", regularFont); -// addLabelValuePair(document, "Ragione Sociale", companyName, regularFont); -// addLabelValuePair(document, "Partita IVA", vatNumber, regularFont); -// addLabelValuePair(document, "Indirizzo sede Legale", address, regularFont); -// -// document.add(new Paragraph("\n")); // Add line break -// -// // Section: Domanda presentata da -// document.add(new Paragraph("Domanda presentata da:", sectionFont)); -// addLabelValuePair(document, "Nome e cognome", userEntity.getBeneficiary().getFirstName()+" "+userEntity.getBeneficiary().getLastName(), regularFont); -// addLabelValuePair(document, "Codice fiscale", userEntity.getBeneficiary().getCodiceFiscale(), regularFont); -// addLabelValuePair(document, "Telefono", userEntity.getBeneficiary().getPhoneNumber(), regularFont); -// addLabelValuePair(document, "Email", userEntity.getBeneficiary().getEmail(), regularFont); -// addLabelValuePair(document, "Con il titolo di", "Rappresentante legale", regularFont); - document.add(new Paragraph(" ")); - ApplicationGetResponseBean applicationGetResponseBean=applicationDao.getApplicationByFormId(request, applicationId, null); for(FormApplicationResponse formApplicationResponse: applicationGetResponseBean.getForm()) { document.add(new Paragraph(formApplicationResponse.getLabel(),sectionFont)); diff --git a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java index 08b436c8..80420c15 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java @@ -6,6 +6,8 @@ public enum ApplicationStatusTypeEnum { DRAFT("DRAFT"), SUBMIT("SUBMIT"), + AWAIT("AWAIT"), + READY("READY"), DISCARD("DISCARD"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java index 2d914b64..b17ead39 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java @@ -40,4 +40,6 @@ public interface ApplicationService { public void deleteSignedDocument(HttpServletRequest request, Long applicationId); + public ApplicationResponse validateApplication(HttpServletRequest request, Long applicationId); + } 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 382f5372..9324a3e5 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -109,5 +109,11 @@ public class ApplicationServiceImpl implements ApplicationService { public void deleteSignedDocument(HttpServletRequest request, Long applicationId) { applicationDao.deleteSignedDocument(request, applicationId); } - + + @Override + @Transactional(rollbackFor = Exception.class) + public ApplicationResponse validateApplication(HttpServletRequest request, Long applicationId) { + return applicationDao.validateApplication(request, applicationId); + + } } 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 e3be06c7..05ad1ba4 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 @@ -175,17 +175,30 @@ public interface ApplicationApi { ResponseEntity> getSignedDocument(HttpServletRequest request, @Parameter(description = "The applicationId id", required = true) @PathVariable("applicationId") Long applicationId); - @Operation(summary = "Api to delete signed document", 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) })) }) - @DeleteMapping(value = "{applicationId}/signedDocument", produces = "application/json") - ResponseEntity> deleteSignedDocument(HttpServletRequest request, - @Parameter(description = "The applicationId id", required = true) @PathVariable("applicationId") Long applicationId); - - +// @Operation(summary = "Api to delete signed document", 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) })) }) +// @DeleteMapping(value = "{applicationId}/signedDocument", produces = "application/json") +// ResponseEntity> deleteSignedDocument(HttpServletRequest request, +// @Parameter(description = "The applicationId id", required = true) @PathVariable("applicationId") Long applicationId); + + @Operation(summary = "Api to validate application", + 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 = "/{applicationId}/validate", produces = { "application/json" }) + ResponseEntity> validateApplication(HttpServletRequest request, + @Parameter(description = "The application id", required = true) @PathVariable("applicationId") Long applicationId); + + } 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 f6e6d1e5..4880a059 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 @@ -133,13 +133,20 @@ public class ApplicationApiController implements ApplicationApi { .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_SIGNED_DOCUMENT_FILE_SUCCESS))); } +// @Override +// public ResponseEntity> deleteSignedDocument(HttpServletRequest request, +// Long applicationId) { +// applicationService.deleteSignedDocument(request, applicationId); +// log.info("delete signed document applicationId: {}", applicationId); +// return ResponseEntity.status(HttpStatus.OK) +// .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELETE_SIGNED_DOCUMENT_FILE_SUCCESS))); +// } + @Override - public ResponseEntity> deleteSignedDocument(HttpServletRequest request, - Long applicationId) { - applicationService.deleteSignedDocument(request, applicationId); - log.info("delete signed document applicationId: {}", applicationId); + public ResponseEntity> validateApplication(HttpServletRequest request, Long applicationId) { + ApplicationResponse applicationResponse = applicationService.validateApplication(request, applicationId); return ResponseEntity.status(HttpStatus.OK) - .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.DELETE_SIGNED_DOCUMENT_FILE_SUCCESS))); + .body(new Response<>(applicationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_STATUS_UPDATED_SUCCESSFULLY))); } - + } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index ff04a9bf..cf6f0f92 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -264,5 +264,8 @@ hub_get_all_success=Hubs retrieved successfully hub_delete_success=Hub deleted successfully hub_not_found=Hub not found +application.not.in.draft.status=Application is not in DRAFT status. +application.already.assigned=Application is already assigned. + diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index af60bf21..1dbb12f9 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -259,4 +259,7 @@ hub_update_success=Hub aggiornato con successo hub_get_success=Hub recuperato con successo hub_get_all_success=Hub recuperati con successo hub_delete_success=Hub eliminato con successo -hub_not_found=Hub non trovato \ No newline at end of file +hub_not_found=Hub non trovato + +application.not.in.draft.status=La domanda non in stato DRAFT. +application.already.assigned=L'applicazione gi assegnata. \ No newline at end of file From 0717e15345d5adad9193fedf3224f51c49037d9c Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 22 Oct 2024 17:18:49 +0530 Subject: [PATCH 18/47] Fixed prod Document issue --- .../net/gepafin/tendermanagement/dao/CallDao.java | 12 ++++++------ .../repositories/DocumentRepository.java | 7 +++++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index c4fc17ad..1bdf51d2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -246,7 +246,7 @@ public class CallDao { } List existingDocuments = documentRepository - .findBySourceIdAndTypeAndIsDeletedFalse(sourceId, documentType.getValue()); + .findBySourceIdAndSourceAndTypeAndIsDeletedFalse(sourceId, DocumentSourceTypeEnum.CALL.getValue(), documentType.getValue()); List incomingIds = documentReqList.stream().map(DocumentReq::getId).filter(id -> id != null && id > 0) .collect(Collectors.toList()); @@ -267,7 +267,7 @@ public class CallDao { private DocumentEntity convertToDocumentEntity(DocumentReq documentReq,Long sourceId) { validateDocumentEntity(documentReq.getId()); - DocumentEntity documentEntity = documentRepository.findByIdAndSourceIdAndIsDeletedFalse(documentReq.getId(),sourceId) + DocumentEntity documentEntity = documentRepository.findByIdAndSourceIdAndAndSourceAndIsDeletedFalse(documentReq.getId(),sourceId, DocumentSourceTypeEnum.CALL.getValue()) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); return documentEntity; @@ -622,10 +622,10 @@ public class CallDao { } private CallResponse getCallResponseBean(CallEntity callEntity) { - List documentEntities = documentRepository.findBySourceIdAndTypeAndIsDeletedFalse(callEntity.getId(), - DocumentTypeEnum.DOCUMENT.getValue()); - List imageEntities = documentRepository.findBySourceIdAndTypeAndIsDeletedFalse(callEntity.getId(), - DocumentTypeEnum.IMAGES.getValue()); + List documentEntities = documentRepository.findBySourceIdAndSourceAndTypeAndIsDeletedFalse(callEntity.getId(),DocumentSourceTypeEnum.CALL.getValue() + , DocumentTypeEnum.DOCUMENT.getValue()); + List imageEntities = documentRepository.findBySourceIdAndSourceAndTypeAndIsDeletedFalse(callEntity.getId(), DocumentSourceTypeEnum.CALL.getValue() + , DocumentTypeEnum.IMAGES.getValue()); List amiedTo = callTargetAudienceChecklistRepository .findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), LookUpDataTypeEnum.AIMED_TO.getValue()).stream() .map(this::convertToLookUpDataResponseBean).toList(); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java index 1543def3..a86ef8fd 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java @@ -15,12 +15,15 @@ public interface DocumentRepository extends JpaRepository @Query("SELECT d FROM DocumentEntity d WHERE d.id = :id AND d.isDeleted = false") Optional findById(@Param("id") Long id); - List findBySourceIdAndTypeAndIsDeletedFalse(Long sourceId, String type); +// List findBySourceIdAndTypeAndIsDeletedFalse(Long sourceId, String type); - Optional findByIdAndSourceIdAndIsDeletedFalse(Long id, Long sourceId); +// Optional findByIdAndSourceIdAndIsDeletedFalse(Long id, Long sourceId); List findBySource(String source); + List findBySourceIdAndSourceAndTypeAndIsDeletedFalse(Long sourceId, String source, String type); + Optional findByIdAndSourceIdAndAndSourceAndIsDeletedFalse(Long id, Long sourceId, String source); + } From d02283519bea3c7bed03d34ea60a943a18c3fdb7 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 22 Oct 2024 17:24:19 +0530 Subject: [PATCH 19/47] updated code --- src/main/java/net/gepafin/tendermanagement/dao/CallDao.java | 2 +- .../tendermanagement/repositories/DocumentRepository.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 1bdf51d2..ec6ef678 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -267,7 +267,7 @@ public class CallDao { private DocumentEntity convertToDocumentEntity(DocumentReq documentReq,Long sourceId) { validateDocumentEntity(documentReq.getId()); - DocumentEntity documentEntity = documentRepository.findByIdAndSourceIdAndAndSourceAndIsDeletedFalse(documentReq.getId(),sourceId, DocumentSourceTypeEnum.CALL.getValue()) + DocumentEntity documentEntity = documentRepository.findByIdAndSourceIdAndSourceAndIsDeletedFalse(documentReq.getId(),sourceId, DocumentSourceTypeEnum.CALL.getValue()) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); return documentEntity; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java index a86ef8fd..4f621d38 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java @@ -23,7 +23,7 @@ public interface DocumentRepository extends JpaRepository List findBySourceIdAndSourceAndTypeAndIsDeletedFalse(Long sourceId, String source, String type); - Optional findByIdAndSourceIdAndAndSourceAndIsDeletedFalse(Long id, Long sourceId, String source); + Optional findByIdAndSourceIdAndSourceAndIsDeletedFalse(Long id, Long sourceId, String source); } From 3eee4dda149ba591b7167e87a60b5ffe22d36078 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 22 Oct 2024 17:18:49 +0530 Subject: [PATCH 20/47] Fixed prod Document issue --- .../net/gepafin/tendermanagement/dao/CallDao.java | 12 ++++++------ .../repositories/DocumentRepository.java | 7 +++++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 0827b62a..0277b678 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -239,7 +239,7 @@ public class CallDao { } List existingDocuments = documentRepository - .findBySourceIdAndTypeAndIsDeletedFalse(sourceId, documentType.getValue()); + .findBySourceIdAndSourceAndTypeAndIsDeletedFalse(sourceId, DocumentSourceTypeEnum.CALL.getValue(), documentType.getValue()); List incomingIds = documentReqList.stream().map(DocumentReq::getId).filter(id -> id != null && id > 0) .collect(Collectors.toList()); @@ -259,7 +259,7 @@ public class CallDao { private DocumentEntity convertToDocumentEntity(DocumentReq documentReq,Long sourceId) { validateDocumentEntity(documentReq.getId()); - DocumentEntity documentEntity = documentRepository.findByIdAndSourceIdAndIsDeletedFalse(documentReq.getId(),sourceId) + DocumentEntity documentEntity = documentRepository.findByIdAndSourceIdAndAndSourceAndIsDeletedFalse(documentReq.getId(),sourceId, DocumentSourceTypeEnum.CALL.getValue()) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); return documentEntity; @@ -618,10 +618,10 @@ public class CallDao { } private CallResponse getCallResponseBean(CallEntity callEntity) { - List documentEntities = documentRepository.findBySourceIdAndTypeAndIsDeletedFalse(callEntity.getId(), - DocumentTypeEnum.DOCUMENT.getValue()); - List imageEntities = documentRepository.findBySourceIdAndTypeAndIsDeletedFalse(callEntity.getId(), - DocumentTypeEnum.IMAGES.getValue()); + List documentEntities = documentRepository.findBySourceIdAndSourceAndTypeAndIsDeletedFalse(callEntity.getId(),DocumentSourceTypeEnum.CALL.getValue() + , DocumentTypeEnum.DOCUMENT.getValue()); + List imageEntities = documentRepository.findBySourceIdAndSourceAndTypeAndIsDeletedFalse(callEntity.getId(), DocumentSourceTypeEnum.CALL.getValue() + , DocumentTypeEnum.IMAGES.getValue()); List amiedTo = callTargetAudienceChecklistRepository .findByCallIdAndLookupDataTypeAndIsDeletedFalse(callEntity.getId(), LookUpDataTypeEnum.AIMED_TO.getValue()).stream() .map(this::convertToLookUpDataResponseBean).toList(); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java index 1543def3..a86ef8fd 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java @@ -15,12 +15,15 @@ public interface DocumentRepository extends JpaRepository @Query("SELECT d FROM DocumentEntity d WHERE d.id = :id AND d.isDeleted = false") Optional findById(@Param("id") Long id); - List findBySourceIdAndTypeAndIsDeletedFalse(Long sourceId, String type); +// List findBySourceIdAndTypeAndIsDeletedFalse(Long sourceId, String type); - Optional findByIdAndSourceIdAndIsDeletedFalse(Long id, Long sourceId); +// Optional findByIdAndSourceIdAndIsDeletedFalse(Long id, Long sourceId); List findBySource(String source); + List findBySourceIdAndSourceAndTypeAndIsDeletedFalse(Long sourceId, String source, String type); + Optional findByIdAndSourceIdAndAndSourceAndIsDeletedFalse(Long id, Long sourceId, String source); + } From 4a1bd18478e1365fcf778e7838553387027ac353 Mon Sep 17 00:00:00 2001 From: rajesh Date: Tue, 22 Oct 2024 17:24:19 +0530 Subject: [PATCH 21/47] updated code --- src/main/java/net/gepafin/tendermanagement/dao/CallDao.java | 2 +- .../tendermanagement/repositories/DocumentRepository.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 0277b678..a1d16fd1 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -259,7 +259,7 @@ public class CallDao { private DocumentEntity convertToDocumentEntity(DocumentReq documentReq,Long sourceId) { validateDocumentEntity(documentReq.getId()); - DocumentEntity documentEntity = documentRepository.findByIdAndSourceIdAndAndSourceAndIsDeletedFalse(documentReq.getId(),sourceId, DocumentSourceTypeEnum.CALL.getValue()) + DocumentEntity documentEntity = documentRepository.findByIdAndSourceIdAndSourceAndIsDeletedFalse(documentReq.getId(),sourceId, DocumentSourceTypeEnum.CALL.getValue()) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); return documentEntity; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java index a86ef8fd..4f621d38 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java @@ -23,7 +23,7 @@ public interface DocumentRepository extends JpaRepository List findBySourceIdAndSourceAndTypeAndIsDeletedFalse(Long sourceId, String source, String type); - Optional findByIdAndSourceIdAndAndSourceAndIsDeletedFalse(Long id, Long sourceId, String source); + Optional findByIdAndSourceIdAndSourceAndIsDeletedFalse(Long id, Long sourceId, String source); } From 19a54b6f75ff4c38062623dc966e598c33820b8c Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 23 Oct 2024 00:14:01 +0530 Subject: [PATCH 22/47] Fixed s3 document issue --- .../constants/GepafinConstant.java | 1 + .../gepafin/tendermanagement/dao/CallDao.java | 5 +- .../tendermanagement/dao/DelegationDao.java | 29 ++------- .../tendermanagement/dao/DocumentDao.java | 63 +++++-------------- .../service/AmazonS3Service.java | 9 ++- .../service/impl/AmazonS3ServiceImpl.java | 40 ++++++++---- .../gepafin/tendermanagement/util/Utils.java | 7 +++ src/main/resources/message_en.properties | 2 + src/main/resources/message_it.properties | 1 + 9 files changed, 66 insertions(+), 91 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 8111ed64..38e3969a 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -248,5 +248,6 @@ public class GepafinConstant { public static final String HUB_DELETE_SUCCESS = "hub_delete_success"; public static final String HUB_NOT_FOUND = "hub_not_found"; public static final String EVALUATIONCRITERIA_INVALID = "evaluationCriteria.invalid"; + public static final String GET_ERROR_S3 = "get.error.s3"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index ec6ef678..8cee9587 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -127,8 +127,9 @@ public class CallDao { ZipOutputStream zos = new ZipOutputStream(zipOutputStream)) { for (DocumentEntity document : documents) { - try (InputStream fileInputStream = amazonS3Service.getFile(s3Folder, document.getFileName())) { - ZipEntry zipEntry = new ZipEntry(document.getFileName()); + try (InputStream fileInputStream = amazonS3Service.getFile(s3Folder, document.getFilePath())) { + String fileName = Utils.extractFileName(document.getFilePath()); + ZipEntry zipEntry = new ZipEntry(fileName); zos.putNextEntry(zipEntry); IOUtils.copy(fileInputStream, zos); zos.closeEntry(); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java index ca58f8be..f609086f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java @@ -7,7 +7,6 @@ import java.util.HashMap; import java.util.Map; import java.util.function.Function; -import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.springframework.beans.factory.annotation.Autowired; @@ -24,6 +23,7 @@ import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.UserCompanyDelegationStatusEnum; import net.gepafin.tendermanagement.model.request.CompanyDelegationRequest; import net.gepafin.tendermanagement.model.response.CompanyDelegationResponse; +import net.gepafin.tendermanagement.model.response.UploadFileOnAmazonS3Response; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.repositories.DocumentRepository; import net.gepafin.tendermanagement.repositories.UserCompanyDelegationRepository; @@ -96,7 +96,7 @@ public class DelegationDao { companyDao.getUserWithCompany(userEntity.getId(), companyId); updatePlaceholdersForDelegation(user, companyEntity, placeholders, companyDelegationRequest); DocumentEntity documentEntity = documentRepository.findBySource(GepafinConstant.DELEGATION_TEMPLATE).get(0); - return generateDocument(placeholders, documentEntity.getFileName()); + return generateDocument(placeholders, documentEntity.getFilePath()); } private Map updatePlaceholdersForDelegation(UserResponseBean user, CompanyEntity companyEntity, @@ -179,7 +179,7 @@ public class DelegationDao { userCompanyDelegationEntity.setStatus(UserCompanyDelegationStatusEnum.INACTIVE.getValue()); userCompanyDelegationRepository.save(userCompanyDelegationEntity); } - UploadFileOnAmazonS3 uploadFileOnAmazonS3 = uploadFileOnAmazonS3(file); + UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = amazonS3Service.uploadFileOnAmazonS3(s3Folder, file); userCompanyDelegationEntity = new UserCompanyDelegationEntity(); userCompanyDelegationEntity.setCompanyId(companyId); userCompanyDelegationEntity.setUserId(userEntity.getId()); @@ -187,8 +187,8 @@ public class DelegationDao { userCompanyDelegationEntity.setBeneficiaryId(userEntity.getBeneficiary().getId()); } userCompanyDelegationEntity.setStatus(UserCompanyDelegationStatusEnum.ACTIVE.getValue()); - userCompanyDelegationEntity.setFileName(uploadFileOnAmazonS3.fileName()); - userCompanyDelegationEntity.setFilePath(uploadFileOnAmazonS3.filepath()); + userCompanyDelegationEntity.setFileName(uploadFileOnAmazonS3Response.getFileName()); + userCompanyDelegationEntity.setFilePath(uploadFileOnAmazonS3Response.getFilePath()); userCompanyDelegationRepository.save(userCompanyDelegationEntity); return convertUserCompanyDelegationToCompanyDelegationResponse(userCompanyDelegationEntity); } @@ -197,25 +197,6 @@ public class DelegationDao { UserCompanyDelegationEntity userCompanyDelegationEntity) { return Utils.convertSourceObjectToDestinationObject(userCompanyDelegationEntity, CompanyDelegationResponse.class); } - - private UploadFileOnAmazonS3 uploadFileOnAmazonS3(MultipartFile file){ - String extension = FilenameUtils.getExtension(file.getOriginalFilename()); - String fileName = org.springframework.util.StringUtils.cleanPath(file.getOriginalFilename()); - String firstNameContain = fileName.substring(0, fileName.lastIndexOf('.')); - firstNameContain+=Utils.randomKey(5); - fileName = (firstNameContain + "." + extension); - try { - String filepath = amazonS3Service.upload(fileName, s3Folder, file); - return new UploadFileOnAmazonS3(fileName, filepath); - } catch (Exception e) { - throw new CustomValidationException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); - } - - } - - private record UploadFileOnAmazonS3(String fileName, String filepath) { - } private void validateFileType(MultipartFile file) { if (file.isEmpty()) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index 224a21ec..90725964 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -1,14 +1,11 @@ package net.gepafin.tendermanagement.dao; -import java.io.IOException; import java.util.stream.Collectors; import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; -import org.apache.commons.io.FilenameUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import net.gepafin.tendermanagement.config.Translator; @@ -17,10 +14,10 @@ import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.DocumentEntity; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; +import net.gepafin.tendermanagement.model.response.UploadFileOnAmazonS3Response; import net.gepafin.tendermanagement.repositories.DocumentRepository; import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.service.CallService; -import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; @@ -49,19 +46,17 @@ public class DocumentDao { List documentEntities = new ArrayList<>(); Long source = resolveSourceId(sourceId, sourceType); for (MultipartFile file : files) { - try { - uploadFileOnAmazonS3 result = uploadFileOnAmazonS3(file); - if (result != null) { - DocumentEntity documentEntity = new DocumentEntity(); - documentEntity.setFileName(result.fileName()); - documentEntity.setSource(sourceType.getValue()); - documentEntity.setSourceId(source); - documentEntity.setType(fileType.getValue()); - documentEntity.setFilePath(result.filepath()); - documentEntity.setIsDeleted(false); - documentEntities.add(documentEntity); - } - } catch (IOException e) { + UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = amazonS3Service.uploadFileOnAmazonS3(s3Folder, + file); + if (uploadFileOnAmazonS3Response != null) { + DocumentEntity documentEntity = new DocumentEntity(); + documentEntity.setFileName(uploadFileOnAmazonS3Response.getFileName()); + documentEntity.setSource(sourceType.getValue()); + documentEntity.setSourceId(source); + documentEntity.setType(fileType.getValue()); + documentEntity.setFilePath(uploadFileOnAmazonS3Response.getFilePath()); + documentEntity.setIsDeleted(false); + documentEntities.add(documentEntity); } } documentRepository.saveAll(documentEntities); @@ -80,19 +75,6 @@ public class DocumentDao { return sourceId; } - private uploadFileOnAmazonS3 uploadFileOnAmazonS3(MultipartFile file) throws IOException { - String extension = FilenameUtils.getExtension(file.getOriginalFilename()); - String fileName = StringUtils.cleanPath(file.getOriginalFilename()); - String firstNameContain = fileName.substring(0, fileName.lastIndexOf('.')); - fileName = (firstNameContain + "." + extension); - String filepath = amazonS3Service.upload(fileName, s3Folder, file); - uploadFileOnAmazonS3 result = new uploadFileOnAmazonS3(fileName, filepath); - return result; - } - - private record uploadFileOnAmazonS3(String fileName, String filepath) { - } - public void deleteFile(Long documentId) { DocumentEntity documentEntity = validateDocument(documentId); // String fileName= Utils.extractFileName(documentEntity.getFilePath()); @@ -101,13 +83,6 @@ public class DocumentDao { documentRepository.save(documentEntity); } - private DocumentEntity deleteFileOnAmazonS3(String fileName) { - try { - amazonS3Service.delete(s3Folder, fileName); - } catch (Exception e) { - } - return null; - } public DocumentEntity validateDocument(Long id) { return documentRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, @@ -116,16 +91,10 @@ public class DocumentDao { public DocumentResponseBean updateDocument(Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum) { DocumentEntity documentEntity = validateDocument(documentId); - String fileName = Utils.extractFileName(documentEntity.getFilePath()); - deleteFileOnAmazonS3(fileName); - uploadFileOnAmazonS3 result = null; - try { - result = uploadFileOnAmazonS3(file); - } catch (IOException e) { - } - if (result != null) { - documentEntity.setFilePath(result.filepath); - documentEntity.setFileName(result.fileName); + UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = amazonS3Service.uploadFileOnAmazonS3(s3Folder, file); + if (uploadFileOnAmazonS3Response != null) { + documentEntity.setFileName(uploadFileOnAmazonS3Response.getFileName()); + documentEntity.setFilePath(uploadFileOnAmazonS3Response.getFilePath()); documentEntity.setType(documentTypeEnum.getValue()); documentEntity.setSource(documentEntity.getSource()); documentEntity.setSourceId(documentEntity.getSourceId()); diff --git a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java index ea3937a3..6cc27000 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java +++ b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java @@ -11,11 +11,10 @@ import java.io.InputStream; @Component public interface AmazonS3Service { - public String upload(String fileName, String s3Folder, MultipartFile file) throws IOException; - - public Boolean delete(String s3Folder, String fileName); - + UploadFileOnAmazonS3Response uploadFileOnAmazonS3(String s3Folder, MultipartFile file); + + Boolean delete(String s3Folder, String filePath); + InputStream getFile(String s3Folder, String filePath) throws IOException; - public UploadFileOnAmazonS3Response uploadFileOnAmazonS3(String s3Folder, MultipartFile file); } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java index a0470c15..56141be2 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java @@ -12,6 +12,8 @@ import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationExceptio import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.apache.commons.io.FilenameUtils; +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.core.env.Environment; @@ -28,6 +30,8 @@ import java.util.Optional; @Service public class AmazonS3ServiceImpl implements AmazonS3Service { + + private final Logger log = LoggerFactory.getLogger(AmazonS3ServiceImpl.class); @Autowired private AmazonS3 amazonS3; @@ -42,11 +46,9 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { private String s3Url; - @Override - public String upload(String fileName, String s3Folder, + private String upload(String fileName, String s3Folder, MultipartFile file) throws IOException { -// String path = bucketName+"/"+s3Folder; String path = s3Folder +"/"+fileName; InputStream inputStream = file.getInputStream(); @@ -66,17 +68,23 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { if(Boolean.FALSE.equals(isTestProfileActivated())) { amazonS3.putObject(bucketName, path, inputStream, objectMetadata); } - return s3Url + s3Folder +"/"+ fileName; + path =s3Url + s3Folder +"/"+ fileName; + log.info("File '{}' uploaded successfully to Amazon S3 with URL: {}", fileName, path); + return path; } @Override - public Boolean delete(String s3Folder, String fileName) { + public Boolean delete(String s3Folder, String filePath) { + + String fileName = Utils.extractFileName(filePath); String path = s3Folder +"/"+fileName; final DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(bucketName, path); if(Boolean.FALSE.equals(isTestProfileActivated())) { amazonS3.deleteObject(deleteObjectRequest); } + log.info("File '{}' deleted successfully from Amazon S3", fileName); return true; + } public Boolean isTestProfileActivated() { @@ -85,28 +93,34 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { } @Override - public InputStream getFile(String s3Folder, String filePath) throws IOException { + public InputStream getFile(String s3Folder, String filePath) { try { - String path = s3Folder +"/"+filePath; + String fileName = Utils.extractFileName(filePath); + String path = s3Folder + "/" + fileName; GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, path); S3Object s3Object = amazonS3.getObject(getObjectRequest); + log.info("File fetched successfully from Amazon S3: {}", fileName); return s3Object.getObjectContent(); } catch (AmazonS3Exception e) { - throw new IOException("Error getting file from Amazon S3", e); + log.error("Error occurred while getting file from Amazon S3: {}", e); + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.GET_ERROR_S3)); } } @Override public UploadFileOnAmazonS3Response uploadFileOnAmazonS3(String s3Folder, MultipartFile file) { String extension = FilenameUtils.getExtension(file.getOriginalFilename()); - String fileName = org.springframework.util.StringUtils.cleanPath(file.getOriginalFilename()); - String firstNameContain = fileName.substring(0, fileName.lastIndexOf('.')); - firstNameContain+=Utils.randomKey(5); - fileName = (firstNameContain + "." + extension); + String originalFileName = org.springframework.util.StringUtils.cleanPath(file.getOriginalFilename()); + String firstNameContain = originalFileName.substring(0, originalFileName.lastIndexOf('.')); + firstNameContain = Utils.replaceSpacesWithUnderscores(firstNameContain); + firstNameContain += "_" + Utils.randomKey(7); + String fileName = (firstNameContain + "." + extension); try { String filepath = upload(fileName, s3Folder, file); - return UploadFileOnAmazonS3Response.builder().fileName(fileName).filePath(filepath).build(); + return UploadFileOnAmazonS3Response.builder().fileName(originalFileName).filePath(filepath).build(); } catch (Exception e) { + log.error("Error occurred while uploading file from Amazon S3: {}", e); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 767872ce..bc8aff6c 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -308,4 +308,11 @@ public class Utils { return new StringTokenizer(header, ",").nextToken().trim(); } + + public static String replaceSpacesWithUnderscores(String content) { + if (content == null) { + return null; + } + return content.trim().replace(" ", "_"); + } } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 15b83fb3..7061921f 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -272,3 +272,5 @@ aasigned.application.not.found=Assigned Application not found with the given ID. assigned.application.deleted.success=Assigned Application successfully deleted. assigned.application.get.success=Assigned Application details fetched successfully. assigned.application.update.successfully=Assigned Application updated successfully. +get.error.s3=Failed to fetch the file from S3. + diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index b8d2dad3..22096e98 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -267,3 +267,4 @@ hub_get_success=Hub recuperato con successo hub_get_all_success=Hub recuperati con successo hub_delete_success=Hub eliminato con successo hub_not_found=Hub non trovato +get.error.s3=Impossibile recuperare il file da S3. From 4386aaafddde319276386d90366409262dc66e3e Mon Sep 17 00:00:00 2001 From: rajesh Date: Wed, 23 Oct 2024 00:14:01 +0530 Subject: [PATCH 23/47] resolved conflicts --- .../constants/GepafinConstant.java | 3 + .../gepafin/tendermanagement/dao/CallDao.java | 5 +- .../tendermanagement/dao/DelegationDao.java | 29 ++------- .../tendermanagement/dao/DocumentDao.java | 63 +++++-------------- .../service/AmazonS3Service.java | 9 ++- .../service/impl/AmazonS3ServiceImpl.java | 40 ++++++++---- .../gepafin/tendermanagement/util/Utils.java | 7 +++ src/main/resources/message_en.properties | 2 +- src/main/resources/message_it.properties | 1 + 9 files changed, 67 insertions(+), 92 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index c21cceaf..d59010ea 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -226,5 +226,8 @@ public class GepafinConstant { public static final String DASHBOARD_WIDGET_FETCHED_SUCCESSFULLY="dashboard.widget.fetched.successfully"; + public static final String GET_ERROR_S3 = "get.error.s3"; + + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index a1d16fd1..e3d4d932 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -127,8 +127,9 @@ public class CallDao { ZipOutputStream zos = new ZipOutputStream(zipOutputStream)) { for (DocumentEntity document : documents) { - try (InputStream fileInputStream = amazonS3Service.getFile(s3Folder, document.getFileName())) { - ZipEntry zipEntry = new ZipEntry(document.getFileName()); + try (InputStream fileInputStream = amazonS3Service.getFile(s3Folder, document.getFilePath())) { + String fileName = Utils.extractFileName(document.getFilePath()); + ZipEntry zipEntry = new ZipEntry(fileName); zos.putNextEntry(zipEntry); IOUtils.copy(fileInputStream, zos); zos.closeEntry(); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java index ca58f8be..f609086f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java @@ -7,7 +7,6 @@ import java.util.HashMap; import java.util.Map; import java.util.function.Function; -import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.springframework.beans.factory.annotation.Autowired; @@ -24,6 +23,7 @@ import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.UserCompanyDelegationStatusEnum; import net.gepafin.tendermanagement.model.request.CompanyDelegationRequest; import net.gepafin.tendermanagement.model.response.CompanyDelegationResponse; +import net.gepafin.tendermanagement.model.response.UploadFileOnAmazonS3Response; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.repositories.DocumentRepository; import net.gepafin.tendermanagement.repositories.UserCompanyDelegationRepository; @@ -96,7 +96,7 @@ public class DelegationDao { companyDao.getUserWithCompany(userEntity.getId(), companyId); updatePlaceholdersForDelegation(user, companyEntity, placeholders, companyDelegationRequest); DocumentEntity documentEntity = documentRepository.findBySource(GepafinConstant.DELEGATION_TEMPLATE).get(0); - return generateDocument(placeholders, documentEntity.getFileName()); + return generateDocument(placeholders, documentEntity.getFilePath()); } private Map updatePlaceholdersForDelegation(UserResponseBean user, CompanyEntity companyEntity, @@ -179,7 +179,7 @@ public class DelegationDao { userCompanyDelegationEntity.setStatus(UserCompanyDelegationStatusEnum.INACTIVE.getValue()); userCompanyDelegationRepository.save(userCompanyDelegationEntity); } - UploadFileOnAmazonS3 uploadFileOnAmazonS3 = uploadFileOnAmazonS3(file); + UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = amazonS3Service.uploadFileOnAmazonS3(s3Folder, file); userCompanyDelegationEntity = new UserCompanyDelegationEntity(); userCompanyDelegationEntity.setCompanyId(companyId); userCompanyDelegationEntity.setUserId(userEntity.getId()); @@ -187,8 +187,8 @@ public class DelegationDao { userCompanyDelegationEntity.setBeneficiaryId(userEntity.getBeneficiary().getId()); } userCompanyDelegationEntity.setStatus(UserCompanyDelegationStatusEnum.ACTIVE.getValue()); - userCompanyDelegationEntity.setFileName(uploadFileOnAmazonS3.fileName()); - userCompanyDelegationEntity.setFilePath(uploadFileOnAmazonS3.filepath()); + userCompanyDelegationEntity.setFileName(uploadFileOnAmazonS3Response.getFileName()); + userCompanyDelegationEntity.setFilePath(uploadFileOnAmazonS3Response.getFilePath()); userCompanyDelegationRepository.save(userCompanyDelegationEntity); return convertUserCompanyDelegationToCompanyDelegationResponse(userCompanyDelegationEntity); } @@ -197,25 +197,6 @@ public class DelegationDao { UserCompanyDelegationEntity userCompanyDelegationEntity) { return Utils.convertSourceObjectToDestinationObject(userCompanyDelegationEntity, CompanyDelegationResponse.class); } - - private UploadFileOnAmazonS3 uploadFileOnAmazonS3(MultipartFile file){ - String extension = FilenameUtils.getExtension(file.getOriginalFilename()); - String fileName = org.springframework.util.StringUtils.cleanPath(file.getOriginalFilename()); - String firstNameContain = fileName.substring(0, fileName.lastIndexOf('.')); - firstNameContain+=Utils.randomKey(5); - fileName = (firstNameContain + "." + extension); - try { - String filepath = amazonS3Service.upload(fileName, s3Folder, file); - return new UploadFileOnAmazonS3(fileName, filepath); - } catch (Exception e) { - throw new CustomValidationException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); - } - - } - - private record UploadFileOnAmazonS3(String fileName, String filepath) { - } private void validateFileType(MultipartFile file) { if (file.isEmpty()) { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index 224a21ec..90725964 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -1,14 +1,11 @@ package net.gepafin.tendermanagement.dao; -import java.io.IOException; import java.util.stream.Collectors; import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; -import org.apache.commons.io.FilenameUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import net.gepafin.tendermanagement.config.Translator; @@ -17,10 +14,10 @@ import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.DocumentEntity; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; +import net.gepafin.tendermanagement.model.response.UploadFileOnAmazonS3Response; import net.gepafin.tendermanagement.repositories.DocumentRepository; import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.service.CallService; -import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; @@ -49,19 +46,17 @@ public class DocumentDao { List documentEntities = new ArrayList<>(); Long source = resolveSourceId(sourceId, sourceType); for (MultipartFile file : files) { - try { - uploadFileOnAmazonS3 result = uploadFileOnAmazonS3(file); - if (result != null) { - DocumentEntity documentEntity = new DocumentEntity(); - documentEntity.setFileName(result.fileName()); - documentEntity.setSource(sourceType.getValue()); - documentEntity.setSourceId(source); - documentEntity.setType(fileType.getValue()); - documentEntity.setFilePath(result.filepath()); - documentEntity.setIsDeleted(false); - documentEntities.add(documentEntity); - } - } catch (IOException e) { + UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = amazonS3Service.uploadFileOnAmazonS3(s3Folder, + file); + if (uploadFileOnAmazonS3Response != null) { + DocumentEntity documentEntity = new DocumentEntity(); + documentEntity.setFileName(uploadFileOnAmazonS3Response.getFileName()); + documentEntity.setSource(sourceType.getValue()); + documentEntity.setSourceId(source); + documentEntity.setType(fileType.getValue()); + documentEntity.setFilePath(uploadFileOnAmazonS3Response.getFilePath()); + documentEntity.setIsDeleted(false); + documentEntities.add(documentEntity); } } documentRepository.saveAll(documentEntities); @@ -80,19 +75,6 @@ public class DocumentDao { return sourceId; } - private uploadFileOnAmazonS3 uploadFileOnAmazonS3(MultipartFile file) throws IOException { - String extension = FilenameUtils.getExtension(file.getOriginalFilename()); - String fileName = StringUtils.cleanPath(file.getOriginalFilename()); - String firstNameContain = fileName.substring(0, fileName.lastIndexOf('.')); - fileName = (firstNameContain + "." + extension); - String filepath = amazonS3Service.upload(fileName, s3Folder, file); - uploadFileOnAmazonS3 result = new uploadFileOnAmazonS3(fileName, filepath); - return result; - } - - private record uploadFileOnAmazonS3(String fileName, String filepath) { - } - public void deleteFile(Long documentId) { DocumentEntity documentEntity = validateDocument(documentId); // String fileName= Utils.extractFileName(documentEntity.getFilePath()); @@ -101,13 +83,6 @@ public class DocumentDao { documentRepository.save(documentEntity); } - private DocumentEntity deleteFileOnAmazonS3(String fileName) { - try { - amazonS3Service.delete(s3Folder, fileName); - } catch (Exception e) { - } - return null; - } public DocumentEntity validateDocument(Long id) { return documentRepository.findById(id).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, @@ -116,16 +91,10 @@ public class DocumentDao { public DocumentResponseBean updateDocument(Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum) { DocumentEntity documentEntity = validateDocument(documentId); - String fileName = Utils.extractFileName(documentEntity.getFilePath()); - deleteFileOnAmazonS3(fileName); - uploadFileOnAmazonS3 result = null; - try { - result = uploadFileOnAmazonS3(file); - } catch (IOException e) { - } - if (result != null) { - documentEntity.setFilePath(result.filepath); - documentEntity.setFileName(result.fileName); + UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = amazonS3Service.uploadFileOnAmazonS3(s3Folder, file); + if (uploadFileOnAmazonS3Response != null) { + documentEntity.setFileName(uploadFileOnAmazonS3Response.getFileName()); + documentEntity.setFilePath(uploadFileOnAmazonS3Response.getFilePath()); documentEntity.setType(documentTypeEnum.getValue()); documentEntity.setSource(documentEntity.getSource()); documentEntity.setSourceId(documentEntity.getSourceId()); diff --git a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java index ea3937a3..6cc27000 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java +++ b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java @@ -11,11 +11,10 @@ import java.io.InputStream; @Component public interface AmazonS3Service { - public String upload(String fileName, String s3Folder, MultipartFile file) throws IOException; - - public Boolean delete(String s3Folder, String fileName); - + UploadFileOnAmazonS3Response uploadFileOnAmazonS3(String s3Folder, MultipartFile file); + + Boolean delete(String s3Folder, String filePath); + InputStream getFile(String s3Folder, String filePath) throws IOException; - public UploadFileOnAmazonS3Response uploadFileOnAmazonS3(String s3Folder, MultipartFile file); } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java index a0470c15..56141be2 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java @@ -12,6 +12,8 @@ import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationExceptio import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.apache.commons.io.FilenameUtils; +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.core.env.Environment; @@ -28,6 +30,8 @@ import java.util.Optional; @Service public class AmazonS3ServiceImpl implements AmazonS3Service { + + private final Logger log = LoggerFactory.getLogger(AmazonS3ServiceImpl.class); @Autowired private AmazonS3 amazonS3; @@ -42,11 +46,9 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { private String s3Url; - @Override - public String upload(String fileName, String s3Folder, + private String upload(String fileName, String s3Folder, MultipartFile file) throws IOException { -// String path = bucketName+"/"+s3Folder; String path = s3Folder +"/"+fileName; InputStream inputStream = file.getInputStream(); @@ -66,17 +68,23 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { if(Boolean.FALSE.equals(isTestProfileActivated())) { amazonS3.putObject(bucketName, path, inputStream, objectMetadata); } - return s3Url + s3Folder +"/"+ fileName; + path =s3Url + s3Folder +"/"+ fileName; + log.info("File '{}' uploaded successfully to Amazon S3 with URL: {}", fileName, path); + return path; } @Override - public Boolean delete(String s3Folder, String fileName) { + public Boolean delete(String s3Folder, String filePath) { + + String fileName = Utils.extractFileName(filePath); String path = s3Folder +"/"+fileName; final DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(bucketName, path); if(Boolean.FALSE.equals(isTestProfileActivated())) { amazonS3.deleteObject(deleteObjectRequest); } + log.info("File '{}' deleted successfully from Amazon S3", fileName); return true; + } public Boolean isTestProfileActivated() { @@ -85,28 +93,34 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { } @Override - public InputStream getFile(String s3Folder, String filePath) throws IOException { + public InputStream getFile(String s3Folder, String filePath) { try { - String path = s3Folder +"/"+filePath; + String fileName = Utils.extractFileName(filePath); + String path = s3Folder + "/" + fileName; GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, path); S3Object s3Object = amazonS3.getObject(getObjectRequest); + log.info("File fetched successfully from Amazon S3: {}", fileName); return s3Object.getObjectContent(); } catch (AmazonS3Exception e) { - throw new IOException("Error getting file from Amazon S3", e); + log.error("Error occurred while getting file from Amazon S3: {}", e); + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.GET_ERROR_S3)); } } @Override public UploadFileOnAmazonS3Response uploadFileOnAmazonS3(String s3Folder, MultipartFile file) { String extension = FilenameUtils.getExtension(file.getOriginalFilename()); - String fileName = org.springframework.util.StringUtils.cleanPath(file.getOriginalFilename()); - String firstNameContain = fileName.substring(0, fileName.lastIndexOf('.')); - firstNameContain+=Utils.randomKey(5); - fileName = (firstNameContain + "." + extension); + String originalFileName = org.springframework.util.StringUtils.cleanPath(file.getOriginalFilename()); + String firstNameContain = originalFileName.substring(0, originalFileName.lastIndexOf('.')); + firstNameContain = Utils.replaceSpacesWithUnderscores(firstNameContain); + firstNameContain += "_" + Utils.randomKey(7); + String fileName = (firstNameContain + "." + extension); try { String filepath = upload(fileName, s3Folder, file); - return UploadFileOnAmazonS3Response.builder().fileName(fileName).filePath(filepath).build(); + return UploadFileOnAmazonS3Response.builder().fileName(originalFileName).filePath(filepath).build(); } catch (Exception e) { + log.error("Error occurred while uploading file from Amazon S3: {}", e); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index d7da174b..bde1e006 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -303,4 +303,11 @@ public class Utils { return text.replace(target, replacement != null ? replacement : ""); } + public static String replaceSpacesWithUnderscores(String content) { + if (content == null) { + return null; + } + return content.trim().replace(" ", "_"); + } + } diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 31a22928..f5d04b80 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -248,5 +248,5 @@ application.signed.document.not.found=Signed document for the application not fo delete.signed.document.file.success=Signed document deleted successfully. dashboard.widget.fetched.successfully=Dasboard widget fetched sucessfully. - +get.error.s3=Failed to fetch the file from S3. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 74b6e2b7..3ef4b992 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -244,4 +244,5 @@ application.signed.document.not.found=Documento firmato per l'applicazione non t delete.signed.document.file.success=Documento firmato eliminato con successo. dashboard.widget.fetched.successfully=Widget dashboard recuperato correttamente. +get.error.s3=Impossibile recuperare il file da S3. From 647c05d457e0dc0f7341873072cd33107f1b3aed Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 23 Oct 2024 12:23:34 +0530 Subject: [PATCH 24/47] Time issue resolve --- .../constants/GepafinConstant.java | 1 + .../dao/AssignedApplicationsDao.java | 7 +++++ .../model/response/CallResponse.java | 4 +++ .../util/DynamicLocalTimeSerializer.java | 26 +++++++++++++++++++ src/main/resources/message_en.properties | 2 +- src/main/resources/message_it.properties | 1 + 6 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/util/DynamicLocalTimeSerializer.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 7a1eba03..c5b18460 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -250,5 +250,6 @@ public class GepafinConstant { public static final String EVALUATIONCRITERIA_INVALID = "evaluationCriteria.invalid"; public static final String APPLICATION_NOT_IN_DRAFT_STATUS="application.not.in.draft.status"; public static final String GET_ERROR_S3 = "get.error.s3"; + public static final String INVALID_APPLICATION_STATUS = "invalid.application.status"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index 5f555ac3..cfdb31ab 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -5,6 +5,7 @@ import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.AssignedApplicationsEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; @@ -46,6 +47,12 @@ public class AssignedApplicationsDao { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_ASSIGNED)); } ApplicationEntity application = applicationService.validateApplication(applicationId); + if (Boolean.FALSE.equals(ApplicationStatusTypeEnum.SUBMIT.equals(application.getStatus()))) { + throw new CustomValidationException( + Status.BAD_REQUEST, + Translator.toLocale(GepafinConstant.INVALID_APPLICATION_STATUS) + ); + } UserEntity user = userService.validateUser(userId); AssignedApplicationsEntity assignment = createAssignmentEntity(application, user.getId(), assignedByUser, assignedApplicationsRequest); AssignedApplicationsResponse assignApplicationToInstructorResponse = convertEntityToResponse(assignment, assignedApplicationsRequest); diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java index ed4a0206..b26460ab 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallResponse.java @@ -5,8 +5,10 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.util.List; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import lombok.Data; import net.gepafin.tendermanagement.enums.CallStatusEnum; +import net.gepafin.tendermanagement.util.DynamicLocalTimeSerializer; @Data public class CallResponse { @@ -47,8 +49,10 @@ public class CallResponse { private String phoneNumber; + @JsonSerialize(using = DynamicLocalTimeSerializer.class) private LocalTime startTime; + @JsonSerialize(using = DynamicLocalTimeSerializer.class) private LocalTime endTime; private LocalDateTime createdDate; diff --git a/src/main/java/net/gepafin/tendermanagement/util/DynamicLocalTimeSerializer.java b/src/main/java/net/gepafin/tendermanagement/util/DynamicLocalTimeSerializer.java new file mode 100644 index 00000000..0fcdaa77 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/util/DynamicLocalTimeSerializer.java @@ -0,0 +1,26 @@ +package net.gepafin.tendermanagement.util; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; + +public class DynamicLocalTimeSerializer extends JsonSerializer { + private static final DateTimeFormatter HH_MM_FORMAT = DateTimeFormatter.ofPattern("HH:mm"); + private static final DateTimeFormatter HH_MM_SS_FORMAT = DateTimeFormatter.ofPattern("HH:mm:ss"); + + @Override + public void serialize(LocalTime time, JsonGenerator gen, SerializerProvider serializers) throws IOException { + // Use HH:mm if seconds are 00, otherwise use HH:mm:ss + String formattedTime = (time.getSecond() == 0) + ? time.format(HH_MM_FORMAT) + : time.format(HH_MM_SS_FORMAT); + + gen.writeString(formattedTime); + } + + +} diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index c971aa0d..b92a48f9 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -275,4 +275,4 @@ assigned.application.deleted.success=Assigned Application successfully deleted. assigned.application.get.success=Assigned Application details fetched successfully. assigned.application.update.successfully=Assigned Application updated successfully. get.error.s3=Failed to fetch the file from S3. - +invalid.application.status = Invalid Application status. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index ce0dd9b5..214a198e 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -259,6 +259,7 @@ aasigned.application.not.found = Applicazione assegnata non trovata con l'ID spe assigned.application.deleted.success =Applicazione assegnata eliminata con successo. assigned.application.get.success =Dettagli dell'applicazione assegnata recuperati correttamente. assigned.application.update.successfully = Applicazione assegnata aggiornata correttamente. +invalid.application.status = Stato della domanda non valido. # Hub Messages hub_create_success=Hub creato con successo From 1c2471c1982b6d764101f26d47493484e430d4aa Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 23 Oct 2024 12:38:57 +0530 Subject: [PATCH 25/47] updated code --- .../java/net/gepafin/tendermanagement/dao/ApplicationDao.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 7e9eaa6e..82503677 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -134,8 +134,8 @@ public class ApplicationDao { validateFormFields(applicationRequestBean,formEntity); ApplicationEntity applicationEntity = validateApplication(applicationId); validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); - if(Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.SUBMIT.getValue()))) { - throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_SUBMITTED)); + if(Boolean.FALSE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.DRAFT.getValue()))) { + throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_NOT_IN_DRAFT_STATUS)); } formService.validateFormField(applicationRequestBean.getFormFields(),applicationEntity,formEntity); ApplicationFormEntity applicationFormEntity = getApplicationFormOrCreate(formEntity, applicationEntity); From c4c43ead956ed589320a8497ceb05edb4d86108c Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 23 Oct 2024 15:07:44 +0530 Subject: [PATCH 26/47] updated code for login with other hub --- .../tendermanagement/config/SamlSuccessHandler.java | 2 +- .../tendermanagement/repositories/UserRepository.java | 2 ++ .../service/impl/AuthenticationService.java | 8 +++++++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java index 3c5ed0fb..14f2b1bf 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java @@ -110,7 +110,7 @@ public class SamlSuccessHandler implements AuthenticationSuccessHandler { logger.info("SAML login successful for user: " + principal.getName()); String cf = userAttributes.get("CodiceFiscale").get(0).toString(); - UserEntity userEntity = userRepository.findByBeneficiaryCodiceFiscale(cf).orElse(null); + UserEntity userEntity = userRepository.findByBeneficiaryCodiceFiscaleAndHubId(cf, hub.getId()).orElse(null); if (userEntity == null) { redirectUrl += "/registration?temp_token=" + token; } else { diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java index e474fccf..c9122eb7 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java @@ -33,4 +33,6 @@ public interface UserRepository extends JpaRepository { List findByHubId(Long hubId); Long countByStatusAndRoleEntityRoleTypeAndHubId(String status, String roleName, Long hubId); + + Optional findByBeneficiaryCodiceFiscaleAndHubId(String codiceFiscale, Long hubId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java index 95eb6763..3fe819a4 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -8,6 +8,7 @@ import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.dao.CompanyDao; import net.gepafin.tendermanagement.dao.LoginAttemptDao; import net.gepafin.tendermanagement.dao.RoleDao; +import net.gepafin.tendermanagement.entities.HubEntity; import net.gepafin.tendermanagement.entities.LoginAttemptEntity; import net.gepafin.tendermanagement.entities.SamlResponseEntity; import net.gepafin.tendermanagement.entities.UserEntity; @@ -22,6 +23,7 @@ import net.gepafin.tendermanagement.model.response.UserSamlResponse; import net.gepafin.tendermanagement.model.util.JWTToken; import net.gepafin.tendermanagement.repositories.SamlResponseRepository; import net.gepafin.tendermanagement.repositories.UserRepository; +import net.gepafin.tendermanagement.service.HubService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; @@ -63,6 +65,9 @@ public class AuthenticationService { @Autowired private LoginAttemptDao loginAttemptDao; + + @Autowired + private HubService hubService; @Autowired public AuthenticationService(TokenProvider tokenProvider, AuthenticationManager authenticationManager) { @@ -186,10 +191,11 @@ public class AuthenticationService { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_TOKEN_MSG)); } + HubEntity hub = hubService.getHubByUuid(samlResponseLogEntity.getHubUuid()); Map> userAttributes = Utils .convertStringIntoMap(samlResponseLogEntity.getAuthenticationObject()); String cf = userAttributes.get("CodiceFiscale").get(0).toString(); - UserEntity userEntity = userRepository.findByBeneficiaryCodiceFiscale(cf) + UserEntity userEntity = userRepository.findByBeneficiaryCodiceFiscaleAndHubId(cf, hub.getId()) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); //samlResponseLogRepository.delete(samlResponseLogEntity); From 8f66b39663e4727b641bf838d47065348e7193f5 Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 23 Oct 2024 19:42:58 +0530 Subject: [PATCH 27/47] Added confidi in get all call response --- src/main/java/net/gepafin/tendermanagement/dao/CallDao.java | 2 ++ .../model/response/CallDetailsResponseBean.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 8cee9587..2b8a2475 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -601,6 +601,7 @@ public class CallDao { dates.add(callEntity.getStartDate()); dates.add(callEntity.getEndDate()); callDetailsResponseBean.setDates(dates); + callDetailsResponseBean.setConfidi(callEntity.getConfidi()); callDetailsResponseBean.setDescriptionShort(callEntity.getDescriptionShort()); callDetailsResponseBean.setDescriptionLong(callEntity.getDescriptionLong()); callDetailsResponseBean.setStatus(CallStatusEnum.valueOf(callEntity.getStatus())); @@ -619,6 +620,7 @@ public class CallDao { callDetailsResponseBean.setPhoneNumber(callEntity.getPhoneNumber()); callDetailsResponseBean.setCreatedDate(callEntity.getCreatedDate()); callDetailsResponseBean.setUpdatedDate(callEntity.getUpdatedDate()); + return callDetailsResponseBean; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java index 51479254..6338949e 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java @@ -20,6 +20,8 @@ public class CallDetailsResponseBean { private List dates; + private Boolean confidi; + private CallStatusEnum status; private Long regionId; From 9b496d7b960d729ad740b156001e7e6fba0a9af7 Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 23 Oct 2024 19:42:58 +0530 Subject: [PATCH 28/47] Added confidi in get all call response --- src/main/java/net/gepafin/tendermanagement/dao/CallDao.java | 2 ++ .../model/response/CallDetailsResponseBean.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index e3d4d932..5a8a604a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -597,6 +597,7 @@ public class CallDao { dates.add(callEntity.getStartDate()); dates.add(callEntity.getEndDate()); callDetailsResponseBean.setDates(dates); + callDetailsResponseBean.setConfidi(callEntity.getConfidi()); callDetailsResponseBean.setDescriptionShort(callEntity.getDescriptionShort()); callDetailsResponseBean.setDescriptionLong(callEntity.getDescriptionLong()); callDetailsResponseBean.setStatus(CallStatusEnum.valueOf(callEntity.getStatus())); @@ -615,6 +616,7 @@ public class CallDao { callDetailsResponseBean.setPhoneNumber(callEntity.getPhoneNumber()); callDetailsResponseBean.setCreatedDate(callEntity.getCreatedDate()); callDetailsResponseBean.setUpdatedDate(callEntity.getUpdatedDate()); + return callDetailsResponseBean; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java index 51479254..6338949e 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CallDetailsResponseBean.java @@ -20,6 +20,8 @@ public class CallDetailsResponseBean { private List dates; + private Boolean confidi; + private CallStatusEnum status; private Long regionId; From 54a101b847e0ba00a0541c5bab7f5408ab2dde4a Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 23 Oct 2024 21:11:17 +0530 Subject: [PATCH 29/47] Fixed issue assigned application issue --- .../tendermanagement/dao/AssignedApplicationsDao.java | 2 +- src/main/java/net/gepafin/tendermanagement/dao/CallDao.java | 1 + .../gepafin/tendermanagement/dao/EvaluationCriteriaDao.java | 5 ++++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index cfdb31ab..8f77baff 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -47,7 +47,7 @@ public class AssignedApplicationsDao { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_ASSIGNED)); } ApplicationEntity application = applicationService.validateApplication(applicationId); - if (Boolean.FALSE.equals(ApplicationStatusTypeEnum.SUBMIT.equals(application.getStatus()))) { + if (Boolean.FALSE.equals(ApplicationStatusTypeEnum.SUBMIT.getValue().equals(application.getStatus()))) { throw new CustomValidationException( Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.INVALID_APPLICATION_STATUS) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 2b8a2475..d8cd0a5c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -230,6 +230,7 @@ public class CallDao { criteriaEntity = new EvaluationCriteriaEntity(); criteriaEntity.setCall(callEntity); criteriaEntity.setLookupData(lookupDataEntity); + criteriaEntity.setScore(0L); criteriaEntity.setIsDeleted(false); } setIfUpdated(criteriaEntity::getScore, criteriaEntity::setScore, criteriaReq.getScore()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java index b865121e..86a7693f 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java @@ -50,7 +50,10 @@ public class EvaluationCriteriaDao { .validateLookUpData(evaluationCriteriaRequest.getLookUpDataId()); entity.setCall(callEntity); entity.setLookupData(looDataEntity); - entity.setScore(evaluationCriteriaRequest.getScore()); + entity.setScore(0L); + if (evaluationCriteriaRequest.getScore() != null) { + entity.setScore(evaluationCriteriaRequest.getScore()); + } entity = evaluationCriteriaRepository.save(entity); return entity; } From f238790f26e35659bfd6343693d03448936cbf11 Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 23 Oct 2024 21:11:17 +0530 Subject: [PATCH 30/47] resolved conflicts --- src/main/java/net/gepafin/tendermanagement/dao/CallDao.java | 1 + .../gepafin/tendermanagement/dao/EvaluationCriteriaDao.java | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 5a8a604a..e7b303d2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -223,6 +223,7 @@ public class CallDao { criteriaEntity = new EvaluationCriteriaEntity(); criteriaEntity.setCall(callEntity); criteriaEntity.setLookupData(lookupDataEntity); + criteriaEntity.setScore(0L); criteriaEntity.setIsDeleted(false); } setIfUpdated(criteriaEntity::getScore, criteriaEntity::setScore, criteriaReq.getScore()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java index f747d38f..1be3cf7d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/EvaluationCriteriaDao.java @@ -43,7 +43,10 @@ public class EvaluationCriteriaDao { .validateLookUpData(evaluationCriteriaRequest.getLookUpDataId()); entity.setCall(callEntity); entity.setLookupData(looDataEntity); - entity.setScore(evaluationCriteriaRequest.getScore()); + entity.setScore(0L); + if (evaluationCriteriaRequest.getScore() != null) { + entity.setScore(evaluationCriteriaRequest.getScore()); + } entity = evaluationCriteriaRepository.save(entity); return entity; } From 8f7eb354ea9e357930a55ac85be113b12905ec5f Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 23 Oct 2024 21:40:05 +0530 Subject: [PATCH 31/47] Fixed issue related to assigned application --- .../dao/AssignedApplicationsDao.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index 8f77baff..03f8f83a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -55,7 +55,7 @@ public class AssignedApplicationsDao { } UserEntity user = userService.validateUser(userId); AssignedApplicationsEntity assignment = createAssignmentEntity(application, user.getId(), assignedByUser, assignedApplicationsRequest); - AssignedApplicationsResponse assignApplicationToInstructorResponse = convertEntityToResponse(assignment, assignedApplicationsRequest); + AssignedApplicationsResponse assignApplicationToInstructorResponse = convertEntityToResponse(assignment); log.info("Application assigned succesfully {}", assignApplicationToInstructorResponse); return assignApplicationToInstructorResponse; @@ -66,7 +66,10 @@ public class AssignedApplicationsDao { assignApplication.setApplication(application); assignApplication.setAssignedBy(assignedByUser.getId()); assignApplication.setUserId(userId); - assignApplication.setStatus(assignedApplicationsRequest.getStatus().getValue()); + assignApplication.setStatus(AssignedApplicationEnum.ASSIGNED.getValue()); + if(assignedApplicationsRequest.getStatus() != null) { + assignApplication.setStatus(assignedApplicationsRequest.getStatus().getValue()); + } assignApplication.setNote(assignedApplicationsRequest.getNote()); assignApplication.setIsDeleted(false); assignApplication.setAssignedAt(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); @@ -79,7 +82,7 @@ public class AssignedApplicationsDao { return assignedApplication; } - public AssignedApplicationsResponse convertEntityToResponse(AssignedApplicationsEntity application, AssignedApplicationsRequest assignedApplicationsRequest){ + public AssignedApplicationsResponse convertEntityToResponse(AssignedApplicationsEntity application){ AssignedApplicationsResponse assignedApplicationsResponse = new AssignedApplicationsResponse(); assignedApplicationsResponse.setId(application.getId()); assignedApplicationsResponse.setApplicationId(application.getApplication().getId()); @@ -111,7 +114,7 @@ public class AssignedApplicationsDao { Specification spec = search(userId); List assignedApplicationsEntityList = assignedApplicationsRepository.findAll(spec); return assignedApplicationsEntityList.stream() - .map(entity -> convertEntityToResponse(entity, new AssignedApplicationsRequest())) + .map(entity -> convertEntityToResponse(entity)) .collect(Collectors.toList()); } private Specification search(Long userId) { @@ -138,7 +141,7 @@ public class AssignedApplicationsDao { existingAssignment.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); AssignedApplicationsEntity updatedAssignment = saveAssignedApplication(existingAssignment); - AssignedApplicationsResponse response = convertEntityToResponse(updatedAssignment, updateRequest); + AssignedApplicationsResponse response = convertEntityToResponse(updatedAssignment); log.info("Assigned application updated successfully: {}", response); return response; } @@ -146,7 +149,7 @@ public class AssignedApplicationsDao { public AssignedApplicationsResponse getAssignedApplicationById(Long id) { log.info("Fetching assigned application with ID: {}", id); AssignedApplicationsEntity assignedApplication = validateAssignedApplication(id); - AssignedApplicationsResponse response = convertEntityToResponse(assignedApplication, new AssignedApplicationsRequest()); + AssignedApplicationsResponse response = convertEntityToResponse(assignedApplication); log.info("Assigned application fetched successfully: {}", response); return response; } From 3c40470dfc932aec85e42a7f50d092aeb10c8a96 Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 24 Oct 2024 14:51:03 +0530 Subject: [PATCH 32/47] updated code for hub new changes --- .../tendermanagement/dao/ApplicationDao.java | 1 + .../tendermanagement/dao/CompanyDao.java | 10 +-- .../tendermanagement/dao/DashboardDao.java | 2 +- .../gepafin/tendermanagement/dao/UserDao.java | 20 +++--- .../entities/ApplicationEntity.java | 3 + .../entities/BeneficiaryEntity.java | 3 + .../entities/CompanyEntity.java | 7 ++ .../repositories/CompanyRepository.java | 12 ++-- .../repositories/UserRepository.java | 16 +---- .../UserWithCompanyRepository.java | 6 +- .../service/impl/AuthenticationService.java | 3 +- .../BeneficiaryPreferredCallServiceImpl.java | 8 +-- .../service/impl/CompanyServiceImpl.java | 4 +- .../tendermanagement/util/Validator.java | 16 ++++- .../db/changelog/db.changelog-1.0.0.xml | 66 +++++++++++++++++++ 15 files changed, 130 insertions(+), 47 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 82503677..fe86a5c6 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -175,6 +175,7 @@ public class ApplicationDao { entity.setUserId(user.getId()); entity.setCompany(companyEntity); entity.setCall(call); + entity.setHubId(call.getHub().getId()); entity.setIsDeleted(false); entity.setStatus(ApplicationStatusTypeEnum.DRAFT.getValue()); return entity; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java index 2208962b..0f59fc08 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java @@ -40,7 +40,7 @@ public class CompanyDao { public CompanyResponse createCompany(UserEntity userEntity, CompanyRequest companyRequest) { - CompanyEntity existingCompany = companyRepository.findByVatNumber(companyRequest.getVatNumber()); + CompanyEntity existingCompany = companyRepository.findByVatNumberAndHubId(companyRequest.getVatNumber(), userEntity.getHub().getId()); UserWithCompanyEntity userWithCompanyEntity = null; if (existingCompany != null) { UserWithCompanyEntity existingRelation = userWithCompanyRepository.findByUserIdAndCompanyIdAndIsDeletedFalse(userEntity.getId(), existingCompany.getId()) @@ -53,7 +53,7 @@ public class CompanyDao { } return convertCompanyEntityToCompanyResponse(existingCompany, userWithCompanyEntity); } else { - validateCompany(companyRequest); + validateCompany(userEntity, companyRequest); CompanyEntity companyEntity = convertCompanyRequestToCompanyEntity(companyRequest); companyRepository.save(companyEntity); userWithCompanyEntity = createUserWithCompanyRelation(userEntity, companyEntity, companyRequest.getIsLegalRepresentant()); @@ -62,7 +62,7 @@ public class CompanyDao { } - private void validateCompany(CompanyRequest companyRequest) { + private void validateCompany(UserEntity userEntity, CompanyRequest companyRequest) { if (Boolean.FALSE.equals(StringUtils.isEmpty(companyRequest.getEmail())) && Boolean.FALSE.equals(Utils.isValidEmail(companyRequest.getEmail()))) { @@ -73,7 +73,7 @@ public class CompanyDao { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.VATNUMBER_MANDATORY)); } - if (companyRepository.existsByVatNumber(companyRequest.getVatNumber())) { + if (companyRepository.existsByVatNumberAndHubId(companyRequest.getVatNumber(), userEntity.getHub().getId())) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.VATNUMBER_ALREADY_EXISTS)); } @@ -186,7 +186,7 @@ public class CompanyDao { public List getCompanyByUserId(Long userId) { UserEntity userEntity = userService.validateUser(userId); List activeCompanyIds = userWithCompanyRepository.findActiveCompanyIdsByUserId(userEntity.getId()); - List companies = companyRepository.findByIdIn(activeCompanyIds); + List companies = companyRepository.findByIdInAndHubId(activeCompanyIds, userEntity.getHub().getId()); return companies.stream().map(companyEntity -> { UserWithCompanyEntity userWithCompanyEntity = getUserWithCompany(userEntity.getId(), companyEntity.getId()); return convertCompanyEntityToCompanyResponse(companyEntity, userWithCompanyEntity); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java index a849f67d..de20f607 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java @@ -94,7 +94,7 @@ public class DashboardDao { } private void setNumberOfCompanies(Widget1 widget1, UserEntity requestedUserEntity) { - Long numberOfCompanies = companyRepository.countTotalCompanies(); + Long numberOfCompanies = companyRepository.countTotalCompaniesByHubId(requestedUserEntity.getHub().getId()); if (numberOfCompanies != null) { widget1.setNumberOfCompany(numberOfCompanies); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index ae75d8bd..6a776f07 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -6,6 +6,7 @@ import net.gepafin.tendermanagement.config.SamlSuccessHandler; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.BeneficiaryEntity; +import net.gepafin.tendermanagement.entities.HubEntity; import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.RoleStatusEnum; @@ -84,17 +85,17 @@ public class UserDao { if(StringUtils.isEmpty(userReq.getHubUuid())) { userReq.setHubUuid(defaultHubUuid); } - validateUserRequest(request, tempToken, userReq); + HubEntity hub = hubService.getHubByUuid(userReq.getHubUuid()); + validateUserRequest(request, tempToken, userReq, hub); validatePassword(userReq.getPassword(), userReq.getConfPassword(), tempToken); - RoleEntity roleEntity = getRoleEntity(userReq.getRoleId()); - BeneficiaryEntity beneficiary = createBeneficiary(roleEntity, userReq); - UserEntity userEntity = convertUserRequestToUserEntity(beneficiary, roleEntity, userReq); + BeneficiaryEntity beneficiary = createBeneficiary(roleEntity, userReq, hub); + UserEntity userEntity = convertUserRequestToUserEntity(beneficiary, roleEntity, userReq, hub); log.info("User created with ID: {}", userEntity.getId()); return authService.getJWTTokenBean(userEntity, Boolean.TRUE); } - private BeneficiaryEntity createBeneficiary(RoleEntity roleEntity, UserReq userReq) { + private BeneficiaryEntity createBeneficiary(RoleEntity roleEntity, UserReq userReq, HubEntity hub) { BeneficiaryEntity beneficiaryEntity = null; if (RoleStatusEnum.ROLE_BENEFICIARY.getValue().equals(roleEntity.getRoleType())) { beneficiaryEntity = new BeneficiaryEntity(); @@ -114,12 +115,13 @@ public class UserDao { beneficiaryEntity.setMarketing(userReq.getMarketing()); beneficiaryEntity.setThirdParty(userReq.getThirdParty()); beneficiaryEntity.setEmailPec(userReq.getEmailPec()); + beneficiaryEntity.setHubId(hub.getId()); beneficiaryEntity =beneficiaryRepository.save(beneficiaryEntity); } return beneficiaryEntity; } - private void validateUserRequest(HttpServletRequest request, String tempToken, UserReq userReq) { + private void validateUserRequest(HttpServletRequest request, String tempToken, UserReq userReq, HubEntity hub) { if (tempToken == null) { validator.validateRequest(request,RoleStatusEnum.ROLE_SUPER_ADMIN); @@ -139,7 +141,7 @@ public class UserDao { Translator.toLocale(GepafinConstant.EMAIL_ALREADY_EXISTS)); } if (Boolean.FALSE.equals(StringUtils.isEmpty(userReq.getCodiceFiscale())) - && userRepository.existsByBeneficiaryCodiceFiscale(userReq.getCodiceFiscale())) { + && userRepository.existsByBeneficiaryCodiceFiscaleAndHubId(userReq.getCodiceFiscale(), hub.getId())) { log.error("User creation failed: CodiceFiscale {} already exists", userReq.getCodiceFiscale()); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CODICE_FISCALE_EXISTS)); @@ -206,7 +208,7 @@ public class UserDao { return convertUserEntityToUserResponse(userEntity); } - private UserEntity convertUserRequestToUserEntity(BeneficiaryEntity beneficiary, RoleEntity roleEntity, UserReq userReq) { + private UserEntity convertUserRequestToUserEntity(BeneficiaryEntity beneficiary, RoleEntity roleEntity, UserReq userReq, HubEntity hub) { UserEntity userEntity = new UserEntity(); if(Boolean.FALSE.equals(StringUtils.isEmpty(userReq.getPassword()))) { userEntity.setPassword(passwordEncoder.encode(userReq.getPassword())); @@ -215,7 +217,7 @@ public class UserDao { userEntity.setEmail(userReq.getEmail()); userEntity.setStatus(UserStatusEnum.ACTIVE.getValue()); userEntity.setBeneficiary(beneficiary); - userEntity.setHub(hubService.getHubByUuid(userReq.getHubUuid())); + userEntity.setHub(hub); if (Boolean.FALSE.equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue().equals(roleEntity.getRoleType()))) { userEntity.setFirstName(userReq.getFirstName()); userEntity.setLastName(userReq.getLastName()); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java index cc0f929e..5ddebe5c 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java @@ -39,4 +39,7 @@ public class ApplicationEntity extends BaseEntity { @OneToOne @JoinColumn(name = "PROTOCOL_NUMBER") private ProtocolEntity protocol; + + @Column(name = "HUB_ID") + private Long hubId; } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java index bae88c90..2e84dd51 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java @@ -61,4 +61,7 @@ public class BeneficiaryEntity extends BaseEntity { @Column(name = "EMAIL_PEC") private String emailPec; + + @Column(name = "HUB_ID") + private Long hubId; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java index c35a8cf0..ed50268f 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java @@ -4,6 +4,8 @@ import java.math.BigDecimal; import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; import lombok.Data; @@ -56,4 +58,9 @@ public class CompanyEntity extends BaseEntity{ @Column(name = "CONTACT_EMAIL") private String contactEmail; + + @ManyToOne + @JoinColumn(name = "HUB_ID") + private HubEntity hub; + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java index c0c5f75d..b9395883 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java @@ -4,6 +4,7 @@ import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import net.gepafin.tendermanagement.entities.CompanyEntity; @@ -11,13 +12,14 @@ import net.gepafin.tendermanagement.entities.CompanyEntity; @Repository public interface CompanyRepository extends JpaRepository { - List findByIdIn(List companyIds); + List findByIdInAndHubId(List companyIds, Long hubId); - Boolean existsByVatNumber(String vatNumber); - CompanyEntity findByVatNumber(String vatNumber); + Boolean existsByVatNumberAndHubId(String vatNumber, Long hubId); - @Query("SELECT COUNT(c) FROM CompanyEntity c") - long countTotalCompanies(); + @Query("SELECT COUNT(c) FROM CompanyEntity c where c.hub.id = :hubId") + long countTotalCompaniesByHubId(@Param("hubId") Long hubId); + + CompanyEntity findByVatNumberAndHubId(String vatNumber, Long hubId); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java index c9122eb7..47ab16b8 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java @@ -10,21 +10,9 @@ import java.util.Optional; @Repository public interface UserRepository extends JpaRepository { -// Optional findByEmailIgnoreCase(String email); - -// boolean existsByEmailIgnoreCase(String email); - -// UserEntity findByEmail(String email); - - Optional findByBeneficiaryCodiceFiscale(String codiceFiscale); - - boolean existsByBeneficiaryCodiceFiscale(String codiceFiscale); - UserEntity findByBeneficiaryId(Long beneficiaryId); - Long countByStatusAndRoleEntityRoleType(String status, String roleName); - - Optional findByEmailIgnoreCaseAndHubUniqueUuid(String email, String hubId); + Optional findByEmailIgnoreCaseAndHubUniqueUuid(String email, String hubUuid); boolean existsByEmailIgnoreCaseAndHubUniqueUuid(String email, String hubUuid); @@ -35,4 +23,6 @@ public interface UserRepository extends JpaRepository { Long countByStatusAndRoleEntityRoleTypeAndHubId(String status, String roleName, Long hubId); Optional findByBeneficiaryCodiceFiscaleAndHubId(String codiceFiscale, Long hubId); + + boolean existsByBeneficiaryCodiceFiscaleAndHubId(String codiceFiscale, Long hubId); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserWithCompanyRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserWithCompanyRepository.java index d17b93e2..ec93f2f6 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserWithCompanyRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserWithCompanyRepository.java @@ -14,10 +14,8 @@ public interface UserWithCompanyRepository extends JpaRepository findActiveCompanyIdsByUserId(@Param("userId") Long userId); - - + @Query("SELECT u.companyId FROM UserWithCompanyEntity u WHERE u.userId = :userId AND u.isDeleted = false") + List findActiveCompanyIdsByUserId(@Param("userId") Long userId); Optional findByUserIdAndCompanyIdAndIsDeletedFalse(Long userId, Long companyId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java index 3fe819a4..0d3dab12 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -211,10 +211,11 @@ public class AuthenticationService { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_TOKEN_MSG)); } + HubEntity hub = hubService.getHubByUuid(samlResponseLogEntity.getHubUuid()); Map> userAttributes = Utils .convertStringIntoMap(samlResponseLogEntity.getAuthenticationObject()); String cf = userAttributes.get("CodiceFiscale").get(0).toString(); - if (userRepository.existsByBeneficiaryCodiceFiscale(cf)) { + if (userRepository.existsByBeneficiaryCodiceFiscaleAndHubId(cf, hub.getId())) { throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_ALREADY_EXIST_MSG)); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/BeneficiaryPreferredCallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/BeneficiaryPreferredCallServiceImpl.java index 4484027e..48b07bff 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/BeneficiaryPreferredCallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/BeneficiaryPreferredCallServiceImpl.java @@ -9,7 +9,6 @@ import net.gepafin.tendermanagement.enums.BeneficiaryCallStatus; import net.gepafin.tendermanagement.model.request.BeneficiaryPreferredCallReq; import net.gepafin.tendermanagement.model.response.BeneficiaryPreferredCallResponseBean; -import net.gepafin.tendermanagement.repositories.UserRepository; import net.gepafin.tendermanagement.service.BeneficiaryPreferredCallService; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.util.Validator; @@ -17,7 +16,6 @@ import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationExceptio import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; import java.util.List; @@ -26,10 +24,10 @@ public class BeneficiaryPreferredCallServiceImpl implements BeneficiaryPreferred @Autowired private BeneficiaryPreferredCallDao beneficiaryPreferredCallDao; + @Autowired private Validator validator; - @Autowired - private UserRepository userRepository; + @Autowired private UserService userService; @@ -81,7 +79,7 @@ public class BeneficiaryPreferredCallServiceImpl implements BeneficiaryPreferred } if(beneficiaryId!=null){ UserEntity user = userService.getUserByBeneficiaryId(beneficiaryId); - return validator.validateUserId(request,user.getId()); + return validator.validateUserId(request, user.getId()); } else{ return validator.validateUserId(request, userId); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java index 34c8777f..47656b4d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java @@ -56,6 +56,7 @@ public class CompanyServiceImpl implements CompanyService { @Transactional(readOnly = true) public CompanyResponse getCompany(HttpServletRequest request, Long companyId) { UserEntity userEntity =validator.validateUser(request); + validator.validateUserWithCompany(request, companyId); return companyDao.getCompany(userEntity, companyId); } @@ -63,13 +64,14 @@ public class CompanyServiceImpl implements CompanyService { @Transactional(rollbackFor = Exception.class) public void deleteCompany(HttpServletRequest request, Long companyId) { UserEntity userEntity =validator.validateUser(request); + validator.validateUserWithCompany(request, companyId); companyDao.deleteCompany(userEntity, companyId); } @Override @Transactional(readOnly = true) public List getCompanyByUserId(HttpServletRequest request, Long userId) { - validator.validateUser(request); + validator.validateUserId(request, userId); return companyDao.getCompanyByUserId(userId); } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Validator.java b/src/main/java/net/gepafin/tendermanagement/util/Validator.java index 09563378..785ad3b9 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Validator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Validator.java @@ -4,7 +4,6 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.dao.CallDao; import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.CompanyEntity; import net.gepafin.tendermanagement.entities.UserEntity; @@ -73,8 +72,14 @@ public class Validator { } public CompanyEntity validateUserWithCompany(HttpServletRequest request, Long companyId) { + UserEntity user = validateUser(request); + CompanyEntity companyEntity = companyService.validateCompany(companyId); + if (Boolean.FALSE.equals(user.getHub().getId().equals(companyEntity.getHub().getId()))) { + throw new ForbiddenAccessException(Status.FORBIDDEN, + Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); + } if (checkIsSuperAdmin()) { - return companyService.validateCompany(companyId); + return companyEntity; } Map userInfo = tokenProvider.getUserInfoAndUserIdFromToken(request); companyService.validateUserWithCompny(getUserId(userInfo), companyId); @@ -100,10 +105,15 @@ public class Validator { public UserEntity validateUserId(HttpServletRequest request, Long userId) { UserEntity user = validateUser(request); + UserEntity requestedUser = userService.validateUser(userId); + + if(Boolean.FALSE.equals(requestedUser.getHub().getId().equals(user.getHub().getId()))) { + throw new ForbiddenAccessException(Status.FORBIDDEN, Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); + } if(user.getRoleEntity().getRoleType().equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue()) && Boolean.FALSE.equals(user.getId().equals(userId))) { throw new ForbiddenAccessException(Status.FORBIDDEN, Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); } - return userService.validateUser(userId); + return requestedUser; } private Long getUserIdFromToken(HttpServletRequest request) { diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 5df3a2b7..41a10a1b 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -1328,4 +1328,70 @@ referencedColumnNames="id"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From a4593de2bee79bc708b299562e1ea7d52d6e6c60 Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 24 Oct 2024 16:28:08 +0530 Subject: [PATCH 33/47] Updated the properties --- src/main/resources/application-dev.properties | 4 +++- src/main/resources/application-local.properties | 8 +++++++- src/main/resources/application-production.properties | 1 + src/main/resources/application-testing.properties | 7 ++++++- src/main/resources/application.properties | 6 ------ src/main/resources/db/changelog/dynamic-triggers.xml | 4 ++-- 6 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index f7ccb81a..4002a342 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -8,7 +8,9 @@ spring.datasource.driver-class-name=org.postgresql.Driver spring.h2.console.enabled=true isVatCheckGloballyDisabled = false + isMailSendingEnabled = true default_System_Receiver_Email=antonio.manca@bflows.net gepafin_email=rinaldo.bonazzo@bflows.net -rinaldo_email=rinaldo.bonazzo@bflows.net \ No newline at end of file +rinaldo_email=rinaldo.bonazzo@bflows.net +carlo_email=test@test.test diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 6b925e03..4bc1e7d0 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -6,4 +6,10 @@ spring.datasource.driver-class-name=org.postgresql.Driver # JPA Configuration spring.jpa.show-sql=true -base-url=http://localhost:8080 \ No newline at end of file +base-url=http://localhost:8080 + +isMailSendingEnabled = false +default_System_Receiver_Email=test@test.test +gepafin_email=test@test.test +rinaldo_email=test@test.test +carlo_email=test@test.test \ No newline at end of file diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties index 725d9c8a..f124d6d3 100644 --- a/src/main/resources/application-production.properties +++ b/src/main/resources/application-production.properties @@ -14,6 +14,7 @@ fe.base.url=https://bandi.gepafin.it #SPID configuration spid.ipd.base.url=https://login.regione.umbria.it active.profile.folder=production + isMailSendingEnabled = true default_System_Receiver_Email=antonio.manca@bflows.net gepafin_email=bandi@pec.gepafin.it diff --git a/src/main/resources/application-testing.properties b/src/main/resources/application-testing.properties index 12b95acb..7f958b88 100644 --- a/src/main/resources/application-testing.properties +++ b/src/main/resources/application-testing.properties @@ -5,4 +5,9 @@ spring.datasource.password=sa # JPA Configuration spring.h2.console.enabled=true -base-url=http://localhost:8080 \ No newline at end of file +base-url=http://localhost:8080 +isMailSendingEnabled = false +default_System_Receiver_Email=test@test.test +gepafin_email=test@test.test +rinaldo_email=test@test.test +carlo_email=test@test.test \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 75ab20cf..c6b32a33 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -59,10 +59,4 @@ mailGun_base_url=https://api.eu.mailgun.net/ # SendinBlue API key apiKey=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 #senderEmail=mailer@bflows.net -isMailSendingEnabled = false -default_System_Receiver_Email=antonio.manca@bflows.net -gepafin_email=rinaldo.bonazzo@bflows.net -rinaldo_email=rinaldo.bonazzo@bflows.net -carlo_email=rinaldo.bonazzo@bflows.net -default.hub.uuid=p4lk3bcx1RStqTaIVVbXs diff --git a/src/main/resources/db/changelog/dynamic-triggers.xml b/src/main/resources/db/changelog/dynamic-triggers.xml index 23f1101e..9356279d 100644 --- a/src/main/resources/db/changelog/dynamic-triggers.xml +++ b/src/main/resources/db/changelog/dynamic-triggers.xml @@ -20,7 +20,7 @@ ) LOOP EXECUTE format( - 'CREATE OR REPLACE TRIGGER tg_gepafin_schema_updated_at_%I + 'CREATE OR REPLACE TRIGGER tg_gepafin_schema_updated_date_%I BEFORE UPDATE ON gepafin_schema.%I FOR EACH ROW EXECUTE FUNCTION gepafin_schema.clock_timestamp_updated_date_column()', @@ -37,7 +37,7 @@ ) LOOP EXECUTE format( - 'CREATE OR REPLACE TRIGGER tg_gepafin_schema_created_at_%I + 'CREATE OR REPLACE TRIGGER tg_gepafin_schema_created_date_%I BEFORE INSERT ON gepafin_schema.%I FOR EACH ROW EXECUTE FUNCTION gepafin_schema.clock_timestamp_created_date_column()', From c688b8a1c5140c1f3ecddbc2ac7f8b44544cef56 Mon Sep 17 00:00:00 2001 From: nisha Date: Thu, 24 Oct 2024 17:42:35 +0530 Subject: [PATCH 34/47] Updated code for label in pdf --- .../gepafin/tendermanagement/dao/PdfDao.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 18d3bf1e..1e2d938e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -251,7 +251,7 @@ public class PdfDao { List keys = new ArrayList<>(entry.keySet()); // Get all keys in the current map // Handle based on the number of keys in the map - if (Boolean.FALSE.equals(containsThreeValues) && keys.size() == 2) { + if (Boolean.FALSE.equals(containsThreeValues) && (keys.size() == 2 || keys.size()<2)) { // Treat the first key as the "key" and second key as the "value" String heading = (String) entry.get(keys.get(0)); // Get value of first key String value1 = (String) entry.get(keys.get(1)); // Get value of second key @@ -475,6 +475,16 @@ public class PdfDao { // If the content with the matching fieldId is found, create a label-value pair if (matchingContent.isPresent()) { String name = matchingContent.get().getName(); + ContentResponseBean content = matchingContent.get(); + + // Find the setting where the name is "label" + String contentLabel = content.getSettings().stream() + .filter(setting -> "label".equals(setting.getName())) // Filter settings by name + .map(SettingResponseBean::getValue) // Extract the value from the matching setting + .map(Object::toString) // Convert the value to a string + .findFirst() // Get the first matching value + .orElse(null); // If no match is found, set label to null + if (name.equals("fileupload")) { // Step 1: Check if fieldValue is an instance of List @@ -518,12 +528,9 @@ public class PdfDao { } } } - String label = matchingContent.get().getLabel(); // Add the label-value pair to the list - if (fieldValue != null && !fieldValue.toString().trim().isEmpty()) { fieldValue = findLabelInOptions(matchingContent.get().getSettings(), fieldValue); - labelValuePairs.add(new FieldLabelValuePairRequest(label, fieldValue)); - } + labelValuePairs.add(new FieldLabelValuePairRequest(contentLabel, fieldValue)); } } From 620f5c7c7a5d284c2a177c6e4c1ba1928b83479c Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 24 Oct 2024 18:30:58 +0530 Subject: [PATCH 35/47] Updated code for Assigned Application --- .../dao/AssignedApplicationsDao.java | 51 ++++++++++++++----- .../enums/ApplicationStatusTypeEnum.java | 3 +- .../AssignedApplicationsResponse.java | 5 ++ 3 files changed, 45 insertions(+), 14 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index 03f8f83a..faf0f9ea 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -9,6 +9,7 @@ import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; +import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.repositories.AssignedApplicationsRepository; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.UserService; @@ -31,13 +32,16 @@ import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; public class AssignedApplicationsDao { @Autowired - ApplicationService applicationService; + private ApplicationService applicationService; @Autowired - AssignedApplicationsRepository assignedApplicationsRepository; + private ApplicationRepository applicationRepository; @Autowired - UserService userService; + private AssignedApplicationsRepository assignedApplicationsRepository; + + @Autowired + private UserService userService; public AssignedApplicationsResponse createAssignedApplications(Long applicationId, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest){ log.info("Assigning application to pre-Instructor with details: {}", applicationId,userId); @@ -47,12 +51,16 @@ public class AssignedApplicationsDao { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_ASSIGNED)); } ApplicationEntity application = applicationService.validateApplication(applicationId); + + if (Boolean.FALSE.equals(ApplicationStatusTypeEnum.SUBMIT.getValue().equals(application.getStatus()))) { throw new CustomValidationException( Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.INVALID_APPLICATION_STATUS) ); } + application.setStatus(ApplicationStatusTypeEnum.EVALUATION.getValue()); + applicationRepository.save(application); UserEntity user = userService.validateUser(userId); AssignedApplicationsEntity assignment = createAssignmentEntity(application, user.getId(), assignedByUser, assignedApplicationsRequest); AssignedApplicationsResponse assignApplicationToInstructorResponse = convertEntityToResponse(assignment); @@ -82,17 +90,34 @@ public class AssignedApplicationsDao { return assignedApplication; } - public AssignedApplicationsResponse convertEntityToResponse(AssignedApplicationsEntity application){ + public AssignedApplicationsResponse convertEntityToResponse(AssignedApplicationsEntity assignedApplications){ AssignedApplicationsResponse assignedApplicationsResponse = new AssignedApplicationsResponse(); - assignedApplicationsResponse.setId(application.getId()); - assignedApplicationsResponse.setApplicationId(application.getApplication().getId()); - assignedApplicationsResponse.setAssignedBy(application.getAssignedBy()); - assignedApplicationsResponse.setUserId(application.getUserId()); - assignedApplicationsResponse.setCreatedDate(application.getCreatedDate()); - assignedApplicationsResponse.setUpdatedDate(application.getUpdatedDate()); - assignedApplicationsResponse.setNote(application.getNote()); - assignedApplicationsResponse.setStatus(AssignedApplicationEnum.valueOf(application.getStatus())); - assignedApplicationsResponse.setAssignedAt(application.getAssignedAt()); + assignedApplicationsResponse.setId(assignedApplications.getId()); + assignedApplicationsResponse.setApplicationId(assignedApplications.getApplication().getId()); + + ApplicationEntity application = applicationService.validateApplication(assignedApplications.getApplication().getId()); + String callName = application.getCall().getName(); + Long protocolNumber = application.getProtocol().getProtocolNumber(); + LocalDateTime submissionDate = application.getSubmissionDate(); + UserEntity userEntity = userService.validateUser(assignedApplications.getUserId()); + String firstName = userEntity.getBeneficiary().getFirstName(); + String lastName = userEntity.getBeneficiary().getLastName(); + String beneficiaryName = + (firstName != null ? firstName : "") + + (lastName != null ? " " + lastName : ""); + + assignedApplicationsResponse.setAssignedBy(assignedApplications.getAssignedBy()); + assignedApplicationsResponse.setUserId(assignedApplications.getUserId()); + assignedApplicationsResponse.setCreatedDate(assignedApplications.getCreatedDate()); + assignedApplicationsResponse.setUpdatedDate(assignedApplications.getUpdatedDate()); + assignedApplicationsResponse.setNote(assignedApplications.getNote()); + assignedApplicationsResponse.setStatus(AssignedApplicationEnum.valueOf(assignedApplications.getStatus())); + assignedApplicationsResponse.setAssignedAt(assignedApplications.getAssignedAt()); + assignedApplicationsResponse.setProtocolNumber(protocolNumber); + assignedApplicationsResponse.setCallName(callName); + assignedApplicationsResponse.setBeneficiaryName(beneficiaryName); + assignedApplicationsResponse.setSubmissionDate(submissionDate); + return assignedApplicationsResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java index 80420c15..e9c1fb7a 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java @@ -8,7 +8,8 @@ public enum ApplicationStatusTypeEnum { SUBMIT("SUBMIT"), AWAIT("AWAIT"), READY("READY"), - DISCARD("DISCARD"); + DISCARD("DISCARD"), + EVALUATION("EVALUATION"); private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java index 8714d94c..b5957dd5 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java @@ -14,6 +14,11 @@ public class AssignedApplicationsResponse extends BaseBean { private AssignedApplicationEnum status; private String note; private LocalDateTime assignedAt; + private Long protocolNumber; + private String callName; + private String beneficiaryName; + private LocalDateTime submissionDate; + } From 1fca821e13294203cec8d2dd0f27459c6a4936bd Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 24 Oct 2024 20:16:55 +0530 Subject: [PATCH 36/47] Fixed Issue --- .../dao/AssignedApplicationsDao.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index faf0f9ea..ebdb46a0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -96,15 +96,20 @@ public class AssignedApplicationsDao { assignedApplicationsResponse.setApplicationId(assignedApplications.getApplication().getId()); ApplicationEntity application = applicationService.validateApplication(assignedApplications.getApplication().getId()); - String callName = application.getCall().getName(); - Long protocolNumber = application.getProtocol().getProtocolNumber(); + String callName = application.getCall() != null ? application.getCall().getName() : ""; + Long protocolNumber = (application.getProtocol() != null && application.getProtocol().getProtocolNumber() != null) + ? application.getProtocol().getProtocolNumber() + : 0; LocalDateTime submissionDate = application.getSubmissionDate(); - UserEntity userEntity = userService.validateUser(assignedApplications.getUserId()); - String firstName = userEntity.getBeneficiary().getFirstName(); - String lastName = userEntity.getBeneficiary().getLastName(); - String beneficiaryName = - (firstName != null ? firstName : "") + - (lastName != null ? " " + lastName : ""); + UserEntity userEntity = userService.validateUser(application.getUserId()); + + String firstName = userEntity.getBeneficiary() != null ? userEntity.getBeneficiary().getFirstName() : null; + String lastName = userEntity.getBeneficiary() != null ? userEntity.getBeneficiary().getLastName() : null; + + String beneficiaryName = (firstName != null && !firstName.isBlank() ? firstName : "") + + (lastName != null && !lastName.isBlank() ? " " + lastName : ""); + + beneficiaryName = beneficiaryName.isBlank() ? "" : beneficiaryName; assignedApplicationsResponse.setAssignedBy(assignedApplications.getAssignedBy()); assignedApplicationsResponse.setUserId(assignedApplications.getUserId()); From 4c29a17c828bd5b8dee9f904a1de702f92853d5d Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 24 Oct 2024 21:57:07 +0530 Subject: [PATCH 37/47] Fixed hub validation issue --- .../tendermanagement/dao/ApplicationDao.java | 12 +++---- .../gepafin/tendermanagement/dao/CallDao.java | 20 +++++------ .../tendermanagement/dao/CompanyDao.java | 5 +-- .../tendermanagement/dao/DashboardDao.java | 8 ++--- .../tendermanagement/dao/DelegationDao.java | 12 +++++-- .../gepafin/tendermanagement/dao/UserDao.java | 15 +++++--- .../model/request/CreateCallRequestStep1.java | 1 - .../repositories/CallRepository.java | 34 +++++++++++++------ .../tendermanagement/service/CallService.java | 4 +-- .../tendermanagement/service/UserService.java | 6 ++-- .../service/impl/ApplicationServiceImpl.java | 2 +- .../service/impl/AuthenticationService.java | 2 +- .../service/impl/CallServiceImpl.java | 8 +++-- .../service/impl/CompanyServiceImpl.java | 4 +-- .../service/impl/UserServiceImpl.java | 9 +++-- .../tendermanagement/util/Validator.java | 25 ++++++++------ .../web/rest/api/UserApi.java | 6 ++-- .../web/rest/api/impl/CallApiController.java | 2 +- .../web/rest/api/impl/UserApiController.java | 12 +++---- 19 files changed, 110 insertions(+), 77 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index fe86a5c6..04eb8b95 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -139,7 +139,7 @@ public class ApplicationDao { } formService.validateFormField(applicationRequestBean.getFormFields(),applicationEntity,formEntity); ApplicationFormEntity applicationFormEntity = getApplicationFormOrCreate(formEntity, applicationEntity); - createOrUpdateMultipleFormFields(applicationRequestBean.getFormFields(), applicationFormEntity,formEntity); + createOrUpdateMultipleFormFields(applicationRequestBean.getFormFields(), applicationFormEntity, formEntity); return getApplicationById(applicationEntity.getId(),formEntity.getId()); } public void validateDelegation(UserEntity user, CompanyEntity company) { @@ -288,7 +288,7 @@ public class ApplicationDao { log.info("Fetching applications for RoleType: {}", userEntity.getRoleEntity().getRoleType()); - Specification spec = search(userEntity.getId(), callId, companyId,status); + Specification spec = search(userEntity, callId, companyId,status); List applicationEntities = applicationRepository.findAll(spec); @@ -298,12 +298,12 @@ public class ApplicationDao { } - private Specification search(Long userId, Long callId, Long companyId,String status) { + private Specification search(UserEntity userEntity, Long callId, Long companyId,String status) { return (root, query, builder) -> { Boolean isBeneficiary = validator.checkIsBeneficiary(); Predicate predicate = builder.isFalse(root.get("isDeleted")); if (isBeneficiary) { - predicate = builder.and(predicate, builder.equal(root.get("userId"), userId)); + predicate = builder.and(predicate, builder.equal(root.get("userId"), userEntity.getId())); } if (callId != null) { predicate = builder.and(predicate, builder.equal(root.get("call").get("id"), callId)); @@ -314,7 +314,7 @@ public class ApplicationDao { if (status != null) { predicate = builder.and(predicate, builder.equal(root.get("status"), status)); } - + predicate = builder.and(predicate, builder.equal(root.get("hubId"), userEntity.getHub().getId())); return predicate; }; } @@ -601,7 +601,7 @@ public class ApplicationDao { throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_IN_PREVIOUS_STATUS)); } if (status.equals(ApplicationStatusTypeEnum.SUBMIT) && Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.READY.getValue()))) { - callService.validatePublishedCall(applicationEntity.getCall().getId()); + callService.validatePublishedCall(applicationEntity.getCall().getId(), userEntity.getHub().getId()); Long protocolNumber = getProtocolNumber(userEntity.getHub()); ProtocolEntity protocolEntity = createProtocolEntity(applicationEntity,protocolNumber, userEntity.getHub().getId()); applicationEntity.setProtocol(protocolEntity); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index d8cd0a5c..b52aa97b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -654,7 +654,7 @@ public class CallDao { if (Boolean.FALSE.equals(ROLE_SUPER_ADMIN.getValue().equals(type))) { callStatusList = List.of(CallStatusEnum.PUBLISH.getValue()); } - List calls = callRepository.findByStatusIn(callStatusList); + List calls = callRepository.findByStatusInAndHubId(callStatusList, user.getHub().getId()); return calls.stream() .map(this::convertToCallDetailsResponseBean) .collect(Collectors.toList()); @@ -672,13 +672,13 @@ public class CallDao { callResponseBean.setStatus(CallStatusEnum.valueOf(callEntity.getStatus())); return callResponseBean; } - public CallEntity getCallEntityById(Long id){ - CallEntity callEntity=callRepository.findByIdAndStatusNotIn(id,List.of(CallStatusEnum.PUBLISH.getValue())); - if(callEntity==null){ - throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND)); - } - return callEntity; - } +// public CallEntity getCallEntityById(Long id){ +// CallEntity callEntity=callRepository.findByIdAndStatusNotInAndHubId(id, List.of(CallStatusEnum.PUBLISH.getValue())); +// if(callEntity==null){ +// throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND)); +// } +// return callEntity; +// } public CallResponse updateCallStatus(CallEntity callEntity, CallStatusEnum statusReq) { CallStatusEnum currentStatus = CallStatusEnum.valueOf(callEntity.getStatus()); @@ -718,9 +718,9 @@ public class CallDao { } } - public CallEntity validatePublishedCall(Long callId) { + public CallEntity validatePublishedCall(Long callId, Long hubId) { CallEntity callEntity= callRepository - .findByIdAndStatus(callId, CallStatusEnum.PUBLISH.getValue()); + .findByIdAndStatusAndHubId(callId, CallStatusEnum.PUBLISH.getValue(), hubId); if(callEntity==null){ throw new ResourceNotFoundException( Status.NOT_FOUND, diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java index 0f59fc08..84b01021 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java @@ -54,7 +54,7 @@ public class CompanyDao { return convertCompanyEntityToCompanyResponse(existingCompany, userWithCompanyEntity); } else { validateCompany(userEntity, companyRequest); - CompanyEntity companyEntity = convertCompanyRequestToCompanyEntity(companyRequest); + CompanyEntity companyEntity = convertCompanyRequestToCompanyEntity(userEntity, companyRequest); companyRepository.save(companyEntity); userWithCompanyEntity = createUserWithCompanyRelation(userEntity, companyEntity, companyRequest.getIsLegalRepresentant()); return convertCompanyEntityToCompanyResponse(companyEntity, userWithCompanyEntity); @@ -91,7 +91,7 @@ public class CompanyDao { return userWithCompanyRepository.save(userWithCompanyEntity); } - private CompanyEntity convertCompanyRequestToCompanyEntity(CompanyRequest request) { + private CompanyEntity convertCompanyRequestToCompanyEntity(UserEntity userEntity, CompanyRequest request) { CompanyEntity entity = new CompanyEntity(); entity.setCompanyName(request.getCompanyName()); entity.setVatNumber(request.getVatNumber()); @@ -108,6 +108,7 @@ public class CompanyDao { entity.setAnnualRevenue(request.getAnnualRevenue()); entity.setContactName(request.getContactName()); entity.setContactEmail(request.getContactEmail()); + entity.setHub(userEntity.getHub()); return entity; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java index de20f607..c5afea4e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java @@ -60,7 +60,7 @@ public class DashboardDao { } private void setActiveCalls(Widget1 widget1, UserEntity requestedUserEntity) { - Long activeCalls = callRepository.countByStatus(CallStatusEnum.PUBLISH.getValue()); + Long activeCalls = callRepository.countByStatusAndHubId(CallStatusEnum.PUBLISH.getValue(), requestedUserEntity.getHub().getId()); if (activeCalls != null) { widget1.setNumberOfActiveCalls(activeCalls); } @@ -74,8 +74,8 @@ public class DashboardDao { } } - private void setTotalActiveFinancing(Widget1 widget1, UserEntity requestedUserEntity) { - BigDecimal totalActiveFinancing = callRepository.findTotalAmountOfPublishedCalls(); + private void setTotalActiveFinancing(Widget1 widget1, UserEntity requestedUser) { + BigDecimal totalActiveFinancing = callRepository.findTotalAmountOfPublishedCallsAndHubId(requestedUser.getHub().getId()); widget1.setTotalActiveFinancing(totalActiveFinancing); } @@ -104,7 +104,7 @@ public class DashboardDao { CompanyEntity company) { BeneficiaryWidgetResponseBean beneficiaryWidgetResponseBean = BeneficiaryWidgetResponseBean.builder() .numberOfApplications(0L).numberOfCalls(0L).numberOfIntegratedDocuments(0L).build(); - Long activeCalls = callRepository.countByStatus(CallStatusEnum.PUBLISH.getValue()); + Long activeCalls = callRepository.countByStatusAndHubId(CallStatusEnum.PUBLISH.getValue(), userEntity.getHub().getId()); if (activeCalls != null) { beneficiaryWidgetResponseBean.setNumberOfCalls(activeCalls); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java index f609086f..1d9e904a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java @@ -14,6 +14,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; +import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.CompanyEntity; @@ -31,6 +32,7 @@ import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.Utils; +import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; @@ -38,7 +40,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.Status; @Component public class DelegationDao { - private static final String DEFAULT_PLACEHOLDER = "____________________"; +// private static final String DEFAULT_PLACEHOLDER = "____________________"; @Autowired private UserService userService; @@ -57,6 +59,9 @@ public class DelegationDao { @Autowired private UserCompanyDelegationRepository userCompanyDelegationRepository; + + @Autowired + private Validator validator; public ByteArrayOutputStream generateDocument(Map placeholders, String templateName) { @@ -89,9 +94,10 @@ public class DelegationDao { return new XWPFDocument(templateStream); } - public ByteArrayOutputStream downloadCompanyDelegation(UserEntity userEntity, Long companyId, CompanyDelegationRequest companyDelegationRequest) { + public ByteArrayOutputStream downloadCompanyDelegation(HttpServletRequest request, Long companyId, CompanyDelegationRequest companyDelegationRequest) { Map placeholders = getDefaultPlaceholders(); - UserResponseBean user = userService.getUserById(userEntity.getId()); + UserEntity userEntity = validator.validateUser(request); + UserResponseBean user = userService.getUserById(request, userEntity.getId()); CompanyEntity companyEntity = companyDao.validateCompany(companyId); companyDao.getUserWithCompany(userEntity.getId(), companyId); updatePlaceholdersForDelegation(user, companyEntity, placeholders, companyDelegationRequest); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 6a776f07..33f235a2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -125,11 +125,12 @@ public class UserDao { if (tempToken == null) { validator.validateRequest(request,RoleStatusEnum.ROLE_SUPER_ADMIN); + UserEntity userEntity = validator.validateUser(request); + userReq.setHubUuid(userEntity.getHub().getUniqueUuid()); }else { samlSuccessHandler.validateToken(tempToken, userReq.getCodiceFiscale(), userReq.getHubUuid()); } - RoleEntity role = roleService.validateRole(userReq.getRoleId()); if (Boolean.FALSE.equals(Utils.isValidEmail(userReq.getEmail()))) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.VALIDATE_EMAIL)); @@ -153,10 +154,14 @@ public class UserDao { if (tempToken != null) { userReq.setRoleId(null); } - if(tempToken == null && Boolean.TRUE.equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue().equals(role.getRoleType()))){ - throw new CustomValidationException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.CANNOT_CREATE_BENEFICIARY_USER)); - } + + if (tempToken == null) { + RoleEntity role = roleService.validateRole(userReq.getRoleId()); + if (Boolean.TRUE.equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue().equals(role.getRoleType()))) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.CANNOT_CREATE_BENEFICIARY_USER)); + } + } } private void validatePassword(String password, String confirmPassword, String tempToken) { diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java index bdc0d015..6ca30e37 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java @@ -2,7 +2,6 @@ package net.gepafin.tendermanagement.model.request; import java.math.BigDecimal; import java.time.LocalDateTime; -import java.time.LocalTime; import java.util.List; import lombok.Data; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java index 4e651fe0..12934e36 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java @@ -1,8 +1,8 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.CallEntity; -import net.gepafin.tendermanagement.enums.CallStatusEnum; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import java.math.BigDecimal; @@ -11,18 +11,30 @@ import java.util.List; @Repository public interface CallRepository extends JpaRepository { - public CallEntity findByIdAndStatusNotIn(Long id, List status); - List findByStatusIn(List callStatus); +// public CallEntity findByIdAndStatusNotIn(Long id, List status); + +// List findByStatusIn(List callStatus); - public CallEntity findByIdAndStatus(Long id,String status); +// public CallEntity findByIdAndStatus(Long id,String status); - public Long countByStatus(String status); +// public Long countByStatus(String status); - @Query("SELECT COALESCE(SUM(c.amount), 0) FROM CallEntity c WHERE c.status = 'PUBLISH'") - BigDecimal findTotalAmountOfPublishedCalls(); +// @Query("SELECT COALESCE(SUM(c.amount), 0) FROM CallEntity c WHERE c.status = 'PUBLISH'") +// BigDecimal findTotalAmountOfPublishedCalls(); - @Query("SELECT c.name, COUNT(a.id) " + - "FROM CallEntity c LEFT JOIN ApplicationEntity a ON c.id = a.call.id " + - "GROUP BY c.name") - List findApplicationsPerCall(); +// @Query("SELECT c.name, COUNT(a.id) " + +// "FROM CallEntity c LEFT JOIN ApplicationEntity a ON c.id = a.call.id " + +// "GROUP BY c.name") +// List findApplicationsPerCall(); + + public List findByStatusInAndHubId(List callStatus, Long hubId); + + public CallEntity findByIdAndStatusAndHubId(Long id, String status, Long hubId); + + public Long countByStatusAndHubId(String status, Long hubId); + + public CallEntity findByIdAndStatusNotInAndHubId(Long id, List status, Long hubId); + + @Query("SELECT COALESCE(SUM(c.amount), 0) FROM CallEntity c WHERE c.status = 'PUBLISH' And c.hub.id = :hubId") + BigDecimal findTotalAmountOfPublishedCallsAndHubId(@Param("hubId") Long hubId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index 8abe4cb5..92a62f02 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -29,6 +29,6 @@ public interface CallService { CallEntity validateCall(Long callId); - CallEntity validatePublishedCall(Long callId); - byte[] downloadCallDocumentsAsZip(Long callId); + CallEntity validatePublishedCall(Long callId, Long hubId); + byte[] downloadCallDocumentsAsZip(HttpServletRequest request, Long callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/UserService.java b/src/main/java/net/gepafin/tendermanagement/service/UserService.java index 9a1bdf9a..21109a5e 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/UserService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/UserService.java @@ -17,11 +17,11 @@ import java.util.List; public interface UserService { JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq); - UserResponseBean updateUser(Long userId, UpdateUserReq userReq); + UserResponseBean updateUser(HttpServletRequest request, Long userId, UpdateUserReq userReq); - UserResponseBean getUserById(Long userId); + UserResponseBean getUserById(HttpServletRequest request, Long userId); - void deleteUser(Long userId); + void deleteUser(HttpServletRequest request, Long userId); JWTToken login(LoginReq loginReq,HttpServletRequest request); 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 e8e8f1f4..779a3d09 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -65,6 +65,7 @@ public class ApplicationServiceImpl implements ApplicationService { public ApplicationResponse createApplication(HttpServletRequest request, Long companyId, ApplicationRequest applicationRequest, Long callId) { UserEntity userEntity = validator.validateUser(request); CompanyEntity companyEntity = validator.validateUserWithCompany(request, companyId); + validator.validateUserWithCall(userEntity, callId); return applicationDao.createApplicationByCallId(companyEntity, applicationRequest, callId, userEntity); } @@ -114,7 +115,6 @@ public class ApplicationServiceImpl implements ApplicationService { @Transactional(rollbackFor = Exception.class) public ApplicationResponse validateApplication(HttpServletRequest request, Long applicationId) { return applicationDao.validateApplication(request, applicationId); - } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java index 0d3dab12..5a2d9ded 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -77,7 +77,7 @@ public class AuthenticationService { public JWTToken login(LoginReq loginReq, HttpServletRequest request) { UserEntity user=null; - + LoginAttemptEntity loginAttemptEntity = prepareLoginAttemptEntity(loginReq, request); log.info("Attempting login for email: {}", loginReq.getEmail()); String emailWithHubId = loginReq.getEmail()+":"+loginReq.getHubUuid(); 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 281b33b1..8004008b 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -91,13 +91,15 @@ public class CallServiceImpl implements CallService { } @Override - public CallEntity validatePublishedCall(Long callId) { - return callDao.validatePublishedCall(callId); + public CallEntity validatePublishedCall(Long callId, Long hubId) { + return callDao.validatePublishedCall(callId, hubId); } @Override @Transactional(readOnly = true) - public byte[] downloadCallDocumentsAsZip(Long callId) { + public byte[] downloadCallDocumentsAsZip(HttpServletRequest request, Long callId) { + UserEntity user = validator.validateUser(request); + validator.validateUserWithCall(user, callId); return callDao.downloadCallDocumentsAsZip(callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java index 47656b4d..5ab99b13 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java @@ -49,6 +49,7 @@ public class CompanyServiceImpl implements CompanyService { @Transactional(rollbackFor = Exception.class) public CompanyResponse updateCompany(HttpServletRequest request, Long companyId, CompanyRequest companyRequest) { UserEntity userEntity =validator.validateUser(request); + validator.validateUserWithCompany(request, companyId); return companyDao.updateCompany(userEntity, companyId, companyRequest); } @@ -93,8 +94,7 @@ public class CompanyServiceImpl implements CompanyService { @Override @Transactional(readOnly = true) public ByteArrayOutputStream downloadCompanyDelegation(HttpServletRequest request, Long companyId, CompanyDelegationRequest companyDelegationRequest) { - UserEntity userEntity =validator.validateUser(request); - return delegationDao.downloadCompanyDelegation(userEntity, companyId, companyDelegationRequest); + return delegationDao.downloadCompanyDelegation(request, companyId, companyDelegationRequest); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java index 3f325320..5d3640f9 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java @@ -40,19 +40,22 @@ public class UserServiceImpl implements UserService { @Override @Transactional(rollbackFor = Exception.class) - public UserResponseBean updateUser(Long userId, UpdateUserReq userReq) { + public UserResponseBean updateUser(HttpServletRequest request, Long userId, UpdateUserReq userReq) { + validator.validateUserId(request, userId); return userDao.updateUser(userId, userReq); } @Override @Transactional(readOnly = true) - public UserResponseBean getUserById(Long userId) { + public UserResponseBean getUserById(HttpServletRequest request, Long userId) { + validator.validateUserId(request, userId); return userDao.getUserById(userId); } @Override @Transactional(rollbackFor = Exception.class) - public void deleteUser(Long userId) { + public void deleteUser(HttpServletRequest request, Long userId) { + validator.validateUserId(request, userId); userDao.deleteUser(userId); } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Validator.java b/src/main/java/net/gepafin/tendermanagement/util/Validator.java index 785ad3b9..ecf4b3ae 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Validator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Validator.java @@ -72,12 +72,8 @@ public class Validator { } public CompanyEntity validateUserWithCompany(HttpServletRequest request, Long companyId) { - UserEntity user = validateUser(request); CompanyEntity companyEntity = companyService.validateCompany(companyId); - if (Boolean.FALSE.equals(user.getHub().getId().equals(companyEntity.getHub().getId()))) { - throw new ForbiddenAccessException(Status.FORBIDDEN, - Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); - } + validateHubId(request, companyEntity.getHub().getId()); if (checkIsSuperAdmin()) { return companyEntity; } @@ -85,6 +81,15 @@ public class Validator { companyService.validateUserWithCompny(getUserId(userInfo), companyId); return companyService.validateCompany(companyId); } + + public void validateHubId(HttpServletRequest request, Long hubId) { + UserEntity user = validateUser(request); + Long hubIdFromHttpRequest = user.getHub().getId(); + if (Boolean.FALSE.equals(hubIdFromHttpRequest.equals(hubId))) { + throw new ForbiddenAccessException(Status.FORBIDDEN, + Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); + } + } private Long getUserId(Map userInfo) { return Long.parseLong(userInfo.get("userId").toString()); @@ -107,11 +112,11 @@ public class Validator { UserEntity user = validateUser(request); UserEntity requestedUser = userService.validateUser(userId); - if(Boolean.FALSE.equals(requestedUser.getHub().getId().equals(user.getHub().getId()))) { - throw new ForbiddenAccessException(Status.FORBIDDEN, Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); - } - if(user.getRoleEntity().getRoleType().equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue()) && Boolean.FALSE.equals(user.getId().equals(userId))) { - throw new ForbiddenAccessException(Status.FORBIDDEN, Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); + validateHubId(request, requestedUser.getHub().getId()); + if (Boolean.FALSE.equals(user.getRoleEntity().getRoleType().equals(RoleStatusEnum.ROLE_SUPER_ADMIN.getValue())) + && Boolean.FALSE.equals(user.getId().equals(userId))) { + throw new ForbiddenAccessException(Status.FORBIDDEN, + Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); } return requestedUser; } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java index 8982e45e..c7b8e530 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java @@ -59,7 +59,7 @@ public interface UserApi { @RequestMapping(value = "/{userId}", produces = {"application/json"}, method = RequestMethod.PUT) - default ResponseEntity> updateUser( + default ResponseEntity> updateUser(HttpServletRequest request, @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId, @Parameter(description = "User request object", required = true) @Valid @RequestBody UpdateUserReq userReq) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); @@ -77,7 +77,7 @@ public interface UserApi { @RequestMapping(value = "/{userId}", produces = {"application/json"}, method = RequestMethod.GET) - default ResponseEntity> getUserById( + default ResponseEntity> getUserById(HttpServletRequest request, @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } @@ -93,7 +93,7 @@ public interface UserApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) @RequestMapping(value = "/{userId}", method = RequestMethod.DELETE) - default ResponseEntity> deleteUser( + default ResponseEntity> deleteUser(HttpServletRequest request, @Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); } 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 b06380e4..69154098 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 @@ -88,7 +88,7 @@ public class CallApiController implements CallApi { } @Override public ResponseEntity downloadCallDocumentsAsZip(HttpServletRequest request, Long callId) { - byte[] zipFile = callService.downloadCallDocumentsAsZip(callId); + byte[] zipFile = callService.downloadCallDocumentsAsZip(request, callId); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java index 413feaac..1a3040c1 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java @@ -44,29 +44,29 @@ public class UserApiController implements UserApi { } @Override - public ResponseEntity> updateUser( + public ResponseEntity> updateUser(HttpServletRequest request, @PathVariable("userId") Long userId, @Valid @RequestBody UpdateUserReq userReq) { log.info("Update User - User ID: {}, Request Body: {}", userId, userReq); - UserResponseBean updatedUser = userService.updateUser(userId, userReq); + UserResponseBean updatedUser = userService.updateUser(request, userId, userReq); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(updatedUser, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_UPDATED_SUCCESS_MSG))); } @Override - public ResponseEntity> getUserById( + public ResponseEntity> getUserById(HttpServletRequest request, @PathVariable("userId") Long userId) { log.info("Get User by ID - User ID: {}", userId); - UserResponseBean user = userService.getUserById(userId); + UserResponseBean user = userService.getUserById(request, userId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(user, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_USER_SUCCESS_MSG))); } @Override - public ResponseEntity> deleteUser( + public ResponseEntity> deleteUser(HttpServletRequest request, @PathVariable("userId") Long userId) { log.info("Delete User - User ID: {}", userId); - userService.deleteUser(userId); + userService.deleteUser(request, userId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.USER_DELETED_SUCCESS_MSG))); } From 5beea7132e164a565851386164a8c970d539c101 Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 24 Oct 2024 23:02:01 +0530 Subject: [PATCH 38/47] updated code for super user dashboard --- .../gepafin/tendermanagement/dao/DashboardDao.java | 4 ++-- .../repositories/ApplicationRepository.java | 12 ++++++------ .../service/impl/FlowServiceImpl.java | 7 +++++++ 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java index c5afea4e..c76d14c9 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java @@ -80,14 +80,14 @@ public class DashboardDao { } private void setSubmittedApplications(Widget1 widget1, UserEntity requestedUserEntity) { - Long submittedApplications = applicationRepository.countSubmittedApplications(); + Long submittedApplications = applicationRepository.countSubmittedApplicationsByHubId(requestedUserEntity.getHub().getId()); if (submittedApplications != null) { widget1.setNumberOfSubmittedApplications(submittedApplications); } } private void setDraftApplications(Widget1 widget1, UserEntity requestedUserEntity) { - Long draftApplications = applicationRepository.countDraftApplications(); + Long draftApplications = applicationRepository.countDraftApplicationsByHubId(requestedUserEntity.getHub().getId()); if (draftApplications != null) { widget1.setNumberOfDraftApplications(draftApplications); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index 7b57fcf2..9d52b2aa 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -32,13 +32,13 @@ public interface ApplicationRepository extends JpaRepository findByCompanyIdAndUserIdAndIsDeletedFalse(Long companyId,Long userId); + @Query("SELECT COUNT(a) FROM ApplicationEntity a WHERE a.status = 'SUBMIT' And a.hubId = :hubId") + public Long countSubmittedApplicationsByHubId(@Param("hubId") Long hubId); + + @Query("SELECT COUNT(a) FROM ApplicationEntity a WHERE a.status = 'DRAFT' And a.hubId = :hubId") + public Long countDraftApplicationsByHubId(@Param("hubId") Long hubId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FlowServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FlowServiceImpl.java index 2ae5546f..5bd9d4d5 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/FlowServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FlowServiceImpl.java @@ -5,6 +5,8 @@ import net.gepafin.tendermanagement.dao.FlowDao; import net.gepafin.tendermanagement.model.request.FlowRequestBean; import net.gepafin.tendermanagement.model.response.FlowResponseBean; import net.gepafin.tendermanagement.service.FlowService; +import net.gepafin.tendermanagement.util.Validator; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -14,16 +16,21 @@ public class FlowServiceImpl implements FlowService { @Autowired private FlowDao flowDao; + + @Autowired + private Validator validator; @Override @Transactional(rollbackFor = Exception.class) public FlowResponseBean createOrUpdateFlow(HttpServletRequest httpServletRequest, FlowRequestBean flowRequestBean, Long callId) { + validator.validateUserWithCall(validator.validateUser(httpServletRequest), callId); return flowDao.createOrUpdateFlow(flowRequestBean,callId); } @Override @org.springframework.transaction.annotation.Transactional(readOnly = true) public FlowResponseBean getFlowByCallId(HttpServletRequest request, Long callId) { + validator.validateUserWithCall(validator.validateUser(request), callId); return flowDao.getFlowByCallId(callId); } } From ff05d8e29eecfd4e1cbed1c1f6ac9811aca688e2 Mon Sep 17 00:00:00 2001 From: harish Date: Thu, 24 Oct 2024 23:44:32 +0530 Subject: [PATCH 39/47] Added callEndDate and startEndDate to response --- .../tendermanagement/dao/AssignedApplicationsDao.java | 5 +++++ .../model/response/AssignedApplicationsResponse.java | 2 ++ 2 files changed, 7 insertions(+) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index ebdb46a0..bdf85b41 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -97,6 +97,9 @@ public class AssignedApplicationsDao { ApplicationEntity application = applicationService.validateApplication(assignedApplications.getApplication().getId()); String callName = application.getCall() != null ? application.getCall().getName() : ""; + LocalDateTime callEndDate = application.getCall().getEndDate(); + LocalDateTime callStartDate = application.getCall().getStartDate(); + Long protocolNumber = (application.getProtocol() != null && application.getProtocol().getProtocolNumber() != null) ? application.getProtocol().getProtocolNumber() : 0; @@ -122,6 +125,8 @@ public class AssignedApplicationsDao { assignedApplicationsResponse.setCallName(callName); assignedApplicationsResponse.setBeneficiaryName(beneficiaryName); assignedApplicationsResponse.setSubmissionDate(submissionDate); + assignedApplicationsResponse.setCallEndDate(callEndDate); + assignedApplicationsResponse.setCallStartDate(callStartDate); return assignedApplicationsResponse; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java index b5957dd5..b5ad3aae 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/AssignedApplicationsResponse.java @@ -18,6 +18,8 @@ public class AssignedApplicationsResponse extends BaseBean { private String callName; private String beneficiaryName; private LocalDateTime submissionDate; + private LocalDateTime callStartDate; + private LocalDateTime callEndDate; } From bbac196d94879aec5ae9d42e76735a30afb878d4 Mon Sep 17 00:00:00 2001 From: harish Date: Fri, 25 Oct 2024 00:37:35 +0530 Subject: [PATCH 40/47] Updated Properties --- src/main/resources/application-dev.properties | 3 ++- src/main/resources/application-local.properties | 3 ++- src/main/resources/application-production.properties | 1 + src/main/resources/application-testing.properties | 3 ++- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 4002a342..8fa5c7a6 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -13,4 +13,5 @@ isMailSendingEnabled = true default_System_Receiver_Email=antonio.manca@bflows.net gepafin_email=rinaldo.bonazzo@bflows.net rinaldo_email=rinaldo.bonazzo@bflows.net -carlo_email=test@test.test +carlo_email=test@test.test +default.hub.uuid=p4lk3bcx1RStqTaIVVbXs diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 4bc1e7d0..76aca344 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -12,4 +12,5 @@ isMailSendingEnabled = false default_System_Receiver_Email=test@test.test gepafin_email=test@test.test rinaldo_email=test@test.test -carlo_email=test@test.test \ No newline at end of file +carlo_email=test@test.test +default.hub.uuid=p4lk3bcx1RStqTaIVVbXs \ No newline at end of file diff --git a/src/main/resources/application-production.properties b/src/main/resources/application-production.properties index f124d6d3..be007786 100644 --- a/src/main/resources/application-production.properties +++ b/src/main/resources/application-production.properties @@ -20,3 +20,4 @@ default_System_Receiver_Email=antonio.manca@bflows.net gepafin_email=bandi@pec.gepafin.it rinaldo_email=rinaldo.bonazzo@bflows.net carlo_email=carlo.mancosu@bflows.net +default.hub.uuid=p4lk3bcx1RStqTaIVVbXs diff --git a/src/main/resources/application-testing.properties b/src/main/resources/application-testing.properties index 7f958b88..1dbc41cc 100644 --- a/src/main/resources/application-testing.properties +++ b/src/main/resources/application-testing.properties @@ -10,4 +10,5 @@ isMailSendingEnabled = false default_System_Receiver_Email=test@test.test gepafin_email=test@test.test rinaldo_email=test@test.test -carlo_email=test@test.test \ No newline at end of file +carlo_email=test@test.test +default.hub.uuid=p4lk3bcx1RStqTaIVVbXs \ No newline at end of file From 5818eff39650a61536da56041f10cb307606a1fb Mon Sep 17 00:00:00 2001 From: rajesh Date: Thu, 24 Oct 2024 13:00:10 -0700 Subject: [PATCH 41/47] updated code to check call document --- .../java/net/gepafin/tendermanagement/web/rest/api/CallApi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3e2861ff..a15ede62 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 @@ -74,7 +74,7 @@ public interface CallApi { public ResponseEntity> updateCallStep1(HttpServletRequest request, @Parameter(description = "The call id", required = true) @PathVariable("callId") Long callId, @Parameter(description = "Call request object", required = true) @Valid @RequestBody UpdateCallRequestStep1 updateCallRequest); - @Operation(summary = "Api to get call by id", + @Operation(summary = "Api to get call by id updated today to check the bug", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { From b0579849649961b5fff56940e47edefaf3d15c11 Mon Sep 17 00:00:00 2001 From: nisha Date: Fri, 25 Oct 2024 01:53:50 +0530 Subject: [PATCH 42/47] Updated code for pdf correction --- .../gepafin/tendermanagement/dao/PdfDao.java | 399 +++++++----------- .../gepafin/tendermanagement/util/Utils.java | 54 +++ 2 files changed, 205 insertions(+), 248 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 1e2d938e..efdc3798 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -10,11 +10,15 @@ import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.*; import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.model.request.FieldLabelValuePairRequest; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.service.CallService; +import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; //import com.itextpdf.layout.element. @@ -37,6 +41,7 @@ public class PdfDao { @Autowired private Validator validator; + public static final Logger log = LoggerFactory.getLogger(PdfDao.class); public byte[] generatePdf(HttpServletRequest request,Long applicationId) { try { @@ -79,16 +84,7 @@ public class PdfDao { for(FormApplicationResponse formApplicationResponse: applicationGetResponseBean.getForm()) { document.add(new Paragraph(formApplicationResponse.getLabel(),sectionFont)); document.add(new Paragraph(" ")); // Add line break - List fieldLabelValuePairRequests = getFormFieldsToLabels(formApplicationResponse); - for (FieldLabelValuePairRequest pair : fieldLabelValuePairRequests) { - String label = pair.getLabel(); - Object value = pair.getValue(); - Integer pages=0; - pages=addLabelValuePair(writer,document, label, value, labelFont,valueFont,call.getName(),pages); - if(pages !=0 ){ -// pageEvent.setTotalPages(writer.getPageNumber()); - } - } + List fieldLabelValuePairRequests = getFormFieldsToLabels(formApplicationResponse,writer,document); addColoredLines(writer,document,greenColor); document.add(new Paragraph(" ")); // Add line break } @@ -164,15 +160,6 @@ public class PdfDao { addColoredLines(writer,document,greenColor); -// System.out.println(writer.getPageSize()); -// System.out.println(document.getPageSize()); -// System.out.println(document.getPageNumber()); -// System.out.println(writer.getPageNumber()); -// document.setPageCount(100); -// document.setPageCount(writer.getPageNumber()); -// System.out.println(document.getPageNumber()); - - // Close the document document.close(); // Convert to byte array for response @@ -185,12 +172,13 @@ public class PdfDao { return null; } - private Integer addLabelValuePair(PdfWriter writer,Document document, String label, Object value, Font labelFont,Font valueFont,String title,Integer totalPages) throws DocumentException { + private void addLabelValuePair(PdfWriter writer,Document document, String label, Object value, Font labelFont,Font valueFont,ContentResponseBean contentResponseBean) throws DocumentException { // Add label + Map stateFieldMap= new HashMap<>(); + Paragraph labelParagraph = new Paragraph(label, labelFont); document.add(labelParagraph); float leftMargin = 20f; - PdfContentByte canvas = writer.getDirectContent(); // Setting the color and width of the line @@ -204,8 +192,6 @@ public class PdfDao { if (yPos <= 140) { // If xEnd is less than or equal to 200, generate a new page - - totalPages++; document.newPage(); } // Add a gap between the label and value document.add(new Paragraph(" ")); // Adding an empty paragraph for spacing @@ -235,44 +221,13 @@ public class PdfDao { // Finally, add the table to the document document.add(valueTable); - } else { - boolean containsThreeValues = false; // Variable to track if any map contains three keys - List> dataList = (List>) value; // Cast Object to List of Maps - for (Map entry : dataList) { - if (entry.size() == 3) { // Check if the current map has three keys - containsThreeValues = true; // If found, set the variable to true - break; // No need to check further, exit loop - } - } - List> extractedData = new ArrayList<>(); // To hold extracted data - for (Map entry : dataList) { - Map extractedMap = new HashMap<>(); // To hold the current extracted row of data + } + else if (!list.isEmpty() && list.get(0) instanceof Map) { + Object object = value; + String stringvalue = Utils.convertToString(object); + List> fieldValueList = Utils.convertJsonStringIntoJsonList(stringvalue); - List keys = new ArrayList<>(entry.keySet()); // Get all keys in the current map - - // Handle based on the number of keys in the map - if (Boolean.FALSE.equals(containsThreeValues) && (keys.size() == 2 || keys.size()<2)) { - // Treat the first key as the "key" and second key as the "value" - String heading = (String) entry.get(keys.get(0)); // Get value of first key - String value1 = (String) entry.get(keys.get(1)); // Get value of second key - extractedMap.put(heading,value1); // Store the first key's value as "heading" - } if (Boolean.TRUE.equals(containsThreeValues) ) { - String amount=""; - // Treat the first as number, second as description, third as amount - if(keys.size()==3){ - amount = (String) entry.get(keys.get(2)); // Third key's value - } - String number = (String) entry.get(keys.get(0)); // First key's value - String description = (String) entry.get(keys.get(1)); // Second key's value - - // Store the combined result as a value in the map, with a suitable key - String combinedValue = number + "; " + description + "; " + amount; // Concatenate them as a single value - extractedMap.put("combined", combinedValue); // Store as a single entry, key as "combined" - } - - extractedData.add(extractedMap); // Add each extracted map to the list - } - document=createPdfTable(extractedData,document); + document = createPdfTable(fieldValueList, document, contentResponseBean); } } else { @@ -289,150 +244,89 @@ public class PdfDao { } document.add(new Paragraph("\n")); // Add line break after each value - return totalPages; } - private Document createPdfTable(List> extractedData,Document document) throws DocumentException { - // Create a PdfPTable with 2 columns - PdfPTable table = new PdfPTable(2); // Initial assumption for 2 columns + private Document createPdfTable(List> extractedData, Document document, ContentResponseBean contentResponseBean) throws DocumentException { + // Create a PdfPTable with dynamic column count based on stateFieldMap size + Map stateFieldMap = new HashMap<>(); + + // Populate stateFieldMap from contentResponseBean settings + contentResponseBean.getSettings().stream() + .filter(setting -> "table_columns".equals(setting.getName())) // Check for "table_columns" + .map(SettingResponseBean::getValue) + .filter(Objects::nonNull) // Ensure value is not null + .filter(settingValue -> settingValue instanceof Map) // Ensure value is a Map + .map(settingValue -> (Map) settingValue) // Cast to Map + .map(valueMap -> (List>) valueMap.get("stateFieldData")) // Extract stateFieldData list + .filter(Objects::nonNull) // Ensure stateFieldData is not null + .flatMap(List::stream) // Flatten the list of field data maps + .forEach(fieldData -> { + String fieldName = (String) fieldData.get("name"); // Get the name field + String fieldDataValue = (String) fieldData.get("label"); // Get the predefined field + + if (fieldName != null && fieldDataValue != null) { + stateFieldMap.put(fieldName, fieldDataValue); + } + }); + + PdfPTable table = new PdfPTable(stateFieldMap.size()); // Number of columns equals the number of map entries table.setWidthPercentage(100); // Set table width to 100% table.setTableEvent(new RoundedBorderEvent()); + Font textFont = FontFactory.getFont(FontFactory.HELVETICA, 12, Font.NORMAL, new BaseColor(105, 105, 105)); // Gray text - boolean combinedHeaderAdded = false; // Flag to track if headers for combined have been added - float rowHeight = 50f; // Example row height, adjust as necessary + float rowHeight = 20f; // Example row height float maxTableHeight = 700f; // Maximum height of the table before a page break - float[] columnWidths = {0.7f, 0.3f}; - table.setWidths(columnWidths); + boolean headersAdded = false; // Flag to check if headers have been added + // Iterate through extracted data to populate the table + for (Map row : extractedData) { + // Add headers once + if (!headersAdded) { + for (Map.Entry stateField : stateFieldMap.entrySet()) { + String headerValue = stateField.getValue(); // Header text -// Add table header -// Populate the table with extracted data and style rows - for (Map row : extractedData) { - for (Map.Entry entry : row.entrySet()) { - String key = entry.getKey(); // This will give you the key - String value = entry.getValue(); // This will give you the value + PdfPCell headerCell = new PdfPCell(new Phrase(headerValue)); // Create a new PdfPCell for the header + headerCell.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align + headerCell.setVerticalAlignment(Element.ALIGN_MIDDLE); + headerCell.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header - // Check if the current entry is for the combined section - if ("combined".equals(key)) { - // Ensure the combined header is added only once - if (!combinedHeaderAdded) { - // Create a new table for combined entries - table = new PdfPTable(3); // 3 columns for combined entries - - PdfPCell headerCell1 = new PdfPCell(new Phrase("Number")); - headerCell1.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align - headerCell1.setVerticalAlignment(Element.ALIGN_MIDDLE); - headerCell1.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header - table.addCell(headerCell1); - - PdfPCell headerCell2 = new PdfPCell(new Phrase("Details")); - headerCell2.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align - headerCell2.setVerticalAlignment(Element.ALIGN_MIDDLE); - headerCell2.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header - table.addCell(headerCell2); - - PdfPCell headerCell3 = new PdfPCell(new Phrase("Amount")); - headerCell3.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align - headerCell3.setVerticalAlignment(Element.ALIGN_MIDDLE); - headerCell3.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header - table.addCell(headerCell3); - - combinedHeaderAdded = true; // Mark header as added - } - - // Split the value for "combined" into separate parts - String[] combinedValues = value.split("; "); - - // Check if we have 3 parts (number, description, amount) - String number = combinedValues[0]; // 1st part (number) - String description = combinedValues[1]; // 2nd part (description) - String amount = ""; - if (combinedValues.length == 3) { - amount = combinedValues[2]; // 3rd part (amount) - } - - // Create PDF cells using the split values - PdfPCell cellNumber = new PdfPCell(new Phrase(number, textFont)); // Cell for number - PdfPCell cellDescription = new PdfPCell(new Phrase(description, textFont)); // Cell for description - PdfPCell cellAmount = new PdfPCell(new Phrase(amount, textFont)); // Cell for amount - - // Set row background color for combined values - cellNumber.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for combined rows - cellDescription.setBackgroundColor(new BaseColor(239, 243, 248)); - cellAmount.setBackgroundColor(new BaseColor(239, 243, 248)); - - // Set cell height and add rounded borders -// cellNumber.setFixedHeight(rowHeight); -// cellDescription.setFixedHeight(rowHeight); -// cellAmount.setFixedHeight(rowHeight); - - cellNumber.setMinimumHeight(20f); // Set minimum height for better appearance - cellDescription.setMinimumHeight(20f); // Set minimum height for better appearance - cellAmount.setMinimumHeight(20f); // Set minimum height for better appearance - - cellNumber.setPadding(7f); - cellDescription.setPadding(7f); - cellAmount.setPadding(7f); - - // Add the cells to the table only once - table.addCell(cellNumber); - table.addCell(cellDescription); - table.addCell(cellAmount); - - - } else { - if (!combinedHeaderAdded) { - // Create a new table for combined entries - table= new PdfPTable(2); // 3 columns for combined entries - table.setWidthPercentage(100); - - PdfPCell headerCell1 = new PdfPCell(new Phrase("Details")); - headerCell1.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align - headerCell1.setVerticalAlignment(Element.ALIGN_MIDDLE); - headerCell1.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header - table.addCell(headerCell1); - - PdfPCell headerCell2 = new PdfPCell(new Phrase("Amount")); - headerCell2.setHorizontalAlignment(Element.ALIGN_CENTER); // Center align - headerCell2.setVerticalAlignment(Element.ALIGN_MIDDLE); - headerCell2.setBackgroundColor(new BaseColor(178, 190, 181)); // Light gray background for header - table.addCell(headerCell2); - combinedHeaderAdded=true; -} - // Add cells for regular key-value pairs without headers - PdfPCell cellKey = new PdfPCell(new Phrase(key, textFont)); - PdfPCell cellValue = new PdfPCell(new Phrase(value, textFont)); - - // Set background color for both cells - cellKey.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for other rows - cellValue.setBackgroundColor(new BaseColor(239, 243, 248)); - - cellKey.setPadding(7f); - cellValue.setPadding(7f); - // Set cell height and add rounded borders - cellKey.setFixedHeight(rowHeight); - cellValue.setFixedHeight(rowHeight); - - // Add the cells to the table - table.addCell(cellKey); - table.addCell(cellValue); + table.addCell(headerCell); // Add the header cell to the table } - if (table.getTotalHeight() + rowHeight > maxTableHeight) { - // Start a new page if needed - document.add(table); - table = new PdfPTable(2); // Reset table for new page - table.setWidthPercentage(100); // Reset width percentage - combinedHeaderAdded = false; // Reset header flag + headersAdded = true; // Prevent headers from being added again + } + + // Add data rows matching stateFieldMap keys + for (Map.Entry stateField : stateFieldMap.entrySet()) { + String stateKey = stateField.getKey(); // Get the key from stateFieldMap + if (row.containsKey(stateKey)) { // If row contains the stateKey + Object value = row.get(stateKey); // Get the value from the row map + + PdfPCell dynamicCell = new PdfPCell(new Phrase(value != null ? value.toString() : "", textFont)); + dynamicCell.setBackgroundColor(new BaseColor(239, 243, 248)); // Light blue for the cell + dynamicCell.setMinimumHeight(rowHeight); + dynamicCell.setPadding(7f); + + table.addCell(dynamicCell); // Add the dynamically created cell to the table } } + + // Check if adding another row would exceed max height + if (table.getTotalHeight() + rowHeight > maxTableHeight) { + document.add(table); // Add the table to the document + document.newPage(); // Start a new page + table = new PdfPTable(stateFieldMap.size()); // Create a new table for the new page + table.setWidthPercentage(100); // Reset table width + + headersAdded = false; // Reset the header flag for the new page + } } - document.add(table); // Add the last table before returning + // Add the last table to the document + document.add(table); - // Check if adding a new row would exceed the maximum height -// Return the populated table return document; } + public static class RoundedBorderEvent implements PdfPTableEvent { @Override public void tableLayout(PdfPTable table, float[][] widths, float[] heights, @@ -453,89 +347,98 @@ public class PdfDao { canvas.stroke(); } } - public List getFormFieldsToLabels(FormApplicationResponse responseBean) { + public List getFormFieldsToLabels(FormApplicationResponse responseBean,PdfWriter writer,Document document) { List labelValuePairs = new ArrayList<>(); - // Iterate through each form in the application response - - List formFields = responseBean.getFormFields(); - List contents = responseBean.getContent(); - - // Iterate through each formField in the current form - for (ApplicationFormFieldResponseBean formField : formFields) { - String fieldId = formField.getFieldId(); - Object fieldValue = formField.getFieldValue(); - - // Find the content in the form that matches the fieldId - Optional matchingContent = contents.stream() - .filter(content -> content.getId().equals(fieldId)) - .findFirst(); + Font labelFont = FontFactory.getFont(FontFactory.HELVETICA_BOLD, 12,new BaseColor(113,121,126)); // Light grey); + Font valueFont=FontFactory.getFont(FontFactory.HELVETICA_BOLD,10,new BaseColor(178, 190, 181)); - // If the content with the matching fieldId is found, create a label-value pair - if (matchingContent.isPresent()) { - String name = matchingContent.get().getName(); - ContentResponseBean content = matchingContent.get(); + // Get form fields and contents from the response + List formFields = responseBean.getFormFields(); + List contents = responseBean.getContent(); - // Find the setting where the name is "label" - String contentLabel = content.getSettings().stream() - .filter(setting -> "label".equals(setting.getName())) // Filter settings by name - .map(SettingResponseBean::getValue) // Extract the value from the matching setting - .map(Object::toString) // Convert the value to a string - .findFirst() // Get the first matching value - .orElse(null); // If no match is found, set label to null + // Iterate through each content in the response + for (ContentResponseBean content : contents) { + String contentId = content.getId(); // Content ID + String label = content.getLabel(); // Content label + String name = content.getName(); // Content name + Object fieldValue = null; - if (name.equals("fileupload")) { + String contentLabel = content.getSettings().stream() + .filter(setting -> "label".equals(setting.getName())) // Filter settings by name + .map(SettingResponseBean::getValue) // Extract the value from the matching setting + .map(Object::toString) // Convert the value to a string + .findFirst() // Get the first matching value + .orElse(null); // If no match is found, set label to null + // Find the form field in the response that matches the contentId + Optional matchingFormField = formFields.stream() + .filter(formField -> formField.getFieldId().equals(contentId)) + .findFirst(); -// Step 1: Check if fieldValue is an instance of List - if (fieldValue instanceof List && ((List) fieldValue).stream().allMatch(item -> item instanceof DocumentResponseBean)) { - // Step 2: Safely cast to List - List documentList = (List) fieldValue; + // If a matching form field is found, process its value + if (matchingFormField.isPresent()) { + ApplicationFormFieldResponseBean formField = matchingFormField.get(); + fieldValue = formField.getFieldValue(); - // Step 3: Extract names from the document list - List names = documentList.stream() - .map(DocumentResponseBean::getName) // Extract the name from each DocumentResponseBean - .collect(Collectors.toList()); + // If fieldValue is null, set it to an empty string + if (fieldValue == null) { + fieldValue = ""; + } - fieldValue=names; - } + // Process 'fileupload' and 'checkboxes' cases as in the original logic + if (name.equals("fileupload")) { + if (fieldValue instanceof List && ((List) fieldValue).stream().allMatch(item -> item instanceof DocumentResponseBean)) { + List documentList = (List) fieldValue; + List names = documentList.stream() + .map(DocumentResponseBean::getName) + .collect(Collectors.toList()); + fieldValue = names; } - if(name.equals("checkboxes")) { - List check = (List) fieldValue; - List settingResponseBeans = matchingContent.get().getSettings(); - for (SettingResponseBean settingResponseBean : settingResponseBeans) { - // Initialize a list to hold matched labels for each SettingResponseBean - List matchedLabels = new ArrayList<>(); - if (settingResponseBean.getValue() instanceof List) { + } else if (name.equals("checkboxes")) { + List check = (List) fieldValue; + List settingResponseBeans = content.getSettings(); + List matchedLabels = new ArrayList<>(); - List valueList = (List) settingResponseBean.getValue(); - if (!valueList.isEmpty() && valueList.get(0) instanceof Map) { - // Cast to List> - List> options = (List>) valueList; - for (Map field : options) { - for (String val : check) { - String name1=field.get("name"); - if (val.equals(name1)) { // Check if the key exists in the current field map - String label = field.get("label"); // Extract the label - if (field != null) { // Check if the value is not null - matchedLabels.add(label); // Add the value to the matchedValues list - } - } + for (SettingResponseBean settingResponseBean : settingResponseBeans) { + if (settingResponseBean.getValue() instanceof List) { + List> options = (List>) settingResponseBean.getValue(); + + for (Map field : options) { + for (String val : check) { + String name1 = field.get("name"); + if (val.equals(name1)) { + String labelVal = field.get("label"); + if (labelVal != null) { + matchedLabels.add(labelVal); } } - fieldValue = matchedLabels; } } } } - // Add the label-value pair to the list - fieldValue = findLabelInOptions(matchingContent.get().getSettings(), fieldValue); - labelValuePairs.add(new FieldLabelValuePairRequest(contentLabel, fieldValue)); + fieldValue = matchedLabels; } + + // Further processing of field value (e.g., finding labels in options) + fieldValue = findLabelInOptions(content.getSettings(), fieldValue); + } else { + // If no matching form field is found, store contentId with an empty string + fieldValue = ""; } + try { + addLabelValuePair(writer,document, contentLabel, fieldValue, labelFont,valueFont,content); + } catch (DocumentException e) { + log.error("Error checking object: " + e.getMessage(), e); + + } +// } labelValuePairs.add(new FieldLabelValuePairRequest(contentLabel, fieldValue)); + } + return labelValuePairs; } + public static Object findLabelInOptions(List settings, Object valueToFind) { ObjectMapper objectMapper = new ObjectMapper(); diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index bc8aff6c..5da90a21 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -31,6 +31,8 @@ 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 static org.apache.commons.lang3.StringUtils.isEmpty; + public class Utils { @@ -315,4 +317,56 @@ public class Utils { } return content.trim().replace(" ", "_"); } + public static List> convertJsonStringIntoJsonList(String jsonString) { + try { + if(isEmpty(jsonString)) + { + return new ArrayList<>(); + } + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature(), true); + return mapper.readValue(jsonString, List.class); + } catch (Exception e) { + log.error(e.getMessage()); + } + return null; + } + public static String convertToString(Object input) { + if (input == null) { + return "null"; // Return string "null" for null input + } + + if (input instanceof String) { + return (String) input; // Return the string directly if input is a string + } + + if (input instanceof Collection) { + // Handle collections (List, Set, etc.) + return convertCollectionToString((Collection) input); + } + + if (input instanceof Map) { + // Handle maps + return convertMapToString((Map) input); + } + + // For other types (like Integer, Boolean, etc.), use toString() + return input.toString(); + } + + private static String convertCollectionToString(Collection collection) { + try { + return mapper.writeValueAsString(collection); // Convert the collection to a JSON string + } catch (JsonProcessingException e) { + throw new RuntimeException("Error converting collection to string", e); + } + } + + private static String convertMapToString(Map map) { + try { + return mapper.writeValueAsString(map); // Convert the map to a JSON string + } catch (JsonProcessingException e) { + throw new RuntimeException("Error converting map to string", e); + } + } } From 1663b53c1fa3ce52f3db30f9f037f215f8d0b3cb Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 25 Oct 2024 02:59:35 +0530 Subject: [PATCH 43/47] added validation in Beneficiary Preferred Call --- .../tendermanagement/dao/ApplicationDao.java | 2 +- .../dao/BeneficiaryPreferredCallDao.java | 36 +++++++++---------- .../enums/ApplicationStatusTypeEnum.java | 2 +- .../BeneficiaryPreferredCallServiceImpl.java | 9 ++--- 4 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 04eb8b95..c68d3f2e 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -870,7 +870,7 @@ public class ApplicationDao { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG)); } - applicationEntity.setStatus(ApplicationStatusTypeEnum.AWAIT.getValue()); + applicationEntity.setStatus(ApplicationStatusTypeEnum.AWAITING.getValue()); applicationEntity = saveApplicationEntity(applicationEntity); return getApplicationResponse(applicationEntity); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/BeneficiaryPreferredCallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/BeneficiaryPreferredCallDao.java index 13b0f719..285702f1 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/BeneficiaryPreferredCallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/BeneficiaryPreferredCallDao.java @@ -5,13 +5,11 @@ import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.BeneficiaryPreferredCallEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.BeneficiaryCallStatus; -import net.gepafin.tendermanagement.enums.RoleStatusEnum; -import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.BeneficiaryPreferredCallReq; import net.gepafin.tendermanagement.model.response.BeneficiaryPreferredCallResponseBean; import net.gepafin.tendermanagement.repositories.BeneficiaryPreferredCallRepository; -import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.slf4j.Logger; @@ -19,10 +17,11 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import jakarta.servlet.http.HttpServletRequest; + import java.util.List; import java.util.stream.Collectors; -import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; @Component public class BeneficiaryPreferredCallDao { @@ -31,11 +30,14 @@ public class BeneficiaryPreferredCallDao { @Autowired private BeneficiaryPreferredCallRepository beneficiaryPreferredCallRepository; + @Autowired - private UserService userService; + private Validator validator; - public BeneficiaryPreferredCallResponseBean createBeneficiaryPreferredCall(BeneficiaryPreferredCallReq request,UserEntity user) { + + public BeneficiaryPreferredCallResponseBean createBeneficiaryPreferredCall(HttpServletRequest httpServletRequest, BeneficiaryPreferredCallReq request,UserEntity user) { log.info("Creating new beneficiary preferred call with details: {}", request); + validator.validateUserWithCompany(httpServletRequest, request.getCompanyId()); BeneficiaryPreferredCallEntity entity = convertRequestToEntity(request,user); entity = beneficiaryPreferredCallRepository.save(entity); log.info("Beneficiary preferred call created with ID: {}", entity.getId()); @@ -44,9 +46,8 @@ public class BeneficiaryPreferredCallDao { private BeneficiaryPreferredCallEntity convertRequestToEntity(BeneficiaryPreferredCallReq request,UserEntity userEntity) { BeneficiaryPreferredCallEntity entity = new BeneficiaryPreferredCallEntity(); - UserEntity user= userService.validateUser(userEntity.getId()); - if (user.getBeneficiary()!=null) { - entity.setBeneficiaryId(user.getBeneficiary().getId()); + if (userEntity.getBeneficiary()!=null) { + entity.setBeneficiaryId(userEntity.getBeneficiary().getId()); } entity.setStatus(BeneficiaryCallStatus.ENABLED.getValue()); entity.setCallId(request.getCallId()); @@ -55,9 +56,10 @@ public class BeneficiaryPreferredCallDao { return entity; } - public BeneficiaryPreferredCallResponseBean getBeneficiaryPreferredCallById(Long id) { + public BeneficiaryPreferredCallResponseBean getBeneficiaryPreferredCallById(HttpServletRequest request, Long id) { log.info("Fetching beneficiary preferred call with ID: {}", id); BeneficiaryPreferredCallEntity entity = validateBeneficiaryPreferredCall(id); + validator.validateUserId(request, entity.getUserId()); log.info("Beneficiary preferred call found: {}", entity); return convertEntityToResponse(entity); } @@ -74,20 +76,18 @@ public class BeneficiaryPreferredCallDao { // return convertEntityToResponse(existingEntity); // } - private boolean isUserABeneficiary(Long userId) { - UserEntity user=userService.validateUser(userId); - return RoleStatusEnum.ROLE_BENEFICIARY.getValue().equals(user.getRoleEntity().getRoleType()); - } - public void deleteBeneficiaryPreferredCallById(Long id) { + public void deleteBeneficiaryPreferredCallById(HttpServletRequest request, Long id) { log.info("Deleting beneficiary preferred call with ID: {}", id); - validateBeneficiaryPreferredCall(id); + BeneficiaryPreferredCallEntity entity = validateBeneficiaryPreferredCall(id); + validator.validateUserId(request, entity.getUserId()); beneficiaryPreferredCallRepository.deleteById(id); log.info("Beneficiary preferred call deleted with ID: {}", id); } - public List getAllBeneficiaryPreferredCalls() { + public List getAllBeneficiaryPreferredCalls(HttpServletRequest request) { + UserEntity userEntity = validator.validateUser(request); log.info("Fetching all beneficiary preferred calls"); - List calls = beneficiaryPreferredCallRepository.findAll() + List calls = beneficiaryPreferredCallRepository.findByUserId(userEntity.getId()) .stream() .map(this::convertEntityToResponse) .collect(Collectors.toList()); diff --git a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java index e9c1fb7a..fe44af47 100644 --- a/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java +++ b/src/main/java/net/gepafin/tendermanagement/enums/ApplicationStatusTypeEnum.java @@ -6,7 +6,7 @@ public enum ApplicationStatusTypeEnum { DRAFT("DRAFT"), SUBMIT("SUBMIT"), - AWAIT("AWAIT"), + AWAITING("AWAITING"), READY("READY"), DISCARD("DISCARD"), EVALUATION("EVALUATION"); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/BeneficiaryPreferredCallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/BeneficiaryPreferredCallServiceImpl.java index 48b07bff..01f2648a 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/BeneficiaryPreferredCallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/BeneficiaryPreferredCallServiceImpl.java @@ -35,22 +35,22 @@ public class BeneficiaryPreferredCallServiceImpl implements BeneficiaryPreferred @Override public BeneficiaryPreferredCallResponseBean createBeneficiaryPreferredCall(HttpServletRequest request, BeneficiaryPreferredCallReq beneficiaryPreferredCallRequest) { UserEntity userEntity = validator.validateUser(request); - return beneficiaryPreferredCallDao.createBeneficiaryPreferredCall(beneficiaryPreferredCallRequest,userEntity); + return beneficiaryPreferredCallDao.createBeneficiaryPreferredCall(request, beneficiaryPreferredCallRequest,userEntity); } @Override public BeneficiaryPreferredCallResponseBean getBeneficiaryPreferredCallById(HttpServletRequest request, Long id) { - return beneficiaryPreferredCallDao.getBeneficiaryPreferredCallById(id); + return beneficiaryPreferredCallDao.getBeneficiaryPreferredCallById(request, id); } @Override public void deleteBeneficiaryPreferredCall(HttpServletRequest request, Long id) { - beneficiaryPreferredCallDao.deleteBeneficiaryPreferredCallById(id); + beneficiaryPreferredCallDao.deleteBeneficiaryPreferredCallById(request, id); } @Override public List getAllBeneficiaryPreferredCalls(HttpServletRequest request) { - return beneficiaryPreferredCallDao.getAllBeneficiaryPreferredCalls(); + return beneficiaryPreferredCallDao.getAllBeneficiaryPreferredCalls(request); } // @Override @@ -66,6 +66,7 @@ public class BeneficiaryPreferredCallServiceImpl implements BeneficiaryPreferred @Override public List getBeneficiaryPreferredCallByUserId(HttpServletRequest request,Long userId,Long beneficiaryId,Long companyId) { UserEntity userEntity =validateGetBeneficiaryPreferredCallrequest(request,userId,beneficiaryId); + validator.validateUserId(request, userEntity.getId()); return beneficiaryPreferredCallDao.getBeneficiaryPreferredCallByUserId(userEntity,companyId); } From 4ef26827e768ca7594632da8696857403ab9a1a3 Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 25 Oct 2024 11:10:07 +0530 Subject: [PATCH 44/47] validate login attempt --- .../tendermanagement/dao/LoginAttemptDao.java | 5 +++-- .../repositories/LoginAttemptRepository.java | 10 ++++++++++ .../service/LoginAttemptService.java | 2 +- .../service/impl/LoginAttemptServiceImpl.java | 15 +++++++++++++-- .../web/rest/api/LoginAttemptApi.java | 2 +- .../rest/api/impl/LoginAttemptApiController.java | 4 ++-- 6 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/LoginAttemptDao.java b/src/main/java/net/gepafin/tendermanagement/dao/LoginAttemptDao.java index 509d4843..9ff64040 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/LoginAttemptDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/LoginAttemptDao.java @@ -3,6 +3,7 @@ package net.gepafin.tendermanagement.dao; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.LoginAttemptEntity; +import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.response.LoginAttemptPageableResponseBean; import net.gepafin.tendermanagement.repositories.LoginAttemptRepository; import net.gepafin.tendermanagement.util.DateTimeUtil; @@ -29,7 +30,7 @@ public class LoginAttemptDao { loginAttemptRepository.save(loginAttemptEntity); } - public LoginAttemptPageableResponseBean> getLoginAttemptsList(Integer pageNo, Integer pageLimit) { + public LoginAttemptPageableResponseBean> getLoginAttemptsList(UserEntity userEntity, Integer pageNo, Integer pageLimit) { if (pageLimit == null || pageLimit <= 0) { pageLimit = GepafinConstant.DEFAULT_PAGE_LIMIT; } @@ -38,7 +39,7 @@ public class LoginAttemptDao { pageNo = GepafinConstant.DEFAULT_PAGE; } - Page page = loginAttemptRepository.findAll(PageRequest.of(pageNo - 1, pageLimit, Sort.by(GepafinConstant.ATTEMPT_DATE).descending())); + Page page = loginAttemptRepository.findByHubId(userEntity.getHub().getId(), PageRequest.of(pageNo - 1, pageLimit, Sort.by(GepafinConstant.ATTEMPT_DATE).descending())); List list = new ArrayList<>(); for (LoginAttemptEntity loginAttemptEntity : page.getContent()) { list.add(loginAttemptEntity); diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/LoginAttemptRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/LoginAttemptRepository.java index 257b8ed8..3135e7cd 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/LoginAttemptRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/LoginAttemptRepository.java @@ -1,9 +1,19 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.LoginAttemptEntity; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository public interface LoginAttemptRepository extends JpaRepository { + + @Query("SELECT la FROM LoginAttemptEntity la LEFT JOIN UserEntity u ON u.email = la.username WHERE u.hub.id = :hubId") + Page findByHubId(@Param("hubId") Long hubId, PageRequest pageRequest); + + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/LoginAttemptService.java b/src/main/java/net/gepafin/tendermanagement/service/LoginAttemptService.java index 3e4ed31a..6c8990e1 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/LoginAttemptService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/LoginAttemptService.java @@ -9,7 +9,7 @@ import java.util.List; public interface LoginAttemptService { - LoginAttemptPageableResponseBean> getLoginAttemptsList(Integer pageNo, Integer pageLimit); + LoginAttemptPageableResponseBean> getLoginAttemptsList(HttpServletRequest request, Integer pageNo, Integer pageLimit); void createLoginAttempt(LoginAttemptReq loginAttemptReq, HttpServletRequest request); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/LoginAttemptServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/LoginAttemptServiceImpl.java index 1519273f..fb645aac 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/LoginAttemptServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/LoginAttemptServiceImpl.java @@ -3,12 +3,15 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.LoginAttemptDao; import net.gepafin.tendermanagement.entities.LoginAttemptEntity; +import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.LoginAttemptResultEnum; import net.gepafin.tendermanagement.enums.LoginAttemptTypeEnum; import net.gepafin.tendermanagement.model.request.LoginAttemptReq; import net.gepafin.tendermanagement.model.response.LoginAttemptPageableResponseBean; import net.gepafin.tendermanagement.service.LoginAttemptService; import net.gepafin.tendermanagement.util.Utils; +import net.gepafin.tendermanagement.util.Validator; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -19,22 +22,30 @@ public class LoginAttemptServiceImpl implements LoginAttemptService { @Autowired LoginAttemptDao loginAttemptDao; + + @Autowired + private Validator validator; @Override - public LoginAttemptPageableResponseBean> getLoginAttemptsList(Integer pageNo, Integer pageLimit) { - return loginAttemptDao.getLoginAttemptsList(pageNo, pageLimit); + public LoginAttemptPageableResponseBean> getLoginAttemptsList(HttpServletRequest request, Integer pageNo, Integer pageLimit) { + return loginAttemptDao.getLoginAttemptsList(validator.validateUser(request), pageNo, pageLimit); } @Override public void createLoginAttempt(LoginAttemptReq loginAttemptReq, HttpServletRequest request) { String ipAddress = Utils.getClientIpAddress(request); String userAgent = request.getHeader("user-agent"); + LoginAttemptEntity loginAttemptEntity = new LoginAttemptEntity(); loginAttemptEntity.setType(LoginAttemptTypeEnum.SWITCH.getValue()); loginAttemptEntity.setIpAddress(ipAddress); loginAttemptEntity.setUserAgent(userAgent); loginAttemptEntity.setUsername(loginAttemptReq.getUserName()); loginAttemptEntity.setResult(LoginAttemptResultEnum.SUCCESS.getValue()); + if(loginAttemptReq.getUserId() != null) { + UserEntity userEntity = validator.validateUserId(request, loginAttemptReq.getUserId()); + loginAttemptEntity.setUserId(userEntity.getId()); + } loginAttemptDao.createLoginAttempt(loginAttemptEntity); } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/LoginAttemptApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/LoginAttemptApi.java index 379a1d05..4a71d545 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/LoginAttemptApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/LoginAttemptApi.java @@ -41,7 +41,7 @@ public interface LoginAttemptApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) @GetMapping(value = "/login-attempt", produces = {"application/json"}) @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") - default ResponseEntity>> getLoginAttemptsList( + default ResponseEntity>> getLoginAttemptsList(HttpServletRequest request, @ApiParam(value = "page number") @RequestParam(name = "pageNo", required = false) Integer pageNo, @ApiParam(value = "page limit") @RequestParam(name = "pageLimit", required = false) Integer pageLimit) { return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LoginAttemptApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LoginAttemptApiController.java index ed3a048b..cfd601b3 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LoginAttemptApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/LoginAttemptApiController.java @@ -39,8 +39,8 @@ public class LoginAttemptApiController implements LoginAttemptApi { private UserService userService; @Override - public ResponseEntity>> getLoginAttemptsList(Integer pageNo, Integer pageLimit) { - LoginAttemptPageableResponseBean> response = loginAttemptService.getLoginAttemptsList(pageNo, pageLimit); + public ResponseEntity>> getLoginAttemptsList(HttpServletRequest request, Integer pageNo, Integer pageLimit) { + LoginAttemptPageableResponseBean> response = loginAttemptService.getLoginAttemptsList(request, pageNo, pageLimit); return ResponseEntity.status(HttpStatus.OK).body(response); } From 84636abbc5922d5d21eb132340d0962dc6285809 Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 25 Oct 2024 12:00:21 +0530 Subject: [PATCH 45/47] validate assigned application --- .../dao/AssignedApplicationsDao.java | 33 ++++++++++++++----- .../service/AssignedApplicationsService.java | 4 +-- .../impl/AssignedApplicationsServiceImpl.java | 16 ++++----- .../tendermanagement/util/Validator.java | 29 ++++++++++++++++ .../web/rest/api/AssignedApplicationsApi.java | 9 ++--- .../impl/AssignedApplicationsController.java | 8 ++--- 6 files changed, 72 insertions(+), 27 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index bdf85b41..541fe218 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -1,5 +1,6 @@ package net.gepafin.tendermanagement.dao; import jakarta.persistence.criteria.Predicate; +import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.ApplicationEntity; @@ -14,6 +15,7 @@ import net.gepafin.tendermanagement.repositories.AssignedApplicationsRepository; import net.gepafin.tendermanagement.service.ApplicationService; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; @@ -42,6 +44,9 @@ public class AssignedApplicationsDao { @Autowired private UserService userService; + + @Autowired + private Validator validator; public AssignedApplicationsResponse createAssignedApplications(Long applicationId, Long userId, UserEntity assignedByUser, AssignedApplicationsRequest assignedApplicationsRequest){ log.info("Assigning application to pre-Instructor with details: {}", applicationId,userId); @@ -137,38 +142,47 @@ public class AssignedApplicationsDao { return assignedApplication; } - public void deleteById(Long id) { + public void deleteById(HttpServletRequest request, Long id) { log.info("Deleting assigned application with ID: {}", id); AssignedApplicationsEntity assignedApplicationsEntity= validateAssignedApplication(id); + validator.validatePreInstructor(request, assignedApplicationsEntity.getUserId()); assignedApplicationsEntity.setIsDeleted(true); assignedApplicationsEntity= saveAssignedApplication(assignedApplicationsEntity); log.info("Assigned Application deleted with ID: {}", id); } - public List getAllAssignedApplications(Long userId){ - Specification spec = search(userId); + public List getAllAssignedApplications(HttpServletRequest request, Long userId) { + UserEntity user = validator.validateUser(request); + if(validator.checkIsPreInstructor() && userId == null) { + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.USER_ID_NOT_NULL_MSG)); + } + if(userId != null) { + validator.validatePreInstructor(request, userId); + } + Specification spec = search(user.getHub().getId() ,userId); List assignedApplicationsEntityList = assignedApplicationsRepository.findAll(spec); return assignedApplicationsEntityList.stream() .map(entity -> convertEntityToResponse(entity)) .collect(Collectors.toList()); } - private Specification search(Long userId) { + private Specification search(Long hubId, Long userId) { return (root, query, builder) -> { Predicate predicate = builder.isFalse(root.get("isDeleted")); if (userId != null) { predicate = builder.and(predicate, builder.equal(root.get("userId"), userId)); } + predicate = builder.and(predicate, builder.equal(root.get("application").get("hubId"), userId)); return predicate; }; } - public AssignedApplicationsResponse updateAssignedApplication( - Long id, AssignedApplicationsRequest updateRequest, UserEntity updatedByUser) { - + public AssignedApplicationsResponse updateAssignedApplication(HttpServletRequest request, + Long id, AssignedApplicationsRequest updateRequest) { + UserEntity updatedByUser = validator.validateUser(request); log.info("Updating assigned application with ID: {}", id); AssignedApplicationsEntity existingAssignment = validateAssignedApplication(id); - + validator.validatePreInstructor(request, existingAssignment.getUserId()); setIfUpdated(existingAssignment::getNote, existingAssignment::setNote, updateRequest.getNote()); setIfUpdated(existingAssignment::getStatus, existingAssignment::setStatus, updateRequest.getStatus().name()); setIfUpdated(existingAssignment::getAssignedBy, existingAssignment::setAssignedBy, updatedByUser.getId()); @@ -181,9 +195,10 @@ public class AssignedApplicationsDao { return response; } - public AssignedApplicationsResponse getAssignedApplicationById(Long id) { + public AssignedApplicationsResponse getAssignedApplicationById(HttpServletRequest request, Long id) { log.info("Fetching assigned application with ID: {}", id); AssignedApplicationsEntity assignedApplication = validateAssignedApplication(id); + validator.validatePreInstructor(request, assignedApplication.getUserId()); AssignedApplicationsResponse response = convertEntityToResponse(assignedApplication); log.info("Assigned application fetched successfully: {}", response); return response; diff --git a/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java b/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java index 2e211916..166e9180 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/AssignedApplicationsService.java @@ -13,7 +13,7 @@ public interface AssignedApplicationsService { void deleteApplication(HttpServletRequest request, Long id); - List getAllAssignedApplications(Long userId); + List getAllAssignedApplications(HttpServletRequest request, Long userId); AssignedApplicationsResponse updateAssignedApplication(HttpServletRequest request, Long id, AssignedApplicationsRequest assignedApplicationsRequest); - AssignedApplicationsResponse getAssignedApplicationById(Long id); + AssignedApplicationsResponse getAssignedApplicationById(HttpServletRequest request, Long id); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java index 00733f07..e0301dec 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AssignedApplicationsServiceImpl.java @@ -26,32 +26,32 @@ public class AssignedApplicationsServiceImpl implements AssignedApplicationsServ @Transactional(rollbackFor = Exception.class) public AssignedApplicationsResponse createAssignedApplications(HttpServletRequest request, Long applicationId, Long userId, AssignedApplicationsRequest assignedApplicationsRequest) { UserEntity assignedByUser= validator.validateUser(request); + validator.validatePreInstructor(request, userId); return assignedApplicationsDao.createAssignedApplications(applicationId,userId,assignedByUser, assignedApplicationsRequest); } @Override @Transactional(rollbackFor = Exception.class) public void deleteApplication(HttpServletRequest request, Long id) { - assignedApplicationsDao.deleteById(id); + assignedApplicationsDao.deleteById(request, id); } @Override @Transactional(readOnly = true) - public List getAllAssignedApplications(Long userId) { - return assignedApplicationsDao.getAllAssignedApplications(userId); + public List getAllAssignedApplications(HttpServletRequest request, Long userId) { + return assignedApplicationsDao.getAllAssignedApplications(request, userId); } @Override @Transactional(rollbackFor = Exception.class) - public AssignedApplicationsResponse updateAssignedApplication(HttpServletRequest request, Long id , AssignedApplicationsRequest updatedAssignedApplicationRequest) { - UserEntity updatedByUser= validator.validateUser(request); - return assignedApplicationsDao.updateAssignedApplication(id,updatedAssignedApplicationRequest,updatedByUser); + public AssignedApplicationsResponse updateAssignedApplication(HttpServletRequest request, Long id, AssignedApplicationsRequest updatedAssignedApplicationRequest) { + return assignedApplicationsDao.updateAssignedApplication(request, id, updatedAssignedApplicationRequest); } @Override @Transactional(readOnly = true) - public AssignedApplicationsResponse getAssignedApplicationById(Long id) { - return assignedApplicationsDao.getAssignedApplicationById(id); + public AssignedApplicationsResponse getAssignedApplicationById(HttpServletRequest request, Long id) { + return assignedApplicationsDao.getAssignedApplicationById(request, id); } } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Validator.java b/src/main/java/net/gepafin/tendermanagement/util/Validator.java index ecf4b3ae..f4f2e2bd 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Validator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Validator.java @@ -64,6 +64,20 @@ public class Validator { } return false; } + + public Boolean checkIsPreInstructor() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication != null && authentication.isAuthenticated()) { + // Check if the user has the ROLE_SUPER_ADMIN authority + for (GrantedAuthority authority : authentication.getAuthorities()) { + if (RoleStatusEnum.ROLE_PRE_INSTRUCTOR.getValue().equals(authority.getAuthority())) { + return true; + } + } + } + return false; + } public void validateRequest(HttpServletRequest request,RoleStatusEnum role) { if (RoleStatusEnum.ROLE_SUPER_ADMIN.equals(role) && Boolean.FALSE.equals(checkIsSuperAdmin())) { @@ -138,5 +152,20 @@ public class Validator { String[] activeProfiles = environment.getActiveProfiles(); return Arrays.stream(activeProfiles).anyMatch("production"::equals); } + + public UserEntity validatePreInstructor(HttpServletRequest request, Long preInstructorUserId) { + UserEntity preInstructorUser = userService.validateUser(preInstructorUserId); + if (checkIsSuperAdmin()) { + if (preInstructorUserId != null) { + validateHubId(request, preInstructorUser.getHub().getId()); + } + return preInstructorUser; + } else if (checkIsPreInstructor()) { + return validateUserId(request, preInstructorUserId); + } else { + throw new ForbiddenAccessException(Status.FORBIDDEN, + Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); + } + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java index dfbbfc37..1cfbb5c9 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/AssignedApplicationsApi.java @@ -6,9 +6,7 @@ import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; -import net.gepafin.tendermanagement.enums.AssignedApplicationEnum; import net.gepafin.tendermanagement.model.request.AssignedApplicationsRequest; -import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean; import net.gepafin.tendermanagement.model.response.AssignedApplicationsResponse; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; @@ -66,7 +64,8 @@ public interface AssignedApplicationsApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "", produces = "application/json") - ResponseEntity>> getAllAssignedApplications(@Parameter(description = "The User ID", required = false) @RequestParam(value = "userId",required = false) Long userId); + ResponseEntity>> getAllAssignedApplications(HttpServletRequest request, + @Parameter(description = "The User ID", required = false) @RequestParam(value = "userId",required = false) Long userId); @Operation(summary = "Api to update assigned application", responses = { @@ -94,7 +93,9 @@ public interface AssignedApplicationsApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "/{id}", produces = "application/json") - ResponseEntity> getAssignedApplicationById(@Parameter(description = "The assigned application id", required = true) @PathVariable(value = "id", required = true) Long id); + ResponseEntity> getAssignedApplicationById(HttpServletRequest request, + @Parameter(description = "The assigned application id", required = true) @PathVariable(value = "id", required = true) Long id); + diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java index 9c4f0ad4..90f989de 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/AssignedApplicationsController.java @@ -43,9 +43,9 @@ public class AssignedApplicationsController implements AssignedApplicationsApi { } @Override - public ResponseEntity>> getAllAssignedApplications(Long userId) { + public ResponseEntity>> getAllAssignedApplications(HttpServletRequest request, Long userId) { log.info("Get All Assigned Applications"); - List applications = assignedApplicationsService.getAllAssignedApplications(userId); + List applications = assignedApplicationsService.getAllAssignedApplications(request, userId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applications, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_ASSIGNED_APPLICATION_SUCCESS_MSG))); } @@ -59,9 +59,9 @@ public class AssignedApplicationsController implements AssignedApplicationsApi { } @Override - public ResponseEntity> getAssignedApplicationById(Long id) { + public ResponseEntity> getAssignedApplicationById(HttpServletRequest request, Long id) { log.info("Get Assigned Applications By Id"); - AssignedApplicationsResponse application = assignedApplicationsService.getAssignedApplicationById(id); + AssignedApplicationsResponse application = assignedApplicationsService.getAssignedApplicationById(request, id); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(application, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_ASSIGNED_APPLICATION_SUCCESS_MSG))); } From d27b7f1a2eff2478b2db44d9c70302e9ac05632c Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 25 Oct 2024 12:24:47 +0530 Subject: [PATCH 46/47] updated code --- .../gepafin/tendermanagement/dao/AssignedApplicationsDao.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java index 541fe218..f04b5e98 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/AssignedApplicationsDao.java @@ -171,7 +171,7 @@ public class AssignedApplicationsDao { if (userId != null) { predicate = builder.and(predicate, builder.equal(root.get("userId"), userId)); } - predicate = builder.and(predicate, builder.equal(root.get("application").get("hubId"), userId)); + predicate = builder.and(predicate, builder.equal(root.get("application").get("hubId"), hubId)); return predicate; }; } From d20b9abc079a6d32c088244cb5e3b741ede998a7 Mon Sep 17 00:00:00 2001 From: piyuskag Date: Fri, 25 Oct 2024 15:29:28 +0530 Subject: [PATCH 47/47] Done Ticket GEPAFINBE-71 --- .../constants/GepafinConstant.java | 9 + .../tendermanagement/dao/ApplicationDao.java | 27 +- .../tendermanagement/dao/DelegationDao.java | 22 +- .../tendermanagement/dao/DocumentDao.java | 60 +- .../tendermanagement/dao/S3ConfigDao.java | 104 +++ .../tendermanagement/dao/S3PathConfig.java | 49 + .../entities/S3ConfigEntity.java | 25 + .../enums/DocOtherSourceTypeEnum.java | 17 + .../model/request/S3ConfigReq.java | 20 + .../model/response/S3ConfigBean.java | 11 + .../repositories/ApplicationRepository.java | 3 +- .../ApplicationSignedDocumentRepository.java | 11 + .../repositories/DocumentRepository.java | 2 + .../repositories/S3ConfigRepository.java | 24 + .../UserCompanyDelegationRepository.java | 6 + .../service/S3ConfigService.java | 19 + .../service/impl/DocumentServiceImpl.java | 2 +- .../service/impl/S3ConfigServiceImpl.java | 41 + .../impl/S3ReUploadMigrationService.java | 197 ++++ .../UserSignedAndDelegationServiceImpl.java | 261 ++++++ .../web/rest/api/S3ConfigApi.java | 67 ++ .../web/rest/api/S3MigrationApi.java | 28 + .../rest/api/UserSignedAndDelegationApi.java | 38 + .../rest/api/impl/DocumentApiController.java | 2 +- .../web/rest/api/impl/S3ConfigController.java | 59 ++ .../api/impl/S3MigrationApiController.java | 19 + ...ignedAndDelegationMigrationController.java | 24 + .../db/changelog/db.changelog-1.0.0.xml | 882 ++++++++++-------- 28 files changed, 1620 insertions(+), 409 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/S3ConfigDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/S3ConfigEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/enums/DocOtherSourceTypeEnum.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/S3ConfigReq.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/S3ConfigBean.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/S3ConfigRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/S3ConfigService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/S3ConfigServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/S3ConfigApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/S3MigrationApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/UserSignedAndDelegationApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3ConfigController.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3MigrationApiController.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3UserSignedAndDelegationMigrationController.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 38e3969a..525849b7 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -249,5 +249,14 @@ public class GepafinConstant { public static final String HUB_NOT_FOUND = "hub_not_found"; public static final String EVALUATIONCRITERIA_INVALID = "evaluationCriteria.invalid"; public static final String GET_ERROR_S3 = "get.error.s3"; + + public static final String ADDED_S3_PATH_STRUCTURE ="added.s3.path.structure"; + public static final String S3_PATH_STRUCTURE_BY_TYPE ="fetched.s3.path.structure.by.type.successfully"; + public static final String S3_PATH_STRUCTURE_NOT_FOUND_BY_TYPE_MSG ="s3.path.not.found.by.type"; + public static final String S3_PATH_STRUCTURE_NOT_FOUND_BY_ID_MSG ="s3.path.not.found.by.id"; + public static final String S3_PATH_DELETE_MSG ="s3.path.config.delete.successfully"; + public static final String S3_PATH_CONFIG_UPDATE_MSG ="s3.path.config.updated.successfully"; + public static final String S3_PATH_CONFIG_DUPLICATE_TYPE_ALREADY_EXIST ="s3.path.config.already.exist."; + public static final String S3_PATH_GENERATION_ERROR_MSG ="s3.path.config.already.exist."; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index 8aff7b3b..a9162986 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -6,6 +6,7 @@ import net.gepafin.tendermanagement.entities.*; import net.gepafin.tendermanagement.entities.SystemEmailTemplatesEntity.SystemEmailTemplatesEntityTypeEnum; import net.gepafin.tendermanagement.enums.ApplicationSignedDocumentStatusEnum; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; +import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum; import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.enums.UserCompanyDelegationStatusEnum; @@ -127,6 +128,9 @@ public class ApplicationDao { @Autowired private UserService userService; + @Autowired + S3PathConfig s3ConfigBean; + public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId, Long applicationId) { FormEntity formEntity = formService.validateForm(formId); @@ -805,9 +809,9 @@ public class ApplicationDao { applicationSignedDocument.setStatus(ApplicationSignedDocumentStatusEnum.INACTIVE.getValue()); applicationSignedDocumentRepository.save(applicationSignedDocument); } - UploadFileOnAmazonS3Response uploadFileOnAmazonS3 = amazonS3Service.uploadFileOnAmazonS3(signedDocumentS3Folder, - file); - applicationSignedDocument = new ApplicationSignedDocumentEntity(); + UploadFileOnAmazonS3Response uploadFileOnAmazonS3 = uploadFileOnAmazonS3ForUserSignedDocument(file, + applicationEntity.getCall().getId(), applicationId); + applicationSignedDocument = new ApplicationSignedDocumentEntity(); applicationSignedDocument.setApplication(applicationEntity); applicationSignedDocument.setFileName(uploadFileOnAmazonS3.getFileName()); applicationSignedDocument.setFilePath(uploadFileOnAmazonS3.getFilePath()); @@ -815,7 +819,22 @@ public class ApplicationDao { applicationSignedDocumentRepository.save(applicationSignedDocument); return convertApplicationSignedDocumentToApplicationSignedDocumentResponse(applicationSignedDocument); } - + private UploadFileOnAmazonS3Response uploadFileOnAmazonS3ForUserSignedDocument(MultipartFile file, Long callId, Long applicationId) { + try { + String s3Path = generateS3PathForDelegation(callId, applicationId); + log.info("S3 Path {}", s3Path); + return amazonS3Service.uploadFileOnAmazonS3(s3Path, file); + } catch (Exception e) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); + } + } + private String generateS3PathForDelegation(Long callId, Long applicationId) { + try { + return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT, callId, applicationId); + } catch (IllegalArgumentException e) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.S3_PATH_GENERATION_ERROR_MSG)); + } + } private ApplicationSignedDocumentResponse convertApplicationSignedDocumentToApplicationSignedDocumentResponse( ApplicationSignedDocumentEntity applicationSignedDocument) { ApplicationSignedDocumentResponse applicationSignedDocumentResponse = new ApplicationSignedDocumentResponse(); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java index f609086f..b8ce98a0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java @@ -7,6 +7,7 @@ import java.util.HashMap; import java.util.Map; import java.util.function.Function; +import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.springframework.beans.factory.annotation.Autowired; @@ -51,6 +52,9 @@ public class DelegationDao { @Autowired private DocumentRepository documentRepository; + + @Autowired + private S3PathConfig s3ConfigBean; @Value("${aws.s3.url.folder.delegation}") private String s3Folder; @@ -179,7 +183,7 @@ public class DelegationDao { userCompanyDelegationEntity.setStatus(UserCompanyDelegationStatusEnum.INACTIVE.getValue()); userCompanyDelegationRepository.save(userCompanyDelegationEntity); } - UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = amazonS3Service.uploadFileOnAmazonS3(s3Folder, file); + UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = uploadFileOnAmazonS3ForCompanyDelegation(file); userCompanyDelegationEntity = new UserCompanyDelegationEntity(); userCompanyDelegationEntity.setCompanyId(companyId); userCompanyDelegationEntity.setUserId(userEntity.getId()); @@ -192,7 +196,21 @@ public class DelegationDao { userCompanyDelegationRepository.save(userCompanyDelegationEntity); return convertUserCompanyDelegationToCompanyDelegationResponse(userCompanyDelegationEntity); } - + private UploadFileOnAmazonS3Response uploadFileOnAmazonS3ForCompanyDelegation(MultipartFile file) { + try { + String s3Path = generateS3PathForDelegation(); + return amazonS3Service.uploadFileOnAmazonS3(s3Path, file); + } catch (Exception e) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); + } + } + private String generateS3PathForDelegation() { + try { + return s3ConfigBean.generateDocumentPathForDelegationAndSignedDocument(DocOtherSourceTypeEnum.USER_DELEGATION); + } catch (IllegalArgumentException e) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.S3_PATH_GENERATION_ERROR_MSG)); + } + } private CompanyDelegationResponse convertUserCompanyDelegationToCompanyDelegationResponse( UserCompanyDelegationEntity userCompanyDelegationEntity) { return Utils.convertSourceObjectToDestinationObject(userCompanyDelegationEntity, CompanyDelegationResponse.class); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index 90725964..226848f7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -2,7 +2,10 @@ package net.gepafin.tendermanagement.dao; import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; +import net.gepafin.tendermanagement.repositories.ApplicationRepository; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -24,6 +27,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.Status; import java.util.ArrayList; import java.util.List; +@Slf4j @Component public class DocumentDao { @@ -38,6 +42,12 @@ public class DocumentDao { @Autowired private CallService callService; + + @Autowired + private S3PathConfig s3ConfigBean; + + @Autowired + private ApplicationRepository applicationFormRepository; @Value("${aws.s3.url.folder}") private String s3Folder; @@ -46,8 +56,7 @@ public class DocumentDao { List documentEntities = new ArrayList<>(); Long source = resolveSourceId(sourceId, sourceType); for (MultipartFile file : files) { - UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = amazonS3Service.uploadFileOnAmazonS3(s3Folder, - file); + UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = uploadFileOnAmazonS3(file, sourceType, sourceId); if (uploadFileOnAmazonS3Response != null) { DocumentEntity documentEntity = new DocumentEntity(); documentEntity.setFileName(uploadFileOnAmazonS3Response.getFileName()); @@ -62,6 +71,30 @@ public class DocumentDao { documentRepository.saveAll(documentEntities); return documentEntities.stream().map(callDao::convertToDocumentResponseBean).collect(Collectors.toList()); } + private UploadFileOnAmazonS3Response uploadFileOnAmazonS3(MultipartFile file, DocumentSourceTypeEnum type, Long sourceId) { + + Long applicationId = 0L; + Long callId = sourceId; + if (type == DocumentSourceTypeEnum.APPLICATION) { + applicationId = sourceId; + callId = applicationFormRepository.findCallIdById(applicationId); + } + try { + String s3Path = generateS3Path(type, callId, applicationId); + log.info("Generated S3 path {}", s3Path); + return amazonS3Service.uploadFileOnAmazonS3(s3Path, file); + } catch (Exception e) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); + } + } + public String generateS3Path(DocumentSourceTypeEnum typeOfDocument, Long callId, Long applicationId) { + + try { + return s3ConfigBean.generateDocumentPath(typeOfDocument, callId, applicationId); + } catch (IllegalArgumentException e) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.S3_PATH_GENERATION_ERROR_MSG)); + } + } private Long resolveSourceId(Long sourceId, DocumentSourceTypeEnum sourceType) { if (sourceType == DocumentSourceTypeEnum.CALL) { CallEntity callEntity = callService.validateCall(sourceId); @@ -91,8 +124,9 @@ public class DocumentDao { public DocumentResponseBean updateDocument(Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum) { DocumentEntity documentEntity = validateDocument(documentId); - UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = amazonS3Service.uploadFileOnAmazonS3(s3Folder, file); - if (uploadFileOnAmazonS3Response != null) { + String type = documentEntity.getSource(); + UploadFileOnAmazonS3Response uploadFileOnAmazonS3Response = updateFileOnAmazonS3(file, DocumentSourceTypeEnum.valueOf(type), documentEntity.getSourceId()); + if (uploadFileOnAmazonS3Response != null) { documentEntity.setFileName(uploadFileOnAmazonS3Response.getFileName()); documentEntity.setFilePath(uploadFileOnAmazonS3Response.getFilePath()); documentEntity.setType(documentTypeEnum.getValue()); @@ -102,7 +136,25 @@ public class DocumentDao { } return callDao.convertToDocumentResponseBean(documentEntity); } + private UploadFileOnAmazonS3Response updateFileOnAmazonS3(MultipartFile file, DocumentSourceTypeEnum type, Long id) { + try { + Long callId; + Long applicationId; + if(type.equals("APPLICATION")){ + callId = applicationFormRepository.findCallIdById(id); + applicationId = id; + }else{ + callId = id; + applicationId = 0L; + } + String s3Path = generateS3Path(type, callId, applicationId); + log.info("Generated S3 path {}", s3Path); + return amazonS3Service.uploadFileOnAmazonS3(s3Path, file); + } catch (Exception e) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.UPLOAD_ERROR_S3)); + } + } public DocumentResponseBean getDocument(Long documentId) { DocumentEntity documentEntity = validateDocument(documentId); return callDao.convertToDocumentResponseBean(documentEntity); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/S3ConfigDao.java b/src/main/java/net/gepafin/tendermanagement/dao/S3ConfigDao.java new file mode 100644 index 00000000..3661ad02 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/S3ConfigDao.java @@ -0,0 +1,104 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.S3ConfigEntity; +import net.gepafin.tendermanagement.model.request.S3ConfigReq; +import net.gepafin.tendermanagement.model.response.S3ConfigBean; +import net.gepafin.tendermanagement.repositories.S3ConfigRepository; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Optional; + +import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; + +@Component +public class S3ConfigDao { + private static final Logger log = LoggerFactory.getLogger(S3ConfigDao.class); + + @Autowired + S3ConfigRepository s3ConfigRepository; + + public S3ConfigBean addS3Path(S3ConfigReq s3PathConfigurationReq) { + + log.info("Adding s3 s3PathConfigurationReq structure with it's type.."); + S3ConfigEntity s3PathConfigurationEntity = convertToS3pathEntity(s3PathConfigurationReq); + s3PathConfigurationEntity = s3ConfigRepository.save(s3PathConfigurationEntity); + log.info("Added s3 path config details {} to DB.", s3PathConfigurationEntity); + return convertToS3pathBean(s3PathConfigurationEntity); + } + private S3ConfigEntity convertToS3pathEntity(S3ConfigReq s3PathConfigReq) { + + S3ConfigEntity s3PathConfigEntity = new S3ConfigEntity(); + s3PathConfigEntity.setPath(s3PathConfigReq.getPath()); + s3PathConfigEntity.setType(s3PathConfigReq.getType()); + s3PathConfigEntity.setBucketName(s3PathConfigReq.getBucketName()); + return s3PathConfigEntity; + } + private S3ConfigBean convertToS3pathBean(S3ConfigEntity s3PathConfigReq) { + + S3ConfigBean s3PathConfigBean = new S3ConfigBean(); + s3PathConfigBean.setPath(s3PathConfigReq.getPath()); + s3PathConfigBean.setType(s3PathConfigReq.getType()); + s3PathConfigBean.setBucketName(s3PathConfigReq.getBucketName()); + return s3PathConfigBean; + } + + public Optional getS3PathByType(String type) { + + log.info("Fetching S3-Path structure by type: {}", type); + Optional s3PathData = s3ConfigRepository.getPathByType(type); + if (s3PathData == null) { + log.error("No S3-Path found for type: {}", type); + throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.S3_PATH_STRUCTURE_NOT_FOUND_BY_TYPE_MSG)); + } + log.info("Fetched S3-Path: {} for type: {}", s3PathData, type); + return s3PathData; + } + + public S3ConfigEntity deleteS3PathConfigById(Long id) { + + log.info("Checking s3-path associated with this id {} to delete....", id); + S3ConfigEntity s3PathConfigData = s3ConfigRepository.findS3PathConfigurationById(id); + if (s3PathConfigData == null) { + log.error("No S3-Path found for id: {}", id); + throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.S3_PATH_STRUCTURE_NOT_FOUND_BY_ID_MSG)); + } else { + log.info("Found s3-path associated with this id {} to delete.", id); + s3ConfigRepository.deleteById(id); + log.error("Deleted s3-path configuration successfully for id: {}", id); + return s3PathConfigData; + } + } + public S3ConfigBean updateS3PathConfiguration(S3ConfigReq s3PathConfigurationReq, Long id) { + + log.info("Updating S3-path Configuration."); + S3ConfigEntity s3PathConfigDataExists = s3ConfigRepository.findS3PathConfigurationById(id); + if (s3PathConfigDataExists == null) { + log.error("No S3-Path found for id: {}", id); + throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.S3_PATH_STRUCTURE_NOT_FOUND_BY_ID_MSG)); + } else { + Optional s3PathData = s3ConfigRepository.getPathByType(s3PathConfigurationReq.getType()); + if(s3PathData != null){ + log.error("S3-Path type already exist. {}", s3PathData); + throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.S3_PATH_CONFIG_DUPLICATE_TYPE_ALREADY_EXIST)); + } + S3ConfigEntity s3PathConfigurationEntity = convertToS3pathEntity(s3PathConfigurationReq); + setIfUpdated(s3PathConfigurationEntity::getPath, s3PathConfigurationEntity::setPath, s3PathConfigurationReq.getPath()); + setIfUpdated(s3PathConfigurationEntity::getBucketName, s3PathConfigurationEntity::setBucketName, s3PathConfigurationReq.getBucketName()); + setIfUpdated(s3PathConfigurationEntity::getType, s3PathConfigurationEntity::setType, s3PathConfigurationReq.getType()); +// s3PathConfigurationEntity.setType(s3PathConfigurationReq.getType()); +// s3PathConfigurationEntity.setPath(s3PathConfigurationReq.getPath()); +// s3PathConfigurationEntity.setBucketName(s3PathConfigurationReq.getBucketName()); + s3ConfigRepository.save(s3PathConfigurationEntity); + log.info("Updated S3-path-configuration successfully."); + return convertToS3pathBean(s3PathConfigurationEntity); + } + + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java b/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java new file mode 100644 index 00000000..b127b699 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/S3PathConfig.java @@ -0,0 +1,49 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.entities.S3ConfigEntity; +import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum; +import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; +import net.gepafin.tendermanagement.repositories.S3ConfigRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class S3PathConfig { + + @Autowired + S3ConfigRepository s3ConfigRepository; + + public String generateDocumentPath(DocumentSourceTypeEnum type, Long callId, Long applicationId) { + + S3ConfigEntity config = getDocumentPath(type); + return config.getParentFolder() + "/" + buildS3Path(config.getPath(), callId, applicationId); + } + public String generateDocumentPathForOther(DocOtherSourceTypeEnum type, Long callId, Long applicationId) { + + S3ConfigEntity config = getDocumentPathForOther(type); + return config.getParentFolder() + "/" + buildS3Path(config.getPath(), callId, applicationId); + } + private String buildS3Path(String pathTemplate, Long callId, Long applicationId) { + + return pathTemplate.replace("{call_id}", callId != null && callId != 0L ? "call_" + callId : "").replace("{application_id}", applicationId != null && applicationId != 0L ? "application_" + applicationId : ""); + } + public String generateDocumentPathForDelegationAndSignedDocument(DocOtherSourceTypeEnum type) { + + S3ConfigEntity config = getDocumentPathForOther(type); + return config.getParentFolder() + "/" + config.getPath(); + } + private S3ConfigEntity getDocumentPath(DocumentSourceTypeEnum type) { + + return s3ConfigRepository.getPathByType(type.name()).orElseThrow(() -> new IllegalArgumentException("No path configuration found for type: " + type)); + } + private S3ConfigEntity getDocumentPathForOther(DocOtherSourceTypeEnum type) { + + return s3ConfigRepository.getPathByType(type.name()).orElseThrow(() -> new IllegalArgumentException("No path configuration found for type: " + type)); + } + public String getBucketNameForOtherType(DocOtherSourceTypeEnum type){ + return s3ConfigRepository.getBucketNameByType(type); + } + public String getBucketNameForCallAppType(DocumentSourceTypeEnum type){ + return s3ConfigRepository.getBucketNameByType(type); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/S3ConfigEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/S3ConfigEntity.java new file mode 100644 index 00000000..66502bbc --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/S3ConfigEntity.java @@ -0,0 +1,25 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import lombok.Data; + +@Entity +@Table(name = "s3_path_configuration") +@Data +public class S3ConfigEntity extends BaseEntity { + + @Column(name = "TYPE") + private String type; + + @Column(name = "PATH") + private String path; + + @Column(name = "BUCKET_NAME") + private String bucketName; + + @Column(name = "PARENT_FOLDER") + private String parentFolder; +} + diff --git a/src/main/java/net/gepafin/tendermanagement/enums/DocOtherSourceTypeEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/DocOtherSourceTypeEnum.java new file mode 100644 index 00000000..751dfa92 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/DocOtherSourceTypeEnum.java @@ -0,0 +1,17 @@ +package net.gepafin.tendermanagement.enums; + +public enum DocOtherSourceTypeEnum { + USER_SIGNED_DOCUMENT("USER_SIGNED_DOCUMENT"), + USER_DELEGATION("USER_DELEGATION"), + TEMPLATE("TEMPLATE"); + + private String value; + + DocOtherSourceTypeEnum(String value) { + this.value = value; + } + + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/S3ConfigReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/S3ConfigReq.java new file mode 100644 index 00000000..859878de --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/S3ConfigReq.java @@ -0,0 +1,20 @@ +package net.gepafin.tendermanagement.model.request; + +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +public class S3ConfigReq { + @NotNull + private String path; + + @NotNull + private String type; + + @NotNull + private String bucketName; + + @NotNull + private String parentFolder; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/S3ConfigBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/S3ConfigBean.java new file mode 100644 index 00000000..798f8b2c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/S3ConfigBean.java @@ -0,0 +1,11 @@ +package net.gepafin.tendermanagement.model.response; + +import lombok.Data; + +@Data +public class S3ConfigBean { + private String path; + private String type; + private String bucketName; + private String parentFolder; +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index 7b57fcf2..d3ff6d01 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -40,5 +40,6 @@ public interface ApplicationRepository extends JpaRepository findByCompanyIdAndUserIdAndIsDeletedFalse(Long companyId,Long userId); - + @Query("SELECT a.call.id FROM ApplicationEntity a WHERE a.id = :id") + Long findCallIdById(@Param("id") Long id); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationSignedDocumentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationSignedDocumentRepository.java index 35322a6a..b9d2bce3 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationSignedDocumentRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationSignedDocumentRepository.java @@ -1,13 +1,24 @@ package net.gepafin.tendermanagement.repositories; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import net.gepafin.tendermanagement.entities.ApplicationSignedDocumentEntity; +import java.util.List; + @Repository public interface ApplicationSignedDocumentRepository extends JpaRepository { ApplicationSignedDocumentEntity findByApplicationIdAndStatus(Long applicationId, String status); + Long findApplicationIdById(Long id); + + @Query("SELECT a.id FROM ApplicationSignedDocumentEntity d JOIN d.application a WHERE d.id = :id") + List findApplicationIdIdsById(@Param("id") Long id); + + @Query("SELECT d FROM ApplicationSignedDocumentEntity d WHERE d.status = :status") + List findAllByIsStatus(@Param("status")String status); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java index 4f621d38..b7fc2923 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java @@ -25,5 +25,7 @@ public interface DocumentRepository extends JpaRepository Optional findByIdAndSourceIdAndSourceAndIsDeletedFalse(Long id, Long sourceId, String source); + @Query("SELECT d FROM DocumentEntity d WHERE d.isDeleted = false") + List findAllByIsDeleteFalse(); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/S3ConfigRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/S3ConfigRepository.java new file mode 100644 index 00000000..2349861c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/S3ConfigRepository.java @@ -0,0 +1,24 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.S3ConfigEntity; +import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum; +import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface S3ConfigRepository extends JpaRepository { + Optional getPathByType(String type); + + S3ConfigEntity findS3PathConfigurationById(Long id); + + String getBucketNameByType(DocumentSourceTypeEnum type); + + String getBucketNameByType(DocOtherSourceTypeEnum type); + + @Query("Select s3.parentFolder From S3ConfigEntity s3 Where s3.type = :s") + String getPathByTypeOther(String s); +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserCompanyDelegationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserCompanyDelegationRepository.java index 1224dd70..03067c80 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserCompanyDelegationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserCompanyDelegationRepository.java @@ -2,9 +2,15 @@ package net.gepafin.tendermanagement.repositories; import org.springframework.data.jpa.repository.JpaRepository; import net.gepafin.tendermanagement.entities.UserCompanyDelegationEntity; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; public interface UserCompanyDelegationRepository extends JpaRepository { UserCompanyDelegationEntity findByUserIdAndCompanyIdAndStatus(Long userId, Long companyId, String status); + @Query("SELECT d FROM UserCompanyDelegationEntity d where d.status = :status") + List findAllByStatus(@Param("status") String status); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/S3ConfigService.java b/src/main/java/net/gepafin/tendermanagement/service/S3ConfigService.java new file mode 100644 index 00000000..d284e649 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/S3ConfigService.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.service; + +import net.gepafin.tendermanagement.entities.S3ConfigEntity; +import net.gepafin.tendermanagement.model.request.S3ConfigReq; +import net.gepafin.tendermanagement.model.response.S3ConfigBean; +import org.springframework.stereotype.Component; + +import java.util.Optional; + +@Component +public interface S3ConfigService { + S3ConfigBean addS3Path(S3ConfigReq s3Path); + + Optional getS3PathByType(String type); + + S3ConfigEntity deleteS3PathById(Long id); + + S3ConfigBean updateS3PathConfiguration(S3ConfigReq s3PathConfigurationReq, Long id); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java index 3b3fa310..235a1244 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java @@ -34,7 +34,7 @@ public class DocumentServiceImpl implements DocumentService { @Override public DocumentResponseBean updateDocument(HttpServletRequest httpServletRequest, Long documentId, MultipartFile file, DocumentTypeEnum documentTypeEnum) { - return documentDao.updateDocument(documentId,file,documentTypeEnum); + return documentDao.updateDocument(documentId, file,documentTypeEnum); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/S3ConfigServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/S3ConfigServiceImpl.java new file mode 100644 index 00000000..5dfa22de --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/S3ConfigServiceImpl.java @@ -0,0 +1,41 @@ +package net.gepafin.tendermanagement.service.impl; + +import jakarta.transaction.Transactional; +import net.gepafin.tendermanagement.dao.S3ConfigDao; +import net.gepafin.tendermanagement.entities.S3ConfigEntity; +import net.gepafin.tendermanagement.model.request.S3ConfigReq; +import net.gepafin.tendermanagement.model.response.S3ConfigBean; +import net.gepafin.tendermanagement.service.S3ConfigService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Optional; + +@Service +public class S3ConfigServiceImpl implements S3ConfigService { + @Autowired + S3ConfigDao s3ConfigDao; + + @Override + public S3ConfigBean addS3Path(S3ConfigReq s3Path) { + + return s3ConfigDao.addS3Path(s3Path); + } + @Override + public Optional getS3PathByType(String type) { + + return s3ConfigDao.getS3PathByType(type); + } + @Override + @Transactional + public S3ConfigEntity deleteS3PathById(Long id) { + + return s3ConfigDao.deleteS3PathConfigById(id); + } + @Override + @Transactional + public S3ConfigBean updateS3PathConfiguration(S3ConfigReq s3PathConfigurationReq, Long id) { + + return s3ConfigDao.updateS3PathConfiguration(s3PathConfigurationReq, id); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java new file mode 100644 index 00000000..4db4ea12 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/S3ReUploadMigrationService.java @@ -0,0 +1,197 @@ +package net.gepafin.tendermanagement.service.impl; + +import com.amazonaws.AmazonServiceException; +import com.amazonaws.SdkClientException; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.model.GetObjectRequest; +import com.amazonaws.services.s3.model.ObjectMetadata; +import lombok.extern.slf4j.Slf4j; +import net.gepafin.tendermanagement.dao.S3PathConfig; +import net.gepafin.tendermanagement.entities.DocumentEntity; +import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; +import net.gepafin.tendermanagement.repositories.ApplicationRepository; +import net.gepafin.tendermanagement.repositories.ApplicationSignedDocumentRepository; +import net.gepafin.tendermanagement.repositories.DocumentRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + +@Slf4j +@Service +public class S3ReUploadMigrationService { + + private static final String OLD_BUCKET = "mementoresources"; + + private static final String SECURE_KEY = "267163962963"; + + @Autowired + private DocumentRepository documentRepository; + + @Autowired + private AmazonS3Client s3Client; + + @Autowired + private S3PathConfig s3ConfigBean; + + @Autowired + private ApplicationRepository applicationRepository; + + @Autowired + private ApplicationSignedDocumentRepository applicationSignedDocumentRepository; + + @Autowired + private AmazonS3 amazonS3; + + @Value("${aws.s3.url}") + private String s3Url; + + private boolean migrationCompleted = false; + + public String reUploadAndMigrateDocuments(String providedKey) { + + if (migrationCompleted) { + return "Migration already completed."; + } + + // Validate the provided key + if (!isValidKey(providedKey)) { + return "Invalid or missing migration key."; + } + + List documents = documentRepository.findAllByIsDeleteFalse(); + + if (documents.isEmpty()) { + return "No documents found to migrate."; + } + + for (DocumentEntity document : documents) { + String oldUrl = document.getFilePath(); // This should contain the full URL + log.info("Processing {}", oldUrl); + + try { + File localFile = downloadFileFromS3(oldUrl); + String newKey = generateNewS3Path(document); // Make sure this generates the correct new path + String uploadedPath = uploadFileToNewBucket(localFile, newKey); + updateDocumentPathAndDeleteOldEntry(document, uploadedPath); + } catch (Exception e) { + log.error("Error processing document {}: {}", document.getId(), e.getMessage()); + } + } + return "Migrated Successfully."; + } + + private boolean isValidKey(String providedKey) { + + return providedKey != null && providedKey.equals(SECURE_KEY); + } + + private File downloadFileFromS3(String fileUrl) throws Exception { + + String key = extractS3KeyFromUrl(fileUrl); // Get the S3 key from the URL + File localFile = new File("/tmp/" + extractFileName(key)); // Save file locally + + GetObjectRequest getObjectRequest = new GetObjectRequest(OLD_BUCKET, key); // Use the key + + try (InputStream s3Stream = s3Client.getObject(getObjectRequest).getObjectContent(); FileOutputStream outputStream = new FileOutputStream(localFile)) { + s3Stream.transferTo(outputStream); + } + + log.info("Downloaded file from old S3 bucket: {}", key); + return localFile; + } + + private String extractS3KeyFromUrl(String url) { + // Assuming the URL structure is consistent + return url.replace("https://mementoresources.s3.eu-west-1.amazonaws.com/", ""); + } + + private String uploadFileToNewBucket(File localFile, String s3Folder) { + + InputStream inputStream = null; // Declare the InputStream here for cleanup + try { + // Extract file name from the local file + String fileName = extractFileName(localFile.getAbsolutePath()); // Get the file name + String path = s3Folder + "/" + fileName; // Construct the S3 path + + // Create InputStream from the local file + inputStream = new FileInputStream(localFile); + + // Set up object metadata + ObjectMetadata objectMetadata = new ObjectMetadata(); + objectMetadata.setContentType("application/octet-stream"); + objectMetadata.setContentLength(localFile.length()); + + // Upload to S3 + s3Client.putObject(OLD_BUCKET, path, inputStream, objectMetadata); + + // Construct the full S3 URL + String fullUrl = String.format("https://%s.s3.%s.amazonaws.com/%s", OLD_BUCKET, "eu-west-1", path); + log.info("File '{}' uploaded successfully to Amazon S3 with URL: {}", fileName, fullUrl); + return fullUrl; + + } catch (IOException e) { + log.error("IOException occurred during file upload for '{}': {}", localFile.getName(), e.getMessage()); + throw new RuntimeException("Upload failed for: " + s3Folder + "/" + localFile.getName(), e); + } catch (AmazonServiceException e) { + log.error("Amazon service exception while uploading file '{}': {}", localFile.getName(), e.getMessage()); + throw new RuntimeException("Upload failed for: " + s3Folder + "/" + localFile.getName(), e); + } catch (SdkClientException e) { + log.error("SDK client exception while uploading file '{}': {}", localFile.getName(), e.getMessage()); + throw new RuntimeException("Upload failed for: " + s3Folder + "/" + localFile.getName(), e); + } finally { + // Close InputStream if it was opened + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + log.warn("Failed to close InputStream for file '{}': {}", localFile.getName(), e.getMessage()); + } + } + } + } + + private String generateNewS3Path(DocumentEntity document) { + + DocumentSourceTypeEnum sourceType = DocumentSourceTypeEnum.valueOf(document.getSource()); + Long callId; + + if (sourceType.equals(DocumentSourceTypeEnum.CALL)) { + return s3ConfigBean.generateDocumentPath(sourceType, document.getSourceId(), 0L); + } else { + callId = applicationRepository.findCallIdById(document.getSourceId()); + return s3ConfigBean.generateDocumentPath(sourceType, callId, document.getSourceId()); + } + } + + private String extractFileName(String filePath) { + + String[] parts = filePath.split("/"); + return parts[parts.length - 1]; + } + + + private void updateDocumentPathAndDeleteOldEntry(DocumentEntity document, String newPath) { + + String fileName = extractFileName(newPath); + DocumentEntity newDocument = new DocumentEntity(); + newDocument.setFilePath(newPath); + newDocument.setSource(document.getSource()); + newDocument.setType(document.getType()); + newDocument.setIsDeleted(false); + newDocument.setSourceId(document.getSourceId()); + newDocument.setFileName(fileName); + + documentRepository.save(newDocument); + documentRepository.delete(document); + + log.info("Migrated document ID: {} to new path: {}", document.getId(), newPath); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java new file mode 100644 index 00000000..c1228565 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserSignedAndDelegationServiceImpl.java @@ -0,0 +1,261 @@ +package net.gepafin.tendermanagement.service.impl; + +import com.amazonaws.AmazonServiceException; +import com.amazonaws.SdkClientException; +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.model.GetObjectRequest; +import com.amazonaws.services.s3.model.ObjectMetadata; +import lombok.extern.slf4j.Slf4j; +import net.gepafin.tendermanagement.dao.S3PathConfig; +import net.gepafin.tendermanagement.entities.ApplicationSignedDocumentEntity; +import net.gepafin.tendermanagement.entities.UserCompanyDelegationEntity; +import net.gepafin.tendermanagement.enums.DocOtherSourceTypeEnum; +import net.gepafin.tendermanagement.repositories.ApplicationRepository; +import net.gepafin.tendermanagement.repositories.ApplicationSignedDocumentRepository; +import net.gepafin.tendermanagement.repositories.S3ConfigRepository; +import net.gepafin.tendermanagement.repositories.UserCompanyDelegationRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@Service +public class UserSignedAndDelegationServiceImpl { + private static final String OLD_BUCKET = "mementoresources"; + + private static final String NEW_BUCKET = "mementoresources"; + + private static final String SECURE_KEY = "267163962963"; + + @Autowired + private UserCompanyDelegationRepository userCompanyDelegationRepository; + + @Autowired + private AmazonS3Client s3Client; + + @Autowired + private S3PathConfig s3ConfigBean; + + @Autowired + private ApplicationSignedDocumentRepository applicationSignedDocumentRepository; + + @Autowired + ApplicationRepository applicationRepository; + + @Autowired + S3ConfigRepository s3ConfigRepository; + + @Value("${aws.s3.url}") + private String s3Url; + + private boolean migrationCompleted = false; + + + public String migrateUserDelegatedDocuments(String providedKey) { + + if (migrationCompleted) { + return "Migration already completed."; + } + + // Validate the provided key + if (isValidKey(providedKey)) { + return "Invalid or missing migration key."; + } + + List documents = userCompanyDelegationRepository.findAllByStatus("ACTIVE"); + + if (documents.isEmpty()) { + return "No documents found to migrate."; + } + + for (UserCompanyDelegationEntity document : documents) { + String oldUrl = document.getFilePath(); + log.info("Processing user designated document: {}", oldUrl); + + try { + File localFile = downloadFileFromS3(oldUrl); + String newKey = generateNewS3PathForDelegationDoc(); + String uploadedPath = uploadFileToNewBucket(localFile, newKey); + updateDelegatedDocumentPathAndDeleteOldEntry(document, uploadedPath); + } catch (Exception e) { + log.error("Error processing user designated document {}: {}", document.getId(), e.getMessage()); + } + } + return "Migrated"; + } + + + public String migrateUserSignedDocuments(String providedKey) { + + if (migrationCompleted) { + return "Migration already completed."; + } + + // Validate the provided key + if (isValidKey(providedKey)) { + return "Invalid or missing migration key."; + } + List documents = applicationSignedDocumentRepository.findAllByIsStatus("ACTIVE"); + + if (documents.isEmpty()) { + return "No documents found to migrate."; + } + + for (ApplicationSignedDocumentEntity document : documents) { + String oldUrl = document.getFilePath(); + log.info("Processing user signed document: {}", oldUrl); + + try { + File localFile = downloadFileFromS3(oldUrl); + String newKey = generateNewS3PathForUserSignedDoc(document); + String uploadedPath = uploadFileToNewBucket(localFile, newKey); + updateDocumentPathAndDeleteOldEntry(document, uploadedPath); + } catch (Exception e) { + log.error("Error processing user signed document {}: {}", document.getId(), e.getMessage()); + } + } + return "Migrated."; + } + + private boolean isValidKey(String providedKey) { + + return providedKey == null || !providedKey.equals(SECURE_KEY); + } + + private String generateNewS3PathForDelegationDoc() { + + return s3ConfigBean.generateDocumentPathForOther(DocOtherSourceTypeEnum.USER_DELEGATION, 0L, 0L); + } + + private String generateNewS3PathForUserSignedDoc(ApplicationSignedDocumentEntity document) { + // Fetch the list of application IDs associated with the document + List applicationIds = applicationSignedDocumentRepository.findApplicationIdIdsById(document.getId()); + List paths = new ArrayList<>(); + + // Loop through the application IDs and generate paths + for (Long applicationId : applicationIds) { + Long callId = applicationRepository.findCallIdById(applicationId); + + // Construct the path for the current application and call ID + String newPath = String.format("%s/call/call_%d/application/application_%d/user_signed_document", s3ConfigRepository.getPathByTypeOther( + String.valueOf(DocOtherSourceTypeEnum.USER_SIGNED_DOCUMENT)) , callId, applicationId); + + log.info("Generated new S3 path: {}", newPath); + paths.add(newPath); + } + + return String.join(",", paths); + } + + private File downloadFileFromS3(String fileUrl) throws Exception { + + String key = extractS3KeyFromUrl(fileUrl); + File localFile = new File("/tmp/" + extractFileName(key)); + + GetObjectRequest getObjectRequest = new GetObjectRequest(OLD_BUCKET, key); + + try (InputStream s3Stream = s3Client.getObject(getObjectRequest).getObjectContent(); FileOutputStream outputStream = new FileOutputStream(localFile)) { + s3Stream.transferTo(outputStream); + } + + log.info("Downloaded file from old S3 bucket: {}", key); + return localFile; + } + + private String extractS3KeyFromUrl(String url) { + + return url.replace("https://mementoresources.s3.eu-west-1.amazonaws.com/", ""); + } + + private String uploadFileToNewBucket(File localFile, String s3Path) { + + InputStream inputStream = null; + try { + String fileName = extractFileName(localFile.getAbsolutePath()); // Extract file name + String fullPath = String.format("%s/%s", s3Path, fileName); // Construct full path + + inputStream = new FileInputStream(localFile); // Create InputStream + + // Set metadata for the file + ObjectMetadata objectMetadata = new ObjectMetadata(); + objectMetadata.setContentLength(localFile.length()); + objectMetadata.setContentType("application/octet-stream"); + + // Upload the file to S3 with the constructed path + s3Client.putObject(NEW_BUCKET, fullPath, inputStream, objectMetadata); + + // Construct the full S3 URL for the uploaded file + String fullUrl = String.format("https://%s.s3.%s.amazonaws.com/%s", NEW_BUCKET, "eu-west-1", fullPath); + log.info("File '{}' uploaded successfully to Amazon S3 with URL: {}", fileName, fullUrl); + return fullUrl; + + } catch (IOException e) { + log.error("IOException occurred during file upload for '{}': {}", localFile.getName(), e.getMessage()); + throw new RuntimeException("Upload failed for: " + localFile, e); + } catch (AmazonServiceException e) { + log.error("Amazon service exception while uploading file '{}': {}", localFile.getName(), e.getMessage()); + throw new RuntimeException("Upload failed for: " + localFile, e); + } catch (SdkClientException e) { + log.error("SDK client exception while uploading file '{}': {}", localFile.getName(), e.getMessage()); + throw new RuntimeException("Upload failed for: " + localFile, e); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + log.warn("Failed to close InputStream for file '{}': {}", localFile.getName(), e.getMessage()); + } + } + } + } + + private String extractFileName(String filePath) { + + String[] parts = filePath.split("/"); + return parts[parts.length - 1]; + } + private String extractFileNameFromPath(String path) { + + return path.substring(path.lastIndexOf('/') + 1); + } + + private void updateDocumentPathAndDeleteOldEntry(ApplicationSignedDocumentEntity document, String newPath) { + + ApplicationSignedDocumentEntity newDocument = new ApplicationSignedDocumentEntity(); + String fileName = extractFileNameFromPath(newPath); + newDocument.setFilePath(newPath); + newDocument.setFileName(fileName); + newDocument.setApplication(document.getApplication()); + newDocument.setStatus("ACTIVE"); + + applicationSignedDocumentRepository.save(newDocument); + applicationSignedDocumentRepository.delete(document); + + log.info("Migrated document ID: {} to new path: {}", document.getId(), newPath); + } + + private void updateDelegatedDocumentPathAndDeleteOldEntry(UserCompanyDelegationEntity document, String newPath) { + + String fileName = extractFileNameFromPath(newPath); + UserCompanyDelegationEntity newDocument = new UserCompanyDelegationEntity(); + newDocument.setFilePath(newPath); + newDocument.setFileName(fileName); + newDocument.setBeneficiaryId(document.getBeneficiaryId()); + newDocument.setUserId(document.getUserId()); + newDocument.setCompanyId(document.getCompanyId()); + newDocument.setStatus("ACTIVE"); + + userCompanyDelegationRepository.save(newDocument); + userCompanyDelegationRepository.delete(document); + + log.info("Migrated document ID: {} to new path: {}", document.getId(), newPath); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/S3ConfigApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/S3ConfigApi.java new file mode 100644 index 00000000..61b3bd6c --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/S3ConfigApi.java @@ -0,0 +1,67 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.entities.S3ConfigEntity; +import net.gepafin.tendermanagement.model.request.S3ConfigReq; +import net.gepafin.tendermanagement.model.response.S3ConfigBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.data.repository.query.Param; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.Optional; + +@Validated +public interface S3ConfigApi { + + @Operation(summary = "Api to create S3Path structure.", 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 = "", produces = { "application/json" }) + ResponseEntity> addS3Path(@Valid @RequestBody S3ConfigReq s3pathReq); + + @Operation(summary = "Api to get S3Path structure. by type", 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) })) }) + @GetMapping(value = "", produces = { "application/json" }) + ResponseEntity>> getS3PathByType(@Valid @Param(value = "type") String type); + + @Operation(summary = "Api to delete S3Path structure. by id", 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) })) }) + @DeleteMapping(value = "", produces = { "application/json" }) + ResponseEntity> deleteS3PathConfigById(@Valid @Param(value = "id") Long id); + + @Operation(summary = "Api to update S3Path structure. by id", 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) })) }) + @PutMapping(value = "", produces = { "application/json" }) + ResponseEntity> updateS3PathConfigById(@Valid @RequestBody S3ConfigReq s3PathConfigurationReq, @Param(value = "id") Long id); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/S3MigrationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/S3MigrationApi.java new file mode 100644 index 00000000..4a4d3eb1 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/S3MigrationApi.java @@ -0,0 +1,28 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.data.repository.query.Param; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; + +@Validated +public interface S3MigrationApi { + + @Operation(summary = "Api to migrate S3 doc to db and update s3 files as per specified folder.", 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) })) }) + @PutMapping(value = "/{key}", produces = { "application/json" }) + String reUploadAndMigrateDocuments(@Parameter(description = "The secret key", required = true) @PathVariable("key") String key); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserSignedAndDelegationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserSignedAndDelegationApi.java new file mode 100644 index 00000000..2a3978a1 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserSignedAndDelegationApi.java @@ -0,0 +1,38 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.data.repository.query.Param; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; + +@Validated +public interface UserSignedAndDelegationApi { + @Operation(summary = "Api to migrate S3 doc to db and user-delegated folder", 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) })) }) + @GetMapping(value = "/{key}", produces = { "application/json" }) + String migrateUserDelegatedDocuments(@Parameter(description = "The secret key", required = true) @PathVariable("key") String key); + + @Operation(summary = "Api to migrate S3 doc to user-signed.", 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 = "/{key}", produces = { "application/json" }) + String migrateUserSignedDocuments(@Parameter(description = "The secret key", required = true) @PathVariable("key") String key); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java index 7141a256..34caa9fd 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/DocumentApiController.java @@ -31,7 +31,7 @@ DocumentApiController implements DocumentApi { public ResponseEntity>> uploadFile(HttpServletRequest httpServletRequest, Long sourceId, DocumentSourceTypeEnum sourceType, List files, DocumentTypeEnum fileType) { try { - List responseBeans = documentService.uploadFile(files, sourceId,sourceType, fileType); + List responseBeans = documentService.uploadFile(files, sourceId, sourceType, fileType); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response>(responseBeans, Status.SUCCESS, Translator.toLocale(GepafinConstant.FILES_UPLOADED_MSG))); } catch (CustomValidationException ex) { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3ConfigController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3ConfigController.java new file mode 100644 index 00000000..62f12414 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3ConfigController.java @@ -0,0 +1,59 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.S3ConfigEntity; +import net.gepafin.tendermanagement.model.request.S3ConfigReq; +import net.gepafin.tendermanagement.model.response.S3ConfigBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.S3ConfigService; +import net.gepafin.tendermanagement.web.rest.api.S3ConfigApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Optional; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/s3-path-config}") +public class S3ConfigController implements S3ConfigApi { + + private static final Logger log = LoggerFactory.getLogger(S3ConfigController.class); + + @Autowired + S3ConfigService s3PathService; + + @Override + public ResponseEntity> addS3Path(S3ConfigReq s3pathReq) { + + log.info("Request Body : {}, {}, {}", s3pathReq.getPath(), s3pathReq.getType(), s3pathReq.getBucketName()); + S3ConfigBean s3Path = s3PathService.addS3Path(s3pathReq); + return ResponseEntity.status(HttpStatus.CREATED).body(new Response(s3Path, Status.SUCCESS, Translator.toLocale(GepafinConstant.ADDED_S3_PATH_STRUCTURE))); + } + @Override + public ResponseEntity>> getS3PathByType(String type) { + + log.info("Request to get S3Path by type {}", type); + Optional s3Path = s3PathService.getS3PathByType(type); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response>(s3Path, Status.SUCCESS, Translator.toLocale(GepafinConstant.S3_PATH_STRUCTURE_BY_TYPE))); + } + @Override + public ResponseEntity> deleteS3PathConfigById(Long id) { + log.info("Request to delete S3Path by Id {}", id); + S3ConfigEntity deletedS3PathConfig = s3PathService.deleteS3PathById(id); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response(deletedS3PathConfig, Status.SUCCESS, Translator.toLocale(GepafinConstant.S3_PATH_DELETE_MSG))); + } + @Override + public ResponseEntity> updateS3PathConfigById(S3ConfigReq s3PathConfigurationReq, Long id) { + S3ConfigBean updatedS3PathConfiguration = s3PathService.updateS3PathConfiguration(s3PathConfigurationReq, id); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response(updatedS3PathConfiguration, Status.SUCCESS, Translator.toLocale(GepafinConstant.S3_PATH_CONFIG_UPDATE_MSG))); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3MigrationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3MigrationApiController.java new file mode 100644 index 00000000..7e58800e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3MigrationApiController.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import net.gepafin.tendermanagement.service.impl.S3ReUploadMigrationService; +import net.gepafin.tendermanagement.web.rest.api.S3MigrationApi; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/s3-migration}") +public class S3MigrationApiController implements S3MigrationApi { + + @Autowired + S3ReUploadMigrationService s3MigrationService; + @Override + public String reUploadAndMigrateDocuments(String providedKey) { + return s3MigrationService.reUploadAndMigrateDocuments(providedKey); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3UserSignedAndDelegationMigrationController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3UserSignedAndDelegationMigrationController.java new file mode 100644 index 00000000..061b731b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/S3UserSignedAndDelegationMigrationController.java @@ -0,0 +1,24 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import net.gepafin.tendermanagement.service.impl.UserSignedAndDelegationServiceImpl; +import net.gepafin.tendermanagement.web.rest.api.UserSignedAndDelegationApi; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/s3-user-signed-and-delegation-migration}") +public class S3UserSignedAndDelegationMigrationController implements UserSignedAndDelegationApi { + + @Autowired + UserSignedAndDelegationServiceImpl userSignedAndDelegationService; + + @Override + public String migrateUserDelegatedDocuments(String providedKey) { + return userSignedAndDelegationService.migrateUserDelegatedDocuments(providedKey); + } + @Override + public String migrateUserSignedDocuments(String providedKey) { + return userSignedAndDelegationService.migrateUserSignedDocuments(providedKey); + } +} diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 5df3a2b7..06d8550a 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -67,7 +67,7 @@ - + @@ -83,7 +83,7 @@ - + @@ -101,18 +101,18 @@ - - + + - - + + - - + + @@ -122,19 +122,19 @@ - + - + - + - + - + @@ -250,7 +250,8 @@ - + + @@ -270,34 +271,39 @@ - + + - + - + - + + + - - - + + - + @@ -318,7 +324,8 @@ - + @@ -329,7 +336,8 @@ - + @@ -340,7 +348,8 @@ - + @@ -351,7 +360,8 @@ - + @@ -416,7 +426,8 @@ - + + @@ -432,7 +443,8 @@ - + + @@ -454,50 +466,50 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -507,62 +519,62 @@ + path="db/dump/inserted_form_field_data_30_08_2024.sql"/> select setval('gepafin_schema.form_field_id_seq', (select max(id)+1 from gepafin_schema.form_field), false) - - - - - - - - - - + + + + + + + + + + + references="lookup_data(id)"/> - - - - + + + + TRUNCATE TABLE FORM_FIELD RESTART IDENTITY; + path="db/dump/update_form_field_data_04_09_2024.sql"/> - - - - - - - - - - - - - - + + + + + + + + + + + + + + @@ -586,23 +598,26 @@ - + + - + - + - + - + + @@ -618,9 +633,10 @@ - + + - + @@ -634,12 +650,13 @@ - + + - + - + @@ -658,18 +675,20 @@ - + - + + - + @@ -693,7 +712,7 @@ TRUNCATE TABLE FORM_FIELD RESTART IDENTITY; + path="classpath:db/dump/inserted_form_field_data_13_09_2024.sql"/> @@ -708,7 +727,7 @@ + path="classpath:db/dump/updated_form_field_data_16-09-2024.sql"/> @@ -739,16 +758,16 @@ $$; - - - - - - - - - - + + + + + + + + + + @@ -783,99 +802,99 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - + - + id = 13 - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - + + + + - - + + - + - + @@ -890,25 +909,25 @@ - + - - - + + + - - - - + + + + - + - + @@ -924,8 +943,8 @@ - - + + @@ -934,48 +953,48 @@ + path="classpath:db/dump/updated_form_field_data_03-10-2024.sql"/> - + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -983,7 +1002,7 @@ + path="classpath:db/dump/updated_form_field_data_03-10-2024_1.sql"/> @@ -994,8 +1013,8 @@ - - + + @@ -1003,16 +1022,16 @@ - - + + + primaryKeyName="protocol_pkey"/> @@ -1058,132 +1077,132 @@ - - - - + + + + + primaryKeyName="system_email_template_pkey"/> - - - - - - - - - - + + + + + + + + + + - - - - - + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - + - - - - - name='table' - - + + + + + name='table' + + + path="db/dump/update_system_email_template_of_application_submission.sql"/> - + + primaryKeyName="login_attempt_pkey"/> - - + + - - + + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - + - + + primaryKeyName="criteria_form_field_pkey"/> - - - - + + + + - - - - + + + + - + @@ -1226,9 +1245,10 @@ - + - + @@ -1244,47 +1264,44 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - @@ -1293,12 +1310,12 @@ - + - - + + @@ -1315,17 +1332,90 @@ - + - + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +