diff --git a/app/controllers/concerns/followable_controller.rb b/app/controllers/concerns/followable_controller.rb index d703c163162c3a8bca651319c9d23ace9ac06303..d4d1cf569c518cd6fa3caf4e6aaf47478e6e12e9 100644 --- a/app/controllers/concerns/followable_controller.rb +++ b/app/controllers/concerns/followable_controller.rb @@ -28,4 +28,18 @@ module FollowableController render status: :forbidden end end + + # PUT /v1/users/1/follow + # PUT /v1/users/1/follow.json + def follow_toggle + if !current_user.following?(followable) + current_user.follow(followable) + render status: :created + elsif current_user.following?(followable) + current_user.unfollow(followable) + render status: :ok + else + render status: :forbidden + end + end end diff --git a/app/models/search.rb b/app/models/search.rb index b74f038095c60c29b08fdcf1fa3dc36107ee4675..cb88cb4b1aa8a59bb0c8c7e3a680c3cfb2eeadaf 100644 --- a/app/models/search.rb +++ b/app/models/search.rb @@ -28,7 +28,7 @@ class Search { query: '*', order: 'score', - page: 1, + page: 0, results_per_page: 10 }.select { |key, _value| !params.key?(key) } end diff --git a/app/serializers/follow_serializer.rb b/app/serializers/follow_serializer.rb index 5cf3d5147a7441062d416159021903f862ff01f8..ba5ee0682b26cf970310a272a257b52a2298c444 100644 --- a/app/serializers/follow_serializer.rb +++ b/app/serializers/follow_serializer.rb @@ -1,9 +1,12 @@ class FollowSerializer < ActiveModel::Serializer cache key: 'follow', expires_in: 24.hours + attributes :id + def follower object.user end - attributes :id, :follower, :followable + belongs_to :followable + belongs_to :follower end diff --git a/app/services/search_service/collection.rb b/app/services/search_service/collection.rb index 4bf4e400a3d5126fb3215aa46c1fdf4e735ade66..a66407af69bdd841364fda3bacc41a781dce315b 100644 --- a/app/services/search_service/collection.rb +++ b/app/services/search_service/collection.rb @@ -39,6 +39,7 @@ module SearchService when 'likes' then { likes: { order: :desc } } when 'downloads' then { downloads: { order: :desc } } when 'review_average' then { review_average: { order: :desc } } + else "_score" end end diff --git a/app/services/search_service/learning_object.rb b/app/services/search_service/learning_object.rb index fbd32481d70ccacfc15170ff719e4e5add395ac0..6ae89d3edc218c5ca370797e83f8b418e93a1df7 100644 --- a/app/services/search_service/learning_object.rb +++ b/app/services/search_service/learning_object.rb @@ -40,6 +40,7 @@ module SearchService when 'likes' then { likes: { order: :desc } } when 'downloads' then { downloads: { order: :desc } } when 'review_average' then { review_average: { order: :desc } } + else "_score" end end diff --git a/app/services/search_service/model.rb b/app/services/search_service/model.rb index fe9b38f10442b65f22d68329482fe1f93b3b9a0d..20ca0ad586e5db35ee5a5cd70104b7818403076c 100644 --- a/app/services/search_service/model.rb +++ b/app/services/search_service/model.rb @@ -47,7 +47,8 @@ module SearchService } }, size: @search.results_per_page, - from: ((@search.page.to_i) * (@search.results_per_page.to_i)).to_s + from: ((@search.page.to_i) * (@search.results_per_page.to_i)).to_s, + sort: order_hash } return match_all_query if @search.query == '*' @@ -64,7 +65,8 @@ module SearchService # https://www.elastic.co/guide/en/elasticsearch/guide/current/pagination.html # Comeca pagina 0 size: @search.results_per_page, - from: ((@search.page.to_i) * (@search.results_per_page.to_i)).to_s + from: ((@search.page.to_i) * (@search.results_per_page.to_i)).to_s, + sort: order_hash } end diff --git a/app/services/search_service/user.rb b/app/services/search_service/user.rb index ea8ef836da2db171ffc9327f8afe79f82bc8acde..03898bdc3ac84c6c30bbc046843abb86b34deb45 100644 --- a/app/services/search_service/user.rb +++ b/app/services/search_service/user.rb @@ -20,7 +20,7 @@ module SearchService def order_hash return { name: { order: :asc, unmapped_type: :string } } if @search.order == 'title' - nil + "_score" end end end diff --git a/config/routes.rb b/config/routes.rb index df4dbc69e123122d8a2d473e6402c455aeb2d470..2ef9a747bce42a72c79b623e5ba1d374077703ee 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -13,6 +13,7 @@ Rails.application.routes.draw do member do post 'follow', as: :follow, action: :follow delete 'follow', as: :unfollow, action: :unfollow + put 'follow', as: :follow_toggle, action: :follow_toggle end end diff --git a/spec/acceptance/learning_objects_spec.rb b/spec/acceptance/learning_objects_spec.rb index 02bbc1c7182425cb2a8d3e53b4fc7bfdc6edd573..13a8a4f2019d4e938d9b0ef9621b6bd70185530c 100644 --- a/spec/acceptance/learning_objects_spec.rb +++ b/spec/acceptance/learning_objects_spec.rb @@ -54,9 +54,13 @@ resource 'Learning Objects' do parameter :object_type_id, 'The id of object type', scope: :learning_object parameter :language_id, 'The id of a language', scope: :learning_object parameter :license_id, 'The id of a license', scope: :learning_object + parameter :curator, 'The name of curator', scope: :learning_object + parameter :thumbnail, 'The learning_object thumbnail', scope: :learning_object let(:author) { Faker::Name.name } let(:name) { Faker::Name.name } + let(:curator) { Faker::Name.name } + let(:thumbnail) { Faker::Avatar.image } let(:description) { Faker::Lorem.paragraph } let(:object_type_id) { object_types.first.id } let(:language_id) { languages.first.id } diff --git a/spec/acceptance/searches_spec.rb b/spec/acceptance/searches_spec.rb index 08d7a25020fc14693643e86571608449b1554928..967a2cab98dd32f5630475d6f4430422e09e4f1a 100644 --- a/spec/acceptance/searches_spec.rb +++ b/spec/acceptance/searches_spec.rb @@ -5,7 +5,7 @@ resource 'Searches' do explanation "Search is a query for Learning Objects, Collections or Users." before { 12.times { create(:learning_object); LearningObject.reindex } } - + get '/v1/search' do parameter :page, 'Results page number' @@ -19,9 +19,9 @@ resource 'Searches' do parameter :types, 'Filter the search by Learning Object object types, array of ids. Example: object_types[]=1&object_types[]=2' - let(:page) { 1 } + let(:page) { 0 } let(:results_per_page) { 12 } - let(:order) { "score" } + let(:order) { "_score" } let(:query) { "*" } let(:search_class) { "LearningObject" } @@ -49,10 +49,6 @@ resource 'Searches' do do_request expect(status).to eq(200) end - - - - end