backend/api/event/models/event.js (view raw)
1'use strict';
2const axios = require('axios');
3const moment = require('moment');
4const uuid = require('uuid');
5const sendgrid = require('../../../lib/sendgrid');
6require('moment/locale/fr-ch');
7
8const {STRAPI_URL = ''} = process.env;
9
10module.exports = {
11 lifecycles: {
12 async beforeCreate(event) {
13 if (!event.uuid) event.uuid = uuid.v4();
14 // If user provides an address, get its lat/lng position using OSM API
15 if (event.address) event.position = getPosition(event.address);
16 // If user accepts newsletters, subscribe it
17 if (event.newsletter) sendgrid.subscribe(event.email);
18 },
19 async afterCreate(event) {
20 sendEmailToCreator(event);
21 },
22
23 async beforeUpdate(params, event) {
24 const eventInDb = await strapi.services.event.findOne(params);
25 if (!eventInDb.uuid) event.uuid = uuid.v4();
26 if (event.address) event.position = getPosition(event.address);
27 },
28 },
29};
30
31const getPosition = async address => {
32 try {
33 const query = encodeURI(address);
34 const {data} = await axios.get(
35 `https://nominatim.openstreetmap.org/search?format=json&q=${query}`
36 );
37 if (Array.isArray(data) && data.length > 0) {
38 const [entity] = data;
39 return [entity.lat, entity.lon];
40 } else strapi.log.info(`No location from Nominatim API for ${address}`);
41 } catch (error) {
42 strapi.log.error(error);
43 }
44};
45
46const sendEmailToCreator = async event => {
47 try {
48 const templateId = getTemplateId('creator_notif');
49 await strapi.plugins['email-designer'].services.email.sendTemplatedEmail(
50 {
51 to: event.email,
52 },
53 {
54 templateId,
55 subject: `Caroster: ${event.name}`,
56 },
57 {
58 eventName: event.name,
59 eventTime: event.date
60 ? moment(event.date).format('dddd D MMMM YYYY')
61 : null,
62 eventAddress: event.address,
63 eventLink: `${STRAPI_URL}/e/${event.uuid}`,
64 }
65 );
66 } catch (error) {
67 console.error(error);
68 strapi.log.error(
69 `Impossible to send email notification to ${event.email} for event#${
70 event.id
71 }. Error: ${JSON.stringify(error)}`
72 );
73 }
74};
75
76const getTemplateId = async templateName => {
77 const template = await strapi.plugins[
78 'email-designer'
79 ].services.template.fetch({name: templateName});
80 if (!template) throw new Error(`No email template with name ${templateName}`);
81 return template.id;
82};