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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +