86 lines
2.1 KiB
Ruby
86 lines
2.1 KiB
Ruby
class Projects::LinkJoinService < ApplicationService
|
|
Error = Class.new(StandardError)
|
|
|
|
attr_reader :user, :project, :invite_sign, :params
|
|
|
|
def initialize(user, project, invite_sign, params={})
|
|
@user = user
|
|
@project = project
|
|
@invite_sign = invite_sign
|
|
@params = params
|
|
end
|
|
|
|
def call
|
|
ActiveRecord::Base.transaction do
|
|
validate!
|
|
if invite_link.is_apply
|
|
# 如果需要申请才能加入,创建一条申请记录
|
|
create_applied_project!
|
|
else
|
|
# 如果不需要申请,直接为项目添加该成员
|
|
create_member!
|
|
end
|
|
end
|
|
end
|
|
|
|
private
|
|
def validate!
|
|
raise Error, 'invite_sign必须存在!' if invite_sign.blank?
|
|
raise Error, '邀请链接不存在!' unless invite_link.present?
|
|
raise Error, '邀请链接已失效!' unless invite_user_in_project
|
|
raise Error, '您已是仓库成员' if project.member?(user.id)
|
|
raise Error, '您的申请管理员正在审核中,请勿重复申请!' if user.applied_projects.exists?(applied_project_params)
|
|
end
|
|
|
|
def applied_project_params
|
|
{
|
|
status: 'common',
|
|
project: project,
|
|
role: role_value,
|
|
project_invite_link_id: invite_link&.id
|
|
}
|
|
end
|
|
|
|
def create_applied_project!
|
|
user.applied_projects.find_or_create_by!(status: 'common', project: project, role: role_value, project_invite_link_id: invite_link&.id)
|
|
end
|
|
|
|
def create_member!
|
|
Projects::AddMemberInteractor.call(project.owner, project, user, permission)
|
|
end
|
|
|
|
def invite_link
|
|
ProjectInviteLink.find_by(project_id: project.id, sign: invite_sign)
|
|
end
|
|
|
|
def invite_user_in_project
|
|
in_project = project.member?(invite_link.user)
|
|
invite_link.update_column(:expired_at, Time.now) unless in_project
|
|
in_project
|
|
end
|
|
|
|
def role_value
|
|
@_role ||=
|
|
case invite_link&.role
|
|
when 'manager' then 3
|
|
when 'developer' then 4
|
|
when 'reporter' then 5
|
|
else
|
|
5
|
|
end
|
|
end
|
|
|
|
def permission
|
|
case invite_link&.role
|
|
when 'manager'
|
|
'admin'
|
|
when 'developer'
|
|
'write'
|
|
when 'reporter'
|
|
'read'
|
|
else
|
|
'read'
|
|
end
|
|
end
|
|
|
|
end |