Merge branch 'dev_aliyun' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_aliyun
commit
68b3656906
@ -1,96 +0,0 @@
|
|||||||
class SearchShixunService < ApplicationService
|
|
||||||
include ElasticsearchAble
|
|
||||||
|
|
||||||
attr_reader :user, :params
|
|
||||||
|
|
||||||
def initialize(user, params)
|
|
||||||
@user = user
|
|
||||||
@params = params
|
|
||||||
end
|
|
||||||
|
|
||||||
def call
|
|
||||||
Shixun.search(keyword,
|
|
||||||
fields: search_fields,
|
|
||||||
where: where_clauses,
|
|
||||||
order: order_clauses,
|
|
||||||
includes: includes_clauses,
|
|
||||||
page: page,
|
|
||||||
per_page: per_page)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def tag_filter_shixun_ids
|
|
||||||
return [] if params[:tag_level].to_i == 0 || params[:tag_id].blank?
|
|
||||||
|
|
||||||
case params[:tag_level].to_i
|
|
||||||
when 1 then
|
|
||||||
Repertoire.find(params[:tag_id]).tag_repertoires.joins(:shixun_tag_repertoires)
|
|
||||||
.pluck('shixun_tag_repertoires.shixun_id')
|
|
||||||
when 2 then
|
|
||||||
SubRepertoire.find(params[:tag_id]).tag_repertoires.joins(:shixun_tag_repertoires)
|
|
||||||
.pluck('shixun_tag_repertoires.shixun_id')
|
|
||||||
when 3 then
|
|
||||||
TagRepertoire.find(params[:tag_id]).shixun_tag_repertoires.pluck(:shixun_id)
|
|
||||||
else
|
|
||||||
[]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def user_filter_shixun_ids
|
|
||||||
return [] if params[:order_by] != 'mine'
|
|
||||||
|
|
||||||
user.shixun_members.pluck(:shixun_id) + user.myshixuns.pluck(:shixun_id)
|
|
||||||
end
|
|
||||||
|
|
||||||
def keyword
|
|
||||||
params[:keyword].to_s.strip.presence || '*'
|
|
||||||
end
|
|
||||||
|
|
||||||
def search_fields
|
|
||||||
%w(name^10 author_name challenge_names description challenge_tag_names)
|
|
||||||
end
|
|
||||||
|
|
||||||
def where_clauses
|
|
||||||
hash = {}
|
|
||||||
|
|
||||||
ids = user_filter_shixun_ids + tag_filter_shixun_ids
|
|
||||||
hash[:id] = ids if ids.present?
|
|
||||||
|
|
||||||
if params[:order_by] == 'mine'
|
|
||||||
hash[:status] = { not: -1 }
|
|
||||||
else
|
|
||||||
hash.merge!(hidden: false, status: 2)
|
|
||||||
end
|
|
||||||
|
|
||||||
unless params[:status].to_i.zero?
|
|
||||||
params[:status] = [0, 1] if params[:status].to_i == 1
|
|
||||||
hash[:status] = params[:status]
|
|
||||||
end
|
|
||||||
|
|
||||||
hash[:trainee] = params[:diff].to_i unless params[:diff].to_i.zero?
|
|
||||||
|
|
||||||
hash
|
|
||||||
end
|
|
||||||
|
|
||||||
def includes_clauses
|
|
||||||
[]
|
|
||||||
end
|
|
||||||
|
|
||||||
def order_clauses
|
|
||||||
hash = { _score: :desc }
|
|
||||||
publish_order = { type: 'number', order: :desc, script: 'doc["status"].value=="2" ? 1 : 0' }
|
|
||||||
|
|
||||||
sort = params[:sort].to_s.strip == 'asc' ? 'asc' : 'desc'
|
|
||||||
clauses =
|
|
||||||
case params[:order_by].presence
|
|
||||||
when 'new' then { _script: publish_order, created_at: sort }
|
|
||||||
when 'hot' then { _script: publish_order, myshixuns_count: sort }
|
|
||||||
when 'mine' then { created_at: sort }
|
|
||||||
else { _script: publish_order, publish_time: sort }
|
|
||||||
end
|
|
||||||
hash.merge!(clauses)
|
|
||||||
|
|
||||||
hash
|
|
||||||
end
|
|
||||||
end
|
|
Loading…
Reference in new issue