From 15fce03a94d785a5618140eadc9ff838aa70261d Mon Sep 17 00:00:00 2001 From: luc662 Date: Tue, 19 Aug 2025 23:00:48 +0000 Subject: [PATCH] cambios para el paginado, ahora funciona --- .../chaincode-go/chaincode/smartcontract.go | 70 ++++++++++++++----- .../controllers/RecetaController.java | 5 ++ .../hyperledger/services/RecetaService.java | 6 +- 3 files changed, 62 insertions(+), 19 deletions(-) diff --git a/asset-transfer-basic/chaincode-go/chaincode/smartcontract.go b/asset-transfer-basic/chaincode-go/chaincode/smartcontract.go index 0e7ee879..ca455f4c 100644 --- a/asset-transfer-basic/chaincode-go/chaincode/smartcontract.go +++ b/asset-transfer-basic/chaincode-go/chaincode/smartcontract.go @@ -33,7 +33,7 @@ type Receta struct { Practitioner string `json:"practitioner"` PractitionerDocumentNumber string `json:"practitionerDocumentNumber"` Signature string `json:"signature"` - Matricula string `json:"matricula"` + Matricula string `json:"matricula"` } type Vacuna struct { @@ -51,10 +51,11 @@ type Vacuna struct { Reactions string `json:"reactions"` // puede ser un string o una estructura si querés después Practitioner string `json:"practitioner"` PractitionerDocumentNumber string `json:"practitionerDocumentNumber"` - Matricula string `json:"matricula"` + Matricula string `json:"matricula"` } type Estado string + const ( EstadoDraft Estado = "draft" EstadoActive Estado = "active" @@ -361,36 +362,73 @@ func (s *SmartContract) GetMultipleRecetas(ctx contractapi.TransactionContextInt } // TODO: adaptar los campos para que se tengan un identificar de usuarios ademas del DNI -func (s *SmartContract) GetRecetasPorDniYEstado(ctx contractapi.TransactionContextInterface, dni string, estado string) ([]*Receta, error) { +type ResultadoPaginado struct { + Recetas []*Receta `json:"recetas"` + Bookmark string `json:"bookmark"` +} + +func (s *SmartContract) GetRecetasPorDniYEstadoPaginado( + ctx contractapi.TransactionContextInterface, + dni string, + estado string, + pageSize int32, + bookmark string, +) (*ResultadoPaginado, error) { + if dni == "" || estado == "" { return nil, fmt.Errorf("el dni y el estado son obligatorios") } - resultsIterator, err := ctx.GetStub().GetStateByRange("", "") + // Creamos la query para CouchDB + query := map[string]interface{}{ + "selector": map[string]interface{}{ + "patientDocumentNumber": dni, + "status": estado, + }, + "limit": pageSize, + } + + // Si hay bookmark, lo agregamos + if bookmark != "" { + query["bookmark"] = bookmark + } + + queryBytes, err := json.Marshal(query) if err != nil { - return nil, fmt.Errorf("error al obtener datos del ledger: %v", err) + return nil, fmt.Errorf("error al generar la query: %v", err) + } + + resultsIterator, metadata, err := ctx.GetStub().GetQueryResultWithPagination(string(queryBytes), pageSize, bookmark) + if err != nil { + return nil, fmt.Errorf("error al ejecutar la query: %v", err) } defer resultsIterator.Close() - var recetasFiltradas []*Receta + var recetas []*Receta for resultsIterator.HasNext() { - queryResponse, err := resultsIterator.Next() - if err != nil { - return nil, err + response, iterErr := resultsIterator.Next() + if iterErr != nil { + return nil, iterErr } var receta Receta - err = json.Unmarshal(queryResponse.Value, &receta) - if err != nil { - return nil, err + if err := json.Unmarshal(response.Value, &receta); err != nil { + return nil, fmt.Errorf("error al parsear receta: %v", err) } - if receta.PatientDocumentNumber == dni && receta.Status == estado { - recetasFiltradas = append(recetasFiltradas, &receta) - } + recetas = append(recetas, &receta) } - return recetasFiltradas, nil + if recetas == nil { + recetas = []*Receta{} + } + + resultado := &ResultadoPaginado{ + Recetas: recetas, + Bookmark: metadata.Bookmark, + } + + return resultado, nil } func (s *SmartContract) CreateVacuna(ctx contractapi.TransactionContextInterface, vacuna Vacuna) error { 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 14b9576f..e1850ef4 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 @@ -197,6 +197,11 @@ public class RecetaController { } } + @GetMapping("/todasTest") + public List obtenerTodasTest() throws Exception { + return recetaService.obtenerTodasLasRecetas(); + } + @PostMapping("/borrar") public ResponseEntity delete(@RequestBody Map requestBody) { try { 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 c67395c3..97d2f62a 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 @@ -153,18 +153,18 @@ public class RecetaService { String dni, String estado, int pageSize, String bookmark) throws Exception { byte[] result = contract.evaluateTransaction( - "GetRecetasPorDniYEstado", + "GetRecetasPorDniYEstadoPaginado", dni, estado, String.valueOf(pageSize), bookmark); + System.out.println("Respuesta del chaincode (JSON): " + new String(result)); ObjectMapper mapper = new ObjectMapper(); JavaType tipo = mapper.getTypeFactory() .constructParametricType(ResultadoPaginado.class, RecetaDto.class); - ResultadoPaginado resultado = mapper.readValue(json, tipo); - return mapper.readValue(result, type); + return mapper.readValue(result, tipo); } }