mirror of https://github.com/go-gitea/gitea
* upgrate go-github client to v32.1.0 * migratepull/12422/head
parent
48a423a8a8
commit
b1cfb0d7a2
@ -1,230 +0,0 @@ |
||||
// Copyright 2016 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" |
||||
"time" |
||||
) |
||||
|
||||
// AppsService provides access to the installation related functions
|
||||
// in the GitHub API.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/
|
||||
type AppsService service |
||||
|
||||
// App represents a GitHub App.
|
||||
type App struct { |
||||
ID *int64 `json:"id,omitempty"` |
||||
NodeID *string `json:"node_id,omitempty"` |
||||
Owner *User `json:"owner,omitempty"` |
||||
Name *string `json:"name,omitempty"` |
||||
Description *string `json:"description,omitempty"` |
||||
ExternalURL *string `json:"external_url,omitempty"` |
||||
HTMLURL *string `json:"html_url,omitempty"` |
||||
CreatedAt *time.Time `json:"created_at,omitempty"` |
||||
UpdatedAt *time.Time `json:"updated_at,omitempty"` |
||||
} |
||||
|
||||
// InstallationToken represents an installation token.
|
||||
type InstallationToken struct { |
||||
Token *string `json:"token,omitempty"` |
||||
ExpiresAt *time.Time `json:"expires_at,omitempty"` |
||||
} |
||||
|
||||
// InstallationPermissions lists the permissions for metadata, contents, issues and single file for an installation.
|
||||
type InstallationPermissions struct { |
||||
Metadata *string `json:"metadata,omitempty"` |
||||
Contents *string `json:"contents,omitempty"` |
||||
Issues *string `json:"issues,omitempty"` |
||||
SingleFile *string `json:"single_file,omitempty"` |
||||
} |
||||
|
||||
// Installation represents a GitHub Apps installation.
|
||||
type Installation struct { |
||||
ID *int64 `json:"id,omitempty"` |
||||
AppID *int64 `json:"app_id,omitempty"` |
||||
TargetID *int64 `json:"target_id,omitempty"` |
||||
Account *User `json:"account,omitempty"` |
||||
AccessTokensURL *string `json:"access_tokens_url,omitempty"` |
||||
RepositoriesURL *string `json:"repositories_url,omitempty"` |
||||
HTMLURL *string `json:"html_url,omitempty"` |
||||
TargetType *string `json:"target_type,omitempty"` |
||||
SingleFileName *string `json:"single_file_name,omitempty"` |
||||
RepositorySelection *string `json:"repository_selection,omitempty"` |
||||
Events []string `json:"events,omitempty"` |
||||
Permissions *InstallationPermissions `json:"permissions,omitempty"` |
||||
CreatedAt *Timestamp `json:"created_at,omitempty"` |
||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"` |
||||
} |
||||
|
||||
func (i Installation) String() string { |
||||
return Stringify(i) |
||||
} |
||||
|
||||
// Get a single GitHub App. Passing the empty string will get
|
||||
// the authenticated GitHub App.
|
||||
//
|
||||
// Note: appSlug is just the URL-friendly name of your GitHub App.
|
||||
// You can find this on the settings page for your GitHub App
|
||||
// (e.g., https://github.com/settings/apps/:app_slug).
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/#get-a-single-github-app
|
||||
func (s *AppsService) Get(ctx context.Context, appSlug string) (*App, *Response, error) { |
||||
var u string |
||||
if appSlug != "" { |
||||
u = fmt.Sprintf("apps/%v", appSlug) |
||||
} else { |
||||
u = "app" |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeIntegrationPreview) |
||||
|
||||
app := new(App) |
||||
resp, err := s.client.Do(ctx, req, app) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return app, resp, nil |
||||
} |
||||
|
||||
// ListInstallations lists the installations that the current GitHub App has.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/#find-installations
|
||||
func (s *AppsService) ListInstallations(ctx context.Context, opt *ListOptions) ([]*Installation, *Response, error) { |
||||
u, err := addOptions("app/installations", opt) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeIntegrationPreview) |
||||
|
||||
var i []*Installation |
||||
resp, err := s.client.Do(ctx, req, &i) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return i, resp, nil |
||||
} |
||||
|
||||
// GetInstallation returns the specified installation.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/#get-a-single-installation
|
||||
func (s *AppsService) GetInstallation(ctx context.Context, id int64) (*Installation, *Response, error) { |
||||
return s.getInstallation(ctx, fmt.Sprintf("app/installations/%v", id)) |
||||
} |
||||
|
||||
// ListUserInstallations lists installations that are accessible to the authenticated user.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/#list-installations-for-user
|
||||
func (s *AppsService) ListUserInstallations(ctx context.Context, opt *ListOptions) ([]*Installation, *Response, error) { |
||||
u, err := addOptions("user/installations", opt) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeIntegrationPreview) |
||||
|
||||
var i struct { |
||||
Installations []*Installation `json:"installations"` |
||||
} |
||||
resp, err := s.client.Do(ctx, req, &i) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return i.Installations, resp, nil |
||||
} |
||||
|
||||
// CreateInstallationToken creates a new installation token.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/#create-a-new-installation-token
|
||||
func (s *AppsService) CreateInstallationToken(ctx context.Context, id int64) (*InstallationToken, *Response, error) { |
||||
u := fmt.Sprintf("app/installations/%v/access_tokens", id) |
||||
|
||||
req, err := s.client.NewRequest("POST", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeIntegrationPreview) |
||||
|
||||
t := new(InstallationToken) |
||||
resp, err := s.client.Do(ctx, req, t) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return t, resp, nil |
||||
} |
||||
|
||||
// FindOrganizationInstallation finds the organization's installation information.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/#find-organization-installation
|
||||
func (s *AppsService) FindOrganizationInstallation(ctx context.Context, org string) (*Installation, *Response, error) { |
||||
return s.getInstallation(ctx, fmt.Sprintf("orgs/%v/installation", org)) |
||||
} |
||||
|
||||
// FindRepositoryInstallation finds the repository's installation information.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/#find-repository-installation
|
||||
func (s *AppsService) FindRepositoryInstallation(ctx context.Context, owner, repo string) (*Installation, *Response, error) { |
||||
return s.getInstallation(ctx, fmt.Sprintf("repos/%v/%v/installation", owner, repo)) |
||||
} |
||||
|
||||
// FindRepositoryInstallationByID finds the repository's installation information.
|
||||
//
|
||||
// Note: FindRepositoryInstallationByID uses the undocumented GitHub API endpoint /repositories/:id/installation.
|
||||
func (s *AppsService) FindRepositoryInstallationByID(ctx context.Context, id int64) (*Installation, *Response, error) { |
||||
return s.getInstallation(ctx, fmt.Sprintf("repositories/%d/installation", id)) |
||||
} |
||||
|
||||
// FindUserInstallation finds the user's installation information.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/#find-repository-installation
|
||||
func (s *AppsService) FindUserInstallation(ctx context.Context, user string) (*Installation, *Response, error) { |
||||
return s.getInstallation(ctx, fmt.Sprintf("users/%v/installation", user)) |
||||
} |
||||
|
||||
func (s *AppsService) getInstallation(ctx context.Context, url string) (*Installation, *Response, error) { |
||||
req, err := s.client.NewRequest("GET", url, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeIntegrationPreview) |
||||
|
||||
i := new(Installation) |
||||
resp, err := s.client.Do(ctx, req, i) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return i, resp, nil |
||||
} |
@ -1,457 +0,0 @@ |
||||
// Copyright 2018 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" |
||||
"strings" |
||||
"time" |
||||
) |
||||
|
||||
// TeamsService provides access to the team-related functions
|
||||
// in the GitHub API.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/
|
||||
type TeamsService service |
||||
|
||||
// Team represents a team within a GitHub organization. Teams are used to
|
||||
// manage access to an organization's repositories.
|
||||
type Team struct { |
||||
ID *int64 `json:"id,omitempty"` |
||||
Name *string `json:"name,omitempty"` |
||||
Description *string `json:"description,omitempty"` |
||||
URL *string `json:"url,omitempty"` |
||||
Slug *string `json:"slug,omitempty"` |
||||
|
||||
// Permission specifies the default permission for repositories owned by the team.
|
||||
Permission *string `json:"permission,omitempty"` |
||||
|
||||
// Privacy identifies the level of privacy this team should have.
|
||||
// Possible values are:
|
||||
// secret - only visible to organization owners and members of this team
|
||||
// closed - visible to all members of this organization
|
||||
// Default is "secret".
|
||||
Privacy *string `json:"privacy,omitempty"` |
||||
|
||||
MembersCount *int `json:"members_count,omitempty"` |
||||
ReposCount *int `json:"repos_count,omitempty"` |
||||
Organization *Organization `json:"organization,omitempty"` |
||||
MembersURL *string `json:"members_url,omitempty"` |
||||
RepositoriesURL *string `json:"repositories_url,omitempty"` |
||||
Parent *Team `json:"parent,omitempty"` |
||||
|
||||
// LDAPDN is only available in GitHub Enterprise and when the team
|
||||
// membership is synchronized with LDAP.
|
||||
LDAPDN *string `json:"ldap_dn,omitempty"` |
||||
} |
||||
|
||||
func (t Team) String() string { |
||||
return Stringify(t) |
||||
} |
||||
|
||||
// Invitation represents a team member's invitation status.
|
||||
type Invitation struct { |
||||
ID *int64 `json:"id,omitempty"` |
||||
Login *string `json:"login,omitempty"` |
||||
Email *string `json:"email,omitempty"` |
||||
// Role can be one of the values - 'direct_member', 'admin', 'billing_manager', 'hiring_manager', or 'reinstate'.
|
||||
Role *string `json:"role,omitempty"` |
||||
CreatedAt *time.Time `json:"created_at,omitempty"` |
||||
Inviter *User `json:"inviter,omitempty"` |
||||
TeamCount *int `json:"team_count,omitempty"` |
||||
InvitationTeamURL *string `json:"invitation_team_url,omitempty"` |
||||
} |
||||
|
||||
func (i Invitation) String() string { |
||||
return Stringify(i) |
||||
} |
||||
|
||||
// ListTeams lists all of the teams for an organization.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#list-teams
|
||||
func (s *TeamsService) ListTeams(ctx context.Context, org string, opt *ListOptions) ([]*Team, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams", org) |
||||
u, err := addOptions(u, opt) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeNestedTeamsPreview) |
||||
|
||||
var teams []*Team |
||||
resp, err := s.client.Do(ctx, req, &teams) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return teams, resp, nil |
||||
} |
||||
|
||||
// GetTeam fetches a team by ID.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#get-team
|
||||
func (s *TeamsService) GetTeam(ctx context.Context, team int64) (*Team, *Response, error) { |
||||
u := fmt.Sprintf("teams/%v", team) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeNestedTeamsPreview) |
||||
|
||||
t := new(Team) |
||||
resp, err := s.client.Do(ctx, req, t) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return t, resp, nil |
||||
} |
||||
|
||||
// NewTeam represents a team to be created or modified.
|
||||
type NewTeam struct { |
||||
Name string `json:"name"` // Name of the team. (Required.)
|
||||
Description *string `json:"description,omitempty"` |
||||
Maintainers []string `json:"maintainers,omitempty"` |
||||
RepoNames []string `json:"repo_names,omitempty"` |
||||
ParentTeamID *int64 `json:"parent_team_id,omitempty"` |
||||
|
||||
// Deprecated: Permission is deprecated when creating or editing a team in an org
|
||||
// using the new GitHub permission model. It no longer identifies the
|
||||
// permission a team has on its repos, but only specifies the default
|
||||
// permission a repo is initially added with. Avoid confusion by
|
||||
// specifying a permission value when calling AddTeamRepo.
|
||||
Permission *string `json:"permission,omitempty"` |
||||
|
||||
// Privacy identifies the level of privacy this team should have.
|
||||
// Possible values are:
|
||||
// secret - only visible to organization owners and members of this team
|
||||
// closed - visible to all members of this organization
|
||||
// Default is "secret".
|
||||
Privacy *string `json:"privacy,omitempty"` |
||||
|
||||
// LDAPDN may be used in GitHub Enterprise when the team membership
|
||||
// is synchronized with LDAP.
|
||||
LDAPDN *string `json:"ldap_dn,omitempty"` |
||||
} |
||||
|
||||
func (s NewTeam) String() string { |
||||
return Stringify(s) |
||||
} |
||||
|
||||
// CreateTeam creates a new team within an organization.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#create-team
|
||||
func (s *TeamsService) CreateTeam(ctx context.Context, org string, team NewTeam) (*Team, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams", org) |
||||
req, err := s.client.NewRequest("POST", u, team) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeNestedTeamsPreview) |
||||
|
||||
t := new(Team) |
||||
resp, err := s.client.Do(ctx, req, t) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return t, resp, nil |
||||
} |
||||
|
||||
// EditTeam edits a team.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#edit-team
|
||||
func (s *TeamsService) EditTeam(ctx context.Context, id int64, team NewTeam) (*Team, *Response, error) { |
||||
u := fmt.Sprintf("teams/%v", id) |
||||
req, err := s.client.NewRequest("PATCH", u, team) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeNestedTeamsPreview) |
||||
|
||||
t := new(Team) |
||||
resp, err := s.client.Do(ctx, req, t) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return t, resp, nil |
||||
} |
||||
|
||||
// DeleteTeam deletes a team.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#delete-team
|
||||
func (s *TeamsService) DeleteTeam(ctx context.Context, team int64) (*Response, error) { |
||||
u := fmt.Sprintf("teams/%v", team) |
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
req.Header.Set("Accept", mediaTypeNestedTeamsPreview) |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// ListChildTeams lists child teams for a team.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#list-child-teams
|
||||
func (s *TeamsService) ListChildTeams(ctx context.Context, teamID int64, opt *ListOptions) ([]*Team, *Response, error) { |
||||
u := fmt.Sprintf("teams/%v/teams", teamID) |
||||
u, err := addOptions(u, opt) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
req.Header.Set("Accept", mediaTypeNestedTeamsPreview) |
||||
|
||||
var teams []*Team |
||||
resp, err := s.client.Do(ctx, req, &teams) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return teams, resp, nil |
||||
} |
||||
|
||||
// ListTeamRepos lists the repositories that the specified team has access to.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#list-team-repos
|
||||
func (s *TeamsService) ListTeamRepos(ctx context.Context, team int64, opt *ListOptions) ([]*Repository, *Response, error) { |
||||
u := fmt.Sprintf("teams/%v/repos", team) |
||||
u, err := addOptions(u, opt) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when topics API fully launches.
|
||||
headers := []string{mediaTypeTopicsPreview, mediaTypeNestedTeamsPreview} |
||||
req.Header.Set("Accept", strings.Join(headers, ", ")) |
||||
|
||||
var repos []*Repository |
||||
resp, err := s.client.Do(ctx, req, &repos) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return repos, resp, nil |
||||
} |
||||
|
||||
// IsTeamRepo checks if a team manages the specified repository. If the
|
||||
// repository is managed by team, a Repository is returned which includes the
|
||||
// permissions team has for that repo.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#check-if-a-team-manages-a-repository
|
||||
func (s *TeamsService) IsTeamRepo(ctx context.Context, team int64, owner string, repo string) (*Repository, *Response, error) { |
||||
u := fmt.Sprintf("teams/%v/repos/%v/%v", team, owner, repo) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
headers := []string{mediaTypeOrgPermissionRepo, mediaTypeNestedTeamsPreview} |
||||
req.Header.Set("Accept", strings.Join(headers, ", ")) |
||||
|
||||
repository := new(Repository) |
||||
resp, err := s.client.Do(ctx, req, repository) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return repository, resp, nil |
||||
} |
||||
|
||||
// TeamAddTeamRepoOptions specifies the optional parameters to the
|
||||
// TeamsService.AddTeamRepo method.
|
||||
type TeamAddTeamRepoOptions struct { |
||||
// Permission specifies the permission to grant the team on this repository.
|
||||
// Possible values are:
|
||||
// pull - team members can pull, but not push to or administer this repository
|
||||
// push - team members can pull and push, but not administer this repository
|
||||
// admin - team members can pull, push and administer this repository
|
||||
//
|
||||
// If not specified, the team's permission attribute will be used.
|
||||
Permission string `json:"permission,omitempty"` |
||||
} |
||||
|
||||
// AddTeamRepo adds a repository to be managed by the specified team. The
|
||||
// specified repository must be owned by the organization to which the team
|
||||
// belongs, or a direct fork of a repository owned by the organization.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#add-team-repo
|
||||
func (s *TeamsService) AddTeamRepo(ctx context.Context, team int64, owner string, repo string, opt *TeamAddTeamRepoOptions) (*Response, error) { |
||||
u := fmt.Sprintf("teams/%v/repos/%v/%v", team, owner, repo) |
||||
req, err := s.client.NewRequest("PUT", u, opt) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// RemoveTeamRepo removes a repository from being managed by the specified
|
||||
// team. Note that this does not delete the repository, it just removes it
|
||||
// from the team.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#remove-team-repo
|
||||
func (s *TeamsService) RemoveTeamRepo(ctx context.Context, team int64, owner string, repo string) (*Response, error) { |
||||
u := fmt.Sprintf("teams/%v/repos/%v/%v", team, owner, repo) |
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// ListUserTeams lists a user's teams
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#list-user-teams
|
||||
func (s *TeamsService) ListUserTeams(ctx context.Context, opt *ListOptions) ([]*Team, *Response, error) { |
||||
u := "user/teams" |
||||
u, err := addOptions(u, opt) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeNestedTeamsPreview) |
||||
|
||||
var teams []*Team |
||||
resp, err := s.client.Do(ctx, req, &teams) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return teams, resp, nil |
||||
} |
||||
|
||||
// ListTeamProjects lists the organization projects for a team.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#list-team-projects
|
||||
func (s *TeamsService) ListTeamProjects(ctx context.Context, teamID int64) ([]*Project, *Response, error) { |
||||
u := fmt.Sprintf("teams/%v/projects", teamID) |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
acceptHeaders := []string{mediaTypeNestedTeamsPreview, mediaTypeProjectsPreview} |
||||
req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) |
||||
|
||||
var projects []*Project |
||||
resp, err := s.client.Do(ctx, req, &projects) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return projects, resp, nil |
||||
} |
||||
|
||||
// ReviewTeamProjects checks whether a team has read, write, or admin
|
||||
// permissions for an organization project.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#review-a-team-project
|
||||
func (s *TeamsService) ReviewTeamProjects(ctx context.Context, teamID, projectID int64) (*Project, *Response, error) { |
||||
u := fmt.Sprintf("teams/%v/projects/%v", teamID, projectID) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
acceptHeaders := []string{mediaTypeNestedTeamsPreview, mediaTypeProjectsPreview} |
||||
req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) |
||||
|
||||
projects := &Project{} |
||||
resp, err := s.client.Do(ctx, req, &projects) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return projects, resp, nil |
||||
} |
||||
|
||||
// TeamProjectOptions specifies the optional parameters to the
|
||||
// TeamsService.AddTeamProject method.
|
||||
type TeamProjectOptions struct { |
||||
// Permission specifies the permission to grant to the team for this project.
|
||||
// Possible values are:
|
||||
// "read" - team members can read, but not write to or administer this project.
|
||||
// "write" - team members can read and write, but not administer this project.
|
||||
// "admin" - team members can read, write and administer this project.
|
||||
//
|
||||
Permission *string `json:"permission,omitempty"` |
||||
} |
||||
|
||||
// AddTeamProject adds an organization project to a team. To add a project to a team or
|
||||
// update the team's permission on a project, the authenticated user must have admin
|
||||
// permissions for the project.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#add-or-update-team-project
|
||||
func (s *TeamsService) AddTeamProject(ctx context.Context, teamID, projectID int64, opt *TeamProjectOptions) (*Response, error) { |
||||
u := fmt.Sprintf("teams/%v/projects/%v", teamID, projectID) |
||||
req, err := s.client.NewRequest("PUT", u, opt) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
acceptHeaders := []string{mediaTypeNestedTeamsPreview, mediaTypeProjectsPreview} |
||||
req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// RemoveTeamProject removes an organization project from a team. An organization owner or
|
||||
// a team maintainer can remove any project from the team. To remove a project from a team
|
||||
// as an organization member, the authenticated user must have "read" access to both the team
|
||||
// and project, or "admin" access to the team or project.
|
||||
// Note: This endpoint removes the project from the team, but does not delete it.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#remove-team-project
|
||||
func (s *TeamsService) RemoveTeamProject(ctx context.Context, teamID int64, projectID int64) (*Response, error) { |
||||
u := fmt.Sprintf("teams/%v/projects/%v", teamID, projectID) |
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
acceptHeaders := []string{mediaTypeNestedTeamsPreview, mediaTypeProjectsPreview} |
||||
req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
@ -1,155 +0,0 @@ |
||||
// Copyright 2018 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" |
||||
) |
||||
|
||||
// DiscussionComment represents a GitHub dicussion in a team.
|
||||
type DiscussionComment struct { |
||||
Author *User `json:"author,omitempty"` |
||||
Body *string `json:"body,omitempty"` |
||||
BodyHTML *string `json:"body_html,omitempty"` |
||||
BodyVersion *string `json:"body_version,omitempty"` |
||||
CreatedAt *Timestamp `json:"created_at,omitempty"` |
||||
LastEditedAt *Timestamp `json:"last_edited_at,omitempty"` |
||||
DiscussionURL *string `json:"discussion_url,omitempty"` |
||||
HTMLURL *string `json:"html_url,omitempty"` |
||||
NodeID *string `json:"node_id,omitempty"` |
||||
Number *int `json:"number,omitempty"` |
||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"` |
||||
URL *string `json:"url,omitempty"` |
||||
Reactions *Reactions `json:"reactions,omitempty"` |
||||
} |
||||
|
||||
func (c DiscussionComment) String() string { |
||||
return Stringify(c) |
||||
} |
||||
|
||||
// DiscussionCommentListOptions specifies optional parameters to the
|
||||
// TeamServices.ListComments method.
|
||||
type DiscussionCommentListOptions struct { |
||||
// Sorts the discussion comments by the date they were created.
|
||||
// Accepted values are asc and desc. Default is desc.
|
||||
Direction string `url:"direction,omitempty"` |
||||
} |
||||
|
||||
// ListComments lists all comments on a team discussion.
|
||||
// Authenticated user must grant read:discussion scope.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#list-comments
|
||||
func (s *TeamsService) ListComments(ctx context.Context, teamID int64, discussionNumber int, options *DiscussionCommentListOptions) ([]*DiscussionComment, *Response, error) { |
||||
u := fmt.Sprintf("teams/%v/discussions/%v/comments", teamID, discussionNumber) |
||||
u, err := addOptions(u, options) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeTeamDiscussionsPreview) |
||||
|
||||
var comments []*DiscussionComment |
||||
resp, err := s.client.Do(ctx, req, &comments) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return comments, resp, nil |
||||
} |
||||
|
||||
// GetComment gets a specific comment on a team discussion.
|
||||
// Authenticated user must grant read:discussion scope.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#get-a-single-comment
|
||||
func (s *TeamsService) GetComment(ctx context.Context, teamID int64, discussionNumber, commentNumber int) (*DiscussionComment, *Response, error) { |
||||
u := fmt.Sprintf("teams/%v/discussions/%v/comments/%v", teamID, discussionNumber, commentNumber) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeTeamDiscussionsPreview) |
||||
|
||||
discussionComment := &DiscussionComment{} |
||||
resp, err := s.client.Do(ctx, req, discussionComment) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return discussionComment, resp, nil |
||||
} |
||||
|
||||
// CreateComment creates a new discussion post on a team discussion.
|
||||
// Authenticated user must grant write:discussion scope.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#create-a-comment
|
||||
func (s *TeamsService) CreateComment(ctx context.Context, teamID int64, discsusionNumber int, comment DiscussionComment) (*DiscussionComment, *Response, error) { |
||||
u := fmt.Sprintf("teams/%v/discussions/%v/comments", teamID, discsusionNumber) |
||||
req, err := s.client.NewRequest("POST", u, comment) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeTeamDiscussionsPreview) |
||||
|
||||
discussionComment := &DiscussionComment{} |
||||
resp, err := s.client.Do(ctx, req, discussionComment) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return discussionComment, resp, nil |
||||
} |
||||
|
||||
// EditComment edits the body text of a discussion comment.
|
||||
// Authenticated user must grant write:discussion scope.
|
||||
// User is allowed to edit body of a comment only.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#edit-a-comment
|
||||
func (s *TeamsService) EditComment(ctx context.Context, teamID int64, discussionNumber, commentNumber int, comment DiscussionComment) (*DiscussionComment, *Response, error) { |
||||
u := fmt.Sprintf("teams/%v/discussions/%v/comments/%v", teamID, discussionNumber, commentNumber) |
||||
req, err := s.client.NewRequest("PATCH", u, comment) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeTeamDiscussionsPreview) |
||||
|
||||
discussionComment := &DiscussionComment{} |
||||
resp, err := s.client.Do(ctx, req, discussionComment) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return discussionComment, resp, nil |
||||
} |
||||
|
||||
// DeleteComment deletes a comment on a team discussion.
|
||||
// Authenticated user must grant write:discussion scope.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#delete-a-comment
|
||||
func (s *TeamsService) DeleteComment(ctx context.Context, teamID int64, discussionNumber, commentNumber int) (*Response, error) { |
||||
u := fmt.Sprintf("teams/%v/discussions/%v/comments/%v", teamID, discussionNumber, commentNumber) |
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeTeamDiscussionsPreview) |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
@ -1,160 +0,0 @@ |
||||
// Copyright 2018 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" |
||||
) |
||||
|
||||
// TeamDiscussion represents a GitHub dicussion in a team.
|
||||
type TeamDiscussion struct { |
||||
Author *User `json:"author,omitempty"` |
||||
Body *string `json:"body,omitempty"` |
||||
BodyHTML *string `json:"body_html,omitempty"` |
||||
BodyVersion *string `json:"body_version,omitempty"` |
||||
CommentsCount *int `json:"comments_count,omitempty"` |
||||
CommentsURL *string `json:"comments_url,omitempty"` |
||||
CreatedAt *Timestamp `json:"created_at,omitempty"` |
||||
LastEditedAt *Timestamp `json:"last_edited_at,omitempty"` |
||||
HTMLURL *string `json:"html_url,omitempty"` |
||||
NodeID *string `json:"node_id,omitempty"` |
||||
Number *int `json:"number,omitempty"` |
||||
Pinned *bool `json:"pinned,omitempty"` |
||||
Private *bool `json:"private,omitempty"` |
||||
TeamURL *string `json:"team_url,omitempty"` |
||||
Title *string `json:"title,omitempty"` |
||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"` |
||||
URL *string `json:"url,omitempty"` |
||||
Reactions *Reactions `json:"reactions,omitempty"` |
||||
} |
||||
|
||||
func (d TeamDiscussion) String() string { |
||||
return Stringify(d) |
||||
} |
||||
|
||||
// DiscussionListOptions specifies optional parameters to the
|
||||
// TeamServices.ListDiscussions method.
|
||||
type DiscussionListOptions struct { |
||||
// Sorts the discussion by the date they were created.
|
||||
// Accepted values are asc and desc. Default is desc.
|
||||
Direction string `url:"direction,omitempty"` |
||||
} |
||||
|
||||
// ListDiscussions lists all discussions on team's page.
|
||||
// Authenticated user must grant read:discussion scope.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/discussions/#list-discussions
|
||||
func (s *TeamsService) ListDiscussions(ctx context.Context, teamID int64, options *DiscussionListOptions) ([]*TeamDiscussion, *Response, error) { |
||||
u := fmt.Sprintf("teams/%v/discussions", teamID) |
||||
u, err := addOptions(u, options) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeTeamDiscussionsPreview) |
||||
|
||||
var teamDiscussions []*TeamDiscussion |
||||
resp, err := s.client.Do(ctx, req, &teamDiscussions) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return teamDiscussions, resp, nil |
||||
} |
||||
|
||||
// GetDiscussion gets a specific discussion on a team's page.
|
||||
// Authenticated user must grant read:discussion scope.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/discussions/#get-a-single-discussion
|
||||
func (s *TeamsService) GetDiscussion(ctx context.Context, teamID int64, discussionNumber int) (*TeamDiscussion, *Response, error) { |
||||
u := fmt.Sprintf("teams/%v/discussions/%v", teamID, discussionNumber) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeTeamDiscussionsPreview) |
||||
|
||||
teamDiscussion := &TeamDiscussion{} |
||||
resp, err := s.client.Do(ctx, req, teamDiscussion) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return teamDiscussion, resp, nil |
||||
} |
||||
|
||||
// CreateDiscussion creates a new discussion post on a team's page.
|
||||
// Authenticated user must grant write:discussion scope.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/discussions/#create-a-discussion
|
||||
func (s *TeamsService) CreateDiscussion(ctx context.Context, teamID int64, discussion TeamDiscussion) (*TeamDiscussion, *Response, error) { |
||||
u := fmt.Sprintf("teams/%v/discussions", teamID) |
||||
req, err := s.client.NewRequest("POST", u, discussion) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeTeamDiscussionsPreview) |
||||
|
||||
teamDiscussion := &TeamDiscussion{} |
||||
resp, err := s.client.Do(ctx, req, teamDiscussion) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return teamDiscussion, resp, nil |
||||
} |
||||
|
||||
// EditDiscussion edits the title and body text of a discussion post.
|
||||
// Authenticated user must grant write:discussion scope.
|
||||
// User is allowed to change Title and Body of a discussion only.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/discussions/#edit-a-discussion
|
||||
func (s *TeamsService) EditDiscussion(ctx context.Context, teamID int64, discussionNumber int, discussion TeamDiscussion) (*TeamDiscussion, *Response, error) { |
||||
u := fmt.Sprintf("teams/%v/discussions/%v", teamID, discussionNumber) |
||||
req, err := s.client.NewRequest("PATCH", u, discussion) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeTeamDiscussionsPreview) |
||||
|
||||
teamDiscussion := &TeamDiscussion{} |
||||
resp, err := s.client.Do(ctx, req, teamDiscussion) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return teamDiscussion, resp, nil |
||||
} |
||||
|
||||
// DeleteDiscussion deletes a discussion from team's page.
|
||||
// Authenticated user must grant write:discussion scope.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/discussions/#delete-a-discussion
|
||||
func (s *TeamsService) DeleteDiscussion(ctx context.Context, teamID int64, discussionNumber int) (*Response, error) { |
||||
u := fmt.Sprintf("teams/%v/discussions/%v", teamID, discussionNumber) |
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeTeamDiscussionsPreview) |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
@ -1,174 +0,0 @@ |
||||
// Copyright 2018 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" |
||||
) |
||||
|
||||
// TeamListTeamMembersOptions specifies the optional parameters to the
|
||||
// TeamsService.ListTeamMembers method.
|
||||
type TeamListTeamMembersOptions struct { |
||||
// Role filters members returned by their role in the team. Possible
|
||||
// values are "all", "member", "maintainer". Default is "all".
|
||||
Role string `url:"role,omitempty"` |
||||
|
||||
ListOptions |
||||
} |
||||
|
||||
// ListTeamMembers lists all of the users who are members of the specified
|
||||
// team.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/members/#list-team-members
|
||||
func (s *TeamsService) ListTeamMembers(ctx context.Context, team int64, opt *TeamListTeamMembersOptions) ([]*User, *Response, error) { |
||||
u := fmt.Sprintf("teams/%v/members", team) |
||||
u, err := addOptions(u, opt) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
req.Header.Set("Accept", mediaTypeNestedTeamsPreview) |
||||
|
||||
var members []*User |
||||
resp, err := s.client.Do(ctx, req, &members) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return members, resp, nil |
||||
} |
||||
|
||||
// IsTeamMember checks if a user is a member of the specified team.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/members/#get-team-member
|
||||
//
|
||||
// Deprecated: This API has been marked as deprecated in the Github API docs,
|
||||
// TeamsService.GetTeamMembership method should be used instead.
|
||||
func (s *TeamsService) IsTeamMember(ctx context.Context, team int64, user string) (bool, *Response, error) { |
||||
u := fmt.Sprintf("teams/%v/members/%v", team, user) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return false, nil, err |
||||
} |
||||
|
||||
resp, err := s.client.Do(ctx, req, nil) |
||||
member, err := parseBoolResponse(err) |
||||
return member, resp, err |
||||
} |
||||
|
||||
// GetTeamMembership returns the membership status for a user in a team.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/members/#get-team-membership
|
||||
func (s *TeamsService) GetTeamMembership(ctx context.Context, team int64, user string) (*Membership, *Response, error) { |
||||
u := fmt.Sprintf("teams/%v/memberships/%v", team, user) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
req.Header.Set("Accept", mediaTypeNestedTeamsPreview) |
||||
|
||||
t := new(Membership) |
||||
resp, err := s.client.Do(ctx, req, t) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return t, resp, nil |
||||
} |
||||
|
||||
// TeamAddTeamMembershipOptions specifies the optional
|
||||
// parameters to the TeamsService.AddTeamMembership method.
|
||||
type TeamAddTeamMembershipOptions struct { |
||||
// Role specifies the role the user should have in the team. Possible
|
||||
// values are:
|
||||
// member - a normal member of the team
|
||||
// maintainer - a team maintainer. Able to add/remove other team
|
||||
// members, promote other team members to team
|
||||
// maintainer, and edit the team’s name and description
|
||||
//
|
||||
// Default value is "member".
|
||||
Role string `json:"role,omitempty"` |
||||
} |
||||
|
||||
// AddTeamMembership adds or invites a user to a team.
|
||||
//
|
||||
// In order to add a membership between a user and a team, the authenticated
|
||||
// user must have 'admin' permissions to the team or be an owner of the
|
||||
// organization that the team is associated with.
|
||||
//
|
||||
// If the user is already a part of the team's organization (meaning they're on
|
||||
// at least one other team in the organization), this endpoint will add the
|
||||
// user to the team.
|
||||
//
|
||||
// If the user is completely unaffiliated with the team's organization (meaning
|
||||
// they're on none of the organization's teams), this endpoint will send an
|
||||
// invitation to the user via email. This newly-created membership will be in
|
||||
// the "pending" state until the user accepts the invitation, at which point
|
||||
// the membership will transition to the "active" state and the user will be
|
||||
// added as a member of the team.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/members/#add-or-update-team-membership
|
||||
func (s *TeamsService) AddTeamMembership(ctx context.Context, team int64, user string, opt *TeamAddTeamMembershipOptions) (*Membership, *Response, error) { |
||||
u := fmt.Sprintf("teams/%v/memberships/%v", team, user) |
||||
req, err := s.client.NewRequest("PUT", u, opt) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
t := new(Membership) |
||||
resp, err := s.client.Do(ctx, req, t) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return t, resp, nil |
||||
} |
||||
|
||||
// RemoveTeamMembership removes a user from a team.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/members/#remove-team-membership
|
||||
func (s *TeamsService) RemoveTeamMembership(ctx context.Context, team int64, user string) (*Response, error) { |
||||
u := fmt.Sprintf("teams/%v/memberships/%v", team, user) |
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// ListPendingTeamInvitations get pending invitaion list in team.
|
||||
// Warning: The API may change without advance notice during the preview period.
|
||||
// Preview features are not supported for production use.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/members/#list-pending-team-invitations
|
||||
func (s *TeamsService) ListPendingTeamInvitations(ctx context.Context, team int64, opt *ListOptions) ([]*Invitation, *Response, error) { |
||||
u := fmt.Sprintf("teams/%v/invitations", team) |
||||
u, err := addOptions(u, opt) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
var pendingInvitations []*Invitation |
||||
resp, err := s.client.Do(ctx, req, &pendingInvitations) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return pendingInvitations, resp, nil |
||||
} |
@ -0,0 +1,12 @@ |
||||
// Copyright 2020 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 |
||||
|
||||
// ActionsService handles communication with the actions related
|
||||
// methods of the GitHub API.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/
|
||||
type ActionsService service |
@ -0,0 +1,164 @@ |
||||
// Copyright 2020 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" |
||||
"net/url" |
||||
) |
||||
|
||||
// Artifact reprents a GitHub artifact. Artifacts allow sharing
|
||||
// data between jobs in a workflow and provide storage for data
|
||||
// once a workflow is complete.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/artifacts/
|
||||
type Artifact struct { |
||||
ID *int64 `json:"id,omitempty"` |
||||
NodeID *string `json:"node_id,omitempty"` |
||||
Name *string `json:"name,omitempty"` |
||||
SizeInBytes *int64 `json:"size_in_bytes,omitempty"` |
||||
ArchiveDownloadURL *string `json:"archive_download_url,omitempty"` |
||||
Expired *bool `json:"expired,omitempty"` |
||||
CreatedAt *Timestamp `json:"created_at,omitempty"` |
||||
ExpiresAt *Timestamp `json:"expires_at,omitempty"` |
||||
} |
||||
|
||||
// ArtifactList represents a list of GitHub artifacts.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/artifacts/
|
||||
type ArtifactList struct { |
||||
TotalCount *int64 `json:"total_count,omitempty"` |
||||
Artifacts []*Artifact `json:"artifacts,omitempty"` |
||||
} |
||||
|
||||
// ListArtifacts lists all artifacts that belong to a repository.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/artifacts/#list-artifacts-for-a-repository
|
||||
func (s *ActionsService) ListArtifacts(ctx context.Context, owner, repo string, opts *ListOptions) (*ArtifactList, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/artifacts", owner, repo) |
||||
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 |
||||
} |
||||
|
||||
artifactList := new(ArtifactList) |
||||
resp, err := s.client.Do(ctx, req, artifactList) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return artifactList, resp, nil |
||||
} |
||||
|
||||
// ListWorkflowRunArtifacts lists all artifacts that belong to a workflow run.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/artifacts/#list-workflow-run-artifacts
|
||||
func (s *ActionsService) ListWorkflowRunArtifacts(ctx context.Context, owner, repo string, runID int64, opts *ListOptions) (*ArtifactList, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/artifacts", owner, repo, runID) |
||||
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 |
||||
} |
||||
|
||||
artifactList := new(ArtifactList) |
||||
resp, err := s.client.Do(ctx, req, artifactList) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return artifactList, resp, nil |
||||
} |
||||
|
||||
// GetArtifact gets a specific artifact for a workflow run.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/artifacts/#get-an-artifact
|
||||
func (s *ActionsService) GetArtifact(ctx context.Context, owner, repo string, artifactID int64) (*Artifact, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/artifacts/%v", owner, repo, artifactID) |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
artifact := new(Artifact) |
||||
resp, err := s.client.Do(ctx, req, artifact) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return artifact, resp, nil |
||||
} |
||||
|
||||
// DownloadArtifact gets a redirect URL to download an archive for a repository.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/artifacts/#download-an-artifact
|
||||
func (s *ActionsService) DownloadArtifact(ctx context.Context, owner, repo string, artifactID int64, followRedirects bool) (*url.URL, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/artifacts/%v/zip", owner, repo, artifactID) |
||||
|
||||
resp, err := s.getDownloadArtifactFromURL(ctx, u, followRedirects) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
if resp.StatusCode != http.StatusFound { |
||||
return nil, newResponse(resp), fmt.Errorf("unexpected status code: %s", resp.Status) |
||||
} |
||||
parsedURL, err := url.Parse(resp.Header.Get("Location")) |
||||
return parsedURL, newResponse(resp), nil |
||||
} |
||||
|
||||
func (s *ActionsService) getDownloadArtifactFromURL(ctx context.Context, u string, followRedirects bool) (*http.Response, error) { |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
var resp *http.Response |
||||
// Use http.DefaultTransport if no custom Transport is configured
|
||||
req = withContext(ctx, req) |
||||
if s.client.client.Transport == nil { |
||||
resp, err = http.DefaultTransport.RoundTrip(req) |
||||
} else { |
||||
resp, err = s.client.client.Transport.RoundTrip(req) |
||||
} |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
resp.Body.Close() |
||||
|
||||
// If redirect response is returned, follow it
|
||||
if followRedirects && resp.StatusCode == http.StatusMovedPermanently { |
||||
u = resp.Header.Get("Location") |
||||
resp, err = s.getDownloadArtifactFromURL(ctx, u, false) |
||||
} |
||||
return resp, err |
||||
} |
||||
|
||||
// DeleteArtifact deletes a workflow run artifact.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/artifacts/#delete-an-artifact
|
||||
func (s *ActionsService) DeleteArtifact(ctx context.Context, owner, repo string, artifactID int64) (*Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/artifacts/%v", owner, repo, artifactID) |
||||
|
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
@ -0,0 +1,277 @@ |
||||
// Copyright 2020 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" |
||||
) |
||||
|
||||
// RunnerApplicationDownload represents a binary for the self-hosted runner application that can be downloaded.
|
||||
type RunnerApplicationDownload struct { |
||||
OS *string `json:"os,omitempty"` |
||||
Architecture *string `json:"architecture,omitempty"` |
||||
DownloadURL *string `json:"download_url,omitempty"` |
||||
Filename *string `json:"filename,omitempty"` |
||||
} |
||||
|
||||
// ListRunnerApplicationDownloads lists self-hosted runner application binaries that can be downloaded and run.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#list-runner-applications-for-a-repository
|
||||
func (s *ActionsService) ListRunnerApplicationDownloads(ctx context.Context, owner, repo string) ([]*RunnerApplicationDownload, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/runners/downloads", owner, repo) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
var rads []*RunnerApplicationDownload |
||||
resp, err := s.client.Do(ctx, req, &rads) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return rads, resp, nil |
||||
} |
||||
|
||||
// RegistrationToken represents a token that can be used to add a self-hosted runner to a repository.
|
||||
type RegistrationToken struct { |
||||
Token *string `json:"token,omitempty"` |
||||
ExpiresAt *Timestamp `json:"expires_at,omitempty"` |
||||
} |
||||
|
||||
// CreateRegistrationToken creates a token that can be used to add a self-hosted runner.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#create-a-registration-token-for-a-repository
|
||||
func (s *ActionsService) CreateRegistrationToken(ctx context.Context, owner, repo string) (*RegistrationToken, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/runners/registration-token", owner, repo) |
||||
|
||||
req, err := s.client.NewRequest("POST", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
registrationToken := new(RegistrationToken) |
||||
resp, err := s.client.Do(ctx, req, registrationToken) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return registrationToken, resp, nil |
||||
} |
||||
|
||||
// Runner represents a self-hosted runner registered with a repository.
|
||||
type Runner struct { |
||||
ID *int64 `json:"id,omitempty"` |
||||
Name *string `json:"name,omitempty"` |
||||
OS *string `json:"os,omitempty"` |
||||
Status *string `json:"status,omitempty"` |
||||
} |
||||
|
||||
// Runners represents a collection of self-hosted runners for a repository.
|
||||
type Runners struct { |
||||
TotalCount int `json:"total_count"` |
||||
Runners []*Runner `json:"runners"` |
||||
} |
||||
|
||||
// ListRunners lists all the self-hosted runners for a repository.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#list-self-hosted-runners-for-a-repository
|
||||
func (s *ActionsService) ListRunners(ctx context.Context, owner, repo string, opts *ListOptions) (*Runners, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/runners", owner, repo) |
||||
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 |
||||
} |
||||
|
||||
runners := &Runners{} |
||||
resp, err := s.client.Do(ctx, req, &runners) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return runners, resp, nil |
||||
} |
||||
|
||||
// GetRunner gets a specific self-hosted runner for a repository using its runner ID.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#get-a-self-hosted-runner-for-a-repository
|
||||
func (s *ActionsService) GetRunner(ctx context.Context, owner, repo string, runnerID int64) (*Runner, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/runners/%v", owner, repo, runnerID) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
runner := new(Runner) |
||||
resp, err := s.client.Do(ctx, req, runner) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return runner, resp, nil |
||||
} |
||||
|
||||
// RemoveToken represents a token that can be used to remove a self-hosted runner from a repository.
|
||||
type RemoveToken struct { |
||||
Token *string `json:"token,omitempty"` |
||||
ExpiresAt *Timestamp `json:"expires_at,omitempty"` |
||||
} |
||||
|
||||
// CreateRemoveToken creates a token that can be used to remove a self-hosted runner from a repository.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#create-a-remove-token-for-a-repository
|
||||
func (s *ActionsService) CreateRemoveToken(ctx context.Context, owner, repo string) (*RemoveToken, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/runners/remove-token", owner, repo) |
||||
|
||||
req, err := s.client.NewRequest("POST", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
removeToken := new(RemoveToken) |
||||
resp, err := s.client.Do(ctx, req, removeToken) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return removeToken, resp, nil |
||||
} |
||||
|
||||
// RemoveRunner forces the removal of a self-hosted runner in a repository using the runner id.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#delete-a-self-hosted-runner-from-a-repository
|
||||
func (s *ActionsService) RemoveRunner(ctx context.Context, owner, repo string, runnerID int64) (*Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/runners/%v", owner, repo, runnerID) |
||||
|
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// ListOrganizationRunnerApplicationDownloads lists self-hosted runner application binaries that can be downloaded and run.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#list-runner-applications-for-an-organization
|
||||
func (s *ActionsService) ListOrganizationRunnerApplicationDownloads(ctx context.Context, owner string) ([]*RunnerApplicationDownload, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/actions/runners/downloads", owner) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
var rads []*RunnerApplicationDownload |
||||
resp, err := s.client.Do(ctx, req, &rads) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return rads, resp, nil |
||||
} |
||||
|
||||
// CreateOrganizationRegistrationToken creates a token that can be used to add a self-hosted runner to an organization.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#create-a-registration-token-for-an-organization
|
||||
func (s *ActionsService) CreateOrganizationRegistrationToken(ctx context.Context, owner string) (*RegistrationToken, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/actions/runners/registration-token", owner) |
||||
|
||||
req, err := s.client.NewRequest("POST", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
registrationToken := new(RegistrationToken) |
||||
resp, err := s.client.Do(ctx, req, registrationToken) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return registrationToken, resp, nil |
||||
} |
||||
|
||||
// ListOrganizationRunners lists all the self-hosted runners for an organization.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#list-self-hosted-runners-for-an-organization
|
||||
func (s *ActionsService) ListOrganizationRunners(ctx context.Context, owner string, opts *ListOptions) (*Runners, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/actions/runners", owner) |
||||
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 |
||||
} |
||||
|
||||
runners := &Runners{} |
||||
resp, err := s.client.Do(ctx, req, &runners) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return runners, resp, nil |
||||
} |
||||
|
||||
// GetOrganizationRunner gets a specific self-hosted runner for an organization using its runner ID.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#get-a-self-hosted-runner-for-an-organization
|
||||
func (s *ActionsService) GetOrganizationRunner(ctx context.Context, owner string, runnerID int64) (*Runner, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/actions/runners/%v", owner, runnerID) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
runner := new(Runner) |
||||
resp, err := s.client.Do(ctx, req, runner) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return runner, resp, nil |
||||
} |
||||
|
||||
// CreateOrganizationRemoveToken creates a token that can be used to remove a self-hosted runner from an organization.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#create-a-remove-token-for-an-organization
|
||||
func (s *ActionsService) CreateOrganizationRemoveToken(ctx context.Context, owner string) (*RemoveToken, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/actions/runners/remove-token", owner) |
||||
|
||||
req, err := s.client.NewRequest("POST", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
removeToken := new(RemoveToken) |
||||
resp, err := s.client.Do(ctx, req, removeToken) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return removeToken, resp, nil |
||||
} |
||||
|
||||
// RemoveOrganizationRunner forces the removal of a self-hosted runner from an organization using the runner id.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/self-hosted-runners/#delete-a-self-hosted-runner-from-an-organization
|
||||
func (s *ActionsService) RemoveOrganizationRunner(ctx context.Context, owner string, runnerID int64) (*Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/actions/runners/%v", owner, runnerID) |
||||
|
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
@ -0,0 +1,299 @@ |
||||
// Copyright 2020 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" |
||||
) |
||||
|
||||
// PublicKey represents the public key that should be used to encrypt secrets.
|
||||
type PublicKey struct { |
||||
KeyID *string `json:"key_id"` |
||||
Key *string `json:"key"` |
||||
} |
||||
|
||||
// GetRepoPublicKey gets a public key that should be used for secret encryption.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/secrets/#get-a-repository-public-key
|
||||
func (s *ActionsService) GetRepoPublicKey(ctx context.Context, owner, repo string) (*PublicKey, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/secrets/public-key", owner, repo) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
pubKey := new(PublicKey) |
||||
resp, err := s.client.Do(ctx, req, pubKey) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return pubKey, resp, nil |
||||
} |
||||
|
||||
// GetOrgPublicKey gets a public key that should be used for secret encryption.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/secrets/#get-an-organization-public-key
|
||||
func (s *ActionsService) GetOrgPublicKey(ctx context.Context, org string) (*PublicKey, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/actions/secrets/public-key", org) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
pubKey := new(PublicKey) |
||||
resp, err := s.client.Do(ctx, req, pubKey) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return pubKey, resp, nil |
||||
} |
||||
|
||||
// Secret represents a repository action secret.
|
||||
type Secret struct { |
||||
Name string `json:"name"` |
||||
CreatedAt Timestamp `json:"created_at"` |
||||
UpdatedAt Timestamp `json:"updated_at"` |
||||
Visibility string `json:"visibility,omitempty"` |
||||
SelectedRepositoriesURL string `json:"selected_repositories_url,omitempty"` |
||||
} |
||||
|
||||
// Secrets represents one item from the ListSecrets response.
|
||||
type Secrets struct { |
||||
TotalCount int `json:"total_count"` |
||||
Secrets []*Secret `json:"secrets"` |
||||
} |
||||
|
||||
// ListRepoSecrets lists all secrets available in a repository
|
||||
// without revealing their encrypted values.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/secrets/#list-repository-secrets
|
||||
func (s *ActionsService) ListRepoSecrets(ctx context.Context, owner, repo string, opts *ListOptions) (*Secrets, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/secrets", owner, repo) |
||||
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 |
||||
} |
||||
|
||||
secrets := new(Secrets) |
||||
resp, err := s.client.Do(ctx, req, &secrets) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return secrets, resp, nil |
||||
} |
||||
|
||||
// GetRepoSecret gets a single repository secret without revealing its encrypted value.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/secrets/#get-a-repository-secret
|
||||
func (s *ActionsService) GetRepoSecret(ctx context.Context, owner, repo, name string) (*Secret, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
secret := new(Secret) |
||||
resp, err := s.client.Do(ctx, req, secret) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return secret, resp, nil |
||||
} |
||||
|
||||
// SelectedRepoIDs are the repository IDs that have access to the secret.
|
||||
type SelectedRepoIDs []int64 |
||||
|
||||
// EncryptedSecret represents a secret that is encrypted using a public key.
|
||||
//
|
||||
// The value of EncryptedValue must be your secret, encrypted with
|
||||
// LibSodium (see documentation here: https://libsodium.gitbook.io/doc/bindings_for_other_languages)
|
||||
// using the public key retrieved using the GetPublicKey method.
|
||||
type EncryptedSecret struct { |
||||
Name string `json:"-"` |
||||
KeyID string `json:"key_id"` |
||||
EncryptedValue string `json:"encrypted_value"` |
||||
Visibility string `json:"visibility,omitempty"` |
||||
SelectedRepositoryIDs SelectedRepoIDs `json:"selected_repository_ids,omitempty"` |
||||
} |
||||
|
||||
// CreateOrUpdateRepoSecret creates or updates a repository secret with an encrypted value.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/secrets/#create-or-update-a-repository-secret
|
||||
func (s *ActionsService) CreateOrUpdateRepoSecret(ctx context.Context, owner, repo string, eSecret *EncryptedSecret) (*Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, eSecret.Name) |
||||
|
||||
req, err := s.client.NewRequest("PUT", u, eSecret) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// DeleteRepoSecret deletes a secret in a repository using the secret name.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/secrets/#delete-a-repository-secret
|
||||
func (s *ActionsService) DeleteRepoSecret(ctx context.Context, owner, repo, name string) (*Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/secrets/%v", owner, repo, name) |
||||
|
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// ListOrgSecrets lists all secrets available in an organization
|
||||
// without revealing their encrypted values.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/secrets/#list-organization-secrets
|
||||
func (s *ActionsService) ListOrgSecrets(ctx context.Context, org string, opts *ListOptions) (*Secrets, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/actions/secrets", org) |
||||
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 |
||||
} |
||||
|
||||
secrets := new(Secrets) |
||||
resp, err := s.client.Do(ctx, req, &secrets) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return secrets, resp, nil |
||||
} |
||||
|
||||
// GetOrgSecret gets a single organization secret without revealing its encrypted value.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/secrets/#get-an-organization-secret
|
||||
func (s *ActionsService) GetOrgSecret(ctx context.Context, org, name string) (*Secret, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
secret := new(Secret) |
||||
resp, err := s.client.Do(ctx, req, secret) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return secret, resp, nil |
||||
} |
||||
|
||||
// CreateOrUpdateOrgSecret creates or updates an organization secret with an encrypted value.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/secrets/#create-or-update-an-organization-secret
|
||||
func (s *ActionsService) CreateOrUpdateOrgSecret(ctx context.Context, org string, eSecret *EncryptedSecret) (*Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, eSecret.Name) |
||||
|
||||
req, err := s.client.NewRequest("PUT", u, eSecret) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// SelectedReposList represents the list of repositories selected for an organization secret.
|
||||
type SelectedReposList struct { |
||||
TotalCount *int `json:"total_count,omitempty"` |
||||
Repositories []*Repository `json:"repositories,omitempty"` |
||||
} |
||||
|
||||
// ListSelectedReposForOrgSecret lists all repositories that have access to a secret.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/secrets/#list-selected-repositories-for-an-organization-secret
|
||||
func (s *ActionsService) ListSelectedReposForOrgSecret(ctx context.Context, org, name string) (*SelectedReposList, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
result := new(SelectedReposList) |
||||
resp, err := s.client.Do(ctx, req, result) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return result, resp, nil |
||||
} |
||||
|
||||
// SetSelectedReposForOrgSecret sets the repositories that have access to a secret.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/secrets/#set-selected-repositories-for-an-organization-secret
|
||||
func (s *ActionsService) SetSelectedReposForOrgSecret(ctx context.Context, org, name string, ids SelectedRepoIDs) (*Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories", org, name) |
||||
|
||||
type repoIDs struct { |
||||
SelectedIDs SelectedRepoIDs `json:"selected_repository_ids,omitempty"` |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("PUT", u, repoIDs{SelectedIDs: ids}) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// AddSelectedRepoToOrgSecret adds a repository to an organization secret.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/secrets/#add-selected-repository-to-an-organization-secret
|
||||
func (s *ActionsService) AddSelectedRepoToOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) |
||||
req, err := s.client.NewRequest("PUT", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// RemoveSelectedRepoFromOrgSecret removes a repository from an organization secret.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/secrets/#remove-selected-repository-from-an-organization-secret
|
||||
func (s *ActionsService) RemoveSelectedRepoFromOrgSecret(ctx context.Context, org, name string, repo *Repository) (*Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/actions/secrets/%v/repositories/%v", org, name, *repo.ID) |
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// DeleteOrgSecret deletes a secret in an organization using the secret name.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/secrets/#delete-an-organization-secret
|
||||
func (s *ActionsService) DeleteOrgSecret(ctx context.Context, org, name string) (*Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/actions/secrets/%v", org, name) |
||||
|
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
@ -0,0 +1,149 @@ |
||||
// Copyright 2020 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" |
||||
"net/url" |
||||
) |
||||
|
||||
// TaskStep represents a single task step from a sequence of tasks of a job.
|
||||
type TaskStep struct { |
||||
Name *string `json:"name,omitempty"` |
||||
Status *string `json:"status,omitempty"` |
||||
Conclusion *string `json:"conclusion,omitempty"` |
||||
Number *int64 `json:"number,omitempty"` |
||||
StartedAt *Timestamp `json:"started_at,omitempty"` |
||||
CompletedAt *Timestamp `json:"completed_at,omitempty"` |
||||
} |
||||
|
||||
// WorkflowJob represents a repository action workflow job.
|
||||
type WorkflowJob struct { |
||||
ID *int64 `json:"id,omitempty"` |
||||
RunID *int64 `json:"run_id,omitempty"` |
||||
RunURL *string `json:"run_url,omitempty"` |
||||
NodeID *string `json:"node_id,omitempty"` |
||||
HeadSHA *string `json:"head_sha,omitempty"` |
||||
URL *string `json:"url,omitempty"` |
||||
HTMLURL *string `json:"html_url,omitempty"` |
||||
Status *string `json:"status,omitempty"` |
||||
Conclusion *string `json:"conclusion,omitempty"` |
||||
StartedAt *Timestamp `json:"started_at,omitempty"` |
||||
CompletedAt *Timestamp `json:"completed_at,omitempty"` |
||||
Name *string `json:"name,omitempty"` |
||||
Steps []*TaskStep `json:"steps,omitempty"` |
||||
CheckRunURL *string `json:"check_run_url,omitempty"` |
||||
} |
||||
|
||||
// Jobs represents a slice of repository action workflow job.
|
||||
type Jobs struct { |
||||
TotalCount *int `json:"total_count,omitempty"` |
||||
Jobs []*WorkflowJob `json:"jobs,omitempty"` |
||||
} |
||||
|
||||
// ListWorkflowJobsOptions specifies optional parameters to ListWorkflowJobs.
|
||||
type ListWorkflowJobsOptions struct { |
||||
// Filter specifies how jobs should be filtered by their completed_at timestamp.
|
||||
// Possible values are:
|
||||
// latest - Returns jobs from the most recent execution of the workflow run
|
||||
// all - Returns all jobs for a workflow run, including from old executions of the workflow run
|
||||
//
|
||||
// Default value is "latest".
|
||||
Filter string `url:"filter,omitempty"` |
||||
ListOptions |
||||
} |
||||
|
||||
// ListWorkflowJobs lists all jobs for a workflow run.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/workflow-jobs/#list-jobs-for-a-workflow-run
|
||||
func (s *ActionsService) ListWorkflowJobs(ctx context.Context, owner, repo string, runID int64, opts *ListWorkflowJobsOptions) (*Jobs, *Response, error) { |
||||
u := fmt.Sprintf("repos/%s/%s/actions/runs/%v/jobs", owner, repo, runID) |
||||
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 |
||||
} |
||||
|
||||
jobs := new(Jobs) |
||||
resp, err := s.client.Do(ctx, req, &jobs) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return jobs, resp, nil |
||||
} |
||||
|
||||
// GetWorkflowJobByID gets a specific job in a workflow run by ID.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/workflow-jobs/#get-a-job-for-a-workflow-run
|
||||
func (s *ActionsService) GetWorkflowJobByID(ctx context.Context, owner, repo string, jobID int64) (*WorkflowJob, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/jobs/%v", owner, repo, jobID) |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
job := new(WorkflowJob) |
||||
resp, err := s.client.Do(ctx, req, job) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return job, resp, nil |
||||
} |
||||
|
||||
// GetWorkflowJobLogs gets a redirect URL to download a plain text file of logs for a workflow job.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/workflow-jobs/#download-job-logs-for-a-workflow-run
|
||||
func (s *ActionsService) GetWorkflowJobLogs(ctx context.Context, owner, repo string, jobID int64, followRedirects bool) (*url.URL, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/jobs/%v/logs", owner, repo, jobID) |
||||
|
||||
resp, err := s.getWorkflowLogsFromURL(ctx, u, followRedirects) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
if resp.StatusCode != http.StatusFound { |
||||
return nil, newResponse(resp), fmt.Errorf("unexpected status code: %s", resp.Status) |
||||
} |
||||
parsedURL, err := url.Parse(resp.Header.Get("Location")) |
||||
return parsedURL, newResponse(resp), err |
||||
} |
||||
|
||||
func (s *ActionsService) getWorkflowLogsFromURL(ctx context.Context, u string, followRedirects bool) (*http.Response, error) { |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
var resp *http.Response |
||||
// Use http.DefaultTransport if no custom Transport is configured
|
||||
req = withContext(ctx, req) |
||||
if s.client.client.Transport == nil { |
||||
resp, err = http.DefaultTransport.RoundTrip(req) |
||||
} else { |
||||
resp, err = s.client.client.Transport.RoundTrip(req) |
||||
} |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
resp.Body.Close() |
||||
|
||||
// If redirect response is returned, follow it
|
||||
if followRedirects && resp.StatusCode == http.StatusMovedPermanently { |
||||
u = resp.Header.Get("Location") |
||||
resp, err = s.getWorkflowLogsFromURL(ctx, u, false) |
||||
} |
||||
return resp, err |
||||
|
||||
} |
@ -0,0 +1,235 @@ |
||||
// Copyright 2020 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" |
||||
"net/url" |
||||
) |
||||
|
||||
// WorkflowRun represents a repository action workflow run.
|
||||
type WorkflowRun struct { |
||||
ID *int64 `json:"id,omitempty"` |
||||
NodeID *string `json:"node_id,omitempty"` |
||||
HeadBranch *string `json:"head_branch,omitempty"` |
||||
HeadSHA *string `json:"head_sha,omitempty"` |
||||
RunNumber *int `json:"run_number,omitempty"` |
||||
Event *string `json:"event,omitempty"` |
||||
Status *string `json:"status,omitempty"` |
||||
Conclusion *string `json:"conclusion,omitempty"` |
||||
WorkflowID *int64 `json:"workflow_id,omitempty"` |
||||
URL *string `json:"url,omitempty"` |
||||
HTMLURL *string `json:"html_url,omitempty"` |
||||
PullRequests []*PullRequest `json:"pull_requests,omitempty"` |
||||
CreatedAt *Timestamp `json:"created_at,omitempty"` |
||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"` |
||||
JobsURL *string `json:"jobs_url,omitempty"` |
||||
LogsURL *string `json:"logs_url,omitempty"` |
||||
CheckSuiteURL *string `json:"check_suite_url,omitempty"` |
||||
ArtifactsURL *string `json:"artifacts_url,omitempty"` |
||||
CancelURL *string `json:"cancel_url,omitempty"` |
||||
RerunURL *string `json:"rerun_url,omitempty"` |
||||
HeadCommit *HeadCommit `json:"head_commit,omitempty"` |
||||
WorkflowURL *string `json:"workflow_url,omitempty"` |
||||
Repository *Repository `json:"repository,omitempty"` |
||||
HeadRepository *Repository `json:"head_repository,omitempty"` |
||||
} |
||||
|
||||
// WorkflowRuns represents a slice of repository action workflow run.
|
||||
type WorkflowRuns struct { |
||||
TotalCount *int `json:"total_count,omitempty"` |
||||
WorkflowRuns []*WorkflowRun `json:"workflow_runs,omitempty"` |
||||
} |
||||
|
||||
// ListWorkflowRunsOptions specifies optional parameters to ListWorkflowRuns.
|
||||
type ListWorkflowRunsOptions struct { |
||||
Actor string `url:"actor,omitempty"` |
||||
Branch string `url:"branch,omitempty"` |
||||
Event string `url:"event,omitempty"` |
||||
Status string `url:"status,omitempty"` |
||||
ListOptions |
||||
} |
||||
|
||||
// WorkflowRunUsage represents a usage of a specific workflow run.
|
||||
type WorkflowRunUsage struct { |
||||
Billable *WorkflowRunEnvironment `json:"billable,omitempty"` |
||||
RunDurationMS *int64 `json:"run_duration_ms,omitempty"` |
||||
} |
||||
|
||||
// WorkflowRunEnvironment represents different runner environments available for a workflow run.
|
||||
type WorkflowRunEnvironment struct { |
||||
Ubuntu *WorkflowRunBill `json:"UBUNTU,omitempty"` |
||||
MacOS *WorkflowRunBill `json:"MACOS,omitempty"` |
||||
Windows *WorkflowRunBill `json:"WINDOWS,omitempty"` |
||||
} |
||||
|
||||
// WorkflowRunBill specifies billable time for a specific environment in a workflow run.
|
||||
type WorkflowRunBill struct { |
||||
TotalMS *int64 `json:"total_ms,omitempty"` |
||||
Jobs *int `json:"jobs,omitempty"` |
||||
} |
||||
|
||||
func (s *ActionsService) listWorkflowRuns(ctx context.Context, endpoint string, opts *ListWorkflowRunsOptions) (*WorkflowRuns, *Response, error) { |
||||
u, err := addOptions(endpoint, opts) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
runs := new(WorkflowRuns) |
||||
resp, err := s.client.Do(ctx, req, &runs) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return runs, resp, nil |
||||
} |
||||
|
||||
// ListWorkflowRunsByID lists all workflow runs by workflow ID.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/workflow-runs/#list-workflow-runs
|
||||
func (s *ActionsService) ListWorkflowRunsByID(ctx context.Context, owner, repo string, workflowID int64, opts *ListWorkflowRunsOptions) (*WorkflowRuns, *Response, error) { |
||||
u := fmt.Sprintf("repos/%s/%s/actions/workflows/%v/runs", owner, repo, workflowID) |
||||
return s.listWorkflowRuns(ctx, u, opts) |
||||
} |
||||
|
||||
// ListWorkflowRunsByFileName lists all workflow runs by workflow file name.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/workflow-runs/#list-workflow-runs
|
||||
func (s *ActionsService) ListWorkflowRunsByFileName(ctx context.Context, owner, repo, workflowFileName string, opts *ListWorkflowRunsOptions) (*WorkflowRuns, *Response, error) { |
||||
u := fmt.Sprintf("repos/%s/%s/actions/workflows/%v/runs", owner, repo, workflowFileName) |
||||
return s.listWorkflowRuns(ctx, u, opts) |
||||
} |
||||
|
||||
// ListRepositoryWorkflowRuns lists all workflow runs for a repository.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/workflow-runs/#list-workflow-runs-for-a-repository
|
||||
func (s *ActionsService) ListRepositoryWorkflowRuns(ctx context.Context, owner, repo string, opts *ListWorkflowRunsOptions) (*WorkflowRuns, *Response, error) { |
||||
u := fmt.Sprintf("repos/%s/%s/actions/runs", owner, repo) |
||||
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 |
||||
} |
||||
|
||||
runs := new(WorkflowRuns) |
||||
resp, err := s.client.Do(ctx, req, &runs) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return runs, resp, nil |
||||
} |
||||
|
||||
// GetWorkflowRunByID gets a specific workflow run by ID.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/workflow-runs/#get-a-workflow-run
|
||||
func (s *ActionsService) GetWorkflowRunByID(ctx context.Context, owner, repo string, runID int64) (*WorkflowRun, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/runs/%v", owner, repo, runID) |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
run := new(WorkflowRun) |
||||
resp, err := s.client.Do(ctx, req, run) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return run, resp, nil |
||||
} |
||||
|
||||
// RerunWorkflow re-runs a workflow by ID.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/workflow-runs/#re-run-a-workflow
|
||||
func (s *ActionsService) RerunWorkflowByID(ctx context.Context, owner, repo string, runID int64) (*Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/rerun", owner, repo, runID) |
||||
|
||||
req, err := s.client.NewRequest("POST", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// CancelWorkflowRunByID cancels a workflow run by ID.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/workflow-runs/#cancel-a-workflow-run
|
||||
func (s *ActionsService) CancelWorkflowRunByID(ctx context.Context, owner, repo string, runID int64) (*Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/cancel", owner, repo, runID) |
||||
|
||||
req, err := s.client.NewRequest("POST", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// GetWorkflowRunLogs gets a redirect URL to download a plain text file of logs for a workflow run.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/workflow-runs/#download-workflow-run-logs
|
||||
func (s *ActionsService) GetWorkflowRunLogs(ctx context.Context, owner, repo string, runID int64, followRedirects bool) (*url.URL, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/logs", owner, repo, runID) |
||||
|
||||
resp, err := s.getWorkflowLogsFromURL(ctx, u, followRedirects) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
if resp.StatusCode != http.StatusFound { |
||||
return nil, newResponse(resp), fmt.Errorf("unexpected status code: %s", resp.Status) |
||||
} |
||||
parsedURL, err := url.Parse(resp.Header.Get("Location")) |
||||
return parsedURL, newResponse(resp), err |
||||
} |
||||
|
||||
// DeleteWorkflowRunLogs deletes all logs for a workflow run.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/workflow-runs/#delete-workflow-run-logs
|
||||
func (s *ActionsService) DeleteWorkflowRunLogs(ctx context.Context, owner, repo string, runID int64) (*Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/logs", owner, repo, runID) |
||||
|
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// GetWorkflowRunUsageByID gets a specific workflow usage run by run ID in the unit of billable milliseconds.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/workflow-runs/#get-workflow-run-usage
|
||||
func (s *ActionsService) GetWorkflowRunUsageByID(ctx context.Context, owner, repo string, runID int64) (*WorkflowRunUsage, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/runs/%v/timing", owner, repo, runID) |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
workflowRunUsage := new(WorkflowRunUsage) |
||||
resp, err := s.client.Do(ctx, req, workflowRunUsage) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return workflowRunUsage, resp, nil |
||||
} |
@ -0,0 +1,138 @@ |
||||
// Copyright 2020 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" |
||||
) |
||||
|
||||
// Workflow represents a repository action workflow.
|
||||
type Workflow struct { |
||||
ID *int64 `json:"id,omitempty"` |
||||
NodeID *string `json:"node_id,omitempty"` |
||||
Name *string `json:"name,omitempty"` |
||||
Path *string `json:"path,omitempty"` |
||||
State *string `json:"state,omitempty"` |
||||
CreatedAt *Timestamp `json:"created_at,omitempty"` |
||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"` |
||||
URL *string `json:"url,omitempty"` |
||||
HTMLURL *string `json:"html_url,omitempty"` |
||||
BadgeURL *string `json:"badge_url,omitempty"` |
||||
} |
||||
|
||||
// Workflows represents a slice of repository action workflows.
|
||||
type Workflows struct { |
||||
TotalCount *int `json:"total_count,omitempty"` |
||||
Workflows []*Workflow `json:"workflows,omitempty"` |
||||
} |
||||
|
||||
// WorkflowUsage represents a usage of a specific workflow.
|
||||
type WorkflowUsage struct { |
||||
Billable *WorkflowEnvironment `json:"billable,omitempty"` |
||||
} |
||||
|
||||
// WorkflowEnvironment represents different runner environments available for a workflow.
|
||||
type WorkflowEnvironment struct { |
||||
Ubuntu *WorkflowBill `json:"UBUNTU,omitempty"` |
||||
MacOS *WorkflowBill `json:"MACOS,omitempty"` |
||||
Windows *WorkflowBill `json:"WINDOWS,omitempty"` |
||||
} |
||||
|
||||
// WorkflowBill specifies billable time for a specific environment in a workflow.
|
||||
type WorkflowBill struct { |
||||
TotalMS *int64 `json:"total_ms,omitempty"` |
||||
} |
||||
|
||||
// ListWorkflows lists all workflows in a repository.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/workflows/#list-repository-workflows
|
||||
func (s *ActionsService) ListWorkflows(ctx context.Context, owner, repo string, opts *ListOptions) (*Workflows, *Response, error) { |
||||
u := fmt.Sprintf("repos/%s/%s/actions/workflows", owner, repo) |
||||
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 |
||||
} |
||||
|
||||
workflows := new(Workflows) |
||||
resp, err := s.client.Do(ctx, req, &workflows) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return workflows, resp, nil |
||||
} |
||||
|
||||
// GetWorkflowByID gets a specific workflow by ID.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/workflows/#get-a-workflow
|
||||
func (s *ActionsService) GetWorkflowByID(ctx context.Context, owner, repo string, workflowID int64) (*Workflow, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/workflows/%v", owner, repo, workflowID) |
||||
|
||||
return s.getWorkflow(ctx, u) |
||||
} |
||||
|
||||
// GetWorkflowByFileName gets a specific workflow by file name.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/workflows/#get-a-workflow
|
||||
func (s *ActionsService) GetWorkflowByFileName(ctx context.Context, owner, repo, workflowFileName string) (*Workflow, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/workflows/%v", owner, repo, workflowFileName) |
||||
|
||||
return s.getWorkflow(ctx, u) |
||||
} |
||||
|
||||
func (s *ActionsService) getWorkflow(ctx context.Context, url string) (*Workflow, *Response, error) { |
||||
req, err := s.client.NewRequest("GET", url, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
workflow := new(Workflow) |
||||
resp, err := s.client.Do(ctx, req, workflow) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return workflow, resp, nil |
||||
} |
||||
|
||||
// GetWorkflowUsageByID gets a specific workflow usage by ID in the unit of billable milliseconds.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/workflows/#get-workflow-usage
|
||||
func (s *ActionsService) GetWorkflowUsageByID(ctx context.Context, owner, repo string, workflowID int64) (*WorkflowUsage, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/workflows/%v/timing", owner, repo, workflowID) |
||||
|
||||
return s.getWorkflowUsage(ctx, u) |
||||
} |
||||
|
||||
// GetWorkflowUsageByFileName gets a specific workflow usage by file name in the unit of billable milliseconds.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/actions/workflows/#get-workflow-usage
|
||||
func (s *ActionsService) GetWorkflowUsageByFileName(ctx context.Context, owner, repo, workflowFileName string) (*WorkflowUsage, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/actions/workflows/%v/timing", owner, repo, workflowFileName) |
||||
|
||||
return s.getWorkflowUsage(ctx, u) |
||||
} |
||||
|
||||
func (s *ActionsService) getWorkflowUsage(ctx context.Context, url string) (*WorkflowUsage, *Response, error) { |
||||
req, err := s.client.NewRequest("GET", url, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
workflowUsage := new(WorkflowUsage) |
||||
resp, err := s.client.Do(ctx, req, workflowUsage) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return workflowUsage, resp, nil |
||||
} |
@ -0,0 +1,89 @@ |
||||
// Copyright 2019 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" |
||||
) |
||||
|
||||
// createOrgRequest is a subset of Organization and is used internally
|
||||
// by CreateOrg to pass only the known fields for the endpoint.
|
||||
type createOrgRequest struct { |
||||
Login *string `json:"login,omitempty"` |
||||
Admin *string `json:"admin,omitempty"` |
||||
} |
||||
|
||||
// CreateOrg creates a new organization in GitHub Enterprise.
|
||||
//
|
||||
// Note that only a subset of the org fields are used and org must
|
||||
// not be nil.
|
||||
//
|
||||
// GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/orgs/#create-an-organization
|
||||
func (s *AdminService) CreateOrg(ctx context.Context, org *Organization, admin string) (*Organization, *Response, error) { |
||||
u := "admin/organizations" |
||||
|
||||
orgReq := &createOrgRequest{ |
||||
Login: org.Login, |
||||
Admin: &admin, |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("POST", u, orgReq) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
o := new(Organization) |
||||
resp, err := s.client.Do(ctx, req, o) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return o, resp, nil |
||||
} |
||||
|
||||
// renameOrgRequest is a subset of Organization and is used internally
|
||||
// by RenameOrg and RenameOrgByName to pass only the known fields for the endpoint.
|
||||
type renameOrgRequest struct { |
||||
Login *string `json:"login,omitempty"` |
||||
} |
||||
|
||||
// RenameOrgResponse is the response given when renaming an Organization.
|
||||
type RenameOrgResponse struct { |
||||
Message *string `json:"message,omitempty"` |
||||
URL *string `json:"url,omitempty"` |
||||
} |
||||
|
||||
// RenameOrg renames an organization in GitHub Enterprise.
|
||||
//
|
||||
// GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/orgs/#rename-an-organization
|
||||
func (s *AdminService) RenameOrg(ctx context.Context, org *Organization, newName string) (*RenameOrgResponse, *Response, error) { |
||||
return s.RenameOrgByName(ctx, *org.Login, newName) |
||||
} |
||||
|
||||
// RenameOrgByName renames an organization in GitHub Enterprise using its current name.
|
||||
//
|
||||
// GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/orgs/#rename-an-organization
|
||||
func (s *AdminService) RenameOrgByName(ctx context.Context, org, newName string) (*RenameOrgResponse, *Response, error) { |
||||
u := fmt.Sprintf("admin/organizations/%v", org) |
||||
|
||||
orgReq := &renameOrgRequest{ |
||||
Login: &newName, |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("PATCH", u, orgReq) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
o := new(RenameOrgResponse) |
||||
resp, err := s.client.Do(ctx, req, o) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return o, resp, nil |
||||
} |
@ -0,0 +1,133 @@ |
||||
// Copyright 2019 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" |
||||
) |
||||
|
||||
// createUserRequest is a subset of User and is used internally
|
||||
// by CreateUser to pass only the known fields for the endpoint.
|
||||
type createUserRequest struct { |
||||
Login *string `json:"login,omitempty"` |
||||
Email *string `json:"email,omitempty"` |
||||
} |
||||
|
||||
// CreateUser creates a new user in GitHub Enterprise.
|
||||
//
|
||||
// GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/users/#create-a-new-user
|
||||
func (s *AdminService) CreateUser(ctx context.Context, login, email string) (*User, *Response, error) { |
||||
u := "admin/users" |
||||
|
||||
userReq := &createUserRequest{ |
||||
Login: &login, |
||||
Email: &email, |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("POST", u, userReq) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
var user User |
||||
resp, err := s.client.Do(ctx, req, &user) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return &user, resp, nil |
||||
} |
||||
|
||||
// DeleteUser deletes a user in GitHub Enterprise.
|
||||
//
|
||||
// GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/users/#delete-a-user
|
||||
func (s *AdminService) DeleteUser(ctx context.Context, username string) (*Response, error) { |
||||
u := "admin/users/" + username |
||||
|
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
resp, err := s.client.Do(ctx, req, nil) |
||||
if err != nil { |
||||
return resp, err |
||||
} |
||||
|
||||
return resp, nil |
||||
} |
||||
|
||||
// ImpersonateUserOptions represents the scoping for the OAuth token.
|
||||
type ImpersonateUserOptions struct { |
||||
Scopes []string `json:"scopes,omitempty"` |
||||
} |
||||
|
||||
// OAuthAPP represents the GitHub Site Administrator OAuth app.
|
||||
type OAuthAPP struct { |
||||
URL *string `json:"url,omitempty"` |
||||
Name *string `json:"name,omitempty"` |
||||
ClientID *string `json:"client_id,omitempty"` |
||||
} |
||||
|
||||
func (s OAuthAPP) String() string { |
||||
return Stringify(s) |
||||
} |
||||
|
||||
// UserAuthorization represents the impersonation response.
|
||||
type UserAuthorization struct { |
||||
ID *int64 `json:"id,omitempty"` |
||||
URL *string `json:"url,omitempty"` |
||||
Scopes []string `json:"scopes,omitempty"` |
||||
Token *string `json:"token,omitempty"` |
||||
TokenLastEight *string `json:"token_last_eight,omitempty"` |
||||
HashedToken *string `json:"hashed_token,omitempty"` |
||||
App *OAuthAPP `json:"app,omitempty"` |
||||
Note *string `json:"note,omitempty"` |
||||
NoteURL *string `json:"note_url,omitempty"` |
||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"` |
||||
CreatedAt *Timestamp `json:"created_at,omitempty"` |
||||
Fingerprint *string `json:"fingerprint,omitempty"` |
||||
} |
||||
|
||||
// CreateUserImpersonation creates an impersonation OAuth token.
|
||||
//
|
||||
// GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/users/#create-an-impersonation-oauth-token
|
||||
func (s *AdminService) CreateUserImpersonation(ctx context.Context, username string, opts *ImpersonateUserOptions) (*UserAuthorization, *Response, error) { |
||||
u := fmt.Sprintf("admin/users/%s/authorizations", username) |
||||
|
||||
req, err := s.client.NewRequest("POST", u, opts) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
a := new(UserAuthorization) |
||||
resp, err := s.client.Do(ctx, req, a) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return a, resp, nil |
||||
} |
||||
|
||||
// DeleteUserImpersonation deletes an impersonation OAuth token.
|
||||
//
|
||||
// GitHub Enterprise API docs: https://developer.github.com/enterprise/v3/enterprise-admin/users/#delete-an-impersonation-oauth-token
|
||||
func (s *AdminService) DeleteUserImpersonation(ctx context.Context, username string) (*Response, error) { |
||||
u := fmt.Sprintf("admin/users/%s/authorizations", username) |
||||
|
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
resp, err := s.client.Do(ctx, req, nil) |
||||
if err != nil { |
||||
return resp, err |
||||
} |
||||
|
||||
return resp, nil |
||||
} |
@ -0,0 +1,349 @@ |
||||
// Copyright 2016 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" |
||||
"time" |
||||
) |
||||
|
||||
// AppsService provides access to the installation related functions
|
||||
// in the GitHub API.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/
|
||||
type AppsService service |
||||
|
||||
// App represents a GitHub App.
|
||||
type App struct { |
||||
ID *int64 `json:"id,omitempty"` |
||||
Slug *string `json:"slug,omitempty"` |
||||
NodeID *string `json:"node_id,omitempty"` |
||||
Owner *User `json:"owner,omitempty"` |
||||
Name *string `json:"name,omitempty"` |
||||
Description *string `json:"description,omitempty"` |
||||
ExternalURL *string `json:"external_url,omitempty"` |
||||
HTMLURL *string `json:"html_url,omitempty"` |
||||
CreatedAt *Timestamp `json:"created_at,omitempty"` |
||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"` |
||||
Permissions *InstallationPermissions `json:"permissions,omitempty"` |
||||
Events []string `json:"events,omitempty"` |
||||
} |
||||
|
||||
// InstallationToken represents an installation token.
|
||||
type InstallationToken struct { |
||||
Token *string `json:"token,omitempty"` |
||||
ExpiresAt *time.Time `json:"expires_at,omitempty"` |
||||
Permissions *InstallationPermissions `json:"permissions,omitempty"` |
||||
Repositories []*Repository `json:"repositories,omitempty"` |
||||
} |
||||
|
||||
// InstallationTokenOptions allow restricting a token's access to specific repositories.
|
||||
type InstallationTokenOptions struct { |
||||
// The IDs of the repositories that the installation token can access.
|
||||
// Providing repository IDs restricts the access of an installation token to specific repositories.
|
||||
RepositoryIDs []int64 `json:"repository_ids,omitempty"` |
||||
|
||||
// The permissions granted to the access token.
|
||||
// The permissions object includes the permission names and their access type.
|
||||
Permissions *InstallationPermissions `json:"permissions,omitempty"` |
||||
} |
||||
|
||||
// InstallationPermissions lists the repository and organization permissions for an installation.
|
||||
//
|
||||
// Permission names taken from:
|
||||
// https://developer.github.com/v3/apps/permissions/
|
||||
// https://developer.github.com/enterprise/v3/apps/permissions/
|
||||
type InstallationPermissions struct { |
||||
Administration *string `json:"administration,omitempty"` |
||||
Blocking *string `json:"blocking,omitempty"` |
||||
Checks *string `json:"checks,omitempty"` |
||||
Contents *string `json:"contents,omitempty"` |
||||
ContentReferences *string `json:"content_references,omitempty"` |
||||
Deployments *string `json:"deployments,omitempty"` |
||||
Emails *string `json:"emails,omitempty"` |
||||
Followers *string `json:"followers,omitempty"` |
||||
Issues *string `json:"issues,omitempty"` |
||||
Metadata *string `json:"metadata,omitempty"` |
||||
Members *string `json:"members,omitempty"` |
||||
OrganizationAdministration *string `json:"organization_administration,omitempty"` |
||||
OrganizationHooks *string `json:"organization_hooks,omitempty"` |
||||
OrganizationPlan *string `json:"organization_plan,omitempty"` |
||||
OrganizationPreReceiveHooks *string `json:"organization_pre_receive_hooks,omitempty"` |
||||
OrganizationProjects *string `json:"organization_projects,omitempty"` |
||||
OrganizationUserBlocking *string `json:"organization_user_blocking,omitempty"` |
||||
Packages *string `json:"packages,omitempty"` |
||||
Pages *string `json:"pages,omitempty"` |
||||
PullRequests *string `json:"pull_requests,omitempty"` |
||||
RepositoryHooks *string `json:"repository_hooks,omitempty"` |
||||
RepositoryProjects *string `json:"repository_projects,omitempty"` |
||||
RepositoryPreReceiveHooks *string `json:"repository_pre_receive_hooks,omitempty"` |
||||
SingleFile *string `json:"single_file,omitempty"` |
||||
Statuses *string `json:"statuses,omitempty"` |
||||
TeamDiscussions *string `json:"team_discussions,omitempty"` |
||||
VulnerabilityAlerts *string `json:"vulnerability_alerts,omitempty"` |
||||
} |
||||
|
||||
// Installation represents a GitHub Apps installation.
|
||||
type Installation struct { |
||||
ID *int64 `json:"id,omitempty"` |
||||
AppID *int64 `json:"app_id,omitempty"` |
||||
TargetID *int64 `json:"target_id,omitempty"` |
||||
Account *User `json:"account,omitempty"` |
||||
AccessTokensURL *string `json:"access_tokens_url,omitempty"` |
||||
RepositoriesURL *string `json:"repositories_url,omitempty"` |
||||
HTMLURL *string `json:"html_url,omitempty"` |
||||
TargetType *string `json:"target_type,omitempty"` |
||||
SingleFileName *string `json:"single_file_name,omitempty"` |
||||
RepositorySelection *string `json:"repository_selection,omitempty"` |
||||
Events []string `json:"events,omitempty"` |
||||
Permissions *InstallationPermissions `json:"permissions,omitempty"` |
||||
CreatedAt *Timestamp `json:"created_at,omitempty"` |
||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"` |
||||
} |
||||
|
||||
// Attachment represents a GitHub Apps attachment.
|
||||
type Attachment struct { |
||||
ID *int64 `json:"id,omitempty"` |
||||
Title *string `json:"title,omitempty"` |
||||
Body *string `json:"body,omitempty"` |
||||
} |
||||
|
||||
func (i Installation) String() string { |
||||
return Stringify(i) |
||||
} |
||||
|
||||
// Get a single GitHub App. Passing the empty string will get
|
||||
// the authenticated GitHub App.
|
||||
//
|
||||
// Note: appSlug is just the URL-friendly name of your GitHub App.
|
||||
// You can find this on the settings page for your GitHub App
|
||||
// (e.g., https://github.com/settings/apps/:app_slug).
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/#get-the-authenticated-app
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/#get-an-app
|
||||
func (s *AppsService) Get(ctx context.Context, appSlug string) (*App, *Response, error) { |
||||
var u string |
||||
if appSlug != "" { |
||||
u = fmt.Sprintf("apps/%v", appSlug) |
||||
} else { |
||||
u = "app" |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeIntegrationPreview) |
||||
|
||||
app := new(App) |
||||
resp, err := s.client.Do(ctx, req, app) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return app, resp, nil |
||||
} |
||||
|
||||
// ListInstallations lists the installations that the current GitHub App has.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/#list-installations-for-the-authenticated-app
|
||||
func (s *AppsService) ListInstallations(ctx context.Context, opts *ListOptions) ([]*Installation, *Response, error) { |
||||
u, err := addOptions("app/installations", opts) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeIntegrationPreview) |
||||
|
||||
var i []*Installation |
||||
resp, err := s.client.Do(ctx, req, &i) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return i, resp, nil |
||||
} |
||||
|
||||
// GetInstallation returns the specified installation.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/#get-an-installation-for-the-authenticated-app
|
||||
func (s *AppsService) GetInstallation(ctx context.Context, id int64) (*Installation, *Response, error) { |
||||
return s.getInstallation(ctx, fmt.Sprintf("app/installations/%v", id)) |
||||
} |
||||
|
||||
// ListUserInstallations lists installations that are accessible to the authenticated user.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/installations/#list-app-installations-accessible-to-the-user-access-token
|
||||
func (s *AppsService) ListUserInstallations(ctx context.Context, opts *ListOptions) ([]*Installation, *Response, error) { |
||||
u, err := addOptions("user/installations", opts) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeIntegrationPreview) |
||||
|
||||
var i struct { |
||||
Installations []*Installation `json:"installations"` |
||||
} |
||||
resp, err := s.client.Do(ctx, req, &i) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return i.Installations, resp, nil |
||||
} |
||||
|
||||
// SuspendInstallation suspends the specified installation.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/#suspend-an-app-installation
|
||||
func (s *AppsService) SuspendInstallation(ctx context.Context, id int64) (*Response, error) { |
||||
u := fmt.Sprintf("app/installations/%v/suspended", id) |
||||
|
||||
req, err := s.client.NewRequest("PUT", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// UnsuspendInstallation unsuspends the specified installation.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/#unsuspend-an-app-installation
|
||||
func (s *AppsService) UnsuspendInstallation(ctx context.Context, id int64) (*Response, error) { |
||||
u := fmt.Sprintf("app/installations/%v/suspended", id) |
||||
|
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// DeleteInstallation deletes the specified installation.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/#delete-an-installation-for-the-authenticated-app
|
||||
func (s *AppsService) DeleteInstallation(ctx context.Context, id int64) (*Response, error) { |
||||
u := fmt.Sprintf("app/installations/%v", id) |
||||
|
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeIntegrationPreview) |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// CreateInstallationToken creates a new installation token.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/#create-an-installation-access-token-for-an-app
|
||||
func (s *AppsService) CreateInstallationToken(ctx context.Context, id int64, opts *InstallationTokenOptions) (*InstallationToken, *Response, error) { |
||||
u := fmt.Sprintf("app/installations/%v/access_tokens", id) |
||||
|
||||
req, err := s.client.NewRequest("POST", u, opts) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeIntegrationPreview) |
||||
|
||||
t := new(InstallationToken) |
||||
resp, err := s.client.Do(ctx, req, t) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return t, resp, nil |
||||
} |
||||
|
||||
// CreateAttachment creates a new attachment on user comment containing a url.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/installations/#create-a-content-attachment
|
||||
func (s *AppsService) CreateAttachment(ctx context.Context, contentReferenceID int64, title, body string) (*Attachment, *Response, error) { |
||||
u := fmt.Sprintf("content_references/%v/attachments", contentReferenceID) |
||||
payload := &Attachment{Title: String(title), Body: String(body)} |
||||
req, err := s.client.NewRequest("POST", u, payload) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept headers when APIs fully launch.
|
||||
req.Header.Set("Accept", mediaTypeReactionsPreview) |
||||
|
||||
m := &Attachment{} |
||||
resp, err := s.client.Do(ctx, req, m) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return m, resp, nil |
||||
} |
||||
|
||||
// FindOrganizationInstallation finds the organization's installation information.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/#get-an-organization-installation-for-the-authenticated-app
|
||||
func (s *AppsService) FindOrganizationInstallation(ctx context.Context, org string) (*Installation, *Response, error) { |
||||
return s.getInstallation(ctx, fmt.Sprintf("orgs/%v/installation", org)) |
||||
} |
||||
|
||||
// FindRepositoryInstallation finds the repository's installation information.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/#get-a-repository-installation-for-the-authenticated-app
|
||||
func (s *AppsService) FindRepositoryInstallation(ctx context.Context, owner, repo string) (*Installation, *Response, error) { |
||||
return s.getInstallation(ctx, fmt.Sprintf("repos/%v/%v/installation", owner, repo)) |
||||
} |
||||
|
||||
// FindRepositoryInstallationByID finds the repository's installation information.
|
||||
//
|
||||
// Note: FindRepositoryInstallationByID uses the undocumented GitHub API endpoint /repositories/:id/installation.
|
||||
func (s *AppsService) FindRepositoryInstallationByID(ctx context.Context, id int64) (*Installation, *Response, error) { |
||||
return s.getInstallation(ctx, fmt.Sprintf("repositories/%d/installation", id)) |
||||
} |
||||
|
||||
// FindUserInstallation finds the user's installation information.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/#get-a-user-installation-for-the-authenticated-app
|
||||
func (s *AppsService) FindUserInstallation(ctx context.Context, user string) (*Installation, *Response, error) { |
||||
return s.getInstallation(ctx, fmt.Sprintf("users/%v/installation", user)) |
||||
} |
||||
|
||||
func (s *AppsService) getInstallation(ctx context.Context, url string) (*Installation, *Response, error) { |
||||
req, err := s.client.NewRequest("GET", url, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
req.Header.Set("Accept", mediaTypeIntegrationPreview) |
||||
|
||||
i := new(Installation) |
||||
resp, err := s.client.Do(ctx, req, i) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return i, resp, nil |
||||
} |
@ -0,0 +1,53 @@ |
||||
// Copyright 2019 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" |
||||
) |
||||
|
||||
const ( |
||||
mediaTypeAppManifestPreview = "application/vnd.github.fury-preview+json" |
||||
) |
||||
|
||||
// AppConfig describes the configuration of a GitHub App.
|
||||
type AppConfig struct { |
||||
ID *int64 `json:"id,omitempty"` |
||||
NodeID *string `json:"node_id,omitempty"` |
||||
Owner *User `json:"owner,omitempty"` |
||||
Name *string `json:"name,omitempty"` |
||||
Description *string `json:"description,omitempty"` |
||||
ExternalURL *string `json:"external_url,omitempty"` |
||||
HTMLURL *string `json:"html_url,omitempty"` |
||||
CreatedAt *Timestamp `json:"created_at,omitempty"` |
||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"` |
||||
ClientID *string `json:"client_id,omitempty"` |
||||
ClientSecret *string `json:"client_secret,omitempty"` |
||||
WebhookSecret *string `json:"webhook_secret,omitempty"` |
||||
PEM *string `json:"pem,omitempty"` |
||||
} |
||||
|
||||
// CompleteAppManifest completes the App manifest handshake flow for the given
|
||||
// code.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/apps/#create-a-github-app-from-a-manifest
|
||||
func (s *AppsService) CompleteAppManifest(ctx context.Context, code string) (*AppConfig, *Response, error) { |
||||
u := fmt.Sprintf("app-manifests/%s/conversions", code) |
||||
req, err := s.client.NewRequest("POST", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
req.Header.Set("Accept", mediaTypeAppManifestPreview) |
||||
|
||||
cfg := new(AppConfig) |
||||
resp, err := s.client.Do(ctx, req, cfg) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return cfg, resp, nil |
||||
} |
@ -0,0 +1,117 @@ |
||||
// Copyright 2020 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" |
||||
"strconv" |
||||
"strings" |
||||
) |
||||
|
||||
// CodeScanningService handles communication with the code scanning related
|
||||
// methods of the GitHub API.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/code-scanning/
|
||||
type CodeScanningService service |
||||
|
||||
type Alert struct { |
||||
RuleID *string `json:"rule_id,omitempty"` |
||||
RuleSeverity *string `json:"rule_severity,omitempty"` |
||||
RuleDescription *string `json:"rule_description,omitempty"` |
||||
Tool *string `json:"tool,omitempty"` |
||||
CreatedAt *Timestamp `json:"created_at,omitempty"` |
||||
Open *bool `json:"open,omitempty"` |
||||
ClosedBy *User `json:"closed_by,omitempty"` |
||||
ClosedAt *Timestamp `json:"closed_at,omitempty"` |
||||
URL *string `json:"url,omitempty"` |
||||
HTMLURL *string `json:"html_url,omitempty"` |
||||
} |
||||
|
||||
// ID returns the ID associated with an alert. It is the number at the end of the security alert's URL.
|
||||
func (a *Alert) ID() int64 { |
||||
if a == nil { |
||||
return 0 |
||||
} |
||||
|
||||
s := a.GetHTMLURL() |
||||
|
||||
// Check for an ID to parse at the end of the url
|
||||
if i := strings.LastIndex(s, "/"); i >= 0 { |
||||
s = s[i+1:] |
||||
} |
||||
|
||||
// Return the alert ID as a 64-bit integer. Unable to convert or out of range returns 0.
|
||||
id, err := strconv.ParseInt(s, 10, 64) |
||||
if err != nil { |
||||
return 0 |
||||
} |
||||
|
||||
return id |
||||
} |
||||
|
||||
// AlertListOptions specifies optional parameters to the CodeScanningService.ListAlerts
|
||||
// method.
|
||||
type AlertListOptions struct { |
||||
// State of the code scanning alerts to list. Set to closed to list only closed code scanning alerts. Default: open
|
||||
State string `url:"state,omitempty"` |
||||
|
||||
// Return code scanning alerts for a specific branch reference. The ref must be formatted as heads/<branch name>.
|
||||
Ref string `url:"ref,omitempty"` |
||||
} |
||||
|
||||
// ListAlertsForRepo lists code scanning alerts for a repository.
|
||||
//
|
||||
// Lists all open code scanning alerts for the default branch (usually master) and protected branches in a repository.
|
||||
// You must use an access token with the security_events scope to use this endpoint. GitHub Apps must have the security_events
|
||||
// read permission to use this endpoint.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/code-scanning/#list-code-scanning-alerts-for-a-repository
|
||||
func (s *CodeScanningService) ListAlertsForRepo(ctx context.Context, owner, repo string, opts *AlertListOptions) ([]*Alert, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/code-scanning/alerts", owner, repo) |
||||
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 alerts []*Alert |
||||
resp, err := s.client.Do(ctx, req, &alerts) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return alerts, resp, nil |
||||
} |
||||
|
||||
// GetAlert gets a single code scanning alert for a repository.
|
||||
//
|
||||
// You must use an access token with the security_events scope to use this endpoint.
|
||||
// GitHub Apps must have the security_events read permission to use this endpoint.
|
||||
//
|
||||
// The security alert_id is the number at the end of the security alert's URL.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/code-scanning/#get-a-code-scanning-alert
|
||||
func (s *CodeScanningService) GetAlert(ctx context.Context, owner, repo string, id int64) (*Alert, *Response, error) { |
||||
u := fmt.Sprintf("repos/%v/%v/code-scanning/alerts/%v", owner, repo, id) |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
a := new(Alert) |
||||
resp, err := s.client.Do(ctx, req, a) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return a, resp, nil |
||||
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,101 @@ |
||||
// Copyright 2020 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 |
||||
|
||||
// Package represents a GitHub package.
|
||||
type Package struct { |
||||
ID *int64 `json:"id,omitempty"` |
||||
Name *string `json:"name,omitempty"` |
||||
PackageType *string `json:"package_type,omitempty"` |
||||
HTMLURL *string `json:"html_url,omitempty"` |
||||
CreatedAt *Timestamp `json:"created_at,omitempty"` |
||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"` |
||||
Owner *User `json:"owner,omitempty"` |
||||
PackageVersion *PackageVersion `json:"package_version,omitempty"` |
||||
Registry *PackageRegistry `json:"registry,omitempty"` |
||||
} |
||||
|
||||
func (p Package) String() string { |
||||
return Stringify(p) |
||||
} |
||||
|
||||
// PackageVersion represents a GitHub package version.
|
||||
type PackageVersion struct { |
||||
ID *int64 `json:"id,omitempty"` |
||||
Version *string `json:"version,omitempty"` |
||||
Summary *string `json:"summary,omitempty"` |
||||
Body *string `json:"body,omitempty"` |
||||
BodyHTML *string `json:"body_html,omitempty"` |
||||
Release *PackageRelease `json:"release,omitempty"` |
||||
Manifest *string `json:"manifest,omitempty"` |
||||
HTMLURL *string `json:"html_url,omitempty"` |
||||
TagName *string `json:"tag_name,omitempty"` |
||||
TargetCommitish *string `json:"target_commitish,omitempty"` |
||||
TargetOID *string `json:"target_oid,omitempty"` |
||||
Draft *bool `json:"draft,omitempty"` |
||||
Prerelease *bool `json:"prerelease,omitempty"` |
||||
CreatedAt *Timestamp `json:"created_at,omitempty"` |
||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"` |
||||
PackageFiles []*PackageFile `json:"package_files,omitempty"` |
||||
Author *User `json:"author,omitempty"` |
||||
InstallationCommand *string `json:"installation_command,omitempty"` |
||||
} |
||||
|
||||
func (pv PackageVersion) String() string { |
||||
return Stringify(pv) |
||||
} |
||||
|
||||
// PackageRelease represents a GitHub package version release.
|
||||
type PackageRelease struct { |
||||
URL *string `json:"url,omitempty"` |
||||
HTMLURL *string `json:"html_url,omitempty"` |
||||
ID *int64 `json:"id,omitempty"` |
||||
TagName *string `json:"tag_name,omitempty"` |
||||
TargetCommitish *string `json:"target_commitish,omitempty"` |
||||
Name *string `json:"name,omitempty"` |
||||
Draft *bool `json:"draft,omitempty"` |
||||
Author *User `json:"author,omitempty"` |
||||
Prerelease *bool `json:"prerelease,omitempty"` |
||||
CreatedAt *Timestamp `json:"created_at,omitempty"` |
||||
PublishedAt *Timestamp `json:"published_at,omitempty"` |
||||
} |
||||
|
||||
func (r PackageRelease) String() string { |
||||
return Stringify(r) |
||||
} |
||||
|
||||
// PackageFile represents a GitHub package version release file.
|
||||
type PackageFile struct { |
||||
DownloadURL *string `json:"download_url,omitempty"` |
||||
ID *int64 `json:"id,omitempty"` |
||||
Name *string `json:"name,omitempty"` |
||||
SHA256 *string `json:"sha256,omitempty"` |
||||
SHA1 *string `json:"sha1,omitempty"` |
||||
MD5 *string `json:"md5,omitempty"` |
||||
ContentType *string `json:"content_type,omitempty"` |
||||
State *string `json:"state,omitempty"` |
||||
Author *User `json:"author,omitempty"` |
||||
Size *int64 `json:"size,omitempty"` |
||||
CreatedAt *Timestamp `json:"created_at,omitempty"` |
||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"` |
||||
} |
||||
|
||||
func (pf PackageFile) String() string { |
||||
return Stringify(pf) |
||||
} |
||||
|
||||
// PackageRegistry represents a GitHub package registry.
|
||||
type PackageRegistry struct { |
||||
AboutURL *string `json:"about_url,omitempty"` |
||||
Name *string `json:"name,omitempty"` |
||||
Type *string `json:"type,omitempty"` |
||||
URL *string `json:"url,omitempty"` |
||||
Vendor *string `json:"vendor,omitempty"` |
||||
} |
||||
|
||||
func (r PackageRegistry) String() string { |
||||
return Stringify(r) |
||||
} |
@ -0,0 +1,850 @@ |
||||
// Copyright 2018 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" |
||||
"strings" |
||||
"time" |
||||
) |
||||
|
||||
// TeamsService provides access to the team-related functions
|
||||
// in the GitHub API.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/
|
||||
type TeamsService service |
||||
|
||||
// Team represents a team within a GitHub organization. Teams are used to
|
||||
// manage access to an organization's repositories.
|
||||
type Team struct { |
||||
ID *int64 `json:"id,omitempty"` |
||||
NodeID *string `json:"node_id,omitempty"` |
||||
Name *string `json:"name,omitempty"` |
||||
Description *string `json:"description,omitempty"` |
||||
URL *string `json:"url,omitempty"` |
||||
Slug *string `json:"slug,omitempty"` |
||||
|
||||
// Permission specifies the default permission for repositories owned by the team.
|
||||
Permission *string `json:"permission,omitempty"` |
||||
|
||||
// Privacy identifies the level of privacy this team should have.
|
||||
// Possible values are:
|
||||
// secret - only visible to organization owners and members of this team
|
||||
// closed - visible to all members of this organization
|
||||
// Default is "secret".
|
||||
Privacy *string `json:"privacy,omitempty"` |
||||
|
||||
MembersCount *int `json:"members_count,omitempty"` |
||||
ReposCount *int `json:"repos_count,omitempty"` |
||||
Organization *Organization `json:"organization,omitempty"` |
||||
MembersURL *string `json:"members_url,omitempty"` |
||||
RepositoriesURL *string `json:"repositories_url,omitempty"` |
||||
Parent *Team `json:"parent,omitempty"` |
||||
|
||||
// LDAPDN is only available in GitHub Enterprise and when the team
|
||||
// membership is synchronized with LDAP.
|
||||
LDAPDN *string `json:"ldap_dn,omitempty"` |
||||
} |
||||
|
||||
func (t Team) String() string { |
||||
return Stringify(t) |
||||
} |
||||
|
||||
// Invitation represents a team member's invitation status.
|
||||
type Invitation struct { |
||||
ID *int64 `json:"id,omitempty"` |
||||
NodeID *string `json:"node_id,omitempty"` |
||||
Login *string `json:"login,omitempty"` |
||||
Email *string `json:"email,omitempty"` |
||||
// Role can be one of the values - 'direct_member', 'admin', 'billing_manager', 'hiring_manager', or 'reinstate'.
|
||||
Role *string `json:"role,omitempty"` |
||||
CreatedAt *time.Time `json:"created_at,omitempty"` |
||||
Inviter *User `json:"inviter,omitempty"` |
||||
TeamCount *int `json:"team_count,omitempty"` |
||||
InvitationTeamURL *string `json:"invitation_team_url,omitempty"` |
||||
} |
||||
|
||||
func (i Invitation) String() string { |
||||
return Stringify(i) |
||||
} |
||||
|
||||
// ListTeams lists all of the teams for an organization.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#list-teams
|
||||
func (s *TeamsService) ListTeams(ctx context.Context, org string, opts *ListOptions) ([]*Team, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams", org) |
||||
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 teams []*Team |
||||
resp, err := s.client.Do(ctx, req, &teams) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return teams, resp, nil |
||||
} |
||||
|
||||
// GetTeamByID fetches a team, given a specified organization ID, by ID.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#get-a-team-by-name
|
||||
func (s *TeamsService) GetTeamByID(ctx context.Context, orgID, teamID int64) (*Team, *Response, error) { |
||||
u := fmt.Sprintf("organizations/%v/team/%v", orgID, teamID) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
t := new(Team) |
||||
resp, err := s.client.Do(ctx, req, t) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return t, resp, nil |
||||
} |
||||
|
||||
// GetTeamBySlug fetches a team, given a specified organization name, by slug.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#get-a-team-by-name
|
||||
func (s *TeamsService) GetTeamBySlug(ctx context.Context, org, slug string) (*Team, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams/%v", org, slug) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
t := new(Team) |
||||
resp, err := s.client.Do(ctx, req, t) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return t, resp, nil |
||||
} |
||||
|
||||
// NewTeam represents a team to be created or modified.
|
||||
type NewTeam struct { |
||||
Name string `json:"name"` // Name of the team. (Required.)
|
||||
Description *string `json:"description,omitempty"` |
||||
Maintainers []string `json:"maintainers,omitempty"` |
||||
RepoNames []string `json:"repo_names,omitempty"` |
||||
ParentTeamID *int64 `json:"parent_team_id,omitempty"` |
||||
|
||||
// Deprecated: Permission is deprecated when creating or editing a team in an org
|
||||
// using the new GitHub permission model. It no longer identifies the
|
||||
// permission a team has on its repos, but only specifies the default
|
||||
// permission a repo is initially added with. Avoid confusion by
|
||||
// specifying a permission value when calling AddTeamRepo.
|
||||
Permission *string `json:"permission,omitempty"` |
||||
|
||||
// Privacy identifies the level of privacy this team should have.
|
||||
// Possible values are:
|
||||
// secret - only visible to organization owners and members of this team
|
||||
// closed - visible to all members of this organization
|
||||
// Default is "secret".
|
||||
Privacy *string `json:"privacy,omitempty"` |
||||
|
||||
// LDAPDN may be used in GitHub Enterprise when the team membership
|
||||
// is synchronized with LDAP.
|
||||
LDAPDN *string `json:"ldap_dn,omitempty"` |
||||
} |
||||
|
||||
func (s NewTeam) String() string { |
||||
return Stringify(s) |
||||
} |
||||
|
||||
// CreateTeam creates a new team within an organization.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#create-a-team
|
||||
func (s *TeamsService) CreateTeam(ctx context.Context, org string, team NewTeam) (*Team, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams", org) |
||||
req, err := s.client.NewRequest("POST", u, team) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
t := new(Team) |
||||
resp, err := s.client.Do(ctx, req, t) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return t, resp, nil |
||||
} |
||||
|
||||
// newTeamNoParent is the same as NewTeam but ensures that the
|
||||
// "parent_team_id" field will be null. It is for internal use
|
||||
// only and should not be exported.
|
||||
type newTeamNoParent struct { |
||||
Name string `json:"name"` |
||||
Description *string `json:"description,omitempty"` |
||||
Maintainers []string `json:"maintainers,omitempty"` |
||||
RepoNames []string `json:"repo_names,omitempty"` |
||||
ParentTeamID *int64 `json:"parent_team_id"` // This will be "null"
|
||||
Privacy *string `json:"privacy,omitempty"` |
||||
LDAPDN *string `json:"ldap_dn,omitempty"` |
||||
} |
||||
|
||||
// copyNewTeamWithoutParent is used to set the "parent_team_id"
|
||||
// field to "null" after copying the other fields from a NewTeam.
|
||||
// It is for internal use only and should not be exported.
|
||||
func copyNewTeamWithoutParent(team *NewTeam) *newTeamNoParent { |
||||
return &newTeamNoParent{ |
||||
Name: team.Name, |
||||
Description: team.Description, |
||||
Maintainers: team.Maintainers, |
||||
RepoNames: team.RepoNames, |
||||
Privacy: team.Privacy, |
||||
LDAPDN: team.LDAPDN, |
||||
} |
||||
} |
||||
|
||||
// EditTeamByID edits a team, given an organization ID, selected by ID.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#update-a-team
|
||||
func (s *TeamsService) EditTeamByID(ctx context.Context, orgID, teamID int64, team NewTeam, removeParent bool) (*Team, *Response, error) { |
||||
u := fmt.Sprintf("organizations/%v/team/%v", orgID, teamID) |
||||
|
||||
var req *http.Request |
||||
var err error |
||||
if removeParent { |
||||
teamRemoveParent := copyNewTeamWithoutParent(&team) |
||||
req, err = s.client.NewRequest("PATCH", u, teamRemoveParent) |
||||
} else { |
||||
req, err = s.client.NewRequest("PATCH", u, team) |
||||
} |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
t := new(Team) |
||||
resp, err := s.client.Do(ctx, req, t) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return t, resp, nil |
||||
} |
||||
|
||||
// EditTeamBySlug edits a team, given an organization name, by slug.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#update-a-team
|
||||
func (s *TeamsService) EditTeamBySlug(ctx context.Context, org, slug string, team NewTeam, removeParent bool) (*Team, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams/%v", org, slug) |
||||
|
||||
var req *http.Request |
||||
var err error |
||||
if removeParent { |
||||
teamRemoveParent := copyNewTeamWithoutParent(&team) |
||||
req, err = s.client.NewRequest("PATCH", u, teamRemoveParent) |
||||
} else { |
||||
req, err = s.client.NewRequest("PATCH", u, team) |
||||
} |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
t := new(Team) |
||||
resp, err := s.client.Do(ctx, req, t) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return t, resp, nil |
||||
} |
||||
|
||||
// DeleteTeamByID deletes a team referenced by ID.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#delete-a-team
|
||||
func (s *TeamsService) DeleteTeamByID(ctx context.Context, orgID, teamID int64) (*Response, error) { |
||||
u := fmt.Sprintf("organizations/%v/team/%v", orgID, teamID) |
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// DeleteTeamBySlug deletes a team reference by slug.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#delete-a-team
|
||||
func (s *TeamsService) DeleteTeamBySlug(ctx context.Context, org, slug string) (*Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams/%v", org, slug) |
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// ListChildTeamsByParentID lists child teams for a parent team given parent ID.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#list-child-teams
|
||||
func (s *TeamsService) ListChildTeamsByParentID(ctx context.Context, orgID, teamID int64, opts *ListOptions) ([]*Team, *Response, error) { |
||||
u := fmt.Sprintf("organizations/%v/team/%v/teams", orgID, teamID) |
||||
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 teams []*Team |
||||
resp, err := s.client.Do(ctx, req, &teams) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return teams, resp, nil |
||||
} |
||||
|
||||
// ListChildTeamsByParentSlug lists child teams for a parent team given parent slug.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#list-child-teams
|
||||
func (s *TeamsService) ListChildTeamsByParentSlug(ctx context.Context, org, slug string, opts *ListOptions) ([]*Team, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams/%v/teams", org, slug) |
||||
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 teams []*Team |
||||
resp, err := s.client.Do(ctx, req, &teams) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return teams, resp, nil |
||||
} |
||||
|
||||
// ListTeamReposByID lists the repositories given a team ID that the specified team has access to.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#list-team-repositories
|
||||
func (s *TeamsService) ListTeamReposByID(ctx context.Context, orgID, teamID int64, opts *ListOptions) ([]*Repository, *Response, error) { |
||||
u := fmt.Sprintf("organizations/%v/team/%v/repos", orgID, teamID) |
||||
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 |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when topics API fully launches.
|
||||
headers := []string{mediaTypeTopicsPreview} |
||||
req.Header.Set("Accept", strings.Join(headers, ", ")) |
||||
|
||||
var repos []*Repository |
||||
resp, err := s.client.Do(ctx, req, &repos) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return repos, resp, nil |
||||
} |
||||
|
||||
// ListTeamReposBySlug lists the repositories given a team slug that the specified team has access to.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#list-team-repositories
|
||||
func (s *TeamsService) ListTeamReposBySlug(ctx context.Context, org, slug string, opts *ListOptions) ([]*Repository, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams/%v/repos", org, slug) |
||||
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 |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when topics API fully launches.
|
||||
headers := []string{mediaTypeTopicsPreview} |
||||
req.Header.Set("Accept", strings.Join(headers, ", ")) |
||||
|
||||
var repos []*Repository |
||||
resp, err := s.client.Do(ctx, req, &repos) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return repos, resp, nil |
||||
} |
||||
|
||||
// IsTeamRepoByID checks if a team, given its ID, manages the specified repository. If the
|
||||
// repository is managed by team, a Repository is returned which includes the
|
||||
// permissions team has for that repo.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#check-team-permissions-for-a-repository
|
||||
func (s *TeamsService) IsTeamRepoByID(ctx context.Context, orgID, teamID int64, owner, repo string) (*Repository, *Response, error) { |
||||
u := fmt.Sprintf("organizations/%v/team/%v/repos/%v/%v", orgID, teamID, owner, repo) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
headers := []string{mediaTypeOrgPermissionRepo} |
||||
req.Header.Set("Accept", strings.Join(headers, ", ")) |
||||
|
||||
repository := new(Repository) |
||||
resp, err := s.client.Do(ctx, req, repository) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return repository, resp, nil |
||||
} |
||||
|
||||
// IsTeamRepoBySlug checks if a team, given its slug, manages the specified repository. If the
|
||||
// repository is managed by team, a Repository is returned which includes the
|
||||
// permissions team has for that repo.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#check-team-permissions-for-a-repository
|
||||
func (s *TeamsService) IsTeamRepoBySlug(ctx context.Context, org, slug, owner, repo string) (*Repository, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams/%v/repos/%v/%v", org, slug, owner, repo) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
headers := []string{mediaTypeOrgPermissionRepo} |
||||
req.Header.Set("Accept", strings.Join(headers, ", ")) |
||||
|
||||
repository := new(Repository) |
||||
resp, err := s.client.Do(ctx, req, repository) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return repository, resp, nil |
||||
} |
||||
|
||||
// TeamAddTeamRepoOptions specifies the optional parameters to the
|
||||
// TeamsService.AddTeamRepo method.
|
||||
type TeamAddTeamRepoOptions struct { |
||||
// Permission specifies the permission to grant the team on this repository.
|
||||
// Possible values are:
|
||||
// pull - team members can pull, but not push to or administer this repository
|
||||
// push - team members can pull and push, but not administer this repository
|
||||
// admin - team members can pull, push and administer this repository
|
||||
// maintain - team members can manage the repository without access to sensitive or destructive actions.
|
||||
// triage - team members can proactively manage issues and pull requests without write access.
|
||||
//
|
||||
// If not specified, the team's permission attribute will be used.
|
||||
Permission string `json:"permission,omitempty"` |
||||
} |
||||
|
||||
// AddTeamRepoByID adds a repository to be managed by the specified team given the team ID.
|
||||
// The specified repository must be owned by the organization to which the team
|
||||
// belongs, or a direct fork of a repository owned by the organization.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#add-or-update-team-repository-permissions
|
||||
func (s *TeamsService) AddTeamRepoByID(ctx context.Context, orgID, teamID int64, owner, repo string, opts *TeamAddTeamRepoOptions) (*Response, error) { |
||||
u := fmt.Sprintf("organizations/%v/team/%v/repos/%v/%v", orgID, teamID, owner, repo) |
||||
req, err := s.client.NewRequest("PUT", u, opts) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// AddTeamRepoBySlug adds a repository to be managed by the specified team given the team slug.
|
||||
// The specified repository must be owned by the organization to which the team
|
||||
// belongs, or a direct fork of a repository owned by the organization.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#add-or-update-team-repository-permissions
|
||||
func (s *TeamsService) AddTeamRepoBySlug(ctx context.Context, org, slug, owner, repo string, opts *TeamAddTeamRepoOptions) (*Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams/%v/repos/%v/%v", org, slug, owner, repo) |
||||
req, err := s.client.NewRequest("PUT", u, opts) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// RemoveTeamRepoByID removes a repository from being managed by the specified
|
||||
// team given the team ID. Note that this does not delete the repository, it
|
||||
// just removes it from the team.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#remove-a-repository-from-a-team
|
||||
func (s *TeamsService) RemoveTeamRepoByID(ctx context.Context, orgID, teamID int64, owner, repo string) (*Response, error) { |
||||
u := fmt.Sprintf("organizations/%v/team/%v/repos/%v/%v", orgID, teamID, owner, repo) |
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// RemoveTeamRepoBySlug removes a repository from being managed by the specified
|
||||
// team given the team slug. Note that this does not delete the repository, it
|
||||
// just removes it from the team.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#remove-a-repository-from-a-team
|
||||
func (s *TeamsService) RemoveTeamRepoBySlug(ctx context.Context, org, slug, owner, repo string) (*Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams/%v/repos/%v/%v", org, slug, owner, repo) |
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// ListUserTeams lists a user's teams
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#list-teams-for-the-authenticated-user
|
||||
func (s *TeamsService) ListUserTeams(ctx context.Context, opts *ListOptions) ([]*Team, *Response, error) { |
||||
u := "user/teams" |
||||
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 teams []*Team |
||||
resp, err := s.client.Do(ctx, req, &teams) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return teams, resp, nil |
||||
} |
||||
|
||||
// ListTeamProjectsByID lists the organization projects for a team given the team ID.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#list-team-projects
|
||||
func (s *TeamsService) ListTeamProjectsByID(ctx context.Context, orgID, teamID int64) ([]*Project, *Response, error) { |
||||
u := fmt.Sprintf("organizations/%v/team/%v/projects", orgID, teamID) |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
acceptHeaders := []string{mediaTypeProjectsPreview} |
||||
req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) |
||||
|
||||
var projects []*Project |
||||
resp, err := s.client.Do(ctx, req, &projects) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return projects, resp, nil |
||||
} |
||||
|
||||
// ListTeamProjectsBySlug lists the organization projects for a team given the team slug.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#list-team-projects
|
||||
func (s *TeamsService) ListTeamProjectsBySlug(ctx context.Context, org, slug string) ([]*Project, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams/%v/projects", org, slug) |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
acceptHeaders := []string{mediaTypeProjectsPreview} |
||||
req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) |
||||
|
||||
var projects []*Project |
||||
resp, err := s.client.Do(ctx, req, &projects) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return projects, resp, nil |
||||
} |
||||
|
||||
// ReviewTeamProjectsByID checks whether a team, given its ID, has read, write, or admin
|
||||
// permissions for an organization project.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#check-team-permissions-for-a-project
|
||||
func (s *TeamsService) ReviewTeamProjectsByID(ctx context.Context, orgID, teamID, projectID int64) (*Project, *Response, error) { |
||||
u := fmt.Sprintf("organizations/%v/team/%v/projects/%v", orgID, teamID, projectID) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
acceptHeaders := []string{mediaTypeProjectsPreview} |
||||
req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) |
||||
|
||||
projects := &Project{} |
||||
resp, err := s.client.Do(ctx, req, &projects) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return projects, resp, nil |
||||
} |
||||
|
||||
// ReviewTeamProjectsBySlug checks whether a team, given its slug, has read, write, or admin
|
||||
// permissions for an organization project.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#check-team-permissions-for-a-project
|
||||
func (s *TeamsService) ReviewTeamProjectsBySlug(ctx context.Context, org, slug string, projectID int64) (*Project, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams/%v/projects/%v", org, slug, projectID) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
acceptHeaders := []string{mediaTypeProjectsPreview} |
||||
req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) |
||||
|
||||
projects := &Project{} |
||||
resp, err := s.client.Do(ctx, req, &projects) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return projects, resp, nil |
||||
} |
||||
|
||||
// TeamProjectOptions specifies the optional parameters to the
|
||||
// TeamsService.AddTeamProject method.
|
||||
type TeamProjectOptions struct { |
||||
// Permission specifies the permission to grant to the team for this project.
|
||||
// Possible values are:
|
||||
// "read" - team members can read, but not write to or administer this project.
|
||||
// "write" - team members can read and write, but not administer this project.
|
||||
// "admin" - team members can read, write and administer this project.
|
||||
//
|
||||
Permission *string `json:"permission,omitempty"` |
||||
} |
||||
|
||||
// AddTeamProjectByID adds an organization project to a team given the team ID.
|
||||
// To add a project to a team or update the team's permission on a project, the
|
||||
// authenticated user must have admin permissions for the project.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#add-or-update-team-project-permissions
|
||||
func (s *TeamsService) AddTeamProjectByID(ctx context.Context, orgID, teamID, projectID int64, opts *TeamProjectOptions) (*Response, error) { |
||||
u := fmt.Sprintf("organizations/%v/team/%v/projects/%v", orgID, teamID, projectID) |
||||
req, err := s.client.NewRequest("PUT", u, opts) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
acceptHeaders := []string{mediaTypeProjectsPreview} |
||||
req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// AddTeamProjectBySlug adds an organization project to a team given the team slug.
|
||||
// To add a project to a team or update the team's permission on a project, the
|
||||
// authenticated user must have admin permissions for the project.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#add-or-update-team-project-permissions
|
||||
func (s *TeamsService) AddTeamProjectBySlug(ctx context.Context, org, slug string, projectID int64, opts *TeamProjectOptions) (*Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams/%v/projects/%v", org, slug, projectID) |
||||
req, err := s.client.NewRequest("PUT", u, opts) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
acceptHeaders := []string{mediaTypeProjectsPreview} |
||||
req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// RemoveTeamProjectByID removes an organization project from a team given team ID.
|
||||
// An organization owner or a team maintainer can remove any project from the team.
|
||||
// To remove a project from a team as an organization member, the authenticated user
|
||||
// must have "read" access to both the team and project, or "admin" access to the team
|
||||
// or project.
|
||||
// Note: This endpoint removes the project from the team, but does not delete it.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#remove-a-project-from-a-team
|
||||
func (s *TeamsService) RemoveTeamProjectByID(ctx context.Context, orgID, teamID, projectID int64) (*Response, error) { |
||||
u := fmt.Sprintf("organizations/%v/team/%v/projects/%v", orgID, teamID, projectID) |
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
acceptHeaders := []string{mediaTypeProjectsPreview} |
||||
req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// RemoveTeamProjectBySlug removes an organization project from a team given team slug.
|
||||
// An organization owner or a team maintainer can remove any project from the team.
|
||||
// To remove a project from a team as an organization member, the authenticated user
|
||||
// must have "read" access to both the team and project, or "admin" access to the team
|
||||
// or project.
|
||||
// Note: This endpoint removes the project from the team, but does not delete it.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/#remove-a-project-from-a-team
|
||||
func (s *TeamsService) RemoveTeamProjectBySlug(ctx context.Context, org, slug string, projectID int64) (*Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams/%v/projects/%v", org, slug, projectID) |
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
// TODO: remove custom Accept header when this API fully launches.
|
||||
acceptHeaders := []string{mediaTypeProjectsPreview} |
||||
req.Header.Set("Accept", strings.Join(acceptHeaders, ", ")) |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// IDPGroupList represents a list of external identity provider (IDP) groups.
|
||||
type IDPGroupList struct { |
||||
Groups []*IDPGroup `json:"groups"` |
||||
} |
||||
|
||||
// IDPGroup represents an external identity provider (IDP) group.
|
||||
type IDPGroup struct { |
||||
GroupID *string `json:"group_id,omitempty"` |
||||
GroupName *string `json:"group_name,omitempty"` |
||||
GroupDescription *string `json:"group_description,omitempty"` |
||||
} |
||||
|
||||
// ListIDPGroupsInOrganization lists IDP groups available in an organization.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/team_sync/#list-idp-groups-for-an-organization
|
||||
func (s *TeamsService) ListIDPGroupsInOrganization(ctx context.Context, org string, opts *ListCursorOptions) (*IDPGroupList, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/team-sync/groups", org) |
||||
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 |
||||
} |
||||
|
||||
groups := new(IDPGroupList) |
||||
resp, err := s.client.Do(ctx, req, groups) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
return groups, resp, nil |
||||
} |
||||
|
||||
// ListIDPGroupsForTeamByID lists IDP groups connected to a team on GitHub
|
||||
// given organization and team IDs.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/team_sync/#list-idp-groups-for-a-team
|
||||
func (s *TeamsService) ListIDPGroupsForTeamByID(ctx context.Context, orgID, teamID int64) (*IDPGroupList, *Response, error) { |
||||
u := fmt.Sprintf("organizations/%v/team/%v/team-sync/group-mappings", orgID, teamID) |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
groups := new(IDPGroupList) |
||||
resp, err := s.client.Do(ctx, req, groups) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
return groups, resp, err |
||||
} |
||||
|
||||
// ListIDPGroupsForTeamBySlug lists IDP groups connected to a team on GitHub
|
||||
// given organization name and team slug.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/team_sync/#list-idp-groups-for-a-team
|
||||
func (s *TeamsService) ListIDPGroupsForTeamBySlug(ctx context.Context, org, slug string) (*IDPGroupList, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams/%v/team-sync/group-mappings", org, slug) |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
groups := new(IDPGroupList) |
||||
resp, err := s.client.Do(ctx, req, groups) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
return groups, resp, err |
||||
} |
||||
|
||||
// CreateOrUpdateIDPGroupConnectionsByID creates, updates, or removes a connection
|
||||
// between a team and an IDP group given organization and team IDs.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/team_sync/#create-or-update-idp-group-connections
|
||||
func (s *TeamsService) CreateOrUpdateIDPGroupConnectionsByID(ctx context.Context, orgID, teamID int64, opts IDPGroupList) (*IDPGroupList, *Response, error) { |
||||
u := fmt.Sprintf("organizations/%v/team/%v/team-sync/group-mappings", orgID, teamID) |
||||
|
||||
req, err := s.client.NewRequest("PATCH", u, opts) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
groups := new(IDPGroupList) |
||||
resp, err := s.client.Do(ctx, req, groups) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return groups, resp, nil |
||||
} |
||||
|
||||
// CreateOrUpdateIDPGroupConnectionsBySlug creates, updates, or removes a connection
|
||||
// between a team and an IDP group given organization name and team slug.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/team_sync/#create-or-update-idp-group-connections
|
||||
func (s *TeamsService) CreateOrUpdateIDPGroupConnectionsBySlug(ctx context.Context, org, slug string, opts IDPGroupList) (*IDPGroupList, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams/%v/team-sync/group-mappings", org, slug) |
||||
|
||||
req, err := s.client.NewRequest("PATCH", u, opts) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
groups := new(IDPGroupList) |
||||
resp, err := s.client.Do(ctx, req, groups) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return groups, resp, nil |
||||
} |
@ -0,0 +1,242 @@ |
||||
// Copyright 2018 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" |
||||
) |
||||
|
||||
// DiscussionComment represents a GitHub dicussion in a team.
|
||||
type DiscussionComment struct { |
||||
Author *User `json:"author,omitempty"` |
||||
Body *string `json:"body,omitempty"` |
||||
BodyHTML *string `json:"body_html,omitempty"` |
||||
BodyVersion *string `json:"body_version,omitempty"` |
||||
CreatedAt *Timestamp `json:"created_at,omitempty"` |
||||
LastEditedAt *Timestamp `json:"last_edited_at,omitempty"` |
||||
DiscussionURL *string `json:"discussion_url,omitempty"` |
||||
HTMLURL *string `json:"html_url,omitempty"` |
||||
NodeID *string `json:"node_id,omitempty"` |
||||
Number *int `json:"number,omitempty"` |
||||
UpdatedAt *Timestamp `json:"updated_at,omitempty"` |
||||
URL *string `json:"url,omitempty"` |
||||
Reactions *Reactions `json:"reactions,omitempty"` |
||||
} |
||||
|
||||
func (c DiscussionComment) String() string { |
||||
return Stringify(c) |
||||
} |
||||
|
||||
// DiscussionCommentListOptions specifies optional parameters to the
|
||||
// TeamServices.ListComments method.
|
||||
type DiscussionCommentListOptions struct { |
||||
// Sorts the discussion comments by the date they were created.
|
||||
// Accepted values are asc and desc. Default is desc.
|
||||
Direction string `url:"direction,omitempty"` |
||||
ListOptions |
||||
} |
||||
|
||||
// ListCommentsByID lists all comments on a team discussion by team ID.
|
||||
// Authenticated user must grant read:discussion scope.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#list-discussion-comments
|
||||
func (s *TeamsService) ListCommentsByID(ctx context.Context, orgID, teamID int64, discussionNumber int, options *DiscussionCommentListOptions) ([]*DiscussionComment, *Response, error) { |
||||
u := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/comments", orgID, teamID, discussionNumber) |
||||
u, err := addOptions(u, options) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
var comments []*DiscussionComment |
||||
resp, err := s.client.Do(ctx, req, &comments) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return comments, resp, nil |
||||
} |
||||
|
||||
// ListCommentsBySlug lists all comments on a team discussion by team slug.
|
||||
// Authenticated user must grant read:discussion scope.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#list-discussion-comments
|
||||
func (s *TeamsService) ListCommentsBySlug(ctx context.Context, org, slug string, discussionNumber int, options *DiscussionCommentListOptions) ([]*DiscussionComment, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/comments", org, slug, discussionNumber) |
||||
u, err := addOptions(u, options) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
var comments []*DiscussionComment |
||||
resp, err := s.client.Do(ctx, req, &comments) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return comments, resp, nil |
||||
} |
||||
|
||||
// GetCommentByID gets a specific comment on a team discussion by team ID.
|
||||
// Authenticated user must grant read:discussion scope.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#get-a-discussion-comment
|
||||
func (s *TeamsService) GetCommentByID(ctx context.Context, orgID, teamID int64, discussionNumber, commentNumber int) (*DiscussionComment, *Response, error) { |
||||
u := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/comments/%v", orgID, teamID, discussionNumber, commentNumber) |
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
discussionComment := &DiscussionComment{} |
||||
resp, err := s.client.Do(ctx, req, discussionComment) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return discussionComment, resp, nil |
||||
} |
||||
|
||||
// GetCommentBySlug gets a specific comment on a team discussion by team slug.
|
||||
// Authenticated user must grant read:discussion scope.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#get-a-discussion-comment
|
||||
func (s *TeamsService) GetCommentBySlug(ctx context.Context, org, slug string, discussionNumber, commentNumber int) (*DiscussionComment, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/comments/%v", org, slug, discussionNumber, commentNumber) |
||||
|
||||
req, err := s.client.NewRequest("GET", u, nil) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
discussionComment := &DiscussionComment{} |
||||
resp, err := s.client.Do(ctx, req, discussionComment) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return discussionComment, resp, nil |
||||
} |
||||
|
||||
// CreateCommentByID creates a new comment on a team discussion by team ID.
|
||||
// Authenticated user must grant write:discussion scope.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#create-a-discussion-comment
|
||||
func (s *TeamsService) CreateCommentByID(ctx context.Context, orgID, teamID int64, discsusionNumber int, comment DiscussionComment) (*DiscussionComment, *Response, error) { |
||||
u := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/comments", orgID, teamID, discsusionNumber) |
||||
req, err := s.client.NewRequest("POST", u, comment) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
discussionComment := &DiscussionComment{} |
||||
resp, err := s.client.Do(ctx, req, discussionComment) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return discussionComment, resp, nil |
||||
} |
||||
|
||||
// CreateCommentBySlug creates a new comment on a team discussion by team slug.
|
||||
// Authenticated user must grant write:discussion scope.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#create-a-discussion-comment
|
||||
func (s *TeamsService) CreateCommentBySlug(ctx context.Context, org, slug string, discsusionNumber int, comment DiscussionComment) (*DiscussionComment, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/comments", org, slug, discsusionNumber) |
||||
req, err := s.client.NewRequest("POST", u, comment) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
discussionComment := &DiscussionComment{} |
||||
resp, err := s.client.Do(ctx, req, discussionComment) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return discussionComment, resp, nil |
||||
} |
||||
|
||||
// EditCommentByID edits the body text of a discussion comment by team ID.
|
||||
// Authenticated user must grant write:discussion scope.
|
||||
// User is allowed to edit body of a comment only.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#update-a-discussion-comment
|
||||
func (s *TeamsService) EditCommentByID(ctx context.Context, orgID, teamID int64, discussionNumber, commentNumber int, comment DiscussionComment) (*DiscussionComment, *Response, error) { |
||||
u := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/comments/%v", orgID, teamID, discussionNumber, commentNumber) |
||||
req, err := s.client.NewRequest("PATCH", u, comment) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
discussionComment := &DiscussionComment{} |
||||
resp, err := s.client.Do(ctx, req, discussionComment) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return discussionComment, resp, nil |
||||
} |
||||
|
||||
// EditCommentBySlug edits the body text of a discussion comment by team slug.
|
||||
// Authenticated user must grant write:discussion scope.
|
||||
// User is allowed to edit body of a comment only.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#update-a-discussion-comment
|
||||
func (s *TeamsService) EditCommentBySlug(ctx context.Context, org, slug string, discussionNumber, commentNumber int, comment DiscussionComment) (*DiscussionComment, *Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/comments/%v", org, slug, discussionNumber, commentNumber) |
||||
req, err := s.client.NewRequest("PATCH", u, comment) |
||||
if err != nil { |
||||
return nil, nil, err |
||||
} |
||||
|
||||
discussionComment := &DiscussionComment{} |
||||
resp, err := s.client.Do(ctx, req, discussionComment) |
||||
if err != nil { |
||||
return nil, resp, err |
||||
} |
||||
|
||||
return discussionComment, resp, nil |
||||
} |
||||
|
||||
// DeleteCommentByID deletes a comment on a team discussion by team ID.
|
||||
// Authenticated user must grant write:discussion scope.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#delete-a-discussion-comment
|
||||
func (s *TeamsService) DeleteCommentByID(ctx context.Context, orgID, teamID int64, discussionNumber, commentNumber int) (*Response, error) { |
||||
u := fmt.Sprintf("organizations/%v/team/%v/discussions/%v/comments/%v", orgID, teamID, discussionNumber, commentNumber) |
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
||||
|
||||
// DeleteCommentBySlug deletes a comment on a team discussion by team slug.
|
||||
// Authenticated user must grant write:discussion scope.
|
||||
//
|
||||
// GitHub API docs: https://developer.github.com/v3/teams/discussion_comments/#delete-a-discussion-comment
|
||||
func (s *TeamsService) DeleteCommentBySlug(ctx context.Context, org, slug string, discussionNumber, commentNumber int) (*Response, error) { |
||||
u := fmt.Sprintf("orgs/%v/teams/%v/discussions/%v/comments/%v", org, slug, discussionNumber, commentNumber) |
||||
req, err := s.client.NewRequest("DELETE", u, nil) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
|
||||
return s.client.Do(ctx, req, nil) |
||||
} |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue