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 TEMPLATE_NAME_END_EVENT = "event_end";
7const { STRAPI_URL = "" } = process.env;
8
9export default factories.createCoreService(
10 "api::event.event",
11 ({ strapi }) => ({
12 getWaitingPassengers: async (event) => {
13 return strapi.entityService.findMany("api::passenger.passenger", {
14 filters: {
15 event: { id: event.id },
16 travel: {
17 id: {
18 $null: true,
19 },
20 },
21 },
22 populate: ["travel", "user"],
23 });
24 },
25 sendDailyRecap: async (event) => {
26 const referenceDate = DateTime.now().minus({ day: 1 });
27 const hasBeenModified =
28 referenceDate <= DateTime.fromISO(event.updatedAt);
29 if (hasBeenModified) {
30 strapi.log.debug(
31 `Send daily recap to ${event.email} for event #${event.id}`
32 );
33 const newTravels = event.travels?.filter(
34 (travel) => referenceDate <= DateTime.fromISO(travel.createdAt)
35 );
36 try {
37 const template = await strapi
38 .plugin("email-designer")
39 .services.template.findOne({
40 name: TEMPLATE_NAME_RECAP,
41 });
42
43 if (!template) {
44 strapi.log.error(
45 `No email template with name ${TEMPLATE_NAME_RECAP}`
46 );
47 return null;
48 }
49
50 const waitingPassengers = await strapi
51 .service("api::event.event")
52 .getWaitingPassengers(event);
53
54 await strapi
55 .service("plugin::email-designer.email")
56 .sendTemplatedEmail(
57 {
58 to: event.email,
59 },
60 {
61 templateReferenceId: template.templateReferenceId,
62 },
63 {
64 event,
65 eventLink: `${STRAPI_URL}/e/${event.uuid}`,
66 waitingListCount: waitingPassengers?.length || 0,
67 travelsCount: event.travels?.length || 0,
68 newTravelsCount: newTravels?.length || 0,
69 }
70 );
71 strapi.log.info(
72 `Email with template '${TEMPLATE_NAME_RECAP}' sent to ${event.email}`
73 );
74 } catch (error) {
75 console.error(error);
76 strapi.log.error(
77 `Impossible to send recap notification to ${
78 event.email
79 } for event #${event.id}. Error: ${JSON.stringify(error)}`
80 );
81 }
82 }
83 },
84
85 sendEndRecap: async (event) => {
86 try {
87 const template = await strapi
88 .plugin("email-designer")
89 .services.template.findOne({
90 name: TEMPLATE_NAME_END_EVENT,
91 });
92
93 if (!template) {
94 strapi.log.error(
95 `No email template with name ${TEMPLATE_NAME_END_EVENT}`
96 );
97 return null;
98 }
99
100 const travelsCount = event.travels?.length || 0;
101 const passengersCount = event.passengers?.filter(
102 (passenger) => passenger.travel
103 ).length;
104
105 await strapi.service("plugin::email-designer.email").sendTemplatedEmail(
106 {
107 to: event.email,
108 },
109 {
110 templateReferenceId: template.templateReferenceId,
111 },
112 {
113 event,
114 travelsCount,
115 passengersCount,
116 eventLink: `${STRAPI_URL}/e/${event.uuid}`,
117 }
118 );
119 strapi.log.info(
120 `Email with template '${TEMPLATE_NAME_END_EVENT}' sent to ${event.email}`
121 );
122 } catch (error) {
123 console.error(error);
124 strapi.log.error(
125 `Impossible to send end event notification to ${
126 event.email
127 } for event #${event.id}. Error: ${JSON.stringify(error)}`
128 );
129 }
130 },
131 })
132);