yotpo 0.0.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 +15 -0
- data/.gitignore +20 -0
- data/.rspec +3 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +4 -0
- data/Gemfile +16 -0
- data/LICENSE.txt +22 -0
- data/README.md +51 -0
- data/Rakefile +11 -0
- data/lib/yotpo/api/account.rb +45 -0
- data/lib/yotpo/api/account_platform.rb +20 -0
- data/lib/yotpo/api/product.rb +25 -0
- data/lib/yotpo/api/purchase.rb +38 -0
- data/lib/yotpo/api/reminder.rb +14 -0
- data/lib/yotpo/api/review.rb +67 -0
- data/lib/yotpo/api/user.rb +64 -0
- data/lib/yotpo/client.rb +134 -0
- data/lib/yotpo/core/response_parser.rb +84 -0
- data/lib/yotpo/version.rb +3 -0
- data/lib/yotpo.rb +58 -0
- data/spec/api/account_platform_spec.rb +33 -0
- data/spec/api/account_spec.rb +45 -0
- data/spec/api/product_spec.rb +44 -0
- data/spec/api/purchase_spec.rb +100 -0
- data/spec/api/reminder_spec.rb +22 -0
- data/spec/api/review_spec.rb +55 -0
- data/spec/api/user_spec.rb +63 -0
- data/spec/fixtures/bearer_token.json +4 -0
- data/spec/fixtures/check_subdomain.json +12 -0
- data/spec/fixtures/get_all_bottom_lines.json +29 -0
- data/spec/fixtures/get_list_of_purchases.json +39 -0
- data/spec/fixtures/get_login_url.json +10 -0
- data/spec/fixtures/get_product_bottom_line.json +12 -0
- data/spec/fixtures/get_product_reviews.json +356 -0
- data/spec/fixtures/new_account_platform.json +23 -0
- data/spec/fixtures/new_purchase.json +4 -0
- data/spec/fixtures/new_review.json +64 -0
- data/spec/fixtures/new_user.json +12 -0
- data/spec/fixtures/send_test_email.json +6 -0
- data/spec/fixtures/update_account.json +53 -0
- data/spec/helper.rb +65 -0
- data/spec/yotpo_spec.rb +4 -0
- data/yotpo.gemspec +29 -0
- metadata +193 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
Y2I3YTE0MTMxMmIxZjRiZTRiMWI4YTFmMWRmNmY4OTU2NmQwNGIyZQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZDZhOGQ1MTViNDM3MjYyZDk4N2JkY2UxM2NiMGEyMjNiYzk5NjdjYQ==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MGEwNzY5YjRjYjAwMGFkZjJkY2ZmODQ2OGJiMGY3ZTM3YTFhNDhkZGI0MzIx
|
10
|
+
OTEwYjI5NzE1MWZjNWM2MmMxMzYyZTFhNTIzZTMyNWZlODI4ZTE4MDA2ZDQ4
|
11
|
+
OTE1ODQ5YjcxMWUzNzU5ODc3M2IwN2RiYWRkNTE0NDc1ZjhiMTA=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NTM0ODg4YmM0MTM1MzUwYTUyOWNkNTY0Yzg3NTMyNmE2MTIyODI0Njc5ZjJk
|
14
|
+
YjQ4NzQ0MTZkMTY4ZTVkYTBjZjU4Mjk3MDBjYzUyMDM1ZmQ1ZDNlYjZmZDJi
|
15
|
+
NjUzNGFmMzI2NjJkNTNhNjIyZDU5MzhlNzA3NDA0NWI1MmRkODg=
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
yotpo-api-connector
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-1.9.3-p194
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
gem 'rake'
|
4
|
+
gem 'yard'
|
5
|
+
gem 'redcarpet'
|
6
|
+
|
7
|
+
group :test do
|
8
|
+
gem 'coveralls', :require => false
|
9
|
+
gem 'rspec'
|
10
|
+
gem 'simplecov', :require => false
|
11
|
+
gem 'webmock'
|
12
|
+
gem 'ffaker'
|
13
|
+
end
|
14
|
+
|
15
|
+
# Specify your gem's dependencies in yotpo-api-connector.gemspec
|
16
|
+
gemspec
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Vladislav Shub
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# Yotpo
|
2
|
+
|
3
|
+
A Ruby interface to the YOTPO API
|
4
|
+
|
5
|
+
[gem]: http://rubygems.org/gems/yotpo
|
6
|
+
[travis]: http://travis-ci.org/YotpoLtd/yotpo-ruby
|
7
|
+
[gemnasium]: https://gemnasium.com/YotpoLtd/yotpo-ruby
|
8
|
+
[codeclimate]: https://codeclimate.com/github/YotpoLtd/yotpo-ruby
|
9
|
+
[coveralls]: https://coveralls.io/r/YotpoLtd/yotpo-ruby
|
10
|
+
|
11
|
+
[][gem]
|
12
|
+
[][travis]
|
13
|
+
[][gemnasium]
|
14
|
+
[][codeclimate]
|
15
|
+
[][coveralls]
|
16
|
+
|
17
|
+
## Installation
|
18
|
+
|
19
|
+
Add this line to your application's Gemfile:
|
20
|
+
|
21
|
+
gem 'yotpo'
|
22
|
+
|
23
|
+
And then execute:
|
24
|
+
|
25
|
+
$ bundle install
|
26
|
+
|
27
|
+
Or install it yourself as:
|
28
|
+
|
29
|
+
$ gem install yotpo
|
30
|
+
|
31
|
+
## Usage
|
32
|
+
|
33
|
+
First [register your application with Yotpo][register]
|
34
|
+
Then copy and past the app_key and secret
|
35
|
+
```ruby
|
36
|
+
Yotpo.configure do |config|
|
37
|
+
config.app_key = APP_KEY
|
38
|
+
config.secret = SECRET
|
39
|
+
end
|
40
|
+
```
|
41
|
+
That is it you are ready
|
42
|
+
|
43
|
+
[register]: https://www.yotpo.com/register
|
44
|
+
|
45
|
+
## Contributing
|
46
|
+
|
47
|
+
1. Fork it
|
48
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
49
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
50
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
51
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
module Yotpo
|
2
|
+
module Account
|
3
|
+
|
4
|
+
#
|
5
|
+
# Updates account at Yotpo
|
6
|
+
#
|
7
|
+
# @param params [Hash] the account basic information
|
8
|
+
# @option params [String] :minisite_website_name the name to display at the yotpo-minisite
|
9
|
+
# @option params [String] :minisite_website the website to link the minisite to
|
10
|
+
# @option params [String] :minisite_subdomain the subdomain at yotpo.me to use for this account
|
11
|
+
# @option params [String] :minisite_cname the cname that will point to the subdomain.yotpo.com
|
12
|
+
# @option params [Boolean Integer] :minisite_subdomain_active enable or disable the feature
|
13
|
+
# @option params [String] :utoken the login token of the account owner
|
14
|
+
# @option params [String] :app_key the account app key that was created at registration
|
15
|
+
def update_account(params)
|
16
|
+
request = {
|
17
|
+
account: {
|
18
|
+
minisite_website_name: params[:minisite_website_name],
|
19
|
+
minisite_website: params[:minisite_website],
|
20
|
+
minisite_subdomain: params[:minisite_subdomain],
|
21
|
+
minisite_cname: params[:minisite_cname],
|
22
|
+
minisite_subdomain_active: params[:minisite_subdomain_active]
|
23
|
+
},
|
24
|
+
utoken: params[:utoken]
|
25
|
+
}
|
26
|
+
app_key = params[:app_key]
|
27
|
+
put("/apps/#{app_key}", request)
|
28
|
+
end
|
29
|
+
|
30
|
+
#
|
31
|
+
# Check if the minisite subdomain at yotpo.me is vacant
|
32
|
+
#
|
33
|
+
# @param params [Hash]
|
34
|
+
# @option params [String] :utoken the login token of the account owner
|
35
|
+
# @option params [String] :app_key the account app key that was created at registration
|
36
|
+
# @option params [String] :subdomain the subdomain to check
|
37
|
+
def check_minisite_subdomain(params)
|
38
|
+
app_key = params[:app_key]
|
39
|
+
subdomain = params[:subdomain]
|
40
|
+
utoken = params[:utoken]
|
41
|
+
get("/apps/#{app_key}/subomain_check/#{subdomain}?utoken=#{utoken}")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Yotpo
|
2
|
+
module AccountPlatform
|
3
|
+
def create_account_platform(params)
|
4
|
+
request ={
|
5
|
+
account_platform: {
|
6
|
+
shop_token: params[:shop_token],
|
7
|
+
shop_domain: params[:shop_domain],
|
8
|
+
plan_name: params[:plan_name],
|
9
|
+
platform_type_id: params[:platform_type_id],
|
10
|
+
deleted: false
|
11
|
+
},
|
12
|
+
utoken: params[:utoken]
|
13
|
+
}
|
14
|
+
app_key = params[:app_key]
|
15
|
+
post("/apps/#{app_key}/account_platform", request)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Yotpo
|
2
|
+
module Product
|
3
|
+
def get_all_bottom_lines(params)
|
4
|
+
request = {
|
5
|
+
utoken: params[:utoken],
|
6
|
+
since_date: params[:since_date],
|
7
|
+
since_id: params[:since_id]
|
8
|
+
}
|
9
|
+
request.delete_if{|key,val| val.nil?}
|
10
|
+
app_key = params[:app_key]
|
11
|
+
get("/apps/#{app_key}/bottom_lines", request)
|
12
|
+
end
|
13
|
+
|
14
|
+
#
|
15
|
+
# Retrieves the bottom line of a product
|
16
|
+
# @param params [Hash]
|
17
|
+
# @option params [String] :app_key the accounts app key that was given to it upon registration
|
18
|
+
# @option params [String] :product_id the id of the product
|
19
|
+
def get_product_bottom_line(params)
|
20
|
+
app_key = params[:app_key]
|
21
|
+
sku = params[:product_id]
|
22
|
+
get("/products/#{app_key}/#{sku}/bottomline")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Yotpo
|
2
|
+
module Purchase
|
3
|
+
def create_new_purchase(params)
|
4
|
+
request = {
|
5
|
+
utoken: params[:utoken],
|
6
|
+
email: params[:email],
|
7
|
+
customer_name: params[:customer_name],
|
8
|
+
order_id: params[:order_id],
|
9
|
+
platform: params[:platform],
|
10
|
+
products: params[:products]
|
11
|
+
}
|
12
|
+
app_key = params[:app_key]
|
13
|
+
post("/apps/#{app_key}/purchases", request)
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_new_purchases(params)
|
17
|
+
request = {
|
18
|
+
utoken: params[:utoken],
|
19
|
+
orders: params[:orders]
|
20
|
+
}
|
21
|
+
app_key = params[:app_key]
|
22
|
+
post("/apps/#{app_key}/purchases/mass_create", request)
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_purchases(params)
|
26
|
+
request ={
|
27
|
+
utoken: params[:utoken],
|
28
|
+
since_id: params[:since_id],
|
29
|
+
since_date: params[:since_date],
|
30
|
+
page: params[:page] || 1,
|
31
|
+
count: params[:count] || 10
|
32
|
+
}
|
33
|
+
request.delete_if{|key, value| value.nil? }
|
34
|
+
app_key = params[:app_key]
|
35
|
+
get("/apps/#{app_key}/purchases", request)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
module Yotpo
|
2
|
+
module Review
|
3
|
+
|
4
|
+
# Creates a new review in Yotpo
|
5
|
+
#
|
6
|
+
# @param [Hash] params
|
7
|
+
# @option params [String] :app_key the app key of the account for which the review is created
|
8
|
+
# @option params [String] :product_id the id of the product
|
9
|
+
# @option params [String] :shop_domain the domain of the account
|
10
|
+
# @option params [String] :product_title the name of the product for which the review is created
|
11
|
+
# @option params [String] :product_description the description of the product for which the review is created
|
12
|
+
# @option params [String] :product_url the url of the product for which the review is created
|
13
|
+
# @option params [String] :product_image_url the image url of the product for which the review is created
|
14
|
+
# @option params [String] :user_display_name the author name
|
15
|
+
# @option params [String] :user_email the author email
|
16
|
+
# @option params [String] :review_body the review itself
|
17
|
+
# @option params [String] :review_title the review title
|
18
|
+
# @option params [String Integer] :review_score the rating of the review
|
19
|
+
# @option params [String] :utoken the token of the user who wrote the review (if one exists)
|
20
|
+
# @return [::Hashie::Rash] The new review with all of it's date
|
21
|
+
def create_review(params)
|
22
|
+
request = {
|
23
|
+
app_key: params[:app_key],
|
24
|
+
sku: params[:product_id],
|
25
|
+
domain: params[:shop_domain],
|
26
|
+
product_title: params[:product_title],
|
27
|
+
product_description: params[:product_description],
|
28
|
+
product_url: params[:product_url],
|
29
|
+
product_image_url: params[:product_image_url],
|
30
|
+
display_name: params[:user_display_name],
|
31
|
+
email: params[:user_email],
|
32
|
+
review_content: params[:review_body],
|
33
|
+
review_title: params[:review_title],
|
34
|
+
review_score: params[:review_score],
|
35
|
+
utoken: params[:utoken]
|
36
|
+
}
|
37
|
+
request.delete_if {|element, value| value.nil? }
|
38
|
+
get('/reviews/dynamic_create', request)
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
#
|
43
|
+
# Gets reviews of a specific product
|
44
|
+
#
|
45
|
+
# @param [Hash] params
|
46
|
+
# @option params [String] :app_key the app key of the account for which the review is created
|
47
|
+
# @option params [String] :product_id the id of the product
|
48
|
+
# @option params [Integer] :count the amount of reviews per page
|
49
|
+
# @option params [Integer] :page the page number
|
50
|
+
# @option params [String] :since_id the id from which to start retrieving reviews
|
51
|
+
# @option params [String] :since_date the date from which to start retrieving reviews
|
52
|
+
# @option params [String] :utoken the users utoken to get the reviews that are most relevant to that user
|
53
|
+
def get_product_reviews(params)
|
54
|
+
app_key = params[:app_key]
|
55
|
+
sku = params[:product_id]
|
56
|
+
request = {
|
57
|
+
page: params[:page] || 1,
|
58
|
+
count: params[:per_page] || 5,
|
59
|
+
since_date: params[:since_date],
|
60
|
+
since_id: params[:since_id],
|
61
|
+
utoken: params[:utoken]
|
62
|
+
}
|
63
|
+
request.delete_if{|key,val| val.nil? }
|
64
|
+
get("/products/#{app_key}/#{sku}/reviews", request)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Yotpo
|
2
|
+
module User
|
3
|
+
|
4
|
+
#
|
5
|
+
# Registers a new User with Yotpo
|
6
|
+
#
|
7
|
+
# @param params [Hash] the user details hash
|
8
|
+
# @option params [String] :email the email of the user
|
9
|
+
# @option params [String] :display_name the display name of the user
|
10
|
+
# @option params [String] :first_name the first name of the user
|
11
|
+
# @option params [String] :last_name the last name of the user
|
12
|
+
# @option params [String] :website_name the name of the web site that the user owns
|
13
|
+
# @option params [String] :domain the domain of the web site that the user owns
|
14
|
+
# @option params [String] :url the url of the web site that the user owns
|
15
|
+
# @option params [String] :support_url the support url at the users site
|
16
|
+
# @option params [String] :callback_url the beginning of the callback url at the users site
|
17
|
+
# @return the new account hash
|
18
|
+
def create_user(params)
|
19
|
+
user = {
|
20
|
+
email: params[:email],
|
21
|
+
display_name: params[:display_name],
|
22
|
+
first_name: params[:first_name],
|
23
|
+
last_name: params[:last_name],
|
24
|
+
website_name: params[:website_name],
|
25
|
+
password: params[:password],
|
26
|
+
support_url: params[:support_url],
|
27
|
+
callback_url: params[:callback_url],
|
28
|
+
url: params[:url]
|
29
|
+
}
|
30
|
+
post('/users', {user: user})
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# Retrieves an oauth bearer token from Yotpo
|
35
|
+
#
|
36
|
+
# @param params [Hash] the request details
|
37
|
+
# @option params [String] :client_id the app key received at the registration
|
38
|
+
# @option params [String] :client_secret app secret received at the registration
|
39
|
+
# @return [Hash] that includes access_token and the token_type
|
40
|
+
def get_oauth_token(params)
|
41
|
+
request = {
|
42
|
+
client_id: params[:app_key],
|
43
|
+
client_secret: params[:secret],
|
44
|
+
grant_type: "client_credentials"
|
45
|
+
}
|
46
|
+
|
47
|
+
response = post('/oauth/token', request)
|
48
|
+
return response
|
49
|
+
end
|
50
|
+
|
51
|
+
#
|
52
|
+
# To allow the login into www.yotpo.com using app_key and secret
|
53
|
+
# @param params [Hash] the request params
|
54
|
+
# @option params [String] :app_key that was received when registered to www.yotpo.com
|
55
|
+
# @option params [String] :secret that was received when registered to www.yotpo.com
|
56
|
+
def get_login_url(params)
|
57
|
+
request = {
|
58
|
+
app_key: params[:app_key],
|
59
|
+
secret: params[:secret]
|
60
|
+
}
|
61
|
+
get('/users/b2blogin', request)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
data/lib/yotpo/client.rb
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'active_support/notifications'
|
2
|
+
require 'faraday'
|
3
|
+
require 'typhoeus'
|
4
|
+
require 'typhoeus/adapters/faraday'
|
5
|
+
require 'faraday_middleware'
|
6
|
+
require 'yotpo/core/response_parser'
|
7
|
+
require 'yotpo/version'
|
8
|
+
require 'yotpo/api/account'
|
9
|
+
require 'yotpo/api/account_platform'
|
10
|
+
require 'yotpo/api/product'
|
11
|
+
require 'yotpo/api/purchase'
|
12
|
+
require 'yotpo/api/reminder'
|
13
|
+
require 'yotpo/api/review'
|
14
|
+
require 'yotpo/api/user'
|
15
|
+
|
16
|
+
module Yotpo
|
17
|
+
class Client
|
18
|
+
include Yotpo::Account
|
19
|
+
include Yotpo::AccountPlatform
|
20
|
+
include Yotpo::Product
|
21
|
+
include Yotpo::Reminder
|
22
|
+
include Yotpo::Review
|
23
|
+
include Yotpo::User
|
24
|
+
|
25
|
+
include Yotpo::Purchase
|
26
|
+
|
27
|
+
|
28
|
+
#
|
29
|
+
# Creates a new instance of Yotpo::Client
|
30
|
+
#
|
31
|
+
# @param url [String] The url to yotpo api (https://api.yotpo.com)
|
32
|
+
# @param parallel_requests [Integer String] The maximum parallel request to do (5)
|
33
|
+
def initialize(url = 'https://api.yotpo.com', parallel_requests = 5)
|
34
|
+
@url = url
|
35
|
+
@parallel_requests = parallel_requests
|
36
|
+
end
|
37
|
+
|
38
|
+
#
|
39
|
+
# Does a GET request to the url with the params
|
40
|
+
#
|
41
|
+
# @param url [String] the relative path in the Yotpo API
|
42
|
+
# @param params [Hash] the url params that should be passed in the request
|
43
|
+
def get(url, params = {})
|
44
|
+
preform(url, :get, params: params) do
|
45
|
+
return connection.get(url, params)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
# Does a POST request to the url with the params
|
51
|
+
#
|
52
|
+
# @param url [String] the relative path in the Yotpo API
|
53
|
+
# @param params [Hash] the body of the request
|
54
|
+
def post(url, params)
|
55
|
+
preform(url, :post, params: params) do
|
56
|
+
return connection.post(url, params)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
#
|
61
|
+
# Does a PUT request to the url with the params
|
62
|
+
#
|
63
|
+
# @param url [String] the relative path in the Yotpo API
|
64
|
+
# @param params [Hash] the body of the request
|
65
|
+
def put(url, params)
|
66
|
+
preform(url, :put, params: params) do
|
67
|
+
return connection.put(url, params)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
#
|
72
|
+
# Does a DELETE request to the url with the params
|
73
|
+
#
|
74
|
+
# @param url [String] the relative path in the Yotpo API
|
75
|
+
def delete(url)
|
76
|
+
preform(url, :delete) do
|
77
|
+
return connection.delete(url)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
#
|
82
|
+
# Does a parallel request to the api for all of the requests in the block
|
83
|
+
#
|
84
|
+
# @example block
|
85
|
+
# Yotpo.in_parallel do
|
86
|
+
# Yotpo.create_review(review_params)
|
87
|
+
# Yotpo.update_account(account_params)
|
88
|
+
# end
|
89
|
+
def in_parallel
|
90
|
+
connection.in_parallel do
|
91
|
+
yield
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
private
|
96
|
+
|
97
|
+
#
|
98
|
+
# Preforms an HTTP request and notifies the ActiveSupport::Notifications
|
99
|
+
#
|
100
|
+
# @private
|
101
|
+
# @param url [String] the url to which preform the request
|
102
|
+
# @param type [String]
|
103
|
+
def preform(url, type, params = {}, &block)
|
104
|
+
ActiveSupport::Notifications.instrument 'Yotpo', request: type, url: url, params: params do
|
105
|
+
if connection.in_parallel?
|
106
|
+
block.call
|
107
|
+
else
|
108
|
+
block.call.body
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
#
|
114
|
+
# @return an instance of Faraday initialized with all that this gem needs
|
115
|
+
def connection
|
116
|
+
@connection ||= Faraday.new(url: @url, parallel_manager: Typhoeus::Hydra.new(max_concurrency: @parallel_requests), headers: {:yotpo_api_connector => Yotpo::VERSION}) do |conn|
|
117
|
+
|
118
|
+
conn.use Yotpo::ResponseParser
|
119
|
+
|
120
|
+
# Set the response to be rashified
|
121
|
+
conn.response :rashify
|
122
|
+
|
123
|
+
# Setting request and response to use JSON/XML
|
124
|
+
conn.request :oj
|
125
|
+
conn.response :oj
|
126
|
+
|
127
|
+
# Set to use instrumentals to get time logs
|
128
|
+
conn.use :instrumentation
|
129
|
+
|
130
|
+
conn.adapter :typhoeus
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'typhoeus/adapters/faraday'
|
2
|
+
require 'faraday_middleware/response_middleware'
|
3
|
+
|
4
|
+
module Yotpo
|
5
|
+
class ResponseParser < Faraday::Response::Middleware
|
6
|
+
def call(env)
|
7
|
+
# "env" contains the request
|
8
|
+
@app.call(env).on_complete do
|
9
|
+
body = false
|
10
|
+
if env[:status] == 200
|
11
|
+
body = env[:response].body.response || env[:response].body
|
12
|
+
elsif env[:response] && env[:response].body && env[:response].body.status
|
13
|
+
body = env[:response].body.status
|
14
|
+
end
|
15
|
+
env[:body] = body
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
#
|
21
|
+
# Response middleware that decodes the response body from JSON.
|
22
|
+
#
|
23
|
+
class ParseOj < FaradayMiddleware::ResponseMiddleware
|
24
|
+
dependency do
|
25
|
+
require 'oj' unless defined?(::Oj)
|
26
|
+
end
|
27
|
+
|
28
|
+
define_parser do |body|
|
29
|
+
::Oj.load(body, mode: :compat) unless body.strip.empty?
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# Request middleware that encodes the body as JSON.
|
34
|
+
#
|
35
|
+
# Processes only requests with matching Content-type or those without a type.
|
36
|
+
# If a request doesn't have a type but has a body, it sets the Content-type
|
37
|
+
# to JSON MIME-type.
|
38
|
+
#
|
39
|
+
# Doesn't try to encode bodies that already are in string form.
|
40
|
+
class EncodeOj < Faraday::Middleware
|
41
|
+
CONTENT_TYPE = 'Content-Type'.freeze
|
42
|
+
MIME_TYPE = 'application/json'.freeze
|
43
|
+
|
44
|
+
dependency do
|
45
|
+
require 'oj' unless defined?(::Oj)
|
46
|
+
end
|
47
|
+
|
48
|
+
def call(env)
|
49
|
+
match_content_type(env) do |data|
|
50
|
+
env[:body] = encode data
|
51
|
+
end
|
52
|
+
@app.call env
|
53
|
+
end
|
54
|
+
|
55
|
+
def encode(data)
|
56
|
+
::Oj.dump data
|
57
|
+
end
|
58
|
+
|
59
|
+
def match_content_type(env)
|
60
|
+
if process_request?(env)
|
61
|
+
env[:request_headers][CONTENT_TYPE] ||= MIME_TYPE
|
62
|
+
yield env[:body] unless env[:body].respond_to?(:to_str)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def process_request?(env)
|
67
|
+
type = request_type(env)
|
68
|
+
has_body?(env) and (type.empty? or type == MIME_TYPE)
|
69
|
+
end
|
70
|
+
|
71
|
+
def has_body?(env)
|
72
|
+
body = env[:body] and !(body.respond_to?(:to_str) and body.empty?)
|
73
|
+
end
|
74
|
+
|
75
|
+
def request_type(env)
|
76
|
+
type = env[:request_headers][CONTENT_TYPE].to_s
|
77
|
+
type = type.split(';', 2).first if type.index(';')
|
78
|
+
type
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
Faraday.register_middleware :response, oj: Yotpo::ParseOj
|
84
|
+
Faraday.register_middleware :request, oj: Yotpo::EncodeOj
|