Commit e58c017a739c00c6833daad526ea6e3fd9654b06
Exists in
staging
and in
1 other branch
Merge branch 'comments_api_reply' into 'master'
API: Add the replies field in comment entity Also add pagination to comments and add an option to return root comments only. See merge request !842
Showing
3 changed files
with
33 additions
and
3 deletions
Show diff stats
lib/noosfero/api/entities.rb
@@ -183,11 +183,16 @@ module Noosfero | @@ -183,11 +183,16 @@ module Noosfero | ||
183 | expose :children, :using => ArticleBase | 183 | expose :children, :using => ArticleBase |
184 | end | 184 | end |
185 | 185 | ||
186 | - class Comment < Entity | ||
187 | - root 'comments', 'comment' | 186 | + class CommentBase < Entity |
188 | expose :body, :title, :id | 187 | expose :body, :title, :id |
189 | expose :created_at, :format_with => :timestamp | 188 | expose :created_at, :format_with => :timestamp |
190 | expose :author, :using => Profile | 189 | expose :author, :using => Profile |
190 | + expose :reply_of, :using => CommentBase | ||
191 | + end | ||
192 | + | ||
193 | + class Comment < CommentBase | ||
194 | + root 'comments', 'comment' | ||
195 | + expose :children, as: :replies, :using => Comment | ||
191 | end | 196 | end |
192 | 197 | ||
193 | class User < Entity | 198 | class User < Entity |
lib/noosfero/api/v1/comments.rb
@@ -2,9 +2,12 @@ module Noosfero | @@ -2,9 +2,12 @@ module Noosfero | ||
2 | module API | 2 | module API |
3 | module V1 | 3 | module V1 |
4 | class Comments < Grape::API | 4 | class Comments < Grape::API |
5 | + MAX_PER_PAGE = 20 | ||
6 | + | ||
5 | before { authenticate! } | 7 | before { authenticate! } |
6 | 8 | ||
7 | resource :articles do | 9 | resource :articles do |
10 | + paginate max_per_page: MAX_PER_PAGE | ||
8 | # Collect comments from articles | 11 | # Collect comments from articles |
9 | # | 12 | # |
10 | # Parameters: | 13 | # Parameters: |
@@ -17,7 +20,7 @@ module Noosfero | @@ -17,7 +20,7 @@ module Noosfero | ||
17 | get ":id/comments" do | 20 | get ":id/comments" do |
18 | article = find_article(environment.articles, params[:id]) | 21 | article = find_article(environment.articles, params[:id]) |
19 | comments = select_filtered_collection_of(article, :comments, params) | 22 | comments = select_filtered_collection_of(article, :comments, params) |
20 | - | 23 | + comments = comments.without_reply if(params[:without_reply].present?) |
21 | present comments, :with => Entities::Comment, :current_person => current_person | 24 | present comments, :with => Entities::Comment, :current_person => current_person |
22 | end | 25 | end |
23 | 26 |
test/api/comments_test.rb
@@ -78,4 +78,26 @@ class CommentsTest < ActiveSupport::TestCase | @@ -78,4 +78,26 @@ class CommentsTest < ActiveSupport::TestCase | ||
78 | assert_not_nil comment.source | 78 | assert_not_nil comment.source |
79 | end | 79 | end |
80 | 80 | ||
81 | + should 'paginate comments' do | ||
82 | + article = fast_create(Article, :profile_id => user.person.id, :name => "Some thing") | ||
83 | + 5.times { article.comments.create!(:body => "some comment", :author => user.person) } | ||
84 | + params[:per_page] = 3 | ||
85 | + | ||
86 | + get "/api/v1/articles/#{article.id}/comments?#{params.to_query}" | ||
87 | + json = JSON.parse(last_response.body) | ||
88 | + assert_equal 200, last_response.status | ||
89 | + assert_equal 3, json["comments"].length | ||
90 | + end | ||
91 | + | ||
92 | + should 'return only root comments' do | ||
93 | + article = fast_create(Article, :profile_id => user.person.id, :name => "Some thing") | ||
94 | + comment1 = article.comments.create!(:body => "some comment", :author => user.person) | ||
95 | + comment2 = article.comments.create!(:body => "another comment", :author => user.person, :reply_of_id => comment1.id) | ||
96 | + params[:without_reply] = true | ||
97 | + | ||
98 | + get "/api/v1/articles/#{article.id}/comments?#{params.to_query}" | ||
99 | + json = JSON.parse(last_response.body) | ||
100 | + assert_equal 200, last_response.status | ||
101 | + assert_equal [comment1.id], json["comments"].map { |c| c['id'] } | ||
102 | + end | ||
81 | end | 103 | end |