@@ -3,23 +3,33 @@ module Serializers
3
3
class Validation
4
4
attr_reader :object
5
5
6
- def initialize ( object )
6
+ def initialize ( object , relationship_params , relationship_message = { } )
7
7
@object = object
8
+ @relationship_params = relationship_params || { }
9
+ @relationship_message = relationship_message
8
10
end
9
11
10
12
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 |
12
16
messages . map do |message |
17
+ meta = { attribute : attribute , message : message } . merge ( @relationship_message )
18
+ meta = { relationship : meta } if @relationship_message . present?
13
19
{
14
20
code : 'unprocessable_entity' ,
15
21
status : '422' ,
16
22
title : 'Validation Error' ,
17
23
detail : "#{ attribute . capitalize } #{ message } " ,
18
24
source : { pointer : pointer_for ( object , attribute ) } ,
19
- meta : { attribute : attribute , message : message }
25
+ meta : meta
20
26
}
21
27
end
22
28
end . flatten
29
+ all_errors << relationship_errors ( @relationship_params )
30
+ all_errors . flatten!
31
+ all_errors . compact!
32
+ all_errors
23
33
end
24
34
25
35
def relationship? ( name )
@@ -49,6 +59,28 @@ def pointer_for(object, name)
49
59
def activerecord?
50
60
object . is_a? ( ActiveRecord ::Base )
51
61
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
52
84
end
53
85
end
54
86
end
0 commit comments