Class: Cloudinary::Search

Inherits:
Object show all
Defined in:
lib/cloudinary/search.rb

Direct Known Subclasses

SearchFolders

Constant Summary collapse

ENDPOINT =
'resources'
SORT_BY =
:sort_by
AGGREGATE =
:aggregate
WITH_FIELD =
:with_field
FIELDS =
:fields
KEYS_WITH_UNIQUE_VALUES =
[SORT_BY, AGGREGATE, WITH_FIELD, FIELDS].freeze
TTL =

Used for search URLs

300

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeSearch

Returns a new instance of Search.



12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/cloudinary/search.rb', line 12

def initialize
  @query_hash = {
    SORT_BY    => {},
    AGGREGATE  => {},
    WITH_FIELD => {},
    FIELDS => {},
  }

  @endpoint = self.class::ENDPOINT

  @ttl = self.class::TTL
end

Class Method Details

.method_missing(method_name, *arguments) ⇒ Object

implicitly generate an instance delegate the method



26
27
28
29
# File 'lib/cloudinary/search.rb', line 26

def self.method_missing(method_name, *arguments)
  instance = new
  instance.send(method_name, *arguments)
end

Instance Method Details

#aggregate(value) ⇒ Cloudinary::Search

The name of a field (attribute) for which an aggregation count should be calculated and returned in the response.

You can specify more than one aggregate parameter.

Parameters:

  • value (String)

    Supported values: resource_type, type, pixels (only the image assets in the response are aggregated), duration (only the video assets in the response are aggregated), format, and bytes. For aggregation fields without discrete values, the results are divided into categories.

Returns:



67
68
69
70
# File 'lib/cloudinary/search.rb', line 67

def aggregate(value)
  @query_hash[AGGREGATE][value] = value
  self
end

#endpoint(endpoint) ⇒ Cloudinary::Search

Sets the API endpoint.

Parameters:

  • endpoint (String)

    the endpoint to set.

Returns:



154
155
156
157
# File 'lib/cloudinary/search.rb', line 154

def endpoint(endpoint)
  @endpoint = endpoint
  self
end

#execute(options = {}) ⇒ Object



116
117
118
119
120
# File 'lib/cloudinary/search.rb', line 116

def execute(options = {})
  options[:content_type] = :json
  uri = "#{@endpoint}/search"
  Cloudinary::Api.call_api(:post, uri, to_h, options)
end

#expression(value) ⇒ Object



31
32
33
34
# File 'lib/cloudinary/search.rb', line 31

def expression(value)
  @query_hash[:expression] = value
  self
end

#fields(value) ⇒ Cloudinary::Search

The list of the asset attributes to include for each asset in the response.

Parameters:

  • value (Array)

    The array of attributes’ names.

Returns:



88
89
90
91
92
93
# File 'lib/cloudinary/search.rb', line 88

def fields(value)
  Cloudinary::Utils.build_array(value).each do |field|
    @query_hash[FIELDS][field] = field
  end
  self
end

#max_results(value) ⇒ Object



36
37
38
39
# File 'lib/cloudinary/search.rb', line 36

def max_results(value)
  @query_hash[:max_results] = value
  self
end

#next_cursor(value) ⇒ Object



41
42
43
44
# File 'lib/cloudinary/search.rb', line 41

def next_cursor(value)
  @query_hash[:next_cursor] = value
  self
end

#sort_by(field_name, dir = 'desc') ⇒ Cloudinary::Search

Sets the ‘sort_by` field.

Parameters:

  • field_name (String)

    The field to sort by. You can specify more than one sort_by parameter; results will be sorted according to the order of the fields provided.

  • dir (String) (defaults to: 'desc')

    Sort direction. Valid sort directions are ‘asc’ or ‘desc’. Default: ‘desc’.

Returns:



53
54
55
56
# File 'lib/cloudinary/search.rb', line 53

def sort_by(field_name, dir = 'desc')
  @query_hash[SORT_BY][field_name] = { field_name => dir }
  self
end

#to_hHash

Returns the query as an hash.

Returns:



108
109
110
111
112
113
114
# File 'lib/cloudinary/search.rb', line 108

def to_h
  @query_hash.sort.each_with_object({}) do |(key, value), query|
    next if value.nil? || ((value.is_a?(Array) || value.is_a?(Hash)) && value.blank?)

    query[key] = KEYS_WITH_UNIQUE_VALUES.include?(key) ? value.values : value
  end
end

#to_url(ttl = nil, next_cursor = nil, options = {}) ⇒ String

Creates a signed Search URL that can be used on the client side.

Parameters:

  • ttl (Integer) (defaults to: nil)

    The time to live in seconds.

  • next_cursor (String) (defaults to: nil)

    Starting position.

  • options (Hash) (defaults to: {})

    Additional url delivery options.

Returns:

  • (String)

    The resulting Search URL



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
# File 'lib/cloudinary/search.rb', line 129

def to_url(ttl = nil, next_cursor = nil, options = {})
  api_secret = options[:api_secret] || Cloudinary.config.api_secret || raise(CloudinaryException, "Must supply api_secret")

  ttl   = ttl || @ttl
  query = self.to_h

  _next_cursor = query.delete(:next_cursor)
  next_cursor  = _next_cursor if next_cursor.nil?

  b64query = Base64.urlsafe_encode64(JSON.generate(query))

  prefix = Cloudinary::Utils.build_distribution_domain(options)

  signature = Cloudinary::Utils.hash("#{ttl}#{b64query}#{api_secret}", :sha256, :hexdigest)

  next_cursor = "/#{next_cursor}" if !next_cursor.nil? && !next_cursor.empty?

  "#{prefix}/search/#{signature}/#{ttl}/#{b64query}#{next_cursor}"
end

#ttl(ttl) ⇒ Cloudinary::Search

Sets the time to live of the search URL.

Parameters:

  • ttl (Object)

    The time to live in seconds.

Returns:



100
101
102
103
# File 'lib/cloudinary/search.rb', line 100

def ttl(ttl)
  @ttl = ttl
  self
end

#with_field(value) ⇒ Cloudinary::Search

The name of an additional asset attribute to include for each asset in the response.

Parameters:

  • value (String)

    Possible value: context, tags, and for Tier 2 also image_metadata, and image_analysis.

Returns:



77
78
79
80
# File 'lib/cloudinary/search.rb', line 77

def with_field(value)
  @query_hash[WITH_FIELD][value] = value
  self
end