github.com/google/go-github/v60@v60.0.0/github/gists.go (about)

     1  // Copyright 2013 The go-github AUTHORS. All rights reserved.
     2  //
     3  // Use of this source code is governed by BSD-style
     4  // license that can be found in the LICENSE file.
     5  
     6  package github
     7  
     8  import (
     9  	"context"
    10  	"fmt"
    11  	"time"
    12  )
    13  
    14  // GistsService handles communication with the Gist related
    15  // methods of the GitHub API.
    16  //
    17  // GitHub API docs: https://docs.github.com/rest/gists
    18  type GistsService service
    19  
    20  // Gist represents a GitHub's gist.
    21  type Gist struct {
    22  	ID          *string                   `json:"id,omitempty"`
    23  	Description *string                   `json:"description,omitempty"`
    24  	Public      *bool                     `json:"public,omitempty"`
    25  	Owner       *User                     `json:"owner,omitempty"`
    26  	Files       map[GistFilename]GistFile `json:"files,omitempty"`
    27  	Comments    *int                      `json:"comments,omitempty"`
    28  	HTMLURL     *string                   `json:"html_url,omitempty"`
    29  	GitPullURL  *string                   `json:"git_pull_url,omitempty"`
    30  	GitPushURL  *string                   `json:"git_push_url,omitempty"`
    31  	CreatedAt   *Timestamp                `json:"created_at,omitempty"`
    32  	UpdatedAt   *Timestamp                `json:"updated_at,omitempty"`
    33  	NodeID      *string                   `json:"node_id,omitempty"`
    34  }
    35  
    36  func (g Gist) String() string {
    37  	return Stringify(g)
    38  }
    39  
    40  // GistFilename represents filename on a gist.
    41  type GistFilename string
    42  
    43  // GistFile represents a file on a gist.
    44  type GistFile struct {
    45  	Size     *int    `json:"size,omitempty"`
    46  	Filename *string `json:"filename,omitempty"`
    47  	Language *string `json:"language,omitempty"`
    48  	Type     *string `json:"type,omitempty"`
    49  	RawURL   *string `json:"raw_url,omitempty"`
    50  	Content  *string `json:"content,omitempty"`
    51  }
    52  
    53  func (g GistFile) String() string {
    54  	return Stringify(g)
    55  }
    56  
    57  // GistCommit represents a commit on a gist.
    58  type GistCommit struct {
    59  	URL          *string      `json:"url,omitempty"`
    60  	Version      *string      `json:"version,omitempty"`
    61  	User         *User        `json:"user,omitempty"`
    62  	ChangeStatus *CommitStats `json:"change_status,omitempty"`
    63  	CommittedAt  *Timestamp   `json:"committed_at,omitempty"`
    64  	NodeID       *string      `json:"node_id,omitempty"`
    65  }
    66  
    67  func (gc GistCommit) String() string {
    68  	return Stringify(gc)
    69  }
    70  
    71  // GistFork represents a fork of a gist.
    72  type GistFork struct {
    73  	URL       *string    `json:"url,omitempty"`
    74  	User      *User      `json:"user,omitempty"`
    75  	ID        *string    `json:"id,omitempty"`
    76  	CreatedAt *Timestamp `json:"created_at,omitempty"`
    77  	UpdatedAt *Timestamp `json:"updated_at,omitempty"`
    78  	NodeID    *string    `json:"node_id,omitempty"`
    79  }
    80  
    81  func (gf GistFork) String() string {
    82  	return Stringify(gf)
    83  }
    84  
    85  // GistListOptions specifies the optional parameters to the
    86  // GistsService.List, GistsService.ListAll, and GistsService.ListStarred methods.
    87  type GistListOptions struct {
    88  	// Since filters Gists by time.
    89  	Since time.Time `url:"since,omitempty"`
    90  
    91  	ListOptions
    92  }
    93  
    94  // List gists for a user. Passing the empty string will list
    95  // all public gists if called anonymously. However, if the call
    96  // is authenticated, it will returns all gists for the authenticated
    97  // user.
    98  //
    99  // GitHub API docs: https://docs.github.com/rest/gists/gists#list-gists-for-a-user
   100  // GitHub API docs: https://docs.github.com/rest/gists/gists#list-gists-for-the-authenticated-user
   101  //
   102  //meta:operation GET /gists
   103  //meta:operation GET /users/{username}/gists
   104  func (s *GistsService) List(ctx context.Context, user string, opts *GistListOptions) ([]*Gist, *Response, error) {
   105  	var u string
   106  	if user != "" {
   107  		u = fmt.Sprintf("users/%v/gists", user)
   108  	} else {
   109  		u = "gists"
   110  	}
   111  	u, err := addOptions(u, opts)
   112  	if err != nil {
   113  		return nil, nil, err
   114  	}
   115  
   116  	req, err := s.client.NewRequest("GET", u, nil)
   117  	if err != nil {
   118  		return nil, nil, err
   119  	}
   120  
   121  	var gists []*Gist
   122  	resp, err := s.client.Do(ctx, req, &gists)
   123  	if err != nil {
   124  		return nil, resp, err
   125  	}
   126  
   127  	return gists, resp, nil
   128  }
   129  
   130  // ListAll lists all public gists.
   131  //
   132  // GitHub API docs: https://docs.github.com/rest/gists/gists#list-public-gists
   133  //
   134  //meta:operation GET /gists/public
   135  func (s *GistsService) ListAll(ctx context.Context, opts *GistListOptions) ([]*Gist, *Response, error) {
   136  	u, err := addOptions("gists/public", opts)
   137  	if err != nil {
   138  		return nil, nil, err
   139  	}
   140  
   141  	req, err := s.client.NewRequest("GET", u, nil)
   142  	if err != nil {
   143  		return nil, nil, err
   144  	}
   145  
   146  	var gists []*Gist
   147  	resp, err := s.client.Do(ctx, req, &gists)
   148  	if err != nil {
   149  		return nil, resp, err
   150  	}
   151  
   152  	return gists, resp, nil
   153  }
   154  
   155  // ListStarred lists starred gists of authenticated user.
   156  //
   157  // GitHub API docs: https://docs.github.com/rest/gists/gists#list-starred-gists
   158  //
   159  //meta:operation GET /gists/starred
   160  func (s *GistsService) ListStarred(ctx context.Context, opts *GistListOptions) ([]*Gist, *Response, error) {
   161  	u, err := addOptions("gists/starred", opts)
   162  	if err != nil {
   163  		return nil, nil, err
   164  	}
   165  
   166  	req, err := s.client.NewRequest("GET", u, nil)
   167  	if err != nil {
   168  		return nil, nil, err
   169  	}
   170  
   171  	var gists []*Gist
   172  	resp, err := s.client.Do(ctx, req, &gists)
   173  	if err != nil {
   174  		return nil, resp, err
   175  	}
   176  
   177  	return gists, resp, nil
   178  }
   179  
   180  // Get a single gist.
   181  //
   182  // GitHub API docs: https://docs.github.com/rest/gists/gists#get-a-gist
   183  //
   184  //meta:operation GET /gists/{gist_id}
   185  func (s *GistsService) Get(ctx context.Context, id string) (*Gist, *Response, error) {
   186  	u := fmt.Sprintf("gists/%v", id)
   187  	req, err := s.client.NewRequest("GET", u, nil)
   188  	if err != nil {
   189  		return nil, nil, err
   190  	}
   191  
   192  	gist := new(Gist)
   193  	resp, err := s.client.Do(ctx, req, gist)
   194  	if err != nil {
   195  		return nil, resp, err
   196  	}
   197  
   198  	return gist, resp, nil
   199  }
   200  
   201  // GetRevision gets a specific revision of a gist.
   202  //
   203  // GitHub API docs: https://docs.github.com/rest/gists/gists#get-a-gist-revision
   204  //
   205  //meta:operation GET /gists/{gist_id}/{sha}
   206  func (s *GistsService) GetRevision(ctx context.Context, id, sha string) (*Gist, *Response, error) {
   207  	u := fmt.Sprintf("gists/%v/%v", id, sha)
   208  	req, err := s.client.NewRequest("GET", u, nil)
   209  	if err != nil {
   210  		return nil, nil, err
   211  	}
   212  
   213  	gist := new(Gist)
   214  	resp, err := s.client.Do(ctx, req, gist)
   215  	if err != nil {
   216  		return nil, resp, err
   217  	}
   218  
   219  	return gist, resp, nil
   220  }
   221  
   222  // Create a gist for authenticated user.
   223  //
   224  // GitHub API docs: https://docs.github.com/rest/gists/gists#create-a-gist
   225  //
   226  //meta:operation POST /gists
   227  func (s *GistsService) Create(ctx context.Context, gist *Gist) (*Gist, *Response, error) {
   228  	u := "gists"
   229  	req, err := s.client.NewRequest("POST", u, gist)
   230  	if err != nil {
   231  		return nil, nil, err
   232  	}
   233  
   234  	g := new(Gist)
   235  	resp, err := s.client.Do(ctx, req, g)
   236  	if err != nil {
   237  		return nil, resp, err
   238  	}
   239  
   240  	return g, resp, nil
   241  }
   242  
   243  // Edit a gist.
   244  //
   245  // GitHub API docs: https://docs.github.com/rest/gists/gists#update-a-gist
   246  //
   247  //meta:operation PATCH /gists/{gist_id}
   248  func (s *GistsService) Edit(ctx context.Context, id string, gist *Gist) (*Gist, *Response, error) {
   249  	u := fmt.Sprintf("gists/%v", id)
   250  	req, err := s.client.NewRequest("PATCH", u, gist)
   251  	if err != nil {
   252  		return nil, nil, err
   253  	}
   254  
   255  	g := new(Gist)
   256  	resp, err := s.client.Do(ctx, req, g)
   257  	if err != nil {
   258  		return nil, resp, err
   259  	}
   260  
   261  	return g, resp, nil
   262  }
   263  
   264  // ListCommits lists commits of a gist.
   265  //
   266  // GitHub API docs: https://docs.github.com/rest/gists/gists#list-gist-commits
   267  //
   268  //meta:operation GET /gists/{gist_id}/commits
   269  func (s *GistsService) ListCommits(ctx context.Context, id string, opts *ListOptions) ([]*GistCommit, *Response, error) {
   270  	u := fmt.Sprintf("gists/%v/commits", id)
   271  	u, err := addOptions(u, opts)
   272  	if err != nil {
   273  		return nil, nil, err
   274  	}
   275  
   276  	req, err := s.client.NewRequest("GET", u, nil)
   277  	if err != nil {
   278  		return nil, nil, err
   279  	}
   280  
   281  	var gistCommits []*GistCommit
   282  	resp, err := s.client.Do(ctx, req, &gistCommits)
   283  	if err != nil {
   284  		return nil, resp, err
   285  	}
   286  
   287  	return gistCommits, resp, nil
   288  }
   289  
   290  // Delete a gist.
   291  //
   292  // GitHub API docs: https://docs.github.com/rest/gists/gists#delete-a-gist
   293  //
   294  //meta:operation DELETE /gists/{gist_id}
   295  func (s *GistsService) Delete(ctx context.Context, id string) (*Response, error) {
   296  	u := fmt.Sprintf("gists/%v", id)
   297  	req, err := s.client.NewRequest("DELETE", u, nil)
   298  	if err != nil {
   299  		return nil, err
   300  	}
   301  
   302  	return s.client.Do(ctx, req, nil)
   303  }
   304  
   305  // Star a gist on behalf of authenticated user.
   306  //
   307  // GitHub API docs: https://docs.github.com/rest/gists/gists#star-a-gist
   308  //
   309  //meta:operation PUT /gists/{gist_id}/star
   310  func (s *GistsService) Star(ctx context.Context, id string) (*Response, error) {
   311  	u := fmt.Sprintf("gists/%v/star", id)
   312  	req, err := s.client.NewRequest("PUT", u, nil)
   313  	if err != nil {
   314  		return nil, err
   315  	}
   316  
   317  	return s.client.Do(ctx, req, nil)
   318  }
   319  
   320  // Unstar a gist on a behalf of authenticated user.
   321  //
   322  // GitHub API docs: https://docs.github.com/rest/gists/gists#unstar-a-gist
   323  //
   324  //meta:operation DELETE /gists/{gist_id}/star
   325  func (s *GistsService) Unstar(ctx context.Context, id string) (*Response, error) {
   326  	u := fmt.Sprintf("gists/%v/star", id)
   327  	req, err := s.client.NewRequest("DELETE", u, nil)
   328  	if err != nil {
   329  		return nil, err
   330  	}
   331  
   332  	return s.client.Do(ctx, req, nil)
   333  }
   334  
   335  // IsStarred checks if a gist is starred by authenticated user.
   336  //
   337  // GitHub API docs: https://docs.github.com/rest/gists/gists#check-if-a-gist-is-starred
   338  //
   339  //meta:operation GET /gists/{gist_id}/star
   340  func (s *GistsService) IsStarred(ctx context.Context, id string) (bool, *Response, error) {
   341  	u := fmt.Sprintf("gists/%v/star", id)
   342  	req, err := s.client.NewRequest("GET", u, nil)
   343  	if err != nil {
   344  		return false, nil, err
   345  	}
   346  
   347  	resp, err := s.client.Do(ctx, req, nil)
   348  	starred, err := parseBoolResponse(err)
   349  	return starred, resp, err
   350  }
   351  
   352  // Fork a gist.
   353  //
   354  // GitHub API docs: https://docs.github.com/rest/gists/gists#fork-a-gist
   355  //
   356  //meta:operation POST /gists/{gist_id}/forks
   357  func (s *GistsService) Fork(ctx context.Context, id string) (*Gist, *Response, error) {
   358  	u := fmt.Sprintf("gists/%v/forks", id)
   359  	req, err := s.client.NewRequest("POST", u, nil)
   360  	if err != nil {
   361  		return nil, nil, err
   362  	}
   363  
   364  	g := new(Gist)
   365  	resp, err := s.client.Do(ctx, req, g)
   366  	if err != nil {
   367  		return nil, resp, err
   368  	}
   369  
   370  	return g, resp, nil
   371  }
   372  
   373  // ListForks lists forks of a gist.
   374  //
   375  // GitHub API docs: https://docs.github.com/rest/gists/gists#list-gist-forks
   376  //
   377  //meta:operation GET /gists/{gist_id}/forks
   378  func (s *GistsService) ListForks(ctx context.Context, id string, opts *ListOptions) ([]*GistFork, *Response, error) {
   379  	u := fmt.Sprintf("gists/%v/forks", id)
   380  	u, err := addOptions(u, opts)
   381  	if err != nil {
   382  		return nil, nil, err
   383  	}
   384  
   385  	req, err := s.client.NewRequest("GET", u, nil)
   386  	if err != nil {
   387  		return nil, nil, err
   388  	}
   389  
   390  	var gistForks []*GistFork
   391  	resp, err := s.client.Do(ctx, req, &gistForks)
   392  	if err != nil {
   393  		return nil, resp, err
   394  	}
   395  
   396  	return gistForks, resp, nil
   397  }