magento 0.0.3 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 450a1aaf20e266f101c4a2a0ef107f7d387fe8ae027d9e0751c067831292c078
4
- data.tar.gz: f9700bb931f9128db95c5b3dca904542877512de782e7d50eafd9edf66d9f484
3
+ metadata.gz: 02761b4b3a2e3b5da2082816534436f4f007f5f657b32400483bfd36d02f610b
4
+ data.tar.gz: 98e66dfd540d759b3e024de58bc43575b1c3437864584c4797d27391e5ec279e
5
5
  SHA512:
6
- metadata.gz: 91a4c5bf18c518c9604195363204955eeb8ede7e78c3c803ecf74db06e0bacd66fe04a99c34e09ceda21739e06e6780fc8da4d59ed0b97a8992ff2827260c34f
7
- data.tar.gz: c9d725e344e94ed1874b0ded891a97f59544aa27a54995a9bead0d64ca3c7cac7fa8f2f1ccee98b7ebda0d75538d1e9589f961cda459229740d0116a15116b19
6
+ metadata.gz: 9523a813be0fc77cc4fea9a751b639994a1a8e03869326ae967b9b98bcee93edcdc03f81abae60110514a5833fc5d123d91c634af5bd149d7ff586e732b77db9
7
+ data.tar.gz: 40bba87521d8624056cee96a8832a6dfcaf99353c9c69038684e8bf7d29cd7d9883fd97330eb45e646a438415bb533934cbccca6847770e41255b38d4c237ebb
data/.gitignore CHANGED
@@ -23,4 +23,6 @@ _yardoc
23
23
  doc/
24
24
  test/vcr_cassettes
25
25
 
