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