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;