You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

48 lines
1.5 KiB
CoffeeScript

Promise = require "bluebird"
router = require("express-promise-router")()
moment = require "moment"
bip21 = require "bip21"
qrImage = require "qr-image"
rfr = require "rfr"
getRates = rfr "lib/get-rates"
parseAmount = rfr "lib/parse-amount"
getBip21 = (address, amount) ->
bip21.encode(address, amount: amount, label: "PDFy donation")
router.get "/", (req, res) ->
Promise.try ->
getRates()
.then (rates) ->
res.render "donate",
rates: rates
currentMonth: moment().format "MMMM YYYY"
router.get "/convert/:currency", (req, res) ->
Promise.try ->
getRates()
.then (rates) ->
# Floats for money are evil and all that, but we only need approximate numbers here, so it's all fine here. Don't do this where precision is required, though!
if req.query.amount? and req.params.currency.toUpperCase() of rates
res.send (rates[req.params.currency.toUpperCase()] * parseFloat(req.query.amount)).toString()
else
req.reportError(new Error("Unknown currency specified: #{req.params.currency}"), "warning")
Promise.reject new Http422Error "No such currency exists."
router.get "/bip21", (req, res) ->
Promise.try ->
res.send getBip21(req.appConfig.donations.bitcoinAddress, parseAmount(req.query.amount))
router.get "/bip21/qr", (req, res) ->
qrImage.image(getBip21(req.appConfig.donations.bitcoinAddress, parseAmount(req.query.amount)), type: "png", size: 3, margin: 1)
.pipe res
router.get "/faq", (req, res) ->
res.render "donation-faq"
router.get "/thanks", (req, res) ->
res.render "donate-thanks"
module.exports = router