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 | 26 | end |
27 | 27 | |
28 | 28 | desc "Return the article id" |
29 | - get ':id' do | |
29 | + get ':id', requirements: {id: /[0-9]+/} do | |
30 | 30 | present_article(environment) |
31 | 31 | end |
32 | - | |
32 | + | |
33 | 33 | post ':id/report_abuse' do |
34 | 34 | article = find_article(environment.articles, params[:id]) |
35 | 35 | profile = article.profile |
... | ... | @@ -164,7 +164,18 @@ module Noosfero |
164 | 164 | resource :articles do |
165 | 165 | get do |
166 | 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 | 179 | end |
169 | 180 | |
170 | 181 | get ':id' do | ... | ... |
test/unit/api/articles_test.rb
... | ... | @@ -91,6 +91,41 @@ class ArticlesTest < ActiveSupport::TestCase |
91 | 91 | assert_not_includes json['articles'].map {|a| a['id']}, child.id |
92 | 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 | 130 | # Profile Articles # |
96 | 131 | ############################# |
... | ... | @@ -123,6 +158,29 @@ class ArticlesTest < ActiveSupport::TestCase |
123 | 158 | json = JSON.parse(last_response.body) |
124 | 159 | assert_not_includes json['articles'].map {|a| a['id']}, article.id |
125 | 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 | 184 | end |
127 | 185 | |
128 | 186 | ############################# | ... | ... |
test/unit/api/test_helper.rb
... | ... | @@ -17,6 +17,11 @@ class ActiveSupport::TestCase |
17 | 17 | post "/api/v1/login?login=testapi&password=testapi" |
18 | 18 | json = JSON.parse(last_response.body) |
19 | 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 | 25 | @params = {:private_token => @private_token} |
21 | 26 | end |
22 | 27 | attr_accessor :private_token, :user, :person, :params, :environment | ... | ... |