# frozen_string_literal: true class ProjectMember include ActiveModel::Model attr_accessor :user, :project, :assign, :user_role_id, :user_id attr_reader :current_user, :user_assignment, :user_role delegate :user_role, to: :user_assignment, allow_nil: true 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) @user = user @project = project @current_user = current_user @user_assignment = UserAssignment.find_by(assignable: @project, user: @user) end def create 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 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 def assign=(value) @assign = ActiveModel::Type::Boolean.new.cast(value) end private def set_user_role UserRole.find(user_role_id) end def validate_role_presence errors.add(:user_role_id, :not_found) if UserRole.find_by(id: user_role_id).nil? 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? errors.add(:user_role_id, :already_present) end end end