26
- .vscode
26
+ .vscode
27
+ .byebug_history
28
+ /*test.rb
data/README.md CHANGED
@@ -1,85 +1,184 @@
1
- # Magento Ruby library
2
-
3
- ## Install
4
-
5
- ```rb
6
- gem 'magento', '~> 0.0.2'
7
- ```
8
-
9
- or
10
-
11
- ```sh
12
- gem install 'magento'
13
- ```
14
-
15
- ### Setup
16
-
17
- ```rb
18
- Magento.url = 'https://yourstore.com'
19
- Magento.token = 'MAGENTO_API_KEY'
20
- ```
21
-
22
- ## Product
23
-
24
- ### Get product details by sku
25
-
26
- ```rb
27
- Magento::Product.find_by_sku('sku-test')
28
- ```
29
-
30
- # TODO
31
- ### Get product list
32
-
33
- Get all
34
- ```rb
35
- Magento::Product.all()
36
- ```
37
-
38
- Set page and quantity per page
39
- ```rb
40
- Magento::Product.all(page: 1, page_size: 25) # Default page size is 50
41
- ```
42
-
43
- Filter list by attribute
44
- ```rb
45
- Magento::Product.all(name_like: 'IPhone%')
46
-
47
- Magento::Product.all(price_gt: 100, page: 2)
48
- ```
49
-
50
- ### Search products
51
- ```rb
52
- Magento::Product.search('tshort')
53
- ```
54
-
55
- ## Order
56
-
57
- ### Create Order as admin user
58
-
59
- See the [documentation](https://magento.redoc.ly/2.4-admin/#operation/salesOrderRepositoryV1SavePost) to all attributes
60
-
61
- ```rb
62
- Magento::Order.create(
63
- customer_firstname: '',
64
- customer_lastname: '',
65
- customer_email: '',
66
- # others attrbutes ...,
67
- items: [
68
- {
69
- sku: '',
70
- price: '',
71
- qty_ordered: 1,
72
- # others attrbutes ...,
73
- }
74
- ],
75
- billing_address: {
76
- # attrbutes...
77
- },
78
- payment: {
79
- # attrbutes...
80
- },
81
- extension_attributes: {
82
- # attrbutes...
83
- }
84
- )
85
- ```
1
+ # Magento Ruby library
2
+
3
+ ## Install
4
+
5
+ Add in your Gemfile
6
+
7
+ ```rb
8
+ gem 'magento', '~> 0.3.2'
9
+ ```
10
+
11
+ or run
12
+
13
+ ```sh
14
+ gem install magento
15
+ ```
16
+
17
+ ### Setup
18
+
19
+ ```rb
20
+ Magento.url = 'https://yourstore.com'
21
+ Magento.token = 'MAGENTO_API_KEY'
22
+ Magento.store = :default # optional, Default is :all
23
+ ```
24
+
25
+ ## Models
26
+ ```rb
27
+ Magento::Product
28
+ Magento::Order
29
+ Magento::Country
30
+ Magento::Category
31
+ ```
32
+
33
+ ## Get details
34
+
35
+ ```rb
36
+ Magento::Product.find('sku-test')
37
+ Magento::Order.find(25)
38
+ Magento::Country.find('BR')
39
+ ```
40
+ \* _same pattern to all models_
41
+
42
+ **Outside pattern**
43
+
44
+ Get customer by token
45
+
46
+ ```rb
47
+ Magento::Customer.find_by_token('user_token')
48
+ ```
49
+
50
+ ## Get List
51
+
52
+ ```rb
53
+ Magento::Product.all
54
+ ```
55
+
56
+ #### Select fields:
57
+ ```rb
58
+ Magento::Product.select(:id, :sku, :name).all
59
+ Magento::Product.select(:id, :sku, :name, extension_attributes: :category_links).all
60
+ Magento::Product.select(:id, :sku, :name, extension_attributes: [:category_links, :website_ids]).all
61
+ Magento::Product.select(:id, :sku, :name, extension_attributes: [:website_ids, { category_links: :category_id }]).all
62
+ ```
63
+
64
+ #### Filters:
65
+
66
+ ```rb
67
+ Magento::Product.where(name_like: 'IPhone%').all
68
+ Magento::Product.where(price_gt: 100).all
69
+
70
+ # price > 10 AND price < 20
71
+ Magento::Product.where(price_gt: 10)
72
+ .where(price_lt: 20).all
73
+
74
+ # price < 1 OR price > 100
75
+ Magento::Product.where(price_lt: 1, price_gt: 100).all
76
+
77
+ Magento::Order.where(status_in: [:canceled, :complete]).all
78
+ ```
79
+
80
+ | Condition | Notes |
81
+ | --------- | ----- |
82
+ |eq | Equals. |
83
+ |finset | A value within a set of values |
84
+ |from | The beginning of a range. Must be used with to |
85
+ |gt | Greater than |
86
+ |gteq | Greater than or equal |
87
+ |in | In. The value is an array |
88
+ |like | Like. The value can contain the SQL wildcard characters when like is specified. |
89
+ |lt | Less than |
90
+ |lteq | Less than or equal |
91
+ |moreq | More or equal |
92
+ |neq | Not equal |
93
+ |nfinset | A value that is not within a set of values |
94
+ |nin | Not in. The value is an array |
95
+ |notnull | Not null |
96
+ |null | Null |
97
+ |to | The end of a range. Must be used with from |
98
+
99
+
100
+ #### SortOrder:
101
+
102
+ ```rb
103
+ Magento::Product.order(:sku).all
104
+ Magento::Product.order(sku: :desc).all
105
+ Magento::Product.order(status: :desc, name: :asc).all
106
+ ```
107
+
108
+ #### Pagination:
109
+
110
+ ```rb
111
+ # Set page and quantity per page
112
+ Magento::Product.page(1).per(25) # Default per is 50
113
+ ```
114
+
115
+ #### Example of several options together:
116
+ ```rb
117
+ Magento::Product.select(:sku, :name, :price)
118
+ .where(name_like: 'Tshort%')
119
+ .order(price: :desc)
120
+ .per(10)
121
+ .all
122
+ ```
123
+
124
+ \* _same pattern to all models_
125
+ ___
126
+ ## \######### TODO \##########
127
+
128
+ ## Create
129
+
130
+ ```rb
131
+ Magento::Order.create(
132
+ customer_firstname: '',
133
+ customer_lastname: '',
134
+ customer_email: '',
135
+ # others attrbutes ...,
136
+ items: [
137
+ {
138
+ sku: '',
139
+ price: '',
140
+ qty_ordered: 1,
141
+ # others attrbutes ...,
142
+ }
143
+ ],
144
+ billing_address: {
145
+ # attrbutes...
146
+ },
147
+ payment: {
148
+ # attrbutes...
149
+ },
150
+ extension_attributes: {
151
+ # attrbutes...
152
+ }
153
+ )
154
+ ```
155
+
156
+ ### Update
157
+
158
+ ```rb
159
+ product = Magento::Product.find('sku-teste')
160
+
161
+ product.name = 'Updated name'
162
+ product.save
163
+
164
+ # or
165
+
166
+ product.update(name: 'Updated name')
167
+ ```
168
+
169
+ ### Delete
170
+
171
+ ```rb
172
+ product = Magento::Product.find('sku-teste')
173
+
174
+ product.delete
175
+
176
+ # or
177
+
178
+ Magento::Product.delete('sku-teste')
179
+ ```
180
+
181
+ ### Search products
182
+ ```rb
183
+ Magento::Product.search('tshort')
184
+ ```
@@ -1,30 +1,35 @@
1
- # frozen_string_literal: true
2
-
3
- require 'time'
4
-
5
- require_relative 'magento/errors'
6
- require_relative 'magento/request'
7
- require_relative 'magento/model'
8
- require_relative 'magento/product'
9
-
10
- Dir[File.expand_path('magento/product/*.rb', __dir__)].map do |path|
11
- require path
12
- end
13
-
14
- module Magento
15
- class << self
16
- attr_accessor :url, :open_timeout, :timeout, :token
17
- end
18
-
19
- self.url = ENV['MAGENTO_URL']
20
- self.open_timeout = 30
21
- self.timeout = 90
22
- self.token = ENV['MAGENTO_TOKEN']
23
-
24
- def self.production?
25
- ENV['RACK_ENV'] == 'production' ||
26
- ENV['RAILS_ENV'] == 'production' ||
27
- ENV['PRODUCTION'] ||
28
- ENV['production']
29
- end
30
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'time'
4
+ require 'dry/inflector'
5
+
6
+ require_relative 'magento/errors'
7
+ require_relative 'magento/request'
8
+ require_relative 'magento/model'
9
+ require_relative 'magento/model_mapper'
10
+ require_relative 'magento/query'
11
+ require_relative 'magento/product'
12
+ require_relative 'magento/country'
13
+ require_relative 'magento/customer'
14
+ require_relative 'magento/order'
15
+
16
+ Dir[File.expand_path('magento/shared/*.rb', __dir__)].map { |f| require f }
17
+
18
+ module Magento
19
+ class << self
20
+ attr_accessor :url, :open_timeout, :timeout, :token, :store
21
+ end
22
+
23
+ self.url = ENV['MAGENTO_URL']
24
+ self.open_timeout = 30
25
+ self.timeout = 90
26
+ self.token = ENV['MAGENTO_TOKEN']
27
+ self.store = ENV['MAGENTO_STORE'] || :all
28
+
29
+ def self.production?
30
+ ENV['RACK_ENV'] == 'production' ||
31
+ ENV['RAILS_ENV'] == 'production' ||
32
+ ENV['PRODUCTION'] ||
33
+ ENV['production']
34
+ end
35
+ end
@@ -0,0 +1,4 @@
1
+ module Magento
2
+ class Category < Model
3
+ end
4
+ end
@@ -0,0 +1,5 @@
1
+ module Magento
2
+ class Country < Model
3
+ self.endpoint = 'directory/countries'
4
+ end
5
+ end
@@ -0,0 +1,13 @@
1
+ module Magento
2
+ class Customer < Model
3
+ class << self
4
+ alias_method :find_by_id, :find
5
+
6
+ def find_by_token(token)
7
+ user_request = Request.new(token: token)
8
+ customer_hash = user_request.get('customers/me').parse
9
+ ModelMapper.from_hash(customer_hash).to_model(Customer)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,5 +1,18 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Magento
2
- class NotFoundError < StandardError; end
3
- class UnauthorizedAccessError < StandardError; end
4
- class UnprocessedRequestError < StandardError; end
5
- end
4
+ class MagentoError < StandardError
5
+ attr_reader :status
6
+ attr_reader :errors
7
+ attr_reader :request
8
+
9
+ def initialize(msg = '', status = 400, errors = nil, request = nil)
10
+ @status = status
11
+ @errors = errors
12
+ @request = request
13
+ super(msg)
14
+ end
15
+ end
16
+
17
+ class NotFound < MagentoError; end
18
+ end
@@ -1,43 +1,79 @@
1
- # frozen_string_literal: true
2
-
3
- require 'dry/inflector'
4
-
5
- module Magento
6
- class Model
7
- class << self
8
- protected
9
-
10
- def mapHash(klass, values)
11
- object = klass.new
12
- values.each do |key, value|
13
- object.singleton_class.instance_eval { attr_accessor key }
14
- if value.is_a?(Hash)
15
- class_name = inflector.camelize(inflector.singularize(key))
16
- value = mapHash(Object.const_get("Magento::#{class_name}"), value)
17
- elsif value.is_a?(Array)
18
- value = mapArray(key, value)
19
- end
20
- object.send("#{key}=", value)
21
- end
22
- object
23
- end
24
-
25
- def mapArray(key, values)
26
- result = []
27
- values.each do |value|
28
- if value.is_a?(Hash)
29
- class_name = inflector.camelize(inflector.singularize(key))
30
- result << mapHash(Object.const_get("Magento::#{class_name}"), value)
31
- else
32
- result << value
33
- end
34
- end
35
- result
36
- end
37
-
38
- def inflector
39
- @inflector ||= Dry::Inflector.new
40
- end
41
- end
42
- end
43
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'forwardable'
4
+
5
+ module Magento
6
+ class Model
7
+ def save
8
+ body = ModelMapper.from_object(self).to_hash
9
+ self.class.update(send(self.class.primary_key), body)
10
+ end
11
+
12
+ def update(attrs)
13
+ raise "#{self.class.name} not saved" if send(self.class.primary_key).nil?
14
+
15
+ attrs.each { |key, value| send("#{key}=", value) }
16
+ save
17
+ end
18
+
19
+ def delete
20
+ self.class.delete(send(self.class.primary_key))
21
+ end
22
+
23
+ class << self
24
+ extend Forwardable
25
+
26
+ def_delegators :query, :all, :page, :per, :order, :select, :where
27
+
28
+ def find(id)
29
+ hash = request.get("#{api_resource}/#{id}").parse
30
+ ModelMapper.from_hash(hash).to_model(self)
31
+ end
32
+
33
+ def create(attributes)
34
+ body = { entity_name => attributes }
35
+ hash = request.post(api_resource, body).parse
36
+ ModelMapper.from_hash(hash).to_model(self)
37
+ end
38
+
39
+ def delete(id)
40
+ request.delete("#{api_resource}/#{id}")
41
+ end
42
+
43
+ def update(id, attributes)
44
+ body = { entity_name => attributes }
45
+ hash = request.put("#{api_resource}/#{id}", body).parse
46
+ ModelMapper.from_hash(hash).to_model(self)
47
+ end
48
+
49
+ def api_resource
50
+ endpoint || inflector.pluralize(entity_name)
51
+ end
52
+
53
+ def entity_name
54
+ inflector.underscore(name).sub('magento/', '')
55
+ end
56
+
57
+ def primary_key
58
+ @primary_key || :id
59
+ end
60
+
61
+ protected
62
+
63
+ attr_writer :primary_key
64
+ attr_accessor :endpoint
65
+
66
+ def query
67
+ Query.new(self)
68
+ end
69
+
70
+ def request
71
+ @request ||= Request.new
72
+ end
73
+
74
+ def inflector
75
+ @inflector ||= Dry::Inflector.new
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,71 @@
1
+ class ModelMapper
2
+ def initialize(from)
3
+ @from = from
4
+ end
5
+
6
+ def to_model(model)
7
+ map_hash(model, @from)
8
+ end
9
+
10
+ def to_hash
11
+ self.class.to_hash(@from)
12
+ end
13
+
14
+ def self.from_object(object)
15
+ new(object)
16
+ end
17
+
18
+ def self.from_hash(values)
19
+ new(values)
20
+ end
21
+
22
+ def self.to_hash(object)
23
+ hash = {}
24
+ object.instance_variables.each do |attr|
25
+ key = attr.to_s.delete('@')
26
+ value = object.send(key)
27
+ value = to_hash(value) if value.class.name.include?('Magento::')
28
+ if value.is_a? Array
29
+ value = value.map do |item|
30
+ item.class.name.include?('Magento::') ? to_hash(item) : item
31
+ end
32
+ end
33
+ hash[key] = value
34
+ end
35
+ hash
36
+ end
37
+
38
+ private
39
+
40
+ def map_hash(model, values)
41
+ object = model.new
42
+ values.each do |key, value|
43
+ object.singleton_class.instance_eval { attr_accessor key }
44
+ if value.is_a?(Hash)
45
+ class_name = inflector.camelize(inflector.singularize(key))
46
+ value = map_hash(Object.const_get("Magento::#{class_name}"), value)
47
+ elsif value.is_a?(Array)
48
+ value = map_array(key, value)
49
+ end
50
+ object.send("#{key}=", value)
51
+ end
52
+ object
53
+ end
54
+
55
+ def map_array(key, values)
56
+ result = []
57
+ values.each do |value|
58
+ if value.is_a?(Hash)
59
+ class_name = inflector.camelize(inflector.singularize(key))
60
+ result << map_hash(Object.const_get("Magento::#{class_name}"), value)
61
+ else
62
+ result << value
63
+ end
64
+ end
65
+ result
66
+ end
67
+
68
+ def inflector
69
+ @inflector ||= Dry::Inflector.new
70
+ end
71
+ end
@@ -0,0 +1,5 @@
1
+ module Magento
2
+ class Order < Model
3
+ self.primary_key = :entity_id
4
+ end
5
+ end
@@ -1,10 +1,7 @@
1
- module Magento
2
- class Product < Model
3
- class << self
4
- def find_by_sku(sku)
5
- product_hash = Request.get("products/#{sku}").parse
6
- mapHash Product, product_hash
7
- end
8
- end
9
- end
10
- end
1
+ module Magento
2
+ class Product < Model
3
+ class << self
4
+ alias_method :find_by_sku, :find
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'cgi'
4
+
5
+ module Magento
6
+ class Query
7
+ ACCEPTED_CONDITIONS = [
8
+ 'eq', # Equals.
9
+ 'finset', # A value within a set of values
10
+ 'from', # The beginning of a range. Must be used with to
11
+ 'gt', # Greater than
12
+ 'gteq', # Greater than or equal
13
+ 'in', # In. The value can contain a comma-separated list of values.
14
+ 'like', # Like. The value can contain the SQL wildcard characters when like is specified.
15
+ 'lt', # Less than
16
+ 'lteq', # Less than or equal
17
+ 'moreq', # More or equal
18
+ 'neq', # Not equal
19
+ 'nfinset', # A value that is not within a set of values
20
+ 'nin', # Not in. The value can contain a comma-separated list of values.
21
+ 'notnull', # Not null
22
+ 'null', # Null
23
+ 'to' # The end of a range. Must be used with from
24
+ ].freeze
25
+
26
+ def initialize(model, request: Request.new)
27
+ @model = model
28
+ @request = request
29
+ @filter_groups = nil
30
+ @current_page = 1
31
+ @page_size = 50
32
+ @sort_orders = nil
33
+ @fields = nil
34
+ end
35
+
36
+ def where(attributes)
37
+ self.filter_groups = [] unless filter_groups
38
+ filters = []
39
+ attributes.each do |key, value|
40
+ field, condition = parse_filter(key)
41
+ value = parse_value_filter(condition, value)
42
+ filters << { field: field, conditionType: condition, value: value }
43
+ end
44
+ filter_groups << { filters: filters }
45
+ self
46
+ end
47
+
48
+ def page(current_page)
49
+ self.current_page = current_page
50
+ self
51
+ end
52
+
53
+ def per(page_size)
54
+ self.page_size = page_size
55
+ self
56
+ end
57
+
58
+ def select(*fields)
59
+ fields = fields.map { |field| parse_field(field) }
60
+ self.fields = "items[#{fields.join(',')}]"
61
+ self
62
+ end
63
+
64
+ def order(attributes)
65
+ if attributes.is_a?(String)
66
+ self.sort_orders = [{ field: verify_id(attributes), direction: :asc }]
67
+ elsif attributes.is_a?(Hash)
68
+ self.sort_orders = []
69
+ attributes.each do |field, direction|
70
+ raise "Invalid sort order direction '#{direction}'" unless %w[asc desc].include?(direction.to_s)
71
+
72
+ sort_orders << { field: verify_id(field), direction: direction }
73
+ end
74
+ end
75
+ self
76
+ end
77
+
78
+ def all
79
+ items = request.get("#{endpoint}?#{query_params}").parse['items']
80
+ items ? items.map { |i| ModelMapper.from_hash(i).to_model(model) } : []
81
+ end
82
+
83
+ private
84
+
85
+ attr_accessor :current_page, :filter_groups, :page_size, :request, :sort_orders, :model, :fields
86
+
87
+ def endpoint
88
+ model.api_resource
89
+ end
90
+
91
+ def verify_id(field)
92
+ return model.primary_key if (field.to_s == 'id') && (field.to_s != model.primary_key.to_s)
93
+
94
+ field
95
+ end
96
+
97
+ def query_params
98
+ query = {
99
+ searchCriteria: {
100
+ filterGroups: filter_groups,
101
+ currentPage: current_page,
102
+ sortOrders: sort_orders,
103
+ pageSize: page_size
104
+ }.compact,
105
+ fields: fields
106
+ }.compact
107
+
108
+ encode query
109
+ end
110
+
111
+ def parse_filter(key)
112
+ patter = /(.*)_([a-z]+)$/
113
+ raise 'Invalid format' unless key.match(patter)
114
+ raise 'Condition not accepted' unless ACCEPTED_CONDITIONS.include?(key.match(patter)[2])
115
+
116
+ key.match(patter).to_a[1..2]
117
+ end
118
+
119
+ def parse_value_filter(condition, value)
120
+ if ['in', 'nin'].include?(condition) && value.is_a?(Array)
121
+ value = value.join(',')
122
+ end
123
+
124
+ value
125
+ end
126
+
127
+ def parse_field(value)
128
+ return verify_id(value) unless value.is_a? Hash
129
+
130
+ value.map do |k, v|
131
+ fields = v.is_a?(Array) ? v.map { |field| parse_field(field) } : [parse_field(v)]
132
+ "#{k}[#{fields.join(',')}]"
133
+ end.join(',')
134
+ end
135
+
136
+ def encode(value, key = nil)
137
+ case value
138
+ when Hash then value.map { |k, v| encode(v, append_key(key, k)) }.join('&')
139
+ when Array then value.each_with_index.map { |v, i| encode(v, "#{key}[#{i}]") }.join('&')
140
+ when nil then ''
141
+ else
142
+ "#{key}=#{CGI.escape(value.to_s)}"
143
+ end
144
+ end
145
+
146
+ def append_key(root_key, key)
147
+ root_key.nil? ? key : "#{root_key}[#{key}]"
148
+ end
149
+ end
150
+ end
@@ -1,105 +1,103 @@
1
- # frozen_string_literal: true
2
- require 'uri'
3
- require 'http'
4
-
5
- module Magento
6
- class Request
7
- class << self
8
- def get(resource)
9
- salva_requisicao(:get, url(resource))
10
- tratar_erro http_auth.get(url(resource))
11
- end
12
-
13
- def put(resource, body)
14
- salva_requisicao(:put, url(resource), body)
15
- tratar_erro http_auth.put(url(resource), json: body)
16
- end
17
-
18
- def post(resource, body = nil, url_completa = false)
19
- url = url_completa ? resource : url(resource)
20
- salva_requisicao(:post, url, body)
21
- tratar_erro http_auth.post(url, json: body)
22
- end
23
-
24
- private
25
-
26
- def http_auth
27
- HTTP.auth("Bearer #{Magento.token}")
28
- end
29
-
30
- def base_url
31
- url = Magento.url.to_s.sub(%r{/$}, '')
32
- "#{url}/rest/all/V1"
33
- end
34
-
35
- def url(resource)
36
- "#{base_url}/#{resource}"
37
- end
38
-
39
- def parametros_de_busca(field:, value:, conditionType: :eq)
40
- criar_parametros(
41
- filter_groups: {
42
- '0': {
43
- filters: {
44
- '0': {
45
- field: field,
46
- conditionType: conditionType,
47
- value: value
48
- }
49
- }
50
- }
51
- }
52
- )
53
- end
54
-
55
- def parametros_de_campos(campos:)
56
- criar_parametros(fields: campos)
57
- end
58
-
59
- def criar_parametros(filter_groups: nil, fields: nil, current_page: 1)
60
- CGI.unescape(
61
- {
62
- searchCriteria: {
63
- currentPage: current_page,
64
- filterGroups: filter_groups
65
- }.compact,
66
- fields: fields
67
- }.compact.to_query
68
- )
69
- end
70
-
71
- def tratar_erro(resposta)
72
- unless resposta.status.success?
73
- begin
74
- corpo = resposta.parse
75
- rescue StandardError
76
- corpo = resposta.to_s
77
- end
78
- erro = {
79
- erro: 'Erro de requisição Magento',
80
- resposta: { status: resposta.status, corpo: corpo },
81
- requisicao: @requisicao
82
- }
83
-
84
- raise Magento::UnprocessedRequestError, erro.to_json
85
- end
86
-
87
- resposta
88
- end
89
-
90
- def salva_requisicao(verbo, p_url, p_corpo = nil)
91
- begin
92
- corpo = p_corpo[:product].reject { |e| e == :media_gallery_entries }
93
- rescue StandardError
94
- corpo = p_corpo
95
- end
96
-
97
- @requisicao = {
98
- verbo: verbo,
99
- url: p_url,
100
- corpo: corpo
101
- }
102
- end
103
- end
104
- end
105
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'uri'
4
+ require 'http'
5
+
6
+ module Magento
7
+ class Request
8
+ attr_reader :token, :store
9
+
10
+ def initialize(token: Magento.token, store: Magento.store)
11
+ @token = token
12
+ @store = store
13
+ end
14
+
15
+ def get(resource, token: nil)
16
+ save_request(:get, url(resource))
17
+ handle_error http_auth.get(url(resource))
18
+ end
19
+
20
+ def put(resource, body)
21
+ save_request(:put, url(resource), body)
22
+ handle_error http_auth.put(url(resource), json: body)
23
+ end
24
+
25
+ def post(resource, body = nil, url_completa = false)
26
+ url = url_completa ? resource : url(resource)
27
+ save_request(:post, url, body)
28
+ handle_error http_auth.post(url, json: body)
29
+ end
30
+
31
+ private
32
+
33
+ def http_auth
34
+ HTTP.auth("Bearer #{token}")
35
+ end
36
+
37
+ def base_url
38
+ url = Magento.url.to_s.sub(%r{/$}, '')
39
+ "#{url}/rest/#{store}/V1"
40
+ end
41
+
42
+ def url(resource)
43
+ "#{base_url}/#{resource}"
44
+ end
45
+
46
+ def search_params(field:, value:, conditionType: :eq)
47
+ create_params(
48
+ filter_groups: {
49
+ '0': {
50
+ filters: {
51
+ '0': {
52
+ field: field,
53
+ conditionType: conditionType,
54
+ value: value
55
+ }
56
+ }
57
+ }
58
+ }
59
+ )
60
+ end
61
+
62
+ def field_params(fields:)
63
+ create_params(fields: fields)
64
+ end
65
+
66
+ def create_params(filter_groups: nil, fields: nil, current_page: 1)
67
+ CGI.unescape(
68
+ {
69
+ searchCriteria: {
70
+ currentPage: current_page,
71
+ filterGroups: filter_groups
72
+ }.compact,
73
+ fields: fields
74
+ }.compact.to_query
75
+ )
76
+ end
77
+
78
+ def handle_error(resp)
79
+ return resp if resp.status.success?
80
+
81
+ begin
82
+ msg = resp.parse['message']
83
+ errors = resp.parse['errors']
84
+ rescue StandardError
85
+ msg = 'Failed access to the magento server'
86
+ errors = []
87
+ end
88
+
89
+ raise Magento::NotFound.new(msg, resp.status.code, errors, @request) if resp.status.not_found?
90
+
91
+ raise Magento::MagentoError.new(msg, resp.status.code, errors, @request)
92
+ end
93
+
94
+ def save_request(method, url, body = nil)
95
+ begin
96
+ body = body[:product].reject { |e| e == :media_gallery_entries }
97
+ rescue StandardError
98
+ end
99
+
100
+ @request = { method: method, url: url, body: body }
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,4 @@
1
+ module Magento
2
+ class Address
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Magento
2
+ class AvailableRegion
3
+ end
4
+ end
@@ -1,6 +1,6 @@
1
- # frozen_string_literal: true
2
-
3
- module Magento
4
- class CategoryLink
5
- end
6
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Magento
4
+ class CategoryLink
5
+ end
6
+ end
@@ -1,4 +1,4 @@
1
- module Magento
2
- class CustomAttribute
3
- end
4
- end
1
+ module Magento
2
+ class CustomAttribute
3
+ end
4
+ end
@@ -1,4 +1,4 @@
1
- module Magento
2
- class ExtensionAttribute
3
- end
1
+ module Magento
2
+ class ExtensionAttribute
3
+ end
4
4
  end
@@ -0,0 +1,3 @@
1
+ module Magento
2
+ class Item; end
3
+ end
@@ -1,4 +1,4 @@
1
- module Magento
2
- class MediaGalleryEntry
3
- end
4
- end
1
+ module Magento
2
+ class MediaGalleryEntry
3
+ end
4
+ end
@@ -1,4 +1,4 @@
1
- module Magento
2
- class Option
3
- end
4
- end
1
+ module Magento
2
+ class Option
3
+ end
4
+ end
@@ -0,0 +1,3 @@
1
+ module Magento
2
+ class Payment; end
3
+ end
@@ -0,0 +1,3 @@
1
+ module Magento
2
+ class PaymentAdditionalInfo; end
3
+ end
@@ -1,4 +1,4 @@
1
- module Magento
2
- class ProductLink
3
- end
4
- end
1
+ module Magento
2
+ class ProductLink
3
+ end
4
+ end
@@ -0,0 +1,4 @@
1
+ module Magento
2
+ class Region
3
+ end
4
+ end
@@ -0,0 +1,3 @@
1
+ module Magento
2
+ class Shipping; end
3
+ end
@@ -0,0 +1,3 @@
1
+ module Magento
2
+ class ShippingAssignment; end
3
+ end
@@ -1,4 +1,4 @@
1
- module Magento
2
- class StockItem
3
- end
1
+ module Magento
2
+ class StockItem
3
+ end
4
4
  end
@@ -1,4 +1,4 @@
1
- module Magento
2
- class TierPrice
3
- end
4
- end
1
+ module Magento
2
+ class TierPrice
3
+ end
4
+ end
@@ -0,0 +1,3 @@
1
+ module Magento
2
+ class Total; end
3
+ end
@@ -0,0 +1,3 @@
1
+ module Magento
2
+ class Value; end
3
+ end
@@ -2,13 +2,13 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'magento'
5
- s.version = '0.0.3'
5
+ s.version = '0.3.2'
6
6
  s.date = '2020-07-31'
7
7
  s.summary = 'Magento Ruby library'
8
8
  s.description = 'Magento Ruby library'
9
9
  s.files = `git ls-files`.split($/)
10
- s.authors = ["Nick Quaranto"]
11
- s.email = 'nick@quaran.to'
10
+ s.authors = ["Wallas Faria"]
11
+ s.email = 'wallasfaria@hotmail.com'
12
12
  s.homepage = 'https://github.com/WallasFaria/magento-ruby'
13
13
  s.require_paths = ['lib']
14
14
 
metadata CHANGED
@@ -1,10 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: magento
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
- - Nick Quaranto
7
+ - Wallas Faria
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.2.0
41
41
  description: Magento Ruby library
42
- email: nick@quaran.to
42
+ email: wallasfaria@hotmail.com
43
43
  executables: []
44
44
  extensions: []
45
45
  extra_rdoc_files: []
@@ -48,18 +48,34 @@ files:
48
48
  - Gemfile
49
49
  - README.md
50
50
  - lib/magento.rb
51
+ - lib/magento/category.rb
52
+ - lib/magento/country.rb
53
+ - lib/magento/customer.rb
51
54
  - lib/magento/errors.rb
52
55
  - lib/magento/model.rb
56
+ - lib/magento/model_mapper.rb
57
+ - lib/magento/order.rb
53
58
  - lib/magento/product.rb
54
- - lib/magento/product/category_link.rb
55
- - lib/magento/product/custom_attribute.rb
56
- - lib/magento/product/extension_attribute.rb
57
- - lib/magento/product/media_gallery_entry.rb
58
- - lib/magento/product/option.rb
59
- - lib/magento/product/product_link.rb
60
- - lib/magento/product/stock_item.rb
61
- - lib/magento/product/tier_price.rb
59
+ - lib/magento/query.rb
62
60
  - lib/magento/request.rb
61
+ - lib/magento/shared/address.rb
62
+ - lib/magento/shared/available_regions.rb
63
+ - lib/magento/shared/category_link.rb
64
+ - lib/magento/shared/custom_attribute.rb
65
+ - lib/magento/shared/extension_attribute.rb
66
+ - lib/magento/shared/item.rb
67
+ - lib/magento/shared/media_gallery_entry.rb
68
+ - lib/magento/shared/option.rb
69
+ - lib/magento/shared/payment.rb
70
+ - lib/magento/shared/payment_additional_info.rb
71
+ - lib/magento/shared/product_link.rb
72
+ - lib/magento/shared/region.rb
73
+ - lib/magento/shared/shipping.rb
74
+ - lib/magento/shared/shipping_assignment.rb
75
+ - lib/magento/shared/stock_item.rb
76
+ - lib/magento/shared/tier_price.rb
77
+ - lib/magento/shared/total.rb
78
+ - lib/magento/shared/value.rb
63
79
  - magento.gemspec
64
80
  homepage: https://github.com/WallasFaria/magento-ruby
65
81
  licenses: []