all repos — caroster @ 2b432f87d46e7cab99f95223088266dcc4cb2dda

[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: ["event", "user", "travel"],
36      }
37    );
38
39    // If event is Caroster Plus, send notification to user
40    const enabledModules = createdPassenger.event?.enabled_modules as string[];
41    const isCarosterPlus = enabledModules?.includes("caroster-plus");
42    if (isCarosterPlus && createdPassenger.user) {
43      const travel = createdPassenger.travel;
44      const datetime = travel.departure
45        ? moment(travel.departure)
46            .locale(createdPassenger.user.lang || "en")
47            .format("LLLL")
48        : null;
49      strapi.entityService.create("api::notification.notification", {
50        data: {
51          type: "ContactTripCreator",
52          event: createdPassenger.event.id,
53          user: createdPassenger.user.id,
54          // @ts-expect-error
55          payload: { travel, datetime },
56        },
57      });
58    }
59
60    const { toEntityResponse } = strapi
61      .plugin("graphql")
62      .service("format").returnTypes;
63
64    return toEntityResponse(createdPassenger, {
65      args,
66      resourceUID: "api::passenger.passenger",
67    });
68  },
69};
70
71export default createPassenger;