@@ -7,12 +7,24 @@ import (
77 "strings"
88
99 internalclient "github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/client"
10+ "github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/common"
1011 "github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/commonflags"
1112 "github.com/nspcc-dev/neofs-node/cmd/neofs-cli/internal/key"
13+ "github.com/nspcc-dev/neofs-sdk-go/client"
1214 cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
15+ neofsecdsa "github.com/nspcc-dev/neofs-sdk-go/crypto/ecdsa"
1316 "github.com/nspcc-dev/neofs-sdk-go/object"
1417 oidSDK "github.com/nspcc-dev/neofs-sdk-go/object/id"
18+ "github.com/nspcc-dev/neofs-sdk-go/session"
1519 "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" }
1628)
1729
1830var (
@@ -25,23 +37,44 @@ var (
2537 Args : cobra .NoArgs ,
2638 RunE : searchObject ,
2739 }
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+ }
2847)
2948
3049func initObjectSearchCmd () {
3150 commonflags .Init (objectSearchCmd )
51+ commonflags .Init (searchV2Cmd )
3252 initFlagSession (objectSearchCmd , "SEARCH" )
53+ initFlagSession (searchV2Cmd , "SEARCH" )
3354
3455 flags := objectSearchCmd .Flags ()
56+ flags2 := searchV2Cmd .Flags ()
3557
3658 flags .String (commonflags .CIDFlag , "" , commonflags .CIDFlagUsage )
3759 _ = objectSearchCmd .MarkFlagRequired (commonflags .CIDFlag )
60+ flags2 .String (commonflags .CIDFlag , "" , commonflags .CIDFlagUsage )
61+ _ = searchV2Cmd .MarkFlagRequired (commonflags .CIDFlag )
3862
3963 flags .StringSliceVarP (& searchFilters , "filters" , "f" , nil ,
4064 "Repeated filter expressions or files with protobuf JSON" )
65+ flags2 .StringSliceVarP (& searchFilters , "filters" , "f" , nil ,
66+ "Repeated filter expressions or files with protobuf JSON" )
4167
4268 flags .Bool ("root" , false , "Search for user objects" )
69+ flags2 .Bool ("root" , false , "Search for user objects" )
4370 flags .Bool ("phy" , false , "Search physically stored objects" )
71+ flags2 .Bool ("phy" , false , "Search physically stored objects" )
4472 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" )
4578}
4679
4780func searchObject (cmd * cobra.Command , _ []string ) error {
@@ -175,3 +208,66 @@ func parseSearchFilters(cmd *cobra.Command) (object.SearchFilters, error) {
175208
176209 return fs , nil
177210}
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