summaryrefslogtreecommitdiff
path: root/lib/gitlab/project_authorizations/without_nested_groups.rb
blob: ad87540e6c2a3d53c0dc82ce12ffc6a94774e819 (plain)
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
module Gitlab
  module ProjectAuthorizations
    # Calculating new project authorizations when not supporting nested groups.
    class WithoutNestedGroups
      attr_reader :user

      # user - The User object for which to calculate the authorizations.
      def initialize(user)
        @user = user
      end

      def calculate
        relations = [
          # Projects the user is a direct member of
          user.projects.select_for_project_authorization,

          # Personal projects
          user.personal_projects.select_as_master_for_project_authorization,

          # Projects of groups the user is a member of
          user.groups_projects.select_for_project_authorization,

          # Projects shared with groups the user is a member of
          user.groups.joins(:shared_projects).select_for_project_authorization
        ]

        union = Gitlab::SQL::Union.new(relations)

        ProjectAuthorization
          .unscoped
          .select_from_union(union)
      end
    end
  end
end