generated from nhcarrigan/template
This commit is contained in:
@@ -0,0 +1,678 @@
|
||||
/**
|
||||
* @copyright NHCarrigan
|
||||
* @license Naomi's Public License
|
||||
* @author Naomi Carrigan
|
||||
*/
|
||||
|
||||
/* eslint-disable @typescript-eslint/naming-convention, max-lines -- These are API interfaces. */
|
||||
|
||||
interface Issue {
|
||||
id: number;
|
||||
node_id: string;
|
||||
url: string;
|
||||
repository_url: string;
|
||||
labels_url: string;
|
||||
comments_url: string;
|
||||
events_url: string;
|
||||
html_url: string;
|
||||
number: number;
|
||||
state: string;
|
||||
title: string;
|
||||
body: string;
|
||||
user: {
|
||||
login: string;
|
||||
id: number;
|
||||
node_id: string;
|
||||
avatar_url: string;
|
||||
gravatar_id: string;
|
||||
url: string;
|
||||
html_url: string;
|
||||
followers_url: string;
|
||||
following_url: string;
|
||||
gists_url: string;
|
||||
starred_url: string;
|
||||
subscriptions_url: string;
|
||||
organizations_url: string;
|
||||
repos_url: string;
|
||||
events_url: string;
|
||||
received_events_url: string;
|
||||
type: string;
|
||||
site_admin: boolean;
|
||||
};
|
||||
labels: Array<{
|
||||
id: number;
|
||||
node_id: string;
|
||||
url: string;
|
||||
name: string;
|
||||
description: string;
|
||||
color: string;
|
||||
default: boolean;
|
||||
}>;
|
||||
assignee: {
|
||||
login: string;
|
||||
id: number;
|
||||
node_id: string;
|
||||
avatar_url: string;
|
||||
gravatar_id: string;
|
||||
url: string;
|
||||
html_url: string;
|
||||
followers_url: string;
|
||||
following_url: string;
|
||||
gists_url: string;
|
||||
starred_url: string;
|
||||
subscriptions_url: string;
|
||||
organizations_url: string;
|
||||
repos_url: string;
|
||||
events_url: string;
|
||||
received_events_url: string;
|
||||
type: string;
|
||||
site_admin: boolean;
|
||||
};
|
||||
assignees: Array<{
|
||||
login: string;
|
||||
id: number;
|
||||
node_id: string;
|
||||
avatar_url: string;
|
||||
gravatar_id: string;
|
||||
url: string;
|
||||
html_url: string;
|
||||
followers_url: string;
|
||||
following_url: string;
|
||||
gists_url: string;
|
||||
starred_url: string;
|
||||
subscriptions_url: string;
|
||||
organizations_url: string;
|
||||
repos_url: string;
|
||||
events_url: string;
|
||||
received_events_url: string;
|
||||
type: string;
|
||||
site_admin: boolean;
|
||||
}>;
|
||||
milestone: {
|
||||
url: string;
|
||||
html_url: string;
|
||||
labels_url: string;
|
||||
id: number;
|
||||
node_id: string;
|
||||
number: number;
|
||||
state: string;
|
||||
title: string;
|
||||
description: string;
|
||||
creator: {
|
||||
login: string;
|
||||
id: number;
|
||||
node_id: string;
|
||||
avatar_url: string;
|
||||
gravatar_id: string;
|
||||
url: string;
|
||||
html_url: string;
|
||||
followers_url: string;
|
||||
following_url: string;
|
||||
gists_url: string;
|
||||
starred_url: string;
|
||||
subscriptions_url: string;
|
||||
organizations_url: string;
|
||||
repos_url: string;
|
||||
events_url: string;
|
||||
received_events_url: string;
|
||||
type: string;
|
||||
site_admin: boolean;
|
||||
};
|
||||
open_issues: number;
|
||||
closed_issues: number;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
closed_at: string;
|
||||
due_on: string;
|
||||
};
|
||||
locked: boolean;
|
||||
active_lock_reason: string;
|
||||
comments: number;
|
||||
pull_request: {
|
||||
url: string;
|
||||
html_url: string;
|
||||
diff_url: string;
|
||||
patch_url: string;
|
||||
};
|
||||
closed_at: unknown;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
closed_by: {
|
||||
login: string;
|
||||
id: number;
|
||||
node_id: string;
|
||||
avatar_url: string;
|
||||
gravatar_id: string;
|
||||
url: string;
|
||||
html_url: string;
|
||||
followers_url: string;
|
||||
following_url: string;
|
||||
gists_url: string;
|
||||
starred_url: string;
|
||||
subscriptions_url: string;
|
||||
organizations_url: string;
|
||||
repos_url: string;
|
||||
events_url: string;
|
||||
received_events_url: string;
|
||||
type: string;
|
||||
site_admin: boolean;
|
||||
};
|
||||
author_association: string;
|
||||
state_reason: string;
|
||||
}
|
||||
|
||||
interface IssueCreated {
|
||||
action: "opened";
|
||||
issue: Issue;
|
||||
}
|
||||
|
||||
interface PullRequest {
|
||||
url: string;
|
||||
id: number;
|
||||
node_id: string;
|
||||
html_url: string;
|
||||
diff_url: string;
|
||||
patch_url: string;
|
||||
issue_url: string;
|
||||
commits_url: string;
|
||||
review_comments_url: string;
|
||||
review_comment_url: string;
|
||||
comments_url: string;
|
||||
statuses_url: string;
|
||||
number: number;
|
||||
state: string;
|
||||
locked: boolean;
|
||||
title: string;
|
||||
user: {
|
||||
login: string;
|
||||
id: number;
|
||||
node_id: string;
|
||||
avatar_url: string;
|
||||
gravatar_id: string;
|
||||
url: string;
|
||||
html_url: string;
|
||||
followers_url: string;
|
||||
following_url: string;
|
||||
gists_url: string;
|
||||
starred_url: string;
|
||||
subscriptions_url: string;
|
||||
organizations_url: string;
|
||||
repos_url: string;
|
||||
events_url: string;
|
||||
received_events_url: string;
|
||||
type: string;
|
||||
site_admin: boolean;
|
||||
};
|
||||
body: string;
|
||||
labels: Array<{
|
||||
id: number;
|
||||
node_id: string;
|
||||
url: string;
|
||||
name: string;
|
||||
description: string;
|
||||
color: string;
|
||||
default: boolean;
|
||||
}>;
|
||||
milestone: {
|
||||
url: string;
|
||||
html_url: string;
|
||||
labels_url: string;
|
||||
id: number;
|
||||
node_id: string;
|
||||
number: number;
|
||||
state: string;
|
||||
title: string;
|
||||
description: string;
|
||||
creator: {
|
||||
login: string;
|
||||
id: number;
|
||||
node_id: string;
|
||||
avatar_url: string;
|
||||
gravatar_id: string;
|
||||
url: string;
|
||||
html_url: string;
|
||||
followers_url: string;
|
||||
following_url: string;
|
||||
gists_url: string;
|
||||
starred_url: string;
|
||||
subscriptions_url: string;
|
||||
organizations_url: string;
|
||||
repos_url: string;
|
||||
events_url: string;
|
||||
received_events_url: string;
|
||||
type: string;
|
||||
site_admin: boolean;
|
||||
};
|
||||
open_issues: number;
|
||||
closed_issues: number;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
closed_at: string;
|
||||
due_on: string;
|
||||
};
|
||||
active_lock_reason: string;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
closed_at: string;
|
||||
merged_at: string;
|
||||
merge_commit_sha: string;
|
||||
assignee: {
|
||||
login: string;
|
||||
id: number;
|
||||
node_id: string;
|
||||
avatar_url: string;
|
||||
gravatar_id: string;
|
||||
url: string;
|
||||
html_url: string;
|
||||
followers_url: string;
|
||||
following_url: string;
|
||||
gists_url: string;
|
||||
starred_url: string;
|
||||
subscriptions_url: string;
|
||||
organizations_url: string;
|
||||
repos_url: string;
|
||||
events_url: string;
|
||||
received_events_url: string;
|
||||
type: string;
|
||||
site_admin: boolean;
|
||||
};
|
||||
assignees: Array<{
|
||||
login: string;
|
||||
id: number;
|
||||
node_id: string;
|
||||
avatar_url: string;
|
||||
gravatar_id: string;
|
||||
url: string;
|
||||
html_url: string;
|
||||
followers_url: string;
|
||||
following_url: string;
|
||||
gists_url: string;
|
||||
starred_url: string;
|
||||
subscriptions_url: string;
|
||||
organizations_url: string;
|
||||
repos_url: string;
|
||||
events_url: string;
|
||||
received_events_url: string;
|
||||
type: string;
|
||||
site_admin: boolean;
|
||||
}>;
|
||||
requested_reviewers: Array<{
|
||||
login: string;
|
||||
id: number;
|
||||
node_id: string;
|
||||
avatar_url: string;
|
||||
gravatar_id: string;
|
||||
url: string;
|
||||
html_url: string;
|
||||
followers_url: string;
|
||||
following_url: string;
|
||||
gists_url: string;
|
||||
starred_url: string;
|
||||
subscriptions_url: string;
|
||||
organizations_url: string;
|
||||
repos_url: string;
|
||||
events_url: string;
|
||||
received_events_url: string;
|
||||
type: string;
|
||||
site_admin: boolean;
|
||||
}>;
|
||||
requested_teams: Array<{
|
||||
id: number;
|
||||
node_id: string;
|
||||
url: string;
|
||||
html_url: string;
|
||||
name: string;
|
||||
slug: string;
|
||||
description: string;
|
||||
privacy: string;
|
||||
notification_setting: string;
|
||||
permission: string;
|
||||
members_url: string;
|
||||
repositories_url: string;
|
||||
}>;
|
||||
head: {
|
||||
label: string;
|
||||
ref: string;
|
||||
sha: string;
|
||||
user: {
|
||||
login: string;
|
||||
id: number;
|
||||
node_id: string;
|
||||
avatar_url: string;
|
||||
gravatar_id: string;
|
||||
url: string;
|
||||
html_url: string;
|
||||
followers_url: string;
|
||||
following_url: string;
|
||||
gists_url: string;
|
||||
starred_url: string;
|
||||
subscriptions_url: string;
|
||||
organizations_url: string;
|
||||
repos_url: string;
|
||||
events_url: string;
|
||||
received_events_url: string;
|
||||
type: string;
|
||||
site_admin: boolean;
|
||||
};
|
||||
repo: {
|
||||
id: number;
|
||||
node_id: string;
|
||||
name: string;
|
||||
full_name: string;
|
||||
owner: {
|
||||
login: string;
|
||||
id: number;
|
||||
node_id: string;
|
||||
avatar_url: string;
|
||||
gravatar_id: string;
|
||||
url: string;
|
||||
html_url: string;
|
||||
followers_url: string;
|
||||
following_url: string;
|
||||
gists_url: string;
|
||||
starred_url: string;
|
||||
subscriptions_url: string;
|
||||
organizations_url: string;
|
||||
repos_url: string;
|
||||
events_url: string;
|
||||
received_events_url: string;
|
||||
type: string;
|
||||
site_admin: boolean;
|
||||
};
|
||||
private: boolean;
|
||||
html_url: string;
|
||||
description: string;
|
||||
fork: boolean;
|
||||
url: string;
|
||||
archive_url: string;
|
||||
assignees_url: string;
|
||||
blobs_url: string;
|
||||
branches_url: string;
|
||||
collaborators_url: string;
|
||||
comments_url: string;
|
||||
commits_url: string;
|
||||
compare_url: string;
|
||||
contents_url: string;
|
||||
contributors_url: string;
|
||||
deployments_url: string;
|
||||
downloads_url: string;
|
||||
events_url: string;
|
||||
forks_url: string;
|
||||
git_commits_url: string;
|
||||
git_refs_url: string;
|
||||
git_tags_url: string;
|
||||
git_url: string;
|
||||
issue_comment_url: string;
|
||||
issue_events_url: string;
|
||||
issues_url: string;
|
||||
keys_url: string;
|
||||
labels_url: string;
|
||||
languages_url: string;
|
||||
merges_url: string;
|
||||
milestones_url: string;
|
||||
notifications_url: string;
|
||||
pulls_url: string;
|
||||
releases_url: string;
|
||||
ssh_url: string;
|
||||
stargazers_url: string;
|
||||
statuses_url: string;
|
||||
subscribers_url: string;
|
||||
subscription_url: string;
|
||||
tags_url: string;
|
||||
teams_url: string;
|
||||
trees_url: string;
|
||||
clone_url: string;
|
||||
mirror_url: string;
|
||||
hooks_url: string;
|
||||
svn_url: string;
|
||||
homepage: string;
|
||||
language: unknown;
|
||||
forks_count: number;
|
||||
stargazers_count: number;
|
||||
watchers_count: number;
|
||||
size: number;
|
||||
default_branch: string;
|
||||
open_issues_count: number;
|
||||
topics: Array<string>;
|
||||
has_issues: boolean;
|
||||
has_projects: boolean;
|
||||
has_wiki: boolean;
|
||||
has_pages: boolean;
|
||||
has_downloads: boolean;
|
||||
has_discussions: boolean;
|
||||
archived: boolean;
|
||||
disabled: boolean;
|
||||
pushed_at: string;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
permissions: {
|
||||
admin: boolean;
|
||||
push: boolean;
|
||||
pull: boolean;
|
||||
};
|
||||
allow_rebase_merge: boolean;
|
||||
temp_clone_token: string;
|
||||
allow_squash_merge: boolean;
|
||||
allow_merge_commit: boolean;
|
||||
allow_forking: boolean;
|
||||
forks: number;
|
||||
open_issues: number;
|
||||
license: {
|
||||
key: string;
|
||||
name: string;
|
||||
url: string;
|
||||
spdx_id: string;
|
||||
node_id: string;
|
||||
};
|
||||
watchers: number;
|
||||
};
|
||||
};
|
||||
base: {
|
||||
label: string;
|
||||
ref: string;
|
||||
sha: string;
|
||||
user: {
|
||||
login: string;
|
||||
id: number;
|
||||
node_id: string;
|
||||
avatar_url: string;
|
||||
gravatar_id: string;
|
||||
url: string;
|
||||
html_url: string;
|
||||
followers_url: string;
|
||||
following_url: string;
|
||||
gists_url: string;
|
||||
starred_url: string;
|
||||
subscriptions_url: string;
|
||||
organizations_url: string;
|
||||
repos_url: string;
|
||||
events_url: string;
|
||||
received_events_url: string;
|
||||
type: string;
|
||||
site_admin: boolean;
|
||||
};
|
||||
repo: {
|
||||
id: number;
|
||||
node_id: string;
|
||||
name: string;
|
||||
full_name: string;
|
||||
owner: {
|
||||
login: string;
|
||||
id: number;
|
||||
node_id: string;
|
||||
avatar_url: string;
|
||||
gravatar_id: string;
|
||||
url: string;
|
||||
html_url: string;
|
||||
followers_url: string;
|
||||
following_url: string;
|
||||
gists_url: string;
|
||||
starred_url: string;
|
||||
subscriptions_url: string;
|
||||
organizations_url: string;
|
||||
repos_url: string;
|
||||
events_url: string;
|
||||
received_events_url: string;
|
||||
type: string;
|
||||
site_admin: boolean;
|
||||
};
|
||||
private: boolean;
|
||||
html_url: string;
|
||||
description: string;
|
||||
fork: boolean;
|
||||
url: string;
|
||||
archive_url: string;
|
||||
assignees_url: string;
|
||||
blobs_url: string;
|
||||
branches_url: string;
|
||||
collaborators_url: string;
|
||||
comments_url: string;
|
||||
commits_url: string;
|
||||
compare_url: string;
|
||||
contents_url: string;
|
||||
contributors_url: string;
|
||||
deployments_url: string;
|
||||
downloads_url: string;
|
||||
events_url: string;
|
||||
forks_url: string;
|
||||
git_commits_url: string;
|
||||
git_refs_url: string;
|
||||
git_tags_url: string;
|
||||
git_url: string;
|
||||
issue_comment_url: string;
|
||||
issue_events_url: string;
|
||||
issues_url: string;
|
||||
keys_url: string;
|
||||
labels_url: string;
|
||||
languages_url: string;
|
||||
merges_url: string;
|
||||
milestones_url: string;
|
||||
notifications_url: string;
|
||||
pulls_url: string;
|
||||
releases_url: string;
|
||||
ssh_url: string;
|
||||
stargazers_url: string;
|
||||
statuses_url: string;
|
||||
subscribers_url: string;
|
||||
subscription_url: string;
|
||||
tags_url: string;
|
||||
teams_url: string;
|
||||
trees_url: string;
|
||||
clone_url: string;
|
||||
mirror_url: string;
|
||||
hooks_url: string;
|
||||
svn_url: string;
|
||||
homepage: string;
|
||||
language: unknown;
|
||||
forks_count: number;
|
||||
stargazers_count: number;
|
||||
watchers_count: number;
|
||||
size: number;
|
||||
default_branch: string;
|
||||
open_issues_count: number;
|
||||
topics: Array<string>;
|
||||
has_issues: boolean;
|
||||
has_projects: boolean;
|
||||
has_wiki: boolean;
|
||||
has_pages: boolean;
|
||||
has_downloads: boolean;
|
||||
has_discussions: boolean;
|
||||
archived: boolean;
|
||||
disabled: boolean;
|
||||
pushed_at: string;
|
||||
created_at: string;
|
||||
updated_at: string;
|
||||
permissions: {
|
||||
admin: boolean;
|
||||
push: boolean;
|
||||
pull: boolean;
|
||||
};
|
||||
allow_rebase_merge: boolean;
|
||||
temp_clone_token: string;
|
||||
allow_squash_merge: boolean;
|
||||
allow_merge_commit: boolean;
|
||||
forks: number;
|
||||
open_issues: number;
|
||||
license: {
|
||||
key: string;
|
||||
name: string;
|
||||
url: string;
|
||||
spdx_id: string;
|
||||
node_id: string;
|
||||
};
|
||||
watchers: number;
|
||||
};
|
||||
};
|
||||
_links: {
|
||||
self: {
|
||||
href: string;
|
||||
};
|
||||
html: {
|
||||
href: string;
|
||||
};
|
||||
issue: {
|
||||
href: string;
|
||||
};
|
||||
comments: {
|
||||
href: string;
|
||||
};
|
||||
review_comments: {
|
||||
href: string;
|
||||
};
|
||||
review_comment: {
|
||||
href: string;
|
||||
};
|
||||
commits: {
|
||||
href: string;
|
||||
};
|
||||
statuses: {
|
||||
href: string;
|
||||
};
|
||||
};
|
||||
author_association: string;
|
||||
auto_merge: unknown;
|
||||
draft: boolean;
|
||||
merged: boolean;
|
||||
mergeable: boolean;
|
||||
rebaseable: boolean;
|
||||
mergeable_state: string;
|
||||
merged_by: {
|
||||
login: string;
|
||||
id: number;
|
||||
node_id: string;
|
||||
avatar_url: string;
|
||||
gravatar_id: string;
|
||||
url: string;
|
||||
html_url: string;
|
||||
followers_url: string;
|
||||
following_url: string;
|
||||
gists_url: string;
|
||||
starred_url: string;
|
||||
subscriptions_url: string;
|
||||
organizations_url: string;
|
||||
repos_url: string;
|
||||
events_url: string;
|
||||
received_events_url: string;
|
||||
type: string;
|
||||
site_admin: boolean;
|
||||
};
|
||||
comments: number;
|
||||
review_comments: number;
|
||||
maintainer_can_modify: boolean;
|
||||
commits: number;
|
||||
additions: number;
|
||||
deletions: number;
|
||||
changed_files: number;
|
||||
}
|
||||
|
||||
interface PullRequestCreated {
|
||||
action: "opened";
|
||||
number: number;
|
||||
pull_request: PullRequest;
|
||||
}
|
||||
|
||||
type Ping = Record<string, unknown>;
|
||||
|
||||
type GithubPayload = IssueCreated | PullRequestCreated | Ping;
|
||||
|
||||
export type { IssueCreated, PullRequestCreated, Ping, GithubPayload };
|
||||
@@ -0,0 +1,43 @@
|
||||
/**
|
||||
* @copyright NHCarrigan
|
||||
* @license Naomi's Public License
|
||||
* @author Naomi Carrigan
|
||||
*/
|
||||
|
||||
import type { IssueCreated,
|
||||
PullRequestCreated,
|
||||
GithubPayload } from "../interfaces/github.js";
|
||||
import type { FastifyRequest, FastifyReply } from "fastify";
|
||||
|
||||
const isIssue = (body: GithubPayload): body is IssueCreated => {
|
||||
return "issue" in body;
|
||||
};
|
||||
|
||||
const isPull = (body: GithubPayload): body is PullRequestCreated => {
|
||||
return "pull_request" in body;
|
||||
};
|
||||
|
||||
/**
|
||||
* Handles a payload from a GitHub webhook.
|
||||
* @param request - The Fastify request payload.
|
||||
* @param response - The Fastify reply class.
|
||||
*/
|
||||
export const processGithubEvent = async(
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention -- Fastify standard.
|
||||
request: FastifyRequest<{ Body: GithubPayload }>,
|
||||
response: FastifyReply,
|
||||
): Promise<void> => {
|
||||
const event = request.headers["x-github-event"];
|
||||
if (typeof event !== "string") {
|
||||
await response.status(400).
|
||||
send({ message: "Invalid GitHub event header." });
|
||||
return;
|
||||
}
|
||||
if (event === "ping") {
|
||||
await response.status(200).send({ message: "Pong!" });
|
||||
return;
|
||||
}
|
||||
const { action: _action } = request.body;
|
||||
isIssue(request.body);
|
||||
isPull(request.body);
|
||||
};
|
||||
@@ -5,7 +5,9 @@
|
||||
*/
|
||||
|
||||
import fastify from "fastify";
|
||||
import { processGithubEvent } from "../modules/processGitHubEvent.js";
|
||||
import { logger } from "../utils/logger.js";
|
||||
import type { GithubPayload } from "../interfaces/github.js";
|
||||
|
||||
const html = `<!DOCTYPE html>
|
||||
<html>
|
||||
@@ -62,6 +64,12 @@ export const instantiateServer = (): void => {
|
||||
response.send(html);
|
||||
});
|
||||
|
||||
server.
|
||||
// eslint-disable-next-line @typescript-eslint/naming-convention -- Fastify standard.
|
||||
post<{ Body: GithubPayload }>("/github", async(request, response) => {
|
||||
await processGithubEvent(request, response);
|
||||
});
|
||||
|
||||
server.listen({ port: 7044 }, (error) => {
|
||||
if (error) {
|
||||
void logger.error("instantiate server", error);
|
||||
|
||||
Reference in New Issue
Block a user