diff --git a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java index a3243c22..b39efce7 100644 --- a/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java +++ b/src/main/java/net/gepafin/tendermanagement/dao/DelegationDao.java @@ -209,7 +209,6 @@ public class DelegationDao { companyDao.validateCompany(companyId); companyDao.getUserWithCompany(userEntity.getId(), companyId); - validateFileType(file); UserWithCompanyEntity userWithCompanyEntity=companyService.getUserWithCompany(userEntity.getId(),companyId); UserCompanyDelegationEntity userCompanyDelegationEntity = userCompanyDelegationRepository .findByUserIdAndUserWithCompanyIdAndStatus(userEntity.getId(), userWithCompanyEntity.getId(), 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 70ed5794..0c84086b 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/ApplicationServiceImpl.java @@ -15,6 +15,7 @@ import net.gepafin.tendermanagement.enums.FormActionEnum; import net.gepafin.tendermanagement.model.request.ApplicationRequestBean; import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.service.ApplicationService; +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.ForbiddenAccessException; @@ -112,6 +113,7 @@ public class ApplicationServiceImpl implements ApplicationService { @Override @Transactional(rollbackFor = Exception.class) public ApplicationSignedDocumentResponse uploadSignedDocument(HttpServletRequest request, Long applicationId, MultipartFile file) { + Utils.validateFileType(file); return applicationDao.uploadSignedDocument(request, applicationId, file); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyDocumentServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyDocumentServiceImpl.java index 74b680e4..c12e1ab3 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyDocumentServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyDocumentServiceImpl.java @@ -9,6 +9,7 @@ import net.gepafin.tendermanagement.model.request.CompanyDocumentRequest; import net.gepafin.tendermanagement.model.response.CompanyDocumentResponseBean; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import net.gepafin.tendermanagement.service.CompanyDocumentService; +import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -31,6 +32,7 @@ public class CompanyDocumentServiceImpl implements CompanyDocumentService { public List uploadFileForCompany(HttpServletRequest request, List files, Long companyId, Long documentCategoryId , CompanyDocumentTypeEnum documentSourceTypeEnum, LocalDateTime expirationDate,String name) { Map userInfo = validator.getUserInfoFromToken(request); Long userId = validator.getUserId(userInfo); + files.forEach(Utils::validateFileType); return companyDocumentDao.uploadFileForCompany(request,userId,files,companyId,documentCategoryId,documentSourceTypeEnum,expirationDate,name); } diff --git a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java index 1e77eddb..924f379c 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/CompanyServiceImpl.java @@ -4,8 +4,10 @@ import java.io.ByteArrayOutputStream; import java.util.List; import java.util.Map; +import jdk.jshell.execution.Util; import net.gepafin.tendermanagement.model.request.LimitRequest; import net.gepafin.tendermanagement.model.response.VatCheckResponseBean; +import net.gepafin.tendermanagement.util.Utils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -107,6 +109,7 @@ public class CompanyServiceImpl implements CompanyService { public CompanyDelegationResponse uploadCompanyDelegation(HttpServletRequest request, Long companyId, MultipartFile file) { UserEntity userEntity = validator.validateUser(request); validator.validateUserWithCompany(request, companyId); + Utils.validateFileType(file); return delegationDao.uploadCompanyDelegation(userEntity, companyId, file); } 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 d7a46aa6..087bf06b 100644 --- a/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java +++ b/src/main/java/net/gepafin/tendermanagement/service/impl/DocumentServiceImpl.java @@ -11,6 +11,7 @@ import net.gepafin.tendermanagement.enums.DocumentSourceTypeEnum; import net.gepafin.tendermanagement.enums.DocumentTypeEnum; import net.gepafin.tendermanagement.model.response.DocumentResponseBean; import net.gepafin.tendermanagement.service.DocumentService; +import net.gepafin.tendermanagement.util.Utils; import net.gepafin.tendermanagement.util.Validator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -31,6 +32,7 @@ public class DocumentServiceImpl implements DocumentService { public List uploadFile(HttpServletRequest request,List files, Long sourceId, DocumentSourceTypeEnum sourceType, DocumentTypeEnum fileType) { Map userInfo = validator.getUserInfoFromToken(request); Long userId = validator.getUserId(userInfo); + files.forEach(Utils::validateFileType); return documentDao.uploadFiles(userId,files,sourceId,sourceType,fileType); } @Override diff --git a/src/main/java/net/gepafin/tendermanagement/util/Utils.java b/src/main/java/net/gepafin/tendermanagement/util/Utils.java index 7a578334..e2e06771 100644 --- a/src/main/java/net/gepafin/tendermanagement/util/Utils.java +++ b/src/main/java/net/gepafin/tendermanagement/util/Utils.java @@ -39,6 +39,7 @@ import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.enums.MatchModeEnum; import net.gepafin.tendermanagement.model.request.FilterCriteria; import net.gepafin.tendermanagement.model.request.GlobalFilters; +import net.gepafin.tendermanagement.web.rest.api.errors.*; import net.objecthunter.exp4j.Expression; import net.objecthunter.exp4j.ExpressionBuilder; import org.apache.commons.collections4.MapUtils; @@ -56,13 +57,10 @@ import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import feign.FeignException; import io.micrometer.common.util.StringUtils; -import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientForbiddenException; -import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientNotFoundException; -import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientUnauthorizedException; -import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientValidationException; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; +import org.springframework.web.multipart.MultipartFile; import javax.crypto.Cipher; import javax.crypto.Mac; @@ -114,6 +112,7 @@ public class Utils { } return null; } + public static String extractFileName(String filePath) { if (filePath == null || filePath.isEmpty()) { return null; @@ -126,6 +125,7 @@ public class Utils { return filePath; } } + public static String decodeBase64String(String decodedString) { if (StringUtils.isBlank(decodedString)) { return decodedString; @@ -133,18 +133,20 @@ public class Utils { byte[] decode = Base64.getDecoder().decode(decodedString.getBytes(StandardCharsets.UTF_8)); return new String(decode, StandardCharsets.UTF_8); } - - public static void setIfNotNull(Consumer setter, T value) { - if (value != null) { - setter.accept(value); - } - } - public static void setIfUpdated(Supplier getter, Consumer setter, T newValue) { - T currentValue = getter.get(); - if (newValue != null && !newValue.equals(currentValue)) { - setter.accept(newValue); - } - } + + public static void setIfNotNull(Consumer setter, T value) { + if (value != null) { + setter.accept(value); + } + } + + public static void setIfUpdated(Supplier getter, Consumer setter, T newValue) { + T currentValue = getter.get(); + if (newValue != null && !newValue.equals(currentValue)) { + setter.accept(newValue); + } + } + public static String convertListToJsonString(List list) { try { return mapper.writeValueAsString(list); @@ -154,6 +156,7 @@ public class Utils { return null; } } + public static List convertJsonStringToList(String jsonString, Class clazz) { try { TypeReference> typeRef = new TypeReference>() { @@ -169,6 +172,7 @@ public class Utils { return null; } } + public static String convertMapIntoJsonString(Map map) { try { ObjectMapper mapper = new ObjectMapper(); @@ -183,6 +187,7 @@ public class Utils { } return null; } + public static Map convertIntoJson(String jsonString) { if (jsonString != null && !jsonString.isEmpty()) { try { @@ -195,6 +200,7 @@ public class Utils { } return null; } + public static U convertSourceObjectToDestinationObject(T source, Class destinationClass) { try { mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); @@ -205,6 +211,7 @@ public class Utils { } return null; } + public static void retainOnlySpecificFields(T requestObject, List retainFields) throws IllegalAccessException { // Get all declared fields of the request object's class Field[] fields = requestObject.getClass().getDeclaredFields(); @@ -220,22 +227,23 @@ public class Utils { } public static String encodeData(String data) { - return Base64.getEncoder().encodeToString(data.getBytes(StandardCharsets.UTF_8)); - } + return Base64.getEncoder().encodeToString(data.getBytes(StandardCharsets.UTF_8)); + } - public static String decodeData(String token) { - byte[] decodedBytes = Base64.getDecoder().decode(token); - return new String(decodedBytes, StandardCharsets.UTF_8); - } + public static String decodeData(String token) { + byte[] decodedBytes = Base64.getDecoder().decode(token); + return new String(decodedBytes, StandardCharsets.UTF_8); + } public static String generateSecureSamlToken() { - SecureRandom secureRandom = new SecureRandom(); - byte[] tokenBytes = new byte[24]; - secureRandom.nextBytes(tokenBytes); - String token = Base64.getUrlEncoder().withoutPadding().encodeToString(tokenBytes); - log.debug("Generated secure token: {}", token); - return token; - } + SecureRandom secureRandom = new SecureRandom(); + byte[] tokenBytes = new byte[24]; + secureRandom.nextBytes(tokenBytes); + String token = Base64.getUrlEncoder().withoutPadding().encodeToString(tokenBytes); + log.debug("Generated secure token: {}", token); + return token; + } + public static String generateSecureToken() { SecureRandom secureRandom = new SecureRandom(); byte[] tokenBytes = new byte[5]; @@ -244,6 +252,7 @@ public class Utils { log.debug("Generated secure token: {}", token); return token; } + public static Map> convertStringIntoMap(String jsonString) { try { return mapper.readValue(jsonString, new TypeReference>>() { @@ -253,26 +262,26 @@ public class Utils { return null; } } - + public static void callException(Integer staus, FeignException ex) { switch (staus) { - case 400: - throw new FeignClientValidationException(HttpStatus.valueOf(staus), ex.getMessage()); + case 400: + throw new FeignClientValidationException(HttpStatus.valueOf(staus), ex.getMessage()); - case 401: - throw new FeignClientUnauthorizedException(HttpStatus.valueOf(staus), ex.getMessage()); + case 401: + throw new FeignClientUnauthorizedException(HttpStatus.valueOf(staus), ex.getMessage()); - case 403: - throw new FeignClientForbiddenException(HttpStatus.valueOf(staus), ex.getMessage()); + case 403: + throw new FeignClientForbiddenException(HttpStatus.valueOf(staus), ex.getMessage()); - case 404: - throw new FeignClientNotFoundException(HttpStatus.valueOf(staus), ex.getMessage()); - default: - log.error("Exception occured :- {0}", ex); - throw ex; + case 404: + throw new FeignClientNotFoundException(HttpStatus.valueOf(staus), ex.getMessage()); + default: + log.error("Exception occured :- {0}", ex); + throw ex; } } - + public static Boolean isValidEmail(String email) { String EMAIL_REGEX = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$"; if (email == null || email.isEmpty()) { @@ -286,7 +295,7 @@ public class Utils { String data = String.valueOf(System.currentTimeMillis()); return data.substring(data.length() - range); } - + public static String convertObjectToJsonString(Object object) { try { // Check if the object is a string @@ -330,7 +339,7 @@ public class Utils { } } - public static Map> parseJsonContent(String jsonContent) { + public static Map> parseJsonContent(String jsonContent) { ObjectMapper objectMapper = new ObjectMapper(); try { return mapper.readValue(jsonContent, HashMap.class); @@ -339,22 +348,23 @@ public class Utils { } return new HashMap<>(); } - + // Utility method to replace placeholders with their values, handling nulls public static String replacePlaceholders(String text, Map placeholders) { - if (text == null) { - return ""; - } - for (Map.Entry entry : placeholders.entrySet()) { - text = replaceNull(text, entry.getKey(), entry.getValue()); - } - return text; + if (text == null) { + return ""; + } + for (Map.Entry entry : placeholders.entrySet()) { + text = replaceNull(text, entry.getKey(), entry.getValue()); + } + return text; } // Method to safely replace nulls with an empty string or a default value private static String replaceNull(String text, String target, String replacement) { - return text.replace(target, replacement != null ? replacement : ""); + return text.replace(target, replacement != null ? replacement : ""); } + public static String getClientIpAddress(HttpServletRequest request) { String header = request.getHeader("X-Forwarded-For"); if (org.apache.commons.lang3.StringUtils.isBlank(header)) { @@ -363,6 +373,7 @@ public class Utils { return new StringTokenizer(header, ",").nextToken().trim(); } + public static List convertJsonToList(String json, TypeReference> typeRef) { ObjectMapper objectMapper = new ObjectMapper(); try { @@ -375,11 +386,15 @@ public class Utils { public static String convertObjectToJson(Object obj) { try { - if(obj == null){return null;} + if (obj == null) { + return null; + } return new ObjectMapper().writeValueAsString(obj); } catch (JsonProcessingException e) { log.error("Failed to convert object to JSON: {}", e.getMessage(), e); - throw new RuntimeException("Failed to convert object to JSON", e);}} + throw new RuntimeException("Failed to convert object to JSON", e); + } + } public static String replaceSpacesWithUnderscores(String content) { if (content == null) { @@ -387,10 +402,10 @@ public class Utils { } return content.trim().replace(" ", "_"); } + public static List> convertJsonStringIntoJsonList(String jsonString) { try { - if(isEmpty(jsonString)) - { + if (isEmpty(jsonString)) { return new ArrayList<>(); } ObjectMapper mapper = new ObjectMapper(); @@ -401,6 +416,7 @@ public class Utils { } return null; } + public static String convertToString(Object input) { if (input == null) { return "null"; // Return string "null" for null input @@ -462,6 +478,7 @@ public class Utils { throw new RuntimeException("Error converting map to string", e); } } + public static boolean isValidDateString(String dateStr) { Pattern datePattern = Pattern.compile("\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}"); return datePattern.matcher(dateStr).matches(); @@ -479,7 +496,7 @@ public class Utils { return targetFormat.format(date); } catch (ParseException e) { - log.error("error while prcoessing date formate"); + log.error("error while prcoessing date formate"); return null; } } @@ -525,6 +542,7 @@ public class Utils { return "Invalid amount format"; } } + public static boolean isItalianFormattedAmount(String input) { // Regular expression to match Italian-style amounts (e.g., 41.003,00 or 123,45) String sanitizedInput = input.replace(",", ""); @@ -537,7 +555,7 @@ public class Utils { public static String encryptCredential(String value) { try { - if(Boolean.FALSE.equals(isEmpty(value))) { + if (Boolean.FALSE.equals(isEmpty(value))) { IvParameterSpec iv = new IvParameterSpec(GepafinConstant.ENCRYPT_INIT_VECTOR.getBytes("UTF-8")); SecretKeySpec skeySpec = new SecretKeySpec(Base64.getDecoder().decode(GepafinConstant.ENCRYPT_KEY), "AES"); @@ -558,7 +576,7 @@ public class Utils { public static String decryptCredential(String encrypted) { try { - if(Boolean.FALSE.equals(isEmpty(encrypted))) { + if (Boolean.FALSE.equals(isEmpty(encrypted))) { IvParameterSpec iv = new IvParameterSpec(GepafinConstant.ENCRYPT_INIT_VECTOR.getBytes("UTF-8")); SecretKeySpec skeySpec = new SecretKeySpec(Base64.getDecoder().decode(GepafinConstant.ENCRYPT_KEY), "AES"); @@ -621,19 +639,19 @@ public class Utils { return null; } } - - public static void setHttpServletRequestForScheduler() { - MockHttpServletRequest mockRequest = new MockHttpServletRequest(); - mockRequest.setRequestURI("/scheduled"); - mockRequest.setMethod("POST"); - ServletRequestAttributes attributes = new ServletRequestAttributes(mockRequest); - RequestContextHolder.setRequestAttributes(attributes); - } - public static void clearHttpServletRequest() { - // Clear the RequestContextHolder after task execution - RequestContextHolder.resetRequestAttributes(); - } + public static void setHttpServletRequestForScheduler() { + MockHttpServletRequest mockRequest = new MockHttpServletRequest(); + mockRequest.setRequestURI("/scheduled"); + mockRequest.setMethod("POST"); + ServletRequestAttributes attributes = new ServletRequestAttributes(mockRequest); + RequestContextHolder.setRequestAttributes(attributes); + } + + public static void clearHttpServletRequest() { + // Clear the RequestContextHolder after task execution + RequestContextHolder.resetRequestAttributes(); + } public static String generateAuthTokenForLoginToOdessa() { @@ -742,7 +760,8 @@ public class Utils { public static String createChannelForUserAndCompany(Long userId, Long companyId) { return GepafinConstant.COMMON_SINGLE_CHANNEL_PREFIX + userId + GepafinConstant.COMPANY_PREFIX + companyId; } - public static GlobalFilters setPageNumberAndLimit(GlobalFilters globalFilters){ + + public static GlobalFilters setPageNumberAndLimit(GlobalFilters globalFilters) { if (globalFilters == null) { if (globalFilters.getLimit() == null || globalFilters.getLimit() <= 0) { globalFilters.setLimit(GepafinConstant.DEFAULT_PAGE_LIMIT); @@ -770,6 +789,7 @@ public class Utils { private static Map defaultErrorResponse() { return Collections.singletonMap("message", Translator.toLocale(GepafinConstant.INVALID_VATNUMBER)); } + public static List extractValues(String input) { List extractedValues = new ArrayList<>(); Pattern pattern = Pattern.compile("\\{(.*?)\\}"); // Regex to match {value} @@ -780,6 +800,7 @@ public class Utils { } return extractedValues; } + public static double evaluateExpression(String expression) { try { Expression exp = new ExpressionBuilder(expression).build(); @@ -789,6 +810,7 @@ public class Utils { return Double.NaN; // Return NaN if the expression is invalid } } + public static boolean isNumeric(String input) { if (input == null || input.trim().isEmpty()) { return false; @@ -796,9 +818,11 @@ public class Utils { return input.matches("-?\\d+(\\.\\d+)?"); } + public static boolean isValidBoolean(String value) { return "true".equalsIgnoreCase(value) || "false".equalsIgnoreCase(value); } + public static Map convertJsonStringToMap(String jsonString) { try { return mapper.readValue(jsonString, Map.class); @@ -908,8 +932,10 @@ public class Utils { switch (mode) { case DATEIS -> predicates.add(criteriaBuilder.equal(dateField, dateValue)); case DATEISNOT -> predicates.add(criteriaBuilder.notEqual(dateField, dateValue)); - case BEFORE -> predicates.add(criteriaBuilder.lessThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(dateTimeValue))); - case AFTER -> predicates.add(criteriaBuilder.greaterThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(dateTimeValue))); + case BEFORE -> + predicates.add(criteriaBuilder.lessThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(dateTimeValue))); + case AFTER -> + predicates.add(criteriaBuilder.greaterThan(fieldPath.as(Timestamp.class), Timestamp.valueOf(dateTimeValue))); } } } @@ -934,6 +960,12 @@ public class Utils { return (obj instanceof String str) ? str : null; } + public static void validateFileType(MultipartFile file) { + if (file.isEmpty()) { + throw new CustomValidationException(Status.VALIDATION_ERROR, + Translator.toLocale(GepafinConstant.VALIDATION_ERROR_FILE_EMPTY)); + } + } public static void applyFiltersByPagination(Root root, CriteriaBuilder criteriaBuilder, List predicates, Map filters) { if (Boolean.FALSE.equals(filters.isEmpty())) { @@ -948,10 +980,11 @@ public class Utils { if (fieldPath != null) { Utils.applyStringFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); Utils.applyNumberFilter(fieldPath, criteriaBuilder, predicates, value, matchMode); - Utils.applyDateFilter(fieldPath, criteriaBuilder, predicates, value, matchMode,root); + Utils.applyDateFilter(fieldPath, criteriaBuilder, predicates, value, matchMode, root); } } } } } -} \ No newline at end of file +} +