Skip to content

Commit a1d16e9

Browse files
committed
updates for getting ticket info
1 parent 5cca5a9 commit a1d16e9

9 files changed

+88
-32
lines changed

.dockerignore

+1
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
.eslintrc.js
44
README.md
55
Dockerfile
6+
scripts/

Dockerfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
FROM node:12.13-alpine
22
RUN mkdir -p /mustachebash
33
WORKDIR /mustachebash
4-
COPY package.json package-lock.json ./
4+
COPY package.json package-lock.json ticket-logo.png ./
55
RUN npm install --production --no-optional && \
66
npm cache clean --force
77

lib/routes/index.js

+46-17
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,28 @@ const api = require('express').Router(),
1616
guestsRouter = require('./guests'),
1717
usersRouter = require('./users');
1818

19+
const processTransactionToken = async (req, res, next) => {
20+
if(!req.query.t) return next(400);
21+
22+
let transactionId;
23+
try {
24+
({ sub: transactionId } = validateTransactionToken(req.query.t));
25+
} catch(e) {
26+
next(e);
27+
}
28+
29+
try {
30+
// eslint-disable-next-line
31+
req.ticketPairs = await getTransactionTickets(transactionId);
32+
} catch(e) {
33+
if (e.code === 'UNAUTHORIZED') return next(401);
34+
35+
next(e);
36+
}
37+
38+
next();
39+
};
40+
1941
api.use('/transactions', transactionsRouter);
2042
api.use('/sites', sitesRouter);
2143
api.use('/events', authorizeUser, eventsRouter);
@@ -24,30 +46,37 @@ api.use('/promos', promosRouter);
2446
api.use('/guests', authorizeUser, guestsRouter);
2547
api.use('/users', authorizeUser, usersRouter);
2648

49+
api.use('/mytickets', processTransactionToken);
50+
2751
api.route('/mytickets')
28-
.get(async (req, res, next) => {
29-
if(!req.query.t) return next(400);
52+
.get((req, res) => {
53+
res.json(req.ticketPairs.map(({ guest, ticket }) => {
54+
const { confirmationId, firstName, lastName } = guest,
55+
{ qrCode, name: eventName, date: eventDate } = ticket;
56+
57+
return {
58+
confirmationId,
59+
firstName,
60+
lastName,
61+
eventName,
62+
eventDate,
63+
qrCode
64+
};
65+
}));
66+
});
3067

31-
let transactionId;
68+
api.route('/mytickets/pdf')
69+
.get((req, res, next) => {
3270
try {
33-
({ sub: transactionId } = validateTransactionToken(req.query.t));
34-
} catch(e) {
35-
next(e);
36-
}
71+
const ticketsPDF = generateTicketsPDF(req.ticketPairs);
3772

38-
let tickets;
39-
try {
40-
tickets = await getTransactionTickets(transactionId);
73+
res.setHeader('Content-disposition', 'attachment; filename="Mustache Bash 2020 Tickets.pdf"');
74+
res.setHeader('Content-type', 'application/pdf');
75+
ticketsPDF.pipe(res);
76+
ticketsPDF.end();
4177
} catch(e) {
42-
if (e.code === 'UNAUTHORIZED') return next(401);
43-
4478
next(e);
4579
}
46-
47-
const ticketsPDF = generateTicketsPDF(tickets);
48-
49-
ticketsPDF.pipe(res);
50-
ticketsPDF.end();
5180
});
5281

5382
api.route('/authenticate')

lib/routes/transactions.js

+10-3
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,22 @@ transactionsRouter.route('/')
2222

2323
try {
2424
const transaction = await createTransaction({...req.body}),
25-
{ email, firstName, lastName } = transaction;
25+
{ id, email, firstName, lastName } = transaction;
2626

2727
// Send a receipt email
2828
sendReceipt(firstName, lastName, email, transaction.braintreeTransactionId, transaction.amount);
2929
// Add them to the mailing list and tag as an attendee
3030
upsertEmailSubscriber(EMAIL_LIST, {email, firstName, lastName, tags: [EMAIL_TAG]});
3131

32-
res.location(`https://${req.get('host')}${req.baseUrl}/${transaction.id}`);
33-
res.status(201).json(transaction.braintreeTransactionId);
32+
let transactionToken;
33+
try {
34+
transactionToken = await generateTransactionToken(id);
35+
} catch(e) {
36+
req.log.error(e, 'Error creating transaction token');
37+
}
38+
39+
res.location(`https://${req.get('host')}${req.baseUrl}/${id}`);
40+
res.status(201).json({confirmationId: transaction.braintreeTransactionId, token: transactionToken});
3441
} catch(e) {
3542
if(e.code === 'INVALID') {
3643
req.log.error(e);

lib/services/email.js

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ module.exports = {
2424
* @return {Promise}
2525
*/
2626
async upsertEmailSubscriber(listId, { email, firstName, lastName, tags = [] }) {
27+
return;
2728
const memberHash = md5(email.toLowerCase());
2829

2930
try {

lib/services/guests.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ module.exports = {
123123
.filter({transactionId})
124124
.eqJoin('id', r.table('tickets'), {index: 'guestId'})
125125
.filter({right: {status: 'active'}})
126-
.map({guest: r.row('left'), ticket: r.row('right')});
126+
.map({guest: r.row('left'), ticket: r.row('right').merge(row => r.table('events').get(row('eventId')).pluck('name', 'date'))});
127127

128128
const pairs = await run(query).then(cursor => cursor.toArray());
129129

lib/services/pdf.js

+27-9
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,41 @@
33
* @type {Object}
44
*/
55

6-
const PDFDocument = require('pdfkit');
6+
const path = require('path'),
7+
PDFDocument = require('pdfkit');
78

89
module.exports = {
910
generateTicketsPDF(guestsTicketsPairs) {
10-
const doc = new PDFDocument({margin: 50, autoFirstPage: false});
11+
const doc = new PDFDocument({
12+
margins: {top: 20, left: 20, right: 20, bottom: 5},
13+
autoFirstPage: false,
14+
size: [280, 400],
15+
info: {
16+
Title: 'Mustache Bash 2020 Tickets',
17+
Author: 'Mustache Bash'
18+
}
19+
});
1120

1221
guestsTicketsPairs.forEach(({ guest, ticket }) => {
1322
doc.addPage();
1423

15-
const { firstName, lastName } = guest,
16-
{ qrCode } = ticket;
24+
const { firstName, lastName, confirmationId } = guest,
25+
{ qrCode, id } = ticket;
1726

18-
doc.fontSize(20)
19-
.text('Mustache Bash 2020 - Ticket', 0, 57, {align: 'center'})
20-
.fontSize(14)
21-
.text(`for ${firstName} ${lastName}`, 0, 97, {align: 'center'})
22-
.image(qrCode, 0, 200);
27+
doc.image(path.resolve(__dirname, '../../ticket-logo.png'), 68, 20, {width: 144})
28+
.font('Helvetica')
29+
.fontSize(18)
30+
.moveDown(1)
31+
.text('March 28th, 2020', {align: 'center'})
32+
.moveDown(1)
33+
.fontSize(12)
34+
.text(`${firstName} ${lastName}`, {align: 'center'})
35+
.fontSize(8)
36+
.text(`confirmation #: ${confirmationId}`, {align: 'center'})
37+
.image(qrCode, 40, 180, {width: 200})
38+
.fontSize(8)
39+
.font('Courier')
40+
.text(id.slice(0, 8), 20, 380, {align: 'center'});
2341
});
2442

2543
return doc;

lib/services/sites.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ module.exports = {
3737
})
3838
.merge({
3939
products: r.table('products')
40-
.getAll(r.args(r.row('events')('currentTicket')))
40+
.getAll(r.args(r.row('events')('id')), {index: 'eventId'})
4141
.pluck('description', 'id', 'name', 'price', 'status')
4242
.coerceTo('array')
4343
});

ticket-logo.png

32.7 KB
Loading

0 commit comments

Comments
 (0)