salestation 3.8.0 → 4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2fe9755ef3152c1d5e9821aa2a7be920245b35f7ee95f26fd1e0fe3fb5934468
4
- data.tar.gz: f9b1e080731f605cfe7f3ccd2194b923fe70b668757198b105c5ee697ca29637
3
+ metadata.gz: 85ac2feb504421f1ab20912abbf6994765d3ad6b743360a4e47c67a5bb362774
4
+ data.tar.gz: 3e6571aeb33d1c2edd94857a6de854e477f8e3a87a2abeac8d352634e01e3012
5
5
  SHA512:
6
- metadata.gz: c5988265e60fdfa3f8dc7fe1915e38cd6d3afc1aabeca923de08bf9726c21db355d04ce6d9047bfda8d7b8fa4773104fdacbd169a12de6c75ce702aafbd5e6dd
7
- data.tar.gz: 1f3351524846ddea69d54281ab5262ffaa138a4fdf83092614030ca7d60bcb99d44a4944aa1690c04ecf88e41e39cf1d3209588e6730bd92566cf25e66393cec
6
+ metadata.gz: 6d0a4278a94c18bc1a5a5286c0b3941701fda3182d9bcbc27d5b29ccf57841b296b618a75ef67fe1e8a3e88f8c5a649fc3100803d2e79c1d812b0f90b2c13e12
7
+ data.tar.gz: 80a64adaf82c53f673926a47cc389ae8554c589aa52e41c84ee23a68807d1c49b098c72bf5a338cd0255f689176c0e44f15b7fe0389ea3a90ec89d0bd3a54827
data/README.md CHANGED
@@ -75,6 +75,28 @@ Salestation allows and recommends you to define your own custom errors. This is
75
75
  })
