@@ -7,12 +7,24 @@ import (
7
7
"strings"
8
8
9
9
internalclient "github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/client"
10
+ "github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/common"
10
11
"github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/commonflags"
11
12
"github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/key"
13
+ "github.com/nspcc-dev/neofs-sdk-go/client"
12
14
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
15
+ neofsecdsa "github.com/nspcc-dev/neofs-sdk-go/crypto/ecdsa"
13
16
"github.com/nspcc-dev/neofs-sdk-go/object"
14
17
oidSDK "github.com/nspcc-dev/neofs-sdk-go/object/id"
18
+ "github.com/nspcc-dev/neofs-sdk-go/session"
15
19
"github.com/spf13/cobra"
20
+ "github.com/spf13/viper"
21
+ )
22
+
23
+ // searchV2Cmd flags.
24
+ var (
25
+ searchAttributesFlag = flag [[]string ]{f : "attributes" }
26
+ searchCountFlag = flag [uint16 ]{f : "count" }
27
+ searchCursorFlag = flag [string ]{f : "cursor" }
16
28
)
17
29
18
30
var (
@@ -25,23 +37,44 @@ var (
25
37
Args : cobra .NoArgs ,
26
38
RunE : searchObject ,
27
39
}
40
+ searchV2Cmd = & cobra.Command {
41
+ Use : objectSearchCmd .Use + "v2" ,
42
+ Short : objectSearchCmd .Short + " (new)" , // TODO: drop suffix on old search deprecation
43
+ Long : objectSearchCmd .Long + " (new)" , // TODO: desc in details
44
+ Args : objectSearchCmd .Args ,
45
+ RunE : searchV2 ,
46
+ }
28
47
)
29
48
30
49
func initObjectSearchCmd () {
31
50
commonflags .Init (objectSearchCmd )
51
+ commonflags .Init (searchV2Cmd )
32
52
initFlagSession (objectSearchCmd , "SEARCH" )
53
+ initFlagSession (searchV2Cmd , "SEARCH" )
33
54
34
55
flags := objectSearchCmd .Flags ()
56
+ flags2 := searchV2Cmd .Flags ()
35
57
36
58
flags .String (commonflags .CIDFlag , "" , commonflags .CIDFlagUsage )
37
59
_ = objectSearchCmd .MarkFlagRequired (commonflags .CIDFlag )
60
+ flags2 .String (commonflags .CIDFlag , "" , commonflags .CIDFlagUsage )
61
+ _ = searchV2Cmd .MarkFlagRequired (commonflags .CIDFlag )
38
62
39
63
flags .StringSliceVarP (& searchFilters , "filters" , "f" , nil ,
40
64
"Repeated filter expressions or files with protobuf JSON" )
65
+ flags2 .StringSliceVarP (& searchFilters , "filters" , "f" , nil ,
66
+ "Repeated filter expressions or files with protobuf JSON" )
41
67
42
68
flags .Bool ("root" , false , "Search for user objects" )
69
+ flags2 .Bool ("root" , false , "Search for user objects" )
43
70
flags .Bool ("phy" , false , "Search physically stored objects" )
71
+ flags2 .Bool ("phy" , false , "Search physically stored objects" )
44
72
flags .String (commonflags .OIDFlag , "" , "Search object by identifier" )
73
+ flags2 .String (commonflags .OIDFlag , "" , "Search object by identifier" )
74
+
75
+ flags2 .StringSliceVar (& searchAttributesFlag .v , searchAttributesFlag .f , nil , "Additional attributes to display for suitable objects" )
76
+ flags2 .Uint16Var (& searchCountFlag .v , searchCountFlag .f , 0 , "Max number of resulting items. Must not exceed 1000" )
77
+ flags2 .StringVar (& searchCursorFlag .v , searchCursorFlag .f , "" , "Cursor to continue previous search" )
45
78
}
46
79
47
80
func searchObject (cmd * cobra.Command , _ []string ) error {
@@ -175,3 +208,66 @@ func parseSearchFilters(cmd *cobra.Command) (object.SearchFilters, error) {
175
208
176
209
return fs , nil
177
210
}
211
+
212
+ func searchV2 (cmd * cobra.Command , _ []string ) error {
213
+ var cnr cid.ID
214
+ if err := readCID (cmd , & cnr ); err != nil {
215
+ return err
216
+ }
217
+ fs , err := parseSearchFilters (cmd )
218
+ if err != nil {
219
+ return err
220
+ }
221
+ pk , err := key .GetOrGenerate (cmd )
222
+ if err != nil {
223
+ return err
224
+ }
225
+ bt , err := common .ReadBearerToken (cmd , bearerTokenFlag )
226
+ if err != nil {
227
+ return err
228
+ }
229
+ st , err := getVerifiedSession (cmd , session .VerbObjectSearch , pk , cnr )
230
+ if err != nil {
231
+ return err
232
+ }
233
+
234
+ ctx , cancel := commonflags .GetCommandContext (cmd )
235
+ defer cancel ()
236
+ cli , err := internalclient .GetSDKClientByFlag (ctx , commonflags .RPC )
237
+ if err != nil {
238
+ return err
239
+ }
240
+
241
+ var opts client.SearchObjectsOptions
242
+ opts .SetCount (uint32 (searchCountFlag .v ))
243
+ opts .WithXHeaders (parseXHeaders (cmd )... )
244
+ if viper .GetUint32 (commonflags .TTL ) == 1 {
245
+ opts .DisableForwarding ()
246
+ }
247
+ if bt != nil {
248
+ opts .WithBearerToken (* bt )
249
+ }
250
+ if st != nil {
251
+ opts .WithSessionToken (* st )
252
+ }
253
+ res , cursor , err := cli .SearchObjects (ctx , cnr , fs , searchAttributesFlag .v , searchCursorFlag .v , neofsecdsa .Signer (* pk ), opts )
254
+ if err != nil {
255
+ return fmt .Errorf ("rpc error: %w" , err )
256
+ }
257
+
258
+ cmd .Printf ("Found %d objects.\n " , len (res ))
259
+ for i := range res {
260
+ cmd .Println (res [i ].ID )
261
+ for j := range searchAttributesFlag .v {
262
+ val := res [i ].Attributes [j ]
263
+ if searchAttributesFlag .v [j ] == object .AttributeTimestamp {
264
+ val = common .PrettyPrintUnixTime (val )
265
+ }
266
+ fmt .Printf ("\t %s: %s\n " , searchAttributesFlag .v [j ], val )
267
+ }
268
+ }
269
+ if cursor != "" {
270
+ cmd .Printf ("Cursor: %s\n " , cursor )
271
+ }
272
+ return nil
273
+ }
0 commit comments