UNPKG

@mvp-rockets/namma-generator

Version:

A generator to generate mvp-rockets projects

94 lines (81 loc) 3.55 kB
const { logInfo } = require('lib'); const SMS = require('notifications/modes/sms'); const WhatsApp = require('notifications/modes/whatsapp'); const Mailer = require('notifications/modes/mailer'); // or mailgun const Fcm = require('notifications/modes/fcm'); const R = require('ramda'); const { whenResult } = require('lib'); const messagesRepository = require('notifications/messages'); const NotificationMessage = require('notifications/notification-message'); const Result = require('folktale/result'); const isSms = mode => mode === 'sms'; const isWhatsApp = mode => mode === 'whatsapp'; const isEmail = mode => mode === 'email'; const isFcm = mode => mode === 'fcm'; const sendNotification = R.curry(async (userNotificationDetails, modes) => { const allResult = R.map(mode => R.cond([ [ isSms, () => SMS.send({ mobile: mode.to, message: userNotificationDetails.messages.sms, priority: 1 }) ], [ isWhatsApp, () => WhatsApp.send({ mobile: mode.to, messageInfo: { text: userNotificationDetails.messages.whatsapp } }) ], [ isEmail, () => Mailer.send({ to: mode.to, html: userNotificationDetails.messages.email.message, subject: userNotificationDetails.messages.email.subject }) ], [ R.equals('fcm'), () => Fcm.send({ token: mode.to, body: userNotificationDetails.messages.fcm.formattedBody, data: userNotificationDetails.details.data, title: userNotificationDetails.messages.fcm.title }) ], [R.T, Result.Ok('No action needed')] ])(mode.name))(modes); const response = await Promise.all(allResult); return response.map((d) => d instanceof Result.Error).filter((val) => val).length ? Result.Error(response) : Result.Ok(modes); }); const getFCMMessage = R.curry((data, details) => { details.formattedBody = new NotificationMessage(details.body).format(data); return details; }); const getEmailMessage = R.curry((data, details) => { details.subject = new NotificationMessage(details.subject).format(data); details.message = new NotificationMessage(details.message).format(data); return details; }); const getGenericMessage = R.curry((data, details) => new NotificationMessage(details).format(data)); module.exports.send = async (details) => { logInfo('Request to send sms and whatsapp notifications', details); const NotificationConfig = messagesRepository.get(details.preferredLanguage); const notificationDetails = Object.assign({}, NotificationConfig[details.context]); const messages = R.mapObjIndexed((num, key, obj) => R.cond([ [isFcm, () => getFCMMessage(details.data, notificationDetails.messages[key])], [isEmail, () => getEmailMessage(details.data, notificationDetails.messages[key])], [isSms, () => getGenericMessage(details.data, notificationDetails.messages[key])], [isWhatsApp, () => getGenericMessage(details.data, notificationDetails.messages[key])], [R.T, R.identity] ])(key))(notificationDetails.messages); const result = Result.Ok({ details, messages }); const response = await whenResult(userNotification => sendNotification(userNotification, details.modes))(result); return response; };