|
1 | | -/* eslint-disable no-unused-vars */ |
2 | | - |
3 | 1 | const express = require('express') |
4 | 2 | const { createClient } = require('../../db') |
5 | 3 | const router = express.Router() |
6 | 4 | const db = createClient() |
7 | 5 | const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY) |
| 6 | +const { formatDonationAmount } = require('../../../util/format') |
| 7 | +const { validateDonationAmount } = require('../../../util/validate') |
8 | 8 |
|
9 | 9 | router.post('/create-transaction', async (req, res) => { |
10 | 10 | const { sessionId /*, email /*, campaignId, donationId */ } = req.body || {} |
@@ -42,48 +42,56 @@ router.post('/create-transaction', async (req, res) => { |
42 | 42 | // a Stripe session_id included in the URL. |
43 | 43 |
|
44 | 44 | router.post('/create-checkout-session', async (req, res) => { |
45 | | - try { |
46 | | - const acceptableCharges = [1, 2, 20, 50] |
47 | | - const { donationAmount } = req.body || {} |
48 | | - const parsedDonationAmount = parseInt(donationAmount, 10) |
| 45 | + const { donationAmount } = req.body || {} |
| 46 | + const origin = req.get('origin') |
49 | 47 |
|
50 | | - let donation |
| 48 | + const input = formatDonationAmount(donationAmount) |
| 49 | + const inputIsValid = validateDonationAmount(input) |
51 | 50 |
|
52 | | - if (parsedDonationAmount < 2) { |
53 | | - // TODO: Change to something better later. |
54 | | - donation = 150 |
55 | | - } else { |
56 | | - donation = parsedDonationAmount * 100 |
57 | | - } |
| 51 | + if (inputIsValid) { |
| 52 | + const donationAmountForStripe = input * 100 // Stripe accepts values in cents |
| 53 | + let session |
58 | 54 |
|
59 | | - if (!acceptableCharges.includes(parsedDonationAmount)) { |
60 | | - return res.status(400).send({ error: 'Invalid Amount' }) |
61 | | - } |
| 55 | + try { |
| 56 | + session = await stripe.checkout.sessions.create({ |
| 57 | + line_items: [ |
| 58 | + { |
| 59 | + price_data: { |
| 60 | + currency: 'usd', |
| 61 | + product_data: { |
| 62 | + name: 'Donation' |
| 63 | + }, |
| 64 | + unit_amount: donationAmountForStripe |
| 65 | + }, |
| 66 | + quantity: 1 |
| 67 | + } |
| 68 | + ], |
| 69 | + mode: 'payment', |
| 70 | + allow_promotion_codes: true, |
| 71 | + success_url: origin + '/complete?session_id={CHECKOUT_SESSION_ID}', |
| 72 | + cancel_url: origin |
| 73 | + }) |
| 74 | + } catch (error) { |
| 75 | + const data = { |
| 76 | + type: error.type, |
| 77 | + code: error.raw.code, |
| 78 | + url: error.raw.doc_url, |
| 79 | + message: 'An error occurred with Stripe checkout', |
| 80 | + entire_error_object: error |
| 81 | + } |
62 | 82 |
|
63 | | - const origin = req.get('origin') |
| 83 | + console.log(data) |
| 84 | + return res.status(500).json(data) |
| 85 | + } |
| 86 | + // console.log('session:', session) |
64 | 87 |
|
65 | | - const session = await stripe.checkout.sessions.create({ |
66 | | - line_items: [ |
67 | | - { |
68 | | - price_data: { |
69 | | - currency: 'usd', |
70 | | - product_data: { |
71 | | - name: 'Donation' |
72 | | - }, |
73 | | - unit_amount: donation |
74 | | - }, |
75 | | - quantity: 1 |
76 | | - } |
77 | | - ], |
78 | | - mode: 'payment', |
79 | | - allow_promotion_codes: true, |
80 | | - success_url: origin + '/complete?session_id={CHECKOUT_SESSION_ID}', |
81 | | - cancel_url: origin |
| 88 | + // the redirection happens within `DonateMoney.vue` |
| 89 | + return res.status(200).json({ url: session.url, sessionId: session.id }) |
| 90 | + } else { |
| 91 | + return res.status(400).send({ |
| 92 | + error: 'Bad request: did not create Stripe checkout session', |
| 93 | + message: 'Check backend console for possible failing reasons' |
82 | 94 | }) |
83 | | - |
84 | | - res.json({ url: session.url, sessionId: session.id }) |
85 | | - } catch (error) { |
86 | | - console.log({ error }) |
87 | 95 | } |
88 | 96 | }) |
89 | 97 |
|
|
0 commit comments