From ffface39c63c9d973ab1defaa0bb73cc5034c8be Mon Sep 17 00:00:00 2001 From: Yannick Mau Date: Fri, 27 Oct 2023 21:22:33 +0200 Subject: [PATCH 01/12] Add list, create and delete method for custom roles --- member_roles.go | 80 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 member_roles.go diff --git a/member_roles.go b/member_roles.go new file mode 100644 index 000000000..5ddb7184a --- /dev/null +++ b/member_roles.go @@ -0,0 +1,80 @@ +package gitlab + +import ( + "fmt" + "net/http" +) + +const ( + GuestBaseLevel BaseAccessLevel = 10 +) + +type BaseAccessLevel int + +type MemberRolesService struct { + client *Client +} + +type MemberRole struct { + Id int `json:"id"` + Name string `json:"name"` + Description string `json:"description,omitempty"` + GroupId int `json:"group_id"` + BaseAccessLevel int `json:"base_access_level"` + AdminMergeRequests bool `json:"admin_merge_requests,omitempty"` + AdminVulnerability bool `json:"admin_vulnerability,omitempty"` + ReadCode bool `json:"read_code,omitempty"` + ReadDependency bool `json:"read_dependency,omitempty"` + ReadVulnerability bool `json:"read_vulnerability,omitempty"` + ManageProjectAccessToken bool `json:"manage_project_access_token,omitempty"` +} + +type CreateMemberRoleOptions struct { + Name string `json:"name,"` + BaseAccessLevel BaseAccessLevel `json:"base_access_level"` + Description string `json:"description,omitempty"` + AdminMergeRequest bool `json:"admin_merge_request,omitempty"` + AdminVulnerability bool `json:"admin_vulnerability,omitempty"` + ReadCode bool `json:"read_code,omitempty"` + ReadDependency bool `json:"read_dependency,omitempty"` + ReadVulnerability bool `json:"read_vulnerability,omitempty"` +} + +func (s *MemberRolesService) ListMemberRoles(groupId int, options ...RequestOptionFunc) ([]*MemberRole, *Response, error) { + req, err := s.client.NewRequest(http.MethodGet, fmt.Sprintf("/groups/%d/member_roles", groupId), nil, options) + if err != nil { + return nil, nil, err + } + + var memberRoles []*MemberRole + resp, err := s.client.Do(req, &memberRoles) + if err != nil { + return nil, resp, err + } + + return memberRoles, resp, nil +} + +func (s *MemberRolesService) CreateMemberRole(groupId int, opt *CreateMemberRoleOptions, options ...RequestOptionFunc) (*MemberRole, *Response, error) { + req, err := s.client.NewRequest(http.MethodPost, fmt.Sprintf("/groups/%d/member_roles", groupId), opt, options) + if err != nil { + return nil, nil, err + } + + memberRole := new(MemberRole) + resp, err := s.client.Do(req, memberRole) + if err != nil { + return nil, resp, err + } + + return memberRole, resp, nil +} + +func (s *MemberRolesService) DeleteMemberRole(groupId, memberRoleId int, options ...RequestOptionFunc) (*Response, error) { + req, err := s.client.NewRequest(http.MethodDelete, fmt.Sprintf("/groups/%d/member_roles/%d", groupId, memberRoleId), nil, options) + if err != nil { + return nil, err + } + + return s.client.Do(req, nil) +} From 23497afa25db6062c4fd6cfc193324f7744d66a5 Mon Sep 17 00:00:00 2001 From: Yannick Mau Date: Mon, 30 Oct 2023 16:50:44 +0100 Subject: [PATCH 02/12] Add MemberRolesService to gitlab client --- gitlab.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gitlab.go b/gitlab.go index 88d55057c..1d13ce0e2 100644 --- a/gitlab.go +++ b/gitlab.go @@ -164,6 +164,7 @@ type Client struct { LicenseTemplates *LicenseTemplatesService ManagedLicenses *ManagedLicensesService Markdown *MarkdownService + MemberRolesService *MemberRolesService MergeRequestApprovals *MergeRequestApprovalsService MergeRequests *MergeRequestsService MergeTrains *MergeTrainsService @@ -389,6 +390,7 @@ func newClient(options ...ClientOptionFunc) (*Client, error) { c.LicenseTemplates = &LicenseTemplatesService{client: c} c.ManagedLicenses = &ManagedLicensesService{client: c} c.Markdown = &MarkdownService{client: c} + c.MemberRolesService = &MemberRolesService{client: c} c.MergeRequestApprovals = &MergeRequestApprovalsService{client: c} c.MergeRequests = &MergeRequestsService{client: c, timeStats: timeStats} c.MergeTrains = &MergeTrainsService{client: c} From 672689296ba2a9d331596009d825c3661a043be2 Mon Sep 17 00:00:00 2001 From: Yannick Mau Date: Mon, 30 Oct 2023 16:51:05 +0100 Subject: [PATCH 03/12] Rename field Id to ID --- member_roles.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/member_roles.go b/member_roles.go index 5ddb7184a..5994ad83d 100644 --- a/member_roles.go +++ b/member_roles.go @@ -16,7 +16,7 @@ type MemberRolesService struct { } type MemberRole struct { - Id int `json:"id"` + ID int `json:"id"` Name string `json:"name"` Description string `json:"description,omitempty"` GroupId int `json:"group_id"` @@ -41,7 +41,8 @@ type CreateMemberRoleOptions struct { } func (s *MemberRolesService) ListMemberRoles(groupId int, options ...RequestOptionFunc) ([]*MemberRole, *Response, error) { - req, err := s.client.NewRequest(http.MethodGet, fmt.Sprintf("/groups/%d/member_roles", groupId), nil, options) + path := fmt.Sprintf("groups/%d/member_roles", groupId) + req, err := s.client.NewRequest(http.MethodGet, path, nil, options) if err != nil { return nil, nil, err } @@ -56,7 +57,7 @@ func (s *MemberRolesService) ListMemberRoles(groupId int, options ...RequestOpti } func (s *MemberRolesService) CreateMemberRole(groupId int, opt *CreateMemberRoleOptions, options ...RequestOptionFunc) (*MemberRole, *Response, error) { - req, err := s.client.NewRequest(http.MethodPost, fmt.Sprintf("/groups/%d/member_roles", groupId), opt, options) + req, err := s.client.NewRequest(http.MethodPost, fmt.Sprintf("groups/%d/member_roles", groupId), opt, options) if err != nil { return nil, nil, err } @@ -71,7 +72,7 @@ func (s *MemberRolesService) CreateMemberRole(groupId int, opt *CreateMemberRole } func (s *MemberRolesService) DeleteMemberRole(groupId, memberRoleId int, options ...RequestOptionFunc) (*Response, error) { - req, err := s.client.NewRequest(http.MethodDelete, fmt.Sprintf("/groups/%d/member_roles/%d", groupId, memberRoleId), nil, options) + req, err := s.client.NewRequest(http.MethodDelete, fmt.Sprintf("groups/%d/member_roles/%d", groupId, memberRoleId), nil, options) if err != nil { return nil, err } From 34f8a5a66ee12cc428809111dcde0c4bd6a9077e Mon Sep 17 00:00:00 2001 From: Yannick Mau Date: Mon, 30 Oct 2023 16:51:40 +0100 Subject: [PATCH 04/12] Add ListMemberRoles test --- member_roles_test.go | 52 +++++++++++++++++++++++++++++++++ testdata/list_member_roles.json | 28 ++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 member_roles_test.go create mode 100644 testdata/list_member_roles.json diff --git a/member_roles_test.go b/member_roles_test.go new file mode 100644 index 000000000..09b80cb63 --- /dev/null +++ b/member_roles_test.go @@ -0,0 +1,52 @@ +package gitlab + +import ( + "github.com/stretchr/testify/require" + "net/http" + "testing" +) + +func TestListMemberRoles(t *testing.T) { + mux, client := setup(t) + + path := "/api/v4/groups/1/member_roles" + + mux.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, http.MethodGet) + mustWriteHTTPResponse(t, w, "testdata/list_member_roles.json") + }) + + memberRoles, _, err := client.MemberRolesService.ListMemberRoles(1) + require.NoError(t, err) + + want := []*MemberRole{ + { + ID: 1, + Name: "GuestCodeReader", + Description: "A Guest user that can read code", + GroupId: 1, + BaseAccessLevel: 10, // Guest Base Level + AdminMergeRequests: false, + AdminVulnerability: false, + ReadCode: true, + ReadDependency: false, + ReadVulnerability: false, + ManageProjectAccessToken: false, + }, + { + ID: 2, + Name: "GuestVulnerabilityReader", + Description: "A Guest user that can read vulnerabilities", + GroupId: 1, + BaseAccessLevel: 10, // Guest Base Level + AdminMergeRequests: false, + AdminVulnerability: false, + ReadCode: false, + ReadDependency: false, + ReadVulnerability: true, + ManageProjectAccessToken: false, + }, + } + + require.Equal(t, want, memberRoles) +} diff --git a/testdata/list_member_roles.json b/testdata/list_member_roles.json new file mode 100644 index 000000000..0034eb138 --- /dev/null +++ b/testdata/list_member_roles.json @@ -0,0 +1,28 @@ +[ + { + "id": 1, + "name": "GuestCodeReader", + "description": "A Guest user that can read code", + "group_id": 1, + "base_access_level": 10, + "admin_merge_request": false, + "admin_vulnerability": false, + "read_code": true, + "read_dependency": false, + "read_vulnerability": false, + "manage_project_access_token": false + }, + { + "id": 2, + "name": "GuestVulnerabilityReader", + "description": "A Guest user that can read vulnerabilities", + "group_id": 1, + "base_access_level": 10, + "admin_merge_request": false, + "admin_vulnerability": false, + "read_code": false, + "read_dependency": false, + "read_vulnerability": true, + "manage_project_access_token": false + } +] \ No newline at end of file From be87ec8d7f02ac736bfb8bb5b79b3b4e890a2351 Mon Sep 17 00:00:00 2001 From: Yannick Mau Date: Mon, 30 Oct 2023 16:59:41 +0100 Subject: [PATCH 05/12] Add CreateMemberRole test --- member_roles_test.go | 39 ++++++++++++++++++++++++++++++++ testdata/create_member_role.json | 12 ++++++++++ 2 files changed, 51 insertions(+) create mode 100644 testdata/create_member_role.json diff --git a/member_roles_test.go b/member_roles_test.go index 09b80cb63..fb13afddd 100644 --- a/member_roles_test.go +++ b/member_roles_test.go @@ -50,3 +50,42 @@ func TestListMemberRoles(t *testing.T) { require.Equal(t, want, memberRoles) } + +func TestCreateMemberRole(t *testing.T) { + mux, client := setup(t) + + path := "/api/v4/groups/84/member_roles" + + mux.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, http.MethodPost) + mustWriteHTTPResponse(t, w, "testdata/create_member_role.json") + }) + + memberRole, _, err := client.MemberRolesService.CreateMemberRole(84, &CreateMemberRoleOptions{ + Name: "Custom guest", + BaseAccessLevel: 10, + Description: "a sample custom role", + AdminMergeRequest: false, + AdminVulnerability: false, + ReadCode: true, + ReadDependency: false, + ReadVulnerability: false, + }) + require.NoError(t, err) + + want := &MemberRole{ + ID: 3, + Name: "Custom guest", + Description: "a sample custom role", + BaseAccessLevel: 10, + GroupId: 84, + AdminMergeRequests: false, + AdminVulnerability: false, + ReadCode: true, + ReadDependency: false, + ReadVulnerability: false, + ManageProjectAccessToken: false, + } + + require.Equal(t, want, memberRole) +} diff --git a/testdata/create_member_role.json b/testdata/create_member_role.json new file mode 100644 index 000000000..7e6eba741 --- /dev/null +++ b/testdata/create_member_role.json @@ -0,0 +1,12 @@ +{ + "id": 3, + "name": "Custom guest", + "description": "a sample custom role", + "group_id": 84, + "base_access_level": 10, + "admin_merge_requests": false, + "admin_vulnerability": false, + "read_code": true, + "read_dependency": false, + "read_vulnerability": false +} \ No newline at end of file From bb1c77243d6c7e554196db98ad3612e954d267c1 Mon Sep 17 00:00:00 2001 From: Yannick Mau Date: Mon, 30 Oct 2023 17:02:46 +0100 Subject: [PATCH 06/12] Add DeleteMemberRole test --- member_roles_test.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/member_roles_test.go b/member_roles_test.go index fb13afddd..54c91f8a5 100644 --- a/member_roles_test.go +++ b/member_roles_test.go @@ -89,3 +89,16 @@ func TestCreateMemberRole(t *testing.T) { require.Equal(t, want, memberRole) } + +func TestDeleteMemberRole(t *testing.T) { + mux, client := setup(t) + + path := "/api/v4/groups/1/member_roles/2" + + mux.HandleFunc(path, func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, http.MethodDelete) + }) + + _, err := client.MemberRolesService.DeleteMemberRole(1, 2) + require.NoError(t, err) +} From 57efa298d37267b7990b928691495755db301a23 Mon Sep 17 00:00:00 2001 From: Yannick Mau Date: Mon, 30 Oct 2023 17:03:49 +0100 Subject: [PATCH 07/12] Update module name --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index a7fad8df6..dcadd02af 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/xanzy/go-gitlab +module github.com/mauamy/go-gitlab go 1.18 From 5b587b853a279106260aad41a5cb81da4fa7cec7 Mon Sep 17 00:00:00 2001 From: Yannick Mau Date: Mon, 30 Oct 2023 17:38:56 +0100 Subject: [PATCH 08/12] Revert "Update module name" This reverts commit 57efa298d37267b7990b928691495755db301a23. --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index dcadd02af..a7fad8df6 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/mauamy/go-gitlab +module github.com/xanzy/go-gitlab go 1.18 From 624cf2757c288e9b4389f72144fc90611f4f8aca Mon Sep 17 00:00:00 2001 From: Yannick Mau Date: Mon, 30 Oct 2023 17:42:21 +0100 Subject: [PATCH 09/12] Move path to variable --- member_roles.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/member_roles.go b/member_roles.go index 5994ad83d..a806afa73 100644 --- a/member_roles.go +++ b/member_roles.go @@ -57,7 +57,8 @@ func (s *MemberRolesService) ListMemberRoles(groupId int, options ...RequestOpti } func (s *MemberRolesService) CreateMemberRole(groupId int, opt *CreateMemberRoleOptions, options ...RequestOptionFunc) (*MemberRole, *Response, error) { - req, err := s.client.NewRequest(http.MethodPost, fmt.Sprintf("groups/%d/member_roles", groupId), opt, options) + path := fmt.Sprintf("groups/%d/member_roles", groupId) + req, err := s.client.NewRequest(http.MethodPost, path, opt, options) if err != nil { return nil, nil, err } @@ -72,7 +73,8 @@ func (s *MemberRolesService) CreateMemberRole(groupId int, opt *CreateMemberRole } func (s *MemberRolesService) DeleteMemberRole(groupId, memberRoleId int, options ...RequestOptionFunc) (*Response, error) { - req, err := s.client.NewRequest(http.MethodDelete, fmt.Sprintf("groups/%d/member_roles/%d", groupId, memberRoleId), nil, options) + path := fmt.Sprintf("groups/%d/member_roles/%d", groupId, memberRoleId) + req, err := s.client.NewRequest(http.MethodDelete, path, nil, options) if err != nil { return nil, err } From f919fb7172eea858824d3bc78cb2339751063489 Mon Sep 17 00:00:00 2001 From: Yannick Mau Date: Mon, 30 Oct 2023 17:42:42 +0100 Subject: [PATCH 10/12] format code --- member_roles_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/member_roles_test.go b/member_roles_test.go index 54c91f8a5..e5dfc8f50 100644 --- a/member_roles_test.go +++ b/member_roles_test.go @@ -1,9 +1,10 @@ package gitlab import ( - "github.com/stretchr/testify/require" "net/http" "testing" + + "github.com/stretchr/testify/require" ) func TestListMemberRoles(t *testing.T) { From 9d247d20016e8c41b5e707f990c14cdc067cb239 Mon Sep 17 00:00:00 2001 From: Yannick Mau Date: Mon, 30 Oct 2023 19:08:08 +0100 Subject: [PATCH 11/12] Use AccessLevelValue for BaseAccessLevel and add documentation comments --- member_roles.go | 63 ++++++++++++++++++++++++++------------------ member_roles_test.go | 4 +-- 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/member_roles.go b/member_roles.go index a806afa73..d7efb9700 100644 --- a/member_roles.go +++ b/member_roles.go @@ -5,41 +5,48 @@ import ( "net/http" ) -const ( - GuestBaseLevel BaseAccessLevel = 10 -) - -type BaseAccessLevel int - +// MemberRolesService handles communication with the member roles related methods of +// the GitLab API. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/member_roles.html type MemberRolesService struct { client *Client } +// MemberRole represents a GitLab member role. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/member_roles.html type MemberRole struct { - ID int `json:"id"` - Name string `json:"name"` - Description string `json:"description,omitempty"` - GroupId int `json:"group_id"` - BaseAccessLevel int `json:"base_access_level"` - AdminMergeRequests bool `json:"admin_merge_requests,omitempty"` - AdminVulnerability bool `json:"admin_vulnerability,omitempty"` - ReadCode bool `json:"read_code,omitempty"` - ReadDependency bool `json:"read_dependency,omitempty"` - ReadVulnerability bool `json:"read_vulnerability,omitempty"` - ManageProjectAccessToken bool `json:"manage_project_access_token,omitempty"` + ID int `json:"id"` + Name string `json:"name"` + Description string `json:"description,omitempty"` + GroupId int `json:"group_id"` + BaseAccessLevel AccessLevelValue `json:"base_access_level"` + AdminMergeRequests bool `json:"admin_merge_requests,omitempty"` + AdminVulnerability bool `json:"admin_vulnerability,omitempty"` + ReadCode bool `json:"read_code,omitempty"` + ReadDependency bool `json:"read_dependency,omitempty"` + ReadVulnerability bool `json:"read_vulnerability,omitempty"` + ManageProjectAccessToken bool `json:"manage_project_access_token,omitempty"` } +// CreateMemberRoleOptions represents the available CreateMemberRole() options. +// +// GitLab API docs: https://docs.gitlab.com/ee/api/member_roles.html#add-a-member-role-to-a-group type CreateMemberRoleOptions struct { - Name string `json:"name,"` - BaseAccessLevel BaseAccessLevel `json:"base_access_level"` - Description string `json:"description,omitempty"` - AdminMergeRequest bool `json:"admin_merge_request,omitempty"` - AdminVulnerability bool `json:"admin_vulnerability,omitempty"` - ReadCode bool `json:"read_code,omitempty"` - ReadDependency bool `json:"read_dependency,omitempty"` - ReadVulnerability bool `json:"read_vulnerability,omitempty"` + Name string `json:"name,"` + BaseAccessLevel AccessLevelValue `json:"base_access_level"` + Description string `json:"description,omitempty"` + AdminMergeRequest bool `json:"admin_merge_request,omitempty"` + AdminVulnerability bool `json:"admin_vulnerability,omitempty"` + ReadCode bool `json:"read_code,omitempty"` + ReadDependency bool `json:"read_dependency,omitempty"` + ReadVulnerability bool `json:"read_vulnerability,omitempty"` } +// ListMemberRoles gets a list of member roles for a specified group. +// +// Gitlab API docs: https://docs.gitlab.com/ee/api/member_roles.html#list-all-member-roles-of-a-group func (s *MemberRolesService) ListMemberRoles(groupId int, options ...RequestOptionFunc) ([]*MemberRole, *Response, error) { path := fmt.Sprintf("groups/%d/member_roles", groupId) req, err := s.client.NewRequest(http.MethodGet, path, nil, options) @@ -56,6 +63,9 @@ func (s *MemberRolesService) ListMemberRoles(groupId int, options ...RequestOpti return memberRoles, resp, nil } +// CreateMemberRole creates a new member role for a specified group. +// +// Gitlab API docs: https://docs.gitlab.com/ee/api/member_roles.html#add-a-member-role-to-a-group func (s *MemberRolesService) CreateMemberRole(groupId int, opt *CreateMemberRoleOptions, options ...RequestOptionFunc) (*MemberRole, *Response, error) { path := fmt.Sprintf("groups/%d/member_roles", groupId) req, err := s.client.NewRequest(http.MethodPost, path, opt, options) @@ -72,6 +82,9 @@ func (s *MemberRolesService) CreateMemberRole(groupId int, opt *CreateMemberRole return memberRole, resp, nil } +// DeleteMemberRole deletes a member role from a specified group. +// +// Gitlab API docs: https://docs.gitlab.com/ee/api/member_roles.html#remove-member-role-of-a-group func (s *MemberRolesService) DeleteMemberRole(groupId, memberRoleId int, options ...RequestOptionFunc) (*Response, error) { path := fmt.Sprintf("groups/%d/member_roles/%d", groupId, memberRoleId) req, err := s.client.NewRequest(http.MethodDelete, path, nil, options) diff --git a/member_roles_test.go b/member_roles_test.go index e5dfc8f50..00c72011b 100644 --- a/member_roles_test.go +++ b/member_roles_test.go @@ -64,7 +64,7 @@ func TestCreateMemberRole(t *testing.T) { memberRole, _, err := client.MemberRolesService.CreateMemberRole(84, &CreateMemberRoleOptions{ Name: "Custom guest", - BaseAccessLevel: 10, + BaseAccessLevel: GuestPermissions, Description: "a sample custom role", AdminMergeRequest: false, AdminVulnerability: false, @@ -78,7 +78,7 @@ func TestCreateMemberRole(t *testing.T) { ID: 3, Name: "Custom guest", Description: "a sample custom role", - BaseAccessLevel: 10, + BaseAccessLevel: GuestPermissions, GroupId: 84, AdminMergeRequests: false, AdminVulnerability: false, From 99ab72b8c2148c3c2c896f20e310177025c42d8d Mon Sep 17 00:00:00 2001 From: Sander van Harmelen Date: Mon, 13 Nov 2023 10:18:06 +0100 Subject: [PATCH 12/12] Make the code match the rest of the package --- member_roles.go | 87 +++++++++++++++++++------------- member_roles_test.go | 16 +++--- testdata/create_member_role.json | 2 +- testdata/list_member_roles.json | 2 +- 4 files changed, 63 insertions(+), 44 deletions(-) diff --git a/member_roles.go b/member_roles.go index d7efb9700..e3f1285f5 100644 --- a/member_roles.go +++ b/member_roles.go @@ -5,8 +5,8 @@ import ( "net/http" ) -// MemberRolesService handles communication with the member roles related methods of -// the GitLab API. +// MemberRolesService handles communication with the member roles related +// methods of the GitLab API. // // GitLab API docs: https://docs.gitlab.com/ee/api/member_roles.html type MemberRolesService struct { @@ -30,64 +30,83 @@ type MemberRole struct { ManageProjectAccessToken bool `json:"manage_project_access_token,omitempty"` } -// CreateMemberRoleOptions represents the available CreateMemberRole() options. -// -// GitLab API docs: https://docs.gitlab.com/ee/api/member_roles.html#add-a-member-role-to-a-group -type CreateMemberRoleOptions struct { - Name string `json:"name,"` - BaseAccessLevel AccessLevelValue `json:"base_access_level"` - Description string `json:"description,omitempty"` - AdminMergeRequest bool `json:"admin_merge_request,omitempty"` - AdminVulnerability bool `json:"admin_vulnerability,omitempty"` - ReadCode bool `json:"read_code,omitempty"` - ReadDependency bool `json:"read_dependency,omitempty"` - ReadVulnerability bool `json:"read_vulnerability,omitempty"` -} - // ListMemberRoles gets a list of member roles for a specified group. // -// Gitlab API docs: https://docs.gitlab.com/ee/api/member_roles.html#list-all-member-roles-of-a-group -func (s *MemberRolesService) ListMemberRoles(groupId int, options ...RequestOptionFunc) ([]*MemberRole, *Response, error) { - path := fmt.Sprintf("groups/%d/member_roles", groupId) - req, err := s.client.NewRequest(http.MethodGet, path, nil, options) +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/member_roles.html#list-all-member-roles-of-a-group +func (s *MemberRolesService) ListMemberRoles(gid interface{}, options ...RequestOptionFunc) ([]*MemberRole, *Response, error) { + group, err := parseID(gid) if err != nil { return nil, nil, err } + u := fmt.Sprintf("groups/%s/member_roles", PathEscape(group)) - var memberRoles []*MemberRole - resp, err := s.client.Do(req, &memberRoles) + req, err := s.client.NewRequest(http.MethodGet, u, nil, options) + if err != nil { + return nil, nil, err + } + + var mrs []*MemberRole + resp, err := s.client.Do(req, &mrs) if err != nil { return nil, resp, err } - return memberRoles, resp, nil + return mrs, resp, nil +} + +// CreateMemberRoleOptions represents the available CreateMemberRole() options. +// +// GitLab API docs: +// https://docs.gitlab.com/ee/api/member_roles.html#add-a-member-role-to-a-group +type CreateMemberRoleOptions struct { + Name *string `url:"name,omitempty" json:"name,omitempty"` + BaseAccessLevel *AccessLevelValue `url:"base_access_level,omitempty" json:"base_access_level,omitempty"` + Description *string `url:"description,omitempty" json:"description,omitempty"` + AdminMergeRequest *bool `url:"admin_merge_request,omitempty" json:"admin_merge_request,omitempty"` + AdminVulnerability *bool `url:"admin_vulnerability,omitempty" json:"admin_vulnerability,omitempty"` + ReadCode *bool `url:"read_code,omitempty" json:"read_code,omitempty"` + ReadDependency *bool `url:"read_dependency,omitempty" json:"read_dependency,omitempty"` + ReadVulnerability *bool `url:"read_vulnerability,omitempty" json:"read_vulnerability,omitempty"` } // CreateMemberRole creates a new member role for a specified group. // -// Gitlab API docs: https://docs.gitlab.com/ee/api/member_roles.html#add-a-member-role-to-a-group -func (s *MemberRolesService) CreateMemberRole(groupId int, opt *CreateMemberRoleOptions, options ...RequestOptionFunc) (*MemberRole, *Response, error) { - path := fmt.Sprintf("groups/%d/member_roles", groupId) - req, err := s.client.NewRequest(http.MethodPost, path, opt, options) +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/member_roles.html#add-a-member-role-to-a-group +func (s *MemberRolesService) CreateMemberRole(gid interface{}, opt *CreateMemberRoleOptions, options ...RequestOptionFunc) (*MemberRole, *Response, error) { + group, err := parseID(gid) if err != nil { return nil, nil, err } + u := fmt.Sprintf("groups/%s/member_roles", PathEscape(group)) - memberRole := new(MemberRole) - resp, err := s.client.Do(req, memberRole) + req, err := s.client.NewRequest(http.MethodPost, u, opt, options) + if err != nil { + return nil, nil, err + } + + mr := new(MemberRole) + resp, err := s.client.Do(req, mr) if err != nil { return nil, resp, err } - return memberRole, resp, nil + return mr, resp, nil } // DeleteMemberRole deletes a member role from a specified group. // -// Gitlab API docs: https://docs.gitlab.com/ee/api/member_roles.html#remove-member-role-of-a-group -func (s *MemberRolesService) DeleteMemberRole(groupId, memberRoleId int, options ...RequestOptionFunc) (*Response, error) { - path := fmt.Sprintf("groups/%d/member_roles/%d", groupId, memberRoleId) - req, err := s.client.NewRequest(http.MethodDelete, path, nil, options) +// Gitlab API docs: +// https://docs.gitlab.com/ee/api/member_roles.html#remove-member-role-of-a-group +func (s *MemberRolesService) DeleteMemberRole(gid interface{}, memberRole int, options ...RequestOptionFunc) (*Response, error) { + group, err := parseID(gid) + if err != nil { + return nil, err + } + u := fmt.Sprintf("groups/%s/member_roles/%d", PathEscape(group), memberRole) + + req, err := s.client.NewRequest(http.MethodDelete, u, nil, options) if err != nil { return nil, err } diff --git a/member_roles_test.go b/member_roles_test.go index 00c72011b..93f0b7743 100644 --- a/member_roles_test.go +++ b/member_roles_test.go @@ -63,14 +63,14 @@ func TestCreateMemberRole(t *testing.T) { }) memberRole, _, err := client.MemberRolesService.CreateMemberRole(84, &CreateMemberRoleOptions{ - Name: "Custom guest", - BaseAccessLevel: GuestPermissions, - Description: "a sample custom role", - AdminMergeRequest: false, - AdminVulnerability: false, - ReadCode: true, - ReadDependency: false, - ReadVulnerability: false, + Name: Ptr("Custom guest"), + BaseAccessLevel: Ptr(GuestPermissions), + Description: Ptr("a sample custom role"), + AdminMergeRequest: Ptr(false), + AdminVulnerability: Ptr(false), + ReadCode: Ptr(true), + ReadDependency: Ptr(false), + ReadVulnerability: Ptr(false), }) require.NoError(t, err) diff --git a/testdata/create_member_role.json b/testdata/create_member_role.json index 7e6eba741..0eb7bcd78 100644 --- a/testdata/create_member_role.json +++ b/testdata/create_member_role.json @@ -9,4 +9,4 @@ "read_code": true, "read_dependency": false, "read_vulnerability": false -} \ No newline at end of file +} diff --git a/testdata/list_member_roles.json b/testdata/list_member_roles.json index 0034eb138..b0843b798 100644 --- a/testdata/list_member_roles.json +++ b/testdata/list_member_roles.json @@ -25,4 +25,4 @@ "read_vulnerability": true, "manage_project_access_token": false } -] \ No newline at end of file +]