all repos — caroster @ 2e4e192becc64475ea9245eb5fec57f72cb7088e

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

backend/src/api/passenger/policies/check-deletion.ts (view raw)

 1import { errors } from "@strapi/utils";
 2
 3export default async (policyContext, _config, { strapi }) => {
 4  const passengerId = policyContext.args?.id;
 5  const passenger = await strapi.entityService.findOne(
 6    "api::passenger.passenger",
 7    passengerId,
 8    {
 9      populate: {
10        event: true,
11        user: true,
12        travel: {
13          populate: ["user"],
14        },
15      },
16    }
17  );
18
19  if (!passenger) throw new errors.NotFoundError("Passenger not found");
20
21  const event = passenger.event;
22
23  if (event.enabled_modules?.includes("caroster-plus")) {
24    const user = policyContext.state.user;
25    if (!user) throw new errors.ForbiddenError();
26    else if (!passenger.user) return true;
27
28    const admins = event.administrators?.split(/, ?/) || [];
29    const isAdmin = [...admins, event.email].includes(user.email);
30    const isDriver = passenger.travel?.user?.id === user.id;
31
32    // If remove self
33    if (passenger.user.id == user.id) return true;
34    else if (isDriver || isAdmin) {
35      const travel = passenger.travel;
36      const vehicleName =
37        travel.firstname && travel.lastname
38          ? `${travel.firstname} ${travel.lastname[0]}.`
39          : travel.vehicleName;
40      await strapi.entityService.create("api::notification.notification", {
41        data: {
42          type: "DeletedFromTrip",
43          event: event.id,
44          user: passenger.user.id,
45          payload: { travel, vehicleName },
46        },
47      });
48      return true;
49    } else return false;
50  }
51};