From: Jean-Philippe Lang Date: Sat, 11 Dec 2010 10:19:11 +0000 (+0000) Subject: Makes some attributes optional in API response to get faster/lightweight responses. X-Git-Tag: 1.1.0~110 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=5f57bceabbdccb9e13dd2f0a0a52a0e7fa704c6e;p=redmine.git Makes some attributes optional in API response to get faster/lightweight responses. These attributes are not required for common uses case (eg. updating an object). They can be requested in the reponse using the 'include' parameter. Example GET /issues/1.xml?include=journals. The list of attributes that can be included in responses will be documented in the wiki. git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@4486 e93f8b46-1217-0410-a6f0-8f06a7374b81 --- diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 21eff8ca7..bd13b4508 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -866,6 +866,16 @@ module ApplicationHelper def favicon "" end + + # Returns true if arg is expected in the API response + def include_in_api_response?(arg) + unless @included_in_api_response + param = params[:include] + @included_in_api_response = param.is_a?(Array) ? param.collect(&:to_s) : param.to_s.split(',') + @included_in_api_response.collect!(&:strip) + end + @included_in_api_response.include?(arg.to_s) + end private diff --git a/app/views/issues/show.api.rsb b/app/views/issues/show.api.rsb index 9f0d59e8d..a724df10d 100644 --- a/app/views/issues/show.api.rsb +++ b/app/views/issues/show.api.rsb @@ -25,13 +25,13 @@ api.issue do api.created_on @issue.created_on api.updated_on @issue.updated_on - render_api_issue_children(@issue, api) + render_api_issue_children(@issue, api) if include_in_api_response?('children') api.array :relations do @issue.relations.select {|r| r.other_issue(@issue).visible? }.each do |relation| api.relation(:id => relation.id, :issue_id => relation.other_issue(@issue).id, :relation_type => relation.relation_type_for(@issue), :delay => relation.delay) end - end + end if include_in_api_response?('relations') api.array :changesets do @issue.changesets.each do |changeset| @@ -41,7 +41,7 @@ api.issue do api.committed_on changeset.committed_on end end - end if User.current.allowed_to?(:view_changesets, @project) && @issue.changesets.any? + end if include_in_api_response?('changesets') && User.current.allowed_to?(:view_changesets, @project) api.array :journals do @issue.journals.each do |journal| @@ -58,5 +58,5 @@ api.issue do end end end - end unless @issue.journals.empty? + end if include_in_api_response?('journals') end diff --git a/app/views/projects/show.api.rsb b/app/views/projects/show.api.rsb index dc0263712..e08f77b66 100644 --- a/app/views/projects/show.api.rsb +++ b/app/views/projects/show.api.rsb @@ -14,5 +14,5 @@ api.project do @project.trackers.each do |tracker| api.tracker(:id => tracker.id, :name => tracker.name) end - end + end if include_in_api_response?('trackers') end diff --git a/app/views/users/show.api.rsb b/app/views/users/show.api.rsb index c177d49e9..a2e31acc1 100644 --- a/app/views/users/show.api.rsb +++ b/app/views/users/show.api.rsb @@ -20,5 +20,5 @@ api.user do end end if membership.project end - end if @memberships.present? + end if include_in_api_response?('memberships') && @memberships end diff --git a/test/integration/api_test/issues_test.rb b/test/integration/api_test/issues_test.rb index 3988ee5b7..d3aa327f1 100644 --- a/test/integration/api_test/issues_test.rb +++ b/test/integration/api_test/issues_test.rb @@ -94,7 +94,7 @@ class ApiTest::IssuesTest < ActionController::IntegrationTest context "with journals" do context ".xml" do should "display journals" do - get '/issues/1.xml' + get '/issues/1.xml?include=journals' assert_tag :tag => 'issue', :child => { @@ -160,7 +160,7 @@ class ApiTest::IssuesTest < ActionController::IntegrationTest context ".xml" do should "display children" do - get '/issues/1.xml' + get '/issues/1.xml?include=children' assert_tag :tag => 'issue', :child => { @@ -187,7 +187,7 @@ class ApiTest::IssuesTest < ActionController::IntegrationTest context ".json" do should "display children" do - get '/issues/1.json' + get '/issues/1.json?include=children' json = ActiveSupport::JSON.decode(response.body) assert_equal([