parent
29e8337f35
commit
0fbf4a86ec
@ -0,0 +1,59 @@
|
||||
class MembersController < ApplicationController
|
||||
before_action :require_login
|
||||
before_action :find_project_with_id
|
||||
before_action :find_user_with_id, only: %i[create remove change_role]
|
||||
before_action :operate!, except: %i[index]
|
||||
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(current_user, @project, @user)
|
||||
render_response(interactor)
|
||||
rescue Exception => e
|
||||
uid_logger_error(e.message)
|
||||
tip_exception(e.message)
|
||||
end
|
||||
|
||||
def index
|
||||
scope = @project.members.includes(:user, :roles)
|
||||
@total_count = scope.size
|
||||
@members = paginate(scope)
|
||||
end
|
||||
|
||||
def remove
|
||||
interactor = Projects::DeleteMemberInteractor.call(current_user, @project, @user)
|
||||
render_response(interactor)
|
||||
rescue Exception => e
|
||||
uid_logger_error(e.message)
|
||||
tip_exception(e.message)
|
||||
end
|
||||
|
||||
def change_role
|
||||
interactor = Projects::ChangeMemberRoleInteractor.call(current_user, @project, @user, params[:role])
|
||||
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.member?(params[:user_id])
|
||||
end
|
||||
|
||||
def operate!
|
||||
return render_forbidden('你不是管理员,没有权限操作') unless can_operate?
|
||||
end
|
||||
|
||||
def check_member_exists!
|
||||
return render_result(1, "user_id为#{params[:user_id]}的用户已经是项目成员") if member_exists?
|
||||
end
|
||||
|
||||
def check_member_not_exists!
|
||||
return render_result(1, "user_id为#{params[:user_id]}的用户还不是项目成员") unless member_exists?
|
||||
end
|
||||
end
|
@ -0,0 +1,10 @@
|
||||
class Projects::ChangeMemberRoleForm < BaseForm
|
||||
attr_accessor :user_id, :role
|
||||
|
||||
validates :user_id, :role, presence: true
|
||||
validate :check_roles
|
||||
|
||||
def check_roles
|
||||
raise '无效的role值.' unless ["Manager","Developer", "Reporter"].include? role
|
||||
end
|
||||
end
|
@ -0,0 +1,2 @@
|
||||
module MembersHelper
|
||||
end
|
@ -0,0 +1,42 @@
|
||||
module Projects
|
||||
class AddMemberInteractor
|
||||
def self.call(owner, project, collaborator, permission="write")
|
||||
interactor = new(owner, project, collaborator, permission)
|
||||
interactor.run
|
||||
interactor
|
||||
end
|
||||
|
||||
attr_reader :error, :result
|
||||
|
||||
def initialize(owner, project, collaborator, permission)
|
||||
@owner = owner
|
||||
@project = project
|
||||
@collaborator = collaborator
|
||||
@permission = permission
|
||||
end
|
||||
|
||||
def success?
|
||||
@error.nil?
|
||||
end
|
||||
|
||||
def run
|
||||
ActiveRecord::Base.transaction do
|
||||
gitea_result = Gitea::Repository::Members::AddService.new(owner, project.identifier, collaborator.login, permission).call
|
||||
if gitea_result.status == 204
|
||||
project.add_member!(collaborator.id)
|
||||
end
|
||||
fail!(nil)
|
||||
end
|
||||
rescue Exception => exception
|
||||
fail!(exception.message)
|
||||
end
|
||||
|
||||
private
|
||||
attr_reader :owner, :project, :collaborator, :permission
|
||||
|
||||
def fail!(error)
|
||||
@error = error
|
||||
end
|
||||
|
||||
end
|
||||
end
|
@ -0,0 +1,51 @@
|
||||
module Projects
|
||||
class ChangeMemberRoleInteractor
|
||||
def self.call(owner, project, collaborator, role)
|
||||
interactor = new(owner, project, collaborator, role)
|
||||
interactor.run
|
||||
interactor
|
||||
end
|
||||
|
||||
attr_reader :error, :result
|
||||
|
||||
def initialize(owner, project, collaborator, role)
|
||||
@owner = owner
|
||||
@collaborator = collaborator
|
||||
@project = project
|
||||
@role = role
|
||||
end
|
||||
|
||||
def success?
|
||||
@error.nil?
|
||||
end
|
||||
|
||||
def run
|
||||
Projects::ChangeMemberRoleForm.new({user_id: collaborator.id, role: role}).validate!
|
||||
ActiveRecord::Base.transaction do
|
||||
gitea_result = Gitea::Repository::Members::AddService.new(owner, project.identifier, collaborator.login, treated_role).call
|
||||
if gitea_result.status == 204
|
||||
Projects::ChangeMemberRoleService.new(project, collaborator.id, role).call
|
||||
fail!(nil)
|
||||
end
|
||||
end
|
||||
rescue Exception => exception
|
||||
fail!(exception.message)
|
||||
end
|
||||
|
||||
private
|
||||
attr_reader :role, :project, :collaborator, :owner
|
||||
|
||||
def fail!(error)
|
||||
@error = error
|
||||
end
|
||||
|
||||
def treated_role
|
||||
case role
|
||||
when "Manager" then "admin"
|
||||
when "Developer" then "write"
|
||||
when "Reporter" then "read"
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
@ -0,0 +1,41 @@
|
||||
module Projects
|
||||
class DeleteMemberInteractor
|
||||
def self.call(owner, project, collaborator)
|
||||
interactor = new(owner, project, collaborator)
|
||||
interactor.run
|
||||
interactor
|
||||
end
|
||||
|
||||
attr_reader :error, :result
|
||||
|
||||
def initialize(owner, project, collaborator)
|
||||
@owner = owner
|
||||
@project = project
|
||||
@collaborator = collaborator
|
||||
end
|
||||
|
||||
def success?
|
||||
@error.nil?
|
||||
end
|
||||
|
||||
def run
|
||||
ActiveRecord::Base.transaction do
|
||||
gitea_result = Gitea::Repository::Members::DeleteService.new(owner, project.identifier, collaborator.login).call
|
||||
if gitea_result.status == 204
|
||||
project.remove_member!(collaborator.id)
|
||||
end
|
||||
fail!(nil)
|
||||
end
|
||||
rescue Exception => exception
|
||||
fail!(exception.message)
|
||||
end
|
||||
|
||||
private
|
||||
attr_reader :owner, :project, :collaborator
|
||||
|
||||
def fail!(error)
|
||||
@error = error
|
||||
end
|
||||
|
||||
end
|
||||
end
|
@ -0,0 +1,43 @@
|
||||
module ProjectOperable
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
has_many :members
|
||||
# has_many :except_owner_members, -> { members.where("members.use_id != ? ", self.owner.id ) }
|
||||
has_many :manager_members, -> { joins(:roles).where(roles: { name: 'Manager' }) }, class_name: 'Member'
|
||||
end
|
||||
|
||||
def add_member!(user_id, role_name='Developer')
|
||||
member = members.create!(user_id: user_id)
|
||||
set_developer_role(member)
|
||||
end
|
||||
|
||||
def remove_member!(user_id)
|
||||
member = members.find_by(user_id: user_id)
|
||||
member.destroy! if member && self.user_id != user_id
|
||||
end
|
||||
|
||||
def member?(user_id)
|
||||
members.exists?(user_id: user_id)
|
||||
end
|
||||
|
||||
# 除了项目创建者本身
|
||||
def member(user_id)
|
||||
members.where.not("members.user_id = ? ", owner.id).find_by(user_id: user_id)
|
||||
end
|
||||
|
||||
def change_member_role!(user_id, role)
|
||||
member = self.member(user_id)
|
||||
member.member_roles.last.update_attributes!(role: role)
|
||||
end
|
||||
|
||||
def owner?(user)
|
||||
self.owner == user
|
||||
end
|
||||
|
||||
def set_developer_role(member)
|
||||
role = Role.find_by_name 'Developer'
|
||||
member.member_roles.create!(role: role)
|
||||
end
|
||||
|
||||
end
|
@ -1,4 +1,6 @@
|
||||
class MemberRole < ApplicationRecord
|
||||
belongs_to :role
|
||||
belongs_to :member
|
||||
|
||||
validates :member_id, :role_id, presence: true
|
||||
end
|
||||
|
@ -0,0 +1,28 @@
|
||||
# 添加协作者/或者更改协作这的可读写权限
|
||||
class Gitea::Repository::Members::AddService < Gitea::ClientService
|
||||
attr_reader :owner, :repo_name, :collaborator, :permission
|
||||
|
||||
# owner: owner of the repo
|
||||
# repo_name: name of the repo
|
||||
# collaborator: username of the collaborator
|
||||
# permission: permission name, FIX: admin | read | write
|
||||
def initialize(owner, repo_name, collaborator, permission)
|
||||
@owner = owner
|
||||
@repo_name = repo_name
|
||||
@collaborator = collaborator
|
||||
@permission = permission
|
||||
end
|
||||
|
||||
def call
|
||||
put(url, params)
|
||||
end
|
||||
|
||||
private
|
||||
def params
|
||||
Hash.new.merge(token: owner.gitea_token, data: {permission: permission})
|
||||
end
|
||||
|
||||
def url
|
||||
"/repos/#{owner.login}/#{repo_name}/collaborators/#{collaborator}".freeze
|
||||
end
|
||||
end
|
@ -0,0 +1,25 @@
|
||||
class Gitea::Repository::Members::DeleteService < Gitea::ClientService
|
||||
attr_reader :owner, :repo_name, :collaborator
|
||||
|
||||
# owner: owner of the repo
|
||||
# repo_name: name of the repo
|
||||
# collaborator: username of the collaborator
|
||||
def initialize(owner, repo_name, collaborator)
|
||||
@owner = owner
|
||||
@repo_name = repo_name
|
||||
@collaborator = collaborator
|
||||
end
|
||||
|
||||
def call
|
||||
delete(url, params)
|
||||
end
|
||||
|
||||
private
|
||||
def params
|
||||
Hash.new.merge(token: owner.gitea_token)
|
||||
end
|
||||
|
||||
def url
|
||||
"/repos/#{owner.login}/#{repo_name}/collaborators/#{collaborator}".freeze
|
||||
end
|
||||
end
|
@ -0,0 +1,18 @@
|
||||
class Projects::ChangeMemberRoleService < ApplicationService
|
||||
attr_reader :project, :user_id, :role
|
||||
|
||||
def initialize(project, user_id, role)
|
||||
@project = project
|
||||
@user_id = user_id
|
||||
@role = role
|
||||
end
|
||||
|
||||
def call
|
||||
ActiveRecord::Base.transaction do
|
||||
tmp_role = Role.find_by_name role
|
||||
@project.change_member_role!(user_id, tmp_role)
|
||||
end
|
||||
rescue => e
|
||||
raise Error, e.message
|
||||
end
|
||||
end
|
@ -0,0 +1,4 @@
|
||||
json.id user.id
|
||||
json.name user.real_name
|
||||
json.login user.login
|
||||
json.image_url url_to_avatar(user)
|
@ -0,0 +1,6 @@
|
||||
json.total_count @total_count
|
||||
json.members @members do |member|
|
||||
json.partial! 'member', user: member.user
|
||||
json.is_owner @project.owner?(member.user)
|
||||
json.role member.roles.last.name
|
||||
end
|
Loading…
Reference in new issue