jsonapi.rb 1.3.3 → 1.4.0
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/Gemfile.lock +1 -1
- data/README.md +30 -0
- data/lib/jsonapi/errors.rb +40 -27
- data/lib/jsonapi/rails.rb +12 -2
- data/lib/jsonapi/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b5fdba9a2957365a5a46bcfa292bb65e4f7067ca
|
4
|
+
data.tar.gz: 4b2cd03a3045fd835f8f3461e1da9a6878fdc593
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 163a80a360a5b29b4703f8086796ceaa08043c0bd44e13b7e0c89de706d7865dcfbb482e1635a05f4bc711bf8acc2155f7722c19b3aae1aa5f23e13f2828bebf
|
7
|
+
data.tar.gz: 34a34bc75f47186a076f7a1e1707b73c73cb498320f590010913eb107d2f95d1cde79720ce34d48f9bca1dc0c0eba9067a17ce353f149bc3eaccefbf5c57f741
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -92,6 +92,25 @@ Please follow the
|
|
92
92
|
[Fast JSON API guide](https://github.com/Netflix/fast_jsonapi#serializer-definition)
|
93
93
|
on how to define a serializer.
|
94
94
|
|
95
|
+
To provide a different naming scheme implement the `jsonapi_serializer_class`
|
96
|
+
method in your resource or application controller.
|
97
|
+
|
98
|
+
Here's an example:
|
99
|
+
```ruby
|
100
|
+
class CustomNamingController < ActionController::Base
|
101
|
+
|
102
|
+
# ...
|
103
|
+
|
104
|
+
private
|
105
|
+
|
106
|
+
def jsonapi_serializer_class(resource, is_collection)
|
107
|
+
JSONAPI::Rails.serializer_class(resource, is_collection)
|
108
|
+
rescue NameError
|
109
|
+
# your serializer class naming implementation
|
110
|
+
end
|
111
|
+
end
|
112
|
+
```
|
113
|
+
|
95
114
|
#### Collection Meta
|
96
115
|
|
97
116
|
To provide meta information for a collection, provide the `jsonapi_meta`
|
@@ -121,6 +140,9 @@ when a record is not found.
|
|
121
140
|
|
122
141
|
To render the validation errors, just pass it to the error renderer.
|
123
142
|
|
143
|
+
To use an exception notifier, overwrite the
|
144
|
+
`render_jsonapi_internal_server_error` method in your controller.
|
145
|
+
|
124
146
|
Here's an example:
|
125
147
|
|
126
148
|
```ruby
|
@@ -136,6 +158,14 @@ class MyController < ActionController::Base
|
|
136
158
|
render jsonapi_errors: record.errors, status: :unprocessable_entity
|
137
159
|
end
|
138
160
|
end
|
161
|
+
|
162
|
+
private
|
163
|
+
|
164
|
+
def render_jsonapi_internal_server_error(exception)
|
165
|
+
# Call your exception notifier here. Example:
|
166
|
+
# Raven.capture_exception(exception)
|
167
|
+
super(exception)
|
168
|
+
end
|
139
169
|
end
|
140
170
|
```
|
141
171
|
|
data/lib/jsonapi/errors.rb
CHANGED
@@ -10,39 +10,52 @@ module JSONAPI
|
|
10
10
|
extend ActiveSupport::Concern
|
11
11
|
|
12
12
|
included do
|
13
|
-
rescue_from StandardError
|
14
|
-
|
15
|
-
|
16
|
-
|
13
|
+
rescue_from StandardError, with: :render_jsonapi_internal_server_error
|
14
|
+
rescue_from ActiveRecord::RecordNotFound, with: :render_jsonapi_not_found
|
15
|
+
rescue_from(
|
16
|
+
ActionController::ParameterMissing,
|
17
|
+
with: :render_jsonapi_unprocessable_entity
|
18
|
+
)
|
19
|
+
end
|
17
20
|
|
18
|
-
|
19
|
-
ActiveRecord::RecordNotFound
|
20
|
-
].each do |exception_class|
|
21
|
-
rescue_from exception_class do |exception|
|
22
|
-
error = { status: '404', title: Rack::Utils::HTTP_STATUS_CODES[404] }
|
23
|
-
render jsonapi_errors: [error], status: :not_found
|
24
|
-
end
|
25
|
-
end
|
21
|
+
private
|
26
22
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
23
|
+
# Generic error handler callback
|
24
|
+
#
|
25
|
+
# @param exception [Exception] instance to handle
|
26
|
+
# @return [String] JSONAPI error response
|
27
|
+
def render_jsonapi_internal_server_error(exception)
|
28
|
+
error = { status: '500', title: Rack::Utils::HTTP_STATUS_CODES[500] }
|
29
|
+
render jsonapi_errors: [error], status: :internal_server_error
|
30
|
+
end
|
32
31
|
|
33
|
-
|
34
|
-
|
35
|
-
|
32
|
+
# Not found (404) error handler callback
|
33
|
+
#
|
34
|
+
# @param exception [Exception] instance to handle
|
35
|
+
# @return [String] JSONAPI error response
|
36
|
+
def render_jsonapi_not_found(exception)
|
37
|
+
error = { status: '404', title: Rack::Utils::HTTP_STATUS_CODES[404] }
|
38
|
+
render jsonapi_errors: [error], status: :not_found
|
39
|
+
end
|
36
40
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
41
|
+
# Unprocessable entity (422) error handler callback
|
42
|
+
#
|
43
|
+
# @param exception [Exception] instance to handle
|
44
|
+
# @return [String] JSONAPI error response
|
45
|
+
def render_jsonapi_unprocessable_entity(exception)
|
46
|
+
source = { pointer: '' }
|
42
47
|
|
43
|
-
|
44
|
-
|
48
|
+
if !%w{data attributes relationships}.include?(exception.param.to_s)
|
49
|
+
source[:pointer] = "/data/attributes/#{exception.param}"
|
45
50
|
end
|
51
|
+
|
52
|
+
error = {
|
53
|
+
status: '422',
|
54
|
+
title: Rack::Utils::HTTP_STATUS_CODES[422],
|
55
|
+
source: source
|
56
|
+
}
|
57
|
+
|
58
|
+
render jsonapi_errors: [error], status: :unprocessable_entity
|
46
59
|
end
|
47
60
|
end
|
48
61
|
end
|
data/lib/jsonapi/rails.rb
CHANGED
@@ -39,7 +39,12 @@ module JSONAPI
|
|
39
39
|
|
40
40
|
errors = []
|
41
41
|
model = resource.instance_variable_get('@base')
|
42
|
-
|
42
|
+
|
43
|
+
if respond_to?(:jsonapi_serializer_class, true)
|
44
|
+
model_serializer = jsonapi_serializer_class(resource, false)
|
45
|
+
else
|
46
|
+
model_serializer = JSONAPI::Rails.serializer_class(model, false)
|
47
|
+
end
|
43
48
|
|
44
49
|
details = resource.messages
|
45
50
|
details = resource.details if resource.respond_to?(:details)
|
@@ -83,7 +88,12 @@ module JSONAPI
|
|
83
88
|
options[:include] ||= (
|
84
89
|
jsonapi_include if respond_to?(:jsonapi_include, true))
|
85
90
|
|
86
|
-
|
91
|
+
if respond_to?(:jsonapi_serializer_class, true)
|
92
|
+
serializer_class = jsonapi_serializer_class(resource, many)
|
93
|
+
else
|
94
|
+
serializer_class = JSONAPI::Rails.serializer_class(resource, many)
|
95
|
+
end
|
96
|
+
|
87
97
|
serializer_class.new(resource, options).serialized_json
|
88
98
|
end
|
89
99
|
end
|
data/lib/jsonapi/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsonapi.rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stas Suscov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-02-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fast_jsonapi
|