all repos — caroster @ ae6f0621a8c844a589741cf29191ddf231c449c4

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