diff --git a/src/app.js b/src/app.js index 145e965..81d4b01 100644 --- a/src/app.js +++ b/src/app.js @@ -8,6 +8,7 @@ const { basedir } = require('./config/constants'); var indexRouter = require('./routes/index'); const consoleSubscriber = require('./subscribers/consoleSubscriber'); +const mailerSubscriber = require('./subscribers/emailSubscriber'); var app = express(); @@ -26,6 +27,8 @@ app.use(express.urlencoded({ extended: true })); app.use(cookieParser()); app.use(express.static(path.join(basedir, 'public'))); + +mailerSubscriber(app); app.use('/', indexRouter); // catch 404 and forward to error handler diff --git a/src/subscribers/emailSubscriber.js b/src/subscribers/emailSubscriber.js new file mode 100644 index 0000000..9d115da --- /dev/null +++ b/src/subscribers/emailSubscriber.js @@ -0,0 +1,114 @@ +const emitter = require('../services/eventEmitter'); +const axios = require('axios'); + +const params = require('../config/params'); +const TemplateService = require('../services/template'); +const templateService = new TemplateService(); + + +const errorResponse = (error) => { + if (error.response) { + return error.response.status + ' - ' + error.response.statusText; + } else if (error.request) { + // The request was made but no response was received + // `error.request` is an instance of XMLHttpRequest in the browser and an instance of + // http.ClientRequest in node.js + return error.request; + } else { + return error.message; + } +}; + +module.exports = (app) => { + + // Get app url + let host = ''; + app.use((req, res, next) => { + console.log('--- APP_URL ---', req.protocol + '://' + req.get('host')); + host = req.protocol + '://' + req.get('host'); + next(); + }); + + // Check if sendgrid params exists + if ( !params.sendgrid ) { + console.log('--- No sendgrid params ---'); + return; + } + console.log('--- sendgrid params exists ---'); + + const sendgridParams = params.sendgrid; + const defaultParams = { + url: sendgridParams.uri, + headers: { + Authorization: 'Bearer ' + sendgridParams.application_secret, + 'Content-Type': 'application/json', + }, + }; + + const sendEmail = async (to, subject, message) => { + const data = { + personalizations: [ + { + to: [ + { + email: to, + } + ], + subject: subject + } + ], + content: [ + { + type: "text/html", + value: message + } + ], + from: { + email: sendgridParams.from, + name: sendgridParams.fromName, + } + }; + + + const response = await axios.post(defaultParams.url, data, { headers: defaultParams.headers }); + return response; + } + + // Create a new listener for the parse.end event + emitter.on('parse.end', async ({ url, columns, count, generated }) => { + console.log('HOST', host); + try { + const message = templateService.renderEmail('parse-success', { + host, + generated, + count, + columns, + url, + }); + const response = await sendEmail(sendgridParams.to, 'BODACC - Traitement terminé', message); + emitter.emit('mailer.parse.end.success', { response: response.data }); + } catch (error) { + emitter.emit('mailer.parse.end.error', { error: errorResponse(error) }); + } + }); + + // Create a new listener for the parse.error event + emitter.on('parse.error', async ({ filepath, columns, error }) => { + try { + const reponse = await sendEmail(sendgridParams.to, 'BODACC - Erreur traitement', '

Erreur traitement


Voici le message d\'erreur: ' + error + '

') + emitter.emit('mailer.parse.error.success', { response: response }); + } catch (error) { + emitter.emit('mailer.parse.error.error', { error: errorResponse(error) }); + } + }); + + // Create a new listener for the parseFromUrl.error event + emitter.on('parseFromUrl.error', async ({ url, columns, error }) => { + try { + const response = await sendEmail(sendgridParams.to, 'BODACC - Erreur génération fichier', '

Erreur génération fichier


Voici le message d\'erreur: ' + error + '

') + emitter.emit('mailer.parseFromUrl.error.success', { response: response.data }); + } catch (error) { + emitter.emit('mailer.parseFromUrl.error.error', { error: errorResponse(error) }); + } + }); +};