From ee809593290ac6c507fa899ed2a318ee2b7d1103 Mon Sep 17 00:00:00 2001 From: rajesh Date: Fri, 27 Sep 2024 16:44:39 +0530 Subject: [PATCH 1/3] Created beneficiary and associated with user --- .../tendermanagement/config/SamlConfig.java | 4 +- .../config/SamlSuccessHandler.java | 2 +- .../gepafin/tendermanagement/dao/UserDao.java | 143 +++++++++++------- .../entities/BeneficiaryEntity.java | 47 ++++++ .../tendermanagement/entities/UserEntity.java | 7 +- .../repositories/BeneficiaryRepository.java | 11 ++ .../repositories/UserRepository.java | 6 +- .../service/impl/AuthenticationService.java | 46 +++--- .../tendermanagement/util/Validator.java | 2 +- .../db/changelog/db.changelog-1.0.0.xml | 32 ++++ 10 files changed, 223 insertions(+), 77 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/BeneficiaryRepository.java diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java index 02a0ae27..67fd71e0 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java @@ -133,8 +133,8 @@ public Saml2AuthenticationRequestResolver authenticationRequestResolver(RelyingP authnRequest.setRequestedAuthnContext(buildRequestedAuthnContext()); // Log the SAML AuthnRequest after setting context - String samlRequest = SamlRequestLogger.convertSAMLObjectToString(authnRequest); - logger.info("SAML AuthnRequest after setting context: " + samlRequest); +// String samlRequest = SamlRequestLogger.convertSAMLObjectToString(authnRequest); + logger.info("SAML Authentication Request."); }); return authenticationRequestResolver; diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java index a8af08a7..37aec12f 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java @@ -65,7 +65,7 @@ public class SamlSuccessHandler implements AuthenticationSuccessHandler { logger.info("SAML login successful for user: " + principal.getName()); String cf = userAttributes.get("CodiceFiscale").get(0).toString(); - UserEntity userEntity = userRepository.findByCodiceFiscale(cf).orElse(null); + UserEntity userEntity = userRepository.findByBeneficiaryCodiceFiscale(cf).orElse(null); if (userEntity == null) { redirectUrl += "/registration?temp_token=" + token; } else { diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 252c88f7..aa6e5cfc 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -4,6 +4,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.BeneficiaryEntity; import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.RoleStatusEnum; @@ -13,6 +14,7 @@ import net.gepafin.tendermanagement.model.response.RoleResponseBean; import net.gepafin.tendermanagement.model.response.UserSamlResponse; import net.gepafin.tendermanagement.model.response.UserResponseBean; import net.gepafin.tendermanagement.model.util.JWTToken; +import net.gepafin.tendermanagement.repositories.BeneficiaryRepository; import net.gepafin.tendermanagement.repositories.UserRepository; import net.gepafin.tendermanagement.service.impl.AuthenticationService; import net.gepafin.tendermanagement.util.Utils; @@ -47,9 +49,41 @@ public class UserDao { @Autowired private RoleDao roleDao; + + @Autowired + private BeneficiaryRepository beneficiaryRepository; + public JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq) { - + validateUserRequest(tempToken, userReq); + validatePassword(userReq.getPassword(), userReq.getConfPassword(), tempToken); + + RoleEntity roleEntity = getRoleEntity(userReq.getRoleId()); + BeneficiaryEntity beneficiary = createBeneficiary(roleEntity, userReq); + UserEntity userEntity = convertUserRequestToUserEntity(beneficiary, roleEntity, userReq); + log.info("User created with ID: {}", userEntity.getId()); + return authService.getJWTTokenBean(userEntity, Boolean.TRUE); + } + + private BeneficiaryEntity createBeneficiary(RoleEntity roleEntity, UserReq userReq) { + BeneficiaryEntity beneficiaryEntity = null; + if (RoleStatusEnum.ROLE_BENEFICIARY.getValue().equals(roleEntity.getRoleType())) { + beneficiaryEntity = new BeneficiaryEntity(); + beneficiaryEntity.setAddress(userReq.getAddress()); + beneficiaryEntity.setCity(userReq.getCity()); + beneficiaryEntity.setCodiceFiscale(userReq.getCodiceFiscale()); + beneficiaryEntity.setCountry(userReq.getCountry()); + beneficiaryEntity.setDateOfBirth(userReq.getDateOfBirth()); + beneficiaryEntity.setEmail(userReq.getEmail()); + beneficiaryEntity.setFirstName(userReq.getFirstName()); + beneficiaryEntity.setLastName(userReq.getLastName()); + beneficiaryEntity.setOrganization(userReq.getOrganization()); + beneficiaryEntity.setPhoneNumber(userReq.getPhoneNumber()); + } + return beneficiaryRepository.save(beneficiaryEntity); + } + + private void validateUserRequest(String tempToken, UserReq userReq) { if (Boolean.FALSE.equals(isValidEmail(userReq.getEmail()))) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.VALIDATE_EMAIL)); @@ -61,27 +95,21 @@ public class UserDao { Translator.toLocale(GepafinConstant.EMAIL_ALREADY_EXISTS)); } if (Boolean.FALSE.equals(StringUtils.isEmpty(userReq.getCodiceFiscale())) - && userRepository.existsByCodiceFiscale(userReq.getCodiceFiscale())) { + && userRepository.existsByBeneficiaryCodiceFiscale(userReq.getCodiceFiscale())) { log.error("User creation failed: CodiceFiscale {} already exists", userReq.getCodiceFiscale()); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CODICE_FISCALE_EXISTS)); } if (tempToken == null && userReq.getRoleId() == null) { - throw new ResourceNotFoundException(Status.VALIDATION_ERROR, - Translator.toLocale(GepafinConstant.ROLE_ID_MANDATORY)); + throw new ResourceNotFoundException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.ROLE_ID_MANDATORY)); } - if(tempToken != null) { - userReq.setRoleId(null); + if (tempToken != null) { + userReq.setRoleId(null); } - validatePassword(userReq.getPassword(), userReq.getConfPassword(), tempToken); - - UserEntity userEntity = convertUserRequestToUserEntity(userReq); - userEntity = userRepository.save(userEntity); - log.info("User created with ID: {}", userEntity.getId()); - return authService.getJWTTokenBean(userEntity, Boolean.TRUE); - } - - private void validatePassword(String password, String confirmPassword, String tempToken) { + } + + private void validatePassword(String password, String confirmPassword, String tempToken) { if (StringUtils.isEmpty(password) || StringUtils.isEmpty(confirmPassword)) { if(tempToken == null) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.VALIDATE_PASSWORD)); @@ -124,22 +152,24 @@ public class UserDao { return convertUserEntityToUserResponse(userEntity); } - private UserEntity convertUserRequestToUserEntity(UserReq userReq) { + private UserEntity convertUserRequestToUserEntity(BeneficiaryEntity beneficiary, RoleEntity roleEntity, UserReq userReq) { UserEntity userEntity = new UserEntity(); if(Boolean.FALSE.equals(StringUtils.isEmpty(userReq.getPassword()))) { userEntity.setPassword(passwordEncoder.encode(userReq.getPassword())); } + userEntity.setRoleEntity(roleEntity); userEntity.setEmail(userReq.getEmail()); - userEntity.setFirstName(userReq.getFirstName()); userEntity.setStatus(UserStatusEnum.ACTIVE.getValue()); - userEntity.setLastName(userReq.getLastName()); - userEntity.setOrganization(userReq.getOrganization()); - userEntity.setAddress(userReq.getAddress()); - userEntity.setPhoneNumber(userReq.getPhoneNumber()); - userEntity.setRoleEntity(getRoleEntity(userReq.getRoleId())); - userEntity.setCodiceFiscale(userReq.getCodiceFiscale()); - userEntity.setDateOfBirth(userReq.getDateOfBirth()); - return userEntity; + userEntity.setBeneficiary(beneficiary); + if (Boolean.FALSE.equals(RoleStatusEnum.ROLE_BENEFICIARY.getValue().equals(roleEntity.getRoleType()))) { + userEntity.setFirstName(userReq.getFirstName()); + userEntity.setLastName(userReq.getLastName()); + userEntity.setOrganization(userReq.getOrganization()); + userEntity.setAddress(userReq.getAddress()); + userEntity.setPhoneNumber(userReq.getPhoneNumber()); + userEntity.setDateOfBirth(userReq.getDateOfBirth()); + } + return userRepository.save(userEntity); } private RoleEntity getRoleEntity(Long roleId) { @@ -151,37 +181,48 @@ public class UserDao { } private UserResponseBean convertUserEntityToUserResponse(UserEntity userEntity) { - UserResponseBean userResponseBean = new UserResponseBean(); - userResponseBean.setId(userEntity.getId()); - userResponseBean.setCreatedDate(userEntity.getCreatedDate()); - userResponseBean.setUpdatedDate(userEntity.getUpdatedDate()); - userResponseBean.setEmail(userEntity.getEmail()); - userResponseBean.setFirstName(userEntity.getFirstName()); - userResponseBean.setLastName(userEntity.getLastName()); - userResponseBean.setPhoneNumber(userEntity.getPhoneNumber()); - userResponseBean.setOrganization(userEntity.getOrganization()); - userResponseBean.setAddress(userEntity.getAddress()); - userResponseBean.setCity(userEntity.getCity()); - userResponseBean.setCountry(userEntity.getCountry()); - userResponseBean.setStatus(UserStatusEnum.valueOf(userEntity.getStatus())); - RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(userEntity.getRoleEntity()); - userResponseBean.setRole(roleResponseBean); - userResponseBean.setLastLogin(userEntity.getLastLogin()); - userResponseBean.setCodiceFiscale(userEntity.getCodiceFiscale()); - userResponseBean.setDateOfBirth(userEntity.getDateOfBirth()); - return userResponseBean; - } + UserResponseBean userResponseBean = new UserResponseBean(); + userResponseBean.setId(userEntity.getId()); + userResponseBean.setCreatedDate(userEntity.getCreatedDate()); + userResponseBean.setUpdatedDate(userEntity.getUpdatedDate()); + userResponseBean.setEmail(userEntity.getEmail()); + userResponseBean.setStatus(UserStatusEnum.valueOf(userEntity.getStatus())); + RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(userEntity.getRoleEntity()); + userResponseBean.setRole(roleResponseBean); + userResponseBean.setLastLogin(userEntity.getLastLogin()); + if (userEntity.getBeneficiary() == null) { + userResponseBean.setFirstName(userEntity.getFirstName()); + userResponseBean.setLastName(userEntity.getLastName()); + userResponseBean.setPhoneNumber(userEntity.getPhoneNumber()); + userResponseBean.setOrganization(userEntity.getOrganization()); + userResponseBean.setAddress(userEntity.getAddress()); + userResponseBean.setCity(userEntity.getCity()); + userResponseBean.setCountry(userEntity.getCountry()); + userResponseBean.setDateOfBirth(userEntity.getDateOfBirth()); + } else { + userResponseBean.setFirstName(userEntity.getBeneficiary().getFirstName()); + userResponseBean.setLastName(userEntity.getBeneficiary().getLastName()); + userResponseBean.setPhoneNumber(userEntity.getBeneficiary().getPhoneNumber()); + userResponseBean.setOrganization(userEntity.getBeneficiary().getOrganization()); + userResponseBean.setAddress(userEntity.getBeneficiary().getAddress()); + userResponseBean.setCity(userEntity.getBeneficiary().getCity()); + userResponseBean.setCountry(userEntity.getBeneficiary().getCountry()); + userResponseBean.setCodiceFiscale(userEntity.getBeneficiary().getCodiceFiscale()); + userResponseBean.setDateOfBirth(userEntity.getBeneficiary().getDateOfBirth()); + } + return userResponseBean; + } - public UserResponseBean getUserById(Long id) { - log.info("Fetching user with ID: {}", id); - UserEntity userEntity=validateUser(id); + public UserResponseBean getUserById(Long id) { + log.info("Fetching user with ID: {}", id); + UserEntity userEntity = validateUser(id); // if (!UserStatusEnum.ACTIVE.getValue().equals(userEntity.getStatus())) { // log.info("User with ID: {} is not active", id); // throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); // } - log.info("User found: {}", userEntity); - return convertUserEntityToUserResponse(userEntity); - } + log.info("User found: {}", userEntity); + return convertUserEntityToUserResponse(userEntity); + } public void deleteUser(Long id) { log.info("Deleting user with ID: {}", id); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java new file mode 100644 index 00000000..c0f31927 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java @@ -0,0 +1,47 @@ +package net.gepafin.tendermanagement.entities; + +import java.time.LocalDateTime; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import jakarta.validation.constraints.Email; +import lombok.Data; + +@Entity +@Table(name = "beneficiary") +@Data +public class BeneficiaryEntity extends BaseEntity { + + @Email + @Column(name = "EMAIL") + private String email; + + @Column(name = "FIRST_NAME") + private String firstName; + + @Column(name = "LAST_NAME") + private String lastName; + + @Column(name = "PHONE_NUMBER") + private String phoneNumber; + + @Column(name = "ORGANIZATION") + private String organization; + + @Column(name = "ADDRESS") + private String address; + + @Column(name = "CITY") + private String city; + + @Column(name = "COUNTRY") + private String country; + + @Column(name = "CODICE_FISCALE") + private String codiceFiscale; + + @Column(name = "DATE_OF_BIRTH") + private LocalDateTime dateOfBirth; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java index 37b0ab57..f8d34ea2 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java @@ -59,9 +59,10 @@ public class UserEntity extends BaseEntity { @Column(name = "RESET_PASSWORD_TOKEN", length = 255, nullable = true) private String resetPasswordToken; - @Column(name = "CODICE_FISCALE") - private String codiceFiscale; - @Column(name = "DATE_OF_BIRTH") private LocalDateTime dateOfBirth; + + @OneToOne + @JoinColumn(name = "BENEFICIARY_ID") + private BeneficiaryEntity beneficiary; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/BeneficiaryRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/BeneficiaryRepository.java new file mode 100644 index 00000000..ecb6ed7d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/BeneficiaryRepository.java @@ -0,0 +1,11 @@ +package net.gepafin.tendermanagement.repositories; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import net.gepafin.tendermanagement.entities.BeneficiaryEntity; + +@Repository +public interface BeneficiaryRepository extends JpaRepository { + +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java index 68289e6d..829cd7ef 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java @@ -2,9 +2,11 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.UserEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; import java.util.Optional; +@Repository public interface UserRepository extends JpaRepository { Optional findByEmailIgnoreCase(String email); @@ -13,7 +15,7 @@ public interface UserRepository extends JpaRepository { UserEntity findByEmail(String email); - Optional findByCodiceFiscale(String cf); + Optional findByBeneficiaryCodiceFiscale(String codiceFiscale); - boolean existsByCodiceFiscale(String codiceFiscale); + boolean existsByBeneficiaryCodiceFiscale(String codiceFiscale); } 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 457a1e5d..96c0ce05 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -91,23 +91,35 @@ public class AuthenticationService { } private static LoginResponse getLoginResponse(UserEntity user, RoleResponseBean roleResponseBean) { - LoginResponse loginResponse = new LoginResponse(); - loginResponse.setId(user.getId()); - loginResponse.setEmail(user.getEmail()); - loginResponse.setFirstName(user.getFirstName()); - loginResponse.setLastName(user.getLastName()); - loginResponse.setRole(roleResponseBean); - loginResponse.setPhoneNumber(user.getPhoneNumber()); - loginResponse.setAddress(user.getAddress()); - loginResponse.setOrganization(user.getOrganization()); - loginResponse.setCountry(user.getCountry()); - loginResponse.setStatus(user.getStatus()); - loginResponse.setCity(user.getCity()); - loginResponse.setLastLogin(user.getLastLogin()); - loginResponse.setCodiceFiscale(user.getCodiceFiscale()); - loginResponse.setDateOfBirth(user.getDateOfBirth()); + LoginResponse loginResponse = new LoginResponse(); + loginResponse.setEmail(user.getEmail()); + loginResponse.setId(user.getId()); + loginResponse.setRole(roleResponseBean); + loginResponse.setStatus(user.getStatus()); + loginResponse.setLastLogin(user.getLastLogin()); loginResponse.setCreatedDate(user.getCreatedDate()); loginResponse.setUpdatedDate(user.getUpdatedDate()); + if (user.getBeneficiary() == null) { + loginResponse.setFirstName(user.getFirstName()); + loginResponse.setLastName(user.getLastName()); + loginResponse.setPhoneNumber(user.getPhoneNumber()); + loginResponse.setAddress(user.getAddress()); + loginResponse.setOrganization(user.getOrganization()); + loginResponse.setCountry(user.getCountry()); + loginResponse.setCity(user.getCity()); + loginResponse.setDateOfBirth(user.getDateOfBirth()); + }else { + loginResponse.setFirstName(user.getBeneficiary().getFirstName()); + loginResponse.setLastName(user.getBeneficiary().getLastName()); + loginResponse.setPhoneNumber(user.getBeneficiary().getPhoneNumber()); + loginResponse.setAddress(user.getBeneficiary().getAddress()); + loginResponse.setOrganization(user.getBeneficiary().getOrganization()); + loginResponse.setCountry(user.getBeneficiary().getCountry()); + loginResponse.setCity(user.getBeneficiary().getCity()); + loginResponse.setCodiceFiscale(user.getBeneficiary().getCodiceFiscale()); + loginResponse.setDateOfBirth(user.getBeneficiary().getDateOfBirth()); + } + return loginResponse; } public void logout(HttpServletRequest request, HttpServletResponse response) { @@ -131,7 +143,7 @@ public class AuthenticationService { Map> userAttributes = Utils .convertStringIntoMap(samlResponseLogEntity.getAuthenticationObject()); String cf = userAttributes.get("CodiceFiscale").get(0).toString(); - UserEntity userEntity = userRepository.findByCodiceFiscale(cf) + UserEntity userEntity = userRepository.findByBeneficiaryCodiceFiscale(cf) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); samlResponseLogRepository.delete(samlResponseLogEntity); @@ -150,7 +162,7 @@ public class AuthenticationService { Map> userAttributes = Utils .convertStringIntoMap(samlResponseLogEntity.getAuthenticationObject()); String cf = userAttributes.get("CodiceFiscale").get(0).toString(); - if (userRepository.findByCodiceFiscale(cf).isPresent()) { + if (userRepository.existsByBeneficiaryCodiceFiscale(cf)) { throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_ALREADY_EXIST_MSG)); } diff --git a/src/main/java/net/gepafin/tendermanagement/util/Validator.java b/src/main/java/net/gepafin/tendermanagement/util/Validator.java index f4f53d0b..37c5c29f 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Validator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Validator.java @@ -52,7 +52,7 @@ public class Validator { public void validateRequest(HttpServletRequest request,RoleStatusEnum role) { if (RoleStatusEnum.ROLE_SUPER_ADMIN.equals(role) && Boolean.FALSE.equals(checkIsSuperAdmin(request))) { - throw new UnauthorizedAccessException(Status.UNAUTHORIZED, Translator.toLocale(GepafinConstant.INVALID_USER)); + throw new UnauthorizedAccessException(Status.UNAUTHORIZED, Translator.toLocale(GepafinConstant.INVALID_REQUEST)); } } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index e8d546cd..7f349fd8 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 @@ -737,5 +737,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From d45fce59ec04e972fca3ee3af5b86f685d3fc151 Mon Sep 17 00:00:00 2001 From: rajesh Date: Sat, 28 Sep 2024 21:40:14 +0530 Subject: [PATCH 2/3] Created crud opration for company api's --- .../constants/GepafinConstant.java | 12 +- .../tendermanagement/dao/CompanyDao.java | 156 ++++++++++++++++++ .../gepafin/tendermanagement/dao/UserDao.java | 14 +- .../tendermanagement/dao/VatCheckDao.java | 16 +- .../entities/BeneficiaryEntity.java | 2 +- .../entities/CompanyEntity.java | 53 ++++++ .../entities/UserWithCompanyEntity.java | 22 +++ .../model/request/CompanyRequest.java | 24 +++ .../model/response/CompanyResponse.java | 25 +++ .../repositories/CompanyRepository.java | 17 ++ .../UserWithCompanyRepository.java | 19 +++ .../service/CompanyService.java | 24 +++ .../service/feignClient/VatCheckService.java | 2 +- .../service/impl/CompanyServiceImpl.java | 72 ++++++++ .../service/impl/UserServiceImpl.java | 1 + .../gepafin/tendermanagement/util/Utils.java | 61 +++++-- .../web/rest/api/CompanyApi.java | 97 +++++++++++ .../errors/FeignClientForbiddenException.java | 22 +++ .../errors/FeignClientNotFoundException.java | 22 +++ .../FeignClientUnauthorizedException.java | 22 +++ .../FeignClientValidationException.java | 22 +++ .../api/errors/GlobalExceptionHandler.java | 55 ++++++ .../rest/api/impl/CompanyApiController.java | 89 ++++++++++ .../db/changelog/db.changelog-1.0.0.xml | 44 +++++ src/main/resources/message_en.properties | 10 ++ src/main/resources/message_it.properties | 10 ++ 26 files changed, 884 insertions(+), 29 deletions(-) create mode 100644 src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/entities/UserWithCompanyEntity.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/request/CompanyRequest.java create mode 100644 src/main/java/net/gepafin/tendermanagement/model/response/CompanyResponse.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/repositories/UserWithCompanyRepository.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/CompanyService.java create mode 100644 src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyApi.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/FeignClientForbiddenException.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/FeignClientNotFoundException.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/FeignClientUnauthorizedException.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/FeignClientValidationException.java create mode 100644 src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyApiController.java diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index d79edb37..5f9ee8be 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -136,7 +136,6 @@ public class GepafinConstant { public static final String APPLICATION_IS_INCOMPLETE_MSG = "application.is.incomplete"; public static final String AUTHORIZATION = "Authorization"; public static final String CHECK_VATNUMBER_V2_NEW_URL = "https://imprese.openapi.it/advance"; - public static final String VATNUMBER_V2 = "https://imprese.openapi.it/advance"; public static final String VALIDATION_FIELD_CUSTOM="validation.field.custom"; public static final String VALIDATION_CODICE_FISCALE = "validation.codice.fiscale"; public static final String VALIDATION_CAP = "validation.cap"; @@ -167,4 +166,15 @@ public class GepafinConstant { public static final String ROLE_ID_MANDATORY = "role.id.mandatory"; public static final String VALIDATE_PASSWORD = "validate.password"; + public static final String COMPANY_CREATED_SUCCESS_MSG = "company.created.success"; + public static final String COMPANY_UPDATED_SUCCESS_MSG = "company.updated.success"; + public static final String COMPANY_DELETE_SUCCESS_MSG = "company.delete.success"; + public static final String COMPANY_GET_SUCCESS_MSG = "company.get.success"; + public static final String COMPANY_NOT_FOUND_MSG = "company.not.found"; + public static final String CHECK_VATNUMBER_SUCCESS_MSG = "check.vatnumber.success"; + public static final String INVALID_VATNUMBER = "invalid.vatnumber"; + public static final String VATNUMBER_MANDATORY = "vatnumber.mandatory"; + public static final String VATNUMBER_ALREADY_EXISTS = "vatnumber.already.exists"; + public static final String INVALID_EMAIL = "invalid.email"; + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java new file mode 100644 index 00000000..6b0774aa --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java @@ -0,0 +1,156 @@ +package net.gepafin.tendermanagement.dao; + +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.CompanyEntity; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.entities.UserWithCompanyEntity; +import net.gepafin.tendermanagement.model.request.CompanyRequest; +import net.gepafin.tendermanagement.model.response.CompanyResponse; +import net.gepafin.tendermanagement.repositories.CompanyRepository; +import net.gepafin.tendermanagement.repositories.UserWithCompanyRepository; +import net.gepafin.tendermanagement.service.UserService; +import net.gepafin.tendermanagement.util.Utils; +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; + +@Component +public class CompanyDao { + + @Autowired + private CompanyRepository companyRepository; + + @Autowired + private UserService userService; + + @Autowired + private UserWithCompanyRepository userWithCompanyRepository; + + public CompanyResponse createCompany(UserEntity userEntity, CompanyRequest companyRequest) { + validateCompany(companyRequest); + CompanyEntity companyEntity = convertCompanyRequestToCompanyEntity(companyRequest); + companyRepository.save(companyEntity); + createUserWithCompanyRelation(userEntity, companyEntity); + return convertCompanyEntityToCompanyResponse(companyEntity); + } + + private void validateCompany(CompanyRequest companyRequest) { + if (Boolean.FALSE.equals(StringUtils.isEmpty(companyRequest.getEmail())) + && Boolean.FALSE.equals(Utils.isValidEmail(companyRequest.getEmail()))) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.INVALID_EMAIL)); + } + if(StringUtils.isEmpty(companyRequest.getVatNumber())) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.VATNUMBER_MANDATORY)); + } + if(companyRepository.existsByVatNumber(companyRequest.getVatNumber())) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.VATNUMBER_ALREADY_EXISTS)); + } + + } + + private UserWithCompanyEntity createUserWithCompanyRelation(UserEntity userEntity, CompanyEntity companyEntity) { + UserWithCompanyEntity userWithCompanyEntity = new UserWithCompanyEntity(); + if (userEntity.getBeneficiary() != null) { + userWithCompanyEntity.setBeneficiaryId(userEntity.getBeneficiary().getId()); + } + userWithCompanyEntity.setCompanyId(companyEntity.getId()); + userWithCompanyEntity.setUserId(userEntity.getId()); + return userWithCompanyRepository.save(userWithCompanyEntity); + } + + private CompanyEntity convertCompanyRequestToCompanyEntity(CompanyRequest request) { + CompanyEntity entity = new CompanyEntity(); + entity.setCompanyName(request.getCompanyName()); + entity.setVatNumber(request.getVatNumber()); + entity.setCodiceFiscale(request.getCodiceFiscale()); + entity.setAddress(request.getAddress()); + entity.setPhoneNumber(request.getPhoneNumber()); + entity.setCity(request.getCity()); + entity.setProvince(request.getProvince()); + entity.setCap(request.getCap()); + entity.setCountry(request.getCountry()); + entity.setPec(request.getPec()); + entity.setEmail(request.getEmail()); + entity.setNumberOfEmployees(request.getNumberOfEmployees()); + entity.setAnnualRevenue(request.getAnnualRevenue()); + return entity; + } + + private CompanyResponse convertCompanyEntityToCompanyResponse(CompanyEntity entity) { + CompanyResponse response = new CompanyResponse(); + response.setId(entity.getId()); + response.setCompanyName(entity.getCompanyName()); + response.setVatNumber(entity.getVatNumber()); + response.setCodiceFiscale(entity.getCodiceFiscale()); + response.setAddress(entity.getAddress()); + response.setPhoneNumber(entity.getPhoneNumber()); + response.setCity(entity.getCity()); + response.setProvince(entity.getProvince()); + response.setCap(entity.getCap()); + response.setCountry(entity.getCountry()); + response.setPec(entity.getPec()); + response.setEmail(entity.getEmail()); + response.setNumberOfEmployees(entity.getNumberOfEmployees()); + response.setAnnualRevenue(entity.getAnnualRevenue()); + response.setCreatedDate(entity.getCreatedDate()); + response.setUpdatedDate(entity.getUpdatedDate()); + return response; + } + + public CompanyResponse updateCompany(UserEntity userEntity, Long companyId, CompanyRequest companyRequest) { + CompanyEntity companyEntity = validateCompany(companyId); + Utils.setIfUpdated(companyEntity::getCompanyName, companyEntity::setCompanyName, + companyRequest.getCompanyName()); + Utils.setIfUpdated(companyEntity::getVatNumber, companyEntity::setVatNumber, companyRequest.getVatNumber()); + Utils.setIfUpdated(companyEntity::getCodiceFiscale, companyEntity::setCodiceFiscale, + companyRequest.getCodiceFiscale()); + Utils.setIfUpdated(companyEntity::getAddress, companyEntity::setAddress, companyRequest.getAddress()); + Utils.setIfUpdated(companyEntity::getPhoneNumber, companyEntity::setPhoneNumber, + companyRequest.getPhoneNumber()); + Utils.setIfUpdated(companyEntity::getCity, companyEntity::setCity, companyRequest.getCity()); + Utils.setIfUpdated(companyEntity::getProvince, companyEntity::setProvince, companyRequest.getProvince()); + Utils.setIfUpdated(companyEntity::getCap, companyEntity::setCap, companyRequest.getCap()); + Utils.setIfUpdated(companyEntity::getCountry, companyEntity::setCountry, companyRequest.getCountry()); + Utils.setIfUpdated(companyEntity::getPec, companyEntity::setPec, companyRequest.getPec()); + Utils.setIfUpdated(companyEntity::getEmail, companyEntity::setEmail, companyRequest.getEmail()); + Utils.setIfUpdated(companyEntity::getNumberOfEmployees, companyEntity::setNumberOfEmployees, + companyRequest.getNumberOfEmployees()); + Utils.setIfUpdated(companyEntity::getAnnualRevenue, companyEntity::setAnnualRevenue, + companyRequest.getAnnualRevenue()); + companyRepository.save(companyEntity); + return convertCompanyEntityToCompanyResponse(companyEntity); + } + + public CompanyEntity validateCompany(Long companyId) { + return companyRepository.findById(companyId).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.COMPANY_NOT_FOUND_MSG))); + } + + public CompanyResponse getCompany(UserEntity userEntity, Long companyId) { + return convertCompanyEntityToCompanyResponse(validateCompany(companyId)); + } + + public void deleteCompany(UserEntity userEntity, Long companyId) { + CompanyEntity companyEntity = validateCompany(companyId); + companyRepository.delete(companyEntity); + userWithCompanyRepository.deleteByCompanyId(companyId); + } + + public List getCompanyByUserId(Long userId) { + UserEntity userEntity = userService.validateUser(userId); + List companyIds = userWithCompanyRepository.findCompanyIdByUserId(userEntity.getId()); + List list = companyRepository.findByIdIn(companyIds); + return list.stream().map(this::convertCompanyEntityToCompanyResponse).toList(); + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index aa6e5cfc..8ce47e3b 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -31,8 +31,6 @@ import org.springframework.stereotype.Repository; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; -import java.util.regex.Pattern; - @Repository public class UserDao { @@ -84,7 +82,7 @@ public class UserDao { } private void validateUserRequest(String tempToken, UserReq userReq) { - if (Boolean.FALSE.equals(isValidEmail(userReq.getEmail()))) { + if (Boolean.FALSE.equals(Utils.isValidEmail(userReq.getEmail()))) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.VALIDATE_EMAIL)); } @@ -302,16 +300,6 @@ public class UserDao { authService.logout(request, response); log.info("User successfully logged out."); } - - - public static Boolean isValidEmail(String email) { - String EMAIL_REGEX = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$"; - if (email == null || email.isEmpty()) { - return false; - } - Pattern pattern = Pattern.compile(EMAIL_REGEX); - return pattern.matcher(email).matches(); - } public UserResponseBean updateUserStatus(Long userId, UserStatusEnum statusReq) { log.info("Updating status for user with ID: {}", userId); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/VatCheckDao.java b/src/main/java/net/gepafin/tendermanagement/dao/VatCheckDao.java index 4d1d0f58..f4a07849 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/VatCheckDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/VatCheckDao.java @@ -1,8 +1,13 @@ package net.gepafin.tendermanagement.dao; import feign.FeignException; +import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.service.feignClient.VatCheckService; +import net.gepafin.tendermanagement.util.Utils; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -67,8 +72,17 @@ public class VatCheckDao { } } catch (FeignException ex) { log.error("Exception occurred while checking vat number: {0}", ex); - throw ex; + Utils.callException(ex.status(), ex); } return responseBody; } + + public Map checkVatNumber(String vatNumber) { + try { + return checkVatNumberApi(vatNumber); + } catch (Exception e) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.INVALID_VATNUMBER)); + } + } } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java index c0f31927..302f2af5 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/BeneficiaryEntity.java @@ -9,7 +9,7 @@ import jakarta.validation.constraints.Email; import lombok.Data; @Entity -@Table(name = "beneficiary") +@Table(name = "BENEFICIARY") @Data public class BeneficiaryEntity extends BaseEntity { diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java new file mode 100644 index 00000000..347e4db1 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/CompanyEntity.java @@ -0,0 +1,53 @@ +package net.gepafin.tendermanagement.entities; + +import java.math.BigDecimal; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import lombok.Data; + +@Entity +@Table(name = "COMPANY") +@Data +public class CompanyEntity extends BaseEntity{ + + @Column(name = "COMPANY_NAME") + private String companyName; + + @Column(name = "VAT_NUMBER") + private String vatNumber; + + @Column(name = "CODICE_FISCALE") + private String codiceFiscale; + + @Column(name = "ADDRESS") + private String address; + + @Column(name = "PHONE_NUMBER") + private String phoneNumber; + + @Column(name = "CITY") + private String city; + + @Column(name = "PROVINCE") + private String province; + + @Column(name = "CAP") + private String cap; + + @Column(name = "COUNTRY") + private String country; + + @Column(name = "PEC") + private String pec; + + @Column(name = "EMAIL") + private String email; + + @Column(name = "NUMBER_OF_EMPLOYEES") + private String numberOfEmployees; + + @Column(name = "ANNUAL_REVENUE") + private BigDecimal annualRevenue; +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/UserWithCompanyEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/UserWithCompanyEntity.java new file mode 100644 index 00000000..fce47e66 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/UserWithCompanyEntity.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import lombok.Data; + +@Entity +@Table(name = "USER_WITH_COMPANY") +@Data +public class UserWithCompanyEntity extends BaseEntity{ + + @Column(name = "USER_ID") + Long userId; + + @Column(name = "BENEFICIARY_ID") + Long beneficiaryId; + + @Column(name = "COMPANY_ID") + Long companyId; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CompanyRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/CompanyRequest.java new file mode 100644 index 00000000..bfd6829d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CompanyRequest.java @@ -0,0 +1,24 @@ +package net.gepafin.tendermanagement.model.request; + +import java.math.BigDecimal; + +import lombok.Data; + +@Data +public class CompanyRequest { + + private String companyName; + private String vatNumber; + private String codiceFiscale; + private String address; + private String phoneNumber; + private String city; + private String province; + private String cap; + private String country; + private String pec; + private String email; + private String numberOfEmployees; + private BigDecimal annualRevenue; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CompanyResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/CompanyResponse.java new file mode 100644 index 00000000..254d05a0 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CompanyResponse.java @@ -0,0 +1,25 @@ +package net.gepafin.tendermanagement.model.response; + +import java.math.BigDecimal; + +import lombok.Data; +import net.gepafin.tendermanagement.model.BaseBean; + +@Data +public class CompanyResponse extends BaseBean{ + + private String companyName; + private String vatNumber; + private String codiceFiscale; + private String address; + private String phoneNumber; + private String city; + private String province; + private String cap; + private String country; + private String pec; + private String email; + private String numberOfEmployees; + private BigDecimal annualRevenue; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java new file mode 100644 index 00000000..9dc3a3a5 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CompanyRepository.java @@ -0,0 +1,17 @@ +package net.gepafin.tendermanagement.repositories; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import net.gepafin.tendermanagement.entities.CompanyEntity; + +@Repository +public interface CompanyRepository extends JpaRepository { + + List findByIdIn(List companyIds); + + Boolean existsByVatNumber(String vatNumber); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserWithCompanyRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserWithCompanyRepository.java new file mode 100644 index 00000000..c026c801 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserWithCompanyRepository.java @@ -0,0 +1,19 @@ +package net.gepafin.tendermanagement.repositories; + +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import net.gepafin.tendermanagement.entities.UserWithCompanyEntity; + + +public interface UserWithCompanyRepository extends JpaRepository { + + void deleteByCompanyId(Long companyId); + + @Query("SELECT uwc.companyId FROM UserWithCompanyEntity uwc WHERE uwc.userId = :userId") + List findCompanyIdByUserId(@Param("userId") Long userId); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java b/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java new file mode 100644 index 00000000..e21c22c6 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java @@ -0,0 +1,24 @@ +package net.gepafin.tendermanagement.service; + +import java.util.List; +import java.util.Map; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.model.request.CompanyRequest; +import net.gepafin.tendermanagement.model.response.CompanyResponse; + +public interface CompanyService { + + CompanyResponse createCompany(HttpServletRequest request, CompanyRequest companyRequest); + + CompanyResponse updateCompany(HttpServletRequest request, Long companyId, CompanyRequest companyRequest); + + CompanyResponse getCompany(HttpServletRequest request, Long companyId); + + void deleteCompany(HttpServletRequest request, Long companyId); + + List getCompanyByUserId(HttpServletRequest request, Long userId); + + Map checkVatNumber(HttpServletRequest request, String vatNumber); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/feignClient/VatCheckService.java b/src/main/java/net/gepafin/tendermanagement/service/feignClient/VatCheckService.java index 6665690d..333ab3a1 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/feignClient/VatCheckService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/feignClient/VatCheckService.java @@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.RequestHeader; import java.net.URI; import java.util.Map; -@FeignClient(value = "vat-check-service", url = GepafinConstant.VATNUMBER_V2) +@FeignClient(value = "vat-check-service", url = GepafinConstant.CHECK_VATNUMBER_V2_NEW_URL) public interface VatCheckService { diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java new file mode 100644 index 00000000..e54bf146 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java @@ -0,0 +1,72 @@ +package net.gepafin.tendermanagement.service.impl; + +import java.util.List; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.dao.CompanyDao; +import net.gepafin.tendermanagement.dao.VatCheckDao; +import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.model.request.CompanyRequest; +import net.gepafin.tendermanagement.model.response.CompanyResponse; +import net.gepafin.tendermanagement.service.CompanyService; +import net.gepafin.tendermanagement.util.Validator; + +@Service +public class CompanyServiceImpl implements CompanyService { + + @Autowired + private Validator validator; + + @Autowired + private CompanyDao companyDao; + + @Autowired + private VatCheckDao vatCheckDao; + + @Override + @Transactional(rollbackFor = Exception.class) + public CompanyResponse createCompany(HttpServletRequest request, CompanyRequest companyRequest) { + UserEntity userEntity =validator.validateUser(request); + return companyDao.createCompany(userEntity, companyRequest); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public CompanyResponse updateCompany(HttpServletRequest request, Long companyId, CompanyRequest companyRequest) { + UserEntity userEntity =validator.validateUser(request); + return companyDao.updateCompany(userEntity, companyId, companyRequest); + } + + @Override + @Transactional(readOnly = true) + public CompanyResponse getCompany(HttpServletRequest request, Long companyId) { + UserEntity userEntity =validator.validateUser(request); + return companyDao.getCompany(userEntity, companyId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteCompany(HttpServletRequest request, Long companyId) { + UserEntity userEntity =validator.validateUser(request); + companyDao.deleteCompany(userEntity, companyId); + } + + @Override + @Transactional(readOnly = true) + public List getCompanyByUserId(HttpServletRequest request, Long userId) { + UserEntity userEntity = validator.validateUser(request); + return companyDao.getCompanyByUserId(userId); + } + + @Override + @Transactional(readOnly = true) + public Map checkVatNumber(HttpServletRequest request, String vatNumber) { + return vatCheckDao.checkVatNumber(vatNumber); + } + +} 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 c109e6bb..74ceaf40 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java @@ -35,6 +35,7 @@ public class UserServiceImpl implements UserService { @Autowired private SamlSuccessHandler samlSuccessHandler; + @Override @Transactional(rollbackFor = Exception.class) public JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq) { if (tempToken == null) { diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 9de26d9c..af0bc684 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -1,17 +1,5 @@ package net.gepafin.tendermanagement.util; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.json.JsonReadFeature; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.type.TypeFactory; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import io.micrometer.common.util.StringUtils; -import org.apache.commons.collections4.MapUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.lang.reflect.Field; import java.lang.reflect.Type; import java.nio.charset.StandardCharsets; @@ -21,8 +9,29 @@ import java.util.List; import java.util.Map; import java.util.function.Consumer; import java.util.function.Supplier; +import java.util.regex.Pattern; import java.util.stream.Collectors; +import org.apache.commons.collections4.MapUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.json.JsonReadFeature; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.type.TypeFactory; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; + +import feign.FeignException; +import io.micrometer.common.util.StringUtils; +import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientForbiddenException; +import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientUnauthorizedException; +import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientValidationException; + public class Utils { @@ -190,4 +199,32 @@ public class Utils { return null; } } + + public static void callException(Integer staus, FeignException ex) { + switch (staus) { + case 400: + throw new FeignClientValidationException(HttpStatus.valueOf(staus), ex.getMessage()); + + case 401: + throw new FeignClientUnauthorizedException(HttpStatus.valueOf(staus), ex.getMessage()); + + case 403: + throw new FeignClientForbiddenException(HttpStatus.valueOf(staus), ex.getMessage()); + + case 404: + throw new FeignClientNotFoundException(HttpStatus.valueOf(staus), ex.getMessage()); + default: + log.error("Exception occured :- {0}", ex); + throw ex; + } + } + + public static Boolean isValidEmail(String email) { + String EMAIL_REGEX = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$"; + if (email == null || email.isEmpty()) { + return false; + } + Pattern pattern = Pattern.compile(EMAIL_REGEX); + return pattern.matcher(email).matches(); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyApi.java new file mode 100644 index 00000000..53ff4102 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CompanyApi.java @@ -0,0 +1,97 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import java.util.List; +import java.util.Map; + +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.model.request.CompanyRequest; +import net.gepafin.tendermanagement.model.response.CompanyResponse; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; + +public interface CompanyApi { + + @Operation(summary = "Api to create company", responses = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @PostMapping(value = "", produces = { "application/json" }) + ResponseEntity> createCompany(HttpServletRequest request, + @Parameter(description = "Company request object", required = true) @RequestBody CompanyRequest companyRequest); + + @Operation(summary = "Api to update company", responses = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @PutMapping(value = "/{companyId}", produces = { "application/json" }) + ResponseEntity> updateCompany(HttpServletRequest request, + @Parameter(description = "The company id", required = true) @PathVariable("companyId") Long companyId, + @Parameter(description = "Company request object", required = true) @RequestBody CompanyRequest companyRequest); + + @Operation(summary = "Api to delete company", responses = { @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) + @DeleteMapping(value = "/{companyId}", produces = { "application/json" }) + ResponseEntity> deleteCompany(HttpServletRequest request, + @Parameter(description = "The company id", required = true) @PathVariable("companyId") Long companyId); + + @Operation(summary = "Api to get company", 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 = "/{companyId}", produces = { "application/json" }) + ResponseEntity> getCompany(HttpServletRequest request, + @Parameter(description = "The company id", required = true) @PathVariable("companyId") Long companyId); + + @Operation(summary = "Api to get company by user 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 = "/user/{userId}", produces = { "application/json" }) + ResponseEntity>> getCompanyByUserId(HttpServletRequest request, + @Parameter(description = "The company id", required = true) @PathVariable("userId") Long userId); + + @Operation(summary = "Api to check vatNumber", 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 = "/vatNumber", produces = { "application/json" }) + ResponseEntity>> checkVatNumber(HttpServletRequest request, + @Parameter(description = "The vatNumber of company", required = true) @RequestParam("vatNumber") String vatNumber); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/FeignClientForbiddenException.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/FeignClientForbiddenException.java new file mode 100644 index 00000000..bfabad15 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/FeignClientForbiddenException.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.web.rest.api.errors; + +import org.springframework.http.HttpStatus; + +import feign.FeignException; + +public class FeignClientForbiddenException extends FeignException{ + + private static final long serialVersionUID = 1L; + + private final HttpStatus status; + + public FeignClientForbiddenException(HttpStatus status,String message) { + super(403,message); + this.status = status; + } + + public HttpStatus getStatus() { + return status; + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/FeignClientNotFoundException.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/FeignClientNotFoundException.java new file mode 100644 index 00000000..c5896f5e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/FeignClientNotFoundException.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.web.rest.api.errors; + +import org.springframework.http.HttpStatus; + +import feign.FeignException; + +public class FeignClientNotFoundException extends FeignException{ + + private static final long serialVersionUID = 1L; + + private final HttpStatus status; + + public FeignClientNotFoundException(HttpStatus status,String message) { + super(404,message); + this.status = status; + } + + public HttpStatus getStatus() { + return status; + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/FeignClientUnauthorizedException.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/FeignClientUnauthorizedException.java new file mode 100644 index 00000000..9fe1092b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/FeignClientUnauthorizedException.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.web.rest.api.errors; + +import org.springframework.http.HttpStatus; + +import feign.FeignException; + +public class FeignClientUnauthorizedException extends FeignException{ + + private static final long serialVersionUID = 1L; + + private final HttpStatus status; + + public FeignClientUnauthorizedException(HttpStatus status,String message) { + super(401,message); + this.status = status; + } + + public HttpStatus getStatus() { + return status; + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/FeignClientValidationException.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/FeignClientValidationException.java new file mode 100644 index 00000000..f623faab --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/FeignClientValidationException.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.web.rest.api.errors; + +import org.springframework.http.HttpStatus; + +import feign.FeignException; + +public class FeignClientValidationException extends FeignException{ + + private static final long serialVersionUID = 1L; + + private final HttpStatus status; + + public FeignClientValidationException(HttpStatus status,String message) { + super(400,message); + this.status = status; + } + + public HttpStatus getStatus() { + return status; + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java index 1118da03..fd7ba455 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/errors/GlobalExceptionHandler.java @@ -2,9 +2,11 @@ package net.gepafin.tendermanagement.web.rest.api.errors; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.util.Utils; import java.util.ArrayList; import java.util.List; +import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -14,6 +16,9 @@ import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; + +import feign.FeignException; + import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authorization.AuthorizationDeniedException; @@ -122,4 +127,54 @@ public class GlobalExceptionHandler { } + @ResponseStatus(value = HttpStatus.BAD_REQUEST) + @ExceptionHandler(FeignClientValidationException.class) + @ResponseBody + public Map handleFeignClientBadRequestException(final Throwable ex) { + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + String exceptionString = ex.getMessage().substring(ex.getMessage().indexOf("]: [") + 4, ex.getMessage().length() - 1); + return Utils.convertIntoJson(exceptionString); + } + + @ResponseStatus(value = HttpStatus.FORBIDDEN) + @ExceptionHandler(FeignClientForbiddenException.class) + @ResponseBody + public Map handleFeignClientForbiddenException(final Throwable ex) { + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + String exceptionString = ex.getMessage().substring(ex.getMessage().indexOf("]: [") + 4, ex.getMessage().length() - 1); + return Utils.convertIntoJson(exceptionString); + } + + @ResponseStatus(value = HttpStatus.UNAUTHORIZED) + @ExceptionHandler(FeignClientUnauthorizedException.class) + @ResponseBody + public Map handleFeignClientUnauthorizedException(final Throwable ex) { + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + String exceptionString = ex.getMessage().substring(ex.getMessage().indexOf("]: [") + 4, ex.getMessage().length() - 1); + return Utils.convertIntoJson(exceptionString); + } + + @ResponseStatus(value = HttpStatus.NOT_FOUND) + @ExceptionHandler(FeignClientNotFoundException.class) + @ResponseBody + public Map handleFeignClientNotFoundException(final Throwable ex) { + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + String exceptionString = ex.getMessage().substring(ex.getMessage().indexOf("]: [") + 4, ex.getMessage().length() - 1); + return Utils.convertIntoJson(exceptionString); + } + + @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(FeignException.class) + @ResponseBody + public Map handleFeignException(final Throwable ex) { + log.error(ex.getMessage()); + log.error(ex.getLocalizedMessage(), ex); + String exceptionString = ex.getMessage().substring(ex.getMessage().indexOf("]: [") + 4, ex.getMessage().length() - 1); + return Utils.convertIntoJson(exceptionString); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyApiController.java new file mode 100644 index 00000000..c4428f04 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CompanyApiController.java @@ -0,0 +1,89 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import java.util.List; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.CompanyRequest; +import net.gepafin.tendermanagement.model.response.CompanyResponse; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.CompanyService; +import net.gepafin.tendermanagement.web.rest.api.CompanyApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; + +@RestController +@RequestMapping("${openapi.gepafin.base-path:/v1/company}") +public class CompanyApiController implements CompanyApi{ + + private final Logger log = LoggerFactory.getLogger(CompanyApiController.class); + + @Autowired + private CompanyService companyService; + + @Override + public ResponseEntity> createCompany(HttpServletRequest request, + CompanyRequest companyRequest) { + log.info("Create company with - Request Body: {}", companyRequest); + CompanyResponse data = companyService.createCompany(request, companyRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_CREATED_SUCCESS_MSG))); + } + + @Override + public ResponseEntity> updateCompany(HttpServletRequest request, Long companyId, + CompanyRequest companyRequest) { + log.info("Update company with - Request Body: {}", companyRequest); + CompanyResponse data = companyService.updateCompany(request, companyId, companyRequest); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_UPDATED_SUCCESS_MSG))); + } + + @Override + public ResponseEntity> getCompany(HttpServletRequest request, Long companyId) { + + log.info("Get company with id: {}", companyId); + CompanyResponse data = companyService.getCompany(request, companyId); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_GET_SUCCESS_MSG))); + } + + @Override + public ResponseEntity> deleteCompany(HttpServletRequest request, Long companyId) { + log.info("Delete company with id: {}", companyId); + companyService.deleteCompany(request, companyId); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_DELETE_SUCCESS_MSG))); + } + + @Override + public ResponseEntity>> getCompanyByUserId(HttpServletRequest request, Long userId) { + + log.info("Get company with userId: {}", userId); + List data = companyService.getCompanyByUserId(request, userId); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.COMPANY_GET_SUCCESS_MSG))); + } + + @Override + public ResponseEntity>> checkVatNumber(HttpServletRequest request, String vatNumber) { + log.info("check VatNumber with: {}", vatNumber); + Map data = companyService.checkVatNumber(request, vatNumber); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.CHECK_VATNUMBER_SUCCESS_MSG))); + } + +} diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 7f349fd8..d4da3d66 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 @@ -767,7 +767,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index cf80165c..96726470 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -194,3 +194,13 @@ codice.fiscale.exists=This codice fiscale is already associated with another use total.steps.not.zero=Total steps cannot be zero. completed.steps.not.valid=Completed steps should be between 0 and total steps. field.id.not.found=Field ID {0} does not exist in the form structure. +company.created.success=Company created successfully. +company.updated.success=Company updated successfully. +company.delete.success=Company deleted successfully. +company.get.success=Company retrieved successfully. +company.not.found=Company not found. +check.vatnumber.success=VAT number checked successfully. +invalid.vatnumber=Invalid VAT number. +vatnumber.mandatory=VatNumber is mandatory. +vatnumber.already.exists=VatNumber already exists. +invalid.email=Invalid email. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 9582a89d..324131cb 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -187,3 +187,13 @@ codice.fiscale.exists=Questo codice fiscale � gi� associato ad un altro uten total.steps.not.zero=Il totale dei passaggi non pu� essere zero. completed.steps.not.valid=I passaggi completati devono essere compresi tra 0 e il totale dei passaggi. field.id.not.found=L'ID campo {0} non esiste nella struttura del modulo. +company.created.success=Azienda creata con successo. +company.updated.success=Azienda aggiornata con successo. +company.delete.success=Azienda eliminata con successo. +company.get.success=Azienda recuperata con successo. +company.not.found=Azienda non trovata. +check.vatnumber.success=Numero di partita IVA verificato con successo. +invalid.vatnumber=Numero di partita IVA non valido. +vatnumber.mandatory=Il numero di partita IVA è obbligatorio. +vatnumber.already.exists=Il numero di partita IVA esiste già. +invalid.email=Email non valida. From 9b3fd43bf9680024671f992cf5782aa3c92badd5 Mon Sep 17 00:00:00 2001 From: rajesh Date: Sun, 29 Sep 2024 19:59:10 +0530 Subject: [PATCH 3/3] Implemented company in application --- .../constants/GepafinConstant.java | 2 + .../tendermanagement/dao/ApplicationDao.java | 170 +++++++++++------- .../tendermanagement/dao/CompanyDao.java | 11 +- .../gepafin/tendermanagement/dao/FaqDao.java | 22 ++- .../gepafin/tendermanagement/dao/FlowDao.java | 5 - .../tendermanagement/dao/FlowFormDao.java | 4 +- .../entities/ApplicationEntity.java | 9 +- .../tendermanagement/entities/FaqEntity.java | 3 + .../response/ApplicationGetResponseBean.java | 4 + .../model/response/ApplicationResponse.java | 4 + .../response/NextOrPreviousFormResponse.java | 4 + .../repositories/ApplicationRepository.java | 10 +- .../UserWithCompanyRepository.java | 3 + .../service/ApplicationService.java | 5 +- .../service/CompanyService.java | 6 + .../tendermanagement/service/FaqService.java | 2 +- .../service/impl/ApplicationServiceImpl.java | 26 +-- .../service/impl/CompanyServiceImpl.java | 11 ++ .../service/impl/FaqServiceImpl.java | 4 +- .../tendermanagement/util/Validator.java | 35 +++- .../web/rest/api/ApplicationApi.java | 10 +- .../web/rest/api/DocumentApi.java | 10 +- .../tendermanagement/web/rest/api/FaqApi.java | 2 +- .../api/impl/ApplicationApiController.java | 8 +- .../web/rest/api/impl/FaqApiController.java | 4 +- .../db/changelog/db.changelog-1.0.0.xml | 11 ++ src/main/resources/message_en.properties | 1 + src/main/resources/message_it.properties | 1 + 28 files changed, 269 insertions(+), 118 deletions(-) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 5f9ee8be..06e0927c 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -176,5 +176,7 @@ public class GepafinConstant { public static final String VATNUMBER_MANDATORY = "vatnumber.mandatory"; public static final String VATNUMBER_ALREADY_EXISTS = "vatnumber.already.exists"; public static final String INVALID_EMAIL = "invalid.email"; + public static final String UNAUTHORIZED = "UNAUTHORIZED"; + public static final String COMPANY_ID_MANDATORY = "company.id.mandatory"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index c7ad96c5..8dd589e4 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -17,15 +17,18 @@ import net.gepafin.tendermanagement.service.FormService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.FieldValidator; 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; -import org.checkerframework.checker.units.qual.A; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Component; +import jakarta.persistence.criteria.Predicate; + import java.text.MessageFormat; import java.time.LocalDateTime; import java.util.*; @@ -65,14 +68,17 @@ public class ApplicationDao { @Autowired private FlowDataRepository flowDataRepository; + + @Autowired + private Validator validator; - public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long formId,Long applicationId) { + public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long formId, Long applicationId) { FormEntity formEntity = formService.validateForm(formId); - CallEntity call = callService.validatePublishedCall(formEntity.getCall().getId()); + callService.validatePublishedCall(formEntity.getCall().getId()); validateFormFields(applicationRequestBean,formEntity); ApplicationEntity applicationEntity = validateApplication(applicationId); - if(Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.SUBMIT.getValue()))){ + if(Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.SUBMIT.getValue()))) { throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_SUBMITTED)); } formService.validateFormField(applicationRequestBean.getFormFields(),applicationEntity,formEntity); @@ -94,9 +100,10 @@ public class ApplicationDao { return applicationFormEntity; } - public ApplicationEntity createApplicationEntity(UserEntity user, CallEntity call) { + public ApplicationEntity createApplicationEntity(UserEntity user, CallEntity call, CompanyEntity companyEntity) { ApplicationEntity entity = new ApplicationEntity(); - entity.setUser(user); + entity.setUserId(user.getId()); + entity.setCompany(companyEntity); entity.setCall(call); entity.setIsDeleted(false); entity.setStatus(ApplicationStatusTypeEnum.DRAFT.getValue()); @@ -109,7 +116,6 @@ public class ApplicationDao { ApplicationEntity applicationEntity = validateApplication(id); ApplicationFormEntity applicationFormEntity = applicationFormRepository.findByApplicationIdAndFormId(applicationEntity.getId(),formId); List applicationFormFieldResponseBeans=new ArrayList<>(); - ApplicationFormFieldResponseBean applicationFormFieldResponseBeans1=null; List applicationFormFieldEntities = applicationFormFieldRepository.findByApplicationFormId(applicationFormEntity.getId()); applicationFormFieldResponseBeans=createApplicationFormFieldResponse(applicationFormFieldEntities, applicationFormEntity, applicationFormFieldResponseBeans); ApplicationResponseBean applicationResponseBean= convertApplicationEntityToApplicationResponseBean(applicationEntity); @@ -170,44 +176,74 @@ public class ApplicationDao { log.info("Application deleted with ID: {}", id); } - public List getAllApplications(UserEntity userEntity, Long callId) { - boolean isBeneficiary = isBeneficiary(userEntity); - +// public List getAllApplications(UserEntity userEntity, Long callId, CompanyEntity companyEntity) { +// boolean isBeneficiary = validator.checkIsBeneficiary(); +// +// log.info("Fetching applications for RoleType: {}", userEntity.getRoleEntity().getRoleType()); +// List applicationResponses = new ArrayList<>(); +// +// if (callId != null) { +// // Fetch based on callId and user if role is BENEFICIARY, otherwise fetch all for the call +// log.info("Fetching applications for callId: {}", callId); +// CallEntity call = callService.validateCall(callId); +// +// // Use a single method to handle both conditions for consistency +// List applicationEntities = isBeneficiary +// ? applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(), call.getId()) +// .map(List::of) // Convert Optional to a List of one element +// .orElse(List.of()) // If not present, return an empty list +// : applicationRepository.findByCallIdAndIsDeletedFalse(call.getId()); +// +// applicationResponses = applicationEntities.stream() +// .map(this::getApplicationResponse) +// .collect(Collectors.toList()); +// +// } else { +// // Fetch all applications for the user if BENEFICIARY, or fetch all applications in general +// List applicationEntities = isBeneficiary +// ? applicationRepository.findByUserIdAndIsDeletedFalse(companyEntity.getId()) +// : applicationRepository.findByIsDeletedFalse(); +// +// applicationResponses = applicationEntities.stream() +// .map(this::getApplicationResponse) +// .collect(Collectors.toList()); +// } +// +// return applicationResponses; +// } + + public List getAllApplications(UserEntity userEntity, Long callId, Long companyId) { + log.info("Fetching applications for RoleType: {}", userEntity.getRoleEntity().getRoleType()); - List applicationResponses = new ArrayList<>(); - if (callId != null) { - // Fetch based on callId and user if role is BENEFICIARY, otherwise fetch all for the call - log.info("Fetching applications for callId: {}", callId); - CallEntity call = callService.validateCall(callId); + Specification spec = search(userEntity.getId(), callId, companyId); - // Use a single method to handle both conditions for consistency - List applicationEntities = isBeneficiary - ? applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(), call.getId()) - .map(List::of) // Convert Optional to a List of one element - .orElse(List.of()) // If not present, return an empty list - : applicationRepository.findByCallIdAndIsDeletedFalse(call.getId()); + List applicationEntities = applicationRepository.findAll(spec); - applicationResponses = applicationEntities.stream() - .map(this::getApplicationResponse) - .collect(Collectors.toList()); - - } else { - // Fetch all applications for the user if BENEFICIARY, or fetch all applications in general - List applicationEntities = isBeneficiary - ? applicationRepository.findByUserIdAndIsDeletedFalse(userEntity.getId()) - : applicationRepository.findByIsDeletedFalse(); - - applicationResponses = applicationEntities.stream() - .map(this::getApplicationResponse) - .collect(Collectors.toList()); - } - - return applicationResponses; + return applicationEntities.stream() + .map(this::getApplicationResponse) + .collect(Collectors.toList()); } - private ApplicationResponse getApplicationResponse(ApplicationEntity applicationEntity) { + private Specification search(Long userId, Long callId, Long companyId) { + return (root, query, builder) -> { + Boolean isBeneficiary = validator.checkIsBeneficiary(); + Predicate predicate = builder.isFalse(root.get("isDeleted")); + if (isBeneficiary) { + predicate = builder.and(predicate, builder.equal(root.get("userId"), userId)); + } + if (callId != null) { + predicate = builder.and(predicate, builder.equal(root.get("call").get("id"), callId)); + } + if (companyId != null) { + predicate = builder.and(predicate, builder.equal(root.get("company").get("id"), companyId)); + } + return predicate; + }; + } + + private ApplicationResponse getApplicationResponse(ApplicationEntity applicationEntity) { ApplicationResponse responseBean = new ApplicationResponse(); List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId()); Long totalFormSteps = flowFormDao.calculateTotalSteps(flowEdgesList); @@ -223,13 +259,17 @@ public class ApplicationDao { responseBean.setSubmissionDate(applicationEntity.getSubmissionDate()); responseBean.setStatus(applicationEntity.getStatus()); responseBean.setComments(applicationEntity.getComments()); + responseBean.setCompanyId(applicationEntity.getCompany().getId()); + responseBean.setCompanyName(applicationEntity.getCompany().getCompanyName()); return responseBean; } - public ApplicationEntity validateApplication(Long id) { - ApplicationEntity applicationEntity= applicationRepository.findById(id).orElseThrow(() ->new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.APPLICATION_NOT_FOUND_MSG))); - return applicationEntity; - } + public ApplicationEntity validateApplication(Long id) { + ApplicationEntity applicationEntity = applicationRepository.findById(id) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.APPLICATION_NOT_FOUND_MSG))); + return applicationEntity; + } private ApplicationResponseBean convertApplicationEntityToApplicationResponseBean(ApplicationEntity entity) { ApplicationResponseBean response = new ApplicationResponseBean(); @@ -349,20 +389,19 @@ public class ApplicationDao { return applicationEntity; } - public ApplicationGetResponseBean getApplicationByFormId( Long applicationId,Long formId, UserEntity userEntity) { + public ApplicationGetResponseBean getApplicationByFormId( Long applicationId, Long formId, UserEntity userEntity) { List formApplicationResponses = new ArrayList<>(); List formEntities = new ArrayList<>(); boolean isBeneficiary = isBeneficiary(userEntity); ApplicationEntity applicationEntity = isBeneficiary - ? applicationRepository.findByIdAndUserIdAndIsDeletedFalse(applicationId,userEntity.getId()) + ? applicationRepository.findByIdAndUserIdAndIsDeletedFalse(applicationId, userEntity.getId()) .orElseThrow(() -> new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_NOT_FOUND_MSG))) : applicationRepository.findById(applicationId) .stream().findFirst() .orElseThrow(() -> new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_NOT_FOUND_MSG))); - if (formId != null) { FormEntity formEntity = formService.validateForm(formId); - Optional application = applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(), + Optional application = applicationRepository.findByIdAndUserIdAndCallIdAndIsDeletedFalse(applicationId, userEntity.getId(), formEntity.getCall().getId()); applicationEntity=application.get(); formEntities.add(formEntity); @@ -422,6 +461,8 @@ public class ApplicationDao { applicationGetResponseBean.setSubmissionDate(applicationEntity.getSubmissionDate()); applicationGetResponseBean.setCallId(applicationEntity.getCall().getId()); applicationGetResponseBean.setCallTitle(applicationEntity.getCall().getName()); + applicationGetResponseBean.setCompanyId(applicationEntity.getCompany().getId()); + applicationGetResponseBean.setCompanyName(applicationEntity.getCompany().getCompanyName()); return applicationGetResponseBean; } @@ -434,36 +475,29 @@ public class ApplicationDao { return formApplicationResponse; } - public ApplicationResponse createApplicationByCallId(ApplicationRequest applicationRequest,Long callId,UserEntity userEntity){ - CallEntity call=callService.validateCall(callId); - call = callService.validatePublishedCall(call.getId()); - checkIfApplicationExists(call,userEntity); - ApplicationEntity applicationEntity=createApplicationEntity(userEntity,call); - applicationEntity.setComments(applicationRequest.getComments()); - applicationEntity=saveApplicationEntity(applicationEntity); - ApplicationResponse applicationResponse=getApplicationResponse(applicationEntity); - return applicationResponse; - } - public void checkIfApplicationExists(CallEntity call,UserEntity userEntity){ - Optional applicationEntity=applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(),call.getId()); + public ApplicationResponse createApplicationByCallId(CompanyEntity companyEntity, + ApplicationRequest applicationRequest, Long callId, UserEntity userEntity) { + CallEntity call = callService.validateCall(callId); + call = callService.validatePublishedCall(call.getId()); + checkIfApplicationExists(call, companyEntity); + ApplicationEntity applicationEntity = createApplicationEntity(userEntity, call, companyEntity); + applicationEntity.setComments(applicationRequest.getComments()); + applicationEntity = saveApplicationEntity(applicationEntity); + ApplicationResponse applicationResponse = getApplicationResponse(applicationEntity); + return applicationResponse; + } + public void checkIfApplicationExists(CallEntity call, CompanyEntity companyEntity){ + Optional applicationEntity=applicationRepository.findByCompanyIdAndCallIdAndIsDeletedFalse(companyEntity.getId(),call.getId()); if(applicationEntity.isPresent()){ throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_EXISTS)); } } - - - public ApplicationEntity getApplicationByCallAndUser(CallEntity call, UserEntity userEntity) { - return applicationRepository.findByUserIdAndCallIdAndIsDeletedFalse(userEntity.getId(), call.getId()) - .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, - Translator.toLocale(GepafinConstant.APPLICATION_NOT_FOUND_MSG))); - - } public void updateApplicationStatus(Long applicationId, ApplicationStatusTypeEnum status) { ApplicationEntity applicationEntity = validateApplication(applicationId); if (status.equals(ApplicationStatusTypeEnum.SUBMIT)) { - CallEntity callEntity = applicationEntity.getCall(); +// CallEntity callEntity = applicationEntity.getCall(); // Long initialFormId = callEntity.getInitialForm(); // Long finalFormId = callEntity.getFinalForm(); //// if (initialFormId == null || finalFormId == null) { @@ -501,7 +535,7 @@ public class ApplicationDao { return (int) Math.round(progress); } public void validateFormFields(ApplicationRequestBean request, FormEntity formEntity) { - List errors=new ArrayList<>(); + List contentResponseBeans=Utils.convertJsonStringToList(formEntity.getContent(),ContentResponseBean.class); List requestFields = request.getFormFields(); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java index 6b0774aa..5aa03a64 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CompanyDao.java @@ -42,20 +42,20 @@ public class CompanyDao { } private void validateCompany(CompanyRequest companyRequest) { + if (Boolean.FALSE.equals(StringUtils.isEmpty(companyRequest.getEmail())) && Boolean.FALSE.equals(Utils.isValidEmail(companyRequest.getEmail()))) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_EMAIL)); } - if(StringUtils.isEmpty(companyRequest.getVatNumber())) { + if (StringUtils.isEmpty(companyRequest.getVatNumber())) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.VATNUMBER_MANDATORY)); } - if(companyRepository.existsByVatNumber(companyRequest.getVatNumber())) { + if (companyRepository.existsByVatNumber(companyRequest.getVatNumber())) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.VATNUMBER_ALREADY_EXISTS)); } - } private UserWithCompanyEntity createUserWithCompanyRelation(UserEntity userEntity, CompanyEntity companyEntity) { @@ -153,4 +153,9 @@ public class CompanyDao { return list.stream().map(this::convertCompanyEntityToCompanyResponse).toList(); } + public UserWithCompanyEntity validateUserWithCompny(Long userId, Long companyId) { + return userWithCompanyRepository.findByUserIdAndCompanyId(userId, companyId).orElseThrow(() -> new CustomValidationException(Status.UNAUTHORIZED, + Translator.toLocale(GepafinConstant.UNAUTHORIZED))); + } + } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java index b8ebd278..cfec2fe2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FaqDao.java @@ -12,8 +12,11 @@ import net.gepafin.tendermanagement.model.request.FaqReq; import net.gepafin.tendermanagement.model.response.FaqResponseBean; import net.gepafin.tendermanagement.repositories.FaqRepository; import net.gepafin.tendermanagement.service.CallService; +import net.gepafin.tendermanagement.service.CompanyService; import net.gepafin.tendermanagement.service.LookUpDataService; import net.gepafin.tendermanagement.util.DateTimeUtil; +import net.gepafin.tendermanagement.util.Validator; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; @@ -35,12 +38,25 @@ public class FaqDao { @Autowired private LookUpDataService lookUpDataService; + + @Autowired + private Validator validator; + + @Autowired + private CompanyService companyService; - public FaqResponseBean createFaq(FaqReq faqRequest, UserEntity userEntity, Long callId) { - FaqEntity entity = new FaqEntity(); + public FaqResponseBean createFaq(FaqReq faqRequest, UserEntity userEntity, Long callId, Long companyId) { CallEntity callEntity = callService.validateCall(callId); - entity = createOrUpdateFaqEntity(faqRequest, callEntity, userEntity, + FaqEntity entity = createOrUpdateFaqEntity(faqRequest, callEntity, userEntity, LookUpDataEntity.LookUpDataTypeEnum.FAQ); + if (validator.checkIsBeneficiary() && companyId == null) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.COMPANY_ID_MANDATORY)); + } + if(companyId!=null) { + companyService.validateCompany(companyId); + entity.setCompanyId(companyId); + } faqRepository.save(entity); return convertToFaqResponseBean(entity); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java index 6b4d34d5..2fbf0943 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowDao.java @@ -4,20 +4,16 @@ import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.FlowDataEntity; -import net.gepafin.tendermanagement.entities.FlowDataEntity; import net.gepafin.tendermanagement.entities.FlowEdgesEntity; import net.gepafin.tendermanagement.enums.CallStatusEnum; import net.gepafin.tendermanagement.model.request.FlowDataRequestBean; import net.gepafin.tendermanagement.model.request.FlowEdgesRequestBean; import net.gepafin.tendermanagement.model.request.FlowRequestBean; -import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; import net.gepafin.tendermanagement.model.response.FlowDataResponseBean; import net.gepafin.tendermanagement.model.response.FlowEdgesResponseBean; import net.gepafin.tendermanagement.model.response.FlowResponseBean; import net.gepafin.tendermanagement.repositories.CallRepository; import net.gepafin.tendermanagement.repositories.FlowDataRepository; -import net.gepafin.tendermanagement.repositories.FlowDataRepository; -import net.gepafin.tendermanagement.repositories.FlowEdgesRepository; import net.gepafin.tendermanagement.repositories.FlowEdgesRepository; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.FormService; @@ -29,7 +25,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.time.LocalDateTime; -import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java index 57f3c756..b99ba6c2 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FlowFormDao.java @@ -1,7 +1,6 @@ package net.gepafin.tendermanagement.dao; import java.util.*; -import java.util.stream.Collectors; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; import net.gepafin.tendermanagement.repositories.*; @@ -20,7 +19,6 @@ import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.model.response.NextOrPreviousFormResponse; import net.gepafin.tendermanagement.service.FormService; 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; @Component @@ -296,6 +294,8 @@ public class FlowFormDao { applicationDao.processForm(formEntity, applicationEntity)); nextOrPreviousFormResponse.setCallId(applicationEntity.getCall().getId()); nextOrPreviousFormResponse.setCallTitle(applicationEntity.getCall().getName()); + nextOrPreviousFormResponse.setCompanyId(applicationEntity.getCompany().getId()); + nextOrPreviousFormResponse.setCompanyName(applicationEntity.getCompany().getCompanyName()); List flowEdgesList = flowEdgesRepository.findByCallId(applicationEntity.getCall().getId()); Long totalFormSteps = calculateTotalSteps(flowEdgesList); diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java index 8c9156e3..01648c67 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ApplicationEntity.java @@ -13,9 +13,12 @@ import java.time.LocalDateTime; @Builder public class ApplicationEntity extends BaseEntity { + @Column(name = "USER_ID") + private Long userId; + @ManyToOne - @JoinColumn(name = "USER_ID", nullable = false) - private UserEntity user; + @JoinColumn(name = "COMPANY_ID", nullable = false) + private CompanyEntity company; @Column(name = "SUBMISSION_DATE") private LocalDateTime submissionDate; @@ -29,7 +32,7 @@ public class ApplicationEntity extends BaseEntity { @ManyToOne @JoinColumn(name = "CALL_ID", nullable = false) private CallEntity call; - + @Column(name="IS_DELETED") private Boolean isDeleted; diff --git a/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java index 38cd3b2b..a476f2c5 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/FaqEntity.java @@ -41,6 +41,9 @@ public class FaqEntity extends BaseEntity { @Column(name ="IS_DELETED", nullable = false) private Boolean isDeleted = false; + + @Column(name ="COMPANY_ID") + private Long companyId; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationGetResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationGetResponseBean.java index 50ce0c57..9078f3a2 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationGetResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationGetResponseBean.java @@ -19,6 +19,10 @@ public class ApplicationGetResponseBean { private Long callId; private String callTitle; + + private Long companyId; + + private String companyName; private List form; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java index b5a0fbb2..4283637f 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/ApplicationResponse.java @@ -26,5 +26,9 @@ public class ApplicationResponse{ private String status; private String comments; + + private Long companyId; + + private String companyName; } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java b/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java index 0c39d4a9..7864e831 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/NextOrPreviousFormResponse.java @@ -17,6 +17,10 @@ public class NextOrPreviousFormResponse { private Long completedSteps; private Long currentStep; + + private Long companyId; + + private String companyName; private ApplicationStatusTypeEnum applicationStatus; diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java index ad9104a5..567c8198 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ApplicationRepository.java @@ -3,6 +3,7 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.ApplicationEntity; import net.gepafin.tendermanagement.entities.FaqEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -11,9 +12,7 @@ import java.util.List; import java.util.Optional; @Repository -public interface ApplicationRepository extends JpaRepository { - - public Optional findByUserIdAndCallIdAndIsDeletedFalse(Long userId,Long callId); +public interface ApplicationRepository extends JpaRepository, JpaSpecificationExecutor { public List findByUserIdAndIsDeletedFalse(Long userId); @@ -26,4 +25,9 @@ public interface ApplicationRepository extends JpaRepository findByIdAndUserIdAndIsDeletedFalse(Long id,Long userId); + Optional findByCompanyIdAndCallIdAndIsDeletedFalse(Long companyId, Long callId); + + public Optional findByIdAndUserIdAndCallIdAndIsDeletedFalse(Long applicationId, Long userId, + Long callId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserWithCompanyRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserWithCompanyRepository.java index c026c801..89da2436 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserWithCompanyRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserWithCompanyRepository.java @@ -1,6 +1,7 @@ package net.gepafin.tendermanagement.repositories; import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -16,4 +17,6 @@ public interface UserWithCompanyRepository extends JpaRepository findCompanyIdByUserId(@Param("userId") Long userId); + Optional findByUserIdAndCompanyId(Long userId, Long companyId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java index 152bc1b5..a8f6ad53 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/ApplicationService.java @@ -19,15 +19,16 @@ public interface ApplicationService { ApplicationGetResponseBean getApplicationByFormId(HttpServletRequest request, Long applicationId,Long formId); - List getAllApplications(HttpServletRequest request,Long callId); + List getAllApplications(HttpServletRequest request,Long callId, Long companyId); void deleteApplication(HttpServletRequest request, Long applicationId); public ApplicationEntity validateApplication(Long userId); - public ApplicationResponse createApplication(HttpServletRequest request, ApplicationRequest applicationRequest, Long callId); + public ApplicationResponse createApplication(HttpServletRequest request, Long companyId, ApplicationRequest applicationRequest, Long callId); public NextOrPreviousFormResponse getNextOrPreviousForm(HttpServletRequest request, Long applicationId, Long formId, FormActionEnum action); public void updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java b/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java index e21c22c6..d0d7ce20 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CompanyService.java @@ -4,6 +4,8 @@ import java.util.List; import java.util.Map; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.CompanyEntity; +import net.gepafin.tendermanagement.entities.UserWithCompanyEntity; import net.gepafin.tendermanagement.model.request.CompanyRequest; import net.gepafin.tendermanagement.model.response.CompanyResponse; @@ -21,4 +23,8 @@ public interface CompanyService { Map checkVatNumber(HttpServletRequest request, String vatNumber); + CompanyEntity validateCompany(Long companyId); + + UserWithCompanyEntity validateUserWithCompny(Long userId, Long companyId); + } diff --git a/src/main/java/net/gepafin/tendermanagement/service/FaqService.java b/src/main/java/net/gepafin/tendermanagement/service/FaqService.java index 55adc950..74fd414d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/FaqService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/FaqService.java @@ -11,7 +11,7 @@ import net.gepafin.tendermanagement.model.response.FaqResponseBean; public interface FaqService { - FaqResponseBean createFaq(HttpServletRequest request,Long callId, FaqReq faqRequest); + FaqResponseBean createFaq(HttpServletRequest request,Long callId, Long companyId, FaqReq faqRequest); FaqResponseBean getFaqById(HttpServletRequest request, Long id); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java index e2364698..a64afadf 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -4,6 +4,7 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.ApplicationDao; import net.gepafin.tendermanagement.dao.FlowFormDao; import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.entities.CompanyEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.ApplicationRequest; import net.gepafin.tendermanagement.enums.ApplicationStatusTypeEnum; @@ -35,10 +36,11 @@ public class ApplicationServiceImpl implements ApplicationService { @Override @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); - } + public ApplicationResponseBean createApplication(HttpServletRequest request, + ApplicationRequestBean applicationRequestBean, Long applicationId, Long formId) { + UserEntity userEntity = validator.validateUser(request); + return applicationDao.createApplication(applicationRequestBean, userEntity, formId, applicationId); + } @Override @Transactional(readOnly = true) @@ -60,9 +62,10 @@ public class ApplicationServiceImpl implements ApplicationService { @Override @Transactional(rollbackFor = Exception.class) - public ApplicationResponse createApplication(HttpServletRequest request, ApplicationRequest applicationRequest, Long callId) { + public ApplicationResponse createApplication(HttpServletRequest request, Long companyId, ApplicationRequest applicationRequest, Long callId) { UserEntity userEntity = validator.validateUser(request); - return applicationDao.createApplicationByCallId(applicationRequest,callId,userEntity); + CompanyEntity companyEntity = validator.validateUSerWithCompany(request, companyId); + return applicationDao.createApplicationByCallId(companyEntity, applicationRequest, callId, userEntity); } @Override @@ -80,8 +83,11 @@ public class ApplicationServiceImpl implements ApplicationService { @Override @Transactional(readOnly = true) - public List getAllApplications(HttpServletRequest request,Long callId) { - UserEntity userEntity = validator.validateUser(request); - return applicationDao.getAllApplications(userEntity,callId); - } + public List getAllApplications(HttpServletRequest request, Long callId, Long companyId) { + UserEntity userEntity = validator.validateUser(request); + if (companyId != null) { + validator.validateUSerWithCompany(request, companyId); + } + return applicationDao.getAllApplications(userEntity, callId, companyId); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java index e54bf146..6dfec87a 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java @@ -10,7 +10,9 @@ import org.springframework.transaction.annotation.Transactional; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.CompanyDao; import net.gepafin.tendermanagement.dao.VatCheckDao; +import net.gepafin.tendermanagement.entities.CompanyEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.entities.UserWithCompanyEntity; import net.gepafin.tendermanagement.model.request.CompanyRequest; import net.gepafin.tendermanagement.model.response.CompanyResponse; import net.gepafin.tendermanagement.service.CompanyService; @@ -68,5 +70,14 @@ public class CompanyServiceImpl implements CompanyService { public Map checkVatNumber(HttpServletRequest request, String vatNumber) { return vatCheckDao.checkVatNumber(vatNumber); } + @Override + public CompanyEntity validateCompany(Long companyId) { + return companyDao.validateCompany(companyId); + } + + @Override + public UserWithCompanyEntity validateUserWithCompny(Long userId, Long companyId) { + return companyDao.validateUserWithCompny(userId, companyId); + } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FaqServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FaqServiceImpl.java index 78a458f3..921b0ae7 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/FaqServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FaqServiceImpl.java @@ -25,9 +25,9 @@ public class FaqServiceImpl implements FaqService { private Validator validator; @Override - public FaqResponseBean createFaq(HttpServletRequest request,Long callId, FaqReq faqRequest) { + public FaqResponseBean createFaq(HttpServletRequest request,Long callId, Long companyId, FaqReq faqRequest) { UserEntity userEntity = validator.validateUser(request); - return faqDao.createFaq(faqRequest, userEntity,callId); + return faqDao.createFaq(faqRequest, userEntity, callId, companyId); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/util/Validator.java b/src/main/java/net/gepafin/tendermanagement/util/Validator.java index 37c5c29f..44ba62af 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Validator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Validator.java @@ -4,8 +4,10 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.CompanyEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.RoleStatusEnum; +import net.gepafin.tendermanagement.service.CompanyService; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.web.rest.api.errors.Status; import net.gepafin.tendermanagement.web.rest.api.errors.UnauthorizedAccessException; @@ -26,6 +28,9 @@ public class Validator { @Autowired private UserService userService; + + @Autowired + private CompanyService companyService; public Map getUserInfoFromToken(HttpServletRequest request) { return tokenProvider.getUserInfoAndUserIdFromToken(request); @@ -36,7 +41,7 @@ public class Validator { return userService.validateUser(Long.parseLong(userInfo.get("userId").toString())); } - public Boolean checkIsSuperAdmin(HttpServletRequest request) { + public Boolean checkIsSuperAdmin() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication != null && authentication.isAuthenticated()) { @@ -51,9 +56,35 @@ public class Validator { } public void validateRequest(HttpServletRequest request,RoleStatusEnum role) { - if (RoleStatusEnum.ROLE_SUPER_ADMIN.equals(role) && Boolean.FALSE.equals(checkIsSuperAdmin(request))) { + if (RoleStatusEnum.ROLE_SUPER_ADMIN.equals(role) && Boolean.FALSE.equals(checkIsSuperAdmin())) { throw new UnauthorizedAccessException(Status.UNAUTHORIZED, Translator.toLocale(GepafinConstant.INVALID_REQUEST)); } } + + public CompanyEntity validateUSerWithCompany(HttpServletRequest request, Long companyId) { + if (checkIsSuperAdmin()) { + return companyService.validateCompany(companyId); + } + Map userInfo = tokenProvider.getUserInfoAndUserIdFromToken(request); + companyService.validateUserWithCompny(getUserId(userInfo), companyId); + return companyService.validateCompany(companyId); + } + + private Long getUserId(Map userInfo) { + return Long.parseLong(userInfo.get("userId").toString()); + } + + public Boolean checkIsBeneficiary() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication != null && authentication.isAuthenticated()) { + // Check if the user has the ROLE_SUPER_ADMIN authority + for (GrantedAuthority authority : authentication.getAuthorities()) { + if (RoleStatusEnum.ROLE_BENEFICIARY.getValue().equals(authority.getAuthority())) { + return true; + } + } + } + return false; + } } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java index 9499bfe0..c56680ef 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/ApplicationApi.java @@ -67,7 +67,8 @@ public interface ApplicationApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "", produces = "application/json") ResponseEntity>> getAllApplications(HttpServletRequest request, - @Parameter(description = "The call id", required = false) @RequestParam(value = "callId", required = false) Long callId); + @Parameter(description = "The call id", required = false) @RequestParam(value = "callId", required = false) Long callId, + @Parameter(description = "The company id", required = false) @RequestParam(value = "companyId", required = false) Long companyId); @Operation(summary = "Api to delete application", responses = { @@ -93,9 +94,10 @@ public interface ApplicationApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @PostMapping(value = "/call/{callId}", produces = { "application/json" }) - ResponseEntity> createApplicationByCallId(HttpServletRequest request, - @Parameter(description = " Flow request object", required = true) @Valid @RequestBody ApplicationRequest applicationRequest, - @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId); + ResponseEntity> createApplicationByCallId(HttpServletRequest request, + @Parameter(description = "The company ID", required = true) @RequestParam(value = "companyId", required = true) Long companyId, + @Parameter(description = " Flow request object", required = true) @Valid @RequestBody ApplicationRequest applicationRequest, + @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java index 9c2cedcc..45a16c8f 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/DocumentApi.java @@ -31,9 +31,13 @@ public interface DocumentApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) }))}) @PostMapping(value = "/uploadFile/source/{sourceId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) - default ResponseEntity>> uploadFile(HttpServletRequest httpServletRequest, @Parameter(description = "Source Id", required = true) @PathVariable("sourceId") Long sourceId, @RequestParam DocumentSourceTypeEnum sourceType, @RequestParam("file") List files, @RequestParam("documentType") DocumentTypeEnum documentTypeEnum) { - return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); - } + default ResponseEntity>> uploadFile(HttpServletRequest httpServletRequest, + @Parameter(description = "Source Id", required = true) @PathVariable("sourceId") Long sourceId, + @RequestParam("sourceType") DocumentSourceTypeEnum sourceType, + @RequestParam("file") List files, + @RequestParam("documentType") DocumentTypeEnum documentTypeEnum) { + return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED); + } @Operation(summary = "API to delete a file by document id", responses = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FaqApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FaqApi.java index f44491a8..8fad8c06 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/FaqApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/FaqApi.java @@ -24,7 +24,7 @@ public interface FaqApi { }) @PostMapping(value = "/call/{callId}", consumes = "application/json", produces = "application/json") ResponseEntity> createFaq(HttpServletRequest request, @Parameter(description = "call id", required = true) - @PathVariable("callId") Long callId, @Valid @RequestBody FaqReq faqRequest); + @PathVariable("callId") Long callId, @RequestParam(value = "companyId", required = false) Long companyId, @Valid @RequestBody FaqReq faqRequest); @Operation(summary = "API to get FAQ by id", responses = { diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java index 1d8b205b..69f28492 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/ApplicationApiController.java @@ -60,14 +60,14 @@ public class ApplicationApiController implements ApplicationApi { } @Override - public ResponseEntity> createApplicationByCallId(HttpServletRequest request, ApplicationRequest applicationRequest, Long callId) { - ApplicationResponse applicationResponseBean=applicationService.createApplication(request,applicationRequest,callId); + public ResponseEntity> createApplicationByCallId(HttpServletRequest request, Long companyId, ApplicationRequest applicationRequest, Long callId) { + ApplicationResponse applicationResponseBean=applicationService.createApplication(request, companyId, applicationRequest, callId); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(applicationResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.APPLICATION_CREATED_SUCCESS_MSG))); } @Override - public ResponseEntity>> getAllApplications(HttpServletRequest request,Long callId) { - List applications = applicationService.getAllApplications(request,callId); + public ResponseEntity>> getAllApplications(HttpServletRequest request,Long callId,Long companyId) { + List applications = applicationService.getAllApplications(request,callId,companyId); log.info("Get All Applications"); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(applications, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_APPLICATION_SUCCESS_MSG))); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FaqApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FaqApiController.java index 142e5614..d905e938 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FaqApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/FaqApiController.java @@ -22,8 +22,8 @@ public class FaqApiController implements FaqApi { private FaqService faqService; @Override - public ResponseEntity> createFaq(HttpServletRequest request, Long callId,FaqReq faqRequest) { - FaqResponseBean response = faqService.createFaq(request,callId, faqRequest); + public ResponseEntity> createFaq(HttpServletRequest request, Long callId, Long companyId, FaqReq faqRequest) { + FaqResponseBean response = faqService.createFaq(request,callId, companyId, faqRequest); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(response, Status.SUCCESS, Translator.toLocale(GepafinConstant.FAQ_CREATED_SUCCESSFULLY))); } diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index d4da3d66..1fe6a617 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 @@ -813,5 +813,16 @@ + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 96726470..5ef423b2 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -204,3 +204,4 @@ invalid.vatnumber=Invalid VAT number. vatnumber.mandatory=VatNumber is mandatory. vatnumber.already.exists=VatNumber already exists. invalid.email=Invalid email. +company.id.mandatory=Company id is mandatory. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 324131cb..273cdef9 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -197,3 +197,4 @@ invalid.vatnumber=Numero di partita IVA non valido. vatnumber.mandatory=Il numero di partita IVA è obbligatorio. vatnumber.already.exists=Il numero di partita IVA esiste già. invalid.email=Email non valida. +company.id.mandatory=L'ID dell'azienda è obbligatorio.