Commit 4ca9a146282dbf46c914796d9838a373f1987f67
1 parent
0a4f86dd
Exists in
master
and in
29 other branches
api: optionally lists parent and children when listing categories
Always show parent and children when getting a specific category with id
Showing
3 changed files
with
80 additions
and
4 deletions
Show diff stats
lib/noosfero/api/entities.rb
@@ -47,9 +47,19 @@ module Noosfero | @@ -47,9 +47,19 @@ module Noosfero | ||
47 | expose :description | 47 | expose :description |
48 | end | 48 | end |
49 | 49 | ||
50 | - class Category < Entity | 50 | + class CategoryBase < Entity |
51 | root 'categories', 'category' | 51 | root 'categories', 'category' |
52 | - expose :name, :id, :slug | 52 | + expose :name, :id |
53 | + end | ||
54 | + | ||
55 | + class Category < CategoryBase | ||
56 | + root 'categories', 'category' | ||
57 | + expose :slug | ||
58 | + expose :full_name do |category, options| | ||
59 | + category.full_name | ||
60 | + end | ||
61 | + expose :parent, :using => CategoryBase, if: { parent: true } | ||
62 | + expose :children, :using => CategoryBase, if: { children: true } | ||
53 | expose :image, :using => Image | 63 | expose :image, :using => Image |
54 | end | 64 | end |
55 | 65 |
lib/noosfero/api/v1/categories.rb
@@ -8,13 +8,16 @@ module Noosfero | @@ -8,13 +8,16 @@ module Noosfero | ||
8 | 8 | ||
9 | get do | 9 | get do |
10 | type = params[:category_type] | 10 | type = params[:category_type] |
11 | + include_parent = params[:include_parent] == 'true' | ||
12 | + include_children = params[:include_children] == 'true' | ||
13 | + | ||
11 | categories = type.nil? ? environment.categories : environment.categories.find(:all, :conditions => {:type => type}) | 14 | categories = type.nil? ? environment.categories : environment.categories.find(:all, :conditions => {:type => type}) |
12 | - present categories, :with => Entities::Category | 15 | + present categories, :with => Entities::Category, parent: include_parent, children: include_children |
13 | end | 16 | end |
14 | 17 | ||
15 | desc "Return the category by id" | 18 | desc "Return the category by id" |
16 | get ':id' do | 19 | get ':id' do |
17 | - present environment.categories.find(params[:id]), :with => Entities::Category | 20 | + present environment.categories.find(params[:id]), :with => Entities::Category, parent: true, children: true |
18 | end | 21 | end |
19 | 22 | ||
20 | end | 23 | end |
test/unit/api/categories_test.rb
@@ -20,4 +20,67 @@ class CategoriesTest < ActiveSupport::TestCase | @@ -20,4 +20,67 @@ class CategoriesTest < ActiveSupport::TestCase | ||
20 | assert_equal category.name, json["category"]["name"] | 20 | assert_equal category.name, json["category"]["name"] |
21 | end | 21 | end |
22 | 22 | ||
23 | + should 'list parent and children when get category by id' do | ||
24 | + parent = fast_create(Category) | ||
25 | + child_1 = fast_create(Category) | ||
26 | + child_2 = fast_create(Category) | ||
27 | + | ||
28 | + category = fast_create(Category) | ||
29 | + category.parent = parent | ||
30 | + category.children << child_1 | ||
31 | + category.children << child_2 | ||
32 | + category.save | ||
33 | + | ||
34 | + get "/api/v1/categories/#{category.id}/?#{params.to_query}" | ||
35 | + json = JSON.parse(last_response.body) | ||
36 | + assert_equal({'id' => parent.id, 'name' => parent.name}, json['category']['parent']) | ||
37 | + assert_equivalent [child_1.id, child_2.id], json['category']['children'].map { |c| c['id'] } | ||
38 | + end | ||
39 | + | ||
40 | + should 'include parent in categories list if params is true' do | ||
41 | + parent_1 = fast_create(Category) # parent_1 has no parent category | ||
42 | + child_1 = fast_create(Category) | ||
43 | + child_2 = fast_create(Category) | ||
44 | + | ||
45 | + parent_2 = fast_create(Category) | ||
46 | + parent_2.parent = parent_1 | ||
47 | + parent_2.children << child_1 | ||
48 | + parent_2.children << child_2 | ||
49 | + parent_2.save | ||
50 | + | ||
51 | + get "/api/v1/categories/?#{params.to_query}" | ||
52 | + json = JSON.parse(last_response.body) | ||
53 | + assert_equal [nil], json['categories'].map { |c| c['parent'] }.uniq | ||
54 | + | ||
55 | + params[:include_parent] = true | ||
56 | + get "/api/v1/categories/?#{params.to_query}" | ||
57 | + json = JSON.parse(last_response.body) | ||
58 | + assert_equivalent [parent_1.parent, parent_2.parent.id, child_1.parent.id, child_2.parent.id], | ||
59 | + json["categories"].map { |c| c['parent'] && c['parent']['id'] } | ||
60 | + end | ||
61 | + | ||
62 | + should 'include children in categories list if params is true' do | ||
63 | + category = fast_create(Category) | ||
64 | + child_1 = fast_create(Category) | ||
65 | + child_2 = fast_create(Category) | ||
66 | + child_3 = fast_create(Category) | ||
67 | + | ||
68 | + category.children << child_1 | ||
69 | + category.children << child_2 | ||
70 | + category.save | ||
71 | + | ||
72 | + child_1.children << child_3 | ||
73 | + child_1.save | ||
74 | + | ||
75 | + get "/api/v1/categories/?#{params.to_query}" | ||
76 | + json = JSON.parse(last_response.body) | ||
77 | + assert_equal [nil], json['categories'].map { |c| c['children'] }.uniq | ||
78 | + | ||
79 | + params[:include_children] = true | ||
80 | + get "/api/v1/categories/?#{params.to_query}" | ||
81 | + json = JSON.parse(last_response.body) | ||
82 | + assert_equivalent [category.children.map(&:id).sort, child_1.children.map(&:id).sort, child_2.children.map(&:id).sort, child_3.children.map(&:id).sort], | ||
83 | + json["categories"].map{ |c| c['children'].map{ |child| child['id'] }.sort } | ||
84 | + end | ||
85 | + | ||
23 | end | 86 | end |