magento 0.0.2 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fef777d99770e8377c1a13bec28eafd1b75768ea5a16e0c819c704f35da6bd54
4
- data.tar.gz: 8598bd0e18b6b2a86dd10dd7f9b28cce14338bc776943d28a4b8ac23da76aa28
3
+ metadata.gz: eb33e9b6de9d7be6774a547b6c8cca7e25893d13d8c2095944d91a1b0bfdcc57
4
+ data.tar.gz: e2074b421ade2bd63d369edade42aea984cdd6df352074f5b68fde7eb446ec34
5
5
  SHA512:
6
- metadata.gz: 71e8b86fb744f49d1fb9f3899ebe4235b257d54b11231eca25be7368be082120245c279653557be2e0715b4ab4afd1ad5d36afea4685792492299bd4116f7ca1
7
- data.tar.gz: 045f97e42203bbe2ebc051472e4aae3c741b1ac160cc590cbbf421c66c3ff27ccc193294ff252f63d5cae205e78c13b99030bf085f87389fb9056ddfa60b856c
6
+ metadata.gz: 28a92f51420661f86c3a0b632e00eb037f12cb92c84127d40f816f0be369c85a246e0ee4a9cb4036c8309666ccb0304e0918765a8866337d86258474f07ce45f
7
+ data.tar.gz: 5a106aeee7305e8bdcea2f2b064cd902e095d159547ee8ec77e26b39477f2b9fc829a48f5df8dc1c4093c3b548c621aed0a9d0857cfa8e37f24c391959e41377
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,176 @@
1
- # Magento Ruby library
2
-
3
- ## Install
4
-
5
- ```rb
6
- gem 'magento', '~> 0.0.1'
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_sky('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.1'
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
+ Magento::Product.where(price_gt: 100, price_lt: 200).all
70
+ ```
71
+
72
+ | Condition | Notes |
73
+ | ----------| ------|
74
+ |eq | Equals. |
75
+ |finset | A value within a set of values |
76
+ |from | The beginning of a range. Must be used with to |
77
+ |gt | Greater than |
78
+ |gteq | Greater than or equal |
79
+ |in | In. The value can contain a comma-separated list of values. |
80
+ |like | Like. The value can contain the SQL wildcard characters when like is |specified.
81
+ |lt | Less than |
82
+ |lteq | Less than or equal |
83
+ |moreq | More or equal |
84
+ |neq | Not equal |
85
+ |nfinset | A value that is not within a set of values |
86
+ |nin | Not in. The value can contain a comma-separated list of values. |
87
+ |notnull | Not null |
88
+ |null | Null |
89
+ |to | The end of a range. Must be used with from |
90
+
91
+
92
+ #### SortOrder:
93
+
94
+ ```rb
95
+ Magento::Product.order(:sku).all
96
+ Magento::Product.order(sku: :desc).all
97
+ Magento::Product.order(status: :desc, name: :asc).all
98
+ ```
99
+
100
+ #### Pagination:
101
+
102
+ ```rb
103
+ # Set page and quantity per page
104
+ Magento::Product.page(1).per(25) # Default per is 50
105
+ ```
106
+
107
+ #### Example of several options together:
108
+ ```rb
109
+ Magento::Product.select(:sku, :name, :price)
110
+ .where(name_like: 'Tshort%')
111
+ .order(price: :desc)
112
+ .per(10)
113
+ .all
114
+ ```
115
+
116
+ \* _same pattern to all models_
117
+ ___
118
+ ## \######### TODO \##########
119
+
120
+ ## Create
121
+
122
+ ```rb
123
+ Magento::Order.create(
124
+ customer_firstname: '',
125
+ customer_lastname: '',
126
+ customer_email: '',
127
+ # others attrbutes ...,
128
+ items: [
129
+ {
130
+ sku: '',
131
+ price: '',
132
+ qty_ordered: 1,
133
+ # others attrbutes ...,
134
+ }
135
+ ],
136
+ billing_address: {
137
+ # attrbutes...
138
+ },
139
+ payment: {
140
+ # attrbutes...
141
+ },
142
+ extension_attributes: {
143
+ # attrbutes...
144
+ }
145
+ )
146
+ ```
147
+
148
+ ### Update
149
+
150
+ ```rb
151
+ product = Magento::Product.find('sku-teste')
152
+
153
+ product.name = 'Updated name'
154
+ product.save
155
+
156
+ # or
157
+
158
+ product.update(name: 'Updated name')
159
+ ```
160
+
161
+ ### Delete
162
+
163
+ ```rb
164
+ product = Magento::Product.find('sku-teste')
165
+
166
+ product.delete
167
+
168
+ # or
169
+
170
+ Magento::Product.delete('sku-teste')
171
+ ```
172
+
173
+ ### Search products
174
+ ```rb
175
+ Magento::Product.search('tshort')
176
+ ```
@@ -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_sky(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,141 @@
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
+ filters << { field: field, conditionType: condition, value: value }
42
+ end
43
+ filter_groups << { filters: filters }
44
+ self
45
+ end
46
+
47
+ def page(current_page)
48
+ self.current_page = current_page
49
+ self
50
+ end
51
+
52
+ def per(page_size)
53
+ self.page_size = page_size
54
+ self
55
+ end
56
+
57
+ def select(*fields)
58
+ fields = fields.map { |field| parse_field(field) }
59
+ self.fields = "items[#{fields.join(',')}]"
60
+ self
61
+ end
62
+
63
+ def order(attributes)
64
+ if attributes.is_a?(String)
65
+ self.sort_orders = [{ field: verify_id(attributes), direction: :asc }]
66
+ elsif attributes.is_a?(Hash)
67
+ self.sort_orders = []
68
+ attributes.each do |field, direction|
69
+ raise "Invalid sort order direction '#{direction}'" unless %w[asc desc].include?(direction.to_s)
70
+
71
+ sort_orders << { field: verify_id(field), direction: direction }
72
+ end
73
+ end
74
+ self
75
+ end
76
+
77
+ def all
78
+ items = request.get("#{endpoint}?#{query_params}").parse['items']
79
+ items ? items.map { |i| ModelMapper.from_hash(i).to_model(model) } : []
80
+ end
81
+
82
+ private
83
+
84
+ attr_accessor :current_page, :filter_groups, :page_size, :request, :sort_orders, :model, :fields
85
+
86
+ def endpoint
87
+ model.api_resource
88
+ end
89
+
90
+ def verify_id(field)
91
+ return model.primary_key if (field.to_s == 'id') && (field.to_s != model.primary_key.to_s)
92
+
93
+ field
94
+ end
95
+
96
+ def query_params
97
+ query = {
98
+ searchCriteria: {
99
+ filterGroups: filter_groups,
100
+ currentPage: current_page,
101
+ sortOrders: sort_orders,
102
+ pageSize: page_size
103
+ }.compact,
104
+ fields: fields
105
+ }.compact
106
+
107
+ encode query
108
+ end
109
+
110
+ def parse_filter(key)
111
+ patter = /(.*)_([a-z]+)$/
112
+ raise 'Invalid format' unless key.match(patter)
113
+ raise 'Condition not accepted' unless ACCEPTED_CONDITIONS.include?(key.match(patter)[2])
114
+
115
+ key.match(patter).to_a[1..2]
116
+ end
117
+
118
+ def parse_field(value)
119
+ return verify_id(value) unless value.is_a? Hash
120
+
121
+ value.map do |k, v|
122
+ fields = v.is_a?(Array) ? v.map { |field| parse_field(field) } : [parse_field(v)]
123
+ "#{k}[#{fields.join(',')}]"
124
+ end.join(',')
125
+ end
126
+
127
+ def encode(value, key = nil)
128
+ case value
129
+ when Hash then value.map { |k, v| encode(v, append_key(key, k)) }.join('&')
130
+ when Array then value.each_with_index.map { |v, i| encode(v, "#{key}[#{i}]") }.join('&')
131
+ when nil then ''
132
+ else
133
+ "#{key}=#{CGI.escape(value.to_s)}"
134
+ end
135
+ end
136
+
137
+ def append_key(root_key, key)
138
+ root_key.nil? ? key : "#{root_key}[#{key}]"
139
+ end
140
+ end
141
+ 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.2'
5
+ s.version = '0.3.1'
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.2
4
+ version: 0.3.1
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: []