www/listeners/stripe.js

58 lines
1.6 KiB
JavaScript

'use strict'
require('dotenv').config()
const fs = require('fs').promises
const express = require('express')
const app = express()
const ORDERS_DIR = `${__dirname}/../orders`
// Start webhook forwarder so we don't need a public endpoint
require('../lib/run.js')(`stripe listen --api-key '${process.env.STRIPE_RES}' --forward-to 'http://localhost:${process.env.HOOK_PORT}/' --format 'JSON'`)
// Receive that webhook
app.listen(process.env.STRIPE_LISTENER_PORT)
app.post('/', express.json(), async (req) => {
if (req.body.data.object.object==='charge') {
// Check if paid
if (!req.body.data.object.paid)
return console.log(`[${req.body.id}] Charge unpaid!`)
// Get order ID
const orderId = req.body.data.object.metadata.id
if (orderId == null)
return console.error(`[${req.body.id}] Charge has no metadata.id!`)
else
console.log(`[${req.body.id}] Charge paid for order ${orderId}`)
// Get order file
const orderFile = `${ORDERS_DIR}/${orderId}.json`
let order; try {
order = await JSON.parse(await fs.readFile(orderFile))
} catch (err) {
return console.error(`[${req.body.id}] Failed to retrieve order from ${orderFile}:\n${err}`)
}
// Save paidDate to order
try { order.paidDate = new Date()
fs.writeFile(orderFile, JSON.stringify(order,null,2))
} catch (err) {
console.error(`[${req.body.id}] Failed to write paidDate to ${orderFile}:\n${err}`)
}
// Email customer
require('../hooks/email-customer')(order)
// Ntfy sales team
require('../hooks/ntfy-sales')(order)
// Email sales team
require('../hooks/email-sales')(order)
// Remove single products from store
require('../hooks/remove-sid')(order)
}
})