package com.banesco.common.application.helper; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import io.netty.util.internal.StringUtil; import io.quarkus.runtime.annotations.RegisterForReflection; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; import java.nio.charset.StandardCharsets; import java.util.*; @Slf4j @ApplicationScoped @RegisterForReflection public class SerializationHelper { private final ObjectMapper objectMapper; @Inject public SerializationHelper( ObjectMapper objectMapper ) { this.objectMapper = objectMapper; } public String encodeBase64(Object object) { try { String jsonString = objectMapper.writeValueAsString(object); return Base64.getEncoder().encodeToString(jsonString.getBytes()); } catch (Exception e) { log.error("Error al codificar a Base64: {}", e.getMessage()); return null; } } public String encodeStringToBase64(String text) { if (StringUtil.isNullOrEmpty(text)) { return null; } return Base64.getEncoder().encodeToString(text.getBytes(StandardCharsets.UTF_8)); } public T decodeBase64(String base64String, Class clazz) { try { byte[] decodedBytes = Base64.getDecoder().decode(base64String); String jsonString = new String(decodedBytes); return objectMapper.readValue(jsonString, clazz); } catch (Exception e) { log.error("Error al decodificar desde Base64: {}", e.getMessage()); return null; } } public String encodeSha256(String json) { return DigestUtils.sha256Hex(json); } public String toJsonString(T element) { if (element == null) { return ""; } try { return objectMapper.writeValueAsString(element); } catch (JsonProcessingException e) { log.error("Error al convertir objeto a Json String: {}", e.getMessage()); return ""; } } public Map toMap(T element) { return toMap(element, null); } public Map toMap( T element, List excludedFields ) { if (element == null) { return new HashMap<>(); } try { Map map = objectMapper.convertValue( element, new TypeReference<>() {} ); if (excludedFields != null && !excludedFields.isEmpty()) { Set excludedSet = new HashSet<>(excludedFields); excludedSet.forEach(map::remove); } return map; } catch (Exception e) { log.error("Error al convertir objeto a Map: {}", e.getMessage()); return new HashMap<>(); } } public Map toTreeMap(T element) { return toTreeMap(element, null); } public Map toTreeMap( T element, List excludedFields ) { if (element == null) { return new TreeMap<>(); } try { Map tempMap = objectMapper.convertValue( element, new TypeReference<>() {} ); Map treeMap = new TreeMap<>(tempMap); if (excludedFields != null && !excludedFields.isEmpty()) { Set excludedSet = new HashSet<>(excludedFields); excludedSet.forEach(treeMap::remove); } return treeMap; } catch (Exception e) { log.error("Error al convertir objeto a TreeMap: {}", e.getMessage()); return new TreeMap<>(); } } public String generateSignature( Object operation, String channelOrigin ) { Map operationSortedMap = toTreeMap(operation); StringBuilder concatenatedValues = new StringBuilder(); String channelBase64 = encodeStringToBase64(channelOrigin); for (Object value : operationSortedMap.values()) { if(!Objects.isNull(value)) { concatenatedValues.append(value); } } String finalString = concatenatedValues + channelBase64; log.info("1. Operation concatenando valores: {}", concatenatedValues); log.info("2. Channel Origin codificado: {}", channelBase64); return encodeSha256(finalString); } public String generateSignature( Long id, String channelOrigin ) { String channelBase64 = encodeStringToBase64(channelOrigin); String finalString = id + channelBase64; log.info("1. Operation concatenando valores: {}", finalString); log.info("2. Channel Origin codificado: {}", channelBase64); return encodeSha256(finalString); } }