From f5a896365f74f26df8660a6825ccd23e5a93c4bd Mon Sep 17 00:00:00 2001 From: luc662 Date: Sat, 12 Jul 2025 21:00:03 +0000 Subject: [PATCH 1/3] =?UTF-8?q?se=20agreg=C3=B3=20parametrizacion=20para?= =?UTF-8?q?=20el=20controller=20de=20receta.=20se=20coment=C3=B3=20resulta?= =?UTF-8?q?doPaginado.=20se=20eliminaron=20try=20catch=20de=20debugging=20?= =?UTF-8?q?en=20el=20lado=20de=20recetas.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- asset-transfer-basic/maven-API-SiMeDi/pom.xml | 11 + .../main/java/com/code/hyperledger/App.java | 4 +- .../controllers/RecetaController.java | 25 ++- .../hyperledger/models/ResultadoPaginado.java | 3 +- .../hyperledger/services/RecetaService.java | 200 ++++++------------ .../src/main/resources/application.properties | 14 ++ 6 files changed, 118 insertions(+), 139 deletions(-) diff --git a/asset-transfer-basic/maven-API-SiMeDi/pom.xml b/asset-transfer-basic/maven-API-SiMeDi/pom.xml index 16c4a360..8da5b37b 100644 --- a/asset-transfer-basic/maven-API-SiMeDi/pom.xml +++ b/asset-transfer-basic/maven-API-SiMeDi/pom.xml @@ -48,6 +48,17 @@ grpc-api 1.59.0 + + + io.grpc + grpc-core + 1.59.0 + + + + org.springframework.boot + spring-boot-starter + org.projectlombok diff --git a/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/App.java b/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/App.java index b274afae..ed768797 100644 --- a/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/App.java +++ b/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/App.java @@ -4,6 +4,8 @@ package com.code.hyperledger; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import com.code.hyperledger.config.FabricConfigProperties; import com.code.hyperledger.models.Receta; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -33,7 +35,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - +@EnableConfigurationProperties(FabricConfigProperties.class) @SpringBootApplication public class App { /*private static final String MSP_ID = System.getenv().getOrDefault("MSP_ID", "Org1MSP"); diff --git a/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/controllers/RecetaController.java b/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/controllers/RecetaController.java index b0d2e93a..98a4e8a1 100644 --- a/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/controllers/RecetaController.java +++ b/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/controllers/RecetaController.java @@ -120,9 +120,6 @@ public class RecetaController { } List recetas = recetaService.obtenerRecetasPorIds(ids); - - // 🔍 Log de los IDs obtenidos desde el service - System.out.println("Recetas obtenidas del service con los siguientes IDs:"); for (Receta receta : recetas) { System.out.println(" - " + receta.getId()); } @@ -132,10 +129,19 @@ public class RecetaController { recetasDto.add(mapToDto(receta)); } + System.out.println("Recetas obtenidas del service con los siguientes IDs:"); + return new ResponseEntity<>(recetasDto, HttpStatus.OK); + + // 🔍 Log de los IDs obtenidos desde el service + } catch (IOException | GatewayException e) { e.printStackTrace(); return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } catch (Exception e) { + System.err.println("Error en submitTransaction: " + e.getMessage()); + e.printStackTrace(); + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } } @@ -159,6 +165,10 @@ public class RecetaController { e.printStackTrace(); // este bloque rara vez se ejecutaría si ya atrapás las anteriores return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } + catch (Exception e) { + e.printStackTrace(); // este bloque rara vez se ejecutaría si ya atrapás las anteriores + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } } @PutMapping("/firmar") @@ -182,9 +192,12 @@ public class RecetaController { e.printStackTrace(); // este bloque rara vez se ejecutaría si ya atrapás las anteriores return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } + catch (Exception e) { + e.printStackTrace(); // este bloque rara vez se ejecutaría si ya atrapás las anteriores + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } } - @PostMapping("/borrar") public ResponseEntity delete(@RequestBody Map requestBody) { try { @@ -205,6 +218,10 @@ public class RecetaController { e.printStackTrace(); // este bloque rara vez se ejecutaría si ya atrapás las anteriores return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } + catch (Exception e) { + e.printStackTrace(); // este bloque rara vez se ejecutaría si ya atrapás las anteriores + return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); + } } private RecetaDto mapToDto(Receta receta) { 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 index bc24b925..2dc39923 100644 --- 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 @@ -1,4 +1,4 @@ -package main.java.com.code.hyperledger.models; +/*package com.code.hyperledger.models; import lombok.AllArgsConstructor; import lombok.Data; @@ -13,3 +13,4 @@ public class ResultadoPaginado { private List recetas; private String bookmark; } +*/ \ No newline at end of file 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 e022418d..7a518e21 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,28 +1,26 @@ package com.code.hyperledger.services; +import io.grpc.TlsChannelCredentials; +import io.grpc.Grpc; +import io.grpc.ManagedChannel; +import com.code.hyperledger.config.FabricConfigProperties; import com.code.hyperledger.models.Receta; import com.code.hyperledger.models.RecetaDto; +//import com.code.hyperledger.models.ResultadoPaginado; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -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.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; 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.io.Reader; +import java.nio.file.*; import java.security.InvalidKeyException; -import java.security.Signer; import java.security.cert.CertificateException; import java.util.ArrayList; import java.util.List; @@ -31,23 +29,20 @@ import java.util.concurrent.TimeUnit; @Service public class RecetaService { - private static final String MSP_ID = System.getenv().getOrDefault("MSP_ID", "Org1MSP"); - private static final String CHANNEL_NAME = System.getenv().getOrDefault("CHANNEL_NAME", "mychannel"); - private static final String CHAINCODE_NAME = System.getenv().getOrDefault("CHAINCODE_NAME", "basic"); - - private static final Path CRYPTO_PATH = Paths - .get("../../test-network/organizations/peerOrganizations/org1.example.com"); - private static final Path CERT_DIR_PATH = CRYPTO_PATH.resolve("users/User1@org1.example.com/msp/signcerts"); - private static final Path KEY_DIR_PATH = CRYPTO_PATH.resolve("users/User1@org1.example.com/msp/keystore"); - private static final Path TLS_CERT_PATH = CRYPTO_PATH.resolve("peers/peer0.org1.example.com/tls/ca.crt"); - - private static final String PEER_ENDPOINT = "localhost:7051"; - private static final String OVERRIDE_AUTH = "peer0.org1.example.com"; - + private final FabricConfigProperties config; private Contract contract; private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); - private static Path getFirstFilePath(Path dirPath) throws IOException { + @Autowired + public RecetaService(FabricConfigProperties config) { + this.config = config; + } + + private Path getPath(String relativePath) { + return Paths.get(config.getCryptoPath()).resolve(relativePath); + } + + private Path getFirstFilePath(Path dirPath) throws IOException { try (var keyFiles = Files.list(dirPath)) { return keyFiles.findFirst().orElseThrow(); } @@ -58,47 +53,50 @@ public class RecetaService { public void init() { var channel = newGrpcConnection(); - var builder = Gateway.newInstance() + var gateway = Gateway.newInstance() .identity(newIdentity()) .signer(newSigner()) .connection(channel) .evaluateOptions(options -> options.withDeadlineAfter(5, TimeUnit.SECONDS)) .endorseOptions(options -> options.withDeadlineAfter(15, TimeUnit.SECONDS)) .submitOptions(options -> options.withDeadlineAfter(5, TimeUnit.SECONDS)) - .commitStatusOptions(options -> options.withDeadlineAfter(1, TimeUnit.MINUTES)); + .commitStatusOptions(options -> options.withDeadlineAfter(1, TimeUnit.MINUTES)) + .connect(); - try (var gateway = builder.connect()) { - this.setContract(gateway); - this.initLedger(); - } + this.setContract(gateway); + this.initLedger(); } - private static ManagedChannel newGrpcConnection() throws IOException { + private ManagedChannel newGrpcConnection() throws IOException { + var tlsCertPath = getPath(config.getTlsCertPath()); var credentials = TlsChannelCredentials.newBuilder() - .trustManager(TLS_CERT_PATH.toFile()) + .trustManager(tlsCertPath.toFile()) .build(); - return Grpc.newChannelBuilder(PEER_ENDPOINT, credentials) - .overrideAuthority(OVERRIDE_AUTH) + + return Grpc.newChannelBuilder(config.getPeerEndpoint(), credentials) + .overrideAuthority(config.getOverrideAuth()) .build(); } private Identity newIdentity() throws IOException, CertificateException { - try (var certReader = Files.newBufferedReader(getFirstFilePath(CERT_DIR_PATH))) { + Path certPath = getFirstFilePath(getPath(config.getCertPath())); + try (Reader certReader = Files.newBufferedReader(certPath)) { var certificate = Identities.readX509Certificate(certReader); - return new X509Identity(MSP_ID, certificate); + return new X509Identity(config.getMspId(), certificate); } } private Signer newSigner() throws IOException, InvalidKeyException { - try (var keyReader = Files.newBufferedReader(getFirstFilePath(KEY_DIR_PATH))) { + Path keyPath = getFirstFilePath(getPath(config.getKeyPath())); + try (Reader keyReader = Files.newBufferedReader(keyPath)) { var privateKey = Identities.readPrivateKey(keyReader); return Signers.newPrivateKeySigner(privateKey); } } private void setContract(final Gateway gateway) { - var network = gateway.getNetwork(CHANNEL_NAME); - contract = network.getContract(CHAINCODE_NAME); + var network = gateway.getNetwork(config.getChannelName()); + contract = network.getContract(config.getChaincodeName()); } private void initLedger() throws EndorseException, SubmitException, CommitStatusException, CommitException { @@ -110,120 +108,56 @@ public class RecetaService { try { ObjectMapper objectMapper = new ObjectMapper(); String recetaJson = objectMapper.writeValueAsString(receta); - contract.submitTransaction("CreateReceta", recetaJson); - System.out.println("Receta creada correctamente"); } catch (Exception e) { System.err.println("Error en submitTransaction: " + e.getMessage()); e.printStackTrace(); } } - public Receta obtenerReceta(String recetaId) throws GatewayException, IOException { - System.out.println("[INFO] Iniciando obtención de receta con ID: " + recetaId); - - try { - System.out.println("[DEBUG] Ejecutando transacción 'ReadReceta' con ID: " + recetaId); - var evaluateResult = contract.evaluateTransaction("ReadReceta", recetaId); - System.out.println("[DEBUG] Resultado de transacción recibido: " + new String(evaluateResult)); - - ObjectMapper objectMapper = new ObjectMapper(); - Receta receta = objectMapper.readValue(evaluateResult, Receta.class); - System.out.println("[INFO] Receta parseada exitosamente para ID: " + recetaId); - - return receta; - } catch (GatewayException e) { - System.err.println("[ERROR] GatewayException al obtener receta con ID: " + recetaId); - e.printStackTrace(System.err); - throw e; - } catch (IOException e) { - System.err.println("[ERROR] IOException al parsear receta con ID: " + recetaId); - e.printStackTrace(System.err); - throw e; - } catch (Exception e) { - System.err.println("[ERROR] Error inesperado al obtener receta con ID: " + recetaId); - e.printStackTrace(System.err); - throw new RuntimeException("Error inesperado al obtener la receta", e); - } + public Receta obtenerReceta(String recetaId) throws Exception { + var evaluateResult = contract.evaluateTransaction("ReadReceta", recetaId); + return new ObjectMapper().readValue(evaluateResult, Receta.class); } - public List obtenerTodasLasRecetas() throws GatewayException, IOException { + public List obtenerTodasLasRecetas() throws Exception { var evaluateResult = contract.evaluateTransaction("GetAllRecetas"); - ObjectMapper objectMapper = new ObjectMapper(); - return objectMapper.readValue(evaluateResult, - objectMapper.getTypeFactory().constructCollectionType(List.class, Receta.class)); + return new ObjectMapper().readValue(evaluateResult, + new ObjectMapper().getTypeFactory().constructCollectionType(List.class, Receta.class)); } - public List obtenerRecetasPorIds(List recetaIds) throws GatewayException, IOException { - ObjectMapper objectMapper = new ObjectMapper(); - - System.out.println("Solicitando recetas con IDs: " + recetaIds); - - String idsJson = objectMapper.writeValueAsString(recetaIds); + public List obtenerRecetasPorIds(List recetaIds) throws Exception { + String idsJson = new ObjectMapper().writeValueAsString(recetaIds); var evaluateResult = contract.evaluateTransaction("GetMultipleRecetas", idsJson); - - if (evaluateResult == null || evaluateResult.length == 0) { - System.err.println("GetMultipleRecetas devolvió una respuesta vacía."); - return new ArrayList<>(); - } - - List recetas = objectMapper.readValue( - evaluateResult, - objectMapper.getTypeFactory().constructCollectionType(List.class, Receta.class)); - - System.out.println("Recetas obtenidas del contrato:"); - for (Receta receta : recetas) { - System.out.println(" - ID: " + receta.getId() + " | Estado: " + receta.getStatus()); - } - - return recetas; + return new ObjectMapper().readValue(evaluateResult, + new ObjectMapper().getTypeFactory().constructCollectionType(List.class, Receta.class)); } - public void entregarReceta(String recetaId) - throws CommitStatusException, EndorseException, CommitException, SubmitException { + public void entregarReceta(String recetaId) throws Exception { contract.submitTransaction("EntregarReceta", recetaId); } - public void firmarReceta(String recetaId, String signature) - throws CommitStatusException, EndorseException, CommitException, SubmitException { - System.out.println("[INFO] Iniciando firma de receta con ID: " + recetaId); - try { - var evaluateResult = contract.submitTransaction("FirmarReceta", recetaId, signature); - System.out.println("[DEBUG] Resultado de transacción recibido: " + new String(evaluateResult)); - System.out.println("[INFO] Receta firmada exitosamente para ID: " + recetaId); - } catch (Exception e) { - System.err.println("[ERROR] Error al firmar receta: " + e.getMessage()); - e.printStackTrace(); - } + public void firmarReceta(String recetaId, String signature) throws Exception { + contract.submitTransaction("FirmarReceta", recetaId, signature); } - public void borrarReceta(String recetaId) - throws CommitStatusException, EndorseException, CommitException, SubmitException { - System.out.println("[INFO] Iniciando borrado de receta con ID: " + recetaId); - try { - var evaluateResult = contract.submitTransaction("DeleteReceta", recetaId); - System.out.println("[DEBUG] Resultado de transacción recibido: " + new String(evaluateResult)); - System.out.println("[INFO] Receta borrada exitosamente para ID: " + recetaId); - } catch (Exception e) { - System.err.println("[ERROR] Error al borrar receta: " + e.getMessage()); - e.printStackTrace(); - } + public void borrarReceta(String recetaId) throws Exception { + contract.submitTransaction("DeleteReceta", recetaId); } - 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 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); - } + /* + * public ResultadoPaginado obtenerRecetasPorDniYEstadoPaginado( + * String dni, String estado, int pageSize, String bookmark) throws Exception { + * + * 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); + * } + */ } diff --git a/asset-transfer-basic/maven-API-SiMeDi/src/main/resources/application.properties b/asset-transfer-basic/maven-API-SiMeDi/src/main/resources/application.properties index 0ea488cf..f4f9af3f 100644 --- a/asset-transfer-basic/maven-API-SiMeDi/src/main/resources/application.properties +++ b/asset-transfer-basic/maven-API-SiMeDi/src/main/resources/application.properties @@ -1 +1,15 @@ spring.application.name=main + +# Fabric configs +fabric.mspId=Org1MSP +fabric.channelName=mychannel +fabric.chaincodeName=basic +fabric.peerEndpoint=localhost:7051 +fabric.overrideAuth=peer0.org1.example.com + +# Rutas a certificados y claves +fabric.cryptoPath=../../test-network/organizations/peerOrganizations/org1.example.com +fabric.certPath=users/User1@org1.example.com/msp/signcerts +fabric.keyPath=users/User1@org1.example.com/msp/keystore +fabric.tlsCertPath=peers/peer0.org1.example.com/tls/ca.crt + From e3ab73be0cab4ec0ee0671957b855fbf4f59e29d Mon Sep 17 00:00:00 2001 From: luc662 Date: Sun, 13 Jul 2025 20:58:11 +0000 Subject: [PATCH 2/3] se cambio el nombre de la carpeta a configs para evitar conglictos con el gitignore --- .../main/java/com/code/hyperledger/App.java | 2 +- .../configs/FabricConfigProperties.java | 22 +++++++++++++++++++ .../hyperledger/services/RecetaService.java | 2 +- 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/configs/FabricConfigProperties.java diff --git a/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/App.java b/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/App.java index ed768797..d0c7488b 100644 --- a/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/App.java +++ b/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/App.java @@ -5,7 +5,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import com.code.hyperledger.config.FabricConfigProperties; +import com.code.hyperledger.configs.FabricConfigProperties; import com.code.hyperledger.models.Receta; import com.google.gson.Gson; import com.google.gson.GsonBuilder; diff --git a/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/configs/FabricConfigProperties.java b/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/configs/FabricConfigProperties.java new file mode 100644 index 00000000..af67f47d --- /dev/null +++ b/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/configs/FabricConfigProperties.java @@ -0,0 +1,22 @@ +package com.code.hyperledger.configs; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Configuration; + +@Getter +@Setter +@ConfigurationProperties(prefix = "fabric") +public class FabricConfigProperties { + private String mspId; + private String channelName; + private String chaincodeName; + private String peerEndpoint; + private String overrideAuth; + + private String cryptoPath; + private String certPath; + private String keyPath; + private String tlsCertPath; +} 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 7a518e21..2493db72 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 @@ -3,7 +3,7 @@ package com.code.hyperledger.services; import io.grpc.TlsChannelCredentials; import io.grpc.Grpc; import io.grpc.ManagedChannel; -import com.code.hyperledger.config.FabricConfigProperties; +import com.code.hyperledger.configs.FabricConfigProperties; import com.code.hyperledger.models.Receta; import com.code.hyperledger.models.RecetaDto; //import com.code.hyperledger.models.ResultadoPaginado; From 8693456d5d273de217097230d9443b5e18e10fed Mon Sep 17 00:00:00 2001 From: luc662 Date: Tue, 15 Jul 2025 22:47:01 +0000 Subject: [PATCH 3/3] refactor de vacuna --- .../hyperledger/services/RecetaService.java | 2 +- .../hyperledger/services/VacunaService.java | 51 ++++++++----------- 2 files changed, 23 insertions(+), 30 deletions(-) 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 2493db72..068940a3 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 @@ -98,7 +98,7 @@ public class RecetaService { var network = gateway.getNetwork(config.getChannelName()); contract = network.getContract(config.getChaincodeName()); } - + // crea dos recetas default, borrar cuando no se necesite private void initLedger() throws EndorseException, SubmitException, CommitStatusException, CommitException { contract.submitTransaction("InitLedger"); } diff --git a/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/services/VacunaService.java b/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/services/VacunaService.java index 7473b21d..a64ee8bd 100644 --- a/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/services/VacunaService.java +++ b/asset-transfer-basic/maven-API-SiMeDi/src/main/java/com/code/hyperledger/services/VacunaService.java @@ -1,6 +1,6 @@ package com.code.hyperledger.services; -import com.code.hyperledger.models.Receta; +import com.code.hyperledger.configs.FabricConfigProperties; import com.code.hyperledger.models.Vacuna; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; @@ -9,17 +9,13 @@ import io.grpc.Grpc; import io.grpc.ManagedChannel; import io.grpc.TlsChannelCredentials; import lombok.SneakyThrows; -import com.code.hyperledger.models.VacunaDto; - import org.hyperledger.fabric.client.*; import org.hyperledger.fabric.client.identity.*; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; +import java.nio.file.*; import java.security.InvalidKeyException; import java.security.cert.CertificateException; import java.util.ArrayList; @@ -29,23 +25,15 @@ import java.util.concurrent.TimeUnit; @Service public class VacunaService { - private static final String MSP_ID = System.getenv().getOrDefault("MSP_ID", "Org1MSP"); - private static final String CHANNEL_NAME = System.getenv().getOrDefault("CHANNEL_NAME", "mychannel"); - private static final String CHAINCODE_NAME = System.getenv().getOrDefault("CHAINCODE_NAME", "basic"); - - private static final Path CRYPTO_PATH = Paths - .get("../../test-network/organizations/peerOrganizations/org1.example.com"); - private static final Path CERT_DIR_PATH = CRYPTO_PATH.resolve("users/User1@org1.example.com/msp/signcerts"); - private static final Path KEY_DIR_PATH = CRYPTO_PATH.resolve("users/User1@org1.example.com/msp/keystore"); - private static final Path TLS_CERT_PATH = CRYPTO_PATH.resolve("peers/peer0.org1.example.com/tls/ca.crt"); - - private static final String PEER_ENDPOINT = "localhost:7051"; - private static final String OVERRIDE_AUTH = "peer0.org1.example.com"; - + private final FabricConfigProperties config; private Contract contract; private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); - private static Path getFirstFilePath(Path dirPath) throws IOException { + public VacunaService(FabricConfigProperties config) { + this.config = config; + } + + private Path getFirstFilePath(Path dirPath) throws IOException { try (var keyFiles = Files.list(dirPath)) { return keyFiles.findFirst().orElseThrow(); } @@ -70,34 +58,39 @@ public class VacunaService { } } - private static ManagedChannel newGrpcConnection() throws IOException { + private ManagedChannel newGrpcConnection() throws IOException { + Path tlsPath = Paths.get(config.getCryptoPath(), config.getTlsCertPath()); var credentials = TlsChannelCredentials.newBuilder() - .trustManager(TLS_CERT_PATH.toFile()) + .trustManager(tlsPath.toFile()) .build(); - return Grpc.newChannelBuilder(PEER_ENDPOINT, credentials) - .overrideAuthority(OVERRIDE_AUTH) + return Grpc.newChannelBuilder(config.getPeerEndpoint(), credentials) + .overrideAuthority(config.getOverrideAuth()) .build(); } private Identity newIdentity() throws IOException, CertificateException { - try (var certReader = Files.newBufferedReader(getFirstFilePath(CERT_DIR_PATH))) { + Path certPath = Paths.get(config.getCryptoPath(), config.getCertPath()); + try (var certReader = Files.newBufferedReader(getFirstFilePath(certPath))) { var certificate = Identities.readX509Certificate(certReader); - return new X509Identity(MSP_ID, certificate); + return new X509Identity(config.getMspId(), certificate); } } private Signer newSigner() throws IOException, InvalidKeyException { - try (var keyReader = Files.newBufferedReader(getFirstFilePath(KEY_DIR_PATH))) { + Path keyPath = Paths.get(config.getCryptoPath(), config.getKeyPath()); + try (var keyReader = Files.newBufferedReader(getFirstFilePath(keyPath))) { var privateKey = Identities.readPrivateKey(keyReader); return Signers.newPrivateKeySigner(privateKey); } } private void setContract(final Gateway gateway) { - var network = gateway.getNetwork(CHANNEL_NAME); - contract = network.getContract(CHAINCODE_NAME); + var network = gateway.getNetwork(config.getChannelName()); + contract = network.getContract(config.getChaincodeName()); } + // Todos los métodos siguientes permanecen idénticos... + public void cargarVacuna(Vacuna vacuna) throws CommitStatusException, EndorseException, CommitException, SubmitException { try {