-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrouter.js
132 lines (111 loc) · 4.52 KB
/
router.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
const Router = require('express').Router;
const router = new Router();
const VoiceResponse = require('twilio').twiml.VoiceResponse;
var colors = require('colors');
require('dotenv').config();
const agentPhoneNumber = process.env.AGENT_PHONE_NUMBER;
const {
updatePaySession,
completePaySession,
getPaymentAmount,
startPaySession
} = require('./app');
let callSid, paymentSid;
const line = "_____________________________________________________________________";
router.post("/start-status-callback", async (request, response) => {
paymentSid = request.body.Sid;
// console.log('\n'.bgBlue);
// console.log("\nInside /start-status-callback endpoint".bgBlue);
// console.log(request.body);
// console.log('\n'.bgBlue);
response.end();
})
router.post("/complete-status-callback", async (request, response) => {
console.log(`${line}`.rainbow)
console.log("\nInside /complete-status-callback endpoint")
console.log(`Payment Complete!\n`)
console.log(request.body)
console.log(`${line}`.rainbow)
response.end();
process.exit(0);
})
function getCurrentCustomerInput(requestBody) {
switch (requestBody.Capture) {
case 'payment-card-number':
return requestBody.PaymentCardNumber;
case 'security-code':
return requestBody.SecurityCode;
case 'postal-code':
return requestBody.PaymentCardPostalCode;
case 'expiration-date':
return requestBody.ExpirationDate;
default:
return null;
}
}
router.post("/update-status-callback", async (request, response) => {
console.log(`${line}`.green);
console.log("\nInside /update-status-callback endpoint\n")
// PartialResult means that a customer is entering a field and it has
// not been filled in all the way yet
if (request.body.PartialResult) {
const currentCustomerInput = getCurrentCustomerInput(request.body)
console.log(`Customer is entering ${request.body.Capture}: ${currentCustomerInput}`)
// If there's an error, we'll retry capturing that payment step's information again.
// We use the /update-pay-session endpoint, which will update the Payment Resource to let it know
// we want to try capturing that information again.
} else if (request.body.ErrorType) {
console.log(`${line}`.red);
console.log(`Error when entering ${request.body.Capture}. Error Type: ${request.body.ErrorType}.\n`)
console.log(`${line}`.red);
await updatePaySession(request.body.Capture, callSid);
} else {
let message = `\nCustomer finished entering ${request.body.Capture}.\n`
if (request.body.Required) {
const stillNeededFields = request.body.Required.split(',');
console.log(`${message}Will capture ${stillNeededFields[0]} next ...`)
console.log(`${line}`.green);
await updatePaySession(stillNeededFields[0], callSid)
} else {
message += `All fields have been captured. Completing Pay Session ...`;
console.log(`${message}`)
console.log(`${line}`.green);
await completePaySession(callSid, paymentSid)
}
}
response.end();
})
// This closes the program in the event that one of the callers hangs up.
router.post('/end-call', (request,response) => {
console.log(`Call ended. Closing application. Restart with command: npm run start`);
response.send();
process.exit(0);
})
// We have a Twilio phone number configured to point to this endpoint
// This TwiML dials our "agent"
router.post("/twiml", (request, response) => {
response.type('xml');
// TODO MOVE CALLER ID TO .ENV?
const twiml = new VoiceResponse();
const dial = twiml.dial({
callerId: agentPhoneNumber,
action: '/end-call',
record: 'record-from-answer-dual',
});
dial.number({
statusCallbackEvent: 'answered',
statusCallback: `/dial-status-callback`
}, agentPhoneNumber)
response.send(twiml.toString());
});
// Here, we grab the parent Call SID and use it when we start the
// Payment session. The parent call is the leg in which the customer dialed
// our Twilio number (our "agent");
router.post("/dial-status-callback", async (request, response) => {
callSid = request.body.ParentCallSid;
const paymentAmount = await getPaymentAmount();
await startPaySession(paymentAmount, callSid);
await updatePaySession('payment-card-number', callSid);
response.send();
})
module.exports = router;