Commit 8e8f1e4d4b61d99cecbad85fc57923654a462967

Authored by Leandro Santos
2 parents 27f11bf7 b4d35439

Merge branch 'comment_paragraph_api' into 'master'

Add api methods to comment paragraph

Also improve comment listing from core API.

See merge request !854
lib/noosfero/api/v1/comments.rb
... ... @@ -20,8 +20,10 @@ module Noosfero
20 20 get ":id/comments" do
21 21 article = find_article(environment.articles, params[:id])
22 22 comments = select_filtered_collection_of(article, :comments, params)
  23 + comments = comments.without_spam
23 24 comments = comments.without_reply if(params[:without_reply].present?)
24   - present comments, :with => Entities::Comment, :current_person => current_person
  25 + comments = plugins.filter(:unavailable_comments, comments)
  26 + present paginate(comments), :with => Entities::Comment, :current_person => current_person
25 27 end
26 28  
27 29 get ":id/comments/:comment_id" do
... ...
plugins/comment_paragraph/lib/comment_paragraph_plugin.rb
... ... @@ -55,6 +55,10 @@ class CommentParagraphPlugin < Noosfero::Plugin
55 55  
56 56 end
57 57  
  58 + def self.api_mount_points
  59 + [CommentParagraphPlugin::API]
  60 + end
  61 +
58 62 end
59 63  
60 64 require_dependency 'comment_paragraph_plugin/macros/allow_comment'
... ...
plugins/comment_paragraph/lib/comment_paragraph_plugin/api.rb 0 → 100644
... ... @@ -0,0 +1,32 @@
  1 +class CommentParagraphPlugin::API < Grape::API
  2 + MAX_PER_PAGE = 20
  3 +
  4 + resource :articles do
  5 + paginate max_per_page: MAX_PER_PAGE
  6 + get ':id/comment_paragraph_plugin/comments' do
  7 + article = find_article(environment.articles, params[:id])
  8 + comments = select_filtered_collection_of(article, :comments, params)
  9 + comments = comments.without_spam
  10 + comments = comments.in_paragraph(params[:paragraph_uuid])
  11 + comments = comments.without_reply if(params[:without_reply].present?)
  12 + present paginate(comments), :with => Noosfero::API::Entities::Comment, :current_person => current_person
  13 + end
  14 +
  15 + {activate: true, deactivate: false}.each do |method, value|
  16 + post ":id/comment_paragraph_plugin/#{method}" do
  17 + authenticate!
  18 + article = find_article(environment.articles, params[:id])
  19 + return forbidden! unless article.comment_paragraph_plugin_enabled? && article.allow_edit?(current_person)
  20 + article.comment_paragraph_plugin_activate = value
  21 + article.save!
  22 + present_partial article, :with => Noosfero::API::Entities::Article
  23 + end
  24 + end
  25 +
  26 + get ':id/comment_paragraph_plugin/comments/count' do
  27 + article = find_article(environment.articles, params[:id])
  28 + comments = select_filtered_collection_of(article, :comments, params)
  29 + comments.group(:paragraph_uuid).count
  30 + end
  31 + end
  32 +end
... ...
plugins/comment_paragraph/lib/ext/entities.rb 0 → 100644
... ... @@ -0,0 +1,12 @@
  1 +require File.join(Rails.root,'lib','noosfero','api','entities')
  2 +module Noosfero
  3 + module API
  4 + module Entities
  5 + class Comment < CommentBase
  6 + expose :paragraph_uuid
  7 + expose :comment_paragraph_selected_area
  8 + expose :comment_paragraph_selected_content
  9 + end
  10 + end
  11 + end
  12 +end
