fbp-diffbot
Version:
Bot producing fbp-diff for Github PRs
85 lines (66 loc) • 2.32 kB
text/coffeescript
fbpDiffBot = require '..'
express = require 'express'
bodyParser = require 'body-parser'
debug = require('debug')('fbp-diffbot:app')
bluebird = require 'bluebird'
checkPr = (req, res) ->
repo = "#{req.params.owner}/#{req.params.repo}"
pr = req.params.pr
options = req.query
debug '/checkpr', repo, pr
fbpDiffBot.diffbot.checkPr req.config, repo, pr, options
.then (commentUrl) ->
return res.status(200).end()
.catch (err) ->
console.error '/checkpr', err
console.error err.stack if err.stack
code = err.code or 500
return res.status(code).end()
githubHook = (req, res) ->
eventType = req.headers['x-github-event']
repoName = req.body?.repository?.full_name
pr = req.body?.pull_request?.number
options = {}
debug '/hooks/github', eventType, req.body?.action, repoName, pr
if eventType == 'ping'
# return success, mostly useful to avoid the Github ping showing as a fail
return res.status(200).end()
if eventType != 'pull_request'
debug '/hooks/github', 'unknown event', eventType
return res.status(422).end()
fbpDiffBot.diffbot.checkPr req.config, repoName, pr, options
.then (commentUrl) ->
return res.status(200).end()
.catch (err) ->
console.error '/hooks/github', err
console.error err.stack if err.stack
code = err.code or 500
return res.status(code).end()
return res.status(404).end() # FIXME: implement
exports.getApp = getApp = (config) ->
app = express()
app.use (req, res, next) ->
req.config = config # Attach config to request, so handlers can access
next()
app.use(bodyParser.json())
app.post '/checkpr/:owner/:repo/:pr', checkPr
app.post '/hooks/github', githubHook
return app
exports.start = (override, callback) ->
config = fbpDiffBot.common.getConfig override
app = getApp config
listenApp = bluebird.promisify (port, callback) -> app.listen port, callback
fbpDiffBot.webhooks.ensureRepositoryHooks config
.catch (err) ->
console.error 'unable to register webhooks', err
return Promise.resolve []
.then (added) ->
for add in added
debug 'added webhooks', add.data.url
if not added.length
debug 'no webhook additions needed'
return listenApp config.port
.then (rr) ->
app.port = config.port
return app
.nodeify callback