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