Skip to content
Snippets Groups Projects
learning_object.rb 2.06 KiB
Newer Older
module SearchService
  class LearningObject < Model
    def search
      fields = [:license, :tags, :subjects, :educational_stages, :taggings, :publisher, :language, :attachments, :reviews]
Marcela Ribeiro de Oliveira's avatar
Marcela Ribeiro de Oliveira committed
      ::LearningObject.search(body: mount_query, includes: fields, order: order_hash, page: @search.page, per_page: @search.results_per_page)
    end

    def autocomplete
      params = {  where: { state: validate_object },
                  fields: ['name^10', 'description', 'author'] }
      result = ::LearningObject.search(@search.query, autocomplete_params.merge(params))

      thumbnail = proc { |obj| obj.default_thumbnail }
      type = proc { |obj| obj.object_type.try(:name) }
      autocomplete_render(result, type, thumbnail)
    end

    private

Mateus Rambo Strey's avatar
Mateus Rambo Strey committed
    def search_fields
      [:name, :description, :author, :object_type]
    end

    def mount_filter
      filter = []
      filter << { in: { tags: @search.tags } } unless @search.tags.blank?
      filter << { in: { subjects: @search.subjects } } unless @search.subjects.blank?
      filter << { in: { educational_stages: @search.educational_stages } } unless @search.educational_stages.blank?
      filter << { in: { object_type: @search.object_types.map(&:to_i) } } unless @search.object_types.blank?
      filter << { terms: { state: validate_object } }
Mateus Rambo Strey's avatar
Mateus Rambo Strey committed
      filter
    end

    def order_hash
      case @search.order
      when 'author' then { author: { order: :asc, unmapped_type: :string } }
      when 'publicationasc' then { published_at: { order: :asc, unmapped_type: :timestamp } }
      when 'publicationdesc' then { published_at: { order: :desc, unmapped_type: :timestamp } }
      when 'title' then { name: { order: :asc, unmapped_type: :string } }
      when 'likes' then { likes: { order: :desc } }
      when 'downloads' then { downloads: { order: :desc } }
      when 'review_average' then { review_average: { order: :desc } }
      else "_score"
      end
    end

    def validate_object
      return [::LearningObject.states[:published]] unless !@user.nil? && @user.is_admin?
      ::LearningObject.states.values