all repos — caroster @ f32f255ec915c750c098a36aa5ed977311cf93f3

[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 referenceDate = DateTime.now().minus({ day: 1 });
 55      const hasBeenModified =
 56        referenceDate <= DateTime.fromISO(event.updatedAt);
 57      if (hasBeenModified) {
 58        strapi.log.debug(`Send daily recap to admins of event #${event.id}`);
 59        const newTravels = event.travels?.filter(
 60          (travel) => referenceDate <= DateTime.fromISO(travel.createdAt)
 61        );
 62        const waitingPassengers = await strapi
 63          .service("api::event.event")
 64          .getWaitingPassengers(event);
 65
 66        const administratorEmails = event.administrators?.split(/, ?/) || [];
 67        administratorEmails.push(event.email);
 68
 69        for (const email of administratorEmails) {
 70          await strapi
 71            .service("api::email.email")
 72            .sendEmailNotif(email, "EventRecap", event.lang, {
 73              event,
 74              waitingListCount: waitingPassengers?.length || 0,
 75              travelsCount: event.travels?.length || 0,
 76              newTravelsCount: newTravels?.length || 0,
 77            });
 78        }
 79      }
 80    },
 81
 82    sendEndRecap: async (event) => {
 83      const travelsCount = event.travels?.length || 0;
 84      const passengersCount = event.passengers?.filter(
 85        (passenger) => passenger.travel
 86      ).length;
 87
 88      const administratorEmails = event.administrators?.split(/, ?/) || [];
 89      administratorEmails.push(event.email);
 90
 91      for (const email of administratorEmails) {
 92        await strapi
 93          .service("api::email.email")
 94          .sendEmailNotif(email, "EventEnded", event.lang, {
 95            event,
 96            travelsCount,
 97            passengersCount,
 98          });
 99      }
100    },
101  })
102);