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;