Skip to content

Commit 63f905a

Browse files
committed
adds params to relatinoship blocks and tests
1 parent 5b64e90 commit 63f905a

4 files changed

Lines changed: 81 additions & 18 deletions

File tree

lib/fast_jsonapi/object_serializer.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def hash_for_one_record
3939
return serializable_hash unless @resource
4040

4141
serializable_hash[:data] = self.class.record_hash(@resource, @params)
42-
serializable_hash[:included] = self.class.get_included_records(@resource, @includes, @known_included_objects) if @includes.present?
42+
serializable_hash[:included] = self.class.get_included_records(@resource, @includes, @known_included_objects, @params) if @includes.present?
4343
serializable_hash
4444
end
4545

@@ -50,7 +50,7 @@ def hash_for_collection
5050
included = []
5151
@resource.each do |record|
5252
data << self.class.record_hash(record, @params)
53-
included.concat self.class.get_included_records(record, @includes, @known_included_objects) if @includes.present?
53+
included.concat self.class.get_included_records(record, @includes, @known_included_objects, @params) if @includes.present?
5454
end
5555

5656
serializable_hash[:data] = data

lib/fast_jsonapi/serialization_core.rb

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,15 @@ def id_hash_from_record(record, record_types)
4444
id_hash(record.id, record_type)
4545
end
4646

47-
def ids_hash_from_record_and_relationship(record, relationship)
47+
def ids_hash_from_record_and_relationship(record, relationship, params = {})
4848
polymorphic = relationship[:polymorphic]
4949

5050
return ids_hash(
51-
fetch_id(record, relationship),
51+
fetch_id(record, relationship, params),
5252
relationship[:record_type]
5353
) unless polymorphic
5454

55-
return unless associated_object = fetch_associated_object(record, relationship)
55+
return unless associated_object = fetch_associated_object(record, relationship, params)
5656

5757
return associated_object.map do |object|
5858
id_hash_from_record object, polymorphic
@@ -71,14 +71,14 @@ def attributes_hash(record, params = {})
7171
end
7272
end
7373

74-
def relationships_hash(record, relationships = nil)
74+
def relationships_hash(record, relationships = nil, params = {})
7575
relationships = relationships_to_serialize if relationships.nil?
7676

7777
relationships.each_with_object({}) do |(_k, relationship), hash|
7878
name = relationship[:key]
7979
empty_case = relationship[:relationship_type] == :has_many ? [] : nil
8080
hash[name] = {
81-
data: ids_hash_from_record_and_relationship(record, relationship) || empty_case
81+
data: ids_hash_from_record_and_relationship(record, relationship, params) || empty_case
8282
}
8383
end
8484
end
@@ -89,15 +89,15 @@ def record_hash(record, params = {})
8989
temp_hash = id_hash(id_from_record(record), record_type, true)
9090
temp_hash[:attributes] = attributes_hash(record, params) if attributes_to_serialize.present?
9191
temp_hash[:relationships] = {}
92-
temp_hash[:relationships] = relationships_hash(record, cachable_relationships_to_serialize) if cachable_relationships_to_serialize.present?
92+
temp_hash[:relationships] = relationships_hash(record, cachable_relationships_to_serialize, params) if cachable_relationships_to_serialize.present?
9393
temp_hash
9494
end
95-
record_hash[:relationships] = record_hash[:relationships].merge(relationships_hash(record, uncachable_relationships_to_serialize)) if uncachable_relationships_to_serialize.present?
95+
record_hash[:relationships] = record_hash[:relationships].merge(relationships_hash(record, uncachable_relationships_to_serialize, params)) if uncachable_relationships_to_serialize.present?
9696
record_hash
9797
else
9898
record_hash = id_hash(id_from_record(record), record_type, true)
9999
record_hash[:attributes] = attributes_hash(record, params) if attributes_to_serialize.present?
100-
record_hash[:relationships] = relationships_hash(record) if relationships_to_serialize.present?
100+
record_hash[:relationships] = relationships_hash(record, nil, params) if relationships_to_serialize.present?
101101
record_hash
102102
end
103103
end
@@ -115,9 +115,9 @@ def to_json(payload)
115115

116116
# includes handler
117117

