all repos — caroster @ 711e096e465403cc87ebe6dee546bd8c28f5e643

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

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: ["passengers", "passengers.travel"],
 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);