all repos — caroster @ aa7e34b3fb18f1f2e4b57ddbafef5f68523acbd9

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

backend/src/graphql/passenger/createPassenger.ts (view raw)

 1import pMap from "p-map";
 2import moment from "moment";
 3
 4const createPassenger = {
 5  description: "Create a passenger",
 6  async resolve(_root, args) {
 7    const { data: passengerInput } = args;
 8    const { user: userId, event: eventId } = passengerInput;
 9
10    //Avoid duplicity when the connected users add themself
11    if (userId) {
12      const userPassengersInEvent = (await strapi.entityService.findMany(
13        "api::passenger.passenger",
14        {
15          filters: {
16            event: { id: eventId },
17            user: { id: userId },
18          },
19        }
20      )) as { id: string }[];
21
22      // Delete existing passenger linked to the user in targeted event
23      await pMap(
24        userPassengersInEvent,
25        async (passenger) =>
26          strapi.entityService.delete("api::passenger.passenger", passenger.id),
27        { concurrency: 5 }
28      );
29    }
30
31    const createdPassenger = await strapi.entityService.create(
32      "api::passenger.passenger",
33      {
34        data: passengerInput,
35        populate: {
36          event: true,
37          user: true,
38          travel: {
39            populate: {
40              user: true,
41            },
42          },
43        },
44      }
45    );
46
47    // If event is Caroster Plus, send notification to user
48    const enabledModules = createdPassenger.event?.enabled_modules as string[];
49    const isCarosterPlus = enabledModules?.includes("caroster-plus");
50    if (isCarosterPlus && createdPassenger.user) {
51      const travel = createdPassenger.travel;
52      const driver = travel.user;
53      const date = travel.departureDate
54        ? moment(travel.departureDate)
55            .locale(createdPassenger.user.lang || "en")
56            .format("dddd LL")
57        : "";
58      const datetime = `${date} ${travel.departureTime || ""}`;
59      try {
60        await strapi.entityService.create("api::notification.notification", {
61          data: {
62            type: "ContactTripCreator",
63            event: createdPassenger.event.id,
64            user: createdPassenger.user.id,
65            // @ts-expect-error
66            payload: { travel, driver, datetime },
67          },
68        });
69      } catch (error) {
70        console.error(error);
71      }
72    }
73
74    const { toEntityResponse } = strapi
75      .plugin("graphql")
76      .service("format").returnTypes;
77
78    return toEntityResponse(createdPassenger, {
79      args,
80      resourceUID: "api::passenger.passenger",
81    });
82  },
83};
84
85export default createPassenger;