diff --git a/client/object_search.go b/client/object_search.go index 95c18abe..760a6d06 100644 --- a/client/object_search.go +++ b/client/object_search.go @@ -24,19 +24,26 @@ import ( // PrmObjectSearch groups parameters of ObjectSearch operation. type PrmObjectSearch struct { - meta v2session.RequestMetaHeader + XHeaders []string - key *ecdsa.PrivateKey + Local bool - cnrSet bool - cnrID cid.ID + BearerToken *bearer.Token - filters object.SearchFilters + Session *session.Object + + ContainerID *cid.ID + + Key *ecdsa.PrivateKey + + Filters object.SearchFilters } // MarkLocal tells the server to execute the operation locally. +// +// Deprecated: Use PrmObjectSearch.Local instead. func (x *PrmObjectSearch) MarkLocal() { - x.meta.SetTTL(1) + x.Local = true } // WithinSession specifies session within which the search query must be executed. @@ -45,10 +52,10 @@ func (x *PrmObjectSearch) MarkLocal() { // This may affect the execution of an operation (e.g. access control). // // Must be signed. +// +// Deprecated: Use PrmObjectSearch.Session instead. func (x *PrmObjectSearch) WithinSession(t session.Object) { - var tokv2 v2session.Token - t.WriteToV2(&tokv2) - x.meta.SetSessionToken(&tokv2) + x.Session = &t } // WithBearerToken attaches bearer token to be used for the operation. @@ -56,37 +63,44 @@ func (x *PrmObjectSearch) WithinSession(t session.Object) { // If set, underlying eACL rules will be used in access control. // // Must be signed. +// +// Deprecated: Use PrmObjectSearch.BearerToken instead. func (x *PrmObjectSearch) WithBearerToken(t bearer.Token) { - var v2token acl.BearerToken - t.WriteToV2(&v2token) - x.meta.SetBearerToken(&v2token) + x.BearerToken = &t } // WithXHeaders specifies list of extended headers (string key-value pairs) // to be attached to the request. Must have an even length. // // Slice must not be mutated until the operation completes. +// +// Deprecated: Use PrmObjectSearch.XHeaders instead. func (x *PrmObjectSearch) WithXHeaders(hs ...string) { - writeXHeadersToMeta(hs, &x.meta) + x.XHeaders = hs } // UseKey specifies private key to sign the requests. // If key is not provided, then Client default key is used. +// +// Deprecated: Use PrmObjectSearch.Key instead. func (x *PrmObjectSearch) UseKey(key ecdsa.PrivateKey) { - x.key = &key + x.Key = &key } // InContainer specifies the container in which to look for objects. // Required parameter. +// +// Deprecated: Use PrmObjectSearch.ContainerID instead. func (x *PrmObjectSearch) InContainer(id cid.ID) { - x.cnrID = id - x.cnrSet = true + x.ContainerID = &id } // SetFilters sets filters by which to select objects. All container objects // match unset/empty filters. +// +// Deprecated: Use PrmObjectSearch.Filters instead. func (x *PrmObjectSearch) SetFilters(filters object.SearchFilters) { - x.filters = filters + x.Filters = filters } // ResObjectSearch groups the final result values of ObjectSearch operation. @@ -212,6 +226,48 @@ func (x *ObjectListReader) Close() (*ResObjectSearch, error) { return &x.res, nil } +func (x *PrmObjectSearch) buildRequest(c *Client) (*v2object.SearchRequest, error) { + if x.ContainerID == nil { + return nil, errorMissingContainer + } + + if len(x.XHeaders)%2 != 0 { + return nil, errorInvalidXHeaders + } + + meta := new(v2session.RequestMetaHeader) + writeXHeadersToMeta(x.XHeaders, meta) + + if x.BearerToken != nil { + v2BearerToken := new(acl.BearerToken) + x.BearerToken.WriteToV2(v2BearerToken) + meta.SetBearerToken(v2BearerToken) + } + + if x.Session != nil { + v2SessionToken := new(v2session.Token) + x.Session.WriteToV2(v2SessionToken) + meta.SetSessionToken(v2SessionToken) + } + + if x.Local { + meta.SetTTL(1) + } + cnrV2 := new(v2refs.ContainerID) + x.ContainerID.WriteToV2(cnrV2) + + body := new(v2object.SearchRequestBody) + body.SetVersion(1) + body.SetContainerID(cnrV2) + body.SetFilters(x.Filters.ToV2()) + + req := new(v2object.SearchRequest) + req.SetBody(body) + c.prepareRequest(req, meta) + + return req, nil +} + // ObjectSearchInit initiates object selection through a remote server using FrostFS API protocol. // // The call only opens the transmission channel, explicit fetching of matched objects @@ -221,30 +277,17 @@ func (x *ObjectListReader) Close() (*ResObjectSearch, error) { // Returns an error if parameters are set incorrectly (see PrmObjectSearch docs). // Context is required and must not be nil. It is used for network communication. func (c *Client) ObjectSearchInit(ctx context.Context, prm PrmObjectSearch) (*ObjectListReader, error) { - // check parameters - if !prm.cnrSet { - return nil, errorMissingContainer + req, err := prm.buildRequest(c) + if err != nil { + return nil, err } - var cidV2 v2refs.ContainerID - prm.cnrID.WriteToV2(&cidV2) - - var body v2object.SearchRequestBody - body.SetVersion(1) - body.SetContainerID(&cidV2) - body.SetFilters(prm.filters.ToV2()) - - // init reader - var req v2object.SearchRequest - req.SetBody(&body) - c.prepareRequest(&req, &prm.meta) - - key := prm.key + key := prm.Key if key == nil { key = &c.prm.key } - err := signature.SignServiceMessage(key, &req) + err = signature.SignServiceMessage(key, req) if err != nil { return nil, fmt.Errorf("sign request: %w", err) } @@ -252,7 +295,7 @@ func (c *Client) ObjectSearchInit(ctx context.Context, prm PrmObjectSearch) (*Ob var r ObjectListReader ctx, r.cancelCtxStream = context.WithCancel(ctx) - r.stream, err = rpcapi.SearchObjects(&c.c, &req, client.WithContext(ctx)) + r.stream, err = rpcapi.SearchObjects(&c.c, req, client.WithContext(ctx)) if err != nil { return nil, fmt.Errorf("open stream: %w", err) }