import { stripe } from '../context/stripe' import { prisma } from '../context/prisma' import { ses } from '../context/aws' import { updateUserAttributes } from '../utils/cognito'; // import * as R from 'colay/ramda'; export const createStripePaths = ({ apiRouter, publicRouter, }) => { publicRouter.get('/userCreated', async (req, res) => { const { body: { userAttributes, userName } } = req if (userAttributes.email) { try { await sendEmail(userAttributes.email, "Congratulations " + userName + ", you have been confirmed: "); console.log("===EMAIL SENT==="); } catch (error) { console.log(error); } try { await createAccount(event) } catch (error) { console.log(error); } // callback(null, event); } else { // Nothing to do, the user's email ID is unknown // callback(null, event); } }) apiRouter.post('/updateUsage', async (req, res) => { const { body: { username, itemId }, } = req await (stripe as any).usageRecords.create( itemId, { quantity: 1, timestamp: (Date.now() / 1000) | 0, action: 'increment' }, { idempotency_key: ''//R.uuid() } ); res.send('ok') }) apiRouter.get('/create-checkout-session', async (req, res) => { const { query: { customerId, priceId } } = req const session = await stripe.checkout.sessions.create({ customer: customerId, line_items: [ { // TODO: replace this with the `price` of the product you want to sell price: priceId, quantity: 1, }, ], payment_method_types: [ 'card', ], mode: 'subscription', // automatic_tax: {enabled: true}, success_url: `${process.env.CLIENT_CALLBACK_URL}/payment?status=success`, cancel_url: `${process.env.CLIENT_CALLBACK_URL}/payment?status=failed`, }); res.redirect(303, session.url) }); publicRouter.post( "/stripe-webhook", async (req, res) => { let event try { event = stripe.webhooks.constructEvent( req.body, req.headers["stripe-signature"] || [], process.env.STRIPE_WEBHOOK_SECRET ); } catch (err) { console.log(`⚠️ Webhook signature verification failed.`); res.sendStatus(400); return; } // Extract the data from the event. const data = event.data; console.log('webhook!', data); const eventType = event.type; switch (eventType) { case 'checkout.session.expired': case 'checkout.session.async_payment_failed': console.log('Failed Payment') break; case 'checkout.session.async_payment_succeeded': case 'checkout.session.completed': console.log('Successful Payment') break; default: break; } res.redirect(303, `${process.env.CLIENT_CALLBACK_URL}?data=${encodeURI(JSON.stringify({ name: 'ts'}))}`); } ); } const sendEmail= async (to, body) =>{ var eParams = { Destination: { ToAddresses: [to] }, Message: { Body: { Text: { Data: body } }, Subject: { Data: "Cognito Identity Provider registration completed" } }, // Replace source_email with your SES validated email address Source: process.env.SOURCE_EMAIL }; await ses.sendEmail(eParams).promise(); }; const createAccount = async (event) => { const { request: { userAttributes: { uid, email, username, name, phone, }, UserPoolId }, } = event const customer = await stripe.customers.create({ metadata: { uid }, email: email, name, phone, }); const stripeId = customer.id await updateUserAttributes({ username, attributes: { stripeId } }) return prisma.user.create({ data: { email: email, id: uid, name, username, stripeId } }) }