API v3: better eager loading and recursion detection for denormalized relations
This commit is contained in:
parent
ae31a57541
commit
3730dc74df
|
@ -29,8 +29,11 @@ module Travis::API::V3
|
||||||
end
|
end
|
||||||
|
|
||||||
def name
|
def name
|
||||||
return super unless caller_locations.first.base_label == 'add_constraints'.freeze
|
caller_locations.first.base_label == 'add_constraints'.freeze ? polymorphic_name : super
|
||||||
@constraint_name ||= super.sub("#{parent}::", ''.freeze)
|
end
|
||||||
|
|
||||||
|
def polymorphic_name
|
||||||
|
@polymorfic_name ||= name.sub("#{parent}::", ''.freeze)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -10,19 +10,34 @@ module Travis::API::V3
|
||||||
end
|
end
|
||||||
|
|
||||||
def owner
|
def owner
|
||||||
return model.owner if include? 'repository.owner'.freeze
|
return model.owner if include_owner?
|
||||||
owner_href = Renderer.href(model.owner_type.downcase.to_sym, id: model.owner_id, script_name: script_name)
|
owner_href = Renderer.href(owner_type.to_sym, id: model.owner_id, script_name: script_name)
|
||||||
{
|
|
||||||
:@type => model.owner_type && model.owner_type.downcase,
|
if included_owner? and owner_href
|
||||||
:@href => owner_href,
|
{ :@href => owner_href }
|
||||||
:id => model.owner_id,
|
else
|
||||||
:login => model.owner_name
|
result = { :@type => owner_type, :id => model.owner_id, :login => model.owner_name }
|
||||||
}
|
result[:@href] = owner_href if owner_href
|
||||||
|
result
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def include_owner?
|
||||||
|
return true if include? 'repository.owner'.freeze
|
||||||
|
return true if include.any? { |i| i.start_with? owner_type or i.start_with? 'owner'.freeze }
|
||||||
|
end
|
||||||
|
|
||||||
|
def included_owner?
|
||||||
|
included.any? { |i| i.is_a? Model and i.class.polymorphic_name == model.owner_type and i.id == model.owner_id }
|
||||||
|
end
|
||||||
|
|
||||||
|
def owner_type
|
||||||
|
@owner_type ||= model.owner_type.downcase if model.owner_type
|
||||||
end
|
end
|
||||||
|
|
||||||
def last_build
|
def last_build
|
||||||
return nil unless model.last_build_id
|
return nil unless model.last_build_id
|
||||||
return model.last_build if include? 'repository.last_build'.freeze
|
return model.last_build if include_last_build?
|
||||||
{
|
{
|
||||||
:@type => 'build'.freeze,
|
:@type => 'build'.freeze,
|
||||||
:@href => Renderer.href(:build, script_name: script_name, id: model.last_build_id),
|
:@href => Renderer.href(:build, script_name: script_name, id: model.last_build_id),
|
||||||
|
@ -34,5 +49,11 @@ module Travis::API::V3
|
||||||
:finished_at => model.last_build_finished_at,
|
:finished_at => model.last_build_finished_at,
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def include_last_build?
|
||||||
|
return true if include? 'repository.last_build'.freeze
|
||||||
|
return true if include.any? { |i| i.start_with? 'build.'.freeze }
|
||||||
|
return true if included.any? { |i| i.is_a? Models::Build and i.id == model.last_build_id }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -47,11 +47,7 @@ describe Travis::API::V3::Services::Owner::Find do
|
||||||
"active" => false,
|
"active" => false,
|
||||||
"private" => false,
|
"private" => false,
|
||||||
"last_build" => nil,
|
"last_build" => nil,
|
||||||
"owner" => {
|
"owner" => { "@href"=> "/v3/org/#{org.id}" },
|
||||||
"@type" => "organization",
|
|
||||||
"@href" => "/v3/org/#{org.id}",
|
|
||||||
"id" => org.id,
|
|
||||||
"login" => "example-org"},
|
|
||||||
"default_branch" => {
|
"default_branch" => {
|
||||||
"@type" => "branch",
|
"@type" => "branch",
|
||||||
"@href" => "/v3/repo/#{repo.id}/branch/master",
|
"@href" => "/v3/repo/#{repo.id}/branch/master",
|
||||||
|
@ -88,11 +84,7 @@ describe Travis::API::V3::Services::Owner::Find do
|
||||||
"active" => false,
|
"active" => false,
|
||||||
"private" => false,
|
"private" => false,
|
||||||
"last_build" => nil,
|
"last_build" => nil,
|
||||||
"owner" => {
|
"owner" => { "@href"=> "/v3/org/#{org.id}" },
|
||||||
"@type" => "organization",
|
|
||||||
"@href" => "/v3/org/#{org.id}",
|
|
||||||
"id" => org.id,
|
|
||||||
"login" => "example-org"},
|
|
||||||
"default_branch" => {
|
"default_branch" => {
|
||||||
"@type" => "branch",
|
"@type" => "branch",
|
||||||
"@href" => "/v3/repo/#{repo.id}/branch/master",
|
"@href" => "/v3/repo/#{repo.id}/branch/master",
|
||||||
|
|
Loading…
Reference in New Issue
Block a user