2021-04-25 00:43:28 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
class ProjectMember
|
|
|
|
include ActiveModel::Model
|
|
|
|
|
|
|
|
attr_accessor :user, :project, :assign, :user_role_id, :user_id
|
2021-04-29 00:02:18 +08:00
|
|
|
attr_reader :current_user, :user_assignment, :user_role
|
2021-04-25 00:43:28 +08:00
|
|
|
|
2021-04-29 00:02:18 +08:00
|
|
|
delegate :user_role, to: :user_assignment, allow_nil: true
|
2021-04-25 00:43:28 +08:00
|
|
|
|
2021-04-29 00:02:18 +08:00
|
|
|
validates :user, :project, presence: true, if: -> { assign }
|
|
|
|
validates :user_role_id, presence: true, if: -> { assign }
|
|
|
|
validate :validate_role_presence, if: -> { assign }
|
|
|
|
validate :validate_user_project_relation_presence, if: -> { assign }
|
|
|
|
validate :validate_user_project_assignment_presence, if: -> { assign }
|
|
|
|
|
|
|
|
def initialize(user, project, current_user = nil)
|
2021-04-25 00:43:28 +08:00
|
|
|
@user = user
|
|
|
|
@project = project
|
|
|
|
@current_user = current_user
|
2021-04-29 00:02:18 +08:00
|
|
|
@user_assignment = UserAssignment.find_by(assignable: @project, user: @user)
|
2021-04-25 00:43:28 +08:00
|
|
|
end
|
|
|
|
|
2021-04-29 00:02:18 +08:00
|
|
|
def create
|
2021-04-25 00:43:28 +08:00
|
|
|
return unless assign
|
|
|
|
|
|
|
|
ActiveRecord::Base.transaction do
|
|
|
|
UserProject.create!(project: @project, user: @user)
|
|
|
|
UserAssignment.create!(assignable: @project, user: @user, user_role: set_user_role, assigned_by: current_user)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-04-29 00:02:18 +08:00
|
|
|
def update
|
|
|
|
validate_role_presence
|
|
|
|
return false unless valid?
|
|
|
|
user_assignment = UserAssignment.find_by!(assignable: @project, user: @user)
|
|
|
|
user_assignment.update(user_role: set_user_role)
|
|
|
|
end
|
|
|
|
|
|
|
|
def destroy
|
|
|
|
user_assignment = UserAssignment.find_by!(assignable: @project, user: @user)
|
|
|
|
user_project = UserProject.find_by!(project: @project, user: @user)
|
|
|
|
|
|
|
|
ActiveRecord::Base.transaction do
|
|
|
|
user_assignment.destroy!
|
|
|
|
user_project.destroy!
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-04-25 00:43:28 +08:00
|
|
|
def assign=(value)
|
|
|
|
@assign = ActiveModel::Type::Boolean.new.cast(value)
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def set_user_role
|
2021-04-29 00:02:18 +08:00
|
|
|
UserRole.find(user_role_id)
|
2021-04-25 00:43:28 +08:00
|
|
|
end
|
|
|
|
|
2021-04-29 00:02:18 +08:00
|
|
|
def validate_role_presence
|
|
|
|
errors.add(:user_role_id, :not_found) if UserRole.find_by(id: user_role_id).nil?
|
2021-04-25 00:43:28 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
def validate_user_project_relation_presence
|
|
|
|
if UserProject.find_by(project: @project, user: @user).present?
|
|
|
|
errors.add(:user)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def validate_user_project_assignment_presence
|
|
|
|
if UserAssignment.find_by(assignable: @project, user: @user).present?
|
2021-04-29 00:02:18 +08:00
|
|
|
errors.add(:user_role_id, :already_present)
|
2021-04-25 00:43:28 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|