... ...
plugins/comment_paragraph/test/unit/api_test.rb 0 → 100644
... ... @@ -0,0 +1,83 @@
  1 +require_relative '../test_helper'
  2 +require_relative '../../../../test/api/test_helper'
  3 +
  4 +class APITest < ActiveSupport::TestCase
  5 +
  6 + def setup
  7 + login_api
  8 + environment.enable_plugin(CommentParagraphPlugin)
  9 + end
  10 +
  11 + should 'return custom parameters for each comment' do
  12 + article = fast_create(TextArticle, :profile_id => person.id, :name => "Some thing", :published => false)
  13 + comment = fast_create(Comment, paragraph_uuid: '1', source_id: article.id, author_id: fast_create(Person).id)
  14 + comment.comment_paragraph_selected_area = 'area'
  15 + comment.comment_paragraph_selected_content = 'content'
  16 + comment.save!
  17 + params[:paragraph_uuid] = '1'
  18 + get "/api/v1/articles/#{article.id}/comment_paragraph_plugin/comments?#{params.to_query}"
  19 +
  20 + json = JSON.parse(last_response.body)
  21 + assert_equivalent ['1'], json['comments'].map {|c| c['paragraph_uuid']}
  22 + assert_equivalent ['area'], json['comments'].map {|c| c['comment_paragraph_selected_area']}
  23 + assert_equivalent ['content'], json['comments'].map {|c| c['comment_paragraph_selected_content']}
  24 + end
  25 +
  26 + should 'return comments that belongs to a paragraph' do
  27 + article = fast_create(TextArticle, :profile_id => person.id, :name => "Some thing", :published => false)
  28 + comment1 = fast_create(Comment, :paragraph_uuid => '1', :source_id => article.id)
  29 + comment2 = fast_create(Comment, :paragraph_uuid => nil, :source_id => article.id)
  30 + comment3 = fast_create(Comment, :paragraph_uuid => '2', :source_id => article.id)
  31 + params[:paragraph_uuid] = '1'
  32 + get "/api/v1/articles/#{article.id}/comment_paragraph_plugin/comments?#{params.to_query}"
  33 +
  34 + json = JSON.parse(last_response.body)
  35 + assert_equivalent [comment1.id], json['comments'].map {|c| c['id']}
  36 + end
  37 +
  38 + {activate: true, deactivate: false}.each do |method, value|
  39 + should "#{method} paragraph comment in an article" do
  40 + article = fast_create(TextArticle, :profile_id => person.id, :name => "Some thing", :author_id => person.id)
  41 + post "/api/v1/articles/#{article.id}/comment_paragraph_plugin/#{method}?#{params.to_query}"
  42 + json = JSON.parse(last_response.body)
  43 + assert_equal value, json["article"]["setting"]["comment_paragraph_plugin_activate"]
  44 + end
  45 +
  46 + should "not allow #{method} paragraph comment when not logged in" do
  47 + article = fast_create(TextArticle, :profile_id => person.id, :name => "Some thing")
  48 + post "/api/v1/articles/#{article.id}/comment_paragraph_plugin/#{method}"
  49 + assert_equal 401, last_response.status
  50 + end
  51 +
  52 + should "not allow #{method} paragraph comment when user does not have permission to edit article" do
  53 + author = create_user.person
  54 + article = fast_create(TextArticle, :profile_id => author.id, :name => "Some thing", :author_id => author.id)
  55 + post "/api/v1/articles/#{article.id}/comment_paragraph_plugin/#{method}?#{params.to_query}"
  56 + assert_equal 403, last_response.status
  57 + end
  58 + end
  59 +
  60 + should 'return comment counts grouped by paragraph' do
  61 + article = fast_create(TextArticle, :profile_id => person.id, :name => "Some thing", :published => false)
  62 + fast_create(Comment, :paragraph_uuid => '1', :source_id => article.id)
  63 + fast_create(Comment, :paragraph_uuid => nil, :source_id => article.id)
  64 + fast_create(Comment, :paragraph_uuid => '2', :source_id => article.id)
  65 + fast_create(Comment, :paragraph_uuid => '2', :source_id => article.id)
  66 + get "/api/v1/articles/#{article.id}/comment_paragraph_plugin/comments/count?#{params.to_query}"
  67 +
  68 + json = JSON.parse(last_response.body)
  69 + assert_equal({"1"=>1, ""=>1, "2"=>2}, json)
  70 + end
  71 +
  72 + should 'filter comments marked as spam' do
  73 + article = fast_create(TextArticle, :profile_id => person.id, :name => "Some thing", :published => false)
  74 + comment1 = fast_create(Comment, :paragraph_uuid => '1', :source_id => article.id)
  75 + comment2 = fast_create(Comment, :paragraph_uuid => nil, :source_id => article.id, spam: true)
  76 + comment3 = fast_create(Comment, :paragraph_uuid => '2', :source_id => article.id, spam: true)
  77 + params[:paragraph_uuid] = '1'
  78 + get "/api/v1/articles/#{article.id}/comment_paragraph_plugin/comments?#{params.to_query}"
  79 +
  80 + json = JSON.parse(last_response.body)
  81 + assert_equivalent [comment1.id], json['comments'].map {|c| c['id']}
  82 + end
  83 +end
... ...
test/api/comments_test.rb
... ... @@ -100,4 +100,32 @@ class CommentsTest &lt; ActiveSupport::TestCase
100 100 assert_equal 200, last_response.status
101 101 assert_equal [comment1.id], json["comments"].map { |c| c['id'] }
102 102 end
  103 +
  104 + should 'call plugin hotspot to filter unavailable comments' do
  105 + class Plugin1 < Noosfero::Plugin
  106 + def unavailable_comments(scope)
  107 + scope.where(:user_agent => 'Jack')
  108 + end
  109 + end
  110 + Noosfero::Plugin.stubs(:all).returns([Plugin1.name])
  111 + Environment.default.enable_plugin(Plugin1)
  112 +
  113 + article = fast_create(Article, :profile_id => user.person.id, :name => "Some thing")
  114 + c1 = fast_create(Comment, source_id: article.id, body: "comment 1")
  115 + c2 = fast_create(Comment, source_id: article.id, body: "comment 2", :user_agent => 'Jack')
  116 +
  117 + get "/api/v1/articles/#{article.id}/comments?#{params.to_query}"
  118 + json = JSON.parse(last_response.body)
  119 + assert_equal ["comment 2"], json["comments"].map {|c| c["body"]}
  120 + end
  121 +
  122 + should 'do not return comments marked as spam' do
  123 + article = fast_create(Article, :profile_id => user.person.id, :name => "Some thing")
  124 + c1 = fast_create(Comment, source_id: article.id, body: "comment 1", spam: true)
  125 + c2 = fast_create(Comment, source_id: article.id, body: "comment 2")
  126 +
  127 + get "/api/v1/articles/#{article.id}/comments?#{params.to_query}"
  128 + json = JSON.parse(last_response.body)
  129 + assert_equal ["comment 2"], json["comments"].map {|c| c["body"]}
  130 + end
103 131 end
... ...