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.
35 lines
1.5 KiB
35 lines
1.5 KiB
5 years ago
|
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
|