From 2df9888a0153ae87321b66a012d15ce670f0ba7f Mon Sep 17 00:00:00 2001 From: Nithish S Date: Sat, 15 Nov 2025 23:22:44 -0800 Subject: [PATCH 1/3] feat: add enterprise app installation repository endpoints; --- github/enterprise_apps.go | 122 ++++++++++++++++++++++++++ github/enterprise_apps_test.go | 152 +++++++++++++++++++++++++++++++++ github/github.go | 2 + 3 files changed, 276 insertions(+) create mode 100644 github/enterprise_apps.go create mode 100644 github/enterprise_apps_test.go diff --git a/github/enterprise_apps.go b/github/enterprise_apps.go new file mode 100644 index 00000000000..b7fd815563e --- /dev/null +++ b/github/enterprise_apps.go @@ -0,0 +1,122 @@ +// Copyright 2025 The go-github AUTHORS. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package github + +import ( + "context" + "fmt" +) + +// EnterpriseAppsService handles communication with the enterprise apps related +// methods of the GitHub API. +// +// GitHub API docs: https://docs.github.com/en/rest/reference/enterprise-admin#apps +type EnterpriseAppsService service + +// EnterpriseInstallationRepositoriesOptions specifies the parameters for +// EnterpriseAppsService.AddRepositoriesToInstallation and +// EnterpriseAppsService.RemoveRepositoriesFromInstallation. +type EnterpriseInstallationRepositoriesOptions struct { + SelectedRepositoryIDs []int64 `json:"selected_repository_ids"` +} + +// EnterpriseInstallationRepositoriesToggleOptions specifies the parameters for +// EnterpriseAppsService.ToggleInstallationRepositories. +type EnterpriseInstallationRepositoriesToggleOptions struct { + RepositorySelection *string `json:"repository_selection,omitempty"` // Can be "all" or "selected" + SelectedRepositoryIDs []int64 `json:"selected_repository_ids,omitempty"` +} + +// ListRepositoriesForOrgInstallation lists the repositories that an enterprise app installation +// has access to on an organization. +// +// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/enterprise-admin/organization-installations#list-repositories-accessible-to-the-app-installation-for-an-organization +// +//meta:operation GET /enterprises/{enterprise}/apps/organizations/{org}/installations/{installation_id}/repositories +func (s *EnterpriseAppsService) ListRepositoriesForOrgInstallation(ctx context.Context, enterprise, org string, installationID int64, opts *ListOptions) (*ListRepositories, *Response, error) { + u := fmt.Sprintf("enterprises/%v/apps/organizations/%v/installations/%v/repositories", enterprise, org, installationID) + u, err := addOptions(u, opts) + if err != nil { + return nil, nil, err + } + + req, err := s.client.NewRequest("GET", u, nil) + if err != nil { + return nil, nil, err + } + + var r *ListRepositories + resp, err := s.client.Do(ctx, req, &r) + if err != nil { + return nil, resp, err + } + + return r, resp, nil +} + +// ToggleInstallationRepositories changes a GitHub App installation's repository access +// between all repositories and a selected set. +// +// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/enterprise-admin/organization-installations#toggle-installation-repository-access-between-selected-and-all-repositories +// +//meta:operation PATCH /enterprises/{enterprise}/apps/organizations/{org}/installations/{installation_id}/repositories +func (s *EnterpriseAppsService) ToggleInstallationRepositories(ctx context.Context, enterprise, org string, installationID int64, opts *EnterpriseInstallationRepositoriesToggleOptions) (*ListRepositories, *Response, error) { + u := fmt.Sprintf("enterprises/%v/apps/organizations/%v/installations/%v/repositories", enterprise, org, installationID) + req, err := s.client.NewRequest("PATCH", u, opts) + if err != nil { + return nil, nil, err + } + + var r *ListRepositories + resp, err := s.client.Do(ctx, req, &r) + if err != nil { + return nil, resp, err + } + + return r, resp, nil +} + +// AddRepositoriesToInstallation grants repository access for a GitHub App installation. +// +// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/enterprise-admin/organization-installations#grant-repository-access-to-an-organization-installation +// +//meta:operation PATCH /enterprises/{enterprise}/apps/organizations/{org}/installations/{installation_id}/repositories/add +func (s *EnterpriseAppsService) AddRepositoriesToInstallation(ctx context.Context, enterprise, org string, installationID int64, opts *EnterpriseInstallationRepositoriesOptions) (*ListRepositories, *Response, error) { + u := fmt.Sprintf("enterprises/%v/apps/organizations/%v/installations/%v/repositories/add", enterprise, org, installationID) + req, err := s.client.NewRequest("PATCH", u, opts) + if err != nil { + return nil, nil, err + } + + var r *ListRepositories + resp, err := s.client.Do(ctx, req, &r) + if err != nil { + return nil, resp, err + } + + return r, resp, nil +} + +// RemoveRepositoriesFromInstallation revokes repository access from a GitHub App installation. +// +// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/enterprise-admin/organization-installations#remove-repository-access-from-an-organization-installation +// +//meta:operation PATCH /enterprises/{enterprise}/apps/organizations/{org}/installations/{installation_id}/repositories/remove +func (s *EnterpriseAppsService) RemoveRepositoriesFromInstallation(ctx context.Context, enterprise, org string, installationID int64, opts *EnterpriseInstallationRepositoriesOptions) (*ListRepositories, *Response, error) { + u := fmt.Sprintf("enterprises/%v/apps/organizations/%v/installations/%v/repositories/remove", enterprise, org, installationID) + req, err := s.client.NewRequest("PATCH", u, opts) + if err != nil { + return nil, nil, err + } + + var r *ListRepositories + resp, err := s.client.Do(ctx, req, &r) + if err != nil { + return nil, resp, err + } + + return r, resp, nil +} diff --git a/github/enterprise_apps_test.go b/github/enterprise_apps_test.go new file mode 100644 index 00000000000..19199ff17a7 --- /dev/null +++ b/github/enterprise_apps_test.go @@ -0,0 +1,152 @@ +// Copyright 2025 The go-github AUTHORS. All rights reserved. +// +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package github + +import ( + "context" + "fmt" + "net/http" + "testing" + + "github.com/google/go-cmp/cmp" +) + +func TestEnterpriseAppsService_ListRepositoriesForOrgInstallation(t *testing.T) { + client, mux, _ := setup(t) + + mux.HandleFunc("/enterprises/e/apps/organizations/o/installations/1/repositories", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "GET") + testFormValues(t, r, values{"page": "1"}) + fmt.Fprint(w, `{"total_count":1, "repositories":[{"id":1}]}`) + }) + + ctx := context.Background() + repos, _, err := client.EnterpriseApps.ListRepositoriesForOrgInstallation(ctx, "e", "o", 1, &ListOptions{Page: 1}) + if err != nil { + t.Errorf("EnterpriseApps.ListRepositoriesForOrgInstallation returned error: %v", err) + } + + want := &ListRepositories{TotalCount: Ptr(1), Repositories: []*Repository{{ID: Ptr(int64(1))}}} + if diff := cmp.Diff(repos, want); diff != "" { + t.Errorf("EnterpriseApps.ListRepositoriesForOrgInstallation returned diff (-want +got):\n%s", diff) + } + + const methodName = "ListRepositoriesForOrgInstallation" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.EnterpriseApps.ListRepositoriesForOrgInstallation(ctx, "\n", "\n", -1, &ListOptions{}) + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + _, resp, err := client.EnterpriseApps.ListRepositoriesForOrgInstallation(ctx, "e", "o", 1, &ListOptions{}) + return resp, err + }) +} + +func TestEnterpriseAppsService_ToggleInstallationRepositories(t *testing.T) { + client, mux, _ := setup(t) + + input := &EnterpriseInstallationRepositoriesToggleOptions{ + RepositorySelection: String("selected"), + SelectedRepositoryIDs: []int64{1, 2}, + } + + mux.HandleFunc("/enterprises/e/apps/organizations/o/installations/1/repositories", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "PATCH") + testBody(t, r, `{"repository_selection":"selected","selected_repository_ids":[1,2]}`+"\n") + fmt.Fprint(w, `{"total_count":2, "repositories":[{"id":1},{"id":2}]}`) + }) + + ctx := context.Background() + repos, _, err := client.EnterpriseApps.ToggleInstallationRepositories(ctx, "e", "o", 1, input) + if err != nil { + t.Errorf("EnterpriseApps.ToggleInstallationRepositories returned error: %v", err) + } + + want := &ListRepositories{TotalCount: Ptr(2), Repositories: []*Repository{{ID: Ptr(int64(1))}, {ID: Ptr(int64(2))}}} + if diff := cmp.Diff(repos, want); diff != "" { + t.Errorf("EnterpriseApps.ToggleInstallationRepositories returned diff (-want +got):\n%s", diff) + } + + const methodName = "ToggleInstallationRepositories" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.EnterpriseApps.ToggleInstallationRepositories(ctx, "\n", "\n", -1, input) + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + _, resp, err := client.EnterpriseApps.ToggleInstallationRepositories(ctx, "e", "o", 1, input) + return resp, err + }) +} + +func TestEnterpriseAppsService_AddRepositoriesToInstallation(t *testing.T) { + client, mux, _ := setup(t) + + input := &EnterpriseInstallationRepositoriesOptions{SelectedRepositoryIDs: []int64{1, 2}} + + mux.HandleFunc("/enterprises/e/apps/organizations/o/installations/1/repositories/add", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "PATCH") + testBody(t, r, `{"selected_repository_ids":[1,2]}`+"\n") + fmt.Fprint(w, `{"total_count":2, "repositories":[{"id":1},{"id":2}]}`) + }) + + ctx := context.Background() + repos, _, err := client.EnterpriseApps.AddRepositoriesToInstallation(ctx, "e", "o", 1, input) + if err != nil { + t.Errorf("EnterpriseApps.AddRepositoriesToInstallation returned error: %v", err) + } + + want := &ListRepositories{TotalCount: Ptr(2), Repositories: []*Repository{{ID: Ptr(int64(1))}, {ID: Ptr(int64(2))}}} + if diff := cmp.Diff(repos, want); diff != "" { + t.Errorf("EnterpriseApps.AddRepositoriesToInstallation returned diff (-want +got):\n%s", diff) + } + + const methodName = "AddRepositoriesToInstallation" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.EnterpriseApps.AddRepositoriesToInstallation(ctx, "\n", "\n", -1, input) + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + _, resp, err := client.EnterpriseApps.AddRepositoriesToInstallation(ctx, "e", "o", 1, input) + return resp, err + }) +} + +func TestEnterpriseAppsService_RemoveRepositoriesFromInstallation(t *testing.T) { + client, mux, _ := setup(t) + + input := &EnterpriseInstallationRepositoriesOptions{SelectedRepositoryIDs: []int64{1, 2}} + + mux.HandleFunc("/enterprises/e/apps/organizations/o/installations/1/repositories/remove", func(w http.ResponseWriter, r *http.Request) { + testMethod(t, r, "PATCH") + testBody(t, r, `{"selected_repository_ids":[1,2]}`+"\n") + fmt.Fprint(w, `{"total_count":2, "repositories":[{"id":1},{"id":2}]}`) + }) + + ctx := context.Background() + repos, _, err := client.EnterpriseApps.RemoveRepositoriesFromInstallation(ctx, "e", "o", 1, input) + if err != nil { + t.Errorf("EnterpriseApps.RemoveRepositoriesFromInstallation returned error: %v", err) + } + + want := &ListRepositories{TotalCount: Ptr(2), Repositories: []*Repository{{ID: Ptr(int64(1))}, {ID: Ptr(int64(2))}}} + if diff := cmp.Diff(repos, want); diff != "" { + t.Errorf("EnterpriseApps.RemoveRepositoriesFromInstallation returned diff (-want +got):\n%s", diff) + } + + const methodName = "RemoveRepositoriesFromInstallation" + testBadOptions(t, methodName, func() (err error) { + _, _, err = client.EnterpriseApps.RemoveRepositoriesFromInstallation(ctx, "\n", "\n", -1, input) + return err + }) + + testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { + _, resp, err := client.EnterpriseApps.RemoveRepositoriesFromInstallation(ctx, "e", "o", 1, input) + return resp, err + }) +} diff --git a/github/github.go b/github/github.go index 8e7d58ae671..c798757653b 100644 --- a/github/github.go +++ b/github/github.go @@ -206,6 +206,7 @@ type Client struct { DependencyGraph *DependencyGraphService Emojis *EmojisService Enterprise *EnterpriseService + EnterpriseApps *EnterpriseAppsService Gists *GistsService Git *GitService Gitignores *GitignoresService @@ -448,6 +449,7 @@ func (c *Client) initialize() { c.DependencyGraph = (*DependencyGraphService)(&c.common) c.Emojis = (*EmojisService)(&c.common) c.Enterprise = (*EnterpriseService)(&c.common) + c.EnterpriseApps = (*EnterpriseAppsService)(&c.common) c.Gists = (*GistsService)(&c.common) c.Git = (*GitService)(&c.common) c.Gitignores = (*GitignoresService)(&c.common) From d997ae6466dfe5e7996eb19515076f81f0a9559b Mon Sep 17 00:00:00 2001 From: Nithish S Date: Sat, 15 Nov 2025 23:44:31 -0800 Subject: [PATCH 2/3] fix: resolve linter issues from script/lint.sh --- github/enterprise_apps.go | 2 +- github/enterprise_apps_test.go | 21 ++++++++++++--------- github/github-accessors.go | 8 ++++++++ github/github-accessors_test.go | 11 +++++++++++ 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/github/enterprise_apps.go b/github/enterprise_apps.go index b7fd815563e..3353e71916f 100644 --- a/github/enterprise_apps.go +++ b/github/enterprise_apps.go @@ -33,7 +33,7 @@ type EnterpriseInstallationRepositoriesToggleOptions struct { // ListRepositoriesForOrgInstallation lists the repositories that an enterprise app installation // has access to on an organization. // -// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/enterprise-admin/organization-installations#list-repositories-accessible-to-the-app-installation-for-an-organization +// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/enterprise-admin/organization-installations#get-the-repositories-accessible-to-a-given-github-app-installation // //meta:operation GET /enterprises/{enterprise}/apps/organizations/{org}/installations/{installation_id}/repositories func (s *EnterpriseAppsService) ListRepositoriesForOrgInstallation(ctx context.Context, enterprise, org string, installationID int64, opts *ListOptions) (*ListRepositories, *Response, error) { diff --git a/github/enterprise_apps_test.go b/github/enterprise_apps_test.go index 19199ff17a7..e05720e7591 100644 --- a/github/enterprise_apps_test.go +++ b/github/enterprise_apps_test.go @@ -6,7 +6,6 @@ package github import ( - "context" "fmt" "net/http" "testing" @@ -15,6 +14,7 @@ import ( ) func TestEnterpriseAppsService_ListRepositoriesForOrgInstallation(t *testing.T) { + t.Parallel() client, mux, _ := setup(t) mux.HandleFunc("/enterprises/e/apps/organizations/o/installations/1/repositories", func(w http.ResponseWriter, r *http.Request) { @@ -23,7 +23,7 @@ func TestEnterpriseAppsService_ListRepositoriesForOrgInstallation(t *testing.T) fmt.Fprint(w, `{"total_count":1, "repositories":[{"id":1}]}`) }) - ctx := context.Background() + ctx := t.Context() repos, _, err := client.EnterpriseApps.ListRepositoriesForOrgInstallation(ctx, "e", "o", 1, &ListOptions{Page: 1}) if err != nil { t.Errorf("EnterpriseApps.ListRepositoriesForOrgInstallation returned error: %v", err) @@ -31,7 +31,7 @@ func TestEnterpriseAppsService_ListRepositoriesForOrgInstallation(t *testing.T) want := &ListRepositories{TotalCount: Ptr(1), Repositories: []*Repository{{ID: Ptr(int64(1))}}} if diff := cmp.Diff(repos, want); diff != "" { - t.Errorf("EnterpriseApps.ListRepositoriesForOrgInstallation returned diff (-want +got):\n%s", diff) + t.Errorf("EnterpriseApps.ListRepositoriesForOrgInstallation returned diff (-want +got):\n%v", diff) } const methodName = "ListRepositoriesForOrgInstallation" @@ -47,6 +47,7 @@ func TestEnterpriseAppsService_ListRepositoriesForOrgInstallation(t *testing.T) } func TestEnterpriseAppsService_ToggleInstallationRepositories(t *testing.T) { + t.Parallel() client, mux, _ := setup(t) input := &EnterpriseInstallationRepositoriesToggleOptions{ @@ -60,7 +61,7 @@ func TestEnterpriseAppsService_ToggleInstallationRepositories(t *testing.T) { fmt.Fprint(w, `{"total_count":2, "repositories":[{"id":1},{"id":2}]}`) }) - ctx := context.Background() + ctx := t.Context() repos, _, err := client.EnterpriseApps.ToggleInstallationRepositories(ctx, "e", "o", 1, input) if err != nil { t.Errorf("EnterpriseApps.ToggleInstallationRepositories returned error: %v", err) @@ -68,7 +69,7 @@ func TestEnterpriseAppsService_ToggleInstallationRepositories(t *testing.T) { want := &ListRepositories{TotalCount: Ptr(2), Repositories: []*Repository{{ID: Ptr(int64(1))}, {ID: Ptr(int64(2))}}} if diff := cmp.Diff(repos, want); diff != "" { - t.Errorf("EnterpriseApps.ToggleInstallationRepositories returned diff (-want +got):\n%s", diff) + t.Errorf("EnterpriseApps.ToggleInstallationRepositories returned diff (-want +got):\n%v", diff) } const methodName = "ToggleInstallationRepositories" @@ -84,6 +85,7 @@ func TestEnterpriseAppsService_ToggleInstallationRepositories(t *testing.T) { } func TestEnterpriseAppsService_AddRepositoriesToInstallation(t *testing.T) { + t.Parallel() client, mux, _ := setup(t) input := &EnterpriseInstallationRepositoriesOptions{SelectedRepositoryIDs: []int64{1, 2}} @@ -94,7 +96,7 @@ func TestEnterpriseAppsService_AddRepositoriesToInstallation(t *testing.T) { fmt.Fprint(w, `{"total_count":2, "repositories":[{"id":1},{"id":2}]}`) }) - ctx := context.Background() + ctx := t.Context() repos, _, err := client.EnterpriseApps.AddRepositoriesToInstallation(ctx, "e", "o", 1, input) if err != nil { t.Errorf("EnterpriseApps.AddRepositoriesToInstallation returned error: %v", err) @@ -102,7 +104,7 @@ func TestEnterpriseAppsService_AddRepositoriesToInstallation(t *testing.T) { want := &ListRepositories{TotalCount: Ptr(2), Repositories: []*Repository{{ID: Ptr(int64(1))}, {ID: Ptr(int64(2))}}} if diff := cmp.Diff(repos, want); diff != "" { - t.Errorf("EnterpriseApps.AddRepositoriesToInstallation returned diff (-want +got):\n%s", diff) + t.Errorf("EnterpriseApps.AddRepositoriesToInstallation returned diff (-want +got):\n%v", diff) } const methodName = "AddRepositoriesToInstallation" @@ -118,6 +120,7 @@ func TestEnterpriseAppsService_AddRepositoriesToInstallation(t *testing.T) { } func TestEnterpriseAppsService_RemoveRepositoriesFromInstallation(t *testing.T) { + t.Parallel() client, mux, _ := setup(t) input := &EnterpriseInstallationRepositoriesOptions{SelectedRepositoryIDs: []int64{1, 2}} @@ -128,7 +131,7 @@ func TestEnterpriseAppsService_RemoveRepositoriesFromInstallation(t *testing.T) fmt.Fprint(w, `{"total_count":2, "repositories":[{"id":1},{"id":2}]}`) }) - ctx := context.Background() + ctx := t.Context() repos, _, err := client.EnterpriseApps.RemoveRepositoriesFromInstallation(ctx, "e", "o", 1, input) if err != nil { t.Errorf("EnterpriseApps.RemoveRepositoriesFromInstallation returned error: %v", err) @@ -136,7 +139,7 @@ func TestEnterpriseAppsService_RemoveRepositoriesFromInstallation(t *testing.T) want := &ListRepositories{TotalCount: Ptr(2), Repositories: []*Repository{{ID: Ptr(int64(1))}, {ID: Ptr(int64(2))}}} if diff := cmp.Diff(repos, want); diff != "" { - t.Errorf("EnterpriseApps.RemoveRepositoriesFromInstallation returned diff (-want +got):\n%s", diff) + t.Errorf("EnterpriseApps.RemoveRepositoriesFromInstallation returned diff (-want +got):\n%v", diff) } const methodName = "RemoveRepositoriesFromInstallation" diff --git a/github/github-accessors.go b/github/github-accessors.go index 2a1a9394f67..ef96f32570b 100644 --- a/github/github-accessors.go +++ b/github/github-accessors.go @@ -9254,6 +9254,14 @@ func (e *EnterpriseCustomPropertiesValues) GetOrganizationLogin() string { return *e.OrganizationLogin } +// GetRepositorySelection returns the RepositorySelection field if it's non-nil, zero value otherwise. +func (e *EnterpriseInstallationRepositoriesToggleOptions) GetRepositorySelection() string { + if e == nil || e.RepositorySelection == nil { + return "" + } + return *e.RepositorySelection +} + // GetEnterpriseServerUser returns the EnterpriseServerUser field if it's non-nil, zero value otherwise. func (e *EnterpriseLicensedUsers) GetEnterpriseServerUser() bool { if e == nil || e.EnterpriseServerUser == nil { diff --git a/github/github-accessors_test.go b/github/github-accessors_test.go index c926697944f..8e39eab64f3 100644 --- a/github/github-accessors_test.go +++ b/github/github-accessors_test.go @@ -11985,6 +11985,17 @@ func TestEnterpriseCustomPropertiesValues_GetOrganizationLogin(tt *testing.T) { e.GetOrganizationLogin() } +func TestEnterpriseInstallationRepositoriesToggleOptions_GetRepositorySelection(tt *testing.T) { + tt.Parallel() + var zeroValue string + e := &EnterpriseInstallationRepositoriesToggleOptions{RepositorySelection: &zeroValue} + e.GetRepositorySelection() + e = &EnterpriseInstallationRepositoriesToggleOptions{} + e.GetRepositorySelection() + e = nil + e.GetRepositorySelection() +} + func TestEnterpriseLicensedUsers_GetEnterpriseServerUser(tt *testing.T) { tt.Parallel() var zeroValue bool From 915cfbf4ee75e986d39c23eeed4d9b97a1055258 Mon Sep 17 00:00:00 2001 From: Nithish S Date: Sun, 16 Nov 2025 04:33:13 -0800 Subject: [PATCH 3/3] fix: address code review feadback - Use EnterpriseService instead of creating new service - Add EnterpriseInstallationRepositoriesOptions for consistency - Update method signatures to Required --- github/enterprise_apps.go | 20 +++++-------- github/enterprise_apps_test.go | 52 +++++++++++++++++----------------- github/github.go | 2 -- 3 files changed, 33 insertions(+), 41 deletions(-) diff --git a/github/enterprise_apps.go b/github/enterprise_apps.go index 3353e71916f..2e43a142305 100644 --- a/github/enterprise_apps.go +++ b/github/enterprise_apps.go @@ -10,21 +10,15 @@ import ( "fmt" ) -// EnterpriseAppsService handles communication with the enterprise apps related -// methods of the GitHub API. -// -// GitHub API docs: https://docs.github.com/en/rest/reference/enterprise-admin#apps -type EnterpriseAppsService service - // EnterpriseInstallationRepositoriesOptions specifies the parameters for -// EnterpriseAppsService.AddRepositoriesToInstallation and -// EnterpriseAppsService.RemoveRepositoriesFromInstallation. +// EnterpriseService.AddRepositoriesToInstallation and +// EnterpriseService.RemoveRepositoriesFromInstallation. type EnterpriseInstallationRepositoriesOptions struct { SelectedRepositoryIDs []int64 `json:"selected_repository_ids"` } // EnterpriseInstallationRepositoriesToggleOptions specifies the parameters for -// EnterpriseAppsService.ToggleInstallationRepositories. +// EnterpriseService.ToggleInstallationRepositories. type EnterpriseInstallationRepositoriesToggleOptions struct { RepositorySelection *string `json:"repository_selection,omitempty"` // Can be "all" or "selected" SelectedRepositoryIDs []int64 `json:"selected_repository_ids,omitempty"` @@ -36,7 +30,7 @@ type EnterpriseInstallationRepositoriesToggleOptions struct { // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/enterprise-admin/organization-installations#get-the-repositories-accessible-to-a-given-github-app-installation // //meta:operation GET /enterprises/{enterprise}/apps/organizations/{org}/installations/{installation_id}/repositories -func (s *EnterpriseAppsService) ListRepositoriesForOrgInstallation(ctx context.Context, enterprise, org string, installationID int64, opts *ListOptions) (*ListRepositories, *Response, error) { +func (s *EnterpriseService) ListRepositoriesForOrgInstallation(ctx context.Context, enterprise, org string, installationID int64, opts *ListOptions) (*ListRepositories, *Response, error) { u := fmt.Sprintf("enterprises/%v/apps/organizations/%v/installations/%v/repositories", enterprise, org, installationID) u, err := addOptions(u, opts) if err != nil { @@ -63,7 +57,7 @@ func (s *EnterpriseAppsService) ListRepositoriesForOrgInstallation(ctx context.C // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/enterprise-admin/organization-installations#toggle-installation-repository-access-between-selected-and-all-repositories // //meta:operation PATCH /enterprises/{enterprise}/apps/organizations/{org}/installations/{installation_id}/repositories -func (s *EnterpriseAppsService) ToggleInstallationRepositories(ctx context.Context, enterprise, org string, installationID int64, opts *EnterpriseInstallationRepositoriesToggleOptions) (*ListRepositories, *Response, error) { +func (s *EnterpriseService) ToggleInstallationRepositories(ctx context.Context, enterprise, org string, installationID int64, opts *EnterpriseInstallationRepositoriesToggleOptions) (*ListRepositories, *Response, error) { u := fmt.Sprintf("enterprises/%v/apps/organizations/%v/installations/%v/repositories", enterprise, org, installationID) req, err := s.client.NewRequest("PATCH", u, opts) if err != nil { @@ -84,7 +78,7 @@ func (s *EnterpriseAppsService) ToggleInstallationRepositories(ctx context.Conte // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/enterprise-admin/organization-installations#grant-repository-access-to-an-organization-installation // //meta:operation PATCH /enterprises/{enterprise}/apps/organizations/{org}/installations/{installation_id}/repositories/add -func (s *EnterpriseAppsService) AddRepositoriesToInstallation(ctx context.Context, enterprise, org string, installationID int64, opts *EnterpriseInstallationRepositoriesOptions) (*ListRepositories, *Response, error) { +func (s *EnterpriseService) AddRepositoriesToInstallation(ctx context.Context, enterprise, org string, installationID int64, opts EnterpriseInstallationRepositoriesOptions) (*ListRepositories, *Response, error) { u := fmt.Sprintf("enterprises/%v/apps/organizations/%v/installations/%v/repositories/add", enterprise, org, installationID) req, err := s.client.NewRequest("PATCH", u, opts) if err != nil { @@ -105,7 +99,7 @@ func (s *EnterpriseAppsService) AddRepositoriesToInstallation(ctx context.Contex // GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/enterprise-admin/organization-installations#remove-repository-access-from-an-organization-installation // //meta:operation PATCH /enterprises/{enterprise}/apps/organizations/{org}/installations/{installation_id}/repositories/remove -func (s *EnterpriseAppsService) RemoveRepositoriesFromInstallation(ctx context.Context, enterprise, org string, installationID int64, opts *EnterpriseInstallationRepositoriesOptions) (*ListRepositories, *Response, error) { +func (s *EnterpriseService) RemoveRepositoriesFromInstallation(ctx context.Context, enterprise, org string, installationID int64, opts EnterpriseInstallationRepositoriesOptions) (*ListRepositories, *Response, error) { u := fmt.Sprintf("enterprises/%v/apps/organizations/%v/installations/%v/repositories/remove", enterprise, org, installationID) req, err := s.client.NewRequest("PATCH", u, opts) if err != nil { diff --git a/github/enterprise_apps_test.go b/github/enterprise_apps_test.go index e05720e7591..29a58e0439d 100644 --- a/github/enterprise_apps_test.go +++ b/github/enterprise_apps_test.go @@ -13,7 +13,7 @@ import ( "github.com/google/go-cmp/cmp" ) -func TestEnterpriseAppsService_ListRepositoriesForOrgInstallation(t *testing.T) { +func TestEnterpriseService_ListRepositoriesForOrgInstallation(t *testing.T) { t.Parallel() client, mux, _ := setup(t) @@ -24,29 +24,29 @@ func TestEnterpriseAppsService_ListRepositoriesForOrgInstallation(t *testing.T) }) ctx := t.Context() - repos, _, err := client.EnterpriseApps.ListRepositoriesForOrgInstallation(ctx, "e", "o", 1, &ListOptions{Page: 1}) + repos, _, err := client.Enterprise.ListRepositoriesForOrgInstallation(ctx, "e", "o", 1, &ListOptions{Page: 1}) if err != nil { - t.Errorf("EnterpriseApps.ListRepositoriesForOrgInstallation returned error: %v", err) + t.Errorf("Enterprise.ListRepositoriesForOrgInstallation returned error: %v", err) } want := &ListRepositories{TotalCount: Ptr(1), Repositories: []*Repository{{ID: Ptr(int64(1))}}} if diff := cmp.Diff(repos, want); diff != "" { - t.Errorf("EnterpriseApps.ListRepositoriesForOrgInstallation returned diff (-want +got):\n%v", diff) + t.Errorf("Enterprise.ListRepositoriesForOrgInstallation returned diff (-want +got):\n%v", diff) } const methodName = "ListRepositoriesForOrgInstallation" testBadOptions(t, methodName, func() (err error) { - _, _, err = client.EnterpriseApps.ListRepositoriesForOrgInstallation(ctx, "\n", "\n", -1, &ListOptions{}) + _, _, err = client.Enterprise.ListRepositoriesForOrgInstallation(ctx, "\n", "\n", -1, &ListOptions{}) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - _, resp, err := client.EnterpriseApps.ListRepositoriesForOrgInstallation(ctx, "e", "o", 1, &ListOptions{}) + _, resp, err := client.Enterprise.ListRepositoriesForOrgInstallation(ctx, "e", "o", 1, &ListOptions{}) return resp, err }) } -func TestEnterpriseAppsService_ToggleInstallationRepositories(t *testing.T) { +func TestEnterpriseService_ToggleInstallationRepositories(t *testing.T) { t.Parallel() client, mux, _ := setup(t) @@ -62,33 +62,33 @@ func TestEnterpriseAppsService_ToggleInstallationRepositories(t *testing.T) { }) ctx := t.Context() - repos, _, err := client.EnterpriseApps.ToggleInstallationRepositories(ctx, "e", "o", 1, input) + repos, _, err := client.Enterprise.ToggleInstallationRepositories(ctx, "e", "o", 1, input) if err != nil { - t.Errorf("EnterpriseApps.ToggleInstallationRepositories returned error: %v", err) + t.Errorf("Enterprise.ToggleInstallationRepositories returned error: %v", err) } want := &ListRepositories{TotalCount: Ptr(2), Repositories: []*Repository{{ID: Ptr(int64(1))}, {ID: Ptr(int64(2))}}} if diff := cmp.Diff(repos, want); diff != "" { - t.Errorf("EnterpriseApps.ToggleInstallationRepositories returned diff (-want +got):\n%v", diff) + t.Errorf("Enterprise.ToggleInstallationRepositories returned diff (-want +got):\n%v", diff) } const methodName = "ToggleInstallationRepositories" testBadOptions(t, methodName, func() (err error) { - _, _, err = client.EnterpriseApps.ToggleInstallationRepositories(ctx, "\n", "\n", -1, input) + _, _, err = client.Enterprise.ToggleInstallationRepositories(ctx, "\n", "\n", -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - _, resp, err := client.EnterpriseApps.ToggleInstallationRepositories(ctx, "e", "o", 1, input) + _, resp, err := client.Enterprise.ToggleInstallationRepositories(ctx, "e", "o", 1, input) return resp, err }) } -func TestEnterpriseAppsService_AddRepositoriesToInstallation(t *testing.T) { +func TestEnterpriseService_AddRepositoriesToInstallation(t *testing.T) { t.Parallel() client, mux, _ := setup(t) - input := &EnterpriseInstallationRepositoriesOptions{SelectedRepositoryIDs: []int64{1, 2}} + input := EnterpriseInstallationRepositoriesOptions{SelectedRepositoryIDs: []int64{1, 2}} mux.HandleFunc("/enterprises/e/apps/organizations/o/installations/1/repositories/add", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") @@ -97,33 +97,33 @@ func TestEnterpriseAppsService_AddRepositoriesToInstallation(t *testing.T) { }) ctx := t.Context() - repos, _, err := client.EnterpriseApps.AddRepositoriesToInstallation(ctx, "e", "o", 1, input) + repos, _, err := client.Enterprise.AddRepositoriesToInstallation(ctx, "e", "o", 1, input) if err != nil { - t.Errorf("EnterpriseApps.AddRepositoriesToInstallation returned error: %v", err) + t.Errorf("Enterprise.AddRepositoriesToInstallation returned error: %v", err) } want := &ListRepositories{TotalCount: Ptr(2), Repositories: []*Repository{{ID: Ptr(int64(1))}, {ID: Ptr(int64(2))}}} if diff := cmp.Diff(repos, want); diff != "" { - t.Errorf("EnterpriseApps.AddRepositoriesToInstallation returned diff (-want +got):\n%v", diff) + t.Errorf("Enterprise.AddRepositoriesToInstallation returned diff (-want +got):\n%v", diff) } const methodName = "AddRepositoriesToInstallation" testBadOptions(t, methodName, func() (err error) { - _, _, err = client.EnterpriseApps.AddRepositoriesToInstallation(ctx, "\n", "\n", -1, input) + _, _, err = client.Enterprise.AddRepositoriesToInstallation(ctx, "\n", "\n", -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - _, resp, err := client.EnterpriseApps.AddRepositoriesToInstallation(ctx, "e", "o", 1, input) + _, resp, err := client.Enterprise.AddRepositoriesToInstallation(ctx, "e", "o", 1, input) return resp, err }) } -func TestEnterpriseAppsService_RemoveRepositoriesFromInstallation(t *testing.T) { +func TestEnterpriseService_RemoveRepositoriesFromInstallation(t *testing.T) { t.Parallel() client, mux, _ := setup(t) - input := &EnterpriseInstallationRepositoriesOptions{SelectedRepositoryIDs: []int64{1, 2}} + input := EnterpriseInstallationRepositoriesOptions{SelectedRepositoryIDs: []int64{1, 2}} mux.HandleFunc("/enterprises/e/apps/organizations/o/installations/1/repositories/remove", func(w http.ResponseWriter, r *http.Request) { testMethod(t, r, "PATCH") @@ -132,24 +132,24 @@ func TestEnterpriseAppsService_RemoveRepositoriesFromInstallation(t *testing.T) }) ctx := t.Context() - repos, _, err := client.EnterpriseApps.RemoveRepositoriesFromInstallation(ctx, "e", "o", 1, input) + repos, _, err := client.Enterprise.RemoveRepositoriesFromInstallation(ctx, "e", "o", 1, input) if err != nil { - t.Errorf("EnterpriseApps.RemoveRepositoriesFromInstallation returned error: %v", err) + t.Errorf("Enterprise.RemoveRepositoriesFromInstallation returned error: %v", err) } want := &ListRepositories{TotalCount: Ptr(2), Repositories: []*Repository{{ID: Ptr(int64(1))}, {ID: Ptr(int64(2))}}} if diff := cmp.Diff(repos, want); diff != "" { - t.Errorf("EnterpriseApps.RemoveRepositoriesFromInstallation returned diff (-want +got):\n%v", diff) + t.Errorf("Enterprise.RemoveRepositoriesFromInstallation returned diff (-want +got):\n%v", diff) } const methodName = "RemoveRepositoriesFromInstallation" testBadOptions(t, methodName, func() (err error) { - _, _, err = client.EnterpriseApps.RemoveRepositoriesFromInstallation(ctx, "\n", "\n", -1, input) + _, _, err = client.Enterprise.RemoveRepositoriesFromInstallation(ctx, "\n", "\n", -1, input) return err }) testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { - _, resp, err := client.EnterpriseApps.RemoveRepositoriesFromInstallation(ctx, "e", "o", 1, input) + _, resp, err := client.Enterprise.RemoveRepositoriesFromInstallation(ctx, "e", "o", 1, input) return resp, err }) } diff --git a/github/github.go b/github/github.go index c798757653b..8e7d58ae671 100644 --- a/github/github.go +++ b/github/github.go @@ -206,7 +206,6 @@ type Client struct { DependencyGraph *DependencyGraphService Emojis *EmojisService Enterprise *EnterpriseService - EnterpriseApps *EnterpriseAppsService Gists *GistsService Git *GitService Gitignores *GitignoresService @@ -449,7 +448,6 @@ func (c *Client) initialize() { c.DependencyGraph = (*DependencyGraphService)(&c.common) c.Emojis = (*EmojisService)(&c.common) c.Enterprise = (*EnterpriseService)(&c.common) - c.EnterpriseApps = (*EnterpriseAppsService)(&c.common) c.Gists = (*GistsService)(&c.common) c.Git = (*GitService)(&c.common) c.Gitignores = (*GitignoresService)(&c.common)