-
Notifications
You must be signed in to change notification settings - Fork 949
/
setup.ts
132 lines (113 loc) · 3.92 KB
/
setup.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import bodyParser from "body-parser";
import { exec } from "child_process";
import { Request, Response } from "express";
import updateDotenv from "update-dotenv";
import { Probot } from "../probot";
import { ManifestCreation } from "../manifest-creation";
import { getLoggingMiddleware } from "../server/logging-middleware";
import { ApplicationFunctionOptions } from "../types";
export const setupAppFactory = (
host: string | undefined,
port: number | undefined
) =>
async function setupApp(
app: Probot,
{ getRouter }: ApplicationFunctionOptions
) {
const setup: ManifestCreation = new ManifestCreation();
// If not on Glitch or Production, create a smee URL
if (
process.env.NODE_ENV !== "production" &&
!(process.env.PROJECT_DOMAIN || process.env.WEBHOOK_PROXY_URL || process.env.NO_SMEE_SETUP === 'true')
) {
await setup.createWebhookChannel();
}
if (!getRouter) {
throw new Error("getRouter is required to use the setup app");
}
const route = getRouter();
route.use(getLoggingMiddleware(app.log));
printWelcomeMessage(app, host, port);
route.get("/probot", async (req, res) => {
const baseUrl = getBaseUrl(req);
const pkg = setup.pkg;
const manifest = setup.getManifest(pkg, baseUrl);
const createAppUrl = setup.createAppUrl;
// Pass the manifest to be POST'd
res.render("setup.hbs", { pkg, createAppUrl, manifest });
});
route.get("/probot/setup", async (req: Request, res: Response) => {
const { code } = req.query;
const response = await setup.createAppFromCode(code);
// If using glitch, restart the app
if (process.env.PROJECT_DOMAIN) {
exec("refresh", (error) => {
if (error) {
app.log.error(error);
}
});
} else {
printRestartMessage(app);
}
res.redirect(`${response}/installations/new`);
});
route.get("/probot/import", async (_req, res) => {
const { WEBHOOK_PROXY_URL, GHE_HOST } = process.env;
const GH_HOST = `https://${GHE_HOST ?? "github.com"}`;
res.render("import.hbs", { WEBHOOK_PROXY_URL, GH_HOST });
});
route.post("/probot/import", bodyParser.json(), async (req, res) => {
const { appId, pem, webhook_secret } = req.body;
if (!appId || !pem || !webhook_secret) {
res.status(400).send("appId and/or pem and/or webhook_secret missing");
return;
}
updateDotenv({
APP_ID: appId,
PRIVATE_KEY: `"${pem}"`,
WEBHOOK_SECRET: webhook_secret,
});
res.end();
printRestartMessage(app);
});
route.get("/probot/success", async (req, res) => {
res.render("success.hbs");
});
route.get("/", (req, res, next) => res.redirect("/probot"));
};
function printWelcomeMessage(
app: Probot,
host: string | undefined,
port: number | undefined
) {
// use glitch env to get correct domain welcome message
// https://glitch.com/help/project/
const domain =
process.env.PROJECT_DOMAIN ||
`http://${host ?? "localhost"}:${port || 3000}`;
[
``,
`Welcome to Probot!`,
`Probot is in setup mode, webhooks cannot be received and`,
`custom routes will not work until APP_ID and PRIVATE_KEY`,
`are configured in .env.`,
`Please follow the instructions at ${domain} to configure .env.`,
`Once you are done, restart the server.`,
``,
].forEach((line) => {
app.log.info(line);
});
}
function printRestartMessage(app: Probot) {
app.log.info("");
app.log.info("Probot has been set up, please restart the server!");
app.log.info("");
}
function getBaseUrl(req: Request): string {
const protocols = req.headers["x-forwarded-proto"] || req.protocol;
const protocol =
typeof protocols === "string" ? protocols.split(",")[0] : protocols[0];
const host = req.headers["x-forwarded-host"] || req.get("host");
const baseUrl = `${protocol}://${host}`;
return baseUrl;
}