all repos — caroster @ 6ad764e65d75cde2a61b7efce05d44cb90a6395c

[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      strapi.entityService.create("api::notification.notification", {
60        data: {
61          type: "ContactTripCreator",
62          event: createdPassenger.event.id,
63          user: createdPassenger.user.id,
64          // @ts-expect-error
65          payload: { travel, driver, datetime },
66        },
67      });
68    }
69
70    const { toEntityResponse } = strapi
71      .plugin("graphql")
72      .service("format").returnTypes;
73
74    return toEntityResponse(createdPassenger, {
75      args,
76      resourceUID: "api::passenger.passenger",
77    });
78  },
79};
80
81export default createPassenger;