76
76
  ```
77
77
 
78
+ ### Providing custom error fields
79
+
80
+ If you need to specify additional error fields you can use `from` method.
81
+ `from` accepts base error on which the rest of the response is built.
82
+ Base error must be a hash or implement `to_h` method.
83
+
84
+ Example:
85
+
86
+ ```
87
+ App::Errors::Conflict.from({details: 'details'}, message: 'message', debug_message: 'debug_message')
88
+ ```
89
+
90
+ Response:
91
+
92
+ ```javascript
93
+ {
94
+ "details": "details",
95
+ "message": "message",
96
+ "debug_message": "debug_message"
97
+ }
98
+ ```
99
+
78
100
  ### Using Extractors
79
101
 
80
102
  Salestation provides extractors to fetch parameters from the request and pass them to the chain.
@@ -3,43 +3,52 @@
3
3
  module Salestation
4
4
  class App
5
5
  module Errors
6
- class InvalidInput < Dry::Struct
6
+ class Error < Dry::Struct
7
+ attribute? :base_error, Types::Coercible::Hash
8
+
9
+ def self.from(base_error, overrides = {})
10
+ new(**overrides, base_error: base_error.to_h)
11
+ end
12
+ end
13
+
14
+ class InvalidInput < Error
7
15
  attribute :errors, Types::Strict::Hash
8
16
  attribute :hints, Types::Coercible::Hash.default({}.freeze)
9
17
  attribute? :debug_message, Types::Strict::String
18
+ attribute? :form_errors, Types::Strict::Bool.default(false)
10
19
  end
11
20
 
12
- class DependencyCurrentlyUnavailable < Dry::Struct
21
+ class DependencyCurrentlyUnavailable < Error
13
22
  attribute :message, Types::Strict::String
14
23
  attribute? :debug_message, Types::Strict::String
15
24
  end
16
25
 
17
- class RequestedResourceNotFound < Dry::Struct
26
+ class RequestedResourceNotFound < Error
18
27
  attribute :message, Types::Strict::String
19
28
  attribute? :debug_message, Types::Strict::String
20
29
  end
21
30
 
22
- class Forbidden < Dry::Struct
31
+ class Forbidden < Error
23
32
  attribute :message, Types::Strict::String
24
33
  attribute? :debug_message, Types::Strict::String
25
34
  end
26
35
 
27
- class Conflict < Dry::Struct
36
+ class Conflict < Error
28
37
  attribute :message, Types::Strict::String
29
38
  attribute :debug_message, Types::Strict::String
30
39
  end
31
40
 
32
- class NotAcceptable < Dry::Struct
41
+ class NotAcceptable < Error
33
42
  attribute :message, Types::Strict::String
34
43
  attribute :debug_message, Types::Strict::String
35
44
  end
36
45
 
37
- class UnsupportedMediaType < Dry::Struct
46
+ class UnsupportedMediaType < Error
38
47
  attribute :message, Types::Strict::String
39
48
  attribute :debug_message, Types::Strict::String
40
49
  end
41
50
 
42
- class RequestEntityTooLarge < Dry::Struct
51
+ class RequestEntityTooLarge < Error
43
52
  attribute :message, Types::Strict::String
44
53
  attribute? :debug_message, Types::Strict::String
45
54
  end
@@ -12,26 +12,27 @@ module Salestation
12
12
  App::Errors::DependencyCurrentlyUnavailable => -> (error) {
13
13
  Responses::ServiceUnavailable.new(
14
14
  message: error.message,
15
- debug_message: "Please try again later"
15
+ debug_message: "Please try again later",
16
+ base_error: error.base_error
16
17
  )
17
18
  },
18
19
  App::Errors::RequestedResourceNotFound => -> (error) {
19
- Responses::NotFound.new(message: error.message, debug_message: error.debug_message)
20
+ Responses::NotFound.new(message: error.message, debug_message: error.debug_message, base_error: error.base_error)
20
21
  },
21
22
  App::Errors::Forbidden => -> (error) {
22
- Responses::Forbidden.new(message: error.message, debug_message: error.debug_message)
23
+ Responses::Forbidden.new(message: error.message, debug_message: error.debug_message, base_error: error.base_error)
23
24
  },
24
25
  App::Errors::Conflict => -> (error) {
25
- Responses::Conflict.new(message: error.message, debug_message: error.debug_message)
26
+ Responses::Conflict.new(message: error.message, debug_message: error.debug_message, base_error: error.base_error)
26
27
  },
27
28
  App::Errors::NotAcceptable => -> (error) {
28
- Responses::NotAcceptable.new(message: error.message, debug_message: error.debug_message)
29
+ Responses::NotAcceptable.new(message: error.message, debug_message: error.debug_message, base_error: error.base_error)
29
30
  },
30
31
  App::Errors::UnsupportedMediaType => -> (error) {
31
- Responses::UnsupportedMediaType.new(message: error.message, debug_message: error.debug_message)
32
+ Responses::UnsupportedMediaType.new(message: error.message, debug_message: error.debug_message, base_error: error.base_error)
32
33
  },
33
34
  App::Errors::RequestEntityTooLarge => -> (error) {
34
- Responses::RequestEntityTooLarge.new(message: error.message, debug_message: error.debug_message)
35
+ Responses::RequestEntityTooLarge.new(message: error.message, debug_message: error.debug_message, base_error: error.base_error)
35
36
  }
36
37
  }.freeze
37
38
 
@@ -125,8 +125,10 @@ module Salestation
125
125
  extracted_data[filter] = request_hash[stringified_key] if request_hash.key?(stringified_key)
126
126
  when Hash
127
127
  filter.each do |key, nested_filters|
128
- if request_hash.key?(key.to_s)
129
- extracted_data[key] = extract(nested_filters, request_hash.fetch(key.to_s))
128
+ stringified_key = key.to_s
129
+ if request_hash.key?(stringified_key)
130
+ value = request_hash.fetch(stringified_key)
131
+ extracted_data[key] = value.nil? ? nil : extract(nested_filters, value)
130
132
  end
131
133
  end
132
134
  end
@@ -35,17 +35,19 @@ module Salestation
35
35
  attribute :debug_message, Types::Coercible::String.default('')
36
36
  attribute :context, Types::Hash.default({}.freeze)
37
37
  attribute :headers, Types::Hash.default({}.freeze)
38
+ attribute? :base_error, Types::Coercible::Hash
38
39
 
39
40
  def body
40
- {message: message, debug_message: debug_message}
41
+ # Merge into `base_error` to ensure standard fields are not overriden
42
+ (base_error || {}).merge(message: message, debug_message: debug_message)
41
43
  end
42
44
  end
43
45
 
44
46
  class UnprocessableEntityError < Error
45
- attribute :form_errors, Types::Hash.default({}.freeze)
47
+ attribute? :form_errors, Types::Coercible::Hash.optional
46
48
 
47
49
  def body
48
- super.merge(form_errors: errors)
50
+ super.merge({form_errors: form_errors}.compact)
49
51
  end
50
52
  end
51
53
 
@@ -56,11 +58,16 @@ module Salestation
56
58
  end
57
59
 
58
60
  class UnprocessableEntityFromSchemaErrors
59
- def self.create(errors:, hints:)
61
+ def self.create(errors:, hints:, base_error: nil, form_errors: false)
60
62
  message = parse_errors(errors)
61
63
  debug_message = parse_hints(hints)
62
64
 
63
- UnprocessableEntity.new(message: message, debug_message: debug_message, form_errors: errors)
65
+ UnprocessableEntity.new(
66
+ message: message,
67
+ debug_message: debug_message,
68
+ form_errors: form_errors ? errors : nil,
69
+ base_error: base_error
70
+ )
64
71
  end
65
72
 
66
73
  def self.parse_errors(errors)
data/salestation.gemspec CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "salestation"
7
- spec.version = "3.8.0"
7
+ spec.version = "4.0.2"
8
8
  spec.authors = ["Glia TechMovers"]
9
9
  spec.email = ["techmovers@glia.com"]
10
10
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: salestation
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.8.0
4
+ version: 4.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Glia TechMovers
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-03 00:00:00.000000000 Z
11
+ date: 2021-02-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -143,7 +143,7 @@ homepage: ''
143
143
  licenses:
144
144
  - MIT
145
145
  metadata: {}
146
- post_install_message:
146
+ post_install_message:
147
147
  rdoc_options: []
148
148
  require_paths:
149
149
  - lib
@@ -158,8 +158,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
158
158
  - !ruby/object:Gem::Version
159
159
  version: '0'
160
160
  requirements: []
161
- rubygems_version: 3.0.3
162
- signing_key:
161
+ rubygems_version: 3.0.6
162
+ signing_key:
163
163
  specification_version: 4
164
164
  summary: ''
165
165
  test_files: []