118-
def get_included_records(record, includes_list, known_included_objects)
118+
def get_included_records(record, includes_list, known_included_objects, params = {})
119119
includes_list.each_with_object([]) do |item, included_records|
120-
included_objects = fetch_associated_object(record, @relationships_to_serialize[item])
120+
included_objects = fetch_associated_object(record, @relationships_to_serialize[item], params)
121121
next if included_objects.blank?
122122

123123
record_type = @relationships_to_serialize[item][:record_type]
@@ -128,19 +128,19 @@ def get_included_records(record, includes_list, known_included_objects)
128128
code = "#{record_type}_#{inc_obj.id}"
129129
next if known_included_objects.key?(code)
130130
known_included_objects[code] = inc_obj
131-
included_records << serializer.record_hash(inc_obj)
131+
included_records << serializer.record_hash(inc_obj, params)
132132
end
133133
end
134134
end
135135

136-
def fetch_associated_object(record, relationship)
137-
return relationship[:object_block].call(record) unless relationship[:object_block].nil?
136+
def fetch_associated_object(record, relationship, params)
137+
return relationship[:object_block].call(record, params) unless relationship[:object_block].nil?
138138
record.send(relationship[:object_method_name])
139139
end
140140

141-
def fetch_id(record, relationship)
141+
def fetch_id(record, relationship, params)
142142
unless relationship[:object_block].nil?
143-
object = relationship[:object_block].call(record)
143+
object = relationship[:object_block].call(record, params)
144144

145145
return object.map(&:id) if object.respond_to? :map
146146
return object.id

spec/lib/object_serializer_param_spec.rb renamed to spec/lib/object_serializer_attribute_param_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class MovieSerializer
2323
end
2424
end
2525

26-
class User < Struct.new(:viewed); end
26+
User = Struct.new(:viewed)
2727
end
2828

2929
after(:context) do
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
require 'spec_helper'
2+
3+
describe FastJsonapi::ObjectSerializer do
4+
include_context 'movie class'
5+
6+
context "params option" do
7+
let(:hash) { serializer.serializable_hash }
8+
9+
before(:context) do
10+
class MovieSerializer
11+
has_many :agencies do |movie, params|
12+
movie.actors.map(&:agency) if params[:authorized]
13+
end
14+
15+
belongs_to :primary_agency do |movie, params|
16+
movie.actors.map(&:agency)[0] if params[:authorized]
17+
end
18+
19+
belongs_to :secondary_agency do |movie|
20+
movie.actors.map(&:agency)[1]
21+
end
22+
end
23+
end
24+
25+
context "passing params to the serializer" do
26+
let(:params) { {authorized: true} }
27+
let(:options_with_params) { {params: params} }
28+
29+
context "with a single record" do
30+
let(:serializer) { MovieSerializer.new(movie, options_with_params) }
31+
32+
it "handles relationships that use params" do
33+
ids = hash[:data][:relationships][:agencies][:data].map{|a| a[:id]}
34+
ids.map!(&:to_i)
35+
expect(ids).to eq [0,1,2]
36+
end
37+
38+
it "handles relationships that don't use params" do
39+
expect(hash[:data][:relationships][:secondary_agency][:data]).to include({id: 1.to_s})
40+
end
41+
end
42+
43+
context "with a list of records" do
44+
let(:movies) { build_movies(3) }
45+
let(:params) { {authorized: true} }
46+
let(:serializer) { MovieSerializer.new(movies, options_with_params) }
47+
48+
it "handles relationship params when passing params to a list of resources" do
49+
relationships_hashes = hash[:data].map{|a| a[:relationships][:agencies][:data]}.uniq.flatten
50+
expect(relationships_hashes.map{|a| a[:id].to_i}).to contain_exactly 0,1,2
51+
52+
uniq_count = hash[:data].map{|a| a[:relationships][:primary_agency] }.uniq.count
53+
expect(uniq_count).to eq 1
54+
end
55+
56+
it "handles relationships without params" do
57+
uniq_count = hash[:data].map{|a| a[:relationships][:secondary_agency] }.uniq.count
58+
expect(uniq_count).to eq 1
59+
end
60+
end
61+
end
62+
end
63+
end

0 commit comments

Comments
 (0)