1// Copyright 2013 The go-github AUTHORS. All rights reserved.
2//
3// Use of this source code is governed by a BSD-style
4// license that can be found in the LICENSE file.
5
6package github
7
8import (
9	"context"
10	"fmt"
11)
12
13// The Key type is defined in users_keys.go
14
15// ListKeys lists the deploy keys for a repository.
16//
17// GitHub API docs: https://developer.github.com/v3/repos/keys/#list
18func (s *RepositoriesService) ListKeys(ctx context.Context, owner string, repo string, opt *ListOptions) ([]*Key, *Response, error) {
19	u := fmt.Sprintf("repos/%v/%v/keys", owner, repo)
20	u, err := addOptions(u, opt)
21	if err != nil {
22		return nil, nil, err
23	}
24
25	req, err := s.client.NewRequest("GET", u, nil)
26	if err != nil {
27		return nil, nil, err
28	}
29
30	var keys []*Key
31	resp, err := s.client.Do(ctx, req, &keys)
32	if err != nil {
33		return nil, resp, err
34	}
35
36	return keys, resp, nil
37}
38
39// GetKey fetches a single deploy key.
40//
41// GitHub API docs: https://developer.github.com/v3/repos/keys/#get
42func (s *RepositoriesService) GetKey(ctx context.Context, owner string, repo string, id int64) (*Key, *Response, error) {
43	u := fmt.Sprintf("repos/%v/%v/keys/%v", owner, repo, id)
44
45	req, err := s.client.NewRequest("GET", u, nil)
46	if err != nil {
47		return nil, nil, err
48	}
49
50	key := new(Key)
51	resp, err := s.client.Do(ctx, req, key)
52	if err != nil {
53		return nil, resp, err
54	}
55
56	return key, resp, nil
57}
58
59// CreateKey adds a deploy key for a repository.
60//
61// GitHub API docs: https://developer.github.com/v3/repos/keys/#create
62func (s *RepositoriesService) CreateKey(ctx context.Context, owner string, repo string, key *Key) (*Key, *Response, error) {
63	u := fmt.Sprintf("repos/%v/%v/keys", owner, repo)
64
65	req, err := s.client.NewRequest("POST", u, key)
66	if err != nil {
67		return nil, nil, err
68	}
69
70	k := new(Key)
71	resp, err := s.client.Do(ctx, req, k)
72	if err != nil {
73		return nil, resp, err
74	}
75
76	return k, resp, nil
77}
78
79// EditKey edits a deploy key.
80//
81// GitHub API docs: https://developer.github.com/v3/repos/keys/#edit
82func (s *RepositoriesService) EditKey(ctx context.Context, owner string, repo string, id int64, key *Key) (*Key, *Response, error) {
83	u := fmt.Sprintf("repos/%v/%v/keys/%v", owner, repo, id)
84
85	req, err := s.client.NewRequest("PATCH", u, key)
86	if err != nil {
87		return nil, nil, err
88	}
89
90	k := new(Key)
91	resp, err := s.client.Do(ctx, req, k)
92	if err != nil {
93		return nil, resp, err
94	}
95
96	return k, resp, nil
97}
98
99// DeleteKey deletes a deploy key.
100//
101// GitHub API docs: https://developer.github.com/v3/repos/keys/#delete
102func (s *RepositoriesService) DeleteKey(ctx context.Context, owner string, repo string, id int64) (*Response, error) {
103	u := fmt.Sprintf("repos/%v/%v/keys/%v", owner, repo, id)
104
105	req, err := s.client.NewRequest("DELETE", u, nil)
106	if err != nil {
107		return nil, err
108	}
109
110	return s.client.Do(ctx, req, nil)
111}
112