diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java index 050c4167..c69b7316 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlConfig.java @@ -29,6 +29,7 @@ import org.opensaml.xmlsec.signature.support.SignatureConstants; import org.opensaml.xmlsec.signature.support.Signer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -45,6 +46,9 @@ import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.entities.SamlResponseEntity; +import net.gepafin.tendermanagement.enums.SamlResponseStatusEnum; +import net.gepafin.tendermanagement.repositories.SamlResponseRepository; @Configuration public class SamlConfig { @@ -59,6 +63,9 @@ public class SamlConfig { @Value("${active.profile.folder}") String activeProfileFolder; + + @Autowired + private SamlResponseRepository samlResponseRepository; @Bean public RelyingPartyRegistrationRepository relyingPartyRegistrationRepository() { @@ -135,18 +142,24 @@ public class SamlConfig { authenticationRequestResolver.setAuthnRequestCustomizer((context) -> { HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); - String hubId = (String) request.getAttribute("hubId"); + String hubUuid = (String) request.getAttribute("hubId"); - logger.info("Hub id " + hubId); + logger.info("Hub id " + hubUuid); + String inResponseTo = "_" + UUID.randomUUID().toString(); // Continue with normal AuthnRequest configuration AuthnRequest authnRequest = context.getAuthnRequest(); - authnRequest.setID("_" + UUID.randomUUID().toString()+":"+hubId); + authnRequest.setID(inResponseTo); authnRequest.setVersion(SAMLVersion.VERSION_20); authnRequest.setProtocolBinding(SAMLConstants.SAML2_POST_BINDING_URI); authnRequest.setRequestedAuthnContext(buildRequestedAuthnContext()); - + + SamlResponseEntity samlResponse = new SamlResponseEntity(); + samlResponse.setHubUuid(hubUuid); + samlResponse.setInResponseTo(inResponseTo); + samlResponse.setStatus(SamlResponseStatusEnum.INITIATED.getValue()); + samlResponseRepository.save(samlResponse); // Log the SAML AuthnRequest after setting context String samlRequest = SamlRequestLogger.convertSAMLObjectToString(authnRequest); logger.info("SAML AuthnRequest after setting context: " + samlRequest); @@ -156,21 +169,21 @@ public class SamlConfig { } -private RequestedAuthnContext buildRequestedAuthnContext() { - AuthnContextClassRefBuilder authnContextClassRefBuilder = new AuthnContextClassRefBuilder(); - AuthnContextClassRef authnContextClassRef = authnContextClassRefBuilder.buildObject( - SAMLConstants.SAML20_NS, AuthnContextClassRef.DEFAULT_ELEMENT_LOCAL_NAME, SAMLConstants.SAML20_PREFIX - ); - // Set the SPID Level 2 authentication context - authnContextClassRef.setURI("urn:oasis:names:tc:SAML:2.0:ac:classes:SecureRemotePassword"); - - RequestedAuthnContextBuilder requestedAuthnContextBuilder = new RequestedAuthnContextBuilder(); - RequestedAuthnContext requestedAuthnContext = requestedAuthnContextBuilder.buildObject(); - requestedAuthnContext.setComparison(AuthnContextComparisonTypeEnumeration.EXACT); - requestedAuthnContext.getAuthnContextClassRefs().add(authnContextClassRef); - - return requestedAuthnContext; -} + private RequestedAuthnContext buildRequestedAuthnContext() { + AuthnContextClassRefBuilder authnContextClassRefBuilder = new AuthnContextClassRefBuilder(); + AuthnContextClassRef authnContextClassRef = authnContextClassRefBuilder.buildObject( + SAMLConstants.SAML20_NS, AuthnContextClassRef.DEFAULT_ELEMENT_LOCAL_NAME, SAMLConstants.SAML20_PREFIX + ); + // Set the SPID Level 2 authentication context + authnContextClassRef.setURI("urn:oasis:names:tc:SAML:2.0:ac:classes:SecureRemotePassword"); + + RequestedAuthnContextBuilder requestedAuthnContextBuilder = new RequestedAuthnContextBuilder(); + RequestedAuthnContext requestedAuthnContext = requestedAuthnContextBuilder.buildObject(); + requestedAuthnContext.setComparison(AuthnContextComparisonTypeEnumeration.EXACT); + requestedAuthnContext.getAuthnContextClassRefs().add(authnContextClassRef); + + return requestedAuthnContext; + } public PrivateKey readPrivateKey() throws Exception { // Path to your private key PEM file diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java index 171b7e12..d2337ee9 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlFailureHandler.java @@ -1,9 +1,13 @@ package net.gepafin.tendermanagement.config; import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.AuthenticationFailureHandler; @@ -11,6 +15,12 @@ import org.springframework.stereotype.Component; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.SamlResponseEntity; +import net.gepafin.tendermanagement.enums.SamlResponseStatusEnum; +import net.gepafin.tendermanagement.repositories.SamlResponseRepository; +import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; @Component public class SamlFailureHandler implements AuthenticationFailureHandler { @@ -20,16 +30,40 @@ public class SamlFailureHandler implements AuthenticationFailureHandler { @Value("${fe.base.url}") private String feBaseUrl; + @Autowired + private SamlResponseRepository samlResponseRepository; + @Override - public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, - AuthenticationException exception) throws IOException { - try { - logger.error("SAML login failed: " + exception.getMessage()); - + public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, + AuthenticationException exception) throws IOException { + try { + logger.error("SAML login failed: " + exception.getMessage()); + String inResponseTo = extractInResponseTo(feBaseUrl); + if (Boolean.FALSE.equals(StringUtils.isEmpty(inResponseTo))) { + SamlResponseEntity samlResponseLogEntity = samlResponseRepository + .findByInResponseToAndStatus(inResponseTo, SamlResponseStatusEnum.INITIATED.getValue()) + .orElseThrow(() -> new CustomValidationException(Status.BAD_REQUEST, + Translator.toLocale(GepafinConstant.INVALID_REQUEST))); + samlResponseLogEntity.setStatus(SamlResponseStatusEnum.FAILED.getValue()); + samlResponseRepository.save(samlResponseLogEntity); + } response.sendRedirect(feBaseUrl + "/login"); - } catch (Exception e) { - logger.error("Error processing SAML failure handler", e); - } - } + } catch (Exception e) { + logger.error("Error processing SAML failure handler", e); + } + } + + public static String extractInResponseTo(String message) { + String regex = "InResponseTo attribute \\[([a-zA-Z0-9\\-]+)\\]"; + + Pattern pattern = Pattern.compile(regex); + Matcher matcher = pattern.matcher(message); + + if (matcher.find()) { + return matcher.group(1); + } else { + return null; + } + } } diff --git a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java index d9eb870c..3c5ed0fb 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SamlSuccessHandler.java @@ -2,13 +2,13 @@ package net.gepafin.tendermanagement.config; import java.io.ByteArrayInputStream; import java.io.IOException; -import java.util.Base64; import java.util.List; import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; +import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -26,10 +26,13 @@ import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.HubEntity; import net.gepafin.tendermanagement.entities.SamlResponseEntity; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.SamlResponseStatusEnum; import net.gepafin.tendermanagement.repositories.SamlResponseRepository; import net.gepafin.tendermanagement.repositories.UserRepository; +import net.gepafin.tendermanagement.service.HubService; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; @@ -47,6 +50,9 @@ public class SamlSuccessHandler implements AuthenticationSuccessHandler { @Value("${fe.base.url}") private String feBaseUrl; + + @Autowired + private HubService hubService; @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, @@ -59,16 +65,6 @@ public class SamlSuccessHandler implements AuthenticationSuccessHandler { Map> userAttributes = principal.getAttributes(); String token = Utils.generateSecureToken(); logger.info("SAML User Attributes: " + userAttributes); - - SamlResponseEntity samlResponseLogEntity = new SamlResponseEntity(); - samlResponseLogEntity.setAuthenticationObject(authentication.toString()); - - ObjectMapper objectMapper = new ObjectMapper(); - String userAttributesJson = objectMapper.writeValueAsString(userAttributes); - samlResponseLogEntity.setAuthenticationObject(userAttributesJson); - samlResponseLogEntity.setToken(token); - samlResponseLogRepository.save(samlResponseLogEntity); - // Extracting raw SAML response String samlResponse = samlAuth.getSaml2Response(); @@ -89,8 +85,28 @@ public class SamlSuccessHandler implements AuthenticationSuccessHandler { logger.info("SAML Response ID: " + responseId); logger.info("InResponseTo: " + inResponseTo); logger.info("IssueInstant: " + issueInstant); + + SamlResponseEntity samlResponseLogEntity = samlResponseLogRepository + .findByInResponseToAndStatus(inResponseTo, SamlResponseStatusEnum.INITIATED.getValue()) + .orElseThrow(() -> new CustomValidationException(Status.BAD_REQUEST, + Translator.toLocale(GepafinConstant.INVALID_REQUEST))); + ObjectMapper objectMapper = new ObjectMapper(); + String userAttributesJson = objectMapper.writeValueAsString(userAttributes); + + samlResponseLogEntity.setAuthenticationObject(userAttributesJson); + samlResponseLogEntity.setToken(token); + samlResponseLogEntity.setStatus(SamlResponseStatusEnum.SUCCESS.getValue()); + samlResponseLogEntity.setInResponseTo(inResponseTo); + samlResponseLogEntity.setSamlId(responseId); + samlResponseLogEntity.setIssueInstant(issueInstant); + samlResponseLogRepository.save(samlResponseLogEntity); + + HubEntity hub = hubService.getHubByUuid(samlResponseLogEntity.getHubUuid()); String redirectUrl = feBaseUrl; + if (Boolean.FALSE.equals(StringUtils.isEmpty(hub.getDomainName()))) { + redirectUrl = hub.getDomainName(); + } logger.info("SAML login successful for user: " + principal.getName()); String cf = userAttributes.get("CodiceFiscale").get(0).toString(); @@ -107,9 +123,9 @@ public class SamlSuccessHandler implements AuthenticationSuccessHandler { } } - public void validateToken(String token, String codiceFiscale) { + public void validateToken(String token, String codiceFiscale, String hubUuid) { SamlResponseEntity samlResponseLogEntity = samlResponseLogRepository.findByToken(token); - if (samlResponseLogEntity == null) { + if (samlResponseLogEntity == null || Boolean.FALSE.equals(hubUuid.equals(samlResponseLogEntity.getHubUuid()))) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_TOKEN_MSG)); } @@ -120,7 +136,6 @@ public class SamlSuccessHandler implements AuthenticationSuccessHandler { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_TOKEN_MSG)); } - samlResponseLogRepository.delete(samlResponseLogEntity); } } diff --git a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java index d299b6ff..884c848f 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java +++ b/src/main/java/net/gepafin/tendermanagement/config/jwt/TokenProvider.java @@ -104,6 +104,10 @@ public class TokenProvider { if(user != null) { payload += ":"+user.getId(); } + + if(user != null) { + payload += ":"+user.getHub().getId(); + } String token = Jwts.builder() .setSubject(payload) diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 2ffb9604..38d8bb1a 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -233,6 +233,13 @@ public class GepafinConstant { public static final String CANNOT_DELETE_COMPANY_WITH_APPLICATION_SUBMITT = "application.in.submit.status.cannot.delete.company"; public static final String GET_USERS_SUCCESS_MSG = "get.users.success.msg"; public static final String CANNOT_CREATE_BENEFICIARY_USER="cannot.create.beneficiary.user"; + + public static final String HUB_CREATE_SUCCESS = "hub_create_success"; + public static final String HUB_UPDATE_SUCCESS = "hub_update_success"; + public static final String HUB_GET_SUCCESS = "hub_get_success"; + public static final String HUB_GET_ALL_SUCCESS = "hub_get_all_success"; + public static final String HUB_DELETE_SUCCESS = "hub_delete_success"; + public static final String HUB_NOT_FOUND = "hub_not_found"; public static final String EVALUATIONCRITERIA_INVALID = "evaluationCriteria.invalid"; } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java index ad2ac4a2..126277d0 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/ApplicationDao.java @@ -119,13 +119,17 @@ public class ApplicationDao { @Value("${aws.s3.url.folder.signed.document}") private String signedDocumentS3Folder; + + @Value("${default.hub.uuid}") + private String defaultHubUuid; - public ApplicationResponseBean createApplication(ApplicationRequestBean applicationRequestBean, UserEntity userEntity, Long formId, Long applicationId) { + public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long formId, Long applicationId) { FormEntity formEntity = formService.validateForm(formId); // callService.validatePublishedCall(formEntity.getCall().getId()); validateFormFields(applicationRequestBean,formEntity); ApplicationEntity applicationEntity = validateApplication(applicationId); + validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); if(Boolean.TRUE.equals(applicationEntity.getStatus().equals(ApplicationStatusTypeEnum.SUBMIT.getValue()))) { throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.APPLICATION_ALREADY_SUBMITTED)); } @@ -229,10 +233,11 @@ public class ApplicationDao { return applicationFormFieldResponseBeans; } - public void deleteById(Long id) { + public void deleteById(HttpServletRequest request, Long id) { log.info("Deleting application with ID: {}", id); ApplicationEntity applicationEntity= validateApplication(id); + validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); applicationEntity.setIsDeleted(true); applicationEntity=saveApplicationEntity(applicationEntity); log.info("Application deleted with ID: {}", id); @@ -467,9 +472,10 @@ public class ApplicationDao { return applicationEntity; } - public ApplicationGetResponseBean getApplicationByFormId( Long applicationId, Long formId, UserEntity userEntity) { + public ApplicationGetResponseBean getApplicationByFormId(HttpServletRequest request, Long applicationId, Long formId) { List formApplicationResponses = new ArrayList<>(); List formEntities = new ArrayList<>(); + UserEntity userEntity = validator.validateUser(request); boolean isBeneficiary = isBeneficiary(userEntity); ApplicationEntity applicationEntity = isBeneficiary ? applicationRepository.findByIdAndUserIdAndIsDeletedFalse(applicationId, userEntity.getId()) @@ -574,8 +580,10 @@ public class ApplicationDao { } } - public ApplicationResponse updateApplicationStatus(UserEntity userEntity, Long applicationId, ApplicationStatusTypeEnum status) { + public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) { + UserEntity userEntity = validator.validateUser(request); ApplicationEntity applicationEntity = validateApplication(applicationId); + validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); if (ApplicationStatusTypeEnum.SUBMIT.getValue().equals(applicationEntity.getStatus())) { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_SUBMITTED_CANNOT_CHANGE)); } @@ -602,8 +610,7 @@ public class ApplicationDao { if (totalSteps.intValue() != completedSteps) { throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.APPLICATION_IS_INCOMPLETE_MSG)); } - Integer maxProtocolNumber=protocolRepository.findMaxProtocolNumber(); - Integer protocolNumber = (maxProtocolNumber != null) ? maxProtocolNumber + 1 : 1; + Long protocolNumber = getProtocolNumber(userEntity.getHub()); ProtocolEntity protocolEntity=createProtocolEntity(applicationEntity,protocolNumber); applicationEntity.setProtocol(protocolEntity); applicationEntity.setStatus(ApplicationStatusTypeEnum.SUBMIT.getValue()); @@ -618,6 +625,14 @@ public class ApplicationDao { return getApplicationResponse(applicationEntity); } + private Long getProtocolNumber(HubEntity hubEntity) { + Long maxProtocolNumber = protocolRepository.findMaxProtocolNumberAndHubId(hubEntity.getId()); + Long startNumber = 10000001L; + if(Boolean.FALSE.equals(defaultHubUuid.equals(hubEntity.getUniqueUuid()))) { + startNumber = 20000001L; + } + return (maxProtocolNumber != null) ? maxProtocolNumber + 1 : startNumber; + } public Integer calculateProgress(Long totalSteps, Long completedSteps) { if (FieldValidator.isNullOrZero(totalSteps)) { throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.TOTAL_STEPS_NOT_BE_ZERO)); @@ -691,12 +706,12 @@ public class ApplicationDao { } } - public ProtocolEntity createProtocolEntity(ApplicationEntity applicationEntity,Integer protocolNumber){ + public ProtocolEntity createProtocolEntity(ApplicationEntity applicationEntity,Long protocolNumber){ ProtocolEntity protocolEntity=new ProtocolEntity(); protocolEntity.setCall(applicationEntity.getCall().getId()); LocalDateTime utcDateTime = DateTimeUtil.DateServerToUTC(LocalDateTime.now()); protocolEntity.setYear(utcDateTime.getYear()); - protocolEntity.setProtocolNumber(Long.valueOf(protocolNumber)); + protocolEntity.setProtocolNumber(protocolNumber); protocolEntity.setTime(LocalTime.now()); protocolEntity.setApplicationId(applicationEntity.getId()); protocolRepository.save(protocolEntity); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index 3bba946a..c4fc17ad 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -85,9 +85,6 @@ public class CallDao { @Autowired private CallTargetAudienceChecklistRepository callTargetAudienceChecklistRepository; - @Autowired - private UserService userService; - @Autowired private FaqService faqService; @@ -106,10 +103,9 @@ public class CallDao { @Autowired private CriteriaFormFieldRepository criteriaFormFieldRepository; - public CallResponse createCallStep1(CreateCallRequestStep1 createCallRequest, Long userId) { - UserEntity userEntity = userService.validateUser(userId); + public CallResponse createCallStep1(CreateCallRequestStep1 createCallRequest, UserEntity userEntity) { createCallRequest.setRegionId(userEntity.getRoleEntity().getRegion().getId()); - CallEntity callEntity = convertToCallEntity(createCallRequest); + CallEntity callEntity = convertToCallEntity(createCallRequest, userEntity); updateFaq(createCallRequest.getFaq(), callEntity, userEntity,LookUpDataTypeEnum.FAQ); @@ -151,7 +147,7 @@ public class CallDao { - public CallEntity convertToCallEntity(CreateCallRequestStep1 createCallRequest) { + public CallEntity convertToCallEntity(CreateCallRequestStep1 createCallRequest, UserEntity userEntity) { CallEntity callEntity = new CallEntity(); // validateCallEntity(createCallRequest); RegionEntity region = regionRepository.findById(createCallRequest.getRegionId()) @@ -187,6 +183,7 @@ public class CallDao { callEntity.setPhoneNumber(createCallRequest.getPhoneNumber()); callEntity.setStartTime(DateTimeUtil.parseTime(createCallRequest.getStartTime())); callEntity.setEndTime(DateTimeUtil.parseTime(createCallRequest.getEndTime())); + callEntity.setHub(userEntity.getHub()); callEntity = callRepository.save(callEntity); return callEntity; } @@ -433,13 +430,11 @@ public class CallDao { Translator.toLocale(GepafinConstant.CALL_NOT_FOUND))); } - public CallResponse getCallById(Long callId) { - CallEntity callEntity = validateCall(callId); + public CallResponse getCallById(CallEntity callEntity) { return getCallResponseBean(callEntity); } - public CallResponse createCallStep2(Long callId, CreateCallRequestStep2 createCallRequest, Long userId) { - CallEntity callEntity = validateCall(callId); + public CallResponse createCallStep2(CallEntity callEntity, CreateCallRequestStep2 createCallRequest, UserEntity user) { validateUpdate(callEntity); setIfUpdated(callEntity::getThreshold, callEntity::setThreshold, createCallRequest.getThreshold()); callRepository.save(callEntity); @@ -499,8 +494,7 @@ public class CallDao { } } - public CallResponse updateCallStep1(Long callId, UpdateCallRequestStep1 updateCallRequest, Long userId) { - CallEntity callEntity = validateCall(callId); + public CallResponse updateCallStep1(CallEntity callEntity, UpdateCallRequestStep1 updateCallRequest, UserEntity userEntity) { if(Boolean.TRUE.equals(callEntity.getStatus().equals(CallStatusEnum.PUBLISH.getValue()))) { try { Utils.retainOnlySpecificFields(updateCallRequest, Collections.singletonList("faq")); @@ -508,7 +502,6 @@ public class CallDao { throw new CustomValidationException(Status.BAD_REQUEST,Translator.toLocale(GepafinConstant.FAILED_RETAIN_FIELD)); } } - UserEntity userEntity = userService.validateUser(userId); isValidDateRange(updateCallRequest, callEntity); setIfUpdated(callEntity::getName, callEntity::setName, updateCallRequest.getName()); setIfUpdated(callEntity::getDescriptionShort, callEntity::setDescriptionShort, @@ -667,7 +660,7 @@ public class CallDao { validateUpdate(callEntity); CallResponse callResponseBean = getCallResponseBean(callEntity); FlowResponseBean flowResponseBean = flowDao.getFlowByCallId(callEntity.getId()); - List formResponseBean = formDao.getFormsByCallId(callEntity.getId()); + List formResponseBean = formDao.getFormsByCallId(callEntity); CallValidatorServiceImpl.validateResponse(callResponseBean,flowResponseBean,formResponseBean); callEntity.setStatus(CallStatusEnum.READY_TO_PUBLISH.getValue()); callRepository.save(callEntity); @@ -683,8 +676,7 @@ public class CallDao { return callEntity; } - public CallResponse updateCallStatus(Long callId, CallStatusEnum statusReq) { - CallEntity callEntity = validateCall(callId); + public CallResponse updateCallStatus(CallEntity callEntity, CallStatusEnum statusReq) { CallStatusEnum currentStatus = CallStatusEnum.valueOf(callEntity.getStatus()); validateStatusChange(currentStatus, statusReq); callEntity.setStatus(statusReq.getValue()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java index 0f917535..a849f67d 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DashboardDao.java @@ -32,23 +32,23 @@ public class DashboardDao { @Autowired private CompanyRepository companyRepository; - public SuperAdminWidgetResponseBean getDashboardWidget() { + public SuperAdminWidgetResponseBean getDashboardWidget(UserEntity requestedUserEntity) { SuperAdminWidgetResponseBean widgetResponseBean = new SuperAdminWidgetResponseBean(); - widgetResponseBean.setWidget1(createWidget1()); + widgetResponseBean.setWidget1(createWidget1(requestedUserEntity)); // List widgetBars = callRepository.findApplicationsPerCall(); // widgetResponseBean.setWidgetBars(widgetBars); return widgetResponseBean; } - private Widget1 createWidget1() { + private Widget1 createWidget1(UserEntity requestedUserEntity) { Widget1 widget1 = initializeWidget1(); - setActiveCalls(widget1); - setRegisteredUsers(widget1); - setTotalActiveFinancing(widget1); - setSubmittedApplications(widget1); - setDraftApplications(widget1); - setNumberOfCompanies(widget1); + setActiveCalls(widget1, requestedUserEntity); + setRegisteredUsers(widget1, requestedUserEntity); + setTotalActiveFinancing(widget1, requestedUserEntity); + setSubmittedApplications(widget1, requestedUserEntity); + setDraftApplications(widget1, requestedUserEntity); + setNumberOfCompanies(widget1, requestedUserEntity); return widget1; } @@ -59,41 +59,41 @@ public class DashboardDao { .build(); } - private void setActiveCalls(Widget1 widget1) { + private void setActiveCalls(Widget1 widget1, UserEntity requestedUserEntity) { Long activeCalls = callRepository.countByStatus(CallStatusEnum.PUBLISH.getValue()); if (activeCalls != null) { widget1.setNumberOfActiveCalls(activeCalls); } } - private void setRegisteredUsers(Widget1 widget1) { - Long activeUsers = userRepository.countByStatusAndRoleEntity_RoleType(UserStatusEnum.ACTIVE.getValue(), - RoleStatusEnum.ROLE_BENEFICIARY.getValue()); + private void setRegisteredUsers(Widget1 widget1, UserEntity requestedUserEntity) { + Long activeUsers = userRepository.countByStatusAndRoleEntityRoleTypeAndHubId(UserStatusEnum.ACTIVE.getValue(), + RoleStatusEnum.ROLE_BENEFICIARY.getValue(), requestedUserEntity.getHub().getId()); if (activeUsers != null) { widget1.setNumberOfResgisteredUsers(activeUsers); } } - private void setTotalActiveFinancing(Widget1 widget1) { + private void setTotalActiveFinancing(Widget1 widget1, UserEntity requestedUserEntity) { BigDecimal totalActiveFinancing = callRepository.findTotalAmountOfPublishedCalls(); widget1.setTotalActiveFinancing(totalActiveFinancing); } - private void setSubmittedApplications(Widget1 widget1) { + private void setSubmittedApplications(Widget1 widget1, UserEntity requestedUserEntity) { Long submittedApplications = applicationRepository.countSubmittedApplications(); if (submittedApplications != null) { widget1.setNumberOfSubmittedApplications(submittedApplications); } } - private void setDraftApplications(Widget1 widget1) { + private void setDraftApplications(Widget1 widget1, UserEntity requestedUserEntity) { Long draftApplications = applicationRepository.countDraftApplications(); if (draftApplications != null) { widget1.setNumberOfDraftApplications(draftApplications); } } - private void setNumberOfCompanies(Widget1 widget1) { + private void setNumberOfCompanies(Widget1 widget1, UserEntity requestedUserEntity) { Long numberOfCompanies = companyRepository.countTotalCompanies(); if (numberOfCompanies != null) { widget1.setNumberOfCompany(numberOfCompanies); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java index 5c43855e..9639e2a9 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/FormDao.java @@ -7,18 +7,17 @@ import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.ContentResponseBean; import net.gepafin.tendermanagement.model.response.FormResponseBean; import net.gepafin.tendermanagement.repositories.*; -import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.EvaluationCriteriaService; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.FieldValidator; import net.gepafin.tendermanagement.util.Utils; +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.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.util.CollectionUtils; import java.text.MessageFormat; import java.time.LocalDateTime; @@ -36,9 +35,6 @@ public class FormDao { @Autowired private FormRepository formRepository; - @Autowired - private CallService callService; - @Autowired private ApplicationFormRepository applicationFormRepository; @@ -57,6 +53,9 @@ public class FormDao { @Autowired private CallRepository callRepository; + @Autowired + private Validator validator; + @Autowired private CriteriaFormFieldRepository criteriaFormFieldRepository; @@ -67,10 +66,9 @@ public class FormDao { formEntity=formRepository.save(formEntity); return formEntity; } - - public FormEntity convertFormRequestToFormEntity(Long callId,FormRequest formRequest) { + + public FormEntity convertFormRequestToFormEntity(CallEntity callEntity, FormRequest formRequest){ FormEntity formEntity=new FormEntity(); - CallEntity callEntity=callService.getCallEntityById(callId); formEntity.setCall(callEntity); formEntity.setLabel(formRequest.getLabel()); formEntity.setContent(setContentResponseBean(formRequest.getContent())); @@ -99,11 +97,10 @@ public class FormDao { return contentList; } - public FormResponseBean createForm(Long callId,FormRequest formRequest){ + public FormResponseBean createForm(CallEntity callEntity,FormRequest formRequest){ validateForm(formRequest); - CallEntity callEntity=callService.validateCall(callId); - List flowDataEntities=flowDataRepository.findByCallId(callId); - List flowEdgesEntities=flowEdgesRepository.findByCallId(callId); + List flowDataEntities=flowDataRepository.findByCallId(callEntity.getId()); + List flowEdgesEntities=flowEdgesRepository.findByCallId(callEntity.getId()); if(Boolean.FALSE.equals(flowDataEntities.isEmpty() || flowDataEntities==null ) || Boolean.FALSE.equals(flowEdgesEntities.isEmpty() || flowEdgesEntities==null) ){ flowDataRepository.deleteAll(flowDataEntities); flowEdgesRepository.deleteAll(flowEdgesEntities); @@ -111,7 +108,7 @@ public class FormDao { callEntity.setFinalForm(null); callRepository.save(callEntity); } - FormEntity formEntity=convertFormRequestToFormEntity(callId,formRequest); + FormEntity formEntity=convertFormRequestToFormEntity(callEntity, formRequest); validateAndSaveCriteriaFormField(callEntity, formEntity, formRequest.getContent()); return convertFormEntityToFormResponseBean(formEntity); } @@ -170,87 +167,76 @@ public class FormDao { if(formRequest.getContent()==null || formRequest.getLabel()==null ){ throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REQUIRED_PARAMETER_NOT_FOUND_FOR_FORM)); } - } - - public FormResponseBean updateForm(Long formId, FormRequest formRequest, Boolean forceDeleteFlow) { - ContentRequestBean contentRequestBean2 = null; - String choosenField = null; - FormEntity formEntity = validateForm(formId); - callDao.validateUpdate(formEntity.getCall()); - List contentRequestBean = Utils.convertJsonStringToList(formEntity.getContent(), - ContentRequestBean.class); - for (ContentRequestBean contentRequestBean1 : contentRequestBean) { - FlowDataEntity flowDataEntity = flowDataRepository.findByFormIdAndChoosenField(formEntity.getId(), - contentRequestBean1.getId()); - if (flowDataEntity != null) { - choosenField = flowDataEntity.getChoosenField(); - if (Boolean.TRUE.equals(contentRequestBean1.getId().equals(choosenField))) { - contentRequestBean2 = contentRequestBean1; - break; - } - } - } - if (contentRequestBean2 != null) { - List settingRequestBeansDB = contentRequestBean2.getSettings(); - for (ContentRequestBean contentRequestBeanRequest : formRequest.getContent()) { - if (contentRequestBeanRequest.getId().equals(contentRequestBean2.getId())) { - for (SettingRequestBean settingRequestBeanRequest : contentRequestBeanRequest - .getSettings()) { - for (SettingRequestBean settingRequestBeanDB : settingRequestBeansDB) { - if (settingRequestBeanRequest.getName().equals(settingRequestBeanDB.getName())) { - if (!settingRequestBeanRequest.getValue() - .equals(settingRequestBeanDB.getValue())) { - if (Boolean.TRUE.equals(forceDeleteFlow)) { - Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, - formRequest.getLabel()); - Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, - setContentResponseBean(formRequest.getContent())); - formEntity.setUpdatedDate( - DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - formEntity = saveFormEntity(formEntity); - List flowDataEntities = flowDataRepository - .findByCallId(formEntity.getCall().getId()); - List flowEdgesEntities = flowEdgesRepository - .findByCallId(formEntity.getCall().getId()); - flowDataRepository.deleteAll(flowDataEntities); - flowEdgesRepository.deleteAll(flowEdgesEntities); - CallEntity callEntity = formEntity.getCall(); - callEntity.setInitialForm(null); - callEntity.setFinalForm(null); - callRepository.save(callEntity); - return convertFormEntityToFormResponseBean(formEntity); - } else { - throw new CustomValidationException(Status.BAD_REQUEST, - Translator.toLocale( - GepafinConstant.UPDATING_FORM_VALUE_IMPACT_ON_FLOW, - choosenField)); - } - } else { - Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, - formRequest.getLabel()); - Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, - setContentResponseBean(formRequest.getContent())); - formEntity - .setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - formEntity = saveFormEntity(formEntity); - return convertFormEntityToFormResponseBean(formEntity); - } - } - } - } - } - } - } else { - Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel()); - Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, - setContentResponseBean(formRequest.getContent())); - formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - formEntity = saveFormEntity(formEntity); - validateAndSaveCriteriaFormField(formEntity.getCall(), formEntity, formRequest.getContent()); - return convertFormEntityToFormResponseBean(formEntity); - } - return convertFormEntityToFormResponseBean(formEntity); - } + } + public FormResponseBean updateForm(UserEntity user, Long formId, FormRequest formRequest,Boolean forceDeleteFlow){ + ContentRequestBean contentRequestBean2=null; + String choosenField=null; + FormEntity formEntity = validateForm(formId); + validator.validateUserWithCall(user, formEntity.getCall().getId()); + callDao.validateUpdate(formEntity.getCall()); + List contentRequestBean = Utils.convertJsonStringToList(formEntity.getContent(), ContentRequestBean.class); + for (ContentRequestBean contentRequestBean1 : contentRequestBean) { + FlowDataEntity flowDataEntity = flowDataRepository.findByFormIdAndChoosenField(formEntity.getId(), contentRequestBean1.getId()); + if (flowDataEntity != null) { + choosenField = flowDataEntity.getChoosenField(); + if (Boolean.TRUE.equals(contentRequestBean1.getId().equals(choosenField))) { + contentRequestBean2 = contentRequestBean1; + break; + } + } + } + if (contentRequestBean2 != null) { + List settingRequestBeansDB = contentRequestBean2.getSettings(); + for (ContentRequestBean contentRequestBeanRequest : formRequest.getContent()) { + if (contentRequestBeanRequest.getId().equals(contentRequestBean2.getId())) { + for (SettingRequestBean settingRequestBeanRequest : contentRequestBeanRequest.getSettings()) { + for (SettingRequestBean settingRequestBeanDB : settingRequestBeansDB) { + if (settingRequestBeanRequest.getName().equals(settingRequestBeanDB.getName())) { + if (!settingRequestBeanRequest.getValue().equals(settingRequestBeanDB.getValue())) { + if (Boolean.TRUE.equals(forceDeleteFlow)) { + Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel()); + Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent())); + formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + formEntity = saveFormEntity(formEntity); + List flowDataEntities = flowDataRepository.findByCallId(formEntity.getCall().getId()); + List flowEdgesEntities = flowEdgesRepository.findByCallId(formEntity.getCall().getId()); + flowDataRepository.deleteAll(flowDataEntities); + flowEdgesRepository.deleteAll(flowEdgesEntities); + CallEntity callEntity = formEntity.getCall(); + callEntity.setInitialForm(null); + callEntity.setFinalForm(null); + callRepository.save(callEntity); + return convertFormEntityToFormResponseBean(formEntity); + } else { + throw new CustomValidationException( + Status.BAD_REQUEST, + Translator.toLocale(GepafinConstant.UPDATING_FORM_VALUE_IMPACT_ON_FLOW, choosenField) + ); + } + } + else { + Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel()); + Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent())); + formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + formEntity = saveFormEntity(formEntity); + return convertFormEntityToFormResponseBean(formEntity); + } + } + } + } + } + } + } + else { + Utils.setIfUpdated(formEntity::getLabel, formEntity::setLabel, formRequest.getLabel()); + Utils.setIfUpdated(formEntity::getContent, formEntity::setContent, setContentResponseBean(formRequest.getContent())); + formEntity.setUpdatedDate(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + formEntity = saveFormEntity(formEntity); + validateAndSaveCriteriaFormField(formEntity.getCall(), formEntity, formRequest.getContent()); + return convertFormEntityToFormResponseBean(formEntity); + } + return convertFormEntityToFormResponseBean(formEntity); + } public FormEntity validateForm(Long formId) { FormEntity formEntity = formRepository.findById(formId) @@ -258,12 +244,14 @@ public class FormDao { return formEntity; } - public FormResponseBean getFormEntityById(Long formId) { + public FormResponseBean getFormEntityById(UserEntity user, Long formId) { FormEntity formEntity = validateForm(formId); + validator.validateUserWithCall(user, formEntity.getCall().getId()); return convertFormEntityToFormResponseBean(formEntity); } - public void deleteFormById(Long formId){ + public void deleteFormById(UserEntity user, Long formId){ FormEntity formEntity = validateForm(formId); + validator.validateUserWithCall(user, formEntity.getCall().getId()); List flowDataEntities=flowDataRepository.findByCallId(formEntity.getCall().getId()); List flowEdgesEntities=flowEdgesRepository.findByCallId(formEntity.getCall().getId()); flowDataRepository.deleteAll(flowDataEntities); @@ -274,13 +262,12 @@ public class FormDao { callRepository.save(callEntity); formRepository.delete(formEntity); } - public List getFormsByCallId(Long callId){ - CallEntity callEntity=callService.validateCall(callId); + public List getFormsByCallId(CallEntity callEntity){ if(callEntity== null){ throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.CALL_NOT_FOUND)); } - List formEntities=formRepository.findByCallId(callId); + List formEntities=formRepository.findByCallId(callEntity.getId()); List formResponseBeanList = formEntities.stream() .map(req -> convertFormEntityToFormResponseBean(req)) .collect(Collectors.toList()); @@ -385,12 +372,13 @@ public class FormDao { String error=null; if (value!=null && value.matches("^\\d{1,11}$")) { - Map customData=null; +// Map customData=null; try { - Map vatCheckResponse = vatCheckDao.checkVatNumberApi(value); - if (Boolean.FALSE.equals(CollectionUtils.isEmpty(vatCheckResponse))) { - customData = vatCheckResponse; - } +// Map vatCheckResponse = vatCheckDao.checkVatNumberApi(value); + vatCheckDao.checkVatNumberApi(value); +// if (Boolean.FALSE.equals(CollectionUtils.isEmpty(vatCheckResponse))) { +// customData = vatCheckResponse; +// } } catch (Exception e) { error=(MessageFormat.format(Translator.toLocale(GepafinConstant.VALIDATION_VALID_PIVA), fieldId)); } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java b/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java new file mode 100644 index 00000000..3d5d6e7d --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/dao/HubDao.java @@ -0,0 +1,100 @@ +package net.gepafin.tendermanagement.dao; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.HubEntity; +import net.gepafin.tendermanagement.model.request.HubReq; +import net.gepafin.tendermanagement.model.response.HubResponseBean; +import net.gepafin.tendermanagement.model.util.NanoIdUtils; +import net.gepafin.tendermanagement.repositories.HubRepository; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.List; + + +@Component +public class HubDao { + + @Autowired + private HubRepository hubRepository; + + public HubResponseBean createHub(HubReq hubReq) { + HubEntity hubEntity = createOrUpdateHubEntity(new HubEntity(), hubReq); + hubRepository.save(hubEntity); + return convertToHubResponseBean(hubEntity); + } + + public HubResponseBean updateHub(Long hubId, HubReq hubReq) { + HubEntity hubEntity = validateHub(hubId); + createOrUpdateHubEntity(hubEntity, hubReq); + return convertToHubResponseBean(hubEntity); + } + + public HubResponseBean getHubById(Long hubId) { + return convertToHubResponseBean(validateHub(hubId)); + } + + public List getAllHubs() { + List hubs = hubRepository.findAll(); + return hubs.stream().map(this::convertToHubResponseBean).toList(); + } + + public void deleteHub(Long hubId) { + HubEntity hubEntity = validateHub(hubId); + hubRepository.deleteById(hubId); + hubRepository.save(hubEntity); + } + + private HubEntity validateHub(Long hubId) { + return hubRepository.findById(hubId) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.HUB_NOT_FOUND))); + } + + private HubEntity createOrUpdateHubEntity(HubEntity hubEntity, HubReq hubReq) { + hubEntity.setCompanyName(hubReq.getCompanyName()); + hubEntity.setFirstName(hubReq.getFirstName()); + hubEntity.setLastName(hubReq.getLastName()); + hubEntity.setEmail(hubReq.getEmail()); + hubEntity.setCity(hubReq.getCity()); + hubEntity.setCountry(hubReq.getCountry()); + hubEntity.setVatNumber(hubReq.getVatNumber()); + hubEntity.setUniqueUuid(NanoIdUtils.randomNanoId()); + hubEntity.setDomainName(hubReq.getDomainName()); + hubEntity.setAppConfig(hubReq.getAppConfig() != null ? hubReq.getAppConfig().toString() : null); + hubEntity.setCreatedDate(hubEntity.getCreatedDate() == null ? LocalDateTime.now() : hubEntity.getCreatedDate()); + hubEntity.setUpdatedDate(LocalDateTime.now()); + return hubEntity; + } + + private HubResponseBean convertToHubResponseBean(HubEntity hubEntity) { + HubResponseBean responseBean = new HubResponseBean(); + responseBean.setId(hubEntity.getId()); + responseBean.setCompanyName(hubEntity.getCompanyName()); + responseBean.setFirstName(hubEntity.getFirstName()); + responseBean.setLastName(hubEntity.getLastName()); + responseBean.setEmail(hubEntity.getEmail()); + responseBean.setCity(hubEntity.getCity()); + responseBean.setCountry(hubEntity.getCountry()); + responseBean.setVatNumber(hubEntity.getVatNumber()); + responseBean.setUniqueUuid(hubEntity.getUniqueUuid()); + responseBean.setDomainName(hubEntity.getDomainName()); + responseBean.setAppConfig(hubEntity.getAppConfig()); + responseBean.setCreatedDate(hubEntity.getCreatedDate()); + responseBean.setUpdatedDate(hubEntity.getUpdatedDate()); + return responseBean; + } + + public HubEntity getHubByUuid(String hubUuid) { + return hubRepository.findByUniqueUuid(hubUuid).orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.HUB_NOT_FOUND))); + } + + public HubResponseBean getHubByHubUuid(String uuid) { + return convertToHubResponseBean(getHubByUuid(uuid)); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java index 17b57fc6..6fa9b56a 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/PdfDao.java @@ -2,12 +2,6 @@ package net.gepafin.tendermanagement.dao; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.itextpdf.kernel.colors.ColorConstants; -import com.itextpdf.kernel.colors.DeviceRgb; -import com.itextpdf.kernel.pdf.canvas.PdfCanvas; -import com.itextpdf.layout.properties.UnitValue; -import com.itextpdf.layout.renderer.CellRenderer; -import com.itextpdf.layout.renderer.DrawContext; import com.itextpdf.text.*; import com.itextpdf.text.Element; import com.itextpdf.text.Font; @@ -16,28 +10,17 @@ import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.*; import jakarta.servlet.http.HttpServletRequest; -import net.gepafin.tendermanagement.config.Translator; -import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.*; -import net.gepafin.tendermanagement.model.request.CustomPageEvent; import net.gepafin.tendermanagement.model.request.FieldLabelValuePairRequest; import net.gepafin.tendermanagement.model.response.*; -import net.gepafin.tendermanagement.repositories.ApplicationRepository; import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.util.Validator; -import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; -import net.gepafin.tendermanagement.web.rest.api.errors.Status; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.itextpdf.layout.element.Table; -import com.itextpdf.layout.element.Cell; //import com.itextpdf.layout.element. -import java.awt.*; import java.io.ByteArrayOutputStream; -import java.io.FileOutputStream; -import java.io.IOException; import java.util.*; import java.util.List; import java.util.stream.Collectors; @@ -128,7 +111,7 @@ public class PdfDao { // addLabelValuePair(document, "Con il titolo di", "Rappresentante legale", regularFont); document.add(new Paragraph(" ")); - ApplicationGetResponseBean applicationGetResponseBean=applicationDao.getApplicationByFormId(applicationId,null, userEntity); + ApplicationGetResponseBean applicationGetResponseBean=applicationDao.getApplicationByFormId(request, applicationId, null); for(FormApplicationResponse formApplicationResponse: applicationGetResponseBean.getForm()) { document.add(new Paragraph(formApplicationResponse.getLabel(),sectionFont)); document.add(new Paragraph(" ")); // Add line break diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 1e8ed547..dafd9cf7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -2,6 +2,7 @@ package net.gepafin.tendermanagement.dao; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import net.gepafin.tendermanagement.config.SamlSuccessHandler; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.BeneficiaryEntity; @@ -17,10 +18,10 @@ 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.CompanyService; import net.gepafin.tendermanagement.service.RoleService; import net.gepafin.tendermanagement.service.impl.AuthenticationService; import net.gepafin.tendermanagement.util.Utils; +import net.gepafin.tendermanagement.util.Validator; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; @@ -29,11 +30,12 @@ import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Component; -import org.springframework.stereotype.Repository; - +import java.util.ArrayList; import java.util.List; + import java.util.stream.Collectors; import static net.gepafin.tendermanagement.util.Utils.setIfUpdated; @@ -45,26 +47,40 @@ public class UserDao { @Autowired private UserRepository userRepository; + @Autowired private CompanyDao companyDao; + @Autowired private AuthenticationService authService; @Autowired private PasswordEncoder passwordEncoder; - + @Autowired private RoleDao roleDao; @Autowired private BeneficiaryRepository beneficiaryRepository; + @Autowired private RoleService roleService; + + @Value("${default.hub.uuid}") + private String defaultHubUuid; + + @Autowired + private Validator validator; + + @Autowired + private SamlSuccessHandler samlSuccessHandler; public JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq) { - - validateUserRequest(tempToken, userReq); + if(StringUtils.isEmpty(userReq.getHubUuid())) { + userReq.setHubUuid(defaultHubUuid); + } + validateUserRequest(request, tempToken, userReq); validatePassword(userReq.getPassword(), userReq.getConfPassword(), tempToken); RoleEntity roleEntity = getRoleEntity(userReq.getRoleId()); @@ -99,14 +115,21 @@ public class UserDao { return beneficiaryEntity; } - private void validateUserRequest(String tempToken, UserReq userReq) { + private void validateUserRequest(HttpServletRequest request, String tempToken, UserReq userReq) { + + if (tempToken == null) { + validator.validateRequest(request,RoleStatusEnum.ROLE_SUPER_ADMIN); + }else { + samlSuccessHandler.validateToken(tempToken, userReq.getCodiceFiscale(), userReq.getHubUuid()); + } + RoleEntity role = roleService.validateRole(userReq.getRoleId()); if (Boolean.FALSE.equals(Utils.isValidEmail(userReq.getEmail()))) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.VALIDATE_EMAIL)); } log.info("Creating user with email: {}", userReq.getEmail()); - if (userRepository.existsByEmailIgnoreCase(userReq.getEmail())) { + if (userRepository.existsByEmailIgnoreCaseAndHubUniqueUuid(userReq.getEmail(), userReq.getHubUuid())) { log.error("User creation failed: Email {} already exists", userReq.getEmail()); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.EMAIL_ALREADY_EXISTS)); @@ -269,6 +292,9 @@ public class UserDao { public JWTToken login(LoginReq loginReq,HttpServletRequest request) { log.info("User login attempt for email: {}", loginReq.getEmail()); + if(StringUtils.isEmpty(loginReq.getHubUuid())) { + loginReq.setHubUuid(defaultHubUuid); + } JWTToken jwtToken = authService.login(loginReq,request); log.info("Login successful for email: {}", loginReq.getEmail()); return jwtToken; @@ -289,11 +315,11 @@ public class UserDao { } public String initiatePasswordReset(InitiatePasswordResetReq resetReq) { - UserEntity user = userRepository.findByEmail(resetReq.getEmail()); - if (user == null) { - log.info("Password reset attempt for non-existent user: {}", resetReq.getEmail()); - throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); - } + UserEntity user = userRepository + .findByEmailIgnoreCaseAndHubUniqueUuid(resetReq.getEmail(), resetReq.getHubUuid()) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); + String token = Utils.generateSecureToken(); user.setResetPasswordToken(token); userRepository.save(user); @@ -302,11 +328,11 @@ public class UserDao { } public Boolean resetPassword(ResetPasswordReq resetPasswordReq) { - UserEntity user = userRepository.findByEmail(resetPasswordReq.getEmail()); - if (user == null) { - log.info("Password reset attempt for non-existent user: {}", resetPasswordReq.getEmail()); - throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); - } + UserEntity user = userRepository + .findByEmailIgnoreCaseAndHubUniqueUuid(resetPasswordReq.getEmail(), resetPasswordReq.getHubUuid()) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); + if (!resetPasswordReq.getNewPassword().equals(resetPasswordReq.getConfirmPassword())) { log.info("User creation failed: Passwords do not match for email {}", user.getEmail()); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.PASSWORD_DOESNT_MATCH)); @@ -325,12 +351,12 @@ public class UserDao { return true; } - public Boolean changePassword(ChangePasswordRequest request) { - UserEntity user = userRepository.findByEmail(request.getEmail()); - if (user == null) { - log.info("Password reset attempt for non-existent user: {}", request.getEmail()); - throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); - } + public Boolean changePassword(UserEntity userEntity, ChangePasswordRequest request) { + UserEntity user = userRepository + .findByEmailIgnoreCaseAndHubUniqueUuid(request.getEmail(), userEntity.getHub().getUniqueUuid()) + .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); + if (!passwordEncoder.matches(request.getPassword(), user.getPassword())) { throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.CURRENT_PASSWORD_INCORRECT)); } @@ -355,6 +381,16 @@ public class UserDao { log.info("User status updated to {} for user ID: {}", statusReq, userId); return convertUserEntityToUserResponse(userEntity); } + public List getUserByHubId(String hubId) { +// log.info("Fetching users for hub ID: {}", hubId); +// List userHubMappings = userHubRepository.findByHubId(hubId); + List userResponseBeans = new ArrayList<>(); +// for (UserHubEntity mapping : userHubMappings) { +// UserEntity userEntity = validateUser(mapping.getUserId()); +// userResponseBeans.add(convertUserEntityToUserResponse(userEntity)); +// } + return userResponseBeans; + } public JWTToken validateExistingUserToken(String token) { return authService.validateExistingUserToken(token); @@ -364,15 +400,15 @@ public class UserDao { return authService.validateNewUserToken(token); } - public List getAllUsers(Long roleId) { + public List getAllUsers(UserEntity user, Long roleId) { List users; if (roleId != null) { log.info("Fetching users by role ID: {}", roleId); RoleEntity roleEntity=roleService.validateRole(roleId); - users = userRepository.findByRoleEntityId(roleEntity.getId()); + users = userRepository.findByRoleEntityIdAndHubId(roleEntity.getId(), user.getHub().getId()); } else { log.info("Fetching all users"); - users = userRepository.findAll(); + users = userRepository.findByHubId(user.getHub().getId()); } List userResponseBeans = users.stream() .map(this::convertUserEntityToUserResponse) diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java index f0bb3896..1c6181b2 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java @@ -84,5 +84,9 @@ public class CallEntity extends BaseEntity { @Column(name = "END_TIME") private LocalTime endTime; + + @ManyToOne + @JoinColumn(name = "HUB_ID") + private HubEntity hub; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java new file mode 100644 index 00000000..1b03f913 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/HubEntity.java @@ -0,0 +1,45 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; + + +@Entity +@Table(name="hub") +@Setter +@Getter +public class HubEntity extends BaseEntity{ + + @Column(name = "COMPANY_NAME") + private String companyName; + + @Column(name = "FIRST_NAME") + private String firstName; + + @Column(name = "LAST_NAME") + private String lastName; + + @Column(name = "EMAIL") + private String email; + + @Column(name = "CITY") + private String city; + + @Column(name = "COUNTRY") + private String country; + + @Size(min=5,max=15) + @Column(name = "VAT_NUMBER") + private String vatNumber; + + @Column(name = "DOMAIN_NAME") + private String domainName; + + @Column(name = "APP_CONFIG") + private String appConfig; + + @Column(name = "UNIQUE_UUID") + private String uniqueUuid; +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/HubUserEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/HubUserEntity.java new file mode 100644 index 00000000..1bec68ce --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/entities/HubUserEntity.java @@ -0,0 +1,22 @@ +package net.gepafin.tendermanagement.entities; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; + +@Entity +@Table(name = "hub_user") +@Getter +@Setter +public class HubUserEntity extends BaseEntity{ + + @ManyToOne + @JoinColumn(name = "hub_id", nullable = false) + private HubEntity hub; + + @ManyToOne + @JoinColumn(name = "user_id", nullable = false) + private UserEntity user; + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/entities/ProtocolEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/ProtocolEntity.java index 0924c922..ad57c1ee 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/ProtocolEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/ProtocolEntity.java @@ -24,5 +24,8 @@ public class ProtocolEntity extends BaseEntity { @Column(name="APPLICATION_ID") private Long applicationId; + + @Column(name="HUB_ID") + private Long hubId; } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseEntity.java index 732edfd9..05535e97 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/SamlResponseEntity.java @@ -13,6 +13,21 @@ public class SamlResponseEntity extends BaseEntity{ @Column(name = "AUTHENTICATION_OBJECT") private String authenticationObject; + @Column(name = "IN_RESPONSE_TO") + private String inResponseTo; + + @Column(name = "ISSUE_INSTANT") + private String issueInstant; + + @Column(name = "SAML_ID") + private String samlId; + + @Column(name = "HUB_UUID") + private String hubUuid; + + @Column(name = "STATUS") + private String status; + @Column(name = "TOKEN") private String token; diff --git a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java index f8d34ea2..606f52d9 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/UserEntity.java @@ -65,4 +65,8 @@ public class UserEntity extends BaseEntity { @OneToOne @JoinColumn(name = "BENEFICIARY_ID") private BeneficiaryEntity beneficiary; + + @ManyToOne + @JoinColumn(name = "HUB_ID") + private HubEntity hub; } diff --git a/src/main/java/net/gepafin/tendermanagement/enums/SamlResponseStatusEnum.java b/src/main/java/net/gepafin/tendermanagement/enums/SamlResponseStatusEnum.java new file mode 100644 index 00000000..27e58a4b --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/enums/SamlResponseStatusEnum.java @@ -0,0 +1,21 @@ +package net.gepafin.tendermanagement.enums; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum SamlResponseStatusEnum { + + SUCCESS("SUCCESS"), + FAILED("FAILED"), + INITIATED("INITIATED"); + + private String value; + + SamlResponseStatusEnum(String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/HubReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/HubReq.java new file mode 100644 index 00000000..123c84fc --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/HubReq.java @@ -0,0 +1,38 @@ +package net.gepafin.tendermanagement.model.request; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import lombok.Getter; +import lombok.Setter; + +import java.util.Map; + + +@Getter +@Setter +public class HubReq { + + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private Long id; + + private String companyName; + + private String firstName; + + private String lastName; + + private String email; + + private String city; + + private String country; + + private String vatNumber; + + private String domainName; + + private Map appConfig; + + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private String uniqueUuid; +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/InitiatePasswordResetReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/InitiatePasswordResetReq.java index ae2ba0d0..fac4150e 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/InitiatePasswordResetReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/InitiatePasswordResetReq.java @@ -5,4 +5,5 @@ import lombok.Data; @Data public class InitiatePasswordResetReq { private String email; + private String hubUuid; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/LoginReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/LoginReq.java index d337d231..9675eae5 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/LoginReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/LoginReq.java @@ -14,5 +14,6 @@ public class LoginReq { private String email; @NotEmpty private String password; + private String hubUuid; private Boolean rememberMe; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/ResetPasswordReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/ResetPasswordReq.java index 019ca582..f3d6b05c 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/ResetPasswordReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/ResetPasswordReq.java @@ -8,6 +8,6 @@ public class ResetPasswordReq { private String token; private String newPassword; private String confirmPassword; - + private String hubUuid; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java index 14111818..5365be30 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java @@ -39,4 +39,8 @@ public class UserReq { private Boolean thirdParty; private String emailPec; + + private String hubUuid; + + } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/HubResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/HubResponseBean.java new file mode 100644 index 00000000..881cdb8e --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/response/HubResponseBean.java @@ -0,0 +1,34 @@ +package net.gepafin.tendermanagement.model.response; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; +import net.gepafin.tendermanagement.model.BaseBean; + +import java.util.Map; +@Getter +@Setter +public class HubResponseBean extends BaseBean { + + private String companyName; + + private String firstName; + + private String lastName; + + private String email; + + private String city; + + private String country; + + private String vatNumber; + + private String appConfig; + + private String domainName; + @JsonProperty(access = JsonProperty.Access.READ_ONLY) + private String uniqueUuid; + + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/util/NanoIdUtils.java b/src/main/java/net/gepafin/tendermanagement/model/util/NanoIdUtils.java new file mode 100644 index 00000000..f2a8d5e7 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/util/NanoIdUtils.java @@ -0,0 +1,129 @@ +/** + * Copyright (c) 2017 The JNanoID Authors + * Copyright (c) 2017 Aventrix LLC + * Copyright (c) 2017 Andrey Sitnik + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +package net.gepafin.tendermanagement.model.util; + +import java.security.SecureRandom; +import java.util.Random; + + +public final class NanoIdUtils { + + /** + * NanoIdUtils instances should NOT be constructed in standard programming. + * Instead, the class should be used as NanoIdUtils.randomNanoId();. + */ + private NanoIdUtils() { + //Do Nothing + } + + /** + * The default random number generator used by this class. + * Creates cryptographically strong NanoId Strings. + */ + public static final SecureRandom DEFAULT_NUMBER_GENERATOR = new SecureRandom(); + + /** + * The default alphabet used by this class. + * Creates url-friendly NanoId Strings using 64 unique symbols. + */ + public static final char[] DEFAULT_ALPHABET = + "_-0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray(); + + /** + * The default size used by this class. + * Creates NanoId Strings with slightly more unique values than UUID v4. + */ + public static final int DEFAULT_SIZE = 21; + + /** + * Static factory to retrieve a url-friendly, pseudo randomly generated, NanoId String. + * + * The generated NanoId String will have 21 symbols. + * + * The NanoId String is generated using a cryptographically strong pseudo random number + * generator. + * + * @return A randomly generated NanoId String. + */ + public static String randomNanoId() { + return randomNanoId(DEFAULT_NUMBER_GENERATOR, DEFAULT_ALPHABET, DEFAULT_SIZE); + } + + /** + * Static factory to retrieve a NanoId String. + * + * The string is generated using the given random number generator. + * + * @param random The random number generator. + * @param alphabet The symbols used in the NanoId String. + * @param size The number of symbols in the NanoId String. + * @return A randomly generated NanoId String. + */ + public static String randomNanoId(final Random random, final char[] alphabet, final int size) { + + if (random == null) { + throw new IllegalArgumentException("random cannot be null."); + } + + if (alphabet == null) { + throw new IllegalArgumentException("alphabet cannot be null."); + } + + if (alphabet.length == 0 || alphabet.length >= 256) { + throw new IllegalArgumentException("alphabet must contain between 1 and 255 symbols."); + } + + if (size <= 0) { + throw new IllegalArgumentException("size must be greater than zero."); + } + + double value = (double) (alphabet.length - 1); + + final int mask = (2 << (int) Math.floor(Math.log(value) / Math.log(2))) - 1; + final int step = (int) Math.ceil(1.6 * mask * size / alphabet.length); + + final StringBuilder idBuilder = new StringBuilder(); + + while (true) { + + final byte[] bytes = new byte[step]; + random.nextBytes(bytes); + + for (int i = 0; i < step; i++) { + + final int alphabetIndex = bytes[i] & mask; + + if (alphabetIndex < alphabet.length) { + idBuilder.append(alphabet[alphabetIndex]); + if (idBuilder.length() == size) { + return idBuilder.toString(); + } + } + + } + + } + + } +} \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/HubRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/HubRepository.java new file mode 100644 index 00000000..cc54295a --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/repositories/HubRepository.java @@ -0,0 +1,15 @@ +package net.gepafin.tendermanagement.repositories; + +import net.gepafin.tendermanagement.entities.HubEntity; + +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface HubRepository extends JpaRepository { + + Optional findByUniqueUuid(String hubUuid); + +} diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/ProtocolRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/ProtocolRepository.java index 8bdfb553..419d69b8 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/ProtocolRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/ProtocolRepository.java @@ -3,11 +3,12 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.ProtocolEntity; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository public interface ProtocolRepository extends JpaRepository { - @Query("SELECT MAX(p.protocolNumber) FROM ProtocolEntity p") - Integer findMaxProtocolNumber(); + @Query("SELECT MAX(p.protocolNumber) FROM ProtocolEntity p where p.hubId = :hubId") + Long findMaxProtocolNumberAndHubId(@Param("hubId") Long hubId); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseRepository.java index 9183f339..3194ef1a 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/SamlResponseRepository.java @@ -1,5 +1,7 @@ package net.gepafin.tendermanagement.repositories; +import java.util.Optional; + import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -10,4 +12,6 @@ public interface SamlResponseRepository extends JpaRepository findByInResponseToAndStatus(String inResponseTo, String status); + } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java index c6a6af79..e474fccf 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java @@ -1,7 +1,6 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.UserEntity; -import net.gepafin.tendermanagement.model.response.UserResponseBean; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -11,17 +10,27 @@ import java.util.Optional; @Repository public interface UserRepository extends JpaRepository { - Optional findByEmailIgnoreCase(String email); +// Optional findByEmailIgnoreCase(String email); - boolean existsByEmailIgnoreCase(String email); +// boolean existsByEmailIgnoreCase(String email); - UserEntity findByEmail(String email); +// UserEntity findByEmail(String email); Optional findByBeneficiaryCodiceFiscale(String codiceFiscale); boolean existsByBeneficiaryCodiceFiscale(String codiceFiscale); + UserEntity findByBeneficiaryId(Long beneficiaryId); - Long countByStatusAndRoleEntity_RoleType(String status, String roleName); - List findByRoleEntityId(Long roleId); + Long countByStatusAndRoleEntityRoleType(String status, String roleName); + + Optional findByEmailIgnoreCaseAndHubUniqueUuid(String email, String hubId); + + boolean existsByEmailIgnoreCaseAndHubUniqueUuid(String email, String hubUuid); + + List findByRoleEntityIdAndHubId(Long roleId, Long hubId); + + List findByHubId(Long hubId); + + Long countByStatusAndRoleEntityRoleTypeAndHubId(String status, String roleName, Long hubId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index 9a62d89d..8abe4cb5 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -19,13 +19,11 @@ public interface CallService { CallResponse updateCallStep1(HttpServletRequest request, Long callId, UpdateCallRequestStep1 updateCallRequest); - CallResponse getCallById (Long callId); + CallResponse getCallById (HttpServletRequest request, Long callId); List getAllCalls(HttpServletRequest request); - CallResponse validateCallData(Long callId); - - CallEntity getCallEntityById(Long id); + CallResponse validateCallData(HttpServletRequest request, Long callId); CallResponse updateCallStatus(HttpServletRequest request, Long callId, CallStatusEnum statusReq); diff --git a/src/main/java/net/gepafin/tendermanagement/service/HubService.java b/src/main/java/net/gepafin/tendermanagement/service/HubService.java new file mode 100644 index 00000000..397bc533 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/HubService.java @@ -0,0 +1,18 @@ +package net.gepafin.tendermanagement.service; + + +import net.gepafin.tendermanagement.entities.HubEntity; +import net.gepafin.tendermanagement.model.request.HubReq; +import net.gepafin.tendermanagement.model.response.HubResponseBean; + +import java.util.List; + +public interface HubService { + HubResponseBean createHub(HubReq hubReq); + HubResponseBean updateHub(Long hubId, HubReq hubReq); + HubResponseBean getHubById(Long hubId); + List getAllHubs(); + void deleteHub(Long hubId); + HubEntity getHubByUuid(String hubUuid); + HubResponseBean getHubByHubUuid(String uuid); +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/UserService.java b/src/main/java/net/gepafin/tendermanagement/service/UserService.java index 81204815..9a1bdf9a 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/UserService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/UserService.java @@ -31,7 +31,7 @@ public interface UserService { Boolean resetPassword(ResetPasswordReq resetPasswordReq); - Boolean changePassword(ChangePasswordRequest request); + Boolean changePassword(HttpServletRequest httpServletRequest, ChangePasswordRequest request); void logoutUser(HttpServletRequest request, HttpServletResponse response); @@ -45,6 +45,6 @@ public interface UserService { UserEntity getUserByBeneficiaryId(Long beneficiaryId); public UserEntity getUserEntityById(Long userId); - List getAllUsers(Long roleId); + List getAllUsers(HttpServletRequest request, Long roleId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java index 1ea6e7ea..382f5372 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -40,21 +40,19 @@ public class ApplicationServiceImpl implements ApplicationService { @Transactional(rollbackFor = Exception.class) public ApplicationResponseBean createApplication(HttpServletRequest request, ApplicationRequestBean applicationRequestBean, Long applicationId, Long formId) { - UserEntity userEntity = validator.validateUser(request); - return applicationDao.createApplication(applicationRequestBean, userEntity, formId, applicationId); + return applicationDao.createApplication(request, applicationRequestBean, formId, applicationId); } @Override @Transactional(readOnly = true) public ApplicationGetResponseBean getApplicationByFormId(HttpServletRequest request, Long applicationId,Long formId) { - UserEntity userEntity = validator.validateUser(request); - return applicationDao.getApplicationByFormId(applicationId,formId,userEntity); + return applicationDao.getApplicationByFormId(request, applicationId,formId); } @Override @Transactional(rollbackFor = Exception.class) public void deleteApplication(HttpServletRequest request, Long applicationId) { - applicationDao.deleteById(applicationId); + applicationDao.deleteById(request, applicationId); } @Override @@ -74,14 +72,14 @@ public class ApplicationServiceImpl implements ApplicationService { public NextOrPreviousFormResponse getNextOrPreviousForm(HttpServletRequest request, Long applicationId, Long formId, FormActionEnum action) { ApplicationEntity applicationEntity = validateApplication(applicationId); + validator.validateUserWithCompany(request, applicationEntity.getCompany().getId()); return flowFormDao.getNextOrPreviousForm(applicationEntity, formId, action); } @Override @Transactional(rollbackFor = Exception.class) public ApplicationResponse updateApplicationStatus(HttpServletRequest request, Long applicationId, ApplicationStatusTypeEnum status) { - UserEntity userEntity = validator.validateUser(request); - return applicationDao.updateApplicationStatus(userEntity, applicationId, status); + return applicationDao.updateApplicationStatus(request, applicationId, status); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java index a4559233..95eb6763 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -70,17 +70,18 @@ public class AuthenticationService { this.authenticationManager = authenticationManager; } - public JWTToken login(LoginReq loginReq,HttpServletRequest request) { + public JWTToken login(LoginReq loginReq, HttpServletRequest request) { UserEntity user=null; LoginAttemptEntity loginAttemptEntity = prepareLoginAttemptEntity(loginReq, request); log.info("Attempting login for email: {}", loginReq.getEmail()); + String emailWithHubId = loginReq.getEmail()+":"+loginReq.getHubUuid(); UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( - loginReq.getEmail(), loginReq.getPassword()); + emailWithHubId, loginReq.getPassword()); Authentication authentication = this.authenticationManager.authenticate(authenticationToken); SecurityContextHolder.getContext().setAuthentication(authentication); log.info("Authentication successful for email: {}", loginReq.getEmail()); - user = userRepository.findByEmailIgnoreCase(loginReq.getEmail()) + user = userRepository.findByEmailIgnoreCaseAndHubUniqueUuid(loginReq.getEmail(), loginReq.getHubUuid()) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); loginAttemptEntity.setUserId(user.getId()); diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java index f6ca0b66..281b33b1 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -1,7 +1,6 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; -import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.dao.CallDao; import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.UserEntity; @@ -12,12 +11,13 @@ import net.gepafin.tendermanagement.model.request.UpdateCallRequestStep1; import net.gepafin.tendermanagement.model.response.CallDetailsResponseBean; import net.gepafin.tendermanagement.model.response.CallResponse; import net.gepafin.tendermanagement.service.CallService; +import net.gepafin.tendermanagement.util.Validator; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.Map; @Service @@ -27,59 +27,61 @@ public class CallServiceImpl implements CallService { private CallDao callDao; @Autowired - private TokenProvider tokenProvider; + private Validator validator; @Override @Transactional(rollbackFor = Exception.class) public CallResponse createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest) { - Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); - return callDao.createCallStep1(createCallRequest, Long.parseLong(userInfo.get("userId").toString())); + UserEntity user = validator.validateUser(request); + return callDao.createCallStep1(createCallRequest, user); } @Override @Transactional(rollbackFor = Exception.class) public CallResponse createCallStep2(HttpServletRequest request, Long callId, CreateCallRequestStep2 createCallRequest) { - Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); - return callDao.createCallStep2(callId, createCallRequest, Long.parseLong(userInfo.get("userId").toString())); + UserEntity user = validator.validateUser(request); + CallEntity call = validator.validateUserWithCall(user, callId); + return callDao.createCallStep2(call, createCallRequest, user); } @Override @Transactional(rollbackFor = Exception.class) public CallResponse updateCallStep1(HttpServletRequest request, Long callId, UpdateCallRequestStep1 updateCallRequest) { - Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); - return callDao.updateCallStep1(callId, updateCallRequest, Long.parseLong(userInfo.get("userId").toString())); + UserEntity user = validator.validateUser(request); + CallEntity call = validator.validateUserWithCall(user, callId); + return callDao.updateCallStep1(call, updateCallRequest, user); } @Override @Transactional(readOnly = true) - public CallResponse getCallById(Long callId) { - return callDao.getCallById(callId); + public CallResponse getCallById(HttpServletRequest request, Long callId) { + UserEntity user = validator.validateUser(request); + CallEntity call = validator.validateUserWithCall(user, callId); + return callDao.getCallById(call); } @Override @Transactional(readOnly = true) public List getAllCalls(HttpServletRequest request) { - Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); - UserEntity user=tokenProvider.validateUser(userInfo); + UserEntity user = validator.validateUser(request); return callDao.getAllCalls(user); } @Override @Transactional(rollbackFor = Exception.class) - public CallResponse validateCallData(Long callId) { - return callDao.validateCallData(callDao.validateCall(callId)); - } - - @Override - public CallEntity getCallEntityById(Long id){ - return callDao.getCallEntityById(id); + public CallResponse validateCallData(HttpServletRequest request, Long callId) { + UserEntity user = validator.validateUser(request); + CallEntity call = validator.validateUserWithCall(user, callId); + return callDao.validateCallData(call); } @Override @Transactional(rollbackFor = Exception.class) public CallResponse updateCallStatus(HttpServletRequest request, Long callId, CallStatusEnum statusReq) { - return callDao.updateCallStatus(callId, statusReq); + UserEntity user = validator.validateUser(request); + CallEntity call = validator.validateUserWithCall(user, callId); + return callDao.updateCallStatus(call, statusReq); } @@ -88,13 +90,15 @@ public class CallServiceImpl implements CallService { return callDao.validateCall(callId); } - @Override - public CallEntity validatePublishedCall(Long callId) { - return callDao.validatePublishedCall(callId); - } - @Override - @Transactional(readOnly = true) - public byte[] downloadCallDocumentsAsZip(Long callId) { - return callDao.downloadCallDocumentsAsZip(callId); - } - } + @Override + public CallEntity validatePublishedCall(Long callId) { + return callDao.validatePublishedCall(callId); + } + + @Override + @Transactional(readOnly = true) + public byte[] downloadCallDocumentsAsZip(Long callId) { + return callDao.downloadCallDocumentsAsZip(callId); + } + +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java index d0bd0217..1a6cd6fd 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DashboardServiceImpl.java @@ -22,7 +22,8 @@ public class DashboardServiceImpl implements DashboardService { @Override public SuperAdminWidgetResponseBean getDashboardWidgetForSuperAdmin(HttpServletRequest request) { - return dashboardDao.getDashboardWidget(); + UserEntity userEntity=validator.validateUser(request); + return dashboardDao.getDashboardWidget(userEntity); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java index 9d04dbc5..51199767 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/FormServiceImpl.java @@ -3,12 +3,15 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.dao.FormDao; import net.gepafin.tendermanagement.entities.ApplicationEntity; +import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.FormEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.ApplicationFormFieldRequestBean; import net.gepafin.tendermanagement.model.request.FormRequest; import net.gepafin.tendermanagement.model.response.FormResponseBean; import net.gepafin.tendermanagement.service.FormService; +import net.gepafin.tendermanagement.util.Validator; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -19,26 +22,33 @@ public class FormServiceImpl implements FormService { @Autowired private FormDao formDao; + + @Autowired + private Validator validator; @Override public FormResponseBean createForm(HttpServletRequest request,Long callId, FormRequest formRequest) { - return formDao.createForm(callId,formRequest); + UserEntity user = validator.validateUser(request); + CallEntity call = validator.validateUserWithCall(user, callId); + return formDao.createForm(call,formRequest); } @Override public FormResponseBean updateForm(HttpServletRequest request, Long formId, FormRequest formRequest,Boolean forceDeleteFlow) { - return formDao.updateForm(formId,formRequest,forceDeleteFlow); + UserEntity user = validator.validateUser(request); + return formDao.updateForm(user, formId,formRequest,forceDeleteFlow); } @Override public FormResponseBean getFormById(HttpServletRequest request, Long formId) { - return formDao.getFormEntityById(formId); + UserEntity user = validator.validateUser(request); + return formDao.getFormEntityById(user, formId); } @Override public void deleteForm(HttpServletRequest request, Long formId) { - formDao.deleteFormById(formId); - return; + UserEntity user = validator.validateUser(request); + formDao.deleteFormById(user, formId); } @Override @@ -48,7 +58,9 @@ public class FormServiceImpl implements FormService { @Override public List getFormsByCallId(HttpServletRequest request, Long callId) { - return formDao.getFormsByCallId(callId); + UserEntity user = validator.validateUser(request); + CallEntity call = validator.validateUserWithCall(user, callId); + return formDao.getFormsByCallId(call); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/HubServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/HubServiceImpl.java new file mode 100644 index 00000000..513a89e4 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/HubServiceImpl.java @@ -0,0 +1,59 @@ +package net.gepafin.tendermanagement.service.impl; + +import net.gepafin.tendermanagement.dao.HubDao; +import net.gepafin.tendermanagement.entities.HubEntity; +import net.gepafin.tendermanagement.model.request.HubReq; +import net.gepafin.tendermanagement.model.response.HubResponseBean; +import net.gepafin.tendermanagement.service.HubService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +public class HubServiceImpl implements HubService { + + @Autowired + private HubDao hubDao; + + @Override + @Transactional(rollbackFor = Exception.class) + public HubResponseBean createHub(HubReq hubReq) { + return hubDao.createHub(hubReq); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public HubResponseBean updateHub(Long hubId, HubReq hubReq) { + return hubDao.updateHub(hubId, hubReq); + } + + @Override + @Transactional(readOnly = true) + public HubResponseBean getHubById(Long hubId) { + return hubDao.getHubById(hubId); + } + + @Override + @Transactional(readOnly = true) + public List getAllHubs() { + return hubDao.getAllHubs(); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteHub(Long hubId) { + hubDao.deleteHub(hubId); + } + + @Override + public HubEntity getHubByUuid(String hubUuid) { + return hubDao.getHubByUuid(hubUuid); + } + + @Override + public HubResponseBean getHubByHubUuid(String uuid) { + return hubDao.getHubByHubUuid(uuid); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java index 926fa48c..3f325320 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/UserServiceImpl.java @@ -2,13 +2,11 @@ package net.gepafin.tendermanagement.service.impl; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import net.gepafin.tendermanagement.config.SamlSuccessHandler; import net.gepafin.tendermanagement.dao.UserDao; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.model.request.LoginReq; import net.gepafin.tendermanagement.model.request.UpdateUserReq; import net.gepafin.tendermanagement.model.request.UserReq; -import net.gepafin.tendermanagement.enums.RoleStatusEnum; import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.response.UserSamlResponse; @@ -32,18 +30,10 @@ public class UserServiceImpl implements UserService { @Autowired private Validator validator; - - @Autowired - private SamlSuccessHandler samlSuccessHandler; @Override @Transactional(rollbackFor = Exception.class) public JWTToken createUser(HttpServletRequest request, String tempToken, UserReq userReq) { - if (tempToken == null) { - validator.validateRequest(request,RoleStatusEnum.ROLE_SUPER_ADMIN); - }else { - samlSuccessHandler.validateToken(tempToken, userReq.getCodiceFiscale()); - } return userDao.createUser(request, tempToken, userReq); } @@ -67,7 +57,7 @@ public class UserServiceImpl implements UserService { } @Override - public JWTToken login(LoginReq loginReq,HttpServletRequest request) { + public JWTToken login(LoginReq loginReq, HttpServletRequest request) { return userDao.login(loginReq,request); } @@ -87,8 +77,8 @@ public class UserServiceImpl implements UserService { return userDao.resetPassword(resetPasswordReq); } @Override - public Boolean changePassword(ChangePasswordRequest request){ - return userDao.changePassword(request); + public Boolean changePassword(HttpServletRequest httpServletRequest, ChangePasswordRequest request){ + return userDao.changePassword(validator.validateUser(httpServletRequest), request); } @Override public void logoutUser(HttpServletRequest request, HttpServletResponse response) { @@ -127,8 +117,8 @@ public class UserServiceImpl implements UserService { } @Override @Transactional(readOnly = true) - public List getAllUsers(Long roleId) { - // Calling DAO Function - return userDao.getAllUsers(roleId); + public List getAllUsers(HttpServletRequest request, Long roleId) { + UserEntity user=validator.validateUser(request); + return userDao.getAllUsers(user, roleId); } } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/util/Validator.java b/src/main/java/net/gepafin/tendermanagement/util/Validator.java index bb7d4053..b4c36227 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Validator.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Validator.java @@ -4,9 +4,12 @@ import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.dao.CallDao; +import net.gepafin.tendermanagement.entities.CallEntity; import net.gepafin.tendermanagement.entities.CompanyEntity; import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.RoleStatusEnum; +import net.gepafin.tendermanagement.service.CallService; import net.gepafin.tendermanagement.service.CompanyService; import net.gepafin.tendermanagement.service.UserService; import net.gepafin.tendermanagement.web.rest.api.errors.ForbiddenAccessException; @@ -32,6 +35,9 @@ public class Validator { @Autowired private CompanyService companyService; + + @Autowired + private CallService callService; public Map getUserInfoFromToken(HttpServletRequest request) { return tokenProvider.getUserInfoAndUserIdFromToken(request); @@ -100,4 +106,14 @@ public class Validator { return Long.parseLong(userInfo.get("userId").toString()); } + public CallEntity validateUserWithCall(UserEntity user, Long callId) { + CallEntity callEntity = callService.validateCall(callId); + if(user.getHub().getId().equals(callEntity.getHub().getId())) { + throw new ForbiddenAccessException(Status.FORBIDDEN, Translator.toLocale(GepafinConstant.PERMISSION_DENIED)); + } + return callEntity; + } + + + } diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java index 3e2861ff..3fcfad5d 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/CallApi.java @@ -85,7 +85,7 @@ public interface CallApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) @GetMapping(value = "/{callId}", produces = { "application/json" }) - ResponseEntity> getCallById( + ResponseEntity> getCallById(HttpServletRequest request, @Parameter(description = "The call ID", required = true) @PathVariable("callId") Long callId); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/HubApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/HubApi.java new file mode 100644 index 00000000..de729daa --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/HubApi.java @@ -0,0 +1,113 @@ +package net.gepafin.tendermanagement.web.rest.api; + +import jakarta.servlet.http.HttpServletRequest; +import net.gepafin.tendermanagement.model.request.HubReq; +import net.gepafin.tendermanagement.model.response.HubResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.Parameter; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@Validated +@RequestMapping("/hub") +public interface HubApi { + + @Operation(summary = "API to create a hub", responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + @PostMapping(value = "", produces = "application/json") + ResponseEntity> createHub(HttpServletRequest request, + @Parameter(description = "Hub request object", required = true) + @Valid @RequestBody HubReq hubReq); + + @Operation(summary = "API to update a hub", responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + @PutMapping(value = "/{hubId}", produces = "application/json") + ResponseEntity> updateHub(HttpServletRequest request, + @Parameter(description = "The hub id", required = true) + @PathVariable("hubId") Long hubId, + @Parameter(description = "Hub request object", required = true) + @Valid @RequestBody HubReq hubReq); + + @Operation(summary = "API to get a hub by id", responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @GetMapping(value = "/{hubId}", produces = "application/json") + ResponseEntity> getHubById(HttpServletRequest request, + @Parameter(description = "The hub id", required = true) + @PathVariable("hubId") Long hubId); + + @Operation(summary = "API to get all hubs", responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + @GetMapping(value = "", produces = "application/json") + ResponseEntity>> getAllHubs(HttpServletRequest request); + + @Operation(summary = "API to delete a hub", responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + @DeleteMapping(value = "/{hubId}") + ResponseEntity> deleteHub(HttpServletRequest request, + @Parameter(description = "The hub id", required = true) + @PathVariable("hubId") Long hubId); + + @Operation(summary = "API to get a hub by id", responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @GetMapping(value = "/uuid/{uuid}", produces = "application/json") + ResponseEntity> getHubByUuid(HttpServletRequest request, + @Parameter(description = "The hub id", required = true) + @PathVariable("uuid") String uuid); +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java index 69891cc9..8982e45e 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/UserApi.java @@ -144,8 +144,10 @@ public interface UserApi { @RequestMapping(value = "/change-password", produces = {"application/json"}, method = RequestMethod.POST) - ResponseEntity> changePassword( - @Parameter(description = "Change password request object", required = true) @Valid @RequestBody ChangePasswordRequest changePasswordRequest); @Operation(summary = "Api to logout user", + ResponseEntity> changePassword(HttpServletRequest request, + @Parameter(description = "Change password request object", required = true) @Valid @RequestBody ChangePasswordRequest changePasswordRequest); + + @Operation(summary = "Api to logout user", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -192,6 +194,7 @@ public interface UserApi { produces = { "application/json" }) ResponseEntity> getValidUser(HttpServletRequest request); + @Operation(summary = "Api to validate existing user from saml token", responses = { @ApiResponse(responseCode = "200", description = "OK"), @@ -232,7 +235,7 @@ public interface UserApi { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE)}))}) @RequestMapping(value = "", produces = {"application/json"}, method = RequestMethod.GET) @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") - ResponseEntity>> getAllUsers( + ResponseEntity>> getAllUsers(HttpServletRequest request, @Parameter( required = false)@RequestParam(value ="roleId", required = false) Long roleId); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index 926dccab..b06380e4 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java @@ -59,8 +59,8 @@ public class CallApiController implements CallApi { } @Override @Transactional(readOnly = true) - public ResponseEntity> getCallById(Long callId) { - CallResponse createCallResponseBean = callService.getCallById(callId); + public ResponseEntity> getCallById(HttpServletRequest request, Long callId) { + CallResponse createCallResponseBean = callService.getCallById(request, callId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); } @@ -76,7 +76,7 @@ public class CallApiController implements CallApi { } @Override public ResponseEntity> validateCallData(HttpServletRequest request, Long callId) { - CallResponse call = callService.validateCallData(callId); + CallResponse call = callService.validateCallData(request, callId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(call, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_FETCH_SUCCESS_MSG))); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java index 71f60387..d26ab560 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CustomUserDetailsService.java @@ -29,10 +29,13 @@ public class CustomUserDetailsService implements UserDetailsService { @Override @Transactional - public UserDetails loadUserByUsername(final String email) throws UsernameNotFoundException { - log.debug("Authenticating {}", email); + public UserDetails loadUserByUsername(final String emailWithHudId) throws UsernameNotFoundException { + log.debug("Authenticating {}", emailWithHudId); + String[] loginParts = emailWithHudId.split(":"); + String email = loginParts[0]; + String hubId = loginParts[1]; - UserEntity user = userRepository.findByEmailIgnoreCase(email) + UserEntity user = userRepository.findByEmailIgnoreCaseAndHubUniqueUuid(email, hubId) .orElseThrow( () -> new UsernameNotFoundException("User " + email + " was not found in the database")); return createSpringSecurityUser(user); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/HubApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/HubApiController.java new file mode 100644 index 00000000..7e8828e0 --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/HubApiController.java @@ -0,0 +1,73 @@ +package net.gepafin.tendermanagement.web.rest.api.impl; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.model.request.HubReq; +import net.gepafin.tendermanagement.model.response.HubResponseBean; +import net.gepafin.tendermanagement.model.util.Response; +import net.gepafin.tendermanagement.service.HubService; +import net.gepafin.tendermanagement.web.rest.api.HubApi; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +public class HubApiController implements HubApi { + + @Autowired + private HubService hubService; + + @Override + public ResponseEntity> createHub(HttpServletRequest request, @Valid HubReq hubReq) { + HubResponseBean hubResponse = hubService.createHub(hubReq); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(hubResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.HUB_CREATE_SUCCESS))); + } + + @Override + public ResponseEntity> updateHub(HttpServletRequest request, Long hubId, @Valid HubReq hubReq) { + + HubResponseBean hubResponse = hubService.updateHub(hubId, hubReq); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(hubResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.HUB_UPDATE_SUCCESS))); + } + + @Override + public ResponseEntity> getHubById(HttpServletRequest request, Long hubId) { + + HubResponseBean hubResponse = hubService.getHubById(hubId); + + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(hubResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.HUB_GET_SUCCESS))); + } + + @Override + public ResponseEntity>> getAllHubs(HttpServletRequest request) { + + List hubs = hubService.getAllHubs(); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(hubs, Status.SUCCESS, Translator.toLocale(GepafinConstant.HUB_GET_ALL_SUCCESS))); + } + + @Override + public ResponseEntity> deleteHub(HttpServletRequest request, Long hubId) { + + hubService.deleteHub(hubId); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.HUB_DELETE_SUCCESS))); + } + @Override + public ResponseEntity> getHubByUuid(HttpServletRequest request, String uuid) { + HubResponseBean hubResponse = hubService.getHubByHubUuid(uuid); + return ResponseEntity.status(HttpStatus.OK) + .body(new Response<>(hubResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.HUB_GET_SUCCESS))); + } +} diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java index e5c10180..413feaac 100644 --- a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java +++ b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/UserApiController.java @@ -79,9 +79,9 @@ public class UserApiController implements UserApi { return ResponseEntity.ok(new Response<>(jwtToken, Status.SUCCESS, Translator.toLocale(GepafinConstant.LOGIN_SUCCESS_MSG))); } @Override - public ResponseEntity> changePassword(@Valid @RequestBody ChangePasswordRequest request) { + public ResponseEntity> changePassword(HttpServletRequest httpServletRequest, @Valid @RequestBody ChangePasswordRequest request) { log.info("Change Password attempt for email: {}", request.getEmail()); - userService.changePassword(request); + userService.changePassword(httpServletRequest, request); return ResponseEntity.ok(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.SUCCESS_PASSWORD_CHANGED))); } @Override @@ -142,10 +142,10 @@ public class UserApiController implements UserApi { return ResponseEntity.ok(new Response<>(data, Status.SUCCESS, Translator.toLocale(GepafinConstant.TOKEN_VALIDATE_SUCCESS_MSE))); } @Override - public ResponseEntity>> getAllUsers( + public ResponseEntity>> getAllUsers(HttpServletRequest request, Long roleId) { log.info("Get all Users by Role ID - Role ID: {}", roleId); - List users = userService.getAllUsers(roleId); + List users = userService.getAllUsers(request, roleId); return ResponseEntity.status(HttpStatus.OK) .body(new Response<>(users, Status.SUCCESS, Translator.toLocale(GepafinConstant.GET_USERS_SUCCESS_MSG))); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 0206cb11..411dcd33 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -64,4 +64,5 @@ default_System_Receiver_Email=antonio.manca@bflows.net gepafin_email=bandi@pec.gepafin.it rinaldo_email=rinaldo.bonazzo@bflows.net carlo_email=carlo.mancosu@bflows.net +default.hub.uuid=p4lk3bcx1RStqTaIVVbXs diff --git a/src/main/resources/db/changelog/db.changelog-1.0.0.xml b/src/main/resources/db/changelog/db.changelog-1.0.0.xml index 5aada016..54ed8f4f 100644 --- a/src/main/resources/db/changelog/db.changelog-1.0.0.xml +++ b/src/main/resources/db/changelog/db.changelog-1.0.0.xml @@ -749,6 +749,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1146,4 +1212,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 4ba49d72..ff04a9bf 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -256,5 +256,13 @@ cannot.create.beneficiary.user = Creation of a Beneficiary user is not allowed. evaluationCriteria.invalid=This evaluation criterion does not belong to the current call. +# Hub Messages +hub_create_success=Hub created successfully +hub_update_success=Hub updated successfully +hub_get_success=Hub retrieved successfully +hub_get_all_success=Hubs retrieved successfully +hub_delete_success=Hub deleted successfully +hub_not_found=Hub not found + diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 7c9dd9bc..af60bf21 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -246,10 +246,17 @@ delete.signed.document.file.success=Documento firmato eliminato con successo. dashboard.widget.fetched.successfully=Widget dashboard recuperato correttamente. login_attempt_successfully_created= Tentativo di login creato con successo. get_login_attempt_se_msg=Lista dei tentativi di accesso recuperata correttamente. -application.in.submit.status.cannot.delete.company=Non è possibile eliminare l'azienda perché ci sono domande attive con stato SUBMITTED. +application.in.submit.status.cannot.delete.company=Non � possibile eliminare l'azienda perch� ci sono domande attive con stato SUBMITTED. get.users.success.msg = Utenti recuperati con successo -cannot.create.beneficiary.user = La creazione di un utente beneficiario non è consentita. Si prega di assegnare il ruolo appropriato. +cannot.create.beneficiary.user = La creazione di un utente beneficiario non � consentita. Si prega di assegnare il ruolo appropriato. evaluationCriteria.invalid=Questo criterio di valutazione non appartiene alla chiamata corrente. +# Hub Messages +hub_create_success=Hub creato con successo +hub_update_success=Hub aggiornato con successo +hub_get_success=Hub recuperato con successo +hub_get_all_success=Hub recuperati con successo +hub_delete_success=Hub eliminato con successo +hub_not_found=Hub non trovato \ No newline at end of file