58 lines
1.6 KiB
JavaScript
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)
|
|
|
|
}
|
|
|
|
})
|