@@ -3,23 +3,33 @@ module Serializers
33 class Validation
44 attr_reader :object
55
6- def initialize ( object )
6+ def initialize ( object , relationship_params , relationship_message = { } )
77 @object = object
8+ @relationship_params = relationship_params || { }
9+ @relationship_message = relationship_message
810 end
911
1012 def errors
11- object . errors . to_hash . map do |attribute , messages |
13+ return [ ] unless object . respond_to? ( :errors )
14+
15+ all_errors = object . errors . to_hash . map do |attribute , messages |
1216 messages . map do |message |
17+ meta = { attribute : attribute , message : message } . merge ( @relationship_message )
18+ meta = { relationship : meta } if @relationship_message . present?
1319 {
1420 code : 'unprocessable_entity' ,
1521 status : '422' ,
1622 title : 'Validation Error' ,
1723 detail : "#{ attribute . capitalize } #{ message } " ,
1824 source : { pointer : pointer_for ( object , attribute ) } ,
19- meta : { attribute : attribute , message : message }
25+ meta : meta
2026 }
2127 end
2228 end . flatten
29+ all_errors << relationship_errors ( @relationship_params )
30+ all_errors . flatten!
31+ all_errors . compact!
32+ all_errors
2333 end
2434
2535 def relationship? ( name )
@@ -49,6 +59,28 @@ def pointer_for(object, name)
4959 def activerecord?
5060 object . is_a? ( ActiveRecord ::Base )
5161 end
62+
63+ def relationship_errors ( relationship_params )
64+ errors = [ ]
65+ relationship_params . each_pair do |name , payload |
66+ related = Array ( @object . send ( name ) )
67+ related . each do |r |
68+ if payload . is_a? ( Array )
69+ related_payload = payload . find { |p | p [ :meta ] [ :temp_id ] === r . instance_variable_get ( :@_jsonapi_temp_id ) || p [ :meta ] [ :id ] == r . id }
70+ else
71+ related_payload = payload
72+ end
73+ relationship_message = {
74+ name : name ,
75+ id : r . id ,
76+ :'temp-id' => r . instance_variable_get ( :@_jsonapi_temp_id )
77+ }
78+
79+ errors << Validation . new ( r , related_payload [ :relationships ] , relationship_message ) . errors
80+ end
81+ end
82+ errors
83+ end
5284 end
5385 end
5486end
0 commit comments