Commit 4add51790e66248f9ba52e7895165bb2bb70350e
1 parent
a3678363
Exists in
theme-brasil-digital-from-staging
and in
9 other branches
New articles endpoint to allow get a article by profile and path
Showing
3 changed files
with
77 additions
and
3 deletions
Show diff stats
lib/noosfero/api/v1/articles.rb
@@ -26,10 +26,10 @@ module Noosfero | @@ -26,10 +26,10 @@ module Noosfero | ||
26 | end | 26 | end |
27 | 27 | ||
28 | desc "Return the article id" | 28 | desc "Return the article id" |
29 | - get ':id' do | 29 | + get ':id', requirements: {id: /[0-9]+/} do |
30 | present_article(environment) | 30 | present_article(environment) |
31 | end | 31 | end |
32 | - | 32 | + |
33 | post ':id/report_abuse' do | 33 | post ':id/report_abuse' do |
34 | article = find_article(environment.articles, params[:id]) | 34 | article = find_article(environment.articles, params[:id]) |
35 | profile = article.profile | 35 | profile = article.profile |
@@ -164,7 +164,18 @@ module Noosfero | @@ -164,7 +164,18 @@ module Noosfero | ||
164 | resource :articles do | 164 | resource :articles do |
165 | get do | 165 | get do |
166 | profile = environment.send(kind.pluralize).find(params["#{kind}_id"]) | 166 | profile = environment.send(kind.pluralize).find(params["#{kind}_id"]) |
167 | - present_articles(profile) | 167 | + |
168 | + if params[:path].present? | ||
169 | + article = profile.articles.find_by_path(params[:path]) | ||
170 | + if !article || !article.display_to?(current_person) | ||
171 | + article = forbidden! | ||
172 | + end | ||
173 | + | ||
174 | + present article, :with => Entities::Article, :fields => params[:fields] | ||
175 | + else | ||
176 | + | ||
177 | + present_articles(profile) | ||
178 | + end | ||
168 | end | 179 | end |
169 | 180 | ||
170 | get ':id' do | 181 | get ':id' do |
test/unit/api/articles_test.rb
@@ -91,6 +91,41 @@ class ArticlesTest < ActiveSupport::TestCase | @@ -91,6 +91,41 @@ class ArticlesTest < ActiveSupport::TestCase | ||
91 | assert_not_includes json['articles'].map {|a| a['id']}, child.id | 91 | assert_not_includes json['articles'].map {|a| a['id']}, child.id |
92 | end | 92 | end |
93 | 93 | ||
94 | + should 'follow a article identified by id' do | ||
95 | + article = fast_create(Article, :profile_id => @person.id, :name => "Some thing") | ||
96 | + post "/api/v1/articles/#{article.id}/follow?#{params.to_query}" | ||
97 | + json = JSON.parse(last_response.body) | ||
98 | + | ||
99 | + assert_not_equal 401, last_response.status | ||
100 | + assert_equal true, json['success'] | ||
101 | + end | ||
102 | + | ||
103 | + should 'return the followers of a article identified by id' do | ||
104 | + article = fast_create(Article, :profile_id => @person.id, :name => "Some thing") | ||
105 | + | ||
106 | + article_follower = ArticleFollower.new | ||
107 | + article_follower.article = article | ||
108 | + article_follower.person = @person | ||
109 | + article_follower.save! | ||
110 | + | ||
111 | + get "/api/v1/articles/#{article.id}/followers?" | ||
112 | + json = JSON.parse(last_response.body) | ||
113 | + | ||
114 | + assert_equal 200, last_response.status | ||
115 | + assert_equal 1, json['total_followers'] | ||
116 | + end | ||
117 | + | ||
118 | + should 'perform a vote in a article identified by id' do | ||
119 | + article = fast_create(Article, :profile_id => @person.id, :name => "Some thing") | ||
120 | + @params[:value] = 1 | ||
121 | + | ||
122 | + post "/api/v1/articles/#{article.id}/vote?#{params.to_query}" | ||
123 | + json = JSON.parse(last_response.body) | ||
124 | + | ||
125 | + assert_not_equal 401, last_response.status | ||
126 | + assert_equal true, json['vote'] | ||
127 | + end | ||
128 | + | ||
94 | ############################# | 129 | ############################# |
95 | # Profile Articles # | 130 | # Profile Articles # |
96 | ############################# | 131 | ############################# |
@@ -123,6 +158,29 @@ class ArticlesTest < ActiveSupport::TestCase | @@ -123,6 +158,29 @@ class ArticlesTest < ActiveSupport::TestCase | ||
123 | json = JSON.parse(last_response.body) | 158 | json = JSON.parse(last_response.body) |
124 | assert_not_includes json['articles'].map {|a| a['id']}, article.id | 159 | assert_not_includes json['articles'].map {|a| a['id']}, article.id |
125 | end | 160 | end |
161 | + | ||
162 | + should "return article by #{kind} and path" do | ||
163 | + profile = fast_create(kind.camelcase.constantize, :environment_id => environment.id) | ||
164 | + parent_article = Folder.create!(:profile => profile, :name => "Parent Folder") | ||
165 | + article = Article.create!(:profile => profile, :name => "Some thing", :parent => parent_article) | ||
166 | + | ||
167 | + params[:path] = parent_article.slug+'/'+article.slug | ||
168 | + get "/api/v1/#{kind.pluralize}/#{profile.id}/articles?#{params.to_query}" | ||
169 | + json = JSON.parse(last_response.body) | ||
170 | + assert_equal article.id, json["article"]["id"] | ||
171 | + end | ||
172 | + | ||
173 | + should "not return article by #{kind} and path if user has no permission to view it" do | ||
174 | + profile = fast_create(kind.camelcase.constantize, :environment_id => environment.id) | ||
175 | + parent_article = Folder.create!(:profile => profile, :name => "Parent Folder") | ||
176 | + article = Article.create!(:profile => profile, :name => "Some thing", :parent => parent_article, :published => false) | ||
177 | + | ||
178 | + assert !article.published? | ||
179 | + | ||
180 | + params[:path] = parent_article.slug+'/'+article.slug | ||
181 | + get "/api/v1/#{kind.pluralize}/#{profile.id}/articles?#{params.to_query}" | ||
182 | + assert_equal 403, last_response.status | ||
183 | + end | ||
126 | end | 184 | end |
127 | 185 | ||
128 | ############################# | 186 | ############################# |
test/unit/api/test_helper.rb
@@ -17,6 +17,11 @@ class ActiveSupport::TestCase | @@ -17,6 +17,11 @@ class ActiveSupport::TestCase | ||
17 | post "/api/v1/login?login=testapi&password=testapi" | 17 | post "/api/v1/login?login=testapi&password=testapi" |
18 | json = JSON.parse(last_response.body) | 18 | json = JSON.parse(last_response.body) |
19 | @private_token = json["private_token"] | 19 | @private_token = json["private_token"] |
20 | + unless @private_token | ||
21 | + @user.generate_private_token! | ||
22 | + @private_token = @user.private_token | ||
23 | + end | ||
24 | + | ||
20 | @params = {:private_token => @private_token} | 25 | @params = {:private_token => @private_token} |
21 | end | 26 | end |
22 | attr_accessor :private_token, :user, :person, :params, :environment | 27 | attr_accessor :private_token, :user, :person, :params, :environment |