all repos — caroster @ 9149587136874e250bdc8994451e13889b029762

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

feat: ✨ Send daily recap email to event creators

#191
Tim Izzo tim@octree.ch
Thu, 21 Oct 2021 10:30:22 +0200
commit

9149587136874e250bdc8994451e13889b029762

parent

a69dc08b4f89eca3499b1321ae3077f0846ae591

M backend/api/car/models/car.jsbackend/api/car/models/car.js

@@ -15,36 +15,31 @@

const sendEmailsToWaitingList = async event => { const eventWaitingList = event?.waitingList || []; const userEmails = eventWaitingList.map(user => user.email).filter(Boolean); - const templateId = await getTemplateId('waitinglist_notif'); + const templateId = await strapi.plugins[ + 'email-designer' + ].services.template.getId('waitinglist_notif'); - try { - await strapi.plugins['email-designer'].services.email.sendTemplatedEmail( - { - to: _uniq(userEmails), - }, - { - templateId, - subject: `Caroster: nouvelle voiture pour ${event.name}`, - }, - { - eventName: event.name, - eventLink: `${STRAPI_URL}/e/${event.uuid}`, - } - ); - } catch (error) { - console.error(error); - strapi.log.error( - `Impossible to send email waiting list notification for event #${ - event.id - }. Error: ${JSON.stringify(error)}` - ); - } -}; - -const getTemplateId = async templateName => { - const template = await strapi.plugins[ - 'email-designer' - ].services.template.fetch({name: templateName}); - if (!template) throw new Error(`No email template with name ${templateName}`); - return template.id; + if (userEmails?.length > 0) + try { + await strapi.plugins['email-designer'].services.email.sendTemplatedEmail( + { + to: _uniq(userEmails), + }, + { + templateId, + subject: `Caroster: nouvelle voiture pour ${event.name}`, + }, + { + eventName: event.name, + eventLink: `${STRAPI_URL}/e/${event.uuid}`, + } + ); + } catch (error) { + console.error(error); + strapi.log.error( + `Impossible to send email waiting list notification for event #${ + event.id + }. Error: ${JSON.stringify(error)}` + ); + } };
M backend/api/event/models/event.jsbackend/api/event/models/event.js

@@ -45,7 +45,9 @@ };

const sendEmailToCreator = async event => { try { - const templateId = getTemplateId('creator_notif'); + const templateId = await strapi.plugins[ + 'email-designer' + ].services.template.getId('creator_notif'); await strapi.plugins['email-designer'].services.email.sendTemplatedEmail( { to: event.email,

@@ -72,11 +74,3 @@ }. Error: ${JSON.stringify(error)}`

); } }; - -const getTemplateId = async templateName => { - const template = await strapi.plugins[ - 'email-designer' - ].services.template.fetch({name: templateName}); - if (!template) throw new Error(`No email template with name ${templateName}`); - return template.id; -};
M backend/api/event/services/event.jsbackend/api/event/services/event.js

@@ -1,8 +1,51 @@

'use strict'; +const moment = require('moment'); -/** - * Read the documentation (https://strapi.io/documentation/v3.x/concepts/services.html#core-services) - * to customize this service - */ +const TEMPLATE_NAME_RECAP = 'event_recap'; -module.exports = {}; +const {STRAPI_URL = ''} = process.env; + +module.exports = { + sendDailyRecap: async event => { + const referenceDate = moment().subtract(1, 'day'); + const hasBeenModified = referenceDate.isSameOrBefore(event.updated_at); + if (hasBeenModified) { + strapi.log.debug( + `Send daily recap to ${event.email} for event #${event.id}` + ); + const newCars = event.cars?.filter(car => + referenceDate.isSameOrBefore(car.created_at) + ); + try { + const templateId = await strapi.plugins[ + 'email-designer' + ].services.template.getId(TEMPLATE_NAME_RECAP); + await strapi.plugins[ + 'email-designer' + ].services.email.sendTemplatedEmail( + { + to: event.email, + }, + { + templateId, + subject: `Caroster: ${event.name}`, + }, + { + eventName: event.name, + eventLink: `${STRAPI_URL}/e/${event.uuid}`, + waitingListCount: event.waitingList?.length || 0, + carsCount: event.cars?.length || 0, + newCarsCount: newCars?.length || 0, + } + ); + } catch (error) { + console.error(error); + strapi.log.error( + `Impossible to send recap notification to ${event.email} for event #${ + event.id + }. Error: ${JSON.stringify(error)}` + ); + } + } + }, +};
M backend/config/functions/cron.jsbackend/config/functions/cron.js

@@ -1,5 +1,8 @@

'use strict'; +const pMap = require('p-map'); +const moment = require('moment'); + /** * Cron config that gives you an opportunity * to run scheduled jobs.

@@ -12,10 +15,14 @@ */

module.exports = { /** - * Simple example. - * Every monday at 1am. + * Send event recap to creators + * Everyday at 08:00 */ - // '0 1 * * 1': () => { - // - // } + '0 8 * * *': async () => { + const events = await strapi.services.event.find({ + _limit: -1, + date_gte: moment().toISOString(), + }); + await pMap(events, strapi.services.event.sendDailyRecap, {concurrency: 5}); + }, };
M backend/config/server.jsbackend/config/server.js

@@ -2,6 +2,9 @@ module.exports = ({env}) => ({

host: env('HOST', '0.0.0.0'), port: env.int('PORT', 1337), url: env('STRAPI_URL', ''), + cron: { + enabled: true, + }, admin: { auth: { secret: env('ADMIN_JWT_SECRET', 'f7c00070368be0aec6e1c0335ffd49de'),
A backend/extensions/email-designer/services/template.js

@@ -0,0 +1,12 @@

+'use strict'; + +module.exports = { + getId: async templateName => { + const template = await strapi.plugins[ + 'email-designer' + ].services.template.fetch({name: templateName}); + if (!template) + throw new Error(`No email template with name ${templateName}`); + return template.id; + }, +};