yekonga-server
Version:
Yekonga Server
230 lines (188 loc) • 9.05 kB
JavaScript
// @ts-nocheck
/*global Yekonga, serverLibrary */
const fs = serverLibrary.fs;
const path = serverLibrary.path;
async function processNotifications() {
let list = await Yekonga.Model.Notification.find({ status: "waiting" }, null, true);
if (Array.isArray(list)) {
for (var row of list) {
var notificationData = Yekonga.Helper.copyJson({...row, from: row.senderName, phone: row.recipient, text:row.content});
try {
var beforeInjectFunction = Yekonga.Cloud.getBeforeAndAfterNotificationCallback('beforeNotification');
if (beforeInjectFunction) {
var _input = await beforeInjectFunction(notificationData);
if (_input === false) throw new Yekonga.Error.Forbidden(`Action rejected by before notification`);
if (_input) notificationData = _input;
}
const names = [];
const user = await Yekonga.Model.User.findOne({ userId: notificationData.userId }, null, true);
if(Yekonga.Helper.isNotEmpty(notificationData.name)) {
names.push(notificationData.name);
} else if(user) {
if(Yekonga.Helper.isNotEmpty(user.firstName)) names.push(user.firstName);
if(Yekonga.Helper.isNotEmpty(user.lastName)) names.push(user.lastName);
}
if(!names.length) names.push('You');
const fullName = names.join(' ');
var status = "failed";
var response = null;
var responseReference = null;
if (notificationData.type == "sms") {
notificationData.content = Yekonga.Helper.clearSpecialCharacters(notificationData.content);
console.log(notificationData.content);
var res = await Yekonga.Helper.sendSMS(notificationData);
if(res.status == 'SUCCESS') {
status = "submitted";
}
if(res.response) {
responseReference = res.messageId;
response = res.response;
}
} else if (notificationData.type == "whatsapp") {
var res = await Yekonga.Helper.sendWhatsapp(notificationData);
// console.log(res);
if(res.status == 'SUCCESS' || res.status === true) {
status = "submitted";
}
if(res.response) {
responseReference = res.messageId;
response = res.response;
}
} else if (notificationData.type == 'mail') {
notificationData.from = notificationData.replyTo;
var from = (Yekonga.Config.mail && Yekonga.Config.mail.smtp) ?
Yekonga.Config.mail.smtp.from :
null;
var htmlContent = Yekonga.Helper.textTemplate(notificationData.content, notificationData, /@(?<name>notificationId)/g);
var attachments = [];
notificationData.attachments = (Array.isArray(notificationData.attachment))
? notificationData.attachment
: (notificationData.attachment? [notificationData.attachment]: []);
for (const attach of notificationData.attachments) {
if(fs.existsSync(attach)) {
// console.log('existsSync');
var filename = path.basename(attach);
var content = fs.readFileSync(attach, { encoding: 'base64' })
attachments.push({
filename: filename,
content: content,
encoding: 'base64'
});
}
}
var emailOptions = {
from: Yekonga.Helper.isNotEmpty(notificationData.from)? notificationData.from: `"${Yekonga.Config.appName}" <${from}>`, // sender address
to: `${notificationData.recipient}`, // list of receivers
replyTo: notificationData.replyTo,
subject: notificationData.title, // Subject line
text: notificationData.content, // plain text body
html: htmlContent, // html body
attachments: attachments
};
var res = await Yekonga.Helper.sendMail(emailOptions);
if(res && res.response) {
status = "submitted";
response = res.response;
responseReference = res.messageId;
}
}
if(status == 'failed') {
console.log(`========= ${notificationData.type}`,status);
if(response) {
console.log(`========= ${notificationData.type}`,response);
console.log(`========= ${notificationData.type}`,response.requestError);
}
console.log(`========= ${notificationData.type}`,notificationData.recipient);
if(notificationData.type != 'mail') {
console.log(`========= ${notificationData.type}`,notificationData.content);
}
}
await Yekonga.Model.Notification.update(
{ status: status, response: response, responseReference: responseReference },
{ notificationId: notificationData.notificationId },
null, true
);
var afterInjectFunction = Yekonga.Cloud.getBeforeAndAfterNotificationCallback('afterNotification');
if (afterInjectFunction) {
await afterInjectFunction({data: notificationData, response});
}
} catch (error) {
console.error(error)
}
}
} else {
// console.log(list);
}
}
const time = 1000;
Yekonga.cronjobProcess = function() {
var timeDelay = 3;
try {
timeDelay = `${process.pid}`;
if(timeDelay.length > 2) {
timeDelay = timeDelay.substring((timeDelay.length - 2));
}
if(timeDelay.length >= 2) {
var multipleOf = parseInt(timeDelay.substring(timeDelay.length - 1)) * 5;
timeDelay = parseInt(timeDelay) + multipleOf;
}
timeDelay = parseInt(`${timeDelay}`);
if(timeDelay < 100) {
timeDelay = timeDelay * 1000;
} else if(timeDelay < 1000) {
timeDelay = timeDelay * 100;
}
} catch (error) {
console.log(error);
}
console.log('timeDelay in millisecond', timeDelay);
setTimeout(() => {
setInterval(() => {
Yekonga.runCronjob();
}, time);
}, timeDelay);
}
Yekonga._registeredCronjobs = {};
Yekonga._runCronjobProcess = async function(name) {
var status = await Yekonga.Storage.get(name, false);
if(Yekonga._registeredCronjobs[name].time >= Yekonga._registeredCronjobs[name].delay) {
Yekonga._registeredCronjobs[name].time = 0;
if(!status) {
await Yekonga.Storage.set(name, true);
if(typeof Yekonga._registeredCronjobs[name].callback == 'function'){
await Yekonga._registeredCronjobs[name].callback();
}
await Yekonga.Storage.set(name, false);
}
}
Yekonga._registeredCronjobs[name].time += 1000;
}
Yekonga.runCronjob = function() {
for (const name in Yekonga._registeredCronjobs) {
if (Object.prototype.hasOwnProperty.call(Yekonga._registeredCronjobs), name) {
Yekonga._runCronjobProcess(name);
}
}
}
Yekonga.registerCronjob = function(name, delay, callback) {
var cronjobName = `cronjobs:${name}`;
Yekonga._registeredCronjobs[cronjobName] = {
name: cronjobName,
delay: delay,
time: 0,
callback: callback,
process: false,
};
}
Yekonga.registerCronjob('processSystemNotifications', 10000, async function() {
var status = await Yekonga.Storage.get('cronjobProcessStatus', false);
if (!status) {
await Yekonga.Storage.set('cronjobProcessStatus', true);
if(Yekonga.Cloud.exists('processSystemNotifications')) {
await Yekonga.Cloud.run('processSystemNotifications')
} else {
await processNotifications();
}
await Yekonga.Storage.set('cronjobProcessStatus', false);
}
});