Skip to content

Commit 983763b

Browse files
committed
feat: Support Code Security Configurations API
This PR implements Code Security Configurations APIs as defined at https://docs.github.com/en/rest/code-security/configurations?apiVersion=2022-11-28
1 parent 13afa20 commit 983763b

File tree

2 files changed

+632
-0
lines changed

2 files changed

+632
-0
lines changed
Lines changed: 279 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,279 @@
1+
package github
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net/http"
7+
)
8+
9+
// DependencyGraphAutosubmitActionOptions represents the options for the DependencyGraphAutosubmitAction.
10+
type DependencyGraphAutosubmitActionOptions struct {
11+
LabeledRunners bool `json:"labeled_runners,omitempty"`
12+
}
13+
14+
// CodeSecurityConfiguration represents a code security configuration.
15+
type CodeSecurityConfiguration struct {
16+
ID *int64 `json:"id,omitempty"`
17+
TargetType *string `json:"target_type,omitempty"`
18+
Name *string `json:"name"`
19+
Description *string `json:"description,omitempty"`
20+
AdvancedSecurity *string `json:"advanced_security,omitempty"`
21+
DependencyGraph *string `json:"dependency_graph,omitempty"`
22+
DependencyGraphAutosubmitAction *string `json:"dependency_graph_autosubmit_action,omitempty"`
23+
DependencyGraphAutosubmitActionOptions *DependencyGraphAutosubmitActionOptions `json:"dependency_graph_autosubmit_action_options,omitempty"`
24+
DependabotAlerts *string `json:"dependabot_alerts,omitempty"`
25+
DependabotSecurityUpdates *string `json:"dependabot_security_updates,omitempty"`
26+
CodeScanningDefaultSetup *string `json:"code_scanning_default_setup,omitempty"`
27+
SecretScanning *string `json:"secret_scanning,omitempty"`
28+
SecretScanningPushProtection *string `json:"secret_scanning_push_protection,omitempty"`
29+
SecretScanningValidityChecks *string `json:"secret_scanning_validity_checks,omitempty"`
30+
SecretScanningNonProviderPatterns *string `json:"secret_scanning_non_provider_patterns,omitempty"`
31+
PrivateVulnerabilityReporting *string `json:"private_vulnerability_reporting,omitempty"`
32+
Enforcement *string `json:"enforcement,omitempty"`
33+
URL *string `json:"url,omitempty"`
34+
HTMLURL *string `json:"html_url,omitempty"`
35+
CreatedAt *Timestamp `json:"created_at,omitempty"`
36+
UpdatedAt *Timestamp `json:"updated_at,omitempty"`
37+
}
38+
39+
// CodeSecurityConfigurationWithDefaultForNewRepos represents a code security configuration with default for new repos param.
40+
type CodeSecurityConfigurationWithDefaultForNewRepos struct {
41+
Configuration *CodeSecurityConfiguration `json:"configuration"`
42+
DefaultForNewRepos *string `json:"default_for_new_repos"`
43+
}
44+
45+
// RepositoryCodeSecurityConfiguration represents a code security configuration for a repository.
46+
type RepositoryCodeSecurityConfiguration struct {
47+
State *string `json:"state,omitempty"`
48+
Configuration *CodeSecurityConfiguration `json:"configuration,omitempty"`
49+
}
50+
51+
// GetCodeSecurityConfigurations gets code security configurations for an organization.
52+
//
53+
// GitHub API docs: https://docs.github.com/en/rest/code-security/configurations#get-code-security-configurations-for-an-organization
54+
//
55+
//meta:operation GET /orgs/{org}/code-security/configurations
56+
func (s *OrganizationsService) GetCodeSecurityConfigurations(ctx context.Context, org string) ([]*CodeSecurityConfiguration, *Response, error) {
57+
u := fmt.Sprintf("orgs/%v/code-security/configurations", org)
58+
59+
req, err := s.client.NewRequest("GET", u, nil)
60+
if err != nil {
61+
return nil, nil, err
62+
}
63+
64+
var configurations []*CodeSecurityConfiguration
65+
resp, err := s.client.Do(ctx, req, &configurations)
66+
if err != nil {
67+
return nil, resp, err
68+
}
69+
return configurations, resp, nil
70+
}
71+
72+
// CreateCodeSecurityConfiguration creates a code security configuration for an organization.
73+
//
74+
// GitHub API docs: https://docs.github.com/en/rest/code-security/configurations#create-a-code-security-configuration
75+
//
76+
//meta:operation POST /orgs/{org}/code-security/configurations
77+
func (s *OrganizationsService) CreateCodeSecurityConfiguration(ctx context.Context, org string, c *CodeSecurityConfiguration) (*CodeSecurityConfiguration, *Response, error) {
78+
u := fmt.Sprintf("orgs/%v/code-security/configurations", org)
79+
80+
req, err := s.client.NewRequest("POST", u, c)
81+
if err != nil {
82+
return nil, nil, err
83+
}
84+
85+
var configuration *CodeSecurityConfiguration
86+
resp, err := s.client.Do(ctx, req, &configuration)
87+
if err != nil {
88+
return nil, resp, err
89+
}
90+
return configuration, resp, nil
91+
}
92+
93+
// GetDefaultCodeSecurityConfigurations gets default code security configurations for an organization.
94+
//
95+
// GitHub API docs: https://docs.github.com/en/rest/code-security/configurations#get-default-code-security-configurations
96+
//
97+
//meta:operation GET /orgs/{org}/code-security/configurations/defaults
98+
func (s *OrganizationsService) GetDefaultCodeSecurityConfigurations(ctx context.Context, org string) ([]*CodeSecurityConfiguration, *Response, error) {
99+
u := fmt.Sprintf("orgs/%v/code-security/configurations/defaults", org)
100+
101+
req, err := s.client.NewRequest("GET", u, nil)
102+
if err != nil {
103+
return nil, nil, err
104+
}
105+
106+
var configurations []*CodeSecurityConfiguration
107+
resp, err := s.client.Do(ctx, req, &configurations)
108+
if err != nil {
109+
return nil, resp, err
110+
}
111+
return configurations, resp, nil
112+
}
113+
114+
// DetachCodeSecurityConfigurationsToRepositories detaches code security configuration from an organization's repositories.
115+
//
116+
// GitHub API docs: https://docs.github.com/en/rest/code-security/configurations#detach-configurations-from-repositories
117+
//
118+
//meta:operation POST /orgs/{org}/code-security/configurations/detach
119+
func (s *OrganizationsService) DetachCodeSecurityConfigurationsFromRepositories(ctx context.Context, org string, repoIDs []int64) (*Response, error) {
120+
u := fmt.Sprintf("orgs/%v/code-security/configurations/detach", org)
121+
type selectedRepoIDs struct {
122+
SelectedIDs []int64 `json:"selected_repository_ids"`
123+
}
124+
req, err := s.client.NewRequest("DELETE", u, selectedRepoIDs{SelectedIDs: repoIDs})
125+
if err != nil {
126+
return nil, err
127+
}
128+
resp, err := s.client.Do(ctx, req, nil)
129+
if err != nil {
130+
return resp, err
131+
}
132+
return resp, nil
133+
}
134+
135+
// GetCodeSecurityConfiguration gets a code security configuration available in an organization.
136+
//
137+
// GitHub API docs: https://docs.github.com/en/rest/code-security/configurations#get-a-code-security-configuration
138+
//
139+
//meta:operation GET /orgs/{org}/code-security/configurations/{configuration_id}
140+
func (s *OrganizationsService) GetCodeSecurityConfiguration(ctx context.Context, org string, id int64) (*CodeSecurityConfiguration, *Response, error) {
141+
u := fmt.Sprintf("orgs/%v/code-security/configurations/%v", org, id)
142+
143+
req, err := s.client.NewRequest("GET", u, nil)
144+
if err != nil {
145+
return nil, nil, err
146+
}
147+
148+
var configuration *CodeSecurityConfiguration
149+
resp, err := s.client.Do(ctx, req, &configuration)
150+
if err != nil {
151+
return nil, resp, err
152+
}
153+
return configuration, resp, nil
154+
}
155+
156+
// UpdateCodeSecurityConfiguration updates a code security configuration for an organization.
157+
//
158+
// GitHub API docs: https://docs.github.com/en/rest/code-security/configurations#update-a-code-security-configuration
159+
//
160+
//meta:operation PATCH /orgs/{org}/code-security/configurations/{configuration_id}
161+
func (s *OrganizationsService) UpdateCodeSecurityConfiguration(ctx context.Context, org string, id int64, c *CodeSecurityConfiguration) (*CodeSecurityConfiguration, *Response, error) {
162+
u := fmt.Sprintf("orgs/%v/code-security/configurations/%v", org, id)
163+
164+
req, err := s.client.NewRequest("PATCH", u, c)
165+
if err != nil {
166+
return nil, nil, err
167+
}
168+
169+
var configuration *CodeSecurityConfiguration
170+
resp, err := s.client.Do(ctx, req, &configuration)
171+
if err != nil {
172+
return nil, resp, err
173+
}
174+
return configuration, resp, nil
175+
}
176+
177+
// DeleteCodeSecurityConfiguration deletes a code security configuration for an organization.
178+
//
179+
// GitHub API docs: https://docs.github.com/en/rest/code-security/configurations#delete-a-code-security-configuration
180+
//
181+
//meta:operation DELETE /orgs/{org}/code-security/configurations/{configuration_id}
182+
func (s *OrganizationsService) DeleteCodeSecurityConfiguration(ctx context.Context, org string, id int64) (*Response, error) {
183+
u := fmt.Sprintf("orgs/%v/code-security/configurations/%v", org, id)
184+
185+
req, err := s.client.NewRequest("DELETE", u, nil)
186+
if err != nil {
187+
return nil, err
188+
}
189+
resp, err := s.client.Do(ctx, req, nil)
190+
if err != nil {
191+
return resp, err
192+
}
193+
return resp, nil
194+
}
195+
196+
// AttachCodeSecurityConfigurationsToRepositories attaches code security configurations to repositories for an organization.
197+
//
198+
// GitHub API docs: https://docs.github.com/en/rest/code-security/configurations#attach-a-configuration-to-repositories
199+
//
200+
//meta:operation POST /orgs/{org}/code-security/configurations/{configuration_id}/attach
201+
func (s *OrganizationsService) AttachCodeSecurityConfigurationsToRepositories(ctx context.Context, org string, id int64, scope string, repoIDs []int64) (*Response, error) {
202+
u := fmt.Sprintf("orgs/%v/code-security/configurations/%v/attach", org, id)
203+
type selectedRepoIDs struct {
204+
Scope string `json:"scope"`
205+
SelectedIDs []int64 `json:"selected_repository_ids,omitempty"`
206+
}
207+
req, err := s.client.NewRequest("POST", u, selectedRepoIDs{Scope: scope, SelectedIDs: repoIDs})
208+
if err != nil {
209+
return nil, err
210+
}
211+
resp, err := s.client.Do(ctx, req, nil)
212+
if err != nil && resp.StatusCode != http.StatusAccepted { // StatusAccepted(202) is the expected status code as job is queued for processing
213+
return resp, err
214+
}
215+
return resp, nil
216+
}
217+
218+
// SetDefaultCodeSecurityConfiguration sets a code security configuration as the default for an organization.
219+
//
220+
// GitHub API docs: https://docs.github.com/en/rest/code-security/configurations#set-a-code-security-configuration-as-a-default-for-an-organization
221+
//
222+
//meta:operation PUT /orgs/{org}/code-security/configurations/{configuration_id}/defaults
223+
func (s *OrganizationsService) SetDefaultCodeSecurityConfiguration(ctx context.Context, org string, id int64, newReposParam string) (*CodeSecurityConfigurationWithDefaultForNewRepos, *Response, error) {
224+
u := fmt.Sprintf("orgs/%v/code-security/configurations/%v/defaults", org, id)
225+
type configParam struct {
226+
DefaultForNewRepos string `json:"default_for_new_repos"`
227+
}
228+
req, err := s.client.NewRequest("PUT", u, configParam{DefaultForNewRepos: newReposParam})
229+
if err != nil {
230+
return nil, nil, err
231+
}
232+
var c *CodeSecurityConfigurationWithDefaultForNewRepos
233+
resp, err := s.client.Do(ctx, req, &c)
234+
if err != nil {
235+
return nil, resp, err
236+
}
237+
return c, resp, nil
238+
}
239+
240+
// GetRepositoriesForCodeSecurityConfiguration gets repositories associated with a code security configuration.
241+
//
242+
// GitHub API docs: https://docs.github.com/en/rest/code-security/configurations#get-repositories-associated-with-a-code-security-configuration
243+
//
244+
//meta:operation GET /orgs/{org}/code-security/configurations/{configuration_id}/repositories
245+
func (s *OrganizationsService) GetRepositoriesForCodeSecurityConfiguration(ctx context.Context, org string, id int64) ([]*Repository, *Response, error) {
246+
u := fmt.Sprintf("orgs/%v/code-security/configurations/%v/repositories", org, id)
247+
248+
req, err := s.client.NewRequest("GET", u, nil)
249+
if err != nil {
250+
return nil, nil, err
251+
}
252+
253+
var repositories []*Repository
254+
resp, err := s.client.Do(ctx, req, &repositories)
255+
if err != nil {
256+
return nil, resp, err
257+
}
258+
return repositories, resp, nil
259+
}
260+
261+
// GetCodeSecurityConfigurationForRepository gets code security configuration that manages a repository's code security settings.
262+
//
263+
// GitHub API docs: https://docs.github.com/en/rest/code-security/configurations#get-the-code-security-configuration-associated-with-a-repository
264+
//
265+
//meta:operation GET /repos/{owner}/{repo}/code-security-configuration
266+
func (s *OrganizationsService) GetCodeSecurityConfigurationForRepository(ctx context.Context, org string, repo string) (*RepositoryCodeSecurityConfiguration, *Response, error) {
267+
u := fmt.Sprintf("repos/%v/%v/code-security-configuration", org, repo)
268+
269+
req, err := s.client.NewRequest("GET", u, nil)
270+
if err != nil {
271+
return nil, nil, err
272+
}
273+
var repoConfig *RepositoryCodeSecurityConfiguration
274+
resp, err := s.client.Do(ctx, req, &repoConfig)
275+
if err != nil {
276+
return nil, resp, err
277+
}
278+
return repoConfig, resp, nil
279+
}

0 commit comments

Comments
 (0)