glia-errors 0.9.0 → 0.11.4
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/glia-errors.gemspec +1 -1
- data/lib/glia/errors.rb +1 -1
- data/lib/glia/errors/client_errors.rb +99 -10
- data/lib/glia/errors/error.rb +0 -7
- data/lib/glia/errors/error_types.rb +9 -1
- data/lib/glia/errors/naming.rb +18 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bbaef28887dfc236d0f10cb730ac6dc44813f102bc8023da5fda37089815f318
|
4
|
+
data.tar.gz: 4e33efaa3c820a47896b3b69b859f00fbebcc2477ae0dc8d796f3eab6ed4b17a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 52bdf038de5e035b2825c870d0f9912e93aa27254c464c2b55c5dac3864d429e05455b283fba81105cd03c0ba837b1d4aaf957d89af8b82f359c514bb0093c76
|
7
|
+
data.tar.gz: fb6f1cd85a31526f692be5d5a4201074decaf2f82d1d40fec3bee9f24b43683c9300bc707c2ea918f7dfd73b1bfbcd92db4b70aabf05a3c65e0092c8ad5fe359
|
data/glia-errors.gemspec
CHANGED
data/lib/glia/errors.rb
CHANGED
@@ -12,7 +12,7 @@ module Glia
|
|
12
12
|
def self.from_dry_validation_result(result, custom_error_map = {})
|
13
13
|
dry_validation_version = Gem.loaded_specs['dry-validation'].version
|
14
14
|
if dry_validation_version < Gem::Version.new('1.0')
|
15
|
-
Mapper.from_dry_validation_result(result.output, result.
|
15
|
+
Mapper.from_dry_validation_result(result.output, result.errors, custom_error_map)
|
16
16
|
elsif dry_validation_version <= Gem::Version.new('1.6')
|
17
17
|
Mapper.from_dry_validation_result(result.to_h, result.errors.to_h, custom_error_map)
|
18
18
|
else
|
@@ -5,6 +5,12 @@ module Glia
|
|
5
5
|
# rubocop:disable Style/Documentation
|
6
6
|
class InputValidationError < Error
|
7
7
|
def initialize(error_details:, message: nil)
|
8
|
+
raise ArgumentError, 'At least 1 error detail is required' if error_details.keys.count.zero?
|
9
|
+
|
10
|
+
error_details.each_value do |value|
|
11
|
+
raise ArgumentError, 'error_details values must be lists' unless value.is_a?(Array)
|
12
|
+
end
|
13
|
+
|
8
14
|
super(
|
9
15
|
type: INPUT_VALIDATION_ERROR,
|
10
16
|
ref: create_ref(INPUT_VALIDATION_ERROR),
|
@@ -131,7 +137,7 @@ module Glia
|
|
131
137
|
|
132
138
|
class ResourceNotFoundError < Error
|
133
139
|
def initialize(resource:, message: nil)
|
134
|
-
assert_snake_case(resource)
|
140
|
+
Naming.assert_snake_case(resource)
|
135
141
|
|
136
142
|
super(
|
137
143
|
type: RESOURCE_NOT_FOUND_ERROR,
|
@@ -144,7 +150,7 @@ module Glia
|
|
144
150
|
|
145
151
|
class NotVerifiedError < Error
|
146
152
|
def initialize(resource:, message: nil)
|
147
|
-
assert_snake_case(resource)
|
153
|
+
Naming.assert_snake_case(resource)
|
148
154
|
|
149
155
|
super(
|
150
156
|
type: NOT_VERIFIED_ERROR,
|
@@ -157,8 +163,8 @@ module Glia
|
|
157
163
|
|
158
164
|
class RemainingAssociationError < Error
|
159
165
|
def initialize(resource:, associated_resource:, message: nil)
|
160
|
-
assert_snake_case(resource)
|
161
|
-
assert_snake_case(associated_resource)
|
166
|
+
Naming.assert_snake_case(resource)
|
167
|
+
Naming.assert_snake_case(associated_resource)
|
162
168
|
|
163
169
|
default_message =
|
164
170
|
"cannot be modified/deleted because it is associated to one or more #{
|
@@ -175,20 +181,33 @@ module Glia
|
|
175
181
|
|
176
182
|
class ResourceLimitExceededError < Error
|
177
183
|
def initialize(resource:, max:, message: nil)
|
178
|
-
assert_snake_case(resource)
|
184
|
+
Naming.assert_snake_case(resource)
|
179
185
|
|
180
186
|
super(
|
181
|
-
type:
|
182
|
-
ref: create_ref(
|
187
|
+
type: RESOURCE_LIMIT_EXCEEDED_ERROR,
|
188
|
+
ref: create_ref(RESOURCE_LIMIT_EXCEEDED_ERROR),
|
183
189
|
message: message || "#{Naming.humanize(resource)} count must not exceed #{max}",
|
184
190
|
error_details: { resource: resource, max: max }
|
185
191
|
)
|
186
192
|
end
|
187
193
|
end
|
188
194
|
|
195
|
+
class ResourceMinimumNotReachedError < Error
|
196
|
+
def initialize(resource:, min:, message: nil)
|
197
|
+
Naming.assert_snake_case(resource)
|
198
|
+
|
199
|
+
super(
|
200
|
+
type: RESOURCE_MINIMUM_NOT_REACHED,
|
201
|
+
ref: create_ref(RESOURCE_MINIMUM_NOT_REACHED),
|
202
|
+
message: message || "#{Naming.humanize(resource)} count must reach at least #{min}",
|
203
|
+
error_details: { resource: resource, min: min }
|
204
|
+
)
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
189
208
|
class ResourceAlreadyExistsError < Error
|
190
209
|
def initialize(resource:, message: nil)
|
191
|
-
assert_snake_case(resource)
|
210
|
+
Naming.assert_snake_case(resource)
|
192
211
|
|
193
212
|
super(
|
194
213
|
type: RESOURCE_ALREADY_EXISTS_ERROR,
|
@@ -201,8 +220,8 @@ module Glia
|
|
201
220
|
|
202
221
|
class InvalidResourceStateError < Error
|
203
222
|
def initialize(resource:, state:, message: nil)
|
204
|
-
assert_snake_case(resource)
|
205
|
-
assert_snake_case(state)
|
223
|
+
Naming.assert_snake_case(resource)
|
224
|
+
Naming.assert_snake_case(state)
|
206
225
|
|
207
226
|
super(
|
208
227
|
type: INVALID_RESOURCE_STATE_ERROR,
|
@@ -322,6 +341,76 @@ module Glia
|
|
322
341
|
)
|
323
342
|
end
|
324
343
|
end
|
344
|
+
|
345
|
+
class HeadersValidationError < Error
|
346
|
+
def initialize(error_details:, message: nil)
|
347
|
+
raise ArgumentError, 'At least 1 error detail is required' if error_details.keys.count.zero?
|
348
|
+
|
349
|
+
error_details.each_value do |value|
|
350
|
+
raise ArgumentError, 'error_details values must be lists' unless value.is_a?(Array)
|
351
|
+
end
|
352
|
+
|
353
|
+
error_details.each_key { |key| Naming.assert_header(key) }
|
354
|
+
|
355
|
+
super(
|
356
|
+
type: HEADERS_VALIDATION_ERROR,
|
357
|
+
ref: create_ref(HEADERS_VALIDATION_ERROR),
|
358
|
+
message: message || 'Headers are invalid',
|
359
|
+
error_details: error_details
|
360
|
+
)
|
361
|
+
end
|
362
|
+
end
|
363
|
+
|
364
|
+
class FacebookAccessTokenPermissionsError < Error
|
365
|
+
def initialize(message: nil)
|
366
|
+
super(
|
367
|
+
type: FACEBOOK_ACCESS_TOKEN_PERMISSIONS_ERROR,
|
368
|
+
ref: create_ref(FACEBOOK_ACCESS_TOKEN_PERMISSIONS_ERROR),
|
369
|
+
message: message || 'Access token does not have sufficient permissions'
|
370
|
+
)
|
371
|
+
end
|
372
|
+
end
|
373
|
+
|
374
|
+
class FacebookAccessTokenNotPermanentError < Error
|
375
|
+
def initialize(message: nil)
|
376
|
+
super(
|
377
|
+
type: FACEBOOK_ACCESS_TOKEN_NOT_PERMANENT_ERROR,
|
378
|
+
ref: create_ref(FACEBOOK_ACCESS_TOKEN_NOT_PERMANENT_ERROR),
|
379
|
+
message: message || 'Access token does not yield permanent access tokens'
|
380
|
+
)
|
381
|
+
end
|
382
|
+
end
|
383
|
+
|
384
|
+
class OAuthCodeExpiredError < Error
|
385
|
+
def initialize(message: nil)
|
386
|
+
super(
|
387
|
+
type: OAUTH_CODE_EXPIRED_ERROR,
|
388
|
+
ref: create_ref(OAUTH_CODE_EXPIRED_ERROR),
|
389
|
+
message: message || 'OAuth code has expired'
|
390
|
+
)
|
391
|
+
end
|
392
|
+
end
|
393
|
+
|
394
|
+
class OAuthCodeAlreadyUsedError < Error
|
395
|
+
def initialize(message: nil)
|
396
|
+
super(
|
397
|
+
type: OAUTH_CODE_ALREADY_USED_ERROR,
|
398
|
+
ref: create_ref(OAUTH_CODE_ALREADY_USED_ERROR),
|
399
|
+
message: message || 'OAuth code has already been used'
|
400
|
+
)
|
401
|
+
end
|
402
|
+
end
|
403
|
+
|
404
|
+
class AppleBusinessChatBusinessUsedByOtherSiteError < Error
|
405
|
+
def initialize(message: nil)
|
406
|
+
super(
|
407
|
+
type: APPLE_BUSINESS_CHAT_BUSINESS_USED_BY_OTHER_SITE_ERROR,
|
408
|
+
ref: create_ref(APPLE_BUSINESS_CHAT_BUSINESS_USED_BY_OTHER_SITE_ERROR),
|
409
|
+
message: message || 'Business is already used by a channel on another site'
|
410
|
+
)
|
411
|
+
end
|
412
|
+
end
|
413
|
+
|
325
414
|
# rubocop:enable Style/Documentation
|
326
415
|
end
|
327
416
|
end
|
data/lib/glia/errors/error.rb
CHANGED
@@ -6,7 +6,6 @@ module Glia
|
|
6
6
|
module Errors
|
7
7
|
# Base error
|
8
8
|
class Error
|
9
|
-
SNAKE_CASE_REGEX = /^[a-z0-9]+(_[a-z0-9]+)*$/.freeze
|
10
9
|
attr_reader :type, :ref, :message, :error_details
|
11
10
|
|
12
11
|
def initialize(type:, ref:, message: nil, error_details: nil)
|
@@ -45,12 +44,6 @@ module Glia
|
|
45
44
|
[TrueClass, FalseClass, String, Integer, Float, Symbol].include?(details.class)
|
46
45
|
end
|
47
46
|
|
48
|
-
def assert_snake_case(value)
|
49
|
-
return if value.to_s.match(SNAKE_CASE_REGEX)
|
50
|
-
|
51
|
-
raise ArgumentError, "Expected '#{value}' to be in snake case"
|
52
|
-
end
|
53
|
-
|
54
47
|
def create_ref(type)
|
55
48
|
fragment = type.gsub('_', '-')
|
56
49
|
"https://docs.glia.com/glia-dev/reference/errors##{fragment}"
|
@@ -14,7 +14,8 @@ module Glia
|
|
14
14
|
RESOURCE_NOT_FOUND_ERROR = 'resource_not_found_error'
|
15
15
|
NOT_VERIFIED_ERROR = 'not_verified_error'
|
16
16
|
REMAINING_ASSOCIATION_ERROR = 'remaining_association_error'
|
17
|
-
|
17
|
+
RESOURCE_LIMIT_EXCEEDED_ERROR = 'resource_limit_exceeded_error'
|
18
|
+
RESOURCE_MINIMUM_NOT_REACHED = 'resource_minimum_not_reached'
|
18
19
|
RESOURCE_ALREADY_EXISTS_ERROR = 'resource_already_exists_error'
|
19
20
|
INVALID_RESOURCE_STATE_ERROR = 'invalid_resource_state_error'
|
20
21
|
AUTHORIZATION_ERROR = 'authorization_error'
|
@@ -28,6 +29,13 @@ module Glia
|
|
28
29
|
TELEPHONY_PROVIDER_QUEUE_LIMIT_EXCEEDED_ERROR = 'telephony_provider_queue_limit_exceeded_error'
|
29
30
|
TWILIO_MESSAGING_SERVICE_CONFIGURATION_ERROR = 'twilio_messaging_service_configuration_error'
|
30
31
|
UNREACHABLE_DESTINATION_ERROR = 'unreachable_destination_error'
|
32
|
+
HEADERS_VALIDATION_ERROR = 'headers_validation_error'
|
33
|
+
FACEBOOK_ACCESS_TOKEN_PERMISSIONS_ERROR = 'facebook_access_token_permissions_error'
|
34
|
+
FACEBOOK_ACCESS_TOKEN_NOT_PERMANENT_ERROR = 'facebook_access_token_not_permanent_error'
|
35
|
+
OAUTH_CODE_EXPIRED_ERROR = 'oauth_code_expired_error'
|
36
|
+
OAUTH_CODE_ALREADY_USED_ERROR = 'oauth_code_already_used_error'
|
37
|
+
APPLE_BUSINESS_CHAT_BUSINESS_USED_BY_OTHER_SITE_ERROR =
|
38
|
+
'apple_business_chat_business_used_by_other_site_error'
|
31
39
|
|
32
40
|
# Server errors
|
33
41
|
INTERNAL_SERVER_ERROR = 'internal_server_error'
|
data/lib/glia/errors/naming.rb
CHANGED
@@ -13,8 +13,8 @@ module Glia
|
|
13
13
|
upcase_first(result)
|
14
14
|
end
|
15
15
|
|
16
|
-
ABBREVIATIONS = %w[id uuid saml sip sms mms].freeze
|
17
|
-
PLURAL_ABBREVIATIONS = %w[ids uuids].freeze
|
16
|
+
ABBREVIATIONS = %w[id uuid saml sip sms mms uri url].freeze
|
17
|
+
PLURAL_ABBREVIATIONS = %w[ids uuids uris urls].freeze
|
18
18
|
|
19
19
|
private_class_method def self.upcase_if_abbreviation(value)
|
20
20
|
if ABBREVIATIONS.include?(value)
|
@@ -29,6 +29,22 @@ module Glia
|
|
29
29
|
private_class_method def self.upcase_first(value)
|
30
30
|
value[0].upcase.concat(value[1..-1])
|
31
31
|
end
|
32
|
+
|
33
|
+
SNAKE_CASE_REGEX = /\A[a-z0-9]+(_[a-z0-9]+)*\z/.freeze
|
34
|
+
|
35
|
+
def self.assert_snake_case(value)
|
36
|
+
return if value.to_s.match(SNAKE_CASE_REGEX)
|
37
|
+
|
38
|
+
raise ArgumentError, "Expected '#{value}' to be in snake case"
|
39
|
+
end
|
40
|
+
|
41
|
+
HEADER_REGEX = /\A[A-Z0-9]+[a-z0-9]*(-[A-Z0-9]+[a-zz0-9]*)*\z/.freeze
|
42
|
+
|
43
|
+
def self.assert_header(value)
|
44
|
+
return if value.to_s.match(HEADER_REGEX)
|
45
|
+
|
46
|
+
raise ArgumentError, "Expected '#{value}' to be a valid header"
|
47
|
+
end
|
32
48
|
end
|
33
49
|
end
|
34
50
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glia-errors
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Glia TechMovers
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-08-11 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: ''
|
14
14
|
email:
|