Skip to content

Commit 4c413b6

Browse files
authored
Merge pull request #232 from jackcasey/resource-level-links-update
Resource level links update
2 parents fa80b38 + 042206d commit 4c413b6

File tree

5 files changed

+63
-2
lines changed

5 files changed

+63
-2
lines changed

lib/graphiti/resource.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,5 +148,15 @@ def transaction
148148
end
149149
response
150150
end
151+
152+
def links?
153+
self.class.links.any?
154+
end
155+
156+
def links(model)
157+
self.class.links.each_with_object({}) do |(name, blk), memo|
158+
memo[name] = instance_exec(model, &blk)
159+
end
160+
end
151161
end
152162
end

lib/graphiti/resource/configuration.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,8 @@ def config
199199
attributes: {},
200200
extra_attributes: {},
201201
sideloads: {},
202-
callbacks: {}
202+
callbacks: {},
203+
links: {}
203204
}
204205
end
205206

@@ -238,6 +239,10 @@ def pagination
238239
def default_filters
239240
config[:default_filters]
240241
end
242+
243+
def links
244+
config[:links]
245+
end
241246
end
242247

243248
def get_attr!(name, flag, options = {})

lib/graphiti/resource/dsl.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,10 @@ def on_extra_attribute(name, &blk)
147147
end
148148
end
149149

150+
def link(name, &blk)
151+
config[:links][name.to_sym] = blk
152+
end
153+
150154
def all_attributes
151155
attributes.merge(extra_attributes)
152156
end

lib/graphiti/serializer.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def self.inherited(klass)
2525
def as_jsonapi(*)
2626
super.tap do |hash|
2727
strip_relationships!(hash) if strip_relationships?
28+
add_links!(hash)
2829
end
2930
end
3031

@@ -49,6 +50,12 @@ def respond_to_missing?(method_name, include_private = true)
4950

5051
private
5152

53+
def add_links!(hash)
54+
return unless @resource.respond_to?(:links?)
55+
56+
hash[:links] = @resource.links(@object) if @resource.links?
57+
end
58+
5259
def strip_relationships!(hash)
5360
hash[:relationships]&.select! do |name, payload|
5461
payload.key?(:data)

spec/serialization_spec.rb

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -860,7 +860,7 @@ def admin?(object)
860860
end
861861
end
862862

863-
describe "links" do
863+
describe "relationship links" do
864864
let!(:employee) { PORO::Employee.create }
865865

866866
def positions
@@ -1377,4 +1377,39 @@ def classification
13771377
end
13781378
end
13791379
end
1380+
1381+
describe "resource-level links" do
1382+
let!(:employee) { PORO::Employee.create(id: 123) }
1383+
context "by default" do
1384+
specify "are not emitted" do
1385+
render
1386+
1387+
expect(json["data"][0]).not_to have_key("links")
1388+
end
1389+
end
1390+
1391+
context "when specified" do
1392+
before do
1393+
resource.link :test_link do |model| "#{endpoint[:url]}/#{model.id}" end
1394+
end
1395+
1396+
it "links correctly" do
1397+
render
1398+
expect(json["data"][0]["links"]["test_link"])
1399+
.to eq("/poro/employees/123")
1400+
end
1401+
end
1402+
1403+
context "nil links" do
1404+
before do
1405+
resource.link :test_link do |model| nil end
1406+
end
1407+
1408+
specify "are still included" do
1409+
render
1410+
expect(json["data"][0]["links"]).to have_key("test_link")
1411+
expect(json["data"][0]["links"]["test_link"]).to eq(nil)
1412+
end
1413+
end
1414+
end
13801415
end

0 commit comments

Comments
 (0)