1
+ require 'jsonapi'
2
+
1
3
module ActiveModelSerializers
2
4
module Adapter
3
5
class JsonApi
4
6
# NOTE(Experimental):
5
7
# This is an experimental feature. Both the interface and internals could be subject
6
8
# to changes.
7
9
module Deserialization
8
- InvalidDocument = Class . new ( ArgumentError )
9
-
10
10
module_function
11
11
12
12
# Transform a JSON API document, containing a single data object,
@@ -74,21 +74,21 @@ module Deserialization
74
74
#
75
75
def parse! ( document , options = { } )
76
76
parse ( document , options ) do |invalid_payload , reason |
77
- fail InvalidDocument , "Invalid payload (#{ reason } ): #{ invalid_payload } "
77
+ fail JSONAPI :: Parser :: InvalidDocument , "Invalid payload (#{ reason } ): #{ invalid_payload } "
78
78
end
79
79
end
80
80
81
81
# Same as parse!, but returns an empty hash instead of raising InvalidDocument
82
82
# on invalid payloads.
83
83
def parse ( document , options = { } )
84
- document = document . dup . permit! . to_h if document . is_a? ( ActionController ::Parameters )
85
-
86
- validate_payload ( document ) do |invalid_document , reason |
87
- yield invalid_document , reason if block_given?
88
- return { }
89
- end
84
+ document = JSONAPI . parse ( document , options )
85
+ document = document . to_hash
90
86
91
87
primary_data = document [ 'data' ]
88
+
89
+ # null data is allowed, as per the JSON API Schema
90
+ return { } unless primary_data
91
+
92
92
attributes = primary_data [ 'attributes' ] || { }
93
93
attributes [ 'id' ] = primary_data [ 'id' ] if primary_data [ 'id' ]
94
94
relationships = primary_data [ 'relationships' ] || { }
@@ -101,43 +101,11 @@ def parse(document, options = {})
101
101
hash . merge! ( parse_relationships ( relationships , options ) )
102
102
103
103
hash
104
- end
105
-
106
- # Checks whether a payload is compliant with the JSON API spec.
107
- #
108
- # @api private
109
- # rubocop:disable Metrics/CyclomaticComplexity
110
- def validate_payload ( payload )
111
- unless payload . is_a? ( Hash )
112
- yield payload , 'Expected hash'
113
- return
114
- end
115
104
116
- primary_data = payload [ 'data' ]
117
- unless primary_data . is_a? ( Hash )
118
- yield payload , { data : 'Expected hash' }
119
- return
120
- end
121
-
122
- attributes = primary_data [ 'attributes' ] || { }
123
- unless attributes . is_a? ( Hash )
124
- yield payload , { data : { attributes : 'Expected hash or nil' } }
125
- return
126
- end
127
-
128
- relationships = primary_data [ 'relationships' ] || { }
129
- unless relationships . is_a? ( Hash )
130
- yield payload , { data : { relationships : 'Expected hash or nil' } }
131
- return
132
- end
133
-
134
- relationships . each do |( key , value ) |
135
- unless value . is_a? ( Hash ) && value . key? ( 'data' )
136
- yield payload , { data : { relationships : { key => 'Expected hash with :data key' } } }
137
- end
138
- end
105
+ rescue JSONAPI ::Parser ::InvalidDocument
106
+ return { } unless block_given?
107
+ yield
139
108
end
140
- # rubocop:enable Metrics/CyclomaticComplexity
141
109
142
110
# @api private
143
111
def filter_fields ( fields , options )
@@ -205,7 +173,7 @@ def parse_relationships(relationships, options)
205
173
# @api private
206
174
def transform_keys ( hash , options )
207
175
transform = options [ :key_transform ] || :underscore
208
- KeyTransform . send ( transform , hash )
176
+ CaseTransform . send ( transform , hash )
209
177
end
210
178
end
211
179
end
0 commit comments