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 await strapi.entityService.create("api::notification.notification", {
36 data: {
37 type: "DeletedFromTrip",
38 event: event.id,
39 user: passenger.user.id,
40 payload: { travel: passenger.travel },
41 },
42 });
43 return true;
44 } else return false;
45 }
46};