diff options
Diffstat (limited to 'app/models/member.rb')
-rw-r--r-- | app/models/member.rb | 135 |
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 |