48 lines
1.3 KiB
Ruby
48 lines
1.3 KiB
Ruby
class ProjectMembership < ApplicationRecord
|
|
belongs_to :project
|
|
belongs_to :user
|
|
|
|
validates :user_id, uniqueness: { scope: :project_id, message: "already belongs to this Project" }
|
|
validate :account_manager_is_prohibited
|
|
|
|
scope :with_account_auth, -> (account) { joins(user: :account_auths).where(account_auths: { account_id: account }) }
|
|
scope :order_by_user_role_and_user_email, -> (account) { with_account_auth(account).order("account_auths.role DESC, users.email") }
|
|
|
|
attr_accessor :user_email
|
|
|
|
def new_user?
|
|
@user_is_new
|
|
end
|
|
|
|
def save_and_update_account_membership
|
|
ApplicationRecord.transaction do
|
|
if User.exists?(email: user_email)
|
|
@user_is_new = false
|
|
self.user = User.find_by(email: user_email)
|
|
else
|
|
@user_is_new = true
|
|
self.user = Oath::Services::SignUp.new(email: user_email, password: SecureRandom.hex).perform
|
|
end
|
|
|
|
account_auth = user.account_auths.find_or_initialize_by(account: project.account)
|
|
|
|
if !(user.save && account_auth.save && save)
|
|
raise ActiveRecord::Rollback
|
|
return false
|
|
end
|
|
|
|
return true
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def account_manager_is_prohibited
|
|
return if project.nil?
|
|
|
|
if user.account_manager?(project.account)
|
|
errors.add(:user, "is already an account manager")
|
|
end
|
|
end
|
|
end
|