From f2a206991fe37ef063890e74544f4948cb12961a Mon Sep 17 00:00:00 2001 From: harish Date: Wed, 25 Sep 2024 17:37:34 +0530 Subject: [PATCH 1/6] 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 998c2ba01f729d4a91f1dfd7b19663a05fa57a72 Mon Sep 17 00:00:00 2001 From: harish Date: Sun, 20 Oct 2024 02:37:53 +0530 Subject: [PATCH 2/6] 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 3/6] 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 4/6] 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 5/6] 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 6/6] 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))); }