class Projects::JoinService < ApplicationService attr_reader :project, :user, :opts def initialize(project, user, **opts) @project = project @user = user @opts = opts end def call ActiveRecord::Base.transaction do member = project.members.create!(user: user) member.member_roles.create!(role_id: role_value) project.user_grades.find_or_create_by!(user: user) end ApplyJoinProjectNotifyJob.perform_later(user, project, role_value) project end private def role_value @_role ||= case opts[:role] when 'manager' then 3 when 'developer' then 4 when 'reporter' then 5 else raise ArgumentError end end end