Skip to content
Snippets Groups Projects
Commit 8f69ba7f authored by Mauricio Giacomini Girardello's avatar Mauricio Giacomini Girardello
Browse files

refactoring search service and model

parent 87a0fa09
No related branches found
No related tags found
No related merge requests found
...@@ -4,30 +4,27 @@ class V1::SearchController < ApplicationController ...@@ -4,30 +4,27 @@ class V1::SearchController < ApplicationController
# GET v1/search # GET v1/search
# GET v1/search.json # GET v1/search.json
def index def index
render json: ActiveModel::ArraySerializer.new(SearchService.search(@search, current_user)), status: :ok render json: SearchService.search(@search, current_user), status: :ok
rescue => e rescue SearchService::InvalidSearchError => e
if e.message == 'Invalid search' render json: @search.errors, status: :bad_request
render json: @search.errors, status: :bad_request
else
render nothing: true, status: :internal_server_error
end
end end
# GET v1/search/autocomplete # GET v1/search/autocomplete
# GET v1/search/autocomplete.json # GET v1/search/autocomplete.json
def autocomplete def autocomplete
render json: ActiveModel::ArraySerializer.new(SearchService.autocomplete(@search, current_user)), status: :ok render json: ArraySerializer.new(SearchService.autocomplete(@search, current_user)), status: :ok
rescue => e rescue SearchService::InvalidSearchError => e
if e.message == 'Invalid search' render json: @search.errors, status: :bad_request
render json: @search.errors, status: :bad_request
else
render nothing: true, status: :internal_server_error
end
end end
private private
def set_search def set_search
@search = Search.new(params) @search = Search.new(search_params)
end
# Never trust parameters from the scary internet, only allow the white list through.
def search_params
params.require(:search).permit(:page, :results_per_page, :order, :query, :search_class)
end end
end end
...@@ -4,7 +4,7 @@ class Search ...@@ -4,7 +4,7 @@ class Search
validates_presence_of :query, :results_per_page, :order, :search_class validates_presence_of :query, :results_per_page, :order, :search_class
validates_numericality_of :results_per_page, greater_than: 0 validates_numericality_of :results_per_page, greater_than: 0
validates :search_class, inclusion: { in: %w(LearningObject Collection User) } validates :search_class, inclusion: { in: ::SearchService::SEARCH_CLASSES }
def initialize(params = {}) def initialize(params = {})
super(defaults.merge(params.select { |key, _value| respond_to? key })) super(defaults.merge(params.select { |key, _value| respond_to? key }))
......
module SearchService module SearchService
SEARCH_CLASSES = %w(LearningObject Collection User)
class InvalidSearchError < StandardError; end;
def self.search(search, user) def self.search(search, user)
model = instance(search, user) model = instance(search, user)
model.search.results model.search.results
...@@ -9,8 +13,10 @@ module SearchService ...@@ -9,8 +13,10 @@ module SearchService
model.autocomplete model.autocomplete
end end
private
def self.instance(search, user) def self.instance(search, user)
raise 'Invalid search' unless search.valid? raise InvalidSearchError unless search.valid?
"SearchService::#{search.search_class}".constantize.new(search, user) "SearchService::#{search.search_class}".constantize.new(search, user)
end end
end end
...@@ -71,8 +71,11 @@ Rails.application.routes.draw do ...@@ -71,8 +71,11 @@ Rails.application.routes.draw do
end end
# search routes # search routes
get :search, to: 'search#index' resources :search, only: :index do
get 'search/autocomplete', to: 'search#autocomplete' collection do
get :autocomplete
end
end
resources :collections, concerns: [:followable, :sociable, :reviewable, :taggable, :versionable, :deletable, :highlights] resources :collections, concerns: [:followable, :sociable, :reviewable, :taggable, :versionable, :deletable, :highlights]
resources :learning_objects, concerns: [:sociable, :reviewable, :taggable, :versionable, :deletable, :highlights] do resources :learning_objects, concerns: [:sociable, :reviewable, :taggable, :versionable, :deletable, :highlights] do
......
...@@ -9,23 +9,20 @@ class V1::SearchControllerTest < ActionController::TestCase ...@@ -9,23 +9,20 @@ class V1::SearchControllerTest < ActionController::TestCase
auth_application auth_application
end end
test 'should get index and return :ok' do test 'should search return :ok' do
get :index, search_class: 'LearningObject' SearchService::SEARCH_CLASSES.each do |search_class|
assert_response :ok get :index, search: {search_class: search_class}
assert_response :ok
end
end end
test 'should get index and return :bad_request' do test 'should search with invalid class and return :bad_request' do
get :index get :index, search: {search_class: 'invalid'}
assert_response :bad_request assert_response :bad_request
end end
test 'should get autocomplete and return :ok' do test 'should autocomplete with invalid class and return :bad_request' do
get :autocomplete, search_class: 'LearningObject' get :autocomplete, search: {search_class: 'invalid'}
assert_response :ok
end
test 'should get autocomplete and return :bad_request' do
get :autocomplete
assert_response :bad_request assert_response :bad_request
end end
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment