summaryrefslogtreecommitdiff
path: root/lib/api/groups.rb
blob: 5629e898f8eee8026b8ba5f190e719b9429e2e00 (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
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
module API
  # groups API
  class Groups < Grape::API
    before { authenticate! }

    resource :groups do
      # Get a groups list
      #
      # Example Request:
      #  GET /groups
      get do
        @groups = if current_user.admin
                    Group.all
                  else
                    current_user.groups
                  end

        @groups = @groups.search(params[:search]) if params[:search].present?
        @groups = paginate @groups
        present @groups, with: Entities::Group
      end

      # Create group. Available only for users who can create groups.
      #
      # Parameters:
      #   name                  (required) - The name of the group
      #   path                  (required) - The path of the group
      #   description           (optional) - The details of the group
      #   membership_lock       (optional, boolean) - Prevent adding new members to project membership within this group
      #   share_with_group_lock (optional, boolean) - Prevent sharing a project with another group within this group
      # Example Request:
      #   POST /groups
      post do
        authorize! :create_group, current_user
        required_attributes! [:name, :path]

        attrs = attributes_for_keys [:name, :path, :description, :membership_lock, :share_with_group_lock]
        @group = Group.new(attrs)

        if @group.save
          # NOTE: add backwards compatibility for single ldap link
          ldap_attrs  = attributes_for_keys [:ldap_cn, :ldap_access]
          if ldap_attrs.present?
            @group.ldap_group_links.create({
              cn: ldap_attrs[:ldap_cn],
              group_access: ldap_attrs[:ldap_access]
            })
          end

          @group.add_owner(current_user)
          present @group, with: Entities::Group
        else
          render_api_error!("Failed to save group #{@group.errors.messages}", 400)
        end
      end

      # Update group. Available only for users who can manage this group.
      #
      # Parameters:
      #   id                    (required) - The ID of a group
      #   name                  (required) - The name of the group
      #   path                  (required) - The path of the group
      #   description           (optional) - The details of the group
      #   membership_lock       (optional, boolean) - Prevent adding new members to project membership within this group
      #   share_with_group_lock (optional, boolean) - Prevent sharing a project with another group within this group
      # Example Request:
      #   PUT /groups/:id
      put ":id" do
        attrs = attributes_for_keys [:name, :path, :description, :membership_lock, :share_with_group_lock]
        @group = find_group(params[:id])
        authorize! :admin_group, @group

        if @group.update_attributes(attrs)
          present @group, with: Entities::Group
        else
          render_api_error!("Failed to update group #{@group.errors.messages}", 400)
        end
      end

      # Get a single group, with containing projects
      #
      # Parameters:
      #   id (required) - The ID of a group
      # Example Request:
      #   GET /groups/:id
      get ":id" do
        group = find_group(params[:id])
        present group, with: Entities::GroupDetail
      end

      # Remove group
      #
      # Parameters:
      #   id (required) - The ID of a group
      # Example Request:
      #   DELETE /groups/:id
      delete ":id" do
        group = find_group(params[:id])
        authorize! :admin_group, group
        DestroyGroupService.new(group, current_user).execute
      end

      # Get a list of projects in this group
      #
      # Example Request:
      #   GET /groups/:id/projects
      get ":id/projects" do
        group = find_group(params[:id])
        projects = group.projects
        projects = filter_projects(projects)
        projects = paginate projects
        present projects, with: Entities::Project
      end

      # Transfer a project to the Group namespace
      #
      # Parameters:
      #   id - group id
      #   project_id  - project id
      # Example Request:
      #   POST /groups/:id/projects/:project_id
      post ":id/projects/:project_id" do
        authenticated_as_admin!
        group = Group.find_by(id: params[:id])
        project = Project.find(params[:project_id])
        result = ::Projects::TransferService.new(project, current_user).execute(group)

        if result
          present group
        else
          render_api_error!("Failed to transfer project #{project.errors.messages}", 400)
        end
      end
    end
  end
end