jsonapi_errors_handler 0.0.1 → 0.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 +4 -4
- data/README.md +26 -5
- data/jsonapi_errors_handler-0.0.1.gem +0 -0
- data/lib/jsonapi_errors_handler.rb +40 -1
- data/lib/jsonapi_errors_handler/error_mapper.rb +15 -0
- data/lib/jsonapi_errors_handler/error_searializer.rb +26 -0
- data/lib/jsonapi_errors_handler/errors.rb +11 -0
- data/lib/jsonapi_errors_handler/errors/forbidden.rb +16 -0
- data/lib/jsonapi_errors_handler/errors/invalid.rb +28 -0
- data/lib/jsonapi_errors_handler/errors/not_found.rb +17 -0
- data/lib/jsonapi_errors_handler/errors/standard_error.rb +33 -0
- data/lib/jsonapi_errors_handler/errors/unauthorized.rb +16 -0
- data/lib/jsonapi_errors_handler/version.rb +1 -1
- metadata +11 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 14dce3e97fbd94737b08f9c1d52b5637f38f81e347589a9cee9f095305dab36a
|
4
|
+
data.tar.gz: 95774806d217b6d842edbd8fb40dbf1cf2b391869b838a40df5dbf406ef357d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 27beb749c4762b1348e333fa5553e4f03abeef2f2098493cf8ddadbd6ba3e40f8e8ce3f89bd04b7c28db4f8b68e800017edbac601409cf4f72e32da56aeac303
|
7
|
+
data.tar.gz: d432bb2937e6acd84442175d66dc17279e473ab291eb87bc5633740b08669b3e7e0547f9a15a32909942dedc98131b24475b89b4d68c705db3a35560234c37bd
|
data/README.md
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
# JsonapiErrorsHandler
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
TODO: Delete this and the text above, and describe your gem
|
3
|
+
A convienient way to serialize errors in JsonAPI format (https://jsonapi.org)
|
6
4
|
|
7
5
|
## Installation
|
8
6
|
|
@@ -22,7 +20,30 @@ Or install it yourself as:
|
|
22
20
|
|
23
21
|
## Usage
|
24
22
|
|
25
|
-
|
23
|
+
In your controller:
|
24
|
+
|
25
|
+
```
|
26
|
+
include JsonapiErrorsHandler
|
27
|
+
```
|
28
|
+
|
29
|
+
From this point you'll have default html errors being serialized. JsonapiErrorsHandler offers 4 predefined errors:
|
30
|
+
- JsonapiErrorsHandler::Errors::Invalid
|
31
|
+
- JsonapiErrorsHandler::Errors::Forbidden
|
32
|
+
- JsonapiErrorsHandler::Errors::NotFound
|
33
|
+
- JsonapiErrorsHandler::Errors::Unauthorized
|
34
|
+
|
35
|
+
If you rise any of errors above in any place of your application, client gets the nicely formatted error message instead of 500
|
36
|
+
|
37
|
+
### Custom errors mapping
|
38
|
+
|
39
|
+
If you want your custom errors being handled by default, just add them to th emapper
|
40
|
+
|
41
|
+
```
|
42
|
+
ErrorsMapper.map_errors!({
|
43
|
+
'ActiveRecord::RecordNotFound' => 'JsonapiErrorsHandler::Errors::NotFound',
|
44
|
+
'ActiveRecord::RecordInvalid' => 'JsonapiErrorsHandler::Errors::Invalid',
|
45
|
+
})
|
46
|
+
```
|
26
47
|
|
27
48
|
## Development
|
28
49
|
|
@@ -32,7 +53,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
32
53
|
|
33
54
|
## Contributing
|
34
55
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
56
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/driggl/jsonapi_errors_handler.
|
36
57
|
|
37
58
|
## License
|
38
59
|
|
Binary file
|
@@ -1,5 +1,44 @@
|
|
1
1
|
require "jsonapi_errors_handler/version"
|
2
|
+
require "jsonapi_errors_handler/error_mapper"
|
3
|
+
require "jsonapi_errors_handler/error_serializer"
|
2
4
|
|
3
5
|
module JsonapiErrorsHandler
|
4
|
-
|
6
|
+
def self.included(base)
|
7
|
+
base.extend ClassMethods
|
8
|
+
base.class_eval do
|
9
|
+
ErrorsMapper.map_errors!({
|
10
|
+
'JsonapiErrorsHandler::Errors::Invalid' => 'JsonapiErrorsHandler::Errors::Invalid',
|
11
|
+
'JsonapiErrorsHandler::Errors::Forbidden' => 'JsonapiErrorsHandler::Errors::Forbidden',
|
12
|
+
'JsonapiErrorsHandler::Errors::NotFound' => 'JsonapiErrorsHandler::Errors::NotFound',
|
13
|
+
'JsonapiErrorsHandler::Errors::Unauthorized' => 'JsonapiErrorsHandler::Errors::Unauthorized'
|
14
|
+
})
|
15
|
+
|
16
|
+
rescue_from(::StandardError, with: lambda { |e| handle_error(e) })
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
module ClassMethods
|
21
|
+
def handle_error(e)
|
22
|
+
mapped = map_error(e)
|
23
|
+
unless Rails.env.development?
|
24
|
+
# notify about unexpected_error unless mapped
|
25
|
+
mapped ||= ::JsonapiErrorsHandler::Errors::StandardError.new
|
26
|
+
end
|
27
|
+
if mapped
|
28
|
+
render_error(mapped)
|
29
|
+
else
|
30
|
+
raise e
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def map_error(e)
|
35
|
+
error_klass = e.class.name
|
36
|
+
return e if ErrorsMapper.mapped_error?(error_klass)
|
37
|
+
ErrorsMapper.mapped_errors[error_klass]&.constantize&.new
|
38
|
+
end
|
39
|
+
|
40
|
+
def render_error(error)
|
41
|
+
render json: ::JsonapiErrorHandler::ErrorSerializer.new(error), status: error.status
|
42
|
+
end
|
43
|
+
end
|
5
44
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module JsonapiErrorsHandler
|
2
|
+
class ErrorMapper
|
3
|
+
cattr_accessor :mapped_errors
|
4
|
+
|
5
|
+
def self.map_errors!(errors_hash={})
|
6
|
+
@@mapped_errors ||= {}
|
7
|
+
@@mapped_errors.merge!(errors_hash)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.mapped_error?(error_klass)
|
11
|
+
mapped_errors.values.include?(error_klass)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module JsonapiErrorsHandler
|
2
|
+
class ErrorSerializer
|
3
|
+
def initialize(error)
|
4
|
+
@error = error
|
5
|
+
end
|
6
|
+
|
7
|
+
def to_h
|
8
|
+
serializable_hash
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_json(payload)
|
12
|
+
to_h.to_json
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def serializable_hash
|
18
|
+
{
|
19
|
+
errors: Array.wrap(error.serializable_hash)
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
attr_reader :error
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,11 @@
|
|
1
|
+
module JsonapiErrorsHandler
|
2
|
+
module Errors
|
3
|
+
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
require_dependency 'jsonapi_errors_handler/errors/standard_error'
|
8
|
+
require_dependency 'jsonapi_errors_handler/errors/forbidden'
|
9
|
+
require_dependency 'jsonapi_errors_handler/errors/invalid'
|
10
|
+
require_dependency 'jsonapi_errors_handler/errors/not_found'
|
11
|
+
require_dependency 'jsonapi_errors_handler/errors/unauthorized'
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JsonapiErrorsHandler
|
4
|
+
module Errors
|
5
|
+
class Forbidden < ::JsonapiErrorsHandler::Errors::StandardError
|
6
|
+
def initialize(message: nil)
|
7
|
+
super(
|
8
|
+
title: "Forbidden request",
|
9
|
+
status: 403,
|
10
|
+
detail: message || "You have no rights to access this resource",
|
11
|
+
source: { pointer: "/request/headers/authorization" }
|
12
|
+
)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JsonapiErrorsHandler
|
4
|
+
module Errors
|
5
|
+
class Invalid < ::JsonapiErrorsHandler::Errors::StandardError
|
6
|
+
def initialize(errors: {})
|
7
|
+
@errors = errors
|
8
|
+
@status = 422
|
9
|
+
@title = "Invalid request"
|
10
|
+
end
|
11
|
+
|
12
|
+
def serializable_hash
|
13
|
+
errors.reduce([]) do |r, (att, msg)|
|
14
|
+
r << {
|
15
|
+
status: status,
|
16
|
+
title: title,
|
17
|
+
detail: msg,
|
18
|
+
source: { pointer: "/data/attributes/#{att}" }
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
attr_reader :errors
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JsonapiErrorsHandler
|
4
|
+
module Errors
|
5
|
+
class NotFound < ::JsonapiErrorsHandler::Errors::StandardError
|
6
|
+
def initialize(message: nil)
|
7
|
+
super(
|
8
|
+
title: "Record not Found",
|
9
|
+
status: 404,
|
10
|
+
detail: "We could not find the object you were looking for.",
|
11
|
+
source: { pointer: "/request/url/:id" }
|
12
|
+
)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JsonapiErrorsHandler
|
4
|
+
module Errors
|
5
|
+
class StandardError < ::StandardError
|
6
|
+
def initialize(title: nil, detail: nil, status: nil, source: {})
|
7
|
+
@title = title || "Something went wrong"
|
8
|
+
@detail = detail || "We encountered unexpected error, but our developers had been already notified about it"
|
9
|
+
@status = status || 500
|
10
|
+
@source = source.deep_stringify_keys
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_h
|
14
|
+
{
|
15
|
+
status: status,
|
16
|
+
title: title,
|
17
|
+
detail: detail,
|
18
|
+
source: source
|
19
|
+
}
|
20
|
+
end
|
21
|
+
|
22
|
+
def serializable_hash
|
23
|
+
to_h
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_s
|
27
|
+
to_h.to_s
|
28
|
+
end
|
29
|
+
|
30
|
+
attr_reader :title, :detail, :status, :source
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module JsonapiErrorsHandler
|
4
|
+
module Errors
|
5
|
+
class Unauthorized < ::JsonapiErrorsHandler::Errors::StandardError
|
6
|
+
def initialize(message: nil)
|
7
|
+
super(
|
8
|
+
title: "Unauthorized",
|
9
|
+
status: 401,
|
10
|
+
detail: message || "You need to login to authorize this request.",
|
11
|
+
source: { pointer: "/request/headers/authorization" }
|
12
|
+
)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsonapi_errors_handler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sebastian Wilgosz
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-03-
|
11
|
+
date: 2019-03-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -71,8 +71,17 @@ files:
|
|
71
71
|
- bin/console
|
72
72
|
- bin/setup
|
73
73
|
- jsonapi_errors_handler-0.0.0.gem
|
74
|
+
- jsonapi_errors_handler-0.0.1.gem
|
74
75
|
- jsonapi_errors_handler.gemspec
|
75
76
|
- lib/jsonapi_errors_handler.rb
|
77
|
+
- lib/jsonapi_errors_handler/error_mapper.rb
|
78
|
+
- lib/jsonapi_errors_handler/error_searializer.rb
|
79
|
+
- lib/jsonapi_errors_handler/errors.rb
|
80
|
+
- lib/jsonapi_errors_handler/errors/forbidden.rb
|
81
|
+
- lib/jsonapi_errors_handler/errors/invalid.rb
|
82
|
+
- lib/jsonapi_errors_handler/errors/not_found.rb
|
83
|
+
- lib/jsonapi_errors_handler/errors/standard_error.rb
|
84
|
+
- lib/jsonapi_errors_handler/errors/unauthorized.rb
|
76
85
|
- lib/jsonapi_errors_handler/version.rb
|
77
86
|
homepage: https://github.com/driggl/jsonapi_error_handler
|
78
87
|
licenses:
|