✨ Create notification entities on some actions #421
Tim Izzo tim@octree.ch
Tue, 30 Jan 2024 10:12:27 +0000
6 files changed,
61 insertions(+),
6 deletions(-)
jump to
M
backend/src/api/event/services/event.ts
→
backend/src/api/event/services/event.ts
@@ -19,7 +19,7 @@ $null: true,
}, }, }, - populate: ["passengers", "passengers.travel"], + populate: ["travel", "user"], }); }, sendDailyRecap: async (event) => {
A
backend/src/api/passenger/content-types/passenger/lifecycles.ts
@@ -0,0 +1,19 @@
+export default { + async afterCreate({ result, params }) { + const travel = await strapi.entityService.findOne( + "api::travel.travel", + params.data.travel, + { + populate: ["user"], + } + ); + if (travel) + strapi.entityService.create("api::notification.notification", { + data: { + type: "NewTrip", + event: params.data.event, + user: travel.user?.id, + }, + }); + }, +};
M
backend/src/api/travel/content-types/travel/lifecycles.ts
→
backend/src/api/travel/content-types/travel/lifecycles.ts
@@ -1,4 +1,5 @@
import _uniq from "lodash/uniq"; +import pMap from "p-map"; const { STRAPI_URL = "" } = process.env;@@ -58,6 +59,32 @@ });
const eventWaitingPassengers = await strapi .service("api::event.event") .getWaitingPassengers(event); + + // Create notification entities for people linked to a registered user + try { + const registeredUsers = eventWaitingPassengers + .map((passenger) => passenger.user) + .filter(Boolean); + await pMap( + registeredUsers, + async (user: { id: string }) => + strapi.entityService.create("api::notification.notification", { + data: { + type: "NewTrip", + event: eventId, + user: user.id, + }, + }), + { concurrency: 5 } + ); + } catch (error) { + strapi.log.error( + "Error while creating notifications for registered users:" + ); + console.error(error); + } + + // Send email notifications to all waiting passengers const userEmails = eventWaitingPassengers .map((user) => user.email) .filter(Boolean);
M
backend/src/api/travel/content-types/travel/schema.json
→
backend/src/api/travel/content-types/travel/schema.json
@@ -9,8 +9,6 @@ "pluralName": "travels",
"displayName": "Travel" }, "options": { - "increments": true, - "timestamps": true, "draftAndPublish": false }, "attributes": {@@ -51,6 +49,11 @@ "type": "float"
}, "meeting_longitude": { "type": "float" + }, + "user": { + "type": "relation", + "relation": "oneToOne", + "target": "plugin::users-permissions.user" } } }
M
backend/src/graphql/travel/index.ts
→
backend/src/graphql/travel/index.ts
@@ -25,7 +25,10 @@
const createdTravel = await strapi.entityService.create( "api::travel.travel", { - data: args.data, + data: { + ...args.data, + user: user?.id, + }, } );
M
backend/types/generated/contentTypes.d.ts
→
backend/types/generated/contentTypes.d.ts
@@ -1198,8 +1198,6 @@ pluralName: 'travels';
displayName: 'Travel'; }; options: { - increments: true; - timestamps: true; draftAndPublish: false; }; attributes: {@@ -1225,6 +1223,11 @@ 'api::passenger.passenger'
>; meeting_latitude: Attribute.Float; meeting_longitude: Attribute.Float; + user: Attribute.Relation< + 'api::travel.travel', + 'oneToOne', + 'plugin::users-permissions.user' + >; createdAt: Attribute.DateTime; updatedAt: Attribute.DateTime; createdBy: Attribute.Relation<