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.



15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/cloudinary/search.rb', line 15

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



29
30
31
32
# File 'lib/cloudinary/search.rb', line 29

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:



70
71
72
73
# File 'lib/cloudinary/search.rb', line 70

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:



157
158
159
160
# File 'lib/cloudinary/search.rb', line 157

def endpoint(endpoint)
  @endpoint = endpoint
  self
end

#execute(options = {}) ⇒ Object



119
120
121
122
123
# File 'lib/cloudinary/search.rb', line 119

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

#expression(value) ⇒ Object



34
35
36
37
# File 'lib/cloudinary/search.rb', line 34

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:



91
92
93
94
95
96
# File 'lib/cloudinary/search.rb', line 91

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

#max_results(value) ⇒ Object



39
40
41
42
# File 'lib/cloudinary/search.rb', line 39

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

#next_cursor(value) ⇒ Object



44
45
46
47
# File 'lib/cloudinary/search.rb', line 44

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:



56
57
58
59
# File 'lib/cloudinary/search.rb', line 56

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:



111
112
113
114
115
116
117
# File 'lib/cloudinary/search.rb', line 111

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



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

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:



103
104
105
106
# File 'lib/cloudinary/search.rb', line 103

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:



80
81
82
83
# File 'lib/cloudinary/search.rb', line 80

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