diff --git a/CHANGELOG.md b/CHANGELOG.md index 670adc1..2afa95f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ +# v0.0.8 + +* Added methods to create, read and delete objects. + +# v0.0.7 + +* Upgraded neofs-sdk-go dependency to version `v1.0.0-rc.7` +* Fixed method `ListContainer` +* Other minor code structure fixes +* Not yet productive. + # v0.0.6 * Restructured library into packages based on NeoFS API. diff --git a/container/container.go b/container/container.go index 5f135ec..52e7caf 100644 --- a/container/container.go +++ b/container/container.go @@ -49,13 +49,13 @@ func PutContainer(neofsClient *client.NeoFSClient, cnr *container.Container) *re } func GetContainer(neofsClient *client.NeoFSClient, containerID *cid.ID) *response.PointerResponse { - client := neofsClient.LockAndGet() ctx := context.Background() var prmContainerGet neofsclient.PrmContainerGet prmContainerGet.SetContainer(*containerID) //prmContainerGet.WithXHeaders() + client := neofsClient.LockAndGet() resContainerGet, err := client.ContainerGet(ctx, prmContainerGet) neofsClient.Unlock() @@ -101,7 +101,6 @@ func DeleteContainer(neofsClient *client.NeoFSClient, containerID *cid.ID) *resp //} func deleteContainer(neofsClient *client.NeoFSClient, containerID *cid.ID, sessionToken *session.Container) *response.PointerResponse { - client := neofsClient.LockAndGet() ctx := context.Background() var prmContainerDelete neofsclient.PrmContainerDelete @@ -111,11 +110,12 @@ func deleteContainer(neofsClient *client.NeoFSClient, containerID *cid.ID, sessi } //prmContainerDelete.WithXHeaders() + client := neofsClient.LockAndGet() resContainerDelete, err := client.ContainerDelete(ctx, prmContainerDelete) + neofsClient.Unlock() if err != nil { return response.Error(err) } - neofsClient.Unlock() if !apistatus.IsSuccessful(resContainerDelete.Status()) { return response.StatusResponse() diff --git a/go.mod b/go.mod index e8b98ed..5535728 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,8 @@ module github.com/AxLabs/neofs-api-shared-lib go 1.16 +replace github.com/nspcc-dev/neofs-sdk-go => github.com/cthulhu-rider/neofs-sdk-go v0.0.0-20221107175856-e14177122916 + require ( github.com/google/uuid v1.3.0 github.com/nspcc-dev/neo-go v0.99.4 diff --git a/go.sum b/go.sum index 56cda13..43823a8 100644 --- a/go.sum +++ b/go.sum @@ -274,7 +274,6 @@ github.com/CityOfZion/neo-go v0.71.1-pre.0.20200129171427-f773ec69fb84/go.mod h1 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/Workiva/go-datastructures v1.0.50/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA= github.com/abiosoft/ishell v2.0.0+incompatible/go.mod h1:HQR9AqF2R3P4XXpMpI0NAzgHf/aS6+zVXRj14cVk9qg= -github.com/abiosoft/ishell/v2 v2.0.2/go.mod h1:E4oTCXfo6QjoCart0QYa5m9w4S+deXs/P/9jA77A9Bs= github.com/abiosoft/readline v0.0.0-20180607040430-155bce2042db/go.mod h1:rB3B4rKii8V21ydCbIzH5hZiCQE7f5E9SzUb/ZZx530= github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -285,7 +284,6 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5 github.com/alicebob/gopher-json v0.0.0-20180125190556-5a6b3ba71ee6/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210521073959-f0d4d129b7f1/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 h1:yL7+Jz0jTC6yykIK/Wh74gnTJnrGr5AyrNMXuA0gves= github.com/antlr/antlr4/runtime/Go/antlr v1.4.10/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -325,7 +323,8 @@ github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cthulhu-rider/neofs-sdk-go v0.0.0-20221107175856-e14177122916 h1:6B8fZ+cZUw56ZSehP9U5H4gZffc2eQJvMouKJLHCOWc= +github.com/cthulhu-rider/neofs-sdk-go v0.0.0-20221107175856-e14177122916/go.mod h1:7bH8zabbewpXstaXKoV0Tk3lV7KFYadi5edLU5yDERY= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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= @@ -343,9 +342,7 @@ github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go. github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/flynn-archive/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:rZfgFAXFS/z/lEd6LJmf9HVZ1LkgYiHx5pHhV5DR16M= -github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -484,17 +481,13 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -510,21 +503,17 @@ github.com/nspcc-dev/dbft v0.0.0-20191205084618-dacb1a30c254/go.mod h1:w1Ln2aT+d github.com/nspcc-dev/dbft v0.0.0-20191209120240-0d6b7568d9ae/go.mod h1:3FjXOoHmA51EGfb5GS/HOv7VdmngNRTssSeQ729dvGY= github.com/nspcc-dev/dbft v0.0.0-20200117124306-478e5cfbf03a/go.mod h1:/YFK+XOxxg0Bfm6P92lY5eDSLYfp06XOdL8KAVgXjVk= github.com/nspcc-dev/dbft v0.0.0-20200219114139-199d286ed6c1/go.mod h1:O0qtn62prQSqizzoagHmuuKoz8QMkU3SzBoKdEvm3aQ= -github.com/nspcc-dev/dbft v0.0.0-20210721160347-1b03241391ac/go.mod h1:U8MSnEShH+o5hexfWJdze6uMFJteP0ko7J2frO7Yu1Y= github.com/nspcc-dev/dbft v0.0.0-20220629112714-fd49ca59d354/go.mod h1:U8MSnEShH+o5hexfWJdze6uMFJteP0ko7J2frO7Yu1Y= github.com/nspcc-dev/dbft v0.0.0-20220902113116-58a5e763e647/go.mod h1:g9xisXmX9NP9MjioaTe862n9SlZTrP+6PVUWLBYOr98= -github.com/nspcc-dev/go-ordered-json v0.0.0-20210915112629-e1b6cce73d02/go.mod h1:79bEUDEviBHJMFV6Iq6in57FEOCMcRhfQnfaf0ETA5U= github.com/nspcc-dev/go-ordered-json v0.0.0-20220111165707-25110be27d22/go.mod h1:79bEUDEviBHJMFV6Iq6in57FEOCMcRhfQnfaf0ETA5U= github.com/nspcc-dev/hrw v1.0.9 h1:17VcAuTtrstmFppBjfRiia4K2wA/ukXZhLFS8Y8rz5Y= github.com/nspcc-dev/hrw v1.0.9/go.mod h1:l/W2vx83vMQo6aStyx2AuZrJ+07lGv2JQGlVkPG06MU= github.com/nspcc-dev/neo-go v0.73.1-pre.0.20200303142215-f5a1b928ce09/go.mod h1:pPYwPZ2ks+uMnlRLUyXOpLieaDQSEaf4NM3zHVbRjmg= -github.com/nspcc-dev/neo-go v0.98.0/go.mod h1:E3cc1x6RXSXrJb2nDWXTXjnXk3rIqVN8YdFyWv+FrqM= github.com/nspcc-dev/neo-go v0.99.2/go.mod h1:9P0yWqhZX7i/ChJ+zjtiStO1uPTolPFUM+L5oNznU8E= github.com/nspcc-dev/neo-go v0.99.4 h1:8Y+SdRxksC72a4PNkcGCh/aaQinh9Gu+c5LilbcsXOI= github.com/nspcc-dev/neo-go v0.99.4/go.mod h1:mKTolfRUfKjFso5HPvGSQtUZc70n0VKBMs16eGuC5gA= github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220809123759-3094d3e0c14b/go.mod h1:23bBw0v6pBYcrWs8CBEEDIEDJNbcFoIh8pGGcf2Vv8s= github.com/nspcc-dev/neo-go/pkg/interop v0.0.0-20220927123257-24c107e3a262/go.mod h1:23bBw0v6pBYcrWs8CBEEDIEDJNbcFoIh8pGGcf2Vv8s= -github.com/nspcc-dev/neofs-api-go/v2 v2.11.0-pre.0.20211201134523-3604d96f3fe1/go.mod h1:oS8dycEh8PPf2Jjp6+8dlwWyEv2Dy77h/XhhcdxYEFs= github.com/nspcc-dev/neofs-api-go/v2 v2.11.1/go.mod h1:oS8dycEh8PPf2Jjp6+8dlwWyEv2Dy77h/XhhcdxYEFs= github.com/nspcc-dev/neofs-api-go/v2 v2.14.0 h1:jhuN8Ldqz7WApvUJRFY0bjRXE1R3iCkboMX5QVZhHVk= github.com/nspcc-dev/neofs-api-go/v2 v2.14.0/go.mod h1:DRIr0Ic1s+6QgdqmNFNLIqMqd7lNMJfYwkczlm1hDtM= @@ -534,10 +523,6 @@ github.com/nspcc-dev/neofs-crypto v0.2.3/go.mod h1:8w16GEJbH6791ktVqHN9YRNH3s9BE github.com/nspcc-dev/neofs-crypto v0.3.0/go.mod h1:8w16GEJbH6791ktVqHN9YRNH3s9BEEKYxGhlFnp0cDw= github.com/nspcc-dev/neofs-crypto v0.4.0 h1:5LlrUAM5O0k1+sH/sktBtrgfWtq1pgpDs09fZo+KYi4= github.com/nspcc-dev/neofs-crypto v0.4.0/go.mod h1:6XJ8kbXgOfevbI2WMruOtI+qUJXNwSGM/E9eClXxPHs= -github.com/nspcc-dev/neofs-sdk-go v0.0.0-20211201182451-a5b61c4f6477/go.mod h1:dfMtQWmBHYpl9Dez23TGtIUKiFvCIxUZq/CkSIhEpz4= -github.com/nspcc-dev/neofs-sdk-go v0.0.0-20220113123743-7f3162110659/go.mod h1:/jay1lr3w7NQd/VDBkEhkJmDmyPNsu4W+QV2obsUV40= -github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.7 h1:IqtMHDvluK/naBqRHV/x9vZfmR6ZJ5aYXjhaCmJbFxE= -github.com/nspcc-dev/neofs-sdk-go v1.0.0-rc.7/go.mod h1:7bH8zabbewpXstaXKoV0Tk3lV7KFYadi5edLU5yDERY= github.com/nspcc-dev/rfc6979 v0.1.0/go.mod h1:exhIh1PdpDC5vQmyEsGvc4YDM/lyQp/452QxGq/UEso= github.com/nspcc-dev/rfc6979 v0.2.0 h1:3e1WNxrN60/6N0DW7+UYisLeZJyfqZTNOjeV/toYvOE= github.com/nspcc-dev/rfc6979 v0.2.0/go.mod h1:exhIh1PdpDC5vQmyEsGvc4YDM/lyQp/452QxGq/UEso= @@ -586,7 +571,6 @@ github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -815,7 +799,6 @@ golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -876,7 +859,6 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 h1:WIoqL4EROvwiPdUtaip4VcDdpZ4kha7wBWZrbVKCIZg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210429154555-c04ba851c2a4/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -935,7 +917,6 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= diff --git a/lib.go b/lib.go index 22dad16..a7ed71c 100644 --- a/lib.go +++ b/lib.go @@ -10,11 +10,14 @@ package main */ import "C" import ( + "bytes" "github.com/AxLabs/neofs-api-shared-lib/accounting" "github.com/AxLabs/neofs-api-shared-lib/client" "github.com/AxLabs/neofs-api-shared-lib/container" "github.com/AxLabs/neofs-api-shared-lib/netmap" + "github.com/AxLabs/neofs-api-shared-lib/object" "github.com/AxLabs/neofs-api-shared-lib/response" + "unsafe" ) // region client @@ -118,6 +121,7 @@ func ListContainer(clientID *C.char, ownerPubKey *C.char) C.pointerResponse { if err != nil { return responseToC(response.Error(err)) } + c, err := GetClient(clientID) if err != nil { return responseToC(response.Error(err)) @@ -128,4 +132,97 @@ func ListContainer(clientID *C.char, ownerPubKey *C.char) C.pointerResponse { // endregion container // region object +////export UploadFile +//func UploadFile(clientID *C.char, fileBytes *C.char) C.pointerResponse { +// c, err := GetClient(clientID) +// if err != nil { +// return responseToC(response.Error(err)) +// } +// prm := UploadFilePrm{} +// err = json.Unmarshal(fileBytes, &prm) +// if err != nil { +// return responseToC(response.Error(err)) +// } +// return responseToC(object.UploadFile(c, prm)) +//} +// +//type UploadFilePrm struct { +// prm1 string +// prm2 string +//} + +//export CreateObjectWithoutAttributes +func CreateObjectWithoutAttributes(clientID *C.char, containerID *C.char, fileBytes unsafe.Pointer, fileSize C.int, + sessionSignerPrivKey *C.char) C.response { + return CreateObject(clientID, containerID, fileBytes, fileSize, sessionSignerPrivKey, nil, nil) +} + +// seems to work +//export CreateObject +func CreateObject(clientID *C.char, containerID *C.char, fileBytes unsafe.Pointer, fileSize C.int, sessionSignerPrivKey *C.char, + attributeKey *C.char, attributeValue *C.char) C.response { + + readBytes := C.GoBytes(fileBytes, fileSize) + + reader := bytes.NewReader(readBytes) + privKey := GetECDSAPrivKey(sessionSignerPrivKey) + cid, err := getContainerIDFromC(containerID) + if err != nil { + return stringResponseToC(response.StringError(err)) + } + var attributes [][2]string + if attributeKey != nil { + key := C.GoString(attributeKey) + value := C.GoString(attributeValue) + attributes = append(attributes, [2]string{key, value}) + } + + c, err := GetClient(clientID) + if err != nil { + return stringResponseToC(response.StringError(err)) + } + return stringResponseToC(object.CreateObject(c, *cid, *privKey, attributes, reader)) +} + +//ReadObject(neofsClient *client.NeoFSClient, containerID cid.ID, objectID oid.ID, +//signer ecdsa.PrivateKey) *response.PointerResponse { + +//export ReadObject +func ReadObject(clientID *C.char, containerID *C.char, objectID *C.char, signer *C.char) C.pointerResponse { + cid, err := getContainerIDFromC(containerID) + if err != nil { + return responseToC(response.Error(err)) + } + oid, err := getObjectIDFromC(objectID) + if err != nil { + return responseToC(response.Error(err)) + } + privKey := GetECDSAPrivKey(signer) + + c, err := GetClient(clientID) + if err != nil { + return responseToC(response.Error(err)) + } + return responseToC(object.ReadObject(c, *cid, *oid, *privKey)) +} + +//export DeleteObject +func DeleteObject(clientID *C.char, containerID *C.char, objectID *C.char, signer *C.char) C.response { + cid, err := getContainerIDFromC(containerID) + if err != nil { + return stringResponseToC(response.StringError(err)) + } + oid, err := getObjectIDFromC(objectID) + if err != nil { + return stringResponseToC(response.StringError(err)) + } + privKey := GetECDSAPrivKey(signer) + + c, err := GetClient(clientID) + if err != nil { + return stringResponseToC(response.StringError(err)) + } + return stringResponseToC(object.DeleteObject(c, *cid, *oid, *privKey)) +} + // endregion object diff --git a/object/object.go b/object/object.go index 5daa0be..b2fdd3a 100644 --- a/object/object.go +++ b/object/object.go @@ -1,5 +1,198 @@ package object +import ( + "bytes" + "context" + "crypto/ecdsa" + "errors" + "github.com/AxLabs/neofs-api-shared-lib/response" + apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status" + "io" + "math" + "reflect" + + "github.com/AxLabs/neofs-api-shared-lib/client" + "github.com/google/uuid" + neofsclient "github.com/nspcc-dev/neofs-sdk-go/client" + cid "github.com/nspcc-dev/neofs-sdk-go/container/id" + neofsecdsa "github.com/nspcc-dev/neofs-sdk-go/crypto/ecdsa" + "github.com/nspcc-dev/neofs-sdk-go/object" + oid "github.com/nspcc-dev/neofs-sdk-go/object/id" + "github.com/nspcc-dev/neofs-sdk-go/session" + "github.com/nspcc-dev/neofs-sdk-go/user" +) + +func CreateObject(neofsClient *client.NeoFSClient, containerID cid.ID, sessionSigner ecdsa.PrivateKey, + attributes [][2]string, payload io.Reader) *response.StringResponse { + + // How do we pass more attributes to C (dynamic number of attributes)? + + ctx := context.Background() + + // region open session + + var prmSession neofsclient.PrmSessionCreate + // send request to open the session for object writing + const expirationSession = math.MaxUint64 + prmSession.SetExp(expirationSession) + prmSession.UseKey(sessionSigner) + + client := neofsClient.LockAndGet() + resSession, err := client.SessionCreate(ctx, prmSession) + neofsClient.Unlock() + if err != nil { + return response.StringError(err) + } + + // decode session ID + var idSession uuid.UUID + + err = idSession.UnmarshalBinary(resSession.ID()) + if err != nil { + return response.StringError(err) + } + + // decode session public key + var keySession neofsecdsa.PublicKey + + err = keySession.Decode(resSession.PublicKey()) + if err != nil { + return response.StringError(err) + } + + // form token of the object session + var tokenSession session.Object + tokenSession.SetID(idSession) + tokenSession.SetExp(expirationSession) + tokenSession.BindContainer(containerID) // prm.Container + tokenSession.ForVerb(session.VerbObjectPut) + tokenSession.SetAuthKey(&keySession) + + // sign the session token + err = tokenSession.Sign(sessionSigner) + if err != nil { + return response.StringError(err) + } + + // endregion open session + + // pre: tokenSession, signer, context + var prmPutInit neofsclient.PrmObjectPutInit + prmPutInit.WithinSession(tokenSession) + prmPutInit.UseKey(sessionSigner) + + streamObj, err := client.ObjectPutInit(ctx, prmPutInit) + if err != nil { + return response.StringError(err) + } + + var idCreator user.ID + user.IDFromKey(&idCreator, sessionSigner.PublicKey) + var obj object.Object + obj.SetContainerID(containerID) + obj.SetOwnerID(&idCreator) + + // add attributes + if attributes != nil { + attrs := make([]object.Attribute, len(attributes)) + + for i := range attributes { + attrs[i].SetKey(attributes[i][0]) + attrs[i].SetValue(attributes[i][1]) + } + + obj.SetAttributes(attrs...) + } + + if streamObj.WriteHeader(obj) && payload != nil { + var n int + buf := make([]byte, 100<<10) + for { + n, err = payload.Read(buf) + if n > 0 { + if !streamObj.WritePayloadChunk(buf[:n]) { + break + } + continue + } + if errors.Is(err, io.EOF) { + break + } + return response.StringError(err) // read payload + } + } + + res, err := streamObj.Close() + if err != nil { + return response.StringError(err) + } + objectID := res.StoredObjectID() + return response.NewString(reflect.TypeOf(oid.ID{}), objectID.EncodeToString()) +} + +func ReadObject(neofsClient *client.NeoFSClient, containerID cid.ID, objectID oid.ID, + signer ecdsa.PrivateKey) *response.PointerResponse { + + ctx := context.Background() + + var prmGet neofsclient.PrmObjectGet + prmGet.FromContainer(containerID) + prmGet.ByID(objectID) + //prmGet.UseKey(signerDefault) + prmGet.UseKey(signer) + + client := neofsClient.LockAndGet() + streamObj, err := client.ObjectGetInit(ctx, prmGet) + neofsClient.Unlock() + if err != nil { + return response.Error(err) + } + var b bytes.Buffer + _ = io.Writer(&b) + if streamObj.ReadHeader(new(object.Object)) { + _, err = io.Copy(&b, streamObj) + if err != nil { + return response.Error(err) + } + } + + _, err = streamObj.Close() + if err != nil { + return response.Error(err) + } + return response.New(reflect.TypeOf(object.Object{}), b.Bytes()) +} + +// DeleteObject marks an object for deletion from the container using NeoFS API protocol. +// As a marker, a special unit called a tombstone is placed in the container. +// It confirms the user's intent to delete the object, and is itself a container object. +// Explicit deletion is done asynchronously, and is generally not guaranteed. +func DeleteObject(neofsClient *client.NeoFSClient, containerID cid.ID, objectID oid.ID, + signer ecdsa.PrivateKey) *response.StringResponse { + + ctx := context.Background() + + var prmDelete neofsclient.PrmObjectDelete + prmDelete.FromContainer(containerID) + prmDelete.ByID(objectID) + //prmDelete.UseKey(signerDefault) + prmDelete.UseKey(signer) + + client := neofsClient.LockAndGet() + res, err := client.ObjectDelete(ctx, prmDelete) + neofsClient.Unlock() + if err != nil { + return response.StringError(err) + } + + res.Status() + if !apistatus.IsSuccessful(res.Status()) { + return response.StringStatusResponse() + } + tombstoneID := res.Tombstone() + return response.NewString(reflect.TypeOf(oid.ID{}), tombstoneID.EncodeToString()) +} + //import ( // "context" // "fmt" @@ -37,7 +230,8 @@ package object // if err != nil { // return response.PointerResponseClientError() // } -// w, err := neofsClient.LockAndGet().ObjectPutInit(ctx, prmObjectPutInit) +// client := neofsClient.LockAndGet() +// w, err := client.ObjectPutInit(ctx, prmObjectPutInit) // neofsClient.Unlock() // if err != nil { // return response.PointerResponseError(err.Error()) diff --git a/parser.go b/parser.go index 5f4909c..21c8c24 100644 --- a/parser.go +++ b/parser.go @@ -21,6 +21,7 @@ import ( v2container "github.com/nspcc-dev/neofs-api-go/v2/container" "github.com/nspcc-dev/neofs-sdk-go/container" cid "github.com/nspcc-dev/neofs-sdk-go/container/id" + oid "github.com/nspcc-dev/neofs-sdk-go/object/id" "github.com/nspcc-dev/neofs-sdk-go/user" "math/big" ) @@ -104,6 +105,15 @@ func getContainerIDFromC(containerID *C.char) (*cid.ID, error) { return id, nil } +func getObjectIDFromC(objectID *C.char) (*oid.ID, error) { + id := new(oid.ID) + err := id.DecodeString(C.GoString(objectID)) + if err != nil { + return nil, err + } + return id, nil +} + //func getSessionTokenFromC(sessionToken *C.char) (*session.Container, error) { // token := new(session.Container) //