diff --git a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java index 5ffca88e..90285d95 100644 --- a/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java +++ b/src/main/java/net/gepafin/tendermanagement/config/SecurityConfig.java @@ -15,12 +15,10 @@ import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; -import org.springframework.security.web.access.intercept.AuthorizationFilter; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import org.springframework.web.cors.CorsConfiguration; -import org.springframework.web.cors.CorsConfigurationSource; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; import org.springframework.web.servlet.handler.HandlerMappingIntrospector; @@ -39,12 +37,10 @@ import net.gepafin.tendermanagement.config.jwt.TokenProvider; public class SecurityConfig { private final TokenProvider tokenProvider; - private final CorsConfigurationSource corsConfigurationSource; @Autowired - public SecurityConfig(TokenProvider tokenProvider, CorsConfigurationSource corsConfigurationSource) { + public SecurityConfig(TokenProvider tokenProvider) { this.tokenProvider = tokenProvider; - this.corsConfigurationSource = corsConfigurationSource; } @Bean @@ -71,17 +67,25 @@ public class SecurityConfig { .requestMatchers(new AntPathRequestMatcher("/swagger-ui/**")); } -// @Bean -// public CorsConfigurationSource corsConfigurationSource() { -// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); -// CorsConfiguration config = new CorsConfiguration(); -// config.setAllowCredentials(true); -// config.addAllowedOrigin("http://localhost:3000"); // Change this to your frontend URL -// config.addAllowedHeader("*"); -// config.addAllowedMethod("*"); -// source.registerCorsConfiguration("/**", config); -// return source; -// } + + @Bean + public CorsFilter corsFilter() { + + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + + CorsConfiguration config = new CorsConfiguration(); + config.addAllowedOrigin("*"); + config.addAllowedMethod("*"); + config.addAllowedHeader("*"); + config.setMaxAge(3600l); + + if (config.getAllowedOrigins() != null && !config.getAllowedOrigins().isEmpty()) { + source.registerCorsConfiguration("/v1/**", config); + source.registerCorsConfiguration("/management/**", config); + source.registerCorsConfiguration("/v1/api-docs", config); + } + return new CorsFilter(source); + } @Bean public CorsFilter corsFilter() { @@ -94,7 +98,6 @@ public class SecurityConfig { .csrf(AbstractHttpConfigurer::disable) .authorizeHttpRequests(auth -> auth .requestMatchers(mvc.pattern(HttpMethod.POST, "/v1/user/login")).permitAll() - .requestMatchers(mvc.pattern(HttpMethod.POST, "/v1/user")).permitAll() .requestMatchers("/swagger-ui/**").permitAll() .requestMatchers("/v1/api-docs/**").permitAll() .anyRequest().authenticated() diff --git a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java index 6fdebe76..5d36824f 100644 --- a/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java +++ b/src/main/java/net/gepafin/tendermanagement/constants/GepafinConstant.java @@ -10,6 +10,7 @@ public class GepafinConstant { public static final String UPDATE_USER_ERROR_MSG = "update_user_error_msg"; public static final String DELETE_USER_ERROR_MSG = "delete_user_error_msg"; public static final String GET_USER_SUCCESS_MSG = "get_user_success_msg"; + public static final String USER_NOT_ACTIVE_MSG = "user.not.active"; public static final String ROLE_CREATED_SUCCESS_MSG = "role.created.success"; public static final String ROLE_UPDATED_SUCCESS_MSG = "role.updated.success"; @@ -41,6 +42,7 @@ public class GepafinConstant { public static final String PASSWORD_MIN_LEN ="pass.min.len.msg"; public static final String EMAIL_ALREADY_EXISTS = "email.already.exists"; public static final String DOCUMENT_ID_NOT_FOUND="document.id.not.found"; + public static final String INVALID_DATE_MSG = "call.invalid.date"; public static final String RESET_PASSWORD_INITIATED = "password.reset.initiated"; public static final String PASSWORD_RESET_SUCCESS = "password.reset.success"; diff --git a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java index b4987c81..0b99ceb6 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/CallDao.java @@ -1,27 +1,52 @@ package net.gepafin.tendermanagement.dao; -import net.gepafin.tendermanagement.config.Translator; -import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.entities.*; - import java.math.BigDecimal; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.stream.Collectors; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; +import net.gepafin.tendermanagement.entities.CallEntity; +import net.gepafin.tendermanagement.entities.CallTargetAudienceChecklistEntity; +import net.gepafin.tendermanagement.entities.DocumentEntity; +import net.gepafin.tendermanagement.entities.EvaluationCriteriaEntity; +import net.gepafin.tendermanagement.entities.FaqEntity; +import net.gepafin.tendermanagement.entities.LookUpDataEntity; +import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; +import net.gepafin.tendermanagement.entities.RegionEntity; +import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.enums.CallTypeEnum; -import net.gepafin.tendermanagement.model.request.*; -import net.gepafin.tendermanagement.model.response.*; -import net.gepafin.tendermanagement.repositories.*; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; +import net.gepafin.tendermanagement.model.request.DocumentReq; +import net.gepafin.tendermanagement.model.request.EvaluationCriteriaReq; +import net.gepafin.tendermanagement.model.request.FaqReq; +import net.gepafin.tendermanagement.model.request.LookUpDataReq; +import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; +import net.gepafin.tendermanagement.model.response.DocumentResponseBean; +import net.gepafin.tendermanagement.model.response.EvaluationCriteriaResponseBean; +import net.gepafin.tendermanagement.model.response.FaqResponseBean; +import net.gepafin.tendermanagement.model.response.LookUpDataResponse; +import net.gepafin.tendermanagement.repositories.CallRepository; +import net.gepafin.tendermanagement.repositories.CallTargetAudienceChecklistRepository; +import net.gepafin.tendermanagement.repositories.DocumentRepository; +import net.gepafin.tendermanagement.repositories.EvaluationCriteriaRepository; +import net.gepafin.tendermanagement.repositories.FaqRepository; +import net.gepafin.tendermanagement.repositories.LookUpDataRepository; +import net.gepafin.tendermanagement.repositories.RegionRepository; +import net.gepafin.tendermanagement.repositories.UserRepository; import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; -import net.gepafin.tendermanagement.entities.LookUpDataEntity.LookUpDataTypeEnum; @Component public class CallDao { @@ -50,30 +75,23 @@ public class CallDao { @Autowired private UserRepository userRepository; - public CreateCallResponseBean createCall(CreateCallRequest createCallRequest, Long userId) { + public CreateCallResponseBean createCallStep1(CreateCallRequestStep1 createCallRequest, Long userId) { CreateCallResponseBean createCallResponseBean = null; CallEntity callEntity = convertToCallEntity(createCallRequest); - List evaluationCriteriaEntities = convertToEvaluationCriteriaEntities( - createCallRequest.getCriteria(), callEntity); - List documentEntities = convertToDocumentEntities(createCallRequest.getDocs(), callEntity); - List imageEntities = convertToDocumentEntities(createCallRequest.getImages(), callEntity); List faqEntities = convertToFaqEntities(createCallRequest.getFaq(), callEntity, userId); List amiedTo = convertLookUpDataEntities(createCallRequest.getAimedTo(), callEntity, LookUpDataTypeEnum.AIMED_TO); - List checkList = convertLookUpDataEntities(createCallRequest.getAimedTo(), callEntity, - LookUpDataTypeEnum.CHECKLIST); - createCallResponseBean = assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, - documentEntities, faqEntities, imageEntities); + createCallResponseBean = assembleCreateCallResponseBean(callEntity, Collections.emptyList(), + Collections.emptyList(), faqEntities, Collections.emptyList()); createCallResponseBean.setAimedTo(amiedTo); - createCallResponseBean.setCheckList(checkList); return createCallResponseBean; } - public CallEntity convertToCallEntity(CreateCallRequest createCallRequest) { + public CallEntity convertToCallEntity(CreateCallRequestStep1 createCallRequest) { CallEntity callEntity = new CallEntity(); - validateCallEntity(createCallRequest.getRegionId(), createCallRequest.getAmount()); + validateCallEntity(createCallRequest); RegionEntity region = regionRepository.findById(createCallRequest.getRegionId()) .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND))); callEntity.setRegion(region); @@ -85,12 +103,11 @@ public class CallDao { callEntity.setStatus(String.valueOf(createCallRequest.getStatus())); callEntity.setAmountMax(createCallRequest.getAmountMax()); callEntity.setAmount(createCallRequest.getAmountMax()); - callEntity.setThreshold(createCallRequest.getThreshold()); callEntity.setConfidi(false); if(createCallRequest.getConfidi()!=null){ callEntity.setConfidi(createCallRequest.getConfidi()); } - callEntity.setDocumentation_requested(createCallRequest.getDocumentationRequested()); + callEntity.setDocumentationRequested(createCallRequest.getDocumentationRequested()); callEntity = callRepository.save(callEntity); return callEntity; } @@ -120,13 +137,15 @@ public class CallDao { private DocumentEntity convertToDocumentEntity(DocumentReq documentReq, CallEntity callEntity) { validateDocumentEntity(documentReq.getId(),documentReq.getFileName()); - DocumentEntity documentEntity = documentRepository.findById(documentReq.getId()); - if(documentEntity==null){ - throw new ResourceNotFoundException(Status.VALIDATION_ERROR,Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); - } - documentEntity.setFileName(documentReq.getFileName()); - documentEntity.setFilePath(documentReq.getUrl()); - documentEntity.setCall(callEntity); + DocumentEntity documentEntity = documentRepository.findById(documentReq.getId()) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); +// if(documentEntity==null){ +// throw ; +// } +// documentEntity.setFileName(documentReq.getFileName()); +// documentEntity.setFilePath(documentReq.getUrl()); +// documentEntity.setCall(callEntity); return documentEntity; } @@ -169,9 +188,9 @@ public class CallDao { throw new CustomValidationException(Status.VALIDATION_ERROR,Translator.toLocale(GepafinConstant.DOCUMENT_ID_NOT_FOUND)); } - if (!StringUtils.hasText(name)) { - throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG)); - } +// if (!StringUtils.hasText(name)) { +// throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG)); +// } } public void validateEvolutionCrieteriaEntity(String name) { @@ -180,14 +199,17 @@ public class CallDao { } } - public void validateCallEntity(Long regionId, BigDecimal fundingAmount) { - if (regionId == null) { + public void validateCallEntity(CreateCallRequestStep1 createCallRequest) { + if (createCallRequest.getRegionId() == null) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.REGION_NOT_FOUND_MSG)); } - if (fundingAmount == null || fundingAmount.compareTo(BigDecimal.ZERO) <= 0) { + if (createCallRequest.getAmount().compareTo(BigDecimal.ZERO) <= 0||createCallRequest.getAmountMax().compareTo(BigDecimal.ZERO) <= 0) { throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.AMOUNT_GREATER_THAN_ZERO_MSG)); } + if (createCallRequest.getStartDate().toLocalDate().isBefore(LocalDate.now()) || createCallRequest.getEndDate().toLocalDate().isBefore(LocalDate.now())) { + throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.INVALID_DATE_MSG)); + } } public CreateCallResponseBean convertToCallResponseBean(CallEntity callEntity) { CreateCallResponseBean createCallResponseBean = new CreateCallResponseBean(); @@ -203,7 +225,7 @@ public class CallDao { createCallResponseBean.setContactInfo(callEntity.getContactInfo()); createCallResponseBean.setSubmissionMethod(callEntity.getSubmissionMethod()); createCallResponseBean.setThreshold(callEntity.getThreshold()); - createCallResponseBean.setDocumentationReqested(callEntity.getDocumentation_requested()); + createCallResponseBean.setDocumentationReqested(callEntity.getDocumentationRequested()); createCallResponseBean.setPriorityArea(callEntity.getPriorityArea()); createCallResponseBean.setCreatedDate(callEntity.getCreatedDate()); createCallResponseBean.setUpdatedDate(callEntity.getUpdatedDate()); @@ -290,13 +312,13 @@ public class CallDao { callTargetAudienceChecklistEntity.setLookupData(lookUpDataEntity); callTargetAudienceChecklistEntity.setCall(callEntity); callTargetAudienceChecklistEntity= callTargetAudienceChecklistRepository.save(callTargetAudienceChecklistEntity); - lookUpDataResponses.add(convertToLookUpDataResponseBean(lookUpDataEntity,callTargetAudienceChecklistEntity)); + lookUpDataResponses.add(convertToLookUpDataResponseBean(callTargetAudienceChecklistEntity)); } return lookUpDataResponses; } private LookUpDataEntity convertLookUpDataRequestIntoLookUpDataEntity(LookUpDataReq req, LookUpDataEntity.LookUpDataTypeEnum type) { - if (req.getLookUpDataId() == null || req.getLookUpDataId().equals(BigDecimal.ZERO)) { + if (req.getLookUpDataId() == null || req.getLookUpDataId().equals(0l)) { LookUpDataEntity newEntity = new LookUpDataEntity(); newEntity.setValue(req.getValue()); newEntity.setType(type.getValue()); @@ -307,8 +329,9 @@ public class CallDao { .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); } - public LookUpDataResponse convertToLookUpDataResponseBean(LookUpDataEntity lookUpDataEntity,CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity) { + public LookUpDataResponse convertToLookUpDataResponseBean(CallTargetAudienceChecklistEntity callTargetAudienceChecklistEntity) { LookUpDataResponse lookUpDataResponse = new LookUpDataResponse(); + LookUpDataEntity lookUpDataEntity = callTargetAudienceChecklistEntity.getLookupData(); lookUpDataResponse.setId(callTargetAudienceChecklistEntity.getId()); lookUpDataResponse.setLookUpDataId(lookUpDataEntity.getId()); lookUpDataResponse.setValue(lookUpDataEntity.getValue()); @@ -317,6 +340,32 @@ public class CallDao { lookUpDataResponse.setUpdatedDate(lookUpDataEntity.getUpdatedDate()); return lookUpDataResponse; } + + + public CreateCallResponseBean createCallStep2(CreateCallRequestStep2 createCallRequest, Long userId) { + CreateCallResponseBean createCallResponseBean = null; + CallEntity callEntity = callRepository.findById(createCallRequest.getCallId()) + .orElseThrow(() -> new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.NAME_NOT_EMPTY_MSG))); + + callEntity.setThreshold(createCallRequest.getThreshold()); + List evaluationCriteriaEntities = convertToEvaluationCriteriaEntities( + createCallRequest.getCriteria(), callEntity); + List documentEntities = convertToDocumentEntities(createCallRequest.getDocs(), callEntity); + List imageEntities = convertToDocumentEntities(createCallRequest.getImages(), callEntity); + List checkList = convertLookUpDataEntities(createCallRequest.getCheckList(), callEntity, + LookUpDataTypeEnum.CHECKLIST); + List faqEntities = faqRepository.findByCallId(callEntity.getId()); + List amiedTo = callTargetAudienceChecklistRepository + .findByCallIdAndLookupDataType(callEntity.getId(), LookUpDataTypeEnum.AIMED_TO.getValue()).stream() + .map(this::convertToLookUpDataResponseBean).toList(); + createCallResponseBean = assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, + documentEntities, faqEntities, imageEntities); + createCallResponseBean.setAimedTo(amiedTo); + createCallResponseBean.setCheckList(checkList); + return createCallResponseBean; + + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java index 3c5cd708..f9603b70 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DocumentDao.java @@ -1,5 +1,16 @@ package net.gepafin.tendermanagement.dao; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.commons.io.FilenameUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.DocumentEntity; @@ -10,17 +21,6 @@ import net.gepafin.tendermanagement.service.AmazonS3Service; import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.Status; -import org.apache.commons.io.FilenameUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; @Component public class DocumentDao { @@ -34,15 +34,6 @@ public class DocumentDao { @Autowired private CallDao callDao; - @Value("${aws.s3.bucket.name}") - private String bucketName; - - @Value("${aws.s3.url.folder}") - private String s3Folder; - - @Value("${aws.s3.url}") - private String s3Url; - public List uploadFiles(List files, DocumentTypeEnum fileType) { List documentEntities = new ArrayList<>(); @@ -65,16 +56,15 @@ public class DocumentDao { .map(callDao::convertToDocumentResponseBean) .collect(Collectors.toList()); } - public Void deleteFile(Long documentId){ - DocumentEntity documentEntity= documentRepository.findById(documentId); - if(documentEntity==null){ - new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND)); - } - String fileName= Utils.extractFileName(documentEntity.getFilePath()); - try { - amazonS3Service.delete(bucketName, fileName); - documentRepository.delete(documentEntity); - }catch (Exception e){} - return null; - } + + public void deleteFile(Long documentId) { + DocumentEntity documentEntity = documentRepository.findById(documentId) + .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.DOCUMENT_NOT_FOUND))); + + String fileName = Utils.extractFileName(documentEntity.getFilePath()); + amazonS3Service.delete(fileName); + documentRepository.delete(documentEntity); + + } } diff --git a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java index e7f4c5f9..d0c6342c 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/RoleDao.java @@ -45,6 +45,7 @@ public class RoleDao { private RoleEntity convertRoleRequestToRoleEntity(RoleReq roleReq) { RoleEntity roleEntity = new RoleEntity(); roleEntity.setRoleName(roleReq.getRoleName()); + roleEntity.setRoleType(roleReq.getRoleType()); roleEntity.setPermissions(roleReq.getPermissions()); roleEntity.setDescription(roleReq.getDescription()); roleEntity.setRegion(regionService.getRegionById(roleReq.getRegionId())); @@ -57,6 +58,7 @@ public class RoleDao { roleResponseBean.setCreatedDate(roleEntity.getCreatedDate()); roleResponseBean.setUpdatedDate(roleEntity.getUpdatedDate()); roleResponseBean.setRoleName(roleEntity.getRoleName()); + roleResponseBean.setRoleType(roleEntity.getRoleType()); roleResponseBean.setDescription(roleEntity.getDescription()); roleResponseBean.setPermissions(roleEntity.getPermissions()); RegionResponseBean regionResponseBean = regionDao.convertRegionEntityToRegionResponse(roleEntity.getRegion()); @@ -73,6 +75,7 @@ public class RoleDao { log.info("New role details: {}", roleReq); setIfUpdated(existingRole::getRoleName, existingRole::setRoleName, roleReq.getRoleName()); + setIfUpdated(existingRole::getRoleType, existingRole::setRoleType, roleReq.getRoleType()); setIfUpdated(existingRole::getDescription, existingRole::setDescription, roleReq.getDescription()); setIfUpdated(existingRole::getPermissions, existingRole::setPermissions, roleReq.getPermissions()); diff --git a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java index 8a0197f6..ecaf9a48 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/UserDao.java @@ -51,7 +51,7 @@ public class UserDao { public UserResponseBean createUser(UserReq userReq) { log.info("Creating user with email: {}", userReq.getEmail()); - if (userRepository.existsByEmail(userReq.getEmail())) { + if (userRepository.existsByEmailIgnoreCase(userReq.getEmail())) { log.error("User creation failed: Email {} already exists", userReq.getEmail()); throw new CustomValidationException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.EMAIL_ALREADY_EXISTS)); } @@ -98,7 +98,7 @@ public class UserDao { userEntity.setPassword(passwordEncoder.encode(userReq.getPassword())); userEntity.setEmail(userReq.getEmail()); userEntity.setFirstName(userReq.getFirstName()); - userEntity.setStatus(userReq.getStatus().getValue()); + userEntity.setStatus(UserStatusEnum.PENDING_VERIFICATION.getValue()); userEntity.setLastName(userReq.getLastName()); userEntity.setOrganization(userReq.getOrganization()); userEntity.setAddress(userReq.getAddress()); @@ -131,10 +131,10 @@ public class UserDao { log.info("Fetching user with ID: {}", id); UserEntity userEntity = userRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); - if (!UserStatusEnum.ACTIVE.getValue().equals(userEntity.getStatus())) { - log.info("User with ID: {} is not active", id); - throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); - } +// if (!UserStatusEnum.ACTIVE.getValue().equals(userEntity.getStatus())) { +// log.info("User with ID: {} is not active", id); +// throw new ResourceNotFoundException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); +// } log.info("User found: {}", userEntity); return convertUserEntityToUserResponse(userEntity); } diff --git a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java index 1ee48d6b..81da7209 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/CallEntity.java @@ -52,10 +52,10 @@ public class CallEntity extends BaseEntity { private String submissionMethod; @Column(name = "THRESHOLD", nullable = false) - private Integer threshold; + private Long threshold; @Column(name="DOCUMENTATION_REQUESTED",columnDefinition = "TEXT") - private String documentation_requested; + private String documentationRequested; @Column(name = "PRIORITY_AREA", columnDefinition = "TEXT") private String priorityArea; diff --git a/src/main/java/net/gepafin/tendermanagement/entities/RoleEntity.java b/src/main/java/net/gepafin/tendermanagement/entities/RoleEntity.java index ff741702..c94b36b9 100644 --- a/src/main/java/net/gepafin/tendermanagement/entities/RoleEntity.java +++ b/src/main/java/net/gepafin/tendermanagement/entities/RoleEntity.java @@ -11,7 +11,7 @@ import lombok.Setter; @Setter public class RoleEntity extends BaseEntity { - @Column(name = "ROLE_NAME", length = 50, nullable = true) + @Column(name = "ROLE_NAME", length = 255, nullable = true) private String roleName; @Column(name = "DESCRIPTION", length = 255, nullable = true) @@ -19,8 +19,12 @@ public class RoleEntity extends BaseEntity { @Column(name = "PERMISSIONS", length = 255, nullable = true) private String permissions; + @ManyToOne @JoinColumn(name = "REGION_ID", nullable = true) private RegionEntity region; + + @Column(name = "ROLE_TYPE", length = 255, nullable = true) + private String roleType; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequest.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java similarity index 73% rename from src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequest.java rename to src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java index 80d828fc..e6cbc3e9 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequest.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep1.java @@ -7,43 +7,47 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; -@Data -public class CreateCallRequest { +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +@Data +public class CreateCallRequestStep1 { + + @NotEmpty private String name; + @NotEmpty private String descriptionShort; + @NotEmpty private String descriptionLong; + @NotNull private LocalDateTime startDate; + @NotNull private LocalDateTime endDate; + @NotNull private Long regionId; + @NotNull private BigDecimal amount; + @NotNull private BigDecimal amountMax; + @NotNull private List aimedTo; + @NotEmpty private String documentationRequested; - private Integer threshold; - private Boolean Confidi; - List criteria; - private List faq; - private List checkList; - - private List docs; - - private List images; - + @NotNull private CallTypeEnum status; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java new file mode 100644 index 00000000..7908c9ae --- /dev/null +++ b/src/main/java/net/gepafin/tendermanagement/model/request/CreateCallRequestStep2.java @@ -0,0 +1,29 @@ +package net.gepafin.tendermanagement.model.request; + +import java.util.List; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import net.gepafin.tendermanagement.enums.CallTypeEnum; + +@Data +public class CreateCallRequestStep2 { + + @NotNull + private Long callId; + + private Long threshold; + + @NotNull + private List criteria; + + @NotNull + private List checkList; + + private List docs; + + private List images; + + private CallTypeEnum status; + +} diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java index 18b847b4..5fe41b41 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/LookUpDataReq.java @@ -1,10 +1,12 @@ package net.gepafin.tendermanagement.model.request; +import jakarta.validation.constraints.NotNull; import lombok.Data; @Data public class LookUpDataReq { + @NotNull private Long lookUpDataId; private String value; diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java index f1fd7d70..50cf17ce 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/RoleReq.java @@ -1,8 +1,6 @@ package net.gepafin.tendermanagement.model.request; import com.fasterxml.jackson.annotation.JsonProperty; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; @@ -21,5 +19,7 @@ public class RoleReq { private String permissions; private Long regionId; + + private String roleType; } diff --git a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReq.java b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReq.java index f4a8a107..65eba841 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UpdateUserReq.java @@ -1,7 +1,5 @@ package net.gepafin.tendermanagement.model.request; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; import net.gepafin.tendermanagement.enums.UserStatusEnum; 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 07761068..54841e9b 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java +++ b/src/main/java/net/gepafin/tendermanagement/model/request/UserReq.java @@ -36,6 +36,4 @@ public class UserReq { private String country; - private UserStatusEnum status; - } diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java index b913f85b..56a42a2a 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/CreateCallResponseBean.java @@ -32,7 +32,7 @@ public class CreateCallResponseBean { private String submissionMethod; - private Integer threshold; + private Long threshold; private String priorityArea; diff --git a/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java b/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java index d5d579e5..da097f48 100644 --- a/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java +++ b/src/main/java/net/gepafin/tendermanagement/model/response/RoleResponseBean.java @@ -14,4 +14,5 @@ public class RoleResponseBean extends BaseBean { private String description; private String permissions; private RegionResponseBean region; + private String roleType; } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java index ef6e144f..093e4086 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallRepository.java @@ -1,8 +1,10 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.CallEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; -public interface CallRepository extends JpaRepository { +@Repository +public interface CallRepository extends JpaRepository { } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java index fe70f982..8d4912fe 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/CallTargetAudienceChecklistRepository.java @@ -1,7 +1,14 @@ package net.gepafin.tendermanagement.repositories; -import net.gepafin.tendermanagement.entities.CallTargetAudienceChecklistEntity; -import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import net.gepafin.tendermanagement.entities.CallTargetAudienceChecklistEntity; + +@Repository public interface CallTargetAudienceChecklistRepository extends JpaRepository { + + List findByCallIdAndLookupDataType(Long id, String value); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java index d8d4f07a..9a2a4639 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/DocumentRepository.java @@ -1,9 +1,10 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.DocumentEntity; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; -public interface DocumentRepository extends JpaRepository { +@Repository +public interface DocumentRepository extends JpaRepository { - DocumentEntity findById(Long id); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java index 9453ade3..7b4b7610 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/FaqRepository.java @@ -1,7 +1,14 @@ package net.gepafin.tendermanagement.repositories; import net.gepafin.tendermanagement.entities.FaqEntity; -import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository public interface FaqRepository extends JpaRepository { + + List findByCallId(Long callId); } diff --git a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java index dc0aad37..6b6fcbe0 100644 --- a/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java +++ b/src/main/java/net/gepafin/tendermanagement/repositories/UserRepository.java @@ -6,6 +6,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; public interface UserRepository extends JpaRepository { - UserEntity findByEmail(String email); - boolean existsByEmail(String email); + Optional findByEmailIgnoreCase(String email); + boolean existsByEmailIgnoreCase(String email); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java index 188d131a..1ff3a7fd 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java +++ b/src/main/java/net/gepafin/tendermanagement/service/AmazonS3Service.java @@ -1,6 +1,5 @@ package net.gepafin.tendermanagement.service; - import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; @@ -10,11 +9,9 @@ import java.io.InputStream; @Component public interface AmazonS3Service { + public String upload(String fileName, MultipartFile file) throws IOException; - public String upload(String fileName, - MultipartFile file) throws IOException; + public Boolean delete(String fileName); - public Boolean delete(String bucketName ,String fileName); - - InputStream getFile(String filePath) throws IOException; + InputStream getFile(String filePath) throws IOException; } \ No newline at end of file diff --git a/src/main/java/net/gepafin/tendermanagement/service/CallService.java b/src/main/java/net/gepafin/tendermanagement/service/CallService.java index 40dfd65f..f8a07093 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/CallService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/CallService.java @@ -1,11 +1,14 @@ package net.gepafin.tendermanagement.service; import jakarta.servlet.http.HttpServletRequest; -import net.gepafin.tendermanagement.model.request.CreateCallRequest; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; public interface CallService { - CreateCallResponseBean createCall(HttpServletRequest request, CreateCallRequest createCallRequest); + CreateCallResponseBean createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest); + + CreateCallResponseBean createCallStep2(HttpServletRequest request, CreateCallRequestStep2 createCallRequest); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java b/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java index 806d81cc..4081af53 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/DocumentService.java @@ -10,5 +10,5 @@ public interface DocumentService { public List uploadFile(List files, DocumentTypeEnum fileType); - public Void deleteFile(Long documentId); + public void deleteFile(Long documentId); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java index ad865d13..3657d115 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AmazonS3ServiceImpl.java @@ -63,7 +63,7 @@ public class AmazonS3ServiceImpl implements AmazonS3Service { } @Override - public Boolean delete(String bucketName,String fileName) { + public Boolean delete(String fileName) { final DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(bucketName, fileName); if(Boolean.FALSE.equals(isTestProfileActivated())) { 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 ca480a88..b3806deb 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/AuthenticationService.java @@ -7,6 +7,7 @@ import net.gepafin.tendermanagement.config.jwt.TokenProvider; import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.dao.RoleDao; import net.gepafin.tendermanagement.entities.UserEntity; +import net.gepafin.tendermanagement.enums.UserStatusEnum; import net.gepafin.tendermanagement.model.request.LoginReq; import net.gepafin.tendermanagement.model.request.LogoutReq; import net.gepafin.tendermanagement.model.response.LoginResponse; @@ -48,26 +49,28 @@ public class AuthenticationService { this.authenticationManager = authenticationManager; } - public JWTToken login(LoginReq loginReq) { - log.info("Attempting login for email: {}", loginReq.getEmail()); - UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginReq.getEmail(), loginReq.getPassword()); - Authentication authentication = this.authenticationManager.authenticate(authenticationToken); - SecurityContextHolder.getContext().setAuthentication(authentication); - log.info("Authentication successful for email: {}", loginReq.getEmail()); - UserEntity user = userRepository.findByEmail(loginReq.getEmail()); - if (user == null) { - log.error("User not found for email: {}", loginReq.getEmail()); - throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); - } - user.setLastLogin(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); - userRepository.save(user); - String token = tokenProvider.createToken(authentication, loginReq.getRememberMe(), user); - log.info("JWT token generated for email: {}", loginReq.getEmail()); - RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(user.getRoleEntity()); + public JWTToken login(LoginReq loginReq) { + log.info("Attempting login for email: {}", loginReq.getEmail()); + UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( + loginReq.getEmail(), loginReq.getPassword()); + Authentication authentication = this.authenticationManager.authenticate(authenticationToken); + SecurityContextHolder.getContext().setAuthentication(authentication); + log.info("Authentication successful for email: {}", loginReq.getEmail()); + UserEntity user = userRepository.findByEmailIgnoreCase(loginReq.getEmail()).orElseThrow(()-> new CustomValidationException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG))); + if (Boolean.FALSE.equals(UserStatusEnum.ACTIVE.getValue().equals(user.getStatus()))) { + new CustomValidationException(Status.NOT_FOUND, + Translator.toLocale(GepafinConstant.USER_NOT_FOUND_MSG)); + } + user.setLastLogin(DateTimeUtil.DateServerToUTC(LocalDateTime.now())); + userRepository.save(user); + String token = tokenProvider.createToken(authentication, loginReq.getRememberMe(), user); + log.info("JWT token generated for email: {}", loginReq.getEmail()); + RoleResponseBean roleResponseBean = roleDao.convertRoleEntityToRoleResponse(user.getRoleEntity()); - LoginResponse loginResponse = getLoginResponse(user, roleResponseBean); + LoginResponse loginResponse = getLoginResponse(user, roleResponseBean); - JWTToken jwtToken = new JWTToken(token, loginResponse); + JWTToken jwtToken = new JWTToken(token, loginResponse); log.info("Login successful for email: {}", loginReq.getEmail()); return jwtToken; 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 cb4b76bc..53edaf6d 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CallServiceImpl.java @@ -3,7 +3,8 @@ 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.model.request.CreateCallRequest; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; import net.gepafin.tendermanagement.service.CallService; import org.springframework.beans.factory.annotation.Autowired; @@ -22,8 +23,14 @@ public class CallServiceImpl implements CallService { private TokenProvider tokenProvider; @Override - public CreateCallResponseBean createCall(HttpServletRequest request, CreateCallRequest createCallRequest) { + public CreateCallResponseBean createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest) { Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); - return callDao.createCall(createCallRequest, Long.parseLong(userInfo.get("userId").toString())); + return callDao.createCallStep1(createCallRequest, Long.parseLong(userInfo.get("userId").toString())); + } + + @Override + public CreateCallResponseBean createCallStep2(HttpServletRequest request, CreateCallRequestStep2 createCallRequest) { + Map userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request); + return callDao.createCallStep2(createCallRequest, Long.parseLong(userInfo.get("userId").toString())); } } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java index e7bf864e..55c6165b 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java @@ -1,14 +1,15 @@ package net.gepafin.tendermanagement.service.impl; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + import net.gepafin.tendermanagement.dao.DocumentDao; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import net.gepafin.tendermanagement.service.DocumentService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import java.util.List; @Service public class DocumentServiceImpl implements DocumentService { @@ -22,7 +23,7 @@ public class DocumentServiceImpl implements DocumentService { return fileDao.uploadFiles(files,fileType); } @Override - public Void deleteFile(Long documentId){ - return fileDao.deleteFile(documentId); + public void deleteFile(Long documentId){ + fileDao.deleteFile(documentId); } } 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 b2b335de..3da8bab6 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 @@ -7,20 +7,22 @@ import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; -import net.gepafin.tendermanagement.model.request.CreateCallRequest; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; - +@Validated public interface CallApi { - @Operation(summary = "Api to create call", + @Operation(summary = "Api to create call step 1", responses = { @ApiResponse(responseCode = "200", description = "OK"), @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @@ -30,10 +32,26 @@ public interface CallApi { @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) }) - @PostMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) - @PreAuthorize("hasRole('SUPER_ADMIN')") - public ResponseEntity> createCall(HttpServletRequest request, + @PostMapping(value = "/step1", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + public ResponseEntity> createCallStep1(HttpServletRequest request, @Parameter(description = "Call request object", required = true) - @Valid @RequestBody CreateCallRequest createCallRequest); + @Valid @RequestBody CreateCallRequestStep1 createCallRequest); + + @Operation(summary = "Api to create call step 2", + responses = { + @ApiResponse(responseCode = "200", description = "OK"), + @ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.UNAUTHORIZED_ERROR_EXAMPLE) })), + @ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = { + @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) + }) + @PostMapping(value = "/step2", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") + public ResponseEntity> createCallStep2(HttpServletRequest request, + @Parameter(description = "Call request object", required = true) + @Valid @RequestBody CreateCallRequestStep2 createCallRequest); } 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 2959c13d..2dda7d21 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 @@ -18,6 +18,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants; import org.springframework.http.HttpStatus; 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.*; @@ -36,6 +37,7 @@ public interface UserApi { @RequestMapping(value = "", produces = {"application/json"}, method = RequestMethod.POST) + @PreAuthorize("hasRole('ROLE_SUPER_ADMIN')") default ResponseEntity> createUser( @Parameter(description = "User request object", required = true) @Validated @RequestBody UserReq userReq) { return new ResponseEntity>(HttpStatus.NOT_IMPLEMENTED); diff --git a/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java b/src/main/java/net/gepafin/tendermanagement/web/rest/api/impl/CallApiController.java index d4165383..0ff654bc 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 @@ -3,7 +3,8 @@ package net.gepafin.tendermanagement.web.rest.api.impl; import jakarta.servlet.http.HttpServletRequest; import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.constants.GepafinConstant; -import net.gepafin.tendermanagement.model.request.CreateCallRequest; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep1; +import net.gepafin.tendermanagement.model.request.CreateCallRequestStep2; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; import net.gepafin.tendermanagement.model.util.Response; import net.gepafin.tendermanagement.service.CallService; @@ -27,8 +28,16 @@ public class CallApiController implements CallApi { @Override @Transactional(rollbackFor=Exception.class) - public ResponseEntity> createCall(HttpServletRequest request, CreateCallRequest createCallRequest) { - CreateCallResponseBean createCallResponseBean = callService.createCall(request, createCallRequest); + public ResponseEntity> createCallStep1(HttpServletRequest request, CreateCallRequestStep1 createCallRequest) { + CreateCallResponseBean createCallResponseBean = callService.createCallStep1(request, createCallRequest); + return ResponseEntity.status(HttpStatus.CREATED) + .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_CREATED_SUCCESSFULLY_MSG))); + } + + @Override + @Transactional(rollbackFor=Exception.class) + public ResponseEntity> createCallStep2(HttpServletRequest request, CreateCallRequestStep2 createCallRequest) { + CreateCallResponseBean createCallResponseBean = callService.createCallStep2(request, createCallRequest); return ResponseEntity.status(HttpStatus.CREATED) .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_CREATED_SUCCESSFULLY_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 102a388c..7345d13e 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 @@ -1,9 +1,13 @@ package net.gepafin.tendermanagement.web.rest.api.impl; +import net.gepafin.tendermanagement.config.Translator; +import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.entities.RoleEntity; import net.gepafin.tendermanagement.entities.UserEntity; -import net.gepafin.tendermanagement.repositories.RoleRepository; import net.gepafin.tendermanagement.repositories.UserRepository; +import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; +import net.gepafin.tendermanagement.web.rest.api.errors.Status; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.core.GrantedAuthority; @@ -22,11 +26,9 @@ public class CustomUserDetailsService implements UserDetailsService { private final Logger log = LoggerFactory.getLogger(CustomUserDetailsService.class); private final UserRepository userRepository; - private final RoleRepository roleRepository; - public CustomUserDetailsService(UserRepository userRepository, RoleRepository roleRepository) { + public CustomUserDetailsService(UserRepository userRepository) { this.userRepository = userRepository; - this.roleRepository = roleRepository; } @Override @@ -34,17 +36,15 @@ public class CustomUserDetailsService implements UserDetailsService { public UserDetails loadUserByUsername(final String email) throws UsernameNotFoundException { log.debug("Authenticating {}", email); - UserEntity user = userRepository.findByEmail(email); - if (user == null) { - throw new UsernameNotFoundException("User " + email + " was not found in the database"); - } - + UserEntity user = userRepository.findByEmailIgnoreCase(email) + .orElseThrow( + () -> new UsernameNotFoundException("User " + email + " was not found in the database")); return createSpringSecurityUser(user); } private org.springframework.security.core.userdetails.User createSpringSecurityUser(UserEntity user) { RoleEntity role = user.getRoleEntity(); - GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(role.getRoleName()); + GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(role.getRoleType()); return new org.springframework.security.core.userdetails.User( user.getEmail(), 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 cce854f6..2d2e63c2 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 @@ -66,6 +66,9 @@ + + + @@ -168,7 +171,6 @@ - @@ -314,7 +316,8 @@ - + + @@ -324,7 +327,8 @@ - + + @@ -334,7 +338,8 @@ - + + @@ -344,7 +349,8 @@ - + + diff --git a/src/main/resources/message_en.properties b/src/main/resources/message_en.properties index 34d711c7..48f9f9d9 100644 --- a/src/main/resources/message_en.properties +++ b/src/main/resources/message_en.properties @@ -7,6 +7,7 @@ update_user_error_msg=An error occurred while updating the user. delete_user_error_msg=An error occurred while deleting the user. get_user_success_msg=User retrieved successfully. get_user_error_msg=An error occurred while retrieving the user. +user.not.active=User is not active. Please contact support. # Role-related messages role.created.success=Role created successfully. role.updated.success=Role updated successfully. @@ -42,6 +43,8 @@ call.created.successfully=Call created successfully. file.deleted.successfully=File deleted successfully. document.not.found=Document not found. document.id.not.found=Document ID not found. +call.created.successfully=Call created successfully. +call.invalid.date=Invalid start or end date. # Login-related messages login.successfully=Login successfully. diff --git a/src/main/resources/message_it.properties b/src/main/resources/message_it.properties index 33624af7..bfffd062 100644 --- a/src/main/resources/message_it.properties +++ b/src/main/resources/message_it.properties @@ -7,6 +7,7 @@ update_user_error_msg=Si � verificato un errore durante l'aggiornamento dell'u delete_user_error_msg=Si � verificato un errore durante l'eliminazione dell'utente. get_user_success_msg=Utente recuperato con successo. get_user_error_msg=Si � verificato un errore durante il recupero dell'utente. +user.not.active=Utente non attivo. Si prega di contattare il supporto. # Role-related messages role.created.success=Ruolo creato con successo. role.updated.success=Ruolo aggiornato con successo. @@ -42,6 +43,7 @@ call.created.successfully=Chiamata creata correttamente. file.deleted.successfully=File eliminato con successo. document.not.found=Documento non trovato. document.id.not.found=ID documento non trovato. +call.invalid.date=Data di inizio o fine non valida. # Login-related messages login.successfully=Accesso effettuato con successo.