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
|
||||
|
||||
def name
|
||||
return super unless caller_locations.first.base_label == 'add_constraints'.freeze
|
||||
@constraint_name ||= super.sub("#{parent}::", ''.freeze)
|
||||
caller_locations.first.base_label == 'add_constraints'.freeze ? polymorphic_name : super
|
||||
end
|
||||
|
||||
def polymorphic_name
|
||||
@polymorfic_name ||= name.sub("#{parent}::", ''.freeze)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -10,19 +10,34 @@ module Travis::API::V3
|
|||
end
|
||||
|
||||
def owner
|
||||
return model.owner if include? 'repository.owner'.freeze
|
||||
owner_href = Renderer.href(model.owner_type.downcase.to_sym, id: model.owner_id, script_name: script_name)
|
||||
{
|
||||
:@type => model.owner_type && model.owner_type.downcase,
|
||||
:@href => owner_href,
|
||||
:id => model.owner_id,
|
||||
:login => model.owner_name
|
||||
}
|
||||
return model.owner if include_owner?
|
||||
owner_href = Renderer.href(owner_type.to_sym, id: model.owner_id, script_name: script_name)
|
||||
|
||||
if included_owner? and owner_href
|
||||
{ :@href => owner_href }
|
||||
else
|
||||
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
|
||||
|
||||
def last_build
|
||||
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,
|
||||
:@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,
|
||||
}
|
||||
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
|
||||
|
|
|
@ -47,11 +47,7 @@ describe Travis::API::V3::Services::Owner::Find do
|
|||
"active" => false,
|
||||
"private" => false,
|
||||
"last_build" => nil,
|
||||
"owner" => {
|
||||
"@type" => "organization",
|
||||
"@href" => "/v3/org/#{org.id}",
|
||||
"id" => org.id,
|
||||
"login" => "example-org"},
|
||||
"owner" => { "@href"=> "/v3/org/#{org.id}" },
|
||||
"default_branch" => {
|
||||
"@type" => "branch",
|
||||
"@href" => "/v3/repo/#{repo.id}/branch/master",
|
||||
|
@ -88,11 +84,7 @@ describe Travis::API::V3::Services::Owner::Find do
|
|||
"active" => false,
|
||||
"private" => false,
|
||||
"last_build" => nil,
|
||||
"owner" => {
|
||||
"@type" => "organization",
|
||||
"@href" => "/v3/org/#{org.id}",
|
||||
"id" => org.id,
|
||||
"login" => "example-org"},
|
||||
"owner" => { "@href"=> "/v3/org/#{org.id}" },
|
||||
"default_branch" => {
|
||||
"@type" => "branch",
|
||||
"@href" => "/v3/repo/#{repo.id}/branch/master",
|
||||
|
|
Loading…
Reference in New Issue
Block a user