v3: don't have recursive recursiveness trigger endless db queries, fixes travis-pro/team-teal#497
This commit is contained in:
parent
3dc1c5b486
commit
716bd1f8e6
|
@ -54,7 +54,13 @@ module Travis::API::V3
|
||||||
|
|
||||||
def includes?(key)
|
def includes?(key)
|
||||||
@includes ||= @params['include'.freeze].to_s.split(?,.freeze)
|
@includes ||= @params['include'.freeze].to_s.split(?,.freeze)
|
||||||
|
key = key.to_s if key.is_a? Symbol
|
||||||
|
|
||||||
|
if key.is_a? String
|
||||||
key.include?(?.) ? @includes.include?(key) : @includes.any? { |k| k.start_with? key }
|
key.include?(?.) ? @includes.include?(key) : @includes.any? { |k| k.start_with? key }
|
||||||
|
else
|
||||||
|
@includes.any? { |k| key === k }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def bool(value)
|
def bool(value)
|
||||||
|
|
|
@ -21,13 +21,14 @@ module Travis::API::V3
|
||||||
available_attributes << value
|
available_attributes << value
|
||||||
end
|
end
|
||||||
|
|
||||||
attr_reader :href, :options, :list, :included, :meta_data
|
attr_reader :href, :options, :list, :included, :include, :meta_data
|
||||||
|
|
||||||
def initialize(list, href: nil, included: [], meta_data: {}, **options)
|
def initialize(list, href: nil, included: [], include: [], meta_data: {}, **options)
|
||||||
@href = href
|
@href = href
|
||||||
@options = options
|
@options = options
|
||||||
@list = list
|
@list = list
|
||||||
@included = included
|
@included = included
|
||||||
|
@include = include
|
||||||
@meta_data = meta_data
|
@meta_data = meta_data
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -49,13 +50,18 @@ module Travis::API::V3
|
||||||
result = fields
|
result = fields
|
||||||
included = self.included.dup
|
included = self.included.dup
|
||||||
result[collection_key] = list.map do |entry|
|
result[collection_key] = list.map do |entry|
|
||||||
rendered = render_entry(entry, included: included, mode: representation, **options)
|
rendered = render_entry(entry, included: included, include: filtered_include, mode: representation, **options)
|
||||||
included << entry
|
included << entry
|
||||||
rendered
|
rendered
|
||||||
end
|
end
|
||||||
result
|
result
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def filtered_include
|
||||||
|
key = collection_key.to_s
|
||||||
|
include.reject { |entry| entry.split(?..freeze, 2).last == key }
|
||||||
|
end
|
||||||
|
|
||||||
def representation
|
def representation
|
||||||
:standard
|
:standard
|
||||||
end
|
end
|
||||||
|
|
|
@ -89,6 +89,12 @@ describe Travis::API::V3::Services::Repositories::ForCurrentUser do
|
||||||
}}
|
}}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "don't nest list of repositories inside a list of repositories even if the user asks for it. user has no idea what they are doing" do
|
||||||
|
before { get("/v3/repos?include=user.repositories", {}, headers) }
|
||||||
|
example { expect(last_response).to be_ok }
|
||||||
|
example { expect(JSON.load(body)['repositories'].first['owner']['repositories']).to be_nil }
|
||||||
|
end
|
||||||
|
|
||||||
describe "filter: private=false" do
|
describe "filter: private=false" do
|
||||||
before { get("/v3/repos", {"repository.private" => "false"}, headers) }
|
before { get("/v3/repos", {"repository.private" => "false"}, headers) }
|
||||||
example { expect(last_response) .to be_ok }
|
example { expect(last_response) .to be_ok }
|
||||||
|
|
Loading…
Reference in New Issue
Block a user