all repos — caroster @ a78d74bdc205a880e61fa477de33a5d876c6ea51

[Octree] Group carpool to your event https://caroster.io

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  );