backend/api/travel/models/travel.js (view raw)
1'use strict';
2
3const _uniq = require('lodash/uniq');
4
5const {STRAPI_URL = ''} = process.env;
6
7module.exports = {
8 lifecycles: {
9 async afterCreate(result) {
10 sendEmailsToWaitingPassengers(result);
11 },
12
13 async beforeUpdate(query, update) {
14 const travel = await strapi.services.travel.findOne(query);
15 if (update.passengers && travel?.vehicle) {
16 if (travel?.vehicle?.seats < update.passengers.length)
17 throw new Error('no_enough_seats');
18 }
19 },
20
21 async afterUpdate(result) {
22 const {passengers = [], seats, event} = result;
23 const overflowPassengers = passengers.slice(seats);
24
25 if (overflowPassengers.length > 0) {
26 await Promise.all(
27 overflowPassengers.map(movePassengerToWaitingList(event.id))
28 );
29 }
30 },
31
32 async beforeDelete(params) {
33 const travel = await strapi.services.travel.findOne(params);
34 const {passengers = []} = travel;
35
36 await Promise.all(
37 passengers.map(movePassengerToWaitingList(travel.event.id))
38 );
39 },
40 },
41};
42
43const sendEmailsToWaitingPassengers = async travel => {
44 const event = travel.event;
45 const eventWaitingPassengers = event?.waitingPassengers || [];
46 const userEmails = eventWaitingPassengers
47 .map(user => user.email)
48 .filter(Boolean);
49 const templateId = await strapi.plugins[
50 'email-designer'
51 ].services.template.getId('waitinglist_notif');
52
53 if (userEmails?.length > 0)
54 try {
55 await strapi.plugins['email-designer'].services.email.sendTemplatedEmail(
56 {
57 to: _uniq(userEmails),
58 },
59 {
60 templateId,
61 },
62 {
63 event,
64 travel,
65 eventLink: `${STRAPI_URL}/e/${event.uuid}`,
66 }
67 );
68 } catch (error) {
69 console.error(error);
70 strapi.log.error(
71 `Impossible to send email waiting list notification for event #${
72 event.id
73 }. Error: ${JSON.stringify(error)}`
74 );
75 }
76};
77
78const movePassengerToWaitingList = eventId => async passenger =>
79 strapi.services.passenger.update(
80 {id: passenger.id},
81 {
82 travel: null,
83 event: eventId,
84 }
85 );