44
55module JSONAPI
66 class Renderer
7+ # @private
78 class Document
89 def initialize ( params = { } )
910 @data = params . fetch ( :data , :no_data )
@@ -13,7 +14,8 @@ def initialize(params = {})
1314 @fields = _symbolize_fields ( params [ :fields ] || { } )
1415 @jsonapi = params [ :jsonapi ]
1516 @include = JSONAPI ::IncludeDirective . new ( params [ :include ] || { } )
16- @cache = params [ :cache ]
17+ @relationship = params [ :relationship ]
18+ @cache = params [ :cache ]
1719 end
1820
1921 def to_hash
@@ -23,18 +25,24 @@ def to_hash
2325
2426 private
2527
28+ # rubocop:disable Metrics/PerceivedComplexity, Metrics/MethodLength
29+ # rubocop:disable Metrics/CyclomaticComplexity
2630 def document_hash
2731 { } . tap do |hash |
28- if @data != :no_data
32+ if @relationship
33+ hash . merge! ( relationship_hash )
34+ elsif @data != :no_data
2935 hash . merge! ( data_hash )
3036 elsif @errors . any?
3137 hash . merge! ( errors_hash )
3238 end
33- hash [ :links ] = @links if @links . any?
34- hash [ :meta ] = @meta unless @meta . nil?
35- hash [ :jsonapi ] = @jsonapi unless @jsonapi . nil?
39+ hash [ :links ] = @links if @links . any?
40+ hash [ :meta ] = @meta unless @meta . nil?
41+ hash [ :jsonapi ] = @jsonapi unless @jsonapi . nil?
3642 end
3743 end
44+ # rubocop:enable Metrics/PerceivedComplexity, Metrics/MethodLength
45+ # rubocop:enable Metrics/CyclomaticComplexity
3846
3947 def data_hash
4048 primary , included =
@@ -45,20 +53,44 @@ def data_hash
4553 end
4654 end
4755
48- def resources_processor
49- if @cache
50- CachedResourcesProcessor . new ( @cache )
51- else
52- SimpleResourcesProcessor . new
56+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
57+ def relationship_hash
58+ rel_name = @relationship . to_sym
59+ data = @data . jsonapi_related ( [ rel_name ] ) [ rel_name ]
60+ included =
61+ if @include . key? ( rel_name )
62+ resources_processor . process ( data , @include [ rel_name ] , @fields )
63+ . flatten!
64+ else
65+ [ ]
66+ end
67+
68+ res = @data . as_jsonapi ( fields : [ rel_name ] , include : [ rel_name ] )
69+ rel = res [ :relationships ] [ rel_name ]
70+ @links = rel [ :links ] . merge! ( @links )
71+ @meta ||= rel [ :meta ]
72+
73+ { } . tap do |hash |
74+ hash [ :data ] = rel [ :data ]
75+ hash [ :included ] = included if included . any?
5376 end
5477 end
78+ # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
5579
5680 def errors_hash
5781 { } . tap do |hash |
5882 hash [ :errors ] = @errors . flat_map ( &:as_jsonapi )
5983 end
6084 end
6185
86+ def resources_processor
87+ if @cache
88+ CachedResourcesProcessor . new ( @cache )
89+ else
90+ SimpleResourcesProcessor . new
91+ end
92+ end
93+
6294 def _symbolize_fields ( fields )
6395 fields . each_with_object ( { } ) do |( k , v ) , h |
6496 h [ k . to_sym ] = v . map ( &:to_sym )
0 commit comments