91 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Ruby
		
	
	
	
class MembersController < ApplicationController
 | 
						|
  before_action :require_login
 | 
						|
  before_action :load_project
 | 
						|
  before_action :find_user_with_id, only: %i[create remove change_role]
 | 
						|
  before_action :check_user_profile_completed, only: [:create]
 | 
						|
  before_action :operate!
 | 
						|
  before_action :check_member_exists!, only: %i[create]
 | 
						|
  before_action :check_member_not_exists!, only: %i[remove change_role]
 | 
						|
 | 
						|
  def create
 | 
						|
    interactor = Projects::AddMemberInteractor.call(@project.owner, @project, @user)
 | 
						|
    SendTemplateMessageJob.perform_later('ProjectJoined', current_user.id, @user.id, @project.id) if Site.has_notice_menu?
 | 
						|
    SendTemplateMessageJob.perform_later('ProjectMemberJoined', current_user.id, @user.id, @project.id) if Site.has_notice_menu?
 | 
						|
    render_response(interactor)
 | 
						|
  rescue Exception => e
 | 
						|
    uid_logger_error(e.message)
 | 
						|
    tip_exception(e.message)
 | 
						|
  end
 | 
						|
 | 
						|
  def index
 | 
						|
    scope = @project.members.includes(:roles, user: :user_extension)
 | 
						|
    search = params[:search].to_s.downcase
 | 
						|
    role = params[:role].to_s
 | 
						|
    scope = scope.joins(:user).merge(User.like(search))
 | 
						|
    scope = scope.joins(:roles).where("roles.name LIKE ?", "%#{role}%") if role.present?
 | 
						|
 | 
						|
    @total_count = scope.size
 | 
						|
    @members = paginate(scope)
 | 
						|
    if @project.owner.is_a?(Organization) && (params[:page].to_i == 1 || params[:page].blank?) && !@project.members.exists?(user_id: current_user.id)
 | 
						|
      @current_user_header_team = Team.joins(:team_users, :team_projects).where(team_projects: {project_id: @project.id}, team_users: {user_id: current_user.id}).order(authorize: :desc).take
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def remove
 | 
						|
    interactor = Projects::DeleteMemberInteractor.call(@project.owner, @project, @user)
 | 
						|
    SendTemplateMessageJob.perform_later('ProjectLeft', current_user.id, @user.id, @project.id) if Site.has_notice_menu?
 | 
						|
    SendTemplateMessageJob.perform_later('ProjectMemberLeft', current_user.id, @user.id, @project.id) if Site.has_notice_menu?
 | 
						|
    render_response(interactor)
 | 
						|
  rescue Exception => e
 | 
						|
    uid_logger_error(e.message)
 | 
						|
    tip_exception(e.message)
 | 
						|
  end
 | 
						|
 | 
						|
  def change_role
 | 
						|
    interactor = Projects::ChangeMemberRoleInteractor.call(@project.owner, @project, @user, params[:role])
 | 
						|
    SendTemplateMessageJob.perform_later('ProjectRole', current_user.id, @user.id, @project.id, message_role_name) if Site.has_notice_menu?
 | 
						|
    render_response(interactor)
 | 
						|
  rescue Exception => e
 | 
						|
    uid_logger_error(e.message)
 | 
						|
    tip_exception(e.message)
 | 
						|
  end
 | 
						|
 | 
						|
  private
 | 
						|
  def can_operate?
 | 
						|
    current_user.project_manager?(@project)
 | 
						|
  end
 | 
						|
 | 
						|
  def member_exists?
 | 
						|
    @project.members.exists?(user_id: params[:user_id])
 | 
						|
  end
 | 
						|
 | 
						|
  def operate!
 | 
						|
    return render_forbidden('你不是管理员,没有权限操作') unless can_operate?
 | 
						|
  end
 | 
						|
 | 
						|
  def check_member_exists!
 | 
						|
    @current_user_header_team = Team.joins(:team_users, :team_projects).where(team_projects: {project_id: @project.id}, team_users: {user_id: current_user.id}).order(authorize: :desc).take
 | 
						|
    return render_error("#{@user&.nickname}已经是项目成员") if member_exists? || (params[:user_id].to_i == current_user.id && @current_user_header_team.present?)
 | 
						|
  end
 | 
						|
 | 
						|
  def check_member_not_exists!
 | 
						|
    @current_user_header_team = Team.joins(:team_users, :team_projects).where(team_projects: {project_id: @project.id}, team_users: {user_id: current_user.id}).order(authorize: :desc).take
 | 
						|
    return render_error("用户为组织成员,请到组织下操作!") if (params[:user_id].to_i == current_user.id && @current_user_header_team.present?) && !member_exists?
 | 
						|
    return render_error("#{@user&.nickname}还不是项目成员") unless member_exists?
 | 
						|
  end
 | 
						|
 | 
						|
  def check_user_profile_completed
 | 
						|
    require_user_profile_completed(@user)
 | 
						|
  end
 | 
						|
 | 
						|
  def message_role_name 
 | 
						|
    case params[:role]
 | 
						|
    when 'Manager' then '管理员'
 | 
						|
    when 'Developer' then '开发者'
 | 
						|
    when 'Reporter' then '报告者'
 | 
						|
    else 
 | 
						|
      ''
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |