all repos — caroster @ b2f79a8edfa66402e88fc52215152f5a36b079d9

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

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