backend/src/api/event/services/event.ts (view raw)
1import { DateTime } from "luxon";
2import { factories } from "@strapi/strapi";
3
4export default factories.createCoreService(
5 "api::event.event",
6 ({ strapi }) => ({
7 getWaitingPassengers: async (event) => {
8 return strapi.entityService.findMany("api::passenger.passenger", {
9 filters: {
10 event: { id: event.id },
11 travel: {
12 id: {
13 $null: true,
14 },
15 },
16 },
17 populate: ["travel", "user"],
18 });
19 },
20 getTripAlerts: async (event) => {
21 const tripAlerts = await strapi.entityService.findMany(
22 "api::trip-alert.trip-alert",
23 {
24 filters: {
25 event: { id: event.id },
26 user: { $not: null },
27 enabled: true,
28 },
29 populate: ["user"],
30 }
31 );
32 const eventPassengers = await strapi.entityService.findMany(
33 "api::passenger.passenger",
34 {
35 filters: {
36 event: { id: event.id },
37 travel: {
38 id: {
39 $null: false,
40 },
41 },
42 },
43 populate: ["user"],
44 }
45 );
46 const usersInTravel = eventPassengers
47 .map((passenger) => passenger.user?.id)
48 .filter(Boolean);
49 return tripAlerts.filter(
50 (tripAlert) => !usersInTravel.includes(tripAlert.user.id)
51 );
52 },
53 sendDailyRecap: async (event) => {
54 const returnEvent = event.linkedEvent;
55 const referenceDate = DateTime.now().minus({ day: 1 });
56 const hasBeenModified =
57 referenceDate <= DateTime.fromISO(event.updatedAt);
58 const returnEventHasBeenModified =
59 returnEvent && referenceDate <= DateTime.fromISO(returnEvent.updatedAt);
60 if (hasBeenModified || returnEventHasBeenModified) {
61 strapi.log.debug(`Send daily recap to admins of event #${event.id}`);
62
63 const travelsCount =
64 (event.travels?.length || 0) + (returnEvent?.travels?.length || 0);
65
66 let waitingListCount = 0;
67 const waitingPassengers = await strapi
68 .service("api::event.event")
69 .getWaitingPassengers(event);
70 waitingListCount += waitingPassengers?.length || 0;
71
72 let newTravelsCount = 0;
73 const newTravels = event.travels?.filter(
74 (travel) => referenceDate <= DateTime.fromISO(travel.createdAt)
75 );
76 newTravelsCount += newTravels?.length || 0;
77
78 if (returnEvent) {
79 const returningWaitingPassengers = await strapi
80 .service("api::event.event")
81 .getWaitingPassengers(returnEvent);
82 waitingListCount += returningWaitingPassengers?.length || 0;
83
84 const returningNewTravels = returnEvent.travels?.filter(
85 (travel) => referenceDate <= DateTime.fromISO(travel.createdAt)
86 );
87 newTravelsCount += returningNewTravels?.length || 0;
88 }
89
90 const administratorEmails = event.administrators?.split(/, ?/) || [];
91 administratorEmails.push(event.email);
92
93 for (const email of administratorEmails) {
94 await strapi
95 .service("api::email.email")
96 .sendEmailNotif(email, "EventRecap", event.lang, {
97 event,
98 travelsCount,
99 waitingListCount,
100 newTravelsCount,
101 });
102 }
103 }
104 },
105
106 sendEndRecap: async (event) => {
107 const returnEvent = event.linkedEvent;
108 const travelsCount =
109 (event.travels?.length || 0) + (returnEvent?.travels?.length || 0);
110 const passengersCount =
111 (event.passengers?.filter((passenger) => passenger.travel).length ||
112 0) +
113 (returnEvent.passengers?.filter((passenger) => passenger.travel)
114 .length || 0);
115
116 const administratorEmails = event.administrators?.split(/, ?/) || [];
117 administratorEmails.push(event.email);
118
119 for (const email of administratorEmails) {
120 await strapi
121 .service("api::email.email")
122 .sendEmailNotif(email, "EventEnded", event.lang, {
123 event,
124 travelsCount,
125 passengersCount,
126 });
127 }
128 },
129 })
130);