diff --git a/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/models/ResultadoPaginado.java b/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/models/ResultadoPaginado.java new file mode 100644 index 00000000..bc24b925 --- /dev/null +++ b/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/models/ResultadoPaginado.java @@ -0,0 +1,15 @@ +package main.java.com.code.hyperledger.models; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ResultadoPaginado { + private List recetas; + private String bookmark; +} diff --git a/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/services/RecetaService.java b/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/services/RecetaService.java index 74d141c5..e022418d 100644 --- a/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/services/RecetaService.java +++ b/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/services/RecetaService.java @@ -1,6 +1,7 @@ package com.code.hyperledger.services; import com.code.hyperledger.models.Receta; +import com.code.hyperledger.models.RecetaDto; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -8,6 +9,8 @@ import io.grpc.Grpc; import io.grpc.ManagedChannel; import io.grpc.TlsChannelCredentials; import lombok.SneakyThrows; +import main.java.com.code.hyperledger.models.ResultadoPaginado; + import org.hyperledger.fabric.client.*; import org.hyperledger.fabric.client.identity.*; import org.springframework.stereotype.Service; @@ -17,7 +20,9 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.security.Identity; import java.security.InvalidKeyException; +import java.security.Signer; import java.security.cert.CertificateException; import java.util.ArrayList; import java.util.List; @@ -152,24 +157,21 @@ public class RecetaService { public List obtenerRecetasPorIds(List recetaIds) throws GatewayException, IOException { ObjectMapper objectMapper = new ObjectMapper(); - // 🔍 Log de entrada - System.out.println("⏩ Solicitando recetas con IDs: " + recetaIds); + System.out.println("Solicitando recetas con IDs: " + recetaIds); String idsJson = objectMapper.writeValueAsString(recetaIds); var evaluateResult = contract.evaluateTransaction("GetMultipleRecetas", idsJson); if (evaluateResult == null || evaluateResult.length == 0) { - System.err.println("⚠️ GetMultipleRecetas devolvió una respuesta vacía."); + System.err.println("GetMultipleRecetas devolvió una respuesta vacía."); return new ArrayList<>(); } List recetas = objectMapper.readValue( - evaluateResult, - objectMapper.getTypeFactory().constructCollectionType(List.class, Receta.class) - ); + evaluateResult, + objectMapper.getTypeFactory().constructCollectionType(List.class, Receta.class)); - // ✅ Log de salida - System.out.println("✅ Recetas obtenidas del contrato:"); + System.out.println("Recetas obtenidas del contrato:"); for (Receta receta : recetas) { System.out.println(" - ID: " + receta.getId() + " | Estado: " + receta.getStatus()); } @@ -178,12 +180,12 @@ public class RecetaService { } public void entregarReceta(String recetaId) - throws CommitStatusException, EndorseException, CommitException, SubmitException { - contract.submitTransaction("EntregarReceta", recetaId); + throws CommitStatusException, EndorseException, CommitException, SubmitException { + contract.submitTransaction("EntregarReceta", recetaId); } public void firmarReceta(String recetaId, String signature) - throws CommitStatusException, EndorseException, CommitException, SubmitException { + throws CommitStatusException, EndorseException, CommitException, SubmitException { System.out.println("[INFO] Iniciando firma de receta con ID: " + recetaId); try { var evaluateResult = contract.submitTransaction("FirmarReceta", recetaId, signature); @@ -196,7 +198,7 @@ public class RecetaService { } public void borrarReceta(String recetaId) - throws CommitStatusException, EndorseException, CommitException, SubmitException { + throws CommitStatusException, EndorseException, CommitException, SubmitException { System.out.println("[INFO] Iniciando borrado de receta con ID: " + recetaId); try { var evaluateResult = contract.submitTransaction("DeleteReceta", recetaId); @@ -208,14 +210,20 @@ public class RecetaService { } } - public List obtenerRecetasPorDniYEstado(String dni, String estado) throws GatewayException, IOException { + public ResultadoPaginado obtenerRecetasPorDniYEstadoPaginado( + String dni, String estado, int pageSize, String bookmark) throws GatewayException, IOException { + if (dni == null || dni.isBlank() || estado == null || estado.isBlank()) { throw new IllegalArgumentException("DNI y estado son obligatorios"); } - var evaluateResult = contract.evaluateTransaction("GetRecetasPorDniYEstado", dni, estado); - ObjectMapper objectMapper = new ObjectMapper(); - return objectMapper.readValue(evaluateResult, - objectMapper.getTypeFactory().constructCollectionType(List.class, Receta.class)); + var result = contract.evaluateTransaction("GetRecetasPorDniYEstado", dni, estado, String.valueOf(pageSize), + bookmark); + + var type = new ObjectMapper() + .getTypeFactory() + .constructParametricType(ResultadoPaginado.class, RecetaDto.class); + + return new ObjectMapper().readValue(result, type); } }