all repos — caroster @ bfdcefc83e883d95ad54692b815b0686c4bf8e4b

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

backend/src/api/event/services/event.ts (view raw)

 1// @ts-nocheck
 2import { DateTime } from "luxon";
 3import { factories } from "@strapi/strapi";
 4
 5const TEMPLATE_NAME_RECAP = "event_recap";
 6const { STRAPI_URL = "" } = process.env;
 7
 8export default factories.createCoreService(
 9  "api::event.event",
10  ({ strapi }) => ({
11    getWaitingPassengers: async (event) => {
12      return strapi.entityService.findMany("api::passenger.passenger", {
13        filters: {
14          event: { id: event.id },
15          travel: {
16            id: {
17              $null: true,
18            },
19          },
20        },
21        populate: ["passengers", "passengers.travel"],
22      });
23    },
24    sendDailyRecap: async (event) => {
25      const referenceDate = DateTime.now().minus({ day: 1 });
26      const hasBeenModified =
27        referenceDate <= DateTime.fromISO(event.updatedAt);
28      if (hasBeenModified) {
29        strapi.log.debug(
30          `Send daily recap to ${event.email} for event #${event.id}`
31        );
32        const newTravels = event.travels?.filter(
33          (travel) => referenceDate <= DateTime.fromISO(travel.createdAt)
34        );
35        try {
36          const template = await strapi
37            .plugin("email-designer")
38            .services.template.findOne({
39              name: TEMPLATE_NAME_RECAP,
40            });
41
42          if (!template) {
43            strapi.log.error(
44              `No email template with name ${TEMPLATE_NAME_RECAP}`
45            );
46            return null;
47          }
48
49          const waitingPassengers = await strapi
50            .service("api::event.event")
51            .getWaitingPassengers(event);
52
53          await strapi
54            .service("plugin::email-designer.email")
55            .sendTemplatedEmail(
56              {
57                to: event.email,
58              },
59              {
60                templateReferenceId: template.templateReferenceId,
61              },
62              {
63                event,
64                eventLink: `${STRAPI_URL}/e/${event.uuid}`,
65                waitingListCount: waitingPassengers?.length || 0,
66                travelsCount: event.travels?.length || 0,
67                newTravelsCount: newTravels?.length || 0,
68              }
69            );
70          strapi.log.info(
71            `Email with template '${TEMPLATE_NAME_RECAP}' sent to ${event.email}`
72          );
73        } catch (error) {
74          console.error(error);
75          strapi.log.error(
76            `Impossible to send recap notification to ${
77              event.email
78            } for event #${event.id}. Error: ${JSON.stringify(error)}`
79          );
80        }
81      }
82    },
83  })
84);