From 9d501e96a6f5be17227a144663333c39b3b22202 Mon Sep 17 00:00:00 2001 From: luc662 Date: Sun, 27 Jul 2025 22:06:07 +0000 Subject: [PATCH] se agregaron cambios para correr con couchDb --- .../statedb/couchdb/indexes/indexRecetas.json | 9 ++ .../statedb/couchdb/indexes/indexVacunas.json | 8 ++ .../chaincode-go/chaincode/go.mod | 34 +++++++ .../chaincode-go/chaincode/go.sum | 83 ++++++++++++++++++ .../chaincode-go/chaincode/smartcontract.go | 71 ++++++++++----- basic.tar.gz | Bin 0 -> 18289 bytes 6 files changed, 183 insertions(+), 22 deletions(-) create mode 100644 asset-transfer-basic/chaincode-go/chaincode/META-INF/statedb/couchdb/indexes/indexRecetas.json create mode 100644 asset-transfer-basic/chaincode-go/chaincode/META-INF/statedb/couchdb/indexes/indexVacunas.json create mode 100644 asset-transfer-basic/chaincode-go/chaincode/go.mod create mode 100644 asset-transfer-basic/chaincode-go/chaincode/go.sum create mode 100644 basic.tar.gz diff --git a/asset-transfer-basic/chaincode-go/chaincode/META-INF/statedb/couchdb/indexes/indexRecetas.json b/asset-transfer-basic/chaincode-go/chaincode/META-INF/statedb/couchdb/indexes/indexRecetas.json new file mode 100644 index 00000000..f35f86c6 --- /dev/null +++ b/asset-transfer-basic/chaincode-go/chaincode/META-INF/statedb/couchdb/indexes/indexRecetas.json @@ -0,0 +1,9 @@ + +{ + "index": { + "fields": ["patientDocumentNumber", "status", "fechaDeAutorizacion"] + }, + "ddoc": "recetas-index", + "name": "indexRecetas", + "type": "json" +} \ No newline at end of file diff --git a/asset-transfer-basic/chaincode-go/chaincode/META-INF/statedb/couchdb/indexes/indexVacunas.json b/asset-transfer-basic/chaincode-go/chaincode/META-INF/statedb/couchdb/indexes/indexVacunas.json new file mode 100644 index 00000000..e42d5545 --- /dev/null +++ b/asset-transfer-basic/chaincode-go/chaincode/META-INF/statedb/couchdb/indexes/indexVacunas.json @@ -0,0 +1,8 @@ +{ + "index": { + "fields": ["patientDocumentNumber", "status", "expirationDate"] + }, + "ddoc": "vacunas-index", + "name": "indexVacunas", + "type": "json" +} diff --git a/asset-transfer-basic/chaincode-go/chaincode/go.mod b/asset-transfer-basic/chaincode-go/chaincode/go.mod new file mode 100644 index 00000000..d176923c --- /dev/null +++ b/asset-transfer-basic/chaincode-go/chaincode/go.mod @@ -0,0 +1,34 @@ +module chaincode + +go 1.23.0 + +toolchain go1.23.11 + +require ( + github.com/hyperledger/fabric-chaincode-go/v2 v2.3.0 + github.com/hyperledger/fabric-contract-api-go/v2 v2.2.0 + github.com/hyperledger/fabric-protos-go-apiv2 v0.3.7 + github.com/hyperledger/fabric-samples/asset-transfer-basic/chaincode-go v0.0.0-20250727184722-4c97d4c12b1e + github.com/stretchr/testify v1.10.0 + google.golang.org/protobuf v1.36.5 +) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/spec v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect + github.com/xeipuuv/gojsonschema v1.2.0 // indirect + golang.org/x/net v0.34.0 // indirect + golang.org/x/sys v0.29.0 // indirect + golang.org/x/text v0.21.0 // indirect + google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect + google.golang.org/grpc v1.71.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/asset-transfer-basic/chaincode-go/chaincode/go.sum b/asset-transfer-basic/chaincode-go/chaincode/go.sum new file mode 100644 index 00000000..32c0dffc --- /dev/null +++ b/asset-transfer-basic/chaincode-go/chaincode/go.sum @@ -0,0 +1,83 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= +github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= +github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/hyperledger/fabric-chaincode-go/v2 v2.3.0 h1:NB/QO2t4R5f6Nz/oREqZeaE4splHI2U9gqndfEQZreo= +github.com/hyperledger/fabric-chaincode-go/v2 v2.3.0/go.mod h1:c3zA3gOL/V53a0v1TGgHe8nifeH6daG/UrmJs79I9pI= +github.com/hyperledger/fabric-contract-api-go/v2 v2.2.0 h1:rmUoBmciB0GL/miqcbJmJbgp5QTWoJUrZo+CNxrNLF4= +github.com/hyperledger/fabric-contract-api-go/v2 v2.2.0/go.mod h1:FeWeO/jwGjiME7ak3GufqKIcwkejtzrDG4QxbfKydWs= +github.com/hyperledger/fabric-protos-go-apiv2 v0.3.7 h1:sQ5qv8vQQfwewa1JlCiSCC8dLElmaU2/frLolpgibEY= +github.com/hyperledger/fabric-protos-go-apiv2 v0.3.7/go.mod h1:bJnwzfv03oZQeCc863pdGTDgf5nmCy6Za3RAE7d2XsQ= +github.com/hyperledger/fabric-samples/asset-transfer-basic/chaincode-go v0.0.0-20250727184722-4c97d4c12b1e h1:PubzIFRuAyLC23CLNfRnlYJiD4WCOXlW8F/wHbkQmyo= +github.com/hyperledger/fabric-samples/asset-transfer-basic/chaincode-go v0.0.0-20250727184722-4c97d4c12b1e/go.mod h1:VDQwEYJgjcpC/+OsPdo995AsEm2gOjhN0Xju2/21gxk= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= +github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= +go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= +go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= +go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= +go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= +go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= +go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= +golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= +google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/asset-transfer-basic/chaincode-go/chaincode/smartcontract.go b/asset-transfer-basic/chaincode-go/chaincode/smartcontract.go index 0e7ee879..d8c3f136 100644 --- a/asset-transfer-basic/chaincode-go/chaincode/smartcontract.go +++ b/asset-transfer-basic/chaincode-go/chaincode/smartcontract.go @@ -33,28 +33,29 @@ 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 { ID string `json:"id"` // identificador único para el ledger Identifier string `json:"identifier"` - Status string `json:"status"` // podés validarlo con enums si querés - StatusChange string `json:"statusChange"` // como string (ISO8601) + Status string `json:"status"` + StatusChange string `json:"statusChange"` StatusReason string `json:"statusReason"` VaccinateCode string `json:"vaccinateCode"` AdministradedProduct string `json:"administradedProduct"` Manufacturer string `json:"manufacturer"` LotNumber string `json:"lotNumber"` - ExpirationDate string `json:"expirationDate"` // como string ISO8601 + ExpirationDate string `json:"expirationDate"` PatientDocumentNumber string `json:"patientDocumentNumber"` - Reactions string `json:"reactions"` // puede ser un string o una estructura si querés después + Reactions string `json:"reactions"` 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" @@ -360,37 +361,63 @@ func (s *SmartContract) GetMultipleRecetas(ctx contractapi.TransactionContextInt return recetas, nil } -// 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) { - if dni == "" || estado == "" { - return nil, fmt.Errorf("el dni y el estado son obligatorios") +func (s *SmartContract) GetVacunasPorDniYEstados(ctx contractapi.TransactionContextInterface, dni string, estados []string, pageSize int32, bookmark string) ([]*Vacuna, string, error) { + if dni == "" { + return nil, "", fmt.Errorf("el dni es obligatorio") + } + if pageSize <= 0 { + return nil, "", fmt.Errorf("el pageSize debe ser mayor a 0") + } + // agrego el filtro por DNI + selector := map[string]interface{}{ + "patientDocumentNumber": dni, + } + // Luego por estados + if len(estados) > 0 { + if len(estados) == 1 { + selector["status"] = estados[0] + } else { + selector["status"] = map[string]interface{}{ + "$in": estados, + } + } + } + // Armo la query + query := map[string]interface{}{ + "selector": selector, + "sort": []map[string]string{ + {"fechaDeAutorizacion": "desc"}, + }, } - resultsIterator, err := ctx.GetStub().GetStateByRange("", "") + queryJSON, 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 construir query JSON: %v", err) + } + // ejecuto la querry + resultsIterator, responseMetadata, err := ctx.GetStub().GetQueryResultWithPagination(string(queryJSON), pageSize, bookmark) + if err != nil { + return nil, "", fmt.Errorf("error al ejecutar query con paginación: %v", err) } defer resultsIterator.Close() - var recetasFiltradas []*Receta + var vacunas []*Vacuna for resultsIterator.HasNext() { queryResponse, err := resultsIterator.Next() if err != nil { - return nil, err + return nil, "", err } - var receta Receta - err = json.Unmarshal(queryResponse.Value, &receta) + var vacuna Vacuna + err = json.Unmarshal(queryResponse.Value, &vacuna) if err != nil { - return nil, err + continue // ignoramos entradas inválidas } - if receta.PatientDocumentNumber == dni && receta.Status == estado { - recetasFiltradas = append(recetasFiltradas, &receta) - } + vacunas = append(vacunas, &vacuna) } - - return recetasFiltradas, nil + // devuelvo las vacunas y el bookmark + return vacunas, responseMetadata.Bookmark, nil } func (s *SmartContract) CreateVacuna(ctx contractapi.TransactionContextInterface, vacuna Vacuna) error { diff --git a/basic.tar.gz b/basic.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..e03e781bb901b4875065b47ddf415c8863479b77 GIT binary patch literal 18289 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

6bV_&Z7^slaV91;0>mK5!nNR5L{2Z89XH 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