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/competitions/join_team_service.rb

35 lines
1.5 KiB

class Competitions::JoinTeamService < ApplicationService
Error = Class.new(StandardError)
attr_reader :competition, :user, :params
def initialize(competition, user, params)
@competition = competition
@user = user
@params = params
end
def call
invite_code = params[:invite_code].to_s.strip
raise Error, '战队邀请码不能为空' if invite_code.blank?
is_teacher = user.is_teacher?
raise Error, '本竞赛的参赛者限定为:学生' if is_teacher && competition.teacher_enroll_forbidden?
raise Error, '本竞赛的参赛者限定为:教师' if !is_teacher && competition.member_enroll_forbidden?
team = competition.competition_teams.find_by(invite_code: invite_code)
raise Error, '战队邀请码无效' if team.blank?
raise Error, '您已加入该战队' if team.team_members.exists?(user_id: user.id)
enrolled = competition.team_members.exists?(user_id: user.id)
if enrolled && (is_teacher && competition.teacher_multiple_limited?) || (!is_teacher && competition.member_multiple_limited?)
raise Error, '您已加入其它战队'
end
raise Error, '该战队教师人数已满' if is_teacher && team.teachers.count == competition.teacher_staff.maximum
raise Error, '该战队队员人数已满' if !is_teacher && team.members.count == competition.member_staff.maximum
role = is_teacher ? 3 : 2
team.team_members.create!(competition_id: competition.id, user_id: user, role: role, is_teacher: is_teacher)
end
end