You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
educoder/app/services/admins/competition_basic_setting_s...

72 lines
3.1 KiB

class Admins::CompetitionBasicSettingService < ApplicationService
attr_reader :competition, :params
def initialize(competition, params)
@params = params
@competition = competition
end
def call
ActiveRecord::Base.transaction do
competition.name = strip params[:name]
competition.sub_title = strip params[:sub_title]
competition.start_time = params[:start_time]
competition.end_time = params[:end_time]
competition.mode = params[:mode]
competition.identifier = strip params[:identifier]
competition.bonus = params[:bonus]
competition.awards_count = params[:awards_count]
competition.description = strip params[:description]
competition.save!
# 竞赛模式相关设置
if competition.mode == 1 || competition.mode == 4
competition.competition_mode_setting&.destroy
else
setting = competition.competition_mode_setting || CompetitionModeSetting.create!(competition_id: competition.id)
if competition.mode == 2
setting.course_id = params[:course_id]
elsif competition.mode == 3
setting.start_time = params[:teach_start_time]
setting.end_time = params[:teach_end_time]
end
setting.save!
end
# 管理员设置
params[:manager_ids] = Array.wrap(params[:manager_ids]).map(&:to_i)
old_manager_ids = competition.competition_managers.pluck(:user_id)
new_manager_ids = params[:manager_ids] - old_manager_ids
delete_manager_ids = old_manager_ids - params[:manager_ids]
CompetitionManager.bulk_insert(*%i[user_id competition_id created_at updated_at]) do |worker|
new_manager_ids.each do |manager_id|
worker.add(user_id: manager_id, competition_id: competition.id)
end
end
competition.competition_managers.where(user_id: delete_manager_ids).delete_all
# 主办方设置
params[:sponsor_schools] = Array.wrap(params[:sponsor_schools]).map(&:to_i)
new_sponsor_school_ids = competition.sponsor_schools.pluck(:school_id)
new_school_ids = params[:sponsor_schools] - new_sponsor_school_ids
delete_school_ids = new_sponsor_school_ids - params[:sponsor_schools]
new_school_ids.each do |school_id|
CompetitionSchool.create!(competition_id: competition.id, school_id: school_id, source: 'sponsor')
end
competition.sponsor_schools.where(school_id: delete_school_ids).destroy_all
# 开放范围设置
params[:region_schools] = Array.wrap(params[:region_schools]).map(&:to_i)
old_region_school_ids = competition.region_schools.pluck(:school_id)
new_region_school_ids = params[:region_schools] - old_region_school_ids
delete_region_school_ids = old_region_school_ids - params[:region_schools]
new_region_school_ids.each do |school_id|
CompetitionSchool.create!(competition_id: competition.id, school_id: school_id, source: 'region')
end
competition.region_schools.where(school_id: delete_region_school_ids).destroy_all unless delete_region_school_ids.length == 0
competition
end
end
end