algolia 2.0.0.pre.alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.circleci/config.yml +146 -0
- data/.github/ISSUE_TEMPLATE.md +20 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +22 -0
- data/.gitignore +38 -0
- data/.rubocop.yml +186 -0
- data/.rubocop_todo.yml +14 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +18 -0
- data/LICENSE +21 -0
- data/README.md +56 -0
- data/Rakefile +45 -0
- data/Steepfile +6 -0
- data/algolia.gemspec +41 -0
- data/bin/console +21 -0
- data/bin/setup +8 -0
- data/lib/algolia.rb +42 -0
- data/lib/algolia/account_client.rb +65 -0
- data/lib/algolia/analytics_client.rb +105 -0
- data/lib/algolia/config/algolia_config.rb +40 -0
- data/lib/algolia/config/analytics_config.rb +20 -0
- data/lib/algolia/config/insights_config.rb +20 -0
- data/lib/algolia/config/recommendation_config.rb +20 -0
- data/lib/algolia/config/search_config.rb +40 -0
- data/lib/algolia/defaults.rb +35 -0
- data/lib/algolia/enums/call_type.rb +4 -0
- data/lib/algolia/enums/retry_outcome_type.rb +5 -0
- data/lib/algolia/error.rb +29 -0
- data/lib/algolia/helpers.rb +83 -0
- data/lib/algolia/http/http_requester.rb +84 -0
- data/lib/algolia/http/response.rb +23 -0
- data/lib/algolia/insights_client.rb +238 -0
- data/lib/algolia/iterators/base_iterator.rb +19 -0
- data/lib/algolia/iterators/object_iterator.rb +27 -0
- data/lib/algolia/iterators/paginator_iterator.rb +44 -0
- data/lib/algolia/iterators/rule_iterator.rb +9 -0
- data/lib/algolia/iterators/synonym_iterator.rb +9 -0
- data/lib/algolia/logger_helper.rb +14 -0
- data/lib/algolia/recommendation_client.rb +60 -0
- data/lib/algolia/responses/add_api_key_response.rb +38 -0
- data/lib/algolia/responses/base_response.rb +9 -0
- data/lib/algolia/responses/delete_api_key_response.rb +40 -0
- data/lib/algolia/responses/indexing_response.rb +28 -0
- data/lib/algolia/responses/multiple_batch_indexing_response.rb +29 -0
- data/lib/algolia/responses/multiple_response.rb +45 -0
- data/lib/algolia/responses/restore_api_key_response.rb +36 -0
- data/lib/algolia/responses/update_api_key_response.rb +39 -0
- data/lib/algolia/search_client.rb +614 -0
- data/lib/algolia/search_index.rb +1094 -0
- data/lib/algolia/transport/request_options.rb +94 -0
- data/lib/algolia/transport/retry_strategy.rb +117 -0
- data/lib/algolia/transport/stateful_host.rb +26 -0
- data/lib/algolia/transport/transport.rb +161 -0
- data/lib/algolia/user_agent.rb +25 -0
- data/lib/algolia/version.rb +3 -0
- data/sig/config/algolia_config.rbs +24 -0
- data/sig/config/analytics_config.rbs +11 -0
- data/sig/config/insights_config.rbs +11 -0
- data/sig/config/recommendation_config.rbs +11 -0
- data/sig/config/search_config.rbs +11 -0
- data/sig/enums/call_type.rbs +5 -0
- data/sig/helpers.rbs +12 -0
- data/sig/http/http_requester.rbs +17 -0
- data/sig/http/response.rbs +14 -0
- data/sig/interfaces/_connection.rbs +16 -0
- data/sig/iterators/base_iterator.rbs +15 -0
- data/sig/iterators/object_iterator.rbs +6 -0
- data/sig/iterators/paginator_iterator.rbs +8 -0
- data/sig/iterators/rule_iterator.rbs +5 -0
- data/sig/iterators/synonym_iterator.rbs +5 -0
- data/sig/transport/request_options.rbs +33 -0
- data/sig/transport/stateful_host.rbs +21 -0
- data/test/algolia/integration/account_client_test.rb +47 -0
- data/test/algolia/integration/analytics_client_test.rb +113 -0
- data/test/algolia/integration/base_test.rb +9 -0
- data/test/algolia/integration/insights_client_test.rb +80 -0
- data/test/algolia/integration/mocks/mock_requester.rb +45 -0
- data/test/algolia/integration/recommendation_client_test.rb +30 -0
- data/test/algolia/integration/search_client_test.rb +361 -0
- data/test/algolia/integration/search_index_test.rb +698 -0
- data/test/algolia/unit/helpers_test.rb +69 -0
- data/test/algolia/unit/retry_strategy_test.rb +139 -0
- data/test/algolia/unit/user_agent_test.rb +16 -0
- data/test/test_helper.rb +89 -0
- data/upgrade_guide.md +595 -0
- metadata +307 -0
@@ -0,0 +1,614 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'openssl'
|
3
|
+
require 'base64'
|
4
|
+
|
5
|
+
module Algolia
|
6
|
+
module Search
|
7
|
+
# Class Client
|
8
|
+
class Client
|
9
|
+
include CallType
|
10
|
+
include Helpers
|
11
|
+
|
12
|
+
# Initialize a client to connect to Algolia
|
13
|
+
#
|
14
|
+
# @param search_config [Search::Config] a Search::Config object which contains your APP_ID and API_KEY
|
15
|
+
# @option adapter [Object] adapter object used for the connection
|
16
|
+
# @option logger [Object]
|
17
|
+
# @option http_requester [Object] http_requester object used for the connection
|
18
|
+
#
|
19
|
+
def initialize(search_config, opts = {})
|
20
|
+
@config = search_config
|
21
|
+
adapter = opts[:adapter] || Defaults::ADAPTER
|
22
|
+
logger = opts[:logger] || LoggerHelper.create('debug.log')
|
23
|
+
requester = opts[:http_requester] || Defaults::REQUESTER_CLASS.new(adapter, logger)
|
24
|
+
@transporter = Transport::Transport.new(@config, requester)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Create a new client providing only app ID and API key
|
28
|
+
#
|
29
|
+
# @param app_id [String] Algolia application ID
|
30
|
+
# @param api_key [String] Algolia API key
|
31
|
+
#
|
32
|
+
# @return self
|
33
|
+
#
|
34
|
+
def self.create(app_id, api_key)
|
35
|
+
config = Search::Config.new(app_id: app_id, api_key: api_key)
|
36
|
+
create_with_config(config)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Create a new client providing only the search config
|
40
|
+
#
|
41
|
+
# @param config [Search::Config]
|
42
|
+
#
|
43
|
+
# @return self
|
44
|
+
#
|
45
|
+
def self.create_with_config(config)
|
46
|
+
new(config)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Fetch the task status until it returns as "published", meaning the operation is done
|
50
|
+
#
|
51
|
+
# @param index_name [String]
|
52
|
+
# @param task_id [Integer]
|
53
|
+
# @param time_before_retry [Integer] time before retrying the call, in ms
|
54
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
55
|
+
#
|
56
|
+
# @return nil
|
57
|
+
#
|
58
|
+
def wait_task(index_name, task_id, time_before_retry = WAIT_TASK_DEFAULT_TIME_BEFORE_RETRY, opts = {})
|
59
|
+
loop do
|
60
|
+
status = get_task_status(index_name, task_id, opts)
|
61
|
+
if status == 'published'
|
62
|
+
return
|
63
|
+
end
|
64
|
+
sleep(time_before_retry.to_f / 1000)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Check the status of a task on the server.
|
69
|
+
# All server task are asynchronous and you can check the status of a task with this method.
|
70
|
+
#
|
71
|
+
# @param index_name [String] index used for the calls
|
72
|
+
# @param task_id [Integer] the id of the task returned by server
|
73
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
74
|
+
#
|
75
|
+
# @return [String]
|
76
|
+
#
|
77
|
+
def get_task_status(index_name, task_id, opts = {})
|
78
|
+
res = @transporter.read(:GET, path_encode('/1/indexes/%s/task/%s', index_name, task_id), {}, opts)
|
79
|
+
get_option(res, 'status')
|
80
|
+
end
|
81
|
+
|
82
|
+
# # # # # # # # # # # # # # # # # # # # #
|
83
|
+
# MISC
|
84
|
+
# # # # # # # # # # # # # # # # # # # # #
|
85
|
+
|
86
|
+
# Initialize an index with a given name
|
87
|
+
#
|
88
|
+
# @param index_name [String] name of the index to init
|
89
|
+
#
|
90
|
+
# @return [Index] new Index instance
|
91
|
+
#
|
92
|
+
def init_index(index_name)
|
93
|
+
index_name.strip!
|
94
|
+
if index_name.empty?
|
95
|
+
raise AlgoliaError, 'Please provide a valid index name'
|
96
|
+
end
|
97
|
+
Index.new(index_name, @transporter, @config)
|
98
|
+
end
|
99
|
+
|
100
|
+
# List all indexes of the client
|
101
|
+
#
|
102
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
103
|
+
#
|
104
|
+
# @return [Hash]
|
105
|
+
#
|
106
|
+
def list_indexes(opts = {})
|
107
|
+
@transporter.read(:GET, '/1/indexes', {}, opts)
|
108
|
+
end
|
109
|
+
|
110
|
+
# Retrieve the client logs
|
111
|
+
#
|
112
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
113
|
+
#
|
114
|
+
# @return [Hash]
|
115
|
+
#
|
116
|
+
def get_logs(opts = {})
|
117
|
+
@transporter.read(:GET, '/1/logs', {}, opts)
|
118
|
+
end
|
119
|
+
|
120
|
+
# # # # # # # # # # # # # # # # # # # # #
|
121
|
+
# COPY OPERATIONS
|
122
|
+
# # # # # # # # # # # # # # # # # # # # #
|
123
|
+
|
124
|
+
# Copy the rules from source index to destination index
|
125
|
+
#
|
126
|
+
# @param src_index_name [String] Name of the source index
|
127
|
+
# @param dest_index_name [String] Name of the destination index
|
128
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
129
|
+
#
|
130
|
+
# @return [IndexingResponse]
|
131
|
+
#
|
132
|
+
def copy_rules(src_index_name, dest_index_name, opts = {})
|
133
|
+
request_options = symbolize_hash(opts)
|
134
|
+
request_options[:scope] = ['rules']
|
135
|
+
copy_index(src_index_name, dest_index_name, request_options)
|
136
|
+
end
|
137
|
+
|
138
|
+
# Copy the rules from source index to destination index and wait for the task to complete
|
139
|
+
#
|
140
|
+
# @param src_index_name [String] Name of the source index
|
141
|
+
# @param dest_index_name [String] Name of the destination index
|
142
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
143
|
+
#
|
144
|
+
# @return [IndexingResponse]
|
145
|
+
#
|
146
|
+
def copy_rules!(src_index_name, dest_index_name, opts = {})
|
147
|
+
request_options = symbolize_hash(opts)
|
148
|
+
request_options[:scope] = ['rules']
|
149
|
+
copy_index!(src_index_name, dest_index_name, request_options)
|
150
|
+
end
|
151
|
+
|
152
|
+
# Copy the settings from source index to destination index
|
153
|
+
#
|
154
|
+
# @param src_index_name [String] Name of the source index
|
155
|
+
# @param dest_index_name [String] Name of the destination index
|
156
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
157
|
+
#
|
158
|
+
# @return [IndexingResponse]
|
159
|
+
#
|
160
|
+
def copy_settings(src_index_name, dest_index_name, opts = {})
|
161
|
+
request_options = symbolize_hash(opts)
|
162
|
+
request_options[:scope] = ['settings']
|
163
|
+
copy_index(src_index_name, dest_index_name, request_options)
|
164
|
+
end
|
165
|
+
|
166
|
+
# Copy the settings from source index to destination index and wait for the task to complete
|
167
|
+
#
|
168
|
+
# @param src_index_name [String] Name of the source index
|
169
|
+
# @param dest_index_name [String] Name of the destination index
|
170
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
171
|
+
#
|
172
|
+
# @return [IndexingResponse]
|
173
|
+
#
|
174
|
+
def copy_settings!(src_index_name, dest_index_name, opts = {})
|
175
|
+
request_options = symbolize_hash(opts)
|
176
|
+
request_options[:scope] = ['settings']
|
177
|
+
copy_index!(src_index_name, dest_index_name, request_options)
|
178
|
+
end
|
179
|
+
|
180
|
+
# Copy the synonyms from source index to destination index
|
181
|
+
#
|
182
|
+
# @param src_index_name [String] Name of the source index
|
183
|
+
# @param dest_index_name [String] Name of the destination index
|
184
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
185
|
+
#
|
186
|
+
# @return [IndexingResponse]
|
187
|
+
#
|
188
|
+
def copy_synonyms(src_index_name, dest_index_name, opts = {})
|
189
|
+
request_options = symbolize_hash(opts)
|
190
|
+
request_options[:scope] = ['synonyms']
|
191
|
+
copy_index(src_index_name, dest_index_name, request_options)
|
192
|
+
end
|
193
|
+
|
194
|
+
# Copy the synonyms from source index to destination index and wait for the task to complete
|
195
|
+
#
|
196
|
+
# @param src_index_name [String] Name of the source index
|
197
|
+
# @param dest_index_name [String] Name of the destination index
|
198
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
199
|
+
#
|
200
|
+
# @return [IndexingResponse]
|
201
|
+
#
|
202
|
+
def copy_synonyms!(src_index_name, dest_index_name, opts = {})
|
203
|
+
request_options = symbolize_hash(opts)
|
204
|
+
request_options[:scope] = ['synonyms']
|
205
|
+
copy_index!(src_index_name, dest_index_name, request_options)
|
206
|
+
end
|
207
|
+
|
208
|
+
# Copy the source index to the destination index
|
209
|
+
#
|
210
|
+
# @param src_index_name [String] Name of the source index
|
211
|
+
# @param dest_index_name [String] Name of the destination index
|
212
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
213
|
+
#
|
214
|
+
# @return [IndexingResponse]
|
215
|
+
#
|
216
|
+
def copy_index(src_index_name, dest_index_name, opts = {})
|
217
|
+
response = @transporter.write(:POST, path_encode('/1/indexes/%s/operation', src_index_name), { operation: 'copy', destination: dest_index_name }, opts)
|
218
|
+
|
219
|
+
IndexingResponse.new(init_index(src_index_name), response)
|
220
|
+
end
|
221
|
+
|
222
|
+
# Copy the source index to the destination index and wait for the task to complete
|
223
|
+
#
|
224
|
+
# @param src_index_name [String] Name of the source index
|
225
|
+
# @param dest_index_name [String] Name of the destination index
|
226
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
227
|
+
#
|
228
|
+
# @return [IndexingResponse]
|
229
|
+
#
|
230
|
+
def copy_index!(src_index_name, dest_index_name, opts = {})
|
231
|
+
response = copy_index(src_index_name, dest_index_name, opts)
|
232
|
+
|
233
|
+
response.wait(opts)
|
234
|
+
end
|
235
|
+
|
236
|
+
# # # # # # # # # # # # # # # # # # # # #
|
237
|
+
# MOVE OPERATIONS
|
238
|
+
# # # # # # # # # # # # # # # # # # # # #
|
239
|
+
|
240
|
+
# Move the source index to the destination index
|
241
|
+
#
|
242
|
+
# @param src_index_name [String] Name of the source index
|
243
|
+
# @param dest_index_name [String] Name of the destination index
|
244
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
245
|
+
#
|
246
|
+
# @return [IndexingResponse]
|
247
|
+
#
|
248
|
+
def move_index(src_index_name, dest_index_name, opts = {})
|
249
|
+
response = @transporter.write(:POST, path_encode('/1/indexes/%s/operation', src_index_name), { operation: 'move', destination: dest_index_name }, opts)
|
250
|
+
|
251
|
+
IndexingResponse.new(init_index(src_index_name), response)
|
252
|
+
end
|
253
|
+
|
254
|
+
# Move the source index to the destination index and wait for the task to complete
|
255
|
+
#
|
256
|
+
# @param src_index_name [String] Name of the source index
|
257
|
+
# @param dest_index_name [String] Name of the destination index
|
258
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
259
|
+
#
|
260
|
+
# @return [IndexingResponse]
|
261
|
+
#
|
262
|
+
def move_index!(src_index_name, dest_index_name, opts = {})
|
263
|
+
response = move_index(src_index_name, dest_index_name, opts)
|
264
|
+
|
265
|
+
response.wait(opts)
|
266
|
+
end
|
267
|
+
|
268
|
+
# # # # # # # # # # # # # # # # # # # # #
|
269
|
+
# API KEY METHODS
|
270
|
+
# # # # # # # # # # # # # # # # # # # # #
|
271
|
+
|
272
|
+
# Get the designated API key
|
273
|
+
#
|
274
|
+
# @param key_id [String] API key to retrieve
|
275
|
+
#
|
276
|
+
# @return [Hash]
|
277
|
+
#
|
278
|
+
def get_api_key(key_id, opts = {})
|
279
|
+
@transporter.read(:GET, path_encode('/1/keys/%s', key_id), {}, opts)
|
280
|
+
end
|
281
|
+
|
282
|
+
# Add an API key with the given ACL
|
283
|
+
#
|
284
|
+
# @param acl [Array] API key to retrieve
|
285
|
+
# @param opts [Hash] contains extra parameters to send with your query used for the key
|
286
|
+
#
|
287
|
+
# @return [AddApiKeyResponse]
|
288
|
+
#
|
289
|
+
def add_api_key(acl, opts = {})
|
290
|
+
response = @transporter.write(:POST, '/1/keys', { acl: acl }, opts)
|
291
|
+
|
292
|
+
AddApiKeyResponse.new(self, response)
|
293
|
+
end
|
294
|
+
|
295
|
+
# Add an API key with the given ACL and wait for the task to complete
|
296
|
+
#
|
297
|
+
# @param acl [Array] API key to retrieve
|
298
|
+
# @param opts [Hash] contains extra parameters to send with your query used for the key
|
299
|
+
#
|
300
|
+
# @return [AddApiKeyResponse]
|
301
|
+
#
|
302
|
+
def add_api_key!(acl, opts = {})
|
303
|
+
response = add_api_key(acl)
|
304
|
+
|
305
|
+
response.wait(opts)
|
306
|
+
end
|
307
|
+
|
308
|
+
# Update an API key with the optional parameters
|
309
|
+
#
|
310
|
+
# @param key [String] API key to update
|
311
|
+
# @param opts [Hash] contains extra parameters to send with your query used to update the key
|
312
|
+
#
|
313
|
+
# @return [UpdateApiKeyResponse]
|
314
|
+
#
|
315
|
+
def update_api_key(key, opts = {})
|
316
|
+
request_options = symbolize_hash(opts)
|
317
|
+
|
318
|
+
response = @transporter.write(:PUT, path_encode('/1/keys/%s', key), {}, request_options)
|
319
|
+
|
320
|
+
UpdateApiKeyResponse.new(self, response, request_options)
|
321
|
+
end
|
322
|
+
|
323
|
+
# Update an API key with the optional parameters and wait for the task to complete
|
324
|
+
#
|
325
|
+
# @param key [String] API key to update
|
326
|
+
# @param opts [Hash] contains extra parameters to send with your query used to update the key
|
327
|
+
#
|
328
|
+
# @return [UpdateApiKeyResponse]
|
329
|
+
#
|
330
|
+
def update_api_key!(key, opts = {})
|
331
|
+
response = update_api_key(key, opts)
|
332
|
+
|
333
|
+
response.wait(opts)
|
334
|
+
end
|
335
|
+
|
336
|
+
# Delete the given API key
|
337
|
+
#
|
338
|
+
# @param key [String] API key to delete
|
339
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
340
|
+
#
|
341
|
+
# @return [DeleteApiKeyResponse]
|
342
|
+
#
|
343
|
+
def delete_api_key(key, opts = {})
|
344
|
+
response = @transporter.write(:DELETE, path_encode('/1/keys/%s', key), {}, opts)
|
345
|
+
|
346
|
+
DeleteApiKeyResponse.new(self, response, key)
|
347
|
+
end
|
348
|
+
|
349
|
+
# Delete the given API key and wait for the task to complete
|
350
|
+
#
|
351
|
+
# @param key [String] API key to delete
|
352
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
353
|
+
#
|
354
|
+
# @return [DeleteApiKeyResponse]
|
355
|
+
#
|
356
|
+
def delete_api_key!(key, opts = {})
|
357
|
+
response = delete_api_key(key, opts)
|
358
|
+
|
359
|
+
response.wait(opts)
|
360
|
+
end
|
361
|
+
|
362
|
+
# Restore the given API key
|
363
|
+
#
|
364
|
+
# @param key [String] API key to restore
|
365
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
366
|
+
#
|
367
|
+
# @return [RestoreApiKeyResponse]
|
368
|
+
#
|
369
|
+
def restore_api_key(key, opts = {})
|
370
|
+
@transporter.write(:POST, path_encode('/1/keys/%s/restore', key), {}, opts)
|
371
|
+
|
372
|
+
RestoreApiKeyResponse.new(self, key)
|
373
|
+
end
|
374
|
+
|
375
|
+
# Restore the given API key and wait for the task to complete
|
376
|
+
#
|
377
|
+
# @param key [String] API key to restore
|
378
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
379
|
+
#
|
380
|
+
# @return [RestoreApiKeyResponse]
|
381
|
+
#
|
382
|
+
def restore_api_key!(key, opts = {})
|
383
|
+
response = restore_api_key(key, opts)
|
384
|
+
|
385
|
+
response.wait(opts)
|
386
|
+
end
|
387
|
+
|
388
|
+
# List all keys associated with the current client
|
389
|
+
#
|
390
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
391
|
+
#
|
392
|
+
# @return [Hash]
|
393
|
+
#
|
394
|
+
def list_api_keys(opts = {})
|
395
|
+
@transporter.read(:GET, '/1/keys', {}, opts)
|
396
|
+
end
|
397
|
+
|
398
|
+
# Generate a secured API key from the given parent key with the given restrictions
|
399
|
+
#
|
400
|
+
# @param parent_key [String] Parent API key used the generate the secured key
|
401
|
+
# @param restrictions [Hash] Restrictions to apply on the secured key
|
402
|
+
#
|
403
|
+
# @return [String]
|
404
|
+
#
|
405
|
+
def self.generate_secured_api_key(parent_key, restrictions)
|
406
|
+
url_encoded_restrictions = to_query_string(symbolize_hash(restrictions))
|
407
|
+
hmac = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), parent_key, url_encoded_restrictions)
|
408
|
+
Base64.encode64("#{hmac}#{url_encoded_restrictions}").gsub("\n", '')
|
409
|
+
end
|
410
|
+
|
411
|
+
# Returns the time the given securedAPIKey remains valid in seconds
|
412
|
+
#
|
413
|
+
# @param secured_api_key [String]
|
414
|
+
#
|
415
|
+
# @return [Integer]
|
416
|
+
#
|
417
|
+
def self.get_secured_api_key_remaining_validity(secured_api_key)
|
418
|
+
now = Time.now.to_i
|
419
|
+
decoded_key = Base64.decode64(secured_api_key)
|
420
|
+
regex = 'validUntil=(\d+)'
|
421
|
+
matches = decoded_key.match(regex)
|
422
|
+
|
423
|
+
if matches.nil?
|
424
|
+
raise AlgoliaError, 'The SecuredAPIKey doesn\'t have a validUntil parameter.'
|
425
|
+
end
|
426
|
+
|
427
|
+
valid_until = matches[1].to_i
|
428
|
+
|
429
|
+
valid_until - now
|
430
|
+
end
|
431
|
+
|
432
|
+
# # # # # # # # # # # # # # # # # # # # #
|
433
|
+
# MULTIPLE* METHODS
|
434
|
+
# # # # # # # # # # # # # # # # # # # # #
|
435
|
+
|
436
|
+
# Batch multiple operations
|
437
|
+
#
|
438
|
+
# @param operations [Array] array of operations (addObject, updateObject, ...)
|
439
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
440
|
+
#
|
441
|
+
# @return [MultipleIndexBatchIndexingResponse]
|
442
|
+
#
|
443
|
+
def multiple_batch(operations, opts = {})
|
444
|
+
response = @transporter.write(:POST, '/1/indexes/*/batch', { requests: operations }, opts)
|
445
|
+
|
446
|
+
MultipleIndexBatchIndexingResponse.new(self, response)
|
447
|
+
end
|
448
|
+
|
449
|
+
# Batch multiple operations and wait for the task to complete
|
450
|
+
#
|
451
|
+
# @param operations [Array] array of operations (addObject, updateObject, ...)
|
452
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
453
|
+
#
|
454
|
+
# @return [MultipleIndexBatchIndexingResponse]
|
455
|
+
#
|
456
|
+
def multiple_batch!(operations, opts = {})
|
457
|
+
response = multiple_batch(operations, opts)
|
458
|
+
|
459
|
+
response.wait(opts)
|
460
|
+
end
|
461
|
+
|
462
|
+
# Retrieve multiple objects in one batch request
|
463
|
+
#
|
464
|
+
# @param requests [Array] array of requests
|
465
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
466
|
+
#
|
467
|
+
# @return [Hash]
|
468
|
+
#
|
469
|
+
def multiple_get_objects(requests, opts = {})
|
470
|
+
@transporter.read(:POST, '/1/indexes/*/objects', { requests: requests }, opts)
|
471
|
+
end
|
472
|
+
|
473
|
+
# Search multiple indices
|
474
|
+
#
|
475
|
+
# @param queries [Array] array of queries
|
476
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
477
|
+
#
|
478
|
+
# @return [Hash]
|
479
|
+
#
|
480
|
+
def multiple_queries(queries, opts = {})
|
481
|
+
@transporter.read(:POST, '/1/indexes/*/queries', { requests: queries }, opts)
|
482
|
+
end
|
483
|
+
|
484
|
+
# # # # # # # # # # # # # # # # # # # # #
|
485
|
+
# MCM METHODS
|
486
|
+
# # # # # # # # # # # # # # # # # # # # #
|
487
|
+
|
488
|
+
# Assign or Move a userID to a cluster.
|
489
|
+
#
|
490
|
+
# @param user_id [String]
|
491
|
+
# @param cluster_name [String]
|
492
|
+
#
|
493
|
+
# @return [Hash]
|
494
|
+
#
|
495
|
+
def assign_user_id(user_id, cluster_name, opts = {})
|
496
|
+
request_options = symbolize_hash(opts)
|
497
|
+
request_options[:headers] = { 'X-Algolia-User-ID': user_id }
|
498
|
+
|
499
|
+
@transporter.write(:POST, '/1/clusters/mapping', { cluster: cluster_name }, request_options)
|
500
|
+
end
|
501
|
+
|
502
|
+
# Assign multiple userIDs to a cluster.
|
503
|
+
#
|
504
|
+
# @param user_ids [Array]
|
505
|
+
# @param cluster_name [String]
|
506
|
+
#
|
507
|
+
# @return [Hash]
|
508
|
+
#
|
509
|
+
def assign_user_ids(user_ids, cluster_name, opts = {})
|
510
|
+
@transporter.write(:POST, '/1/clusters/mapping/batch', { cluster: cluster_name, users: user_ids }, opts)
|
511
|
+
end
|
512
|
+
|
513
|
+
# Get the top 10 userIDs with the highest number of records per cluster.
|
514
|
+
#
|
515
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
516
|
+
#
|
517
|
+
# @return [Hash]
|
518
|
+
#
|
519
|
+
def get_top_user_ids(opts = {})
|
520
|
+
@transporter.read(:GET, '/1/clusters/mapping/top', {}, opts)
|
521
|
+
end
|
522
|
+
|
523
|
+
# Returns the userID data stored in the mapping.
|
524
|
+
#
|
525
|
+
# @param user_id [String]
|
526
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
527
|
+
#
|
528
|
+
# @return [Hash]
|
529
|
+
#
|
530
|
+
def get_user_id(user_id, opts = {})
|
531
|
+
@transporter.read(:GET, path_encode('/1/clusters/mapping/%s', user_id), {}, opts)
|
532
|
+
end
|
533
|
+
|
534
|
+
# List the clusters available in a multi-clusters setup for a single appID
|
535
|
+
#
|
536
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
537
|
+
#
|
538
|
+
# @return [Hash]
|
539
|
+
#
|
540
|
+
def list_clusters(opts = {})
|
541
|
+
@transporter.read(:GET, '/1/clusters', {}, opts)
|
542
|
+
end
|
543
|
+
|
544
|
+
# List the userIDs assigned to a multi-clusters appID
|
545
|
+
#
|
546
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
547
|
+
#
|
548
|
+
# @return [Hash]
|
549
|
+
#
|
550
|
+
def list_user_ids(opts = {})
|
551
|
+
@transporter.read(:GET, '/1/clusters/mapping', {}, opts)
|
552
|
+
end
|
553
|
+
|
554
|
+
# Remove a userID and its associated data from the multi-clusters
|
555
|
+
#
|
556
|
+
# @param user_id [String]
|
557
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
558
|
+
#
|
559
|
+
# @return [Hash]
|
560
|
+
#
|
561
|
+
def remove_user_id(user_id, opts = {})
|
562
|
+
request_options = symbolize_hash(opts)
|
563
|
+
request_options[:headers] = { 'X-Algolia-User-ID': user_id }
|
564
|
+
|
565
|
+
@transporter.write(:DELETE, '/1/clusters/mapping', {}, request_options)
|
566
|
+
end
|
567
|
+
|
568
|
+
# Search for userIDs
|
569
|
+
#
|
570
|
+
# @param query [String]
|
571
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
572
|
+
#
|
573
|
+
# @return [Hash]
|
574
|
+
#
|
575
|
+
def search_user_ids(query, opts = {})
|
576
|
+
@transporter.read(:POST, '/1/clusters/mapping/search', { query: query }, opts)
|
577
|
+
end
|
578
|
+
|
579
|
+
# Get the status of your clusters' migrations or user creations
|
580
|
+
#
|
581
|
+
# @param opts [Hash] contains extra parameters to send with your query
|
582
|
+
#
|
583
|
+
# @return [Hash]
|
584
|
+
#
|
585
|
+
def pending_mappings?(opts = {})
|
586
|
+
retrieve_mappings = false
|
587
|
+
|
588
|
+
request_options = symbolize_hash(opts)
|
589
|
+
if request_options.has_key?(:retrieveMappings)
|
590
|
+
retrieve_mappings = request_options[:retrieveMappings]
|
591
|
+
request_options.delete(:retrieveMappings)
|
592
|
+
end
|
593
|
+
|
594
|
+
@transporter.read(:GET, '/1/clusters/mapping/pending' + handle_params({ getClusters: retrieve_mappings }), {}, request_options)
|
595
|
+
end
|
596
|
+
|
597
|
+
#
|
598
|
+
# Aliases the pending_mappings? method
|
599
|
+
#
|
600
|
+
alias_method :has_pending_mappings, :pending_mappings?
|
601
|
+
|
602
|
+
#
|
603
|
+
# Method available to make custom requests to the API
|
604
|
+
#
|
605
|
+
def custom_request(data, uri, method, call_type, opts = {})
|
606
|
+
if call_type == WRITE
|
607
|
+
@transporter.write(method.to_sym, uri, data, opts)
|
608
|
+
elsif call_type == READ
|
609
|
+
@transporter.read(method.to_sym, uri, data, opts)
|
610
|
+
end
|
611
|
+
end
|
612
|
+
end
|
613
|
+
end
|
614
|
+
end
|