Skip to content

Commit 43ffb6a

Browse files
authored
Add support for personal_access_token_request webhook event type (#2826)
1 parent cd43862 commit 43ffb6a

File tree

7 files changed

+467
-0
lines changed

7 files changed

+467
-0
lines changed

github/event.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ func (e *Event) ParsePayload() (payload interface{}, err error) {
9393
payload = &PackageEvent{}
9494
case "PageBuildEvent":
9595
payload = &PageBuildEvent{}
96+
case "PersonalAccessTokenRequestEvent":
97+
payload = &PersonalAccessTokenRequestEvent{}
9698
case "PingEvent":
9799
payload = &PingEvent{}
98100
case "ProjectEvent":

github/event_types.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,74 @@ type PageBuildEvent struct {
774774
Installation *Installation `json:"installation,omitempty"`
775775
}
776776

777+
// PersonalAccessTokenRequestEvent occurs when there is activity relating to a
778+
// request for a fine-grained personal access token to access resources that
779+
// belong to a resource owner that requires approval for token access.
780+
// The webhook event name is "personal_access_token_request".
781+
//
782+
// GitHub API docs: https://docs.github.com/en/webhooks-and-events/webhooks/webhook-events-and-payloads#personal_access_token_request
783+
type PersonalAccessTokenRequestEvent struct {
784+
// Action is the action that was performed. Possible values are:
785+
// "approved", "cancelled", "created" or "denied"
786+
Action *string `json:"action,omitempty"`
787+
PersonalAccessTokenRequest *PersonalAccessTokenRequest `json:"personal_access_token_request,omitempty"`
788+
Org *Organization `json:"organization,omitempty"`
789+
Sender *User `json:"sender,omitempty"`
790+
Installation *Installation `json:"installation,omitempty"`
791+
}
792+
793+
// PersonalAccessTokenRequest contains the details of a PersonalAccessTokenRequestEvent.
794+
type PersonalAccessTokenRequest struct {
795+
// Unique identifier of the request for access via fine-grained personal
796+
// access token. Used as the pat_request_id parameter in the list and review
797+
// API calls.
798+
ID *int64 `json:"id,omitempty"`
799+
Owner *User `json:"owner,omitempty"`
800+
801+
// New requested permissions, categorized by type of permission.
802+
PermissionsAdded *PersonalAccessTokenPermissions `json:"permissions_added,omitempty"`
803+
804+
// Requested permissions that elevate access for a previously approved
805+
// request for access, categorized by type of permission.
806+
PermissionsUpgraded *PersonalAccessTokenPermissions `json:"permissions_upgraded,omitempty"`
807+
808+
// Permissions requested, categorized by type of permission.
809+
// This field incorporates permissions_added and permissions_upgraded.
810+
PermissionsResult *PersonalAccessTokenPermissions `json:"permissions_result,omitempty"`
811+
812+
// Type of repository selection requested. Possible values are:
813+
// "none", "all" or "subset"
814+
RepositorySelection *string `json:"repository_selection,omitempty"`
815+
816+
// The number of repositories the token is requesting access to.
817+
// This field is only populated when repository_selection is subset.
818+
RepositoryCount *int64 `json:"repository_count,omitempty"`
819+
820+
// An array of repository objects the token is requesting access to.
821+
// This field is only populated when repository_selection is subset.
822+
Repositories []*Repository `json:"repositories,omitempty"`
823+
824+
// Date and time when the request for access was created.
825+
CreatedAt *Timestamp `json:"created_at,omitempty"`
826+
827+
// Whether the associated fine-grained personal access token has expired.
828+
TokenExpired *bool `json:"token_expired,omitempty"`
829+
830+
// Date and time when the associated fine-grained personal access token expires.
831+
TokenExpiresAt *Timestamp `json:"token_expires_at,omitempty"`
832+
833+
// Date and time when the associated fine-grained personal access token was last used for authentication.
834+
TokenLastUsedAt *Timestamp `json:"token_last_used_at,omitempty"`
835+
}
836+
837+
// PersonalAccessTokenPermissions represents the original or newly requested
838+
// scope of permissions for a fine-grained personal access token within a PersonalAccessTokenRequest.
839+
type PersonalAccessTokenPermissions struct {
840+
Org map[string]string `json:"organization,omitempty"`
841+
Repo map[string]string `json:"repository,omitempty"`
842+
Other map[string]string `json:"other,omitempty"`
843+
}
844+
777845
// PingEvent is triggered when a Webhook is added to GitHub.
778846
//
779847
// GitHub API docs: https://developer.github.com/webhooks/#ping-event

github/event_types_test.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7089,6 +7089,80 @@ func TestPackageEvent_Marshal(t *testing.T) {
70897089
testJSONMarshal(t, u, want)
70907090
}
70917091

7092+
func TestPersonalAccessTokenRequestEvent_Marshal(t *testing.T) {
7093+
testJSONMarshal(t, &PersonalAccessTokenRequestEvent{}, "{}")
7094+
7095+
event := &PersonalAccessTokenRequestEvent{
7096+
Action: String("a"),
7097+
PersonalAccessTokenRequest: &PersonalAccessTokenRequest{
7098+
ID: Int64(1),
7099+
Owner: &User{Login: String("l")},
7100+
PermissionsAdded: &PersonalAccessTokenPermissions{
7101+
Org: map[string]string{"organization_events": "read"},
7102+
Repo: map[string]string{"security_events": "write"},
7103+
},
7104+
CreatedAt: &Timestamp{referenceTime},
7105+
TokenExpired: Bool(false),
7106+
TokenExpiresAt: &Timestamp{referenceTime},
7107+
TokenLastUsedAt: &Timestamp{referenceTime},
7108+
RepositoryCount: Int64(1),
7109+
RepositorySelection: String("rs"),
7110+
Repositories: []*Repository{
7111+
{
7112+
Name: String("n"),
7113+
},
7114+
},
7115+
},
7116+
Org: &Organization{Name: String("n")},
7117+
Sender: &User{
7118+
Login: String("l"),
7119+
},
7120+
Installation: &Installation{
7121+
ID: Int64(1),
7122+
},
7123+
}
7124+
7125+
want := `{
7126+
"action": "a",
7127+
"personal_access_token_request": {
7128+
"id": 1,
7129+
"owner": {
7130+
"login": "l"
7131+
},
7132+
"permissions_added": {
7133+
"organization": {
7134+
"organization_events": "read"
7135+
},
7136+
"repository": {
7137+
"security_events": "write"
7138+
}
7139+
},
7140+
"created_at": ` + referenceTimeStr + `,
7141+
"token_expired": false,
7142+
"token_expires_at": ` + referenceTimeStr + `,
7143+
"token_last_used_at": ` + referenceTimeStr + `,
7144+
"repository_count": 1,
7145+
"repository_selection": "rs",
7146+
"repositories": [
7147+
{
7148+
"name": "n"
7149+
}
7150+
]
7151+
},
7152+
"organization": {
7153+
"name": "n"
7154+
},
7155+
"sender": {
7156+
"login": "l"
7157+
},
7158+
"installation": {
7159+
"id": 1
7160+
}
7161+
}`
7162+
7163+
testJSONMarshal(t, event, want)
7164+
}
7165+
70927166
func TestPingEvent_Marshal(t *testing.T) {
70937167
testJSONMarshal(t, &PingEvent{}, "{}")
70947168

github/github-accessors.go

Lines changed: 152 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)