send mail when booking is confirmed or rejected

This commit is contained in:
Thomas Ruoff
2020-11-03 21:50:12 +01:00
parent acf0366d9b
commit b283ffe476
2 changed files with 151 additions and 67 deletions

View File

@@ -18,7 +18,138 @@ if (!FROM_EMAIL) {
throw new Error('No FROM_EMAIL set!') throw new Error('No FROM_EMAIL set!')
} }
async function sendMail(data: object) { const footer = `
Viele Grüße
Thomas Ruoff
Pfadi Bussle Wart
Tel. 0151/212 253 62
`
function getReceivedBookingBookerText(booking: BookingDocument) {
return `Hallo liebe/r ${booking.booker.name},
Vielen Dank für Deine Buchung. Nach Prüfung bestätigen wir die Buchung bald per E-Mail!
Du kannst sie jederzeit unter
${getBaseURL()}/booking/${booking.uuid}
einsehen und auch stornieren.
${footer}
`
}
function getBookingConfirmedText(booking: BookingDocument) {
return `Hallo liebe/r ${booking.booker.name},
deine Buchung ist bestätigt!
Bitte melde dich spätestens 7 Tage vor dem Buchungstermin per E-Mail oder Telefon
um eine Schlüsselübergabe zu vereinbaren.
Du kannst deine Buchung weiterhin unter ${getBaseURL()}/booking/${booking.uuid}
einsehen und stornieren.
${footer}
`
}
function getBookingRejectedText(booking: BookingDocument) {
return `Hallo liebe/r ${booking.booker.name},
deine Buchung konnte leider nicht bestätigt werden.
Du kannst versuchen einen anderen Termin auf ${getBaseURL} zu buchen.
${footer}
`
}
function getReceivedBookingAdminText(booking: { uuid: string }) {
return `Hallo lieber Admin,
es ging folgende Buchung ein: ${getBaseURL()}/admin/booking/${booking.uuid}
MfG`
}
export async function sendReceivedBookingAdminMail(booking: BookingDocument) {
try {
await sendMail({
to: [{ email: ADMIN_EMAIL }],
from: { email: FROM_EMAIL, name: 'Pfadi-Bussle Wart' },
subject: `Buchung für ${booking.days} eingegangen!`,
textPlainContent: getReceivedBookingAdminText(booking),
})
} catch (error) {
console.error(`Failed in sendReceivedBookingMail for ${booking.uuid}`)
}
}
export async function sendReceivedBookingBookerMail(booking: BookingDocument) {
try {
await sendMail({
to: [{ email: booking.booker.email, name: booking.booker.name }],
from: { email: FROM_EMAIL, name: 'Pfadi-Bussle Wart' },
subject: `Deine Pfadi-Bussle Buchung ist eingegangen!`,
textPlainContent: getReceivedBookingBookerText(booking),
})
} catch (error) {
console.error(`Failed in sendReceivedBookingMail for ${booking.uuid}`)
}
}
export async function sendBookingConfirmed(booking: BookingDocument) {
try {
await sendMail({
to: [{ email: booking.booker.email, name: booking.booker.name }],
from: { email: FROM_EMAIL, name: 'Pfadi-Bussle Wart' },
subject: `Deine Pfadi-Bussle Buchung wurde bestätigt!`,
textPlainContent: getBookingConfirmedText(booking),
})
} catch (error) {
console.error(`Failed in sendBookingConfirmedMail for ${booking.uuid}`)
}
}
export async function sendBookingRejected(booking: BookingDocument) {
try {
await sendMail({
to: [{ email: booking.booker.email, name: booking.booker.name }],
from: { email: FROM_EMAIL, name: 'Pfadi-Bussle Wart' },
subject: `Deine Pfadi-Bussle Buchung wurde abgelehnt!`,
textPlainContent: getBookingRejectedText(booking),
})
} catch (error) {
console.error(`Failed in sendBookingRejectedMail for ${booking.uuid}`)
}
}
async function sendMail({
to,
from,
subject,
textPlainContent,
}: {
to: { email: string; name?: string }[]
from: { email: string; name?: string }
subject: string
textPlainContent: string
}) {
const data = {
personalizations: [
{
to,
},
],
from,
subject,
content: [{ type: 'text/plain', value: textPlainContent }],
}
const fetchOptions = { const fetchOptions = {
method: 'POST', method: 'POST',
headers: { headers: {
@@ -33,69 +164,3 @@ async function sendMail(data: object) {
throw new Error(`Unable to send mail`) throw new Error(`Unable to send mail`)
} }
} }
function getReceivedBookingAdminText(booking: { uuid: string }) {
return `Hallo lieber Admin,
es ging folgende Buchung ein: ${getBaseURL()}/booking/${booking.uuid}
MfG`
}
export async function sendReceivedBookingAdminMail(booking: BookingDocument) {
const data = {
personalizations: [
{
to: [{ email: ADMIN_EMAIL }],
},
],
from: { email: FROM_EMAIL, name: "Pfadi-Bussle Wart" },
subject: `Buchung für ${booking.days} eingegangen!`,
content: [{ type: 'text/plain', value: getReceivedBookingAdminText(booking) }],
}
try {
await sendMail(data)
} catch (error) {
console.error(`Failed in sendReceivedBookingMail for ${booking.uuid}`)
}
}
function getReceivedBookingBookerText(booking: BookingDocument) {
return `Hallo liebe/r ${booking.booker.name},
Vielen Dank für Deine Buchung. Nach Prüfung bestätigen wir die Buchung bald per E-Mail!
Du kannst sie jederzeit unter
${getBaseURL()}/booking/${booking.uuid}
einsehen und auch stornieren.
Viele Grüße
Thomas Ruoff
Pfadi Bussle Wart
Tel. 0151/212 253 62
`
}
export async function sendReceivedBookingBookerMail(booking: BookingDocument) {
const data = {
personalizations: [
{
to: [{ email: booking.booker.email, name: booking.booker.name }],
},
],
from: { email: FROM_EMAIL, name: "Pfadi-Bussle Wart" },
subject: `Deine Buchung ist eingegangen!`,
content: [{ type: 'text/plain', value: getReceivedBookingBookerText(booking) }],
}
try {
await sendMail(data)
} catch (error) {
console.error(`Failed in sendReceivedBookingMail for ${booking.uuid}`)
}
}

View File

@@ -1,6 +1,11 @@
import { BookingDocument } from '../../../../../db/booking' import { BookingDocument } from '../../../../../db/booking'
import { getBookingByUUID } from '../../../../../db/index' import { getBookingByUUID } from '../../../../../db/index'
import withSession, { isAdminSession } from '../../../../../lib/session' import withSession, { isAdminSession } from '../../../../../lib/session'
import {
sendBookingConfirmed,
sendBookingRejected,
} from '../../../../../helpers/mail'
import { BOOKING_STATUS } from '../../../../../db/enums'
export default withSession(async function bookingHandler(req, res) { export default withSession(async function bookingHandler(req, res) {
if (!isAdminSession(req, res)) { if (!isAdminSession(req, res)) {
@@ -22,11 +27,25 @@ export default withSession(async function bookingHandler(req, res) {
// FIXME: validate all the things // FIXME: validate all the things
booking.set(req.body) booking.set(req.body)
const bookingStatusChanged = booking.isModified('status')
await booking.save() await booking.save()
await booking.populate('booker').execPopulate() await booking.populate('booker').execPopulate()
res.status(200).json(booking.toJSON()) res.status(200).json(booking.toJSON())
if (!bookingStatusChanged) {
return
}
if (booking.status === BOOKING_STATUS.CONFIRMED) {
sendBookingConfirmed(booking)
} else if (booking.status === BOOKING_STATUS.REJECTED) {
sendBookingRejected(booking)
}
break break
default: default:
res.setHeader('Allow', ['PATCH']) res.setHeader('Allow', ['PATCH'])