insales_api 0.0.13 → 0.1.0
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 +4 -4
- data/.travis.yml +6 -0
- data/CHANGELOG.md +20 -0
- data/Gemfile +1 -1
- data/README.md +57 -0
- data/Rakefile +8 -1
- data/insales_api.gemspec +12 -12
- data/lib/insales/controller/autologin.rb +45 -0
- data/lib/insales/controller/base_helpers.rb +52 -0
- data/lib/insales/controller/installer_actions.rb +19 -0
- data/lib/insales/controller/session_actions.rb +39 -0
- data/lib/insales/controller.rb +10 -0
- data/lib/insales.rb +7 -0
- data/lib/insales_api/account.rb +1 -9
- data/lib/insales_api/active_resource_proxy.rb +31 -0
- data/lib/insales_api/app.rb +57 -38
- data/lib/insales_api/application_charge.rb +3 -0
- data/lib/insales_api/asset.rb +3 -1
- data/lib/insales_api/base.rb +41 -5
- data/lib/insales_api/category.rb +8 -2
- data/lib/insales_api/client.rb +3 -1
- data/lib/insales_api/client_group.rb +3 -0
- data/lib/insales_api/collect.rb +8 -2
- data/lib/insales_api/discount_code.rb +3 -0
- data/lib/insales_api/helpers/has_insales_object.rb +34 -0
- data/lib/insales_api/helpers/init_api.rb +98 -0
- data/lib/insales_api/image.rb +5 -0
- data/lib/insales_api/order.rb +13 -5
- data/lib/insales_api/order_line.rb +2 -2
- data/lib/insales_api/product.rb +3 -1
- data/lib/insales_api/product_field.rb +3 -0
- data/lib/insales_api/product_field_value.rb +22 -0
- data/lib/insales_api/property.rb +3 -0
- data/lib/insales_api/resource/countable.rb +9 -0
- data/lib/insales_api/resource/paginated.rb +26 -0
- data/lib/insales_api/resource/with_updated_since.rb +28 -0
- data/lib/insales_api/theme.rb +7 -1
- data/lib/insales_api/variant.rb +18 -6
- data/lib/insales_api/version.rb +7 -1
- data/lib/insales_api.rb +74 -17
- data/spec/lib/insales_api/active_resource_proxy_spec.rb +59 -0
- data/spec/lib/insales_api/app_spec.rb +67 -0
- data/spec/lib/insales_api_spec.rb +110 -0
- data/spec/spec_helper.rb +3 -4
- metadata +54 -20
- data/README +0 -32
- data/spec/lib/insales_app_spec.rb +0 -63
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0874e0c3d9d031bd7c44623652e9f8d0118bbca1
|
4
|
+
data.tar.gz: d8f445c2fd2f722d03368b0cef92430f4bb338b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 106dfba38c2704be7e63243f6493d441d440a200dc9f6a39454e21ea40c765cf16d5859f8103f5305786445ced8a42014603dbd1a43c56dc67adf8bea23bdc82
|
7
|
+
data.tar.gz: de95a094d63c5e09583943e56296f3d66f2a91e37246538afb499e7aae6252a832044acb8eaf74fa16a9c97dd163752bf5862c050af4dad5bc37ec03e1b9d5ed
|
data/.travis.yml
ADDED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
## 0.1.0
|
2
|
+
|
3
|
+
* Helpers
|
4
|
+
* ProductFieldValue
|
5
|
+
* Controller auth mixins
|
6
|
+
* Account inherits AR::Singleton (it breaks ::current & #update methods)
|
7
|
+
* Added wait_retry method
|
8
|
+
* Added Property resource
|
9
|
+
* Added ProductField resource
|
10
|
+
* Added ClientGroup resource
|
11
|
+
|
12
|
+
## 0.0.14
|
13
|
+
|
14
|
+
* Added Image resource
|
15
|
+
* Fixed Variant.group_update
|
16
|
+
* Added DiscountCode resource
|
17
|
+
* Added Product.count method
|
18
|
+
* Added Order.paid? method
|
19
|
+
* Added ApplicationCharge resource
|
20
|
+
|
1
21
|
## 0.0.13
|
2
22
|
|
3
23
|
* ActiveResource::Singleton backport.
|
data/Gemfile
CHANGED
data/README.md
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
# InsalesApi gem
|
2
|
+
|
3
|
+
[](http://travis-ci.org/insales/insales_api)
|
4
|
+
|
5
|
+
Insales api client based on [ActiveResource](https://github.com/rails/activeresource).
|
6
|
+
|
7
|
+
Rails application example is [here](https://github.com/insales/insales_app).
|
8
|
+
|
9
|
+
## Install
|
10
|
+
|
11
|
+
Add to Gemfile:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
gem 'insales_api'
|
15
|
+
```
|
16
|
+
|
17
|
+
## Initialize
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
class MyApp < InsalesApi::App
|
21
|
+
self.api_key = 'api_key'
|
22
|
+
end
|
23
|
+
|
24
|
+
MyApp.configure_api('domain', 'password')
|
25
|
+
```
|
26
|
+
|
27
|
+
## Use
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
order = InsalesApi::Order.find 123
|
31
|
+
|
32
|
+
# singleton resources
|
33
|
+
account = InsalesApi::Account.find
|
34
|
+
```
|
35
|
+
|
36
|
+
### Handling Insales API request limit
|
37
|
+
|
38
|
+
There is a 500 requests per 5 minutes limit for Insales API. To handle this limitation gracefully, use `InsalesApi.wait_retry` method:
|
39
|
+
```ruby
|
40
|
+
# prepare a handler for request limit case
|
41
|
+
notify_user = Proc.new do |wait_for, attempt, max_attempts, ex|
|
42
|
+
puts "API limit reached. Waiting for #{wait_for} seconds. Attempt #{attempt}/#{max_attempts}"
|
43
|
+
end
|
44
|
+
|
45
|
+
# perform 10 attempts to get products
|
46
|
+
InsalesApi.wait_retry(10, notify_user) do |x|
|
47
|
+
puts "Attempt ##{x}."
|
48
|
+
products = InsalesApi::Products.all
|
49
|
+
end
|
50
|
+
```
|
51
|
+
|
52
|
+
If you don't need to cap the attempts number or you don't want to do any special processing, simply drop the arguments:
|
53
|
+
```ruby
|
54
|
+
InsalesApi.wait_retry do
|
55
|
+
products = InsalesApi::Products.all # will try to get products until the limit resets
|
56
|
+
end
|
57
|
+
```
|
data/Rakefile
CHANGED
data/insales_api.gemspec
CHANGED
@@ -1,23 +1,23 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require "insales_api/version"
|
1
|
+
$:.push File.expand_path('../lib', __FILE__)
|
2
|
+
require 'insales_api/version'
|
4
3
|
|
5
4
|
Gem::Specification.new do |s|
|
6
|
-
s.name =
|
7
|
-
s.version = InsalesApi::VERSION
|
8
|
-
s.authors =
|
9
|
-
s.email =
|
10
|
-
s.homepage =
|
5
|
+
s.name = 'insales_api'
|
6
|
+
s.version = InsalesApi::VERSION::STRING
|
7
|
+
s.authors = 'InSales'
|
8
|
+
s.email = 'dg@insales.ru'
|
9
|
+
s.homepage = 'https://github.com/insales/insales_api'
|
11
10
|
s.summary = %q{Gem for accessing the InSales REST web services}
|
12
11
|
s.description = %q{Gem for accessing the InSales REST web services}
|
13
12
|
|
14
|
-
s.rubyforge_project =
|
13
|
+
s.rubyforge_project = 'insales_api'
|
15
14
|
|
16
15
|
s.files = `git ls-files`.split("\n")
|
17
16
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
17
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
18
|
|
20
|
-
s.add_dependency(
|
21
|
-
s.add_dependency(
|
22
|
-
s.add_development_dependency
|
19
|
+
s.add_dependency('activesupport', ['>= 3.0.0'])
|
20
|
+
s.add_dependency('activeresource', ['>= 3.0.0'])
|
21
|
+
s.add_development_dependency 'rspec', '~> 2.13.0'
|
22
|
+
s.add_development_dependency 'rake', '~> 10.3'
|
23
23
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Insales::Controller
|
2
|
+
module Autologin
|
3
|
+
protected
|
4
|
+
def insales_authenticate!
|
5
|
+
params[:domain] ||= params[:shop]
|
6
|
+
insales_logout if params[:domain].present? && params[:domain] != session[:domain]
|
7
|
+
return if insales_authenticate_from_session
|
8
|
+
store_location
|
9
|
+
account = find_account_by_request
|
10
|
+
return insales_autologin_start(account) if account
|
11
|
+
redirect_to insales_login_path
|
12
|
+
end
|
13
|
+
|
14
|
+
def insales_authenticate_from_session
|
15
|
+
data = session[:insales_session]
|
16
|
+
return unless data && data[:account_id] && data[:insales_id]
|
17
|
+
@account = account_class.where(account_id: data[:account_id]).
|
18
|
+
find_by_insales_id(data[:insales_id])
|
19
|
+
end
|
20
|
+
|
21
|
+
def insales_autologin_start(account)
|
22
|
+
app = insales_app_class.new(account.insales_domain, account.insales_password)
|
23
|
+
auth_url = app.authorization_url
|
24
|
+
session[:insales_token] = app.auth_token
|
25
|
+
session[:insales_token_data] = {
|
26
|
+
domain: account.insales_domain,
|
27
|
+
account_id: account.id,
|
28
|
+
insales_id: account.insales_id,
|
29
|
+
}
|
30
|
+
redirect_to auth_url
|
31
|
+
end
|
32
|
+
|
33
|
+
def insales_autologin_finish(token = params[:token])
|
34
|
+
if token && session[:insales_token] == token && session[:insales_token_data].is_a?(Hash)
|
35
|
+
session[:insales_session] = session[:insales_token_data]
|
36
|
+
end
|
37
|
+
session[:insales_token] = session[:insales_token_data] = nil
|
38
|
+
session[:account_id].present?
|
39
|
+
end
|
40
|
+
|
41
|
+
def insales_logout
|
42
|
+
session.delete(:insales_session)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Insales::Controller
|
2
|
+
module BaseHelpers
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
class_attribute :insales_config
|
7
|
+
self.insales_config = {
|
8
|
+
account_class: '::Account',
|
9
|
+
insales_app_class: '::InsalesApi::App',
|
10
|
+
login_path: 'login_path',
|
11
|
+
success_login_path: 'account_path',
|
12
|
+
}
|
13
|
+
|
14
|
+
def account_class
|
15
|
+
@account_class ||= insales_config[:account_class].constantize
|
16
|
+
end
|
17
|
+
|
18
|
+
def insales_app_class
|
19
|
+
@insales_app_class ||= insales_config[:insales_app_class].constantize
|
20
|
+
end
|
21
|
+
|
22
|
+
def insales_login_path
|
23
|
+
send(insales_config[:login_path])
|
24
|
+
end
|
25
|
+
|
26
|
+
def insales_success_login_path
|
27
|
+
send(insales_config[:success_login_path])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
protected
|
32
|
+
delegate :insales_app_class, :account_class,
|
33
|
+
:insales_login_path, :insales_success_login_path,
|
34
|
+
to: :class
|
35
|
+
|
36
|
+
def store_location(path = request.url)
|
37
|
+
session[:return_to] = path
|
38
|
+
end
|
39
|
+
|
40
|
+
def stored_location
|
41
|
+
session.delete(:return_to)
|
42
|
+
end
|
43
|
+
|
44
|
+
def find_account_by_request
|
45
|
+
if params[:insales_id]
|
46
|
+
account_class.find_by_insales_id(params[:insales_id])
|
47
|
+
elsif params[:domain]
|
48
|
+
account_class.find_by_insales_domain(params[:domain])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Insales::Controller
|
2
|
+
module InstallerActions
|
3
|
+
def install
|
4
|
+
if insales_app_class.install(params[:shop], params[:token], params[:insales_id])
|
5
|
+
head :ok
|
6
|
+
else
|
7
|
+
raise 'Instalation failed'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def uninstall
|
12
|
+
if insales_app_class.uninstall(params[:shop], params[:token])
|
13
|
+
head :ok
|
14
|
+
else
|
15
|
+
raise 'Uninstallation failed'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Insales::Controller
|
2
|
+
module SessionActions
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
skip_before_filter :insales_authenticate!, except: [:destroy]
|
7
|
+
end
|
8
|
+
|
9
|
+
def new
|
10
|
+
# render
|
11
|
+
end
|
12
|
+
|
13
|
+
def create
|
14
|
+
account = find_account_by_request
|
15
|
+
return render_not_found unless account
|
16
|
+
store_location(insales_success_login_path)
|
17
|
+
insales_autologin_start(account)
|
18
|
+
end
|
19
|
+
|
20
|
+
def autologin
|
21
|
+
if insales_autologin_finish
|
22
|
+
redirect_to stored_location || insales_success_login_path
|
23
|
+
else
|
24
|
+
redirect_to action: :new
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def destroy
|
29
|
+
insales_logout
|
30
|
+
redirect_to action: :new
|
31
|
+
end
|
32
|
+
|
33
|
+
protected
|
34
|
+
def render_not_found
|
35
|
+
flash.now[:error] = t(:'.account_not_found').html_safe
|
36
|
+
render action: :new
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/insales.rb
ADDED
data/lib/insales_api/account.rb
CHANGED
@@ -1,13 +1,5 @@
|
|
1
1
|
module InsalesApi
|
2
2
|
class Account < Base
|
3
|
-
|
4
|
-
find(:one, :from => '/admin/account.xml')
|
5
|
-
end
|
6
|
-
|
7
|
-
def update
|
8
|
-
connection.put('/admin/account.xml', encode, self.class.headers).tap do |response|
|
9
|
-
load_attributes_from_response(response)
|
10
|
-
end
|
11
|
-
end
|
3
|
+
include ActiveResource::Singleton
|
12
4
|
end
|
13
5
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module InsalesApi
|
2
|
+
class ActiveResourceProxy
|
3
|
+
class << self
|
4
|
+
def need_proxy?(value)
|
5
|
+
return true if value.is_a?(Hash) || value.is_a?(Array)
|
6
|
+
klass = value.is_a?(Class) ? value : value.class
|
7
|
+
return true if klass < Base || klass <= ActiveResource::Collection
|
8
|
+
false
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(configurer, subject)
|
13
|
+
@configurer = configurer
|
14
|
+
@subject = subject
|
15
|
+
end
|
16
|
+
|
17
|
+
def respond_to_missing?(method_name)
|
18
|
+
@subject.respond_to?(method_name) || super
|
19
|
+
end
|
20
|
+
|
21
|
+
def method_missing(method_id, *args, &block)
|
22
|
+
@configurer.init_api { proxy_for @subject.send(method_id, *args, &block) }
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
def proxy_for(value)
|
27
|
+
return value unless self.class.need_proxy?(value)
|
28
|
+
self.class.new(@configurer, value)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
data/lib/insales_api/app.rb
CHANGED
@@ -1,35 +1,72 @@
|
|
1
1
|
module InsalesApi
|
2
2
|
class App
|
3
|
-
class_attribute :api_key, :
|
4
|
-
|
3
|
+
class_attribute :api_key, :api_secret, :api_autologin_url, :api_host, :api_autologin_path,
|
4
|
+
:base_resource_class
|
5
|
+
attr_reader :authorized, :domain, :password
|
6
|
+
self.base_resource_class = Base
|
5
7
|
|
6
|
-
|
8
|
+
class << self
|
9
|
+
def configure_api(domain, password)
|
10
|
+
base_resource_class.configure(api_key, domain, password)
|
11
|
+
end
|
12
|
+
|
13
|
+
delegate :dump_config, :restore_config, to: :base_resource_class
|
14
|
+
|
15
|
+
def prepare_domain(domain)
|
16
|
+
domain.to_s.strip.downcase
|
17
|
+
end
|
18
|
+
|
19
|
+
alias_method :prepare_shop, :prepare_domain
|
20
|
+
deprecate prepare_shop: :prepare_domain,
|
21
|
+
api_host: :api_autologin_url,
|
22
|
+
api_autologin_path: :api_autologin_url,
|
23
|
+
deprecator: Deprecator
|
24
|
+
|
25
|
+
def install(domain, token, insales_id)
|
26
|
+
true
|
27
|
+
end
|
28
|
+
|
29
|
+
def uninstall(domain, password)
|
30
|
+
true
|
31
|
+
end
|
32
|
+
|
33
|
+
def password_by_token(token)
|
34
|
+
InsalesApi::Password.create(api_secret, token)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def initialize(domain, password)
|
7
39
|
@authorized = false
|
8
|
-
@
|
40
|
+
@domain = self.class.prepare_domain(domain)
|
9
41
|
@password = password
|
10
42
|
end
|
11
43
|
|
12
44
|
def authorization_url
|
13
|
-
|
14
|
-
|
15
|
-
|
45
|
+
host, port = domain, nil
|
46
|
+
match = /(.+):(\d+)/.match host
|
47
|
+
host, port = match[1..2] if match
|
48
|
+
URI::Generic.build(
|
49
|
+
scheme: 'http',
|
50
|
+
host: host,
|
51
|
+
port: port && port.to_i,
|
52
|
+
path: "/admin/applications/#{api_key}/login",
|
53
|
+
query: {
|
54
|
+
token: salt,
|
55
|
+
login: api_autologin_url || "http://#{api_host}/#{api_autologin_path}",
|
56
|
+
}.to_query,
|
57
|
+
).to_s
|
16
58
|
end
|
17
59
|
|
18
|
-
def
|
60
|
+
def auth_token
|
19
61
|
@auth_token ||= InsalesApi::Password.create(password, salt)
|
20
62
|
end
|
21
63
|
|
22
64
|
def salt
|
23
|
-
@salt ||=
|
65
|
+
@salt ||= SecureRandom.hex
|
24
66
|
end
|
25
67
|
|
26
|
-
def authorize
|
27
|
-
@authorized =
|
28
|
-
if self.auth_token and self.auth_token == token
|
29
|
-
@authorized = true
|
30
|
-
end
|
31
|
-
|
32
|
-
@authorized
|
68
|
+
def authorize(token)
|
69
|
+
@authorized = auth_token == token
|
33
70
|
end
|
34
71
|
|
35
72
|
def authorized?
|
@@ -37,29 +74,11 @@ module InsalesApi
|
|
37
74
|
end
|
38
75
|
|
39
76
|
def configure_api
|
40
|
-
self.class.configure_api
|
77
|
+
self.class.configure_api(domain, password)
|
41
78
|
end
|
42
79
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
end
|
47
|
-
|
48
|
-
def prepare_shop shop
|
49
|
-
shop.to_s.strip.downcase
|
50
|
-
end
|
51
|
-
|
52
|
-
def install shop, token, insales_id
|
53
|
-
true
|
54
|
-
end
|
55
|
-
|
56
|
-
def uninstall shop, password
|
57
|
-
true
|
58
|
-
end
|
59
|
-
|
60
|
-
def password_by_token token
|
61
|
-
InsalesApi::Password.create(api_secret, token)
|
62
|
-
end
|
63
|
-
end
|
80
|
+
alias_method :store_auth_token, :auth_token
|
81
|
+
alias_method :shop, :domain
|
82
|
+
deprecate store_auth_token: :auth_token, shop: :domain, deprecator: Deprecator
|
64
83
|
end
|
65
84
|
end
|
data/lib/insales_api/asset.rb
CHANGED
data/lib/insales_api/base.rb
CHANGED
@@ -1,12 +1,48 @@
|
|
1
|
+
require 'insales_api/resource/countable'
|
2
|
+
require 'insales_api/resource/paginated'
|
3
|
+
require 'insales_api/resource/with_updated_since'
|
4
|
+
require 'insales_api/active_resource_proxy'
|
5
|
+
|
1
6
|
module InsalesApi
|
2
7
|
class Base < ActiveResource::Base
|
8
|
+
extend Resource::Countable
|
9
|
+
extend Resource::Paginated
|
10
|
+
|
11
|
+
self.include_root_in_json = false
|
12
|
+
self.headers['User-Agent'] = %W(
|
13
|
+
InsalesApi/#{InsalesApi::VERSION}
|
14
|
+
ActiveResource/#{ActiveResource::VERSION::STRING}
|
15
|
+
Ruby/#{RUBY_VERSION}
|
16
|
+
).join(' ')
|
3
17
|
self.format = :xml
|
18
|
+
self.prefix = '/admin/'
|
19
|
+
|
20
|
+
class << self
|
21
|
+
def configure(api_key, domain, password)
|
22
|
+
self.user = api_key
|
23
|
+
self.site = "http://#{domain}"
|
24
|
+
self.password = password
|
25
|
+
self
|
26
|
+
end
|
27
|
+
|
28
|
+
def dump_config
|
29
|
+
{
|
30
|
+
user: self.user,
|
31
|
+
site: self.site,
|
32
|
+
password: self.password,
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
def restore_config(options)
|
37
|
+
self.user = options[:user]
|
38
|
+
self.site = options[:site]
|
39
|
+
self.password = options[:password]
|
40
|
+
true
|
41
|
+
end
|
4
42
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
self.password = password
|
9
|
-
nil
|
43
|
+
def for_account(account)
|
44
|
+
ActiveResourceProxy.new(account, self)
|
45
|
+
end
|
10
46
|
end
|
11
47
|
end
|
12
48
|
end
|
data/lib/insales_api/category.rb
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
module InsalesApi
|
2
2
|
class Category < Base
|
3
|
-
|
4
|
-
|
3
|
+
class << self
|
4
|
+
def set_products_category(new_category_id, product_ids)
|
5
|
+
data = {
|
6
|
+
id: new_category_id,
|
7
|
+
product_ids: Array(product_ids),
|
8
|
+
}
|
9
|
+
put(:set_products_category, {}, format.encode(data, root: :new_category))
|
10
|
+
end
|
5
11
|
end
|
6
12
|
end
|
7
13
|
end
|
data/lib/insales_api/client.rb
CHANGED
data/lib/insales_api/collect.rb
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
module InsalesApi
|
2
2
|
class Collect < Base
|
3
|
-
|
4
|
-
|
3
|
+
class << self
|
4
|
+
def group_create(product_ids, collection_ids)
|
5
|
+
data = {
|
6
|
+
collection_ids: Array(collection_ids),
|
7
|
+
product_ids: Array(product_ids),
|
8
|
+
}
|
9
|
+
post(:group_create, {}, format.encode(data, root: :group_create))
|
10
|
+
end
|
5
11
|
end
|
6
12
|
end
|
7
13
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module InsalesApi::Helpers
|
2
|
+
module HasInsalesObject
|
3
|
+
def has_insales_object(type, options = {})
|
4
|
+
i_method_name = "insales_#{type}"
|
5
|
+
class_method_name = "insales_#{type}_class"
|
6
|
+
object_class = options[:class] || InsalesApi.const_get(type.to_s.camelcase)
|
7
|
+
helpers = Module.new do
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
module_eval <<-RUBY, __FILE__, __LINE__ + 1
|
11
|
+
included do # included do
|
12
|
+
class_attribute :#{class_method_name} # class_attribute :insales_order_class
|
13
|
+
self.#{class_method_name} = #{object_class} # self.insales_order_class = InsalesApi::Order
|
14
|
+
end # end
|
15
|
+
#
|
16
|
+
def #{i_method_name}(force = false) # def insales_order(force = false)
|
17
|
+
return @#{i_method_name} if @#{i_method_name} && !force # return @insales_order if @insales_order && !force
|
18
|
+
@#{i_method_name} = init_api do # @insales_order = init_api do
|
19
|
+
#{class_method_name}.find(insales_id) # insales_order_class.find(insales_id)
|
20
|
+
end # end
|
21
|
+
end # end
|
22
|
+
#
|
23
|
+
attr_writer :#{i_method_name} # attr_writer :insales_order
|
24
|
+
#
|
25
|
+
def reload(*) # def reload(*)
|
26
|
+
@#{i_method_name} = nil # @insales_order = nil
|
27
|
+
super # super
|
28
|
+
end # end
|
29
|
+
RUBY
|
30
|
+
end
|
31
|
+
include helpers
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|