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.
71 lines
2.4 KiB
71 lines
2.4 KiB
class Competitions::SaveTeamService < ApplicationService
|
|
attr_reader :competition, :team, :creator, :params
|
|
|
|
TEAM_MEMBER_ATTRIBUTES = %i[competition_id competition_team_id user_id role is_teacher created_at updated_at]
|
|
|
|
def initialize(team, params)
|
|
@team = team
|
|
@competition = team.competition
|
|
@creator = team.user
|
|
@params = params
|
|
end
|
|
|
|
def call
|
|
Competitions::SaveTeamForm.new(form_params).validate!
|
|
|
|
new_record = team.new_record?
|
|
is_teacher = team.user.is_teacher?
|
|
ActiveRecord::Base.transaction do
|
|
team.generate_invite_code if new_record
|
|
team.team_type = 1 # 组队竞赛
|
|
team.name = params[:name].to_s.strip
|
|
team.save!
|
|
|
|
# 创建者
|
|
team.team_members.create!(user_id: creator.id, competition_id: competition.id, role: 1, is_teacher: is_teacher) if new_record
|
|
|
|
update_teacher_team_members!
|
|
update_member_team_members!
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def update_teacher_team_members!
|
|
teacher_ids = Array.wrap(params[:teacher_ids]).map(:to_i)
|
|
old_teacher_ids = team.team_members.where(role: 3).pluck(:user_id)
|
|
|
|
destroy_teacher_ids = old_teacher_ids - teacher_ids
|
|
team.team_members.where(role: 3).where(user_id: destroy_teacher_ids).delete_all
|
|
|
|
new_teacher_ids = teacher_ids - old_teacher_ids
|
|
TeamMember.bulk_insert(*TEAM_MEMBER_ATTRIBUTES) do |worker|
|
|
base_attr = { competition_id: competition.id, competition_team_id: team.id, role: 3, is_teacher: true }
|
|
new_teacher_ids.each do |teacher_id|
|
|
next if teacher_id == creator.id
|
|
worker.add(base_attr.merge(user_id: teacher_id))
|
|
end
|
|
end
|
|
end
|
|
|
|
def update_member_team_members!
|
|
member_ids = Array.wrap(params[:member_ids]).map(:to_i)
|
|
old_member_ids = team.team_members.where(role: 2).pluck(:user_id)
|
|
|
|
destroy_member_ids = old_member_ids - member_ids
|
|
team.team_members.where(role: 2).where(user_id: destroy_member_ids).delete_all
|
|
|
|
new_member_ids = member_ids - old_member_ids
|
|
TeamMember.bulk_insert(*TEAM_MEMBER_ATTRIBUTES) do |worker|
|
|
base_attr = { competition_id: competition.id, competition_team_id: team.id, role: 2, is_teacher: false }
|
|
new_member_ids.each do |member_id|
|
|
next if member_id == creator.id
|
|
worker.add(base_attr.merge(user_id: member_id))
|
|
end
|
|
end
|
|
end
|
|
|
|
def form_params
|
|
params.merge(competition: competition, team: team, creator: creator)
|
|
end
|
|
end |