From b283ffe476a01b6f32817a111381912c26e723da Mon Sep 17 00:00:00 2001 From: Thomas Ruoff Date: Tue, 3 Nov 2020 21:50:12 +0100 Subject: [PATCH] send mail when booking is confirmed or rejected --- helpers/mail.ts | 199 ++++++++++++++++-------- pages/api/admin/booking/[uuid]/index.ts | 19 +++ 2 files changed, 151 insertions(+), 67 deletions(-) diff --git a/helpers/mail.ts b/helpers/mail.ts index 5726b79..730a585 100644 --- a/helpers/mail.ts +++ b/helpers/mail.ts @@ -18,7 +18,138 @@ if (!FROM_EMAIL) { 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 = { method: 'POST', headers: { @@ -33,69 +164,3 @@ async function sendMail(data: object) { 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}`) - } -} diff --git a/pages/api/admin/booking/[uuid]/index.ts b/pages/api/admin/booking/[uuid]/index.ts index 72a6b38..8e39cc9 100644 --- a/pages/api/admin/booking/[uuid]/index.ts +++ b/pages/api/admin/booking/[uuid]/index.ts @@ -1,6 +1,11 @@ import { BookingDocument } from '../../../../../db/booking' import { getBookingByUUID } from '../../../../../db/index' 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) { if (!isAdminSession(req, res)) { @@ -22,11 +27,25 @@ export default withSession(async function bookingHandler(req, res) { // FIXME: validate all the things booking.set(req.body) + + const bookingStatusChanged = booking.isModified('status') + await booking.save() await booking.populate('booker').execPopulate() 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 default: res.setHeader('Allow', ['PATCH'])