tldraw/apps/huppy/pages/api/github-event.ts

45 lines
1.5 KiB
TypeScript
Raw Normal View History

import type { WebhookEventName } from '@octokit/webhooks-types'
import { assert } from '@tldraw/utils'
import { NextApiRequest, NextApiResponse } from 'next'
import { Ctx } from '../../src/ctx'
import { NamedEvent, onGithubEvent } from '../../src/flow'
import { getAppOctokit, getInstallationToken } from '../../src/octokit'
import { wrapRequest } from '../../src/requestWrapper'
import { header } from '../../src/utils'
const handler = wrapRequest(
'/api/github-event',
async function handler(req: NextApiRequest, res: NextApiResponse) {
const app = getAppOctokit()
const eventName = header(req, 'x-github-event') as WebhookEventName
await app.webhooks.verifyAndReceive({
id: header(req, 'x-github-delivery'),
name: eventName,
signature: header(req, 'x-hub-signature-256'),
payload: JSON.stringify(req.body),
})
const event = { name: eventName, payload: req.body } as NamedEvent
assert(
'installation' in event.payload && event.payload.installation,
'event must have installation'
)
const installationId = event.payload.installation.id
const ctx: Ctx = {
app,
octokit: await app.getInstallationOctokit(Number(installationId)),
installationId: installationId,
installationToken: await getInstallationToken(app, installationId),
}
// we deliberately don't await this so that the response is sent
// immediately. we'll process the event in the background.
onGithubEvent(ctx, event)
return res.json({ ok: true })
}
)
export default handler