all repos — caroster @ e22ee9c064d006eb9bd3af3cc9709ce4d28df633

[Octree] Group carpool to your event https://caroster.io

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;