forked from Gitlink/forgeplus
100 lines
3.1 KiB
Ruby
100 lines
3.1 KiB
Ruby
class Users::QuestionBankService
|
|
attr_reader :user, :params
|
|
|
|
def initialize(user, params)
|
|
@user = user
|
|
@params = params
|
|
end
|
|
|
|
def call
|
|
relations = class_name.classify.constantize.all
|
|
|
|
relations = category_filter(relations)
|
|
relations = type_filter(relations) if params[:type].present?
|
|
|
|
relations = relations.where(course_list_id: params[:course_list_id]) if params[:course_list_id].present?
|
|
|
|
custom_sort(relations, params[:sort_by], params[:sort_direction])
|
|
end
|
|
|
|
def course_lists
|
|
relation_name = class_name.underscore.pluralize.to_sym
|
|
course_lists = CourseList.joins(relation_name).where.not(relation_name => { id: nil })
|
|
|
|
category_condition =
|
|
case params[:object_type]
|
|
when 'normal' then { homework_type: 1 }
|
|
when 'group' then { homework_type: 3 }
|
|
when 'exercise' then { container_type: 'Exercise' }
|
|
when 'poll' then { container_type: 'Poll' }
|
|
when 'gtask', 'gtopic' then {}
|
|
else raise ArgumentError
|
|
end
|
|
course_lists = course_lists.where(relation_name => category_condition) if category_condition.present?
|
|
|
|
type_condition =
|
|
case params[:type]
|
|
when 'personal' then { user_id: user.id }
|
|
when 'publicly' then { is_public: true }
|
|
else {}
|
|
end
|
|
course_lists = course_lists.where(relation_name => type_condition) if type_condition.present?
|
|
|
|
course_lists.distinct.select(:id, :name)
|
|
end
|
|
|
|
private
|
|
|
|
def class_name
|
|
@_class_name ||= begin
|
|
case params[:object_type]
|
|
when 'normal', 'group' then 'HomeworkBank'
|
|
when 'exercise', 'poll' then 'ExerciseBank'
|
|
when 'gtask' then 'GtaskBank'
|
|
when 'gtopic' then 'GtopicBank'
|
|
else raise ArgumentError
|
|
end
|
|
end
|
|
end
|
|
|
|
def category_filter(relations)
|
|
case params[:object_type]
|
|
when 'normal' then
|
|
relations.where(homework_type: 1)
|
|
when 'group' then
|
|
relations.where(homework_type: 3)
|
|
when 'exercise' then
|
|
relations.where(container_type: 'Exercise')
|
|
when 'poll' then
|
|
relations.where(container_type: 'Poll')
|
|
when 'gtask', 'gtopic' then
|
|
relations.all
|
|
else
|
|
raise ArgumentError
|
|
end
|
|
end
|
|
|
|
def type_filter(relations)
|
|
case params[:type]
|
|
when 'personal' then relations.where(user_id: user.id)
|
|
when 'publicly' then relations.where(is_public: true)
|
|
else relations
|
|
end
|
|
end
|
|
|
|
def custom_sort(relations, sort_by, sort_direction)
|
|
case sort_by
|
|
when 'updated_at' then
|
|
relations.order("updated_at #{sort_direction}, id #{sort_direction}")
|
|
when 'name' then
|
|
relations.order("CONVERT(name USING gbk) COLLATE gbk_chinese_ci #{sort_direction}")
|
|
when 'contributor' then
|
|
order_sql = "CONVERT (users.lastname USING gbk) COLLATE gbk_chinese_ci #{sort_direction},"\
|
|
" CONVERT (users.firstname USING gbk) COLLATE gbk_chinese_ci #{sort_direction}"
|
|
relations.joins(:user).where(users: { status: 1 }).order(order_sql)
|
|
else
|
|
relations
|
|
end
|
|
end
|
|
end
|