Skip to content

Commit 5558dcd

Browse files
kyreevesshishirmk
authored andcommitted
allow conditional relationships
1 parent 2b01d8c commit 5558dcd

4 files changed

Lines changed: 53 additions & 6 deletions

File tree

lib/fast_jsonapi/object_serializer.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,8 @@ def create_relationship_hash(base_key, relationship_type, options, block)
221221
serializer: compute_serializer_name(options[:serializer] || base_key_sym),
222222
relationship_type: relationship_type,
223223
cached: options[:cached] || false,
224-
polymorphic: fetch_polymorphic_option(options)
224+
polymorphic: fetch_polymorphic_option(options),
225+
conditional_proc: options[:if]
225226
}
226227
end
227228

lib/fast_jsonapi/serialization_core.rb

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,14 @@ def relationships_hash(record, relationships = nil, params = {})
8282
relationships = relationships_to_serialize if relationships.nil?
8383

8484
relationships.each_with_object({}) do |(_k, relationship), hash|
85-
name = relationship[:key]
86-
empty_case = relationship[:relationship_type] == :has_many ? [] : nil
87-
hash[name] = {
88-
data: ids_hash_from_record_and_relationship(record, relationship, params) || empty_case
89-
}
85+
conditional_proc = relationship[:conditional_proc]
86+
if conditional_proc.blank? || conditional_proc.call(record, params)
87+
name = relationship[:key]
88+
empty_case = relationship[:relationship_type] == :has_many ? [] : nil
89+
hash[name] = {
90+
data: ids_hash_from_record_and_relationship(record, relationship, params) || empty_case
91+
}
92+
end
9093
end
9194
end
9295

spec/lib/object_serializer_spec.rb

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,4 +341,33 @@ class BlahSerializer
341341
expect(serializable_hash['data']['attributes'].has_key?('director')).to be_falsey
342342
end
343343
end
344+
345+
context 'when optional relationships are determined by record data' do
346+
it 'returns optional relationship when relationship is included' do
347+
json = MovieOptionalRelationshipSerializer.new(movie).serialized_json
348+
serializable_hash = JSON.parse(json)
349+
expect(serializable_hash['data']['relationships'].has_key?('actors')).to be_truthy
350+
end
351+
352+
it "doesn't return optional relationship when relationship is not included" do
353+
movie.actor_ids = []
354+
json = MovieOptionalRelationshipSerializer.new(movie).serialized_json
355+
serializable_hash = JSON.parse(json)
356+
expect(serializable_hash['data']['relationships'].has_key?('actors')).to be_falsey
357+
end
358+
end
359+
360+
context 'when optional relationships are determined by params data' do
361+
it 'returns optional relationship when relationship is included' do
362+
json = MovieOptionalRelationshipWithParamsSerializer.new(movie, { params: { admin: true }}).serialized_json
363+
serializable_hash = JSON.parse(json)
364+
expect(serializable_hash['data']['relationships'].has_key?('actors')).to be_truthy
365+
end
366+
367+
it "doesn't return optional relationship when relationship is not included" do
368+
json = MovieOptionalRelationshipWithParamsSerializer.new(movie, { params: { admin: false }}).serialized_json
369+
serializable_hash = JSON.parse(json)
370+
expect(serializable_hash['data']['relationships'].has_key?('actors')).to be_falsey
371+
end
372+
end
344373
end

spec/shared/contexts/movie_context.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,20 @@ class MovieOptionalParamsDataSerializer
292292
attributes :name
293293
attribute :director, if: Proc.new { |record, params| params && params[:admin] == true }
294294
end
295+
296+
class MovieOptionalRelationshipSerializer
297+
include FastJsonapi::ObjectSerializer
298+
set_type :movie
299+
attributes :name
300+
has_many :actors, if: Proc.new { |record| record.actors.any? }
301+
end
302+
303+
class MovieOptionalRelationshipWithParamsSerializer
304+
include FastJsonapi::ObjectSerializer
305+
set_type :movie
306+
attributes :name
307+
has_many :actors, if: Proc.new { |record, params| params && params[:admin] == true }
308+
end
295309
end
296310

297311

0 commit comments

Comments
 (0)