mirror of
https://github.com/Neetpone/foalfetch.git
synced 2025-02-08 18:06:43 +01:00
46 lines
1.1 KiB
Ruby
46 lines
1.1 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
class StoryFinder
|
||
|
# key is the params scalar field, value is the ES document field to search on
|
||
|
QUERIES = {
|
||
|
q: :title,
|
||
|
author: :author
|
||
|
}.freeze
|
||
|
|
||
|
# key is the params array field, value is the query type and the ES document field to search on.
|
||
|
FILTERS = {
|
||
|
ratings: { type: :should, field: :content_rating },
|
||
|
state: { type: :should, field: :completion_status }
|
||
|
}.freeze
|
||
|
|
||
|
def initialize(params)
|
||
|
@params = params
|
||
|
end
|
||
|
|
||
|
def find(opts)
|
||
|
Story.fancy_search(opts) do |s|
|
||
|
build_queries(s)
|
||
|
build_filters(s)
|
||
|
|
||
|
yield s if block_given?
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
# @param s FancySearchable::FancySearchableOptions
|
||
|
def build_queries(s)
|
||
|
QUERIES.each do |param, field|
|
||
|
s.add_query match: { field => { query: @params[param], operator: :and } } if @params[param].present?
|
||
|
end
|
||
|
end
|
||
|
|
||
|
# @param s FancySearchable::FancySearchableOptions
|
||
|
def build_filters(s)
|
||
|
FILTERS.each do |param, opts|
|
||
|
s.add_filter(bool: {
|
||
|
opts[:type] => @params[param].keys.map { |k| { term: { opts[:field] => k } } }
|
||
|
}) if @params[param].present?
|
||
|
end
|
||
|
end
|
||
|
end
|