Commit e58c017a739c00c6833daad526ea6e3fd9654b06
Exists in
web_steps_improvements
and in
6 other branches
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 |