Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/member.rb')
-rw-r--r--app/models/member.rb135
1 files changed, 2 insertions, 133 deletions
diff --git a/app/models/member.rb b/app/models/member.rb
index 0636c3c2d4e..14c886e3ab8 100644
--- a/app/models/member.rb
+++ b/app/models/member.rb
@@ -156,7 +156,7 @@ class Member < ApplicationRecord
distinct_members = select('DISTINCT ON (user_id, invite_email) *')
.order('user_id, invite_email, access_level DESC, expires_at DESC, created_at ASC')
- from(distinct_members, :members)
+ unscoped.from(distinct_members, :members)
end
scope :order_name_asc, -> { left_join_users.reorder(Gitlab::Database.nulls_last_order('users.name', 'ASC')) }
@@ -232,140 +232,9 @@ class Member < ApplicationRecord
find_by(invite_token: invite_token)
end
- def add_user(source, user, access_level, existing_members: nil, current_user: nil, expires_at: nil, ldap: false)
- # rubocop: disable CodeReuse/ServiceClass
- # `user` can be either a User object, User ID or an email to be invited
- member = retrieve_member(source, user, existing_members)
- access_level = retrieve_access_level(access_level)
-
- return member unless can_update_member?(current_user, member)
-
- set_member_attributes(
- member,
- access_level,
- current_user: current_user,
- expires_at: expires_at,
- ldap: ldap
- )
-
- if member.request?
- ::Members::ApproveAccessRequestService.new(
- current_user,
- access_level: access_level
- ).execute(
- member,
- skip_authorization: ldap,
- skip_log_audit_event: ldap
- )
- else
- member.save
- end
-
- member
- # rubocop: enable CodeReuse/ServiceClass
- end
-
- # Populates the attributes of a member.
- #
- # This logic resides in a separate method so that EE can extend this logic,
- # without having to patch the `add_user` method directly.
- def set_member_attributes(member, access_level, current_user: nil, expires_at: nil, ldap: false)
- member.attributes = {
- created_by: member.created_by || current_user,
- access_level: access_level,
- expires_at: expires_at
- }
- end
-
- def add_users(source, users, access_level, current_user: nil, expires_at: nil)
- return [] unless users.present?
-
- emails, users, existing_members = parse_users_list(source, users)
-
- self.transaction do
- (emails + users).map! do |user|
- add_user(
- source,
- user,
- access_level,
- existing_members: existing_members,
- current_user: current_user,
- expires_at: expires_at
- )
- end
- end
- end
-
- def access_levels
- Gitlab::Access.sym_options
- end
-
def valid_email?(email)
Devise.email_regexp.match?(email)
end
-
- private
-
- def parse_users_list(source, list)
- emails = []
- user_ids = []
- users = []
- existing_members = {}
-
- list.each do |item|
- case item
- when User
- users << item
- when Integer
- user_ids << item
- when /\A\d+\Z/
- user_ids << item.to_i
- when Devise.email_regexp
- emails << item
- end
- end
-
- if user_ids.present?
- users.concat(User.where(id: user_ids))
- # the below will automatically discard invalid user_ids
- existing_members = source.members_and_requesters.where(user_id: user_ids).index_by(&:user_id)
- end
-
- [emails, users, existing_members]
- end
-
- # This method is used to find users that have been entered into the "Add members" field.
- # These can be the User objects directly, their IDs, their emails, or new emails to be invited.
- def retrieve_user(user)
- return user if user.is_a?(User)
-
- return User.find_by(id: user) if user.is_a?(Integer)
-
- User.find_by_any_email(user) || user
- end
-
- def retrieve_member(source, user, existing_members)
- user = retrieve_user(user)
-
- if user.is_a?(User)
- if existing_members
- existing_members[user.id] || source.members.build(user_id: user.id)
- else
- source.members_and_requesters.find_or_initialize_by(user_id: user.id)
- end
- else
- source.members.build(invite_email: user)
- end
- end
-
- def retrieve_access_level(access_level)
- access_levels.fetch(access_level) { access_level.to_i }
- end
-
- def can_update_member?(current_user, member)
- # There is no current user for bulk actions, in which case anything is allowed
- !current_user || current_user.can?(:"update_#{member.type.underscore}", member)
- end
end
def real_source_type
@@ -570,7 +439,7 @@ class Member < ApplicationRecord
def update_highest_role?
return unless user_id.present?
- previous_changes[:access_level].present?
+ previous_changes[:access_level].present? || destroyed?
end
def update_highest_role_attribute