mirror of
https://github.com/google/go-github.git
synced 2026-10-29 00:44:52 +08:00
272 lines
10 KiB
Go
272 lines
10 KiB
Go
// Copyright 2026 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"
|
|
)
|
|
|
|
// BudgetScope constants represent the scope of the budget.
|
|
const (
|
|
BudgetScopeEnterprise = "enterprise"
|
|
BudgetScopeOrganization = "organization"
|
|
BudgetScopeRepository = "repository"
|
|
BudgetScopeCostCenter = "cost_center"
|
|
)
|
|
|
|
// BudgetType constants represent the type of pricing for the budget.
|
|
const (
|
|
BudgetTypeProductPricing = "ProductPricing"
|
|
BudgetTypeSkuPricing = "SkuPricing"
|
|
)
|
|
|
|
// EnterpriseBudgetAlerting represents alerting settings for a GitHub enterprise budget.
|
|
type EnterpriseBudgetAlerting struct {
|
|
WillAlert *bool `json:"will_alert,omitempty"`
|
|
AlertRecipients []string `json:"alert_recipients,omitempty"`
|
|
}
|
|
|
|
// EnterpriseBudget represents a GitHub enterprise budget.
|
|
type EnterpriseBudget struct {
|
|
ID *string `json:"id,omitempty"`
|
|
BudgetType *string `json:"budget_type,omitempty"`
|
|
BudgetProductSKU *string `json:"budget_product_sku,omitempty"`
|
|
BudgetScope *string `json:"budget_scope,omitempty"`
|
|
BudgetEntityName *string `json:"budget_entity_name,omitempty"`
|
|
BudgetAmount *int `json:"budget_amount,omitempty"`
|
|
PreventFurtherUsage *bool `json:"prevent_further_usage,omitempty"`
|
|
BudgetAlerting *EnterpriseBudgetAlerting `json:"budget_alerting,omitempty"`
|
|
}
|
|
|
|
func (b EnterpriseBudget) String() string {
|
|
return Stringify(b)
|
|
}
|
|
|
|
// EnterpriseListBudgets represents a collection of GitHub enterprise budgets.
|
|
type EnterpriseListBudgets struct {
|
|
Budgets []*EnterpriseBudget `json:"budgets"`
|
|
HasNextPage *bool `json:"has_next_page,omitempty"`
|
|
TotalCount *int `json:"total_count,omitempty"`
|
|
}
|
|
|
|
// EnterpriseListBudgetsOptions specifies the optional parameters to the
|
|
// EnterpriseService.ListBudgets method.
|
|
type EnterpriseListBudgetsOptions struct {
|
|
Scope string `url:"scope,omitempty"`
|
|
User string `url:"user,omitempty"`
|
|
|
|
ListOptions
|
|
}
|
|
|
|
// EnterpriseBudgetUserState represents the budget status and consumption of an individual user.
|
|
type EnterpriseBudgetUserState struct {
|
|
User *string `json:"user,omitempty"`
|
|
ConsumedAmount float64 `json:"consumed_amount"`
|
|
TargetAmount float64 `json:"target_amount"`
|
|
OverrideBudgetID *string `json:"override_budget_id,omitempty"`
|
|
}
|
|
|
|
func (u EnterpriseBudgetUserState) String() string {
|
|
return Stringify(u)
|
|
}
|
|
|
|
// EnterpriseBudgetUserStates represents the response when retrieving user states for a budget.
|
|
type EnterpriseBudgetUserStates struct {
|
|
UserStates []*EnterpriseBudgetUserState `json:"user_states"`
|
|
HasNextPage bool `json:"has_next_page"`
|
|
TotalCount int `json:"total_count"`
|
|
}
|
|
|
|
func (u EnterpriseBudgetUserStates) String() string {
|
|
return Stringify(u)
|
|
}
|
|
|
|
// EnterpriseGetUserStatesOptions specifies the optional parameters to the
|
|
// EnterpriseService.GetUserStatesForBudget method.
|
|
type EnterpriseGetUserStatesOptions struct {
|
|
SortOrder int `url:"sort_order,omitempty"`
|
|
User string `url:"user,omitempty"`
|
|
ThresholdLowerBound float64 `url:"threshold_lower_bound,omitempty"`
|
|
ThresholdUpperBound float64 `url:"threshold_upper_bound,omitempty"`
|
|
|
|
ListOptions
|
|
}
|
|
|
|
// EnterpriseCreateBudget represents the payload to create a GitHub enterprise budget.
|
|
type EnterpriseCreateBudget struct {
|
|
BudgetAmount int `json:"budget_amount"`
|
|
PreventFurtherUsage bool `json:"prevent_further_usage"`
|
|
BudgetAlerting EnterpriseBudgetAlerting `json:"budget_alerting"`
|
|
BudgetScope string `json:"budget_scope"`
|
|
BudgetEntityName *string `json:"budget_entity_name,omitempty"`
|
|
BudgetType string `json:"budget_type"`
|
|
BudgetProductSKU *string `json:"budget_product_sku,omitempty"`
|
|
}
|
|
|
|
// EnterpriseUpdateBudget represents the payload to update a GitHub enterprise budget.
|
|
type EnterpriseUpdateBudget struct {
|
|
BudgetAmount *int `json:"budget_amount,omitempty"`
|
|
PreventFurtherUsage *bool `json:"prevent_further_usage,omitempty"`
|
|
BudgetAlerting *EnterpriseBudgetAlerting `json:"budget_alerting,omitempty"`
|
|
BudgetScope *string `json:"budget_scope,omitempty"`
|
|
BudgetEntityName *string `json:"budget_entity_name,omitempty"`
|
|
BudgetType *string `json:"budget_type,omitempty"`
|
|
BudgetProductSKU *string `json:"budget_product_sku,omitempty"`
|
|
}
|
|
|
|
// EnterpriseCreateOrUpdateBudgetResponse represents the response when creating or updating a budget.
|
|
type EnterpriseCreateOrUpdateBudgetResponse struct {
|
|
Message string `json:"message"`
|
|
Budget *EnterpriseBudget `json:"budget"`
|
|
}
|
|
|
|
// EnterpriseDeleteBudgetResponse represents the response when deleting a budget.
|
|
type EnterpriseDeleteBudgetResponse struct {
|
|
Message string `json:"message"`
|
|
ID string `json:"id"`
|
|
}
|
|
|
|
// ListBudgets gets all budgets for an enterprise.
|
|
//
|
|
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets?apiVersion=2022-11-28#get-all-budgets
|
|
//
|
|
//meta:operation GET /enterprises/{enterprise}/settings/billing/budgets
|
|
func (s *EnterpriseService) ListBudgets(ctx context.Context, enterprise string, opts *EnterpriseListBudgetsOptions) (*EnterpriseListBudgets, *Response, error) {
|
|
u := fmt.Sprintf("enterprises/%v/settings/billing/budgets", enterprise)
|
|
u, err := addOptions(u, opts)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
req, err := s.client.NewRequest(ctx, "GET", u, nil)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
var budgets *EnterpriseListBudgets
|
|
resp, err := s.client.Do(req, &budgets)
|
|
if err != nil {
|
|
return nil, resp, err
|
|
}
|
|
|
|
return budgets, resp, nil
|
|
}
|
|
|
|
// GetUserStatesForBudget gets user states for a multi-user budget in an enterprise.
|
|
//
|
|
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets?apiVersion=2022-11-28#get-user-states-for-a-multi-user-budget
|
|
//
|
|
//meta:operation GET /enterprises/{enterprise}/settings/billing/budgets/{budget_id}/user-states
|
|
func (s *EnterpriseService) GetUserStatesForBudget(ctx context.Context, enterprise, budgetID string, opts *EnterpriseGetUserStatesOptions) (*EnterpriseBudgetUserStates, *Response, error) {
|
|
u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v/user-states", enterprise, budgetID)
|
|
u, err := addOptions(u, opts)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
req, err := s.client.NewRequest(ctx, "GET", u, nil)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
var userStates *EnterpriseBudgetUserStates
|
|
resp, err := s.client.Do(req, &userStates)
|
|
if err != nil {
|
|
return nil, resp, err
|
|
}
|
|
|
|
return userStates, resp, nil
|
|
}
|
|
|
|
// CreateBudget creates a new budget for an enterprise.
|
|
//
|
|
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets?apiVersion=2022-11-28#create-a-budget
|
|
//
|
|
//meta:operation POST /enterprises/{enterprise}/settings/billing/budgets
|
|
func (s *EnterpriseService) CreateBudget(ctx context.Context, enterprise string, body EnterpriseCreateBudget) (*EnterpriseCreateOrUpdateBudgetResponse, *Response, error) {
|
|
u := fmt.Sprintf("enterprises/%v/settings/billing/budgets", enterprise)
|
|
|
|
req, err := s.client.NewRequest(ctx, "POST", u, body)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
var createBudgetResponse *EnterpriseCreateOrUpdateBudgetResponse
|
|
resp, err := s.client.Do(req, &createBudgetResponse)
|
|
if err != nil {
|
|
return nil, resp, err
|
|
}
|
|
|
|
return createBudgetResponse, resp, nil
|
|
}
|
|
|
|
// GetBudget gets a budget by ID for an enterprise.
|
|
//
|
|
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets?apiVersion=2022-11-28#get-a-budget-by-id
|
|
//
|
|
//meta:operation GET /enterprises/{enterprise}/settings/billing/budgets/{budget_id}
|
|
func (s *EnterpriseService) GetBudget(ctx context.Context, enterprise, budgetID string) (*EnterpriseBudget, *Response, error) {
|
|
u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v", enterprise, budgetID)
|
|
|
|
req, err := s.client.NewRequest(ctx, "GET", u, nil)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
var budget *EnterpriseBudget
|
|
resp, err := s.client.Do(req, &budget)
|
|
if err != nil {
|
|
return nil, resp, err
|
|
}
|
|
|
|
return budget, resp, nil
|
|
}
|
|
|
|
// UpdateBudget updates an existing budget for an enterprise.
|
|
//
|
|
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets?apiVersion=2022-11-28#update-a-budget
|
|
//
|
|
//meta:operation PATCH /enterprises/{enterprise}/settings/billing/budgets/{budget_id}
|
|
func (s *EnterpriseService) UpdateBudget(ctx context.Context, enterprise, budgetID string, body EnterpriseUpdateBudget) (*EnterpriseCreateOrUpdateBudgetResponse, *Response, error) {
|
|
u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v", enterprise, budgetID)
|
|
|
|
req, err := s.client.NewRequest(ctx, "PATCH", u, body)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
var updateBudgetResponse *EnterpriseCreateOrUpdateBudgetResponse
|
|
resp, err := s.client.Do(req, &updateBudgetResponse)
|
|
if err != nil {
|
|
return nil, resp, err
|
|
}
|
|
|
|
return updateBudgetResponse, resp, nil
|
|
}
|
|
|
|
// DeleteBudget deletes a budget by ID for an enterprise.
|
|
//
|
|
// GitHub API docs: https://docs.github.com/enterprise-cloud@latest/rest/billing/budgets?apiVersion=2022-11-28#delete-a-budget
|
|
//
|
|
//meta:operation DELETE /enterprises/{enterprise}/settings/billing/budgets/{budget_id}
|
|
func (s *EnterpriseService) DeleteBudget(ctx context.Context, enterprise, budgetID string) (*EnterpriseDeleteBudgetResponse, *Response, error) {
|
|
u := fmt.Sprintf("enterprises/%v/settings/billing/budgets/%v", enterprise, budgetID)
|
|
|
|
req, err := s.client.NewRequest(ctx, "DELETE", u, nil)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
var deleteBudgetResponse *EnterpriseDeleteBudgetResponse
|
|
resp, err := s.client.Do(req, &deleteBudgetResponse)
|
|
if err != nil {
|
|
return nil, resp, err
|
|
}
|
|
|
|
return deleteBudgetResponse, resp, nil
|
|
}
|