backend/src/graphql/passenger/createPassenger.ts (view raw)
1const createPassenger = {
2 description: "Create a passenger",
3 async resolve(_root, args) {
4 const { data: passengerInput } = args;
5
6 const { user: userId, travel: travelId } = passengerInput;
7
8 try {
9 //Avoid duplicity when the connected users add themself to a new car
10 if (userId && travelId) {
11 const travel = await strapi.entityService.findOne(
12 "api::travel.travel",
13 travelId,
14 { populate: ["event"] }
15 );
16
17 const userPassengersIds = (
18 await strapi.entityService.findMany("api::passenger.passenger", {
19 filters: {
20 user: userId,
21 },
22 })
23 ).map((userPassenger) => userPassenger.id);
24
25 const travelsIdsBelongingToUserInEvent = (
26 await strapi.entityService.findMany("api::travel.travel", {
27 filters: {
28 event: travel.event.id,
29 passengers: { id: { $containsi: userPassengersIds } },
30 },
31 })
32 ).map((travel) => travel.id);
33
34 const userDuplicatesinEvent = await strapi.entityService.findMany(
35 "api::passenger.passenger",
36 {
37 filters: {
38 $or: [
39 {
40 event: travel.event.id,
41 user: userId,
42 },
43 {
44 travel: { id: { $in: travelsIdsBelongingToUserInEvent } },
45 user: userId,
46 },
47 ],
48 },
49 }
50 );
51
52 if (userDuplicatesinEvent.length > 0) {
53 const [existingPassenger, ...duplicated] = userDuplicatesinEvent;
54
55 await Promise.all(
56 duplicated?.map(async (passenger) => {
57 await strapi.entityService.delete(
58 "api::passenger.passenger",
59 passenger.id
60 );
61 })
62 );
63
64 return makeResponse({
65 operation: strapi.entityService.update(
66 "api::passenger.passenger",
67 existingPassenger.id,
68 { data: { ...passengerInput, event: null } }
69 ),
70 args,
71 });
72 }
73 }
74
75 return makeResponse({
76 operation: await strapi.entityService.create(
77 "api::passenger.passenger",
78 {
79 data: passengerInput,
80 }
81 ),
82 args,
83 });
84 } catch (error) {
85 console.log(error);
86 throw new Error("Couldn't create the passenger");
87 }
88 },
89};
90
91const makeResponse = async ({ operation, args }) => {
92 const { toEntityResponse } = strapi
93 .plugin("graphql")
94 .service("format").returnTypes;
95
96 return toEntityResponse(await operation, {
97 args,
98 resourceUID: "api::passenger.passenger",
99 });
100};
101
102export default createPassenger;