Skip to content

Commit 943b801

Browse files
authored
feat: Add support for enterprise billing cost centers API (#3803)
1 parent 578f42e commit 943b801

File tree

4 files changed

+1116
-0
lines changed

4 files changed

+1116
-0
lines changed
Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,232 @@
1+
// Copyright 2025 The go-github AUTHORS. All rights reserved.
2+
//
3+
// Use of this source code is governed by a BSD-style
4+
// license that can be found in the LICENSE file.
5+
6+
package github
7+
8+
import (
9+
"context"
10+
"fmt"
11+
)
12+
13+
// CostCenter represents an enterprise cost center.
14+
type CostCenter struct {
15+
ID string `json:"id"`
16+
Name string `json:"name"`
17+
Resources []*CostCenterResource `json:"resources"`
18+
State *string `json:"state,omitempty"`
19+
AzureSubscription *string `json:"azure_subscription,omitempty"`
20+
}
21+
22+
// CostCenterResource represents a resource assigned to a cost center.
23+
type CostCenterResource struct {
24+
Type string `json:"type"`
25+
Name string `json:"name"`
26+
}
27+
28+
// CostCenters represents a list of cost centers.
29+
type CostCenters struct {
30+
CostCenters []*CostCenter `json:"costCenters,omitempty"`
31+
}
32+
33+
// CostCenterListOptions specifies optional parameters to the EnterpriseService.ListCostCenters method.
34+
type CostCenterListOptions struct {
35+
State *string `url:"state,omitempty"`
36+
}
37+
38+
// CostCenterRequest represents a request to create or update a cost center.
39+
type CostCenterRequest struct {
40+
Name *string `json:"name,omitempty"`
41+
}
42+
43+
// CostCenterResourceRequest represents a request to add or remove resources from a cost center.
44+
type CostCenterResourceRequest struct {
45+
Users []string `json:"users,omitempty"`
46+
Organizations []string `json:"organizations,omitempty"`
47+
Repositories []string `json:"repositories,omitempty"`
48+
}
49+
50+
// CostCenterAddResourceResponse represents a response from adding resources to a cost center.
51+
type CostCenterAddResourceResponse struct {
52+
Message *string `json:"message,omitempty"`
53+
ReassignedResources []*ReassignedResource `json:"reassigned_resources,omitempty"`
54+
}
55+
56+
// ReassignedResource represents a resource that was reassigned from another cost center.
57+
type ReassignedResource struct {
58+
ResourceType *string `json:"resource_type,omitempty"`
59+
Name *string `json:"name,omitempty"`
60+
PreviousCostCenter *string `json:"previous_cost_center,omitempty"`
61+
}
62+
63+
// CostCenterRemoveResourceResponse represents a response from removing resources from a cost center.
64+
type CostCenterRemoveResourceResponse struct {
65+
Message *string `json:"message,omitempty"`
66+
}
67+
68+
// CostCenterDeleteResponse represents a response from deleting a cost center.
69+
type CostCenterDeleteResponse struct {
70+
Message *string `json:"message,omitempty"`
71+
ID *string `json:"id,omitempty"`
72+
Name *string `json:"name,omitempty"`
73+
CostCenterState *string `json:"costCenterState,omitempty"`
74+
}
75+
76+
// ListCostCenters lists all cost centers for an enterprise.
77+
//
78+
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/enterprise-admin/billing#get-all-cost-centers-for-an-enterprise
79+
//
80+
//meta:operation GET /enterprises/{enterprise}/settings/billing/cost-centers
81+
func (s *EnterpriseService) ListCostCenters(ctx context.Context, enterprise string, opts *CostCenterListOptions) (*CostCenters, *Response, error) {
82+
u := fmt.Sprintf("enterprises/%v/settings/billing/cost-centers", enterprise)
83+
u, err := addOptions(u, opts)
84+
if err != nil {
85+
return nil, nil, err
86+
}
87+
88+
req, err := s.client.NewRequest("GET", u, nil)
89+
if err != nil {
90+
return nil, nil, err
91+
}
92+
93+
costCenters := &CostCenters{}
94+
resp, err := s.client.Do(ctx, req, costCenters)
95+
if err != nil {
96+
return nil, resp, err
97+
}
98+
99+
return costCenters, resp, nil
100+
}
101+
102+
// CreateCostCenter creates a new cost center for an enterprise.
103+
//
104+
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/enterprise-admin/billing#create-a-new-cost-center
105+
//
106+
//meta:operation POST /enterprises/{enterprise}/settings/billing/cost-centers
107+
func (s *EnterpriseService) CreateCostCenter(ctx context.Context, enterprise string, costCenter CostCenterRequest) (*CostCenter, *Response, error) {
108+
u := fmt.Sprintf("enterprises/%v/settings/billing/cost-centers", enterprise)
109+
110+
req, err := s.client.NewRequest("POST", u, costCenter)
111+
if err != nil {
112+
return nil, nil, err
113+
}
114+
115+
result := &CostCenter{}
116+
resp, err := s.client.Do(ctx, req, result)
117+
if err != nil {
118+
return nil, resp, err
119+
}
120+
121+
return result, resp, nil
122+
}
123+
124+
// GetCostCenter gets a cost center by ID for an enterprise.
125+
//
126+
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/enterprise-admin/billing#get-a-cost-center-by-id
127+
//
128+
//meta:operation GET /enterprises/{enterprise}/settings/billing/cost-centers/{cost_center_id}
129+
func (s *EnterpriseService) GetCostCenter(ctx context.Context, enterprise, costCenterID string) (*CostCenter, *Response, error) {
130+
u := fmt.Sprintf("enterprises/%v/settings/billing/cost-centers/%v", enterprise, costCenterID)
131+
132+
req, err := s.client.NewRequest("GET", u, nil)
133+
if err != nil {
134+
return nil, nil, err
135+
}
136+
137+
costCenter := &CostCenter{}
138+
resp, err := s.client.Do(ctx, req, costCenter)
139+
if err != nil {
140+
return nil, resp, err
141+
}
142+
143+
return costCenter, resp, nil
144+
}
145+
146+
// UpdateCostCenter updates the name of a cost center.
147+
//
148+
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/enterprise-admin/billing#update-a-cost-center-name
149+
//
150+
//meta:operation PATCH /enterprises/{enterprise}/settings/billing/cost-centers/{cost_center_id}
151+
func (s *EnterpriseService) UpdateCostCenter(ctx context.Context, enterprise, costCenterID string, costCenter CostCenterRequest) (*CostCenter, *Response, error) {
152+
u := fmt.Sprintf("enterprises/%v/settings/billing/cost-centers/%v", enterprise, costCenterID)
153+
154+
req, err := s.client.NewRequest("PATCH", u, costCenter)
155+
if err != nil {
156+
return nil, nil, err
157+
}
158+
159+
result := &CostCenter{}
160+
resp, err := s.client.Do(ctx, req, result)
161+
if err != nil {
162+
return nil, resp, err
163+
}
164+
165+
return result, resp, nil
166+
}
167+
168+
// DeleteCostCenter deletes a cost center.
169+
//
170+
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/enterprise-admin/billing#delete-a-cost-center
171+
//
172+
//meta:operation DELETE /enterprises/{enterprise}/settings/billing/cost-centers/{cost_center_id}
173+
func (s *EnterpriseService) DeleteCostCenter(ctx context.Context, enterprise, costCenterID string) (*CostCenterDeleteResponse, *Response, error) {
174+
u := fmt.Sprintf("enterprises/%v/settings/billing/cost-centers/%v", enterprise, costCenterID)
175+
176+
req, err := s.client.NewRequest("DELETE", u, nil)
177+
if err != nil {
178+
return nil, nil, err
179+
}
180+
181+
result := &CostCenterDeleteResponse{}
182+
resp, err := s.client.Do(ctx, req, result)
183+
if err != nil {
184+
return nil, resp, err
185+
}
186+
187+
return result, resp, nil
188+
}
189+
190+
// AddResourcesToCostCenter adds resources to a cost center.
191+
//
192+
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/enterprise-admin/billing#add-resources-to-a-cost-center
193+
//
194+
//meta:operation POST /enterprises/{enterprise}/settings/billing/cost-centers/{cost_center_id}/resource
195+
func (s *EnterpriseService) AddResourcesToCostCenter(ctx context.Context, enterprise, costCenterID string, resources CostCenterResourceRequest) (*CostCenterAddResourceResponse, *Response, error) {
196+
u := fmt.Sprintf("enterprises/%v/settings/billing/cost-centers/%v/resource", enterprise, costCenterID)
197+
198+
req, err := s.client.NewRequest("POST", u, resources)
199+
if err != nil {
200+
return nil, nil, err
201+
}
202+
203+
result := &CostCenterAddResourceResponse{}
204+
resp, err := s.client.Do(ctx, req, result)
205+
if err != nil {
206+
return nil, resp, err
207+
}
208+
209+
return result, resp, nil
210+
}
211+
212+
// RemoveResourcesFromCostCenter removes resources from a cost center.
213+
//
214+
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/enterprise-admin/billing#remove-resources-from-a-cost-center
215+
//
216+
//meta:operation DELETE /enterprises/{enterprise}/settings/billing/cost-centers/{cost_center_id}/resource
217+
func (s *EnterpriseService) RemoveResourcesFromCostCenter(ctx context.Context, enterprise, costCenterID string, resources CostCenterResourceRequest) (*CostCenterRemoveResourceResponse, *Response, error) {
218+
u := fmt.Sprintf("enterprises/%v/settings/billing/cost-centers/%v/resource", enterprise, costCenterID)
219+
220+
req, err := s.client.NewRequest("DELETE", u, resources)
221+
if err != nil {
222+
return nil, nil, err
223+
}
224+
225+
result := &CostCenterRemoveResourceResponse{}
226+
resp, err := s.client.Do(ctx, req, result)
227+
if err != nil {
228+
return nil, resp, err
229+
}
230+
231+
return result, resp, nil
232+
}

0 commit comments

Comments
 (0)