# frozen_string_literal: true module SortParams extend ActiveSupport::Concern ALLOWED_SORT_FIELDS = %i[created_at updated_at first_seen_at width height score relevance comments tag_count random wilson].freeze ALLOWED_SORT_DIRS = %i[asc desc] def parse_sort sd = ALLOWED_SORT_DIRS.detect { |d| params[:sd] == d.to_s } || :desc return [{ 'galleries.position' => { 'order' => sd, 'nested_path' => 'galleries', 'nested_filter' => { 'term' => { 'galleries.id' => Regexp.last_match(1).to_i } } } }] if params[:sf] =~ /\Agallery_id:(\d+)\z/ return [_random: sd, random_seed: Regexp.last_match(1).to_i] if params[:sf] =~ /\Arandom:(\d+)\z/ sf = ALLOWED_SORT_FIELDS.detect { |f| params[:sf] == f.to_s } || :created_at sf = case sf when :relevance :_score when :comments :comment_count when :random :_random when :wilson :wilson_score else sf end if [:created_at, :updated_at, :_random].include?(sf) [sf => sd] else [{ sf => sd }, { id: :desc }] end end end