all repos — caroster @ 2ab1b88d8d526f5d2b9ef0f2ad936dbfcd6aa2c9

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

✨ Create notification entities on some actions #421
Tim Izzo tim@octree.ch
Tue, 30 Jan 2024 10:12:27 +0000
commit

2ab1b88d8d526f5d2b9ef0f2ad936dbfcd6aa2c9

parent

711e096e465403cc87ebe6dee546bd8c28f5e643

M backend/src/api/event/services/event.tsbackend/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.tsbackend/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.jsonbackend/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.tsbackend/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.tsbackend/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<