aboutyou-sdk 0.0.1
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 +15 -0
- data/lib/aboutyou-sdk.rb +545 -0
- data/lib/aboutyou-sdk/Client.rb +125 -0
- data/lib/aboutyou-sdk/Constants.rb +48 -0
- data/lib/aboutyou-sdk/Criteria/ProductFields.rb +54 -0
- data/lib/aboutyou-sdk/Criteria/ProductSearchCriteria.rb +436 -0
- data/lib/aboutyou-sdk/Factory/DefaultModelFactory.rb +454 -0
- data/lib/aboutyou-sdk/Model/AbstractModel.rb +26 -0
- data/lib/aboutyou-sdk/Model/App.rb +35 -0
- data/lib/aboutyou-sdk/Model/Autocomplete.rb +92 -0
- data/lib/aboutyou-sdk/Model/Basket.rb +262 -0
- data/lib/aboutyou-sdk/Model/Basket/AbstractBasketItem.rb +76 -0
- data/lib/aboutyou-sdk/Model/Basket/BasketItem.rb +100 -0
- data/lib/aboutyou-sdk/Model/Basket/BasketSet.rb +192 -0
- data/lib/aboutyou-sdk/Model/Basket/BasketSetItem.rb +46 -0
- data/lib/aboutyou-sdk/Model/Basket/BasketVariantItem.rb +137 -0
- data/lib/aboutyou-sdk/Model/CategoriesResult.rb +15 -0
- data/lib/aboutyou-sdk/Model/Category.rb +126 -0
- data/lib/aboutyou-sdk/Model/CategoryManager/DefaultCategoryManager.rb +172 -0
- data/lib/aboutyou-sdk/Model/CategoryTree.rb +35 -0
- data/lib/aboutyou-sdk/Model/Facet.rb +105 -0
- data/lib/aboutyou-sdk/Model/FacetGroup.rb +110 -0
- data/lib/aboutyou-sdk/Model/FacetGroupSet.rb +247 -0
- data/lib/aboutyou-sdk/Model/FacetManager/DefaultFacetManager.rb +79 -0
- data/lib/aboutyou-sdk/Model/Image.rb +134 -0
- data/lib/aboutyou-sdk/Model/ImageSize.rb +21 -0
- data/lib/aboutyou-sdk/Model/InitiateOrder.rb +50 -0
- data/lib/aboutyou-sdk/Model/Order.rb +17 -0
- data/lib/aboutyou-sdk/Model/Product.rb +543 -0
- data/lib/aboutyou-sdk/Model/ProductSearchResult.rb +125 -0
- data/lib/aboutyou-sdk/Model/ProductSearchResult/FacetCount.rb +26 -0
- data/lib/aboutyou-sdk/Model/ProductSearchResult/FacetCounts.rb +38 -0
- data/lib/aboutyou-sdk/Model/ProductSearchResult/PriceRange.rb +49 -0
- data/lib/aboutyou-sdk/Model/ProductSearchResult/SaleCounts.rb +58 -0
- data/lib/aboutyou-sdk/Model/ProductSearchResult/TermsCount.rb +27 -0
- data/lib/aboutyou-sdk/Model/ProductsEansResult.rb +43 -0
- data/lib/aboutyou-sdk/Model/ProductsResult.rb +52 -0
- data/lib/aboutyou-sdk/Model/ResultError.rb +24 -0
- data/lib/aboutyou-sdk/Model/Variant.rb +255 -0
- data/lib/aboutyou-sdk/Model/VariantsResult.rb +102 -0
- data/lib/aboutyou-sdk/Query.rb +261 -0
- data/lib/aboutyou-sdk/QueryBuilder.rb +440 -0
- data/tests/Sinatra-test/Main.rb +5 -0
- data/tests/testApiClient.rb +35 -0
- data/tests/testAutocomplete.rb +40 -0
- data/tests/testCatFilter.rb +35 -0
- data/tests/testCatTree.rb +37 -0
- data/tests/testFacets.rb +36 -0
- data/tests/testProdCatLongestPath.rb +34 -0
- data/tests/testProductSearchResult.rb +35 -0
- data/tests/testProductsByIds.rb +34 -0
- data/tests/testVariantsByIds.rb +34 -0
- metadata +122 -0
@@ -0,0 +1,440 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module AboutYou
|
4
|
+
module SDK
|
5
|
+
module QueryBuilder
|
6
|
+
|
7
|
+
###
|
8
|
+
# @param string $searchword The prefix search word to search for.
|
9
|
+
# @param int $limit Maximum number of results.
|
10
|
+
# @param array $types Array of types to search for (Constants::TYPE_...).
|
11
|
+
#
|
12
|
+
# @return $this
|
13
|
+
#
|
14
|
+
# @throws \InvalidArgumentException
|
15
|
+
###
|
16
|
+
def fetchAutocomplete(
|
17
|
+
searchword,
|
18
|
+
limit = nil,
|
19
|
+
types = nil)
|
20
|
+
|
21
|
+
if (!(searchword.is_a? String))
|
22
|
+
raise 'InvalidArgumentException! searchword must be a string'
|
23
|
+
end
|
24
|
+
|
25
|
+
# strtolower is a workaround of ticket SAPI-532
|
26
|
+
options = Hash[
|
27
|
+
'searchword' => searchword.downcase
|
28
|
+
]
|
29
|
+
|
30
|
+
if (limit != nil)
|
31
|
+
if (!(limit.is_a? Integer) && !limit[/\d/])
|
32
|
+
raise 'InvalidArgumentException! limit must be an integer'
|
33
|
+
end
|
34
|
+
options['limit'] = Integer(limit);
|
35
|
+
end
|
36
|
+
|
37
|
+
if (!types.empty?)
|
38
|
+
options['types'] = types;
|
39
|
+
end
|
40
|
+
|
41
|
+
self.query.push(Hash['autocompletion' => options])
|
42
|
+
|
43
|
+
return self;
|
44
|
+
end
|
45
|
+
|
46
|
+
###
|
47
|
+
# @param string $sessionId Free to choose ID of the current website visitor.
|
48
|
+
#
|
49
|
+
# @return $this
|
50
|
+
###
|
51
|
+
def fetchBasket(sessionId)
|
52
|
+
|
53
|
+
checkSessionId(sessionId);
|
54
|
+
|
55
|
+
self.query.push(Hash['basket' => Hash['session_id' => sessionId]])
|
56
|
+
|
57
|
+
return self;
|
58
|
+
end
|
59
|
+
|
60
|
+
###
|
61
|
+
# @param string $sessionId Free to choose ID of the current website visitor.
|
62
|
+
# @param int $productVariantId ID of product variant.
|
63
|
+
# @param int $amount Amount of items to add.
|
64
|
+
#
|
65
|
+
#@return $this
|
66
|
+
###
|
67
|
+
def addItemsToBasket(sessionId, items)
|
68
|
+
|
69
|
+
checkSessionId(sessionId);
|
70
|
+
|
71
|
+
orderLines = Array();
|
72
|
+
|
73
|
+
items.each do ||item|
|
74
|
+
orderLine = Hash['id' => item.getId(),'variant_id' => item.getVariantId()]
|
75
|
+
|
76
|
+
if(item.getAdditionalData())
|
77
|
+
orderLine['additional_data'] = item.getAdditionalData();
|
78
|
+
end
|
79
|
+
|
80
|
+
orderLines.push(orderLine)
|
81
|
+
end
|
82
|
+
|
83
|
+
self.query.push( Hash['basket' => Hash['session_id' => sessionId,'order_lines' => orderLines]])
|
84
|
+
|
85
|
+
return self;
|
86
|
+
end
|
87
|
+
|
88
|
+
###
|
89
|
+
# @param string $sessionId Free to choose ID of the current website visitor.
|
90
|
+
# @param Model\BasketItemSet[] $itemSets
|
91
|
+
# @param int $amount Amount of items to add.
|
92
|
+
#
|
93
|
+
# @return $this
|
94
|
+
###
|
95
|
+
def addItemSetsToBasket(sessionId, itemSets)
|
96
|
+
|
97
|
+
checkSessionId(sessionId);
|
98
|
+
|
99
|
+
orderLines = Array();
|
100
|
+
|
101
|
+
itemSets.each do |itemSet|
|
102
|
+
orderLine = Hash[
|
103
|
+
'id' => itemSet.getId(),
|
104
|
+
'set_items' => Array()
|
105
|
+
]
|
106
|
+
|
107
|
+
if(itemSet.getAdditionalData())
|
108
|
+
orderLine['additional_data'] = itemSet.getAdditionalData();
|
109
|
+
end
|
110
|
+
|
111
|
+
|
112
|
+
itemSet.getItems().each do |item|
|
113
|
+
entry = Hash['variant_id' => item.getVariantId()]
|
114
|
+
|
115
|
+
if(item.getAdditionalData())
|
116
|
+
entry['additional_data'] = item.getAdditionalData();
|
117
|
+
end
|
118
|
+
|
119
|
+
orderLine['set_items'].push(entry)
|
120
|
+
end
|
121
|
+
|
122
|
+
orderLines.push(orderLine)
|
123
|
+
end
|
124
|
+
|
125
|
+
self.query.push(Hash['basket' => Hash['session_id' => sessionId,'order_lines' => orderLines]])
|
126
|
+
|
127
|
+
return self;
|
128
|
+
end
|
129
|
+
|
130
|
+
###
|
131
|
+
# @param string $sessionId Free to choose ID of the current website visitor.
|
132
|
+
# @param int $productVariantId ID of product variant.
|
133
|
+
# @param string $basketItemId ID of single item or set in the basket
|
134
|
+
#
|
135
|
+
# @return $this
|
136
|
+
###
|
137
|
+
def addToBasket(sessionId, productVariantId, basketItemId)
|
138
|
+
|
139
|
+
checkSessionId(sessionId);
|
140
|
+
|
141
|
+
self.query.push(Hash['basket' => Hash[
|
142
|
+
'session_id' => sessionId,
|
143
|
+
'order_lines' => Array(
|
144
|
+
Hash[
|
145
|
+
'id' => basketItemId,
|
146
|
+
'variant_id' => Integer(productVariantId)
|
147
|
+
]
|
148
|
+
)
|
149
|
+
]
|
150
|
+
]
|
151
|
+
)
|
152
|
+
|
153
|
+
return self;
|
154
|
+
end
|
155
|
+
|
156
|
+
###
|
157
|
+
# @param string $sessionId Free to choose ID of the current website visitor.
|
158
|
+
# @param string[] $itemIds array of basket item ids to delete, this can be sets or single items
|
159
|
+
#
|
160
|
+
# @return $this
|
161
|
+
###
|
162
|
+
def removeFromBasket(sessionId, itemIds)
|
163
|
+
|
164
|
+
checkSessionId(sessionId);
|
165
|
+
|
166
|
+
orderLines = Array();
|
167
|
+
|
168
|
+
itemIds.each do |id|
|
169
|
+
orderLines.push(Hash['delete' => id])
|
170
|
+
end
|
171
|
+
|
172
|
+
self.query.push(Hash[
|
173
|
+
'basket' => Hash[
|
174
|
+
'session_id' => sessionId,
|
175
|
+
'order_lines' => orderLines
|
176
|
+
]
|
177
|
+
]
|
178
|
+
)
|
179
|
+
|
180
|
+
return self;
|
181
|
+
end
|
182
|
+
|
183
|
+
###
|
184
|
+
# @param string $sessionId
|
185
|
+
# @param Basket $basket
|
186
|
+
#
|
187
|
+
# @return $this
|
188
|
+
###
|
189
|
+
def updateBasket(sessionId, basket)
|
190
|
+
|
191
|
+
checkSessionId(sessionId);
|
192
|
+
|
193
|
+
basketQuery = Hash['session_id' => sessionId]
|
194
|
+
|
195
|
+
orderLines = basket.getOrderLinesArray();
|
196
|
+
if (!orderLines.empty?)
|
197
|
+
basketQuery['order_lines'] = orderLines;
|
198
|
+
end
|
199
|
+
|
200
|
+
self.query.push(Hash['basket' => basketQuery])
|
201
|
+
|
202
|
+
return self;
|
203
|
+
end
|
204
|
+
|
205
|
+
###
|
206
|
+
# @param int[]|string[] $ids either a single category ID as integer or an array of IDs
|
207
|
+
#
|
208
|
+
# @return $this
|
209
|
+
###
|
210
|
+
def fetchCategoriesByIds(ids = nil)
|
211
|
+
|
212
|
+
if (ids == nil)
|
213
|
+
self.query.push('category' => nil)
|
214
|
+
else
|
215
|
+
# we allow to pass a single ID instead of an array
|
216
|
+
ids = Array(ids)
|
217
|
+
|
218
|
+
ids.each do |id|
|
219
|
+
id = id.to_i
|
220
|
+
if (id < 1)
|
221
|
+
raise 'InvalidArgumentException! A single category ID must be greater than 0'
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
ids = ids.map{|id| Integer(id)}
|
226
|
+
|
227
|
+
self.query.push(Hash[
|
228
|
+
'category' => Hash[
|
229
|
+
'ids' => ids
|
230
|
+
]
|
231
|
+
]
|
232
|
+
)
|
233
|
+
end
|
234
|
+
return self
|
235
|
+
end
|
236
|
+
|
237
|
+
###
|
238
|
+
# @param int $maxDepth -1 <= $maxDepth <= 10,
|
239
|
+
#
|
240
|
+
# @return $this
|
241
|
+
###
|
242
|
+
def fetchCategoryTree()
|
243
|
+
|
244
|
+
self.query.push(Hash['category_tree' => {"version"=>"2"}])
|
245
|
+
|
246
|
+
return self
|
247
|
+
end
|
248
|
+
|
249
|
+
###
|
250
|
+
# @param string[]|int[] $ids
|
251
|
+
# @param array $fields
|
252
|
+
#
|
253
|
+
# @return $this
|
254
|
+
###
|
255
|
+
def fetchProductsByIds(ids,fields = Array(nil))
|
256
|
+
# we allow to pass a single ID instead of an array
|
257
|
+
|
258
|
+
ids = Array(ids)
|
259
|
+
ids = ids.map{|id| Integer(id)}
|
260
|
+
|
261
|
+
self.query.push(Hash['products' => Hash['ids' => ids,'fields' => AboutYou::SDK::Criteria::ProductFields::filterFields(fields)]])
|
262
|
+
|
263
|
+
return self;
|
264
|
+
end
|
265
|
+
|
266
|
+
###
|
267
|
+
# @param string[]|int[] $ids
|
268
|
+
#
|
269
|
+
# @return $this
|
270
|
+
###
|
271
|
+
def fetchLiveVariantByIds(ids)
|
272
|
+
# we allow to pass a single ID instead of an array
|
273
|
+
ids = Array(ids)
|
274
|
+
|
275
|
+
ids = ids.map{|id| Integer(id)}
|
276
|
+
|
277
|
+
self.query.push(Hash['live_variant' => Hash['ids' => ids]])
|
278
|
+
|
279
|
+
return self;
|
280
|
+
end
|
281
|
+
|
282
|
+
###
|
283
|
+
# @param string[] $eans
|
284
|
+
# @param array $fields
|
285
|
+
#
|
286
|
+
# @return $this
|
287
|
+
###
|
288
|
+
def fetchProductsByEans(eans,fields = Array())
|
289
|
+
self.query.push(Hash[
|
290
|
+
'products_eans' => Hash[
|
291
|
+
'eans' => eans,
|
292
|
+
'fields' => ProductFields::filterFields(fields),
|
293
|
+
'version' => '2'
|
294
|
+
]
|
295
|
+
]
|
296
|
+
)
|
297
|
+
|
298
|
+
return self;
|
299
|
+
end
|
300
|
+
|
301
|
+
###
|
302
|
+
# @param string|int $orderId
|
303
|
+
#
|
304
|
+
# @return $this
|
305
|
+
###
|
306
|
+
def fetchOrder(orderId)
|
307
|
+
|
308
|
+
self.query.push(Hash['get_order' => Hash['order_id' =>orderId]])
|
309
|
+
|
310
|
+
return self;
|
311
|
+
end
|
312
|
+
|
313
|
+
###
|
314
|
+
# @param string $sessionId
|
315
|
+
# @param string $successUrl
|
316
|
+
# @param string $cancelUrl
|
317
|
+
# @param string $errorUrl
|
318
|
+
#
|
319
|
+
# @return $this
|
320
|
+
###
|
321
|
+
def initiateOrder(sessionId, successUrl, cancelUrl, errorUrl)
|
322
|
+
|
323
|
+
checkSessionId(sessionId);
|
324
|
+
|
325
|
+
args = Hash['session_id' => sessionId,'success_url' => successUrl]
|
326
|
+
if (cancelUrl)
|
327
|
+
args['cancel_url'] = cancelUrl;
|
328
|
+
end
|
329
|
+
if (errorUrl)
|
330
|
+
args['error_url'] = errorUrl;
|
331
|
+
end
|
332
|
+
self.query.push(Hash['initiate_order' => args])
|
333
|
+
|
334
|
+
return self;
|
335
|
+
end
|
336
|
+
|
337
|
+
###
|
338
|
+
# @param ProductSearchCriteria $criteria
|
339
|
+
#
|
340
|
+
# @return $this
|
341
|
+
###
|
342
|
+
def fetchProductSearch(criteria)
|
343
|
+
|
344
|
+
checkSessionId(criteria.sessionId());
|
345
|
+
self.query.push(Hash['product_search' =>criteria.toArray])
|
346
|
+
|
347
|
+
return self;
|
348
|
+
end
|
349
|
+
|
350
|
+
###
|
351
|
+
# @param array $groupIds
|
352
|
+
#
|
353
|
+
# @return $this
|
354
|
+
#
|
355
|
+
# @throws \InvalidArgumentException
|
356
|
+
###
|
357
|
+
def fetchFacets(groupIds = Array())
|
358
|
+
|
359
|
+
groupIds = groupIds.map{|groupId| Integer(groupId)}
|
360
|
+
|
361
|
+
self.query.push(Hash['facets' => Hash['group_ids' => groupIds]])
|
362
|
+
|
363
|
+
return self;
|
364
|
+
end
|
365
|
+
|
366
|
+
###
|
367
|
+
# @param array $params
|
368
|
+
#
|
369
|
+
# @return $this
|
370
|
+
#
|
371
|
+
# @throws \InvalidArgumentException
|
372
|
+
###
|
373
|
+
def fetchFacet(params)
|
374
|
+
|
375
|
+
if (params.empty)
|
376
|
+
raise 'InvalidArgumentException! no params given'
|
377
|
+
end
|
378
|
+
|
379
|
+
self.query.push(Hash['facet' => params])
|
380
|
+
|
381
|
+
return self
|
382
|
+
end
|
383
|
+
|
384
|
+
###
|
385
|
+
# @return $this
|
386
|
+
###
|
387
|
+
def fetchFacetTypes()
|
388
|
+
|
389
|
+
self.query.push(Hash['facet_types' => nil]);
|
390
|
+
|
391
|
+
return self;
|
392
|
+
end
|
393
|
+
|
394
|
+
###
|
395
|
+
# @param string $searchword The search string to search for.
|
396
|
+
#
|
397
|
+
# @return $this
|
398
|
+
###
|
399
|
+
def fetchSuggest(searchword)
|
400
|
+
|
401
|
+
self.query.push(Hash['suggest' => Hash['searchword' => searchword]])
|
402
|
+
|
403
|
+
return self
|
404
|
+
end
|
405
|
+
|
406
|
+
###
|
407
|
+
# @return $this
|
408
|
+
###
|
409
|
+
def fetchChildApps()
|
410
|
+
|
411
|
+
self.query.push(Hash['child_apps' => nil])
|
412
|
+
|
413
|
+
return self;
|
414
|
+
end
|
415
|
+
|
416
|
+
###
|
417
|
+
# @return string
|
418
|
+
###
|
419
|
+
def queryString()
|
420
|
+
|
421
|
+
return self.query.to_json
|
422
|
+
end
|
423
|
+
|
424
|
+
###
|
425
|
+
# @param $sessionId
|
426
|
+
#
|
427
|
+
# @throws \InvalidArgumentException
|
428
|
+
###
|
429
|
+
def checkSessionId(sessionId)
|
430
|
+
|
431
|
+
if (!(sessionId.is_a? String))
|
432
|
+
raise 'InvalidArgumentException! The session id must be a string'
|
433
|
+
end
|
434
|
+
if !(sessionId.length > 4)
|
435
|
+
raise 'InvalidArgumentException! The session id must have at least 5 characters'
|
436
|
+
end
|
437
|
+
end
|
438
|
+
end
|
439
|
+
end
|
440
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
|
3
|
+
query = HTTParty.post("https://shop-api.aboutyou.de/api",
|
4
|
+
{
|
5
|
+
:body=>
|
6
|
+
'[{
|
7
|
+
"products": {
|
8
|
+
"ids": [
|
9
|
+
144388,
|
10
|
+
144389
|
11
|
+
],
|
12
|
+
"fields": [
|
13
|
+
"id",
|
14
|
+
"name",
|
15
|
+
"active",
|
16
|
+
"brand_id",
|
17
|
+
"description_long",
|
18
|
+
"description_short",
|
19
|
+
"default_variant",
|
20
|
+
"variants",
|
21
|
+
"min_price",
|
22
|
+
"max_price",
|
23
|
+
"sale",
|
24
|
+
"default_image",
|
25
|
+
"attributes_merged",
|
26
|
+
"categories"
|
27
|
+
]
|
28
|
+
}
|
29
|
+
}]',
|
30
|
+
:basic_auth => { :username => 281 , :password => 'e6068c4ca020262613d06122663cb300'},
|
31
|
+
:headers => { 'Content-Type' => 'application/json',
|
32
|
+
'Accept-Encoding' => 'gzip,deflate' }
|
33
|
+
})
|
34
|
+
|
35
|
+
puts query
|