]> source.dussan.org Git - redmine.git/commitdiff
REST API for retrieving news (#13468).
authorGo MAEDA <maeda@farend.jp>
Mon, 9 Sep 2019 08:55:43 +0000 (08:55 +0000)
committerGo MAEDA <maeda@farend.jp>
Mon, 9 Sep 2019 08:55:43 +0000 (08:55 +0000)
Patch by Takenori TAKAKI.

git-svn-id: http://svn.redmine.org/redmine/trunk@18441 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/controllers/news_controller.rb
app/views/news/show.api.rsb [new file with mode: 0644]
test/integration/api_test/news_test.rb

index ed4db3b1bcba5f7e0a2a26570a22e3c313b8e436..6c1e7f1bdb12e11b01463b8ed348c33d6686c54f 100644 (file)
@@ -26,7 +26,7 @@ class NewsController < ApplicationController
   before_action :authorize, :except => [:index]
   before_action :find_optional_project, :only => :index
   accept_rss_auth :index
-  accept_api_auth :index, :create
+  accept_api_auth :index, :show, :create
 
   helper :watchers
   helper :attachments
diff --git a/app/views/news/show.api.rsb b/app/views/news/show.api.rsb
new file mode 100644 (file)
index 0000000..0dd3a3b
--- /dev/null
@@ -0,0 +1,24 @@
+api.news do
+  api.id @news.id
+  api.project(:id => @news.project_id, :name => @news.project.name) unless @news.project.nil?
+  api.author(:id => @news.author_id, :name => @news.author.name) unless @news.author.nil?
+  api.title @news.title
+  api.summary @news.summary unless @news.summary.blank?
+  api.description @news.description
+  api.created_on @news.created_on
+
+  api.array :attachments do
+    @news.attachments.each do |attachment|
+      render_api_attachment(attachment, api)
+    end
+  end if include_in_api_response?('attachments')
+
+  api.array :comments do
+    @comments.each do |comment|
+      api.comment :id => comment.id do
+        api.author(:id => comment.author_id, :name => comment.author.name) unless comment.author.nil?
+        api.content comment.content
+      end
+    end
+  end if include_in_api_response?('comments')
+end
index b1b436ad0ec51de86b80ce63a63301eb421fd003..48a0b1025327ff0e31366cc1617bac88af3cba5c 100644 (file)
@@ -27,7 +27,8 @@ class Redmine::ApiTest::NewsTest < Redmine::ApiTest::Base
            :member_roles,
            :members,
            :enabled_modules,
-           :news
+           :news,
+           :comments
 
   test "GET /news.xml should return news" do
     get '/news.xml'
@@ -61,6 +62,60 @@ class Redmine::ApiTest::NewsTest < Redmine::ApiTest::Base
     assert_equal 2, json['news'].first['id']
   end
 
+  test "GET /news/:id.xml" do
+    get "/news/1.xml"
+    assert_response :success
+    assert_equal 'application/xml', response.content_type
+    assert_select 'news' do
+      assert_select 'id', 1
+      assert_select "project[id=1][name=\"eCookbook\"]"
+      assert_select "author[id=2][name=\"John Smith\"]"
+      assert_select 'title', 'eCookbook first release !'
+      assert_select 'summary', 'First version was released...'
+      assert_select 'description', "eCookbook 1.0 has been released.\n\nVisit http://ecookbook.somenet.foo/"
+      iso_date = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/
+      assert_select 'news>created_on', :text => iso_date
+    end
+  end
+
+  test "GET /news/:id.json" do
+    get "/news/1.json"
+    assert_response :success
+    assert_equal 'application/json', response.content_type
+    json = ActiveSupport::JSON.decode(response.body)
+    assert_equal 1, json['news']['id']
+  end
+
+  test "GET /news/:id.xml with attachments" do
+    news = News.find(1)
+    attachment = Attachment.first
+    attachment.container = news
+    attachment.save!
+
+    get "/news/1.xml?include=attachments"
+    assert_select 'news attachments[type=array]' do
+      assert_select 'attachment id', :text => '1' do
+        assert_select '~ filename', :text => 'error281.txt'
+        assert_select '~ content_url', :text => 'http://www.example.com/attachments/download/1/error281.txt'
+      end
+    end
+  end
+
+  test "GET /news/:id.xml with comments" do
+    get "/news/1.xml?include=comments"
+    assert_select 'news comments[type=array]' do
+      assert_select 'comment', 2
+      assert_select 'comment[id=1]' do
+        assert_select 'author[id=1][name="Redmine Admin"]'
+        assert_select 'content', :text => 'my first comment'
+      end
+      assert_select 'comment[id=2]' do
+        assert_select 'author[id=2][name="John Smith"]'
+        assert_select 'content', :text => 'This is an other comment'
+      end
+    end
+  end
+
   test "POST /project/:project_id/news.xml should create a news with the attributes" do
     payload = <<~XML
       <?xml version="1.0" encoding="UTF-8" ?>