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;