File: group_members_controller.rb

package info (click to toggle)
gitlab 17.6.5-19
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 629,368 kB
  • sloc: ruby: 1,915,304; javascript: 557,307; sql: 60,639; xml: 6,509; sh: 4,567; makefile: 1,239; python: 406
file content (150 lines) | stat: -rw-r--r-- 4,016 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# frozen_string_literal: true

class Groups::GroupMembersController < Groups::ApplicationController
  include MembershipActions
  include MembersPresentation
  include SortingHelper
  include Gitlab::Utils::StrongMemoize

  MEMBER_PER_PAGE_LIMIT = 50

  def self.admin_not_required_endpoints
    %i[index leave request_access]
  end

  # Authorize
  before_action :authorize_owner_access!, only: :bulk_reassignment_file
  before_action :authorize_admin_group_member!, except: admin_not_required_endpoints
  before_action :authorize_read_group_member!, only: :index

  before_action only: [:index] do
    push_frontend_feature_flag(:importer_user_mapping, current_user)
    push_frontend_feature_flag(:importer_user_mapping_reassignment_csv, current_user)
    push_frontend_feature_flag(:service_accounts_crud, @group)
  end

  skip_before_action :check_two_factor_requirement, only: :leave
  skip_cross_project_access_check :index, :update, :destroy, :request_access,
    :approve_access_request, :leave, :resend_invite, :override

  feature_category :groups_and_projects
  urgency :low

  def index
    @sort = params[:sort].presence || sort_value_name
    @include_relations ||= requested_relations(:groups_with_inherited_permissions)

    if can?(current_user, :admin_group_member, @group)
      @invited_members = invited_members

      if params[:search_invited].present?
        @invited_members = @invited_members.search_invite_email(params[:search_invited])
      end

      @invited_members = present_invited_members(@invited_members)
    end

    @members = present_group_members(non_invited_members)
    @placeholder_users_count = placeholder_users_count

    @requesters = present_members(
      AccessRequestsFinder.new(@group).execute(current_user)
    )
  end

  def bulk_reassignment_file
    return render_404 unless Feature.enabled?(:importer_user_mapping_reassignment_csv, current_user)

    csv_response = Import::SourceUsers::GenerateCsvService.new(membershipable, current_user: current_user).execute

    if csv_response.success?
      send_data(
        csv_response.payload,
        filename: "bulk_reassignments_for_namespace_#{membershipable.id}_#{Time.current.to_i}.csv",
        type: 'text/csv; charset=utf-8'
      )
    else
      redirect_back_or_default(options: { alert: csv_response.message })
    end
  end

  # MembershipActions concern
  alias_method :membershipable, :group

  private

  def members
    @members ||= GroupMembersFinder
      .new(@group, current_user, params: filter_params)
      .execute(include_relations: requested_relations)
  end

  def invited_members
    members.invite.with_invited_user_state
  end

  def non_invited_members
    members.non_invite
  end

  def present_invited_members(invited_members)
    present_members(invited_members
      .page(params[:invited_members_page])
      .per(MEMBER_PER_PAGE_LIMIT))
  end

  def present_group_members(members)
    present_members(members
      .page(params[:page])
      .per(MEMBER_PER_PAGE_LIMIT))
  end

  def filter_params
    params.permit(:two_factor, :search, :user_type, :max_role).merge(sort: @sort)
  end

  def membershipable_members
    group.members
  end

  def plain_source_type
    'group'
  end

  def source_type
    _("group")
  end

  def source
    group
  end

  def members_page_url
    polymorphic_url([group, :members])
  end

  def root_params_key
    :group_member
  end

  def placeholder_users_count
    {
      pagination: {
        total_items: placeholder_users.count,
        awaiting_reassignment_items: placeholder_users.awaiting_reassignment.count,
        reassigned_items: placeholder_users.reassigned.count
      }
    }
  end

  def placeholder_users
    if Feature.enabled?(:importer_user_mapping, current_user)
      Import::SourceUsersFinder.new(@group, current_user).execute
    else
      Import::SourceUser.none
    end
  end
  strong_memoize_attr :placeholder_users
end

Groups::GroupMembersController.prepend_mod_with('Groups::GroupMembersController')