135 lines
4.8 KiB
JavaScript
135 lines
4.8 KiB
JavaScript
// /utils/senders/smsMessages.js
|
|
'use strict';
|
|
|
|
const { sendSingleSms } = require('./sms.base');
|
|
const { recordAndSend } = require('./notificationRecorder');
|
|
const { getSmsTemplate } = require('../../components/settings/settingService');
|
|
const { buildSmsParameters } = require('../../components/settings/smsTemplates');
|
|
const User = require('../../components/users/userModel');
|
|
|
|
const resolveUserIdByPhone = async (phoneNumber) => {
|
|
if (!phoneNumber) return null;
|
|
const user = await User.findOne({ phoneNumber: String(phoneNumber) }).select('_id').lean();
|
|
return user?._id || null;
|
|
};
|
|
|
|
const sendAccountCreatedSms = async (receiver, username, password, userId = null) => {
|
|
const resolvedUserId = userId || await resolveUserIdByPhone(receiver);
|
|
let fullName = '';
|
|
if (resolvedUserId) {
|
|
const user = await User.findById(resolvedUserId).select('name').lean();
|
|
if (user?.name) fullName = user.name;
|
|
}
|
|
const { templateId, variables } = await getSmsTemplate('accountCreated');
|
|
return recordAndSend({
|
|
userId: resolvedUserId,
|
|
channel: 'sms',
|
|
subject: 'ایجاد حساب کاربری',
|
|
body: `حساب کاربری شما ایجاد شد. نام کاربری: ${username}`,
|
|
relatedEvent: 'user.created',
|
|
sendFn: () => sendSingleSms(receiver, templateId, buildSmsParameters(variables, {
|
|
username,
|
|
password,
|
|
fullName: fullName || username,
|
|
name: fullName || username,
|
|
phoneNumber: receiver,
|
|
mobile: receiver
|
|
}))
|
|
});
|
|
};
|
|
|
|
const sendClassRegisteredSms = async (receiver, className, userId = null, extraContext = {}) => {
|
|
const resolvedUserId = userId || await resolveUserIdByPhone(receiver);
|
|
let fullName = extraContext.fullName || '';
|
|
if (!fullName && resolvedUserId) {
|
|
const user = await User.findById(resolvedUserId).select('name').lean();
|
|
if (user?.name) fullName = user.name;
|
|
}
|
|
const { templateId, variables } = await getSmsTemplate('classRegistered');
|
|
return recordAndSend({
|
|
userId: resolvedUserId,
|
|
channel: 'sms',
|
|
subject: 'ثبتنام در کلاس',
|
|
body: `ثبتنام شما در کلاس «${className}» انجام شد.`,
|
|
relatedEvent: 'user.enrolled',
|
|
sendFn: () => sendSingleSms(receiver, templateId, buildSmsParameters(variables, {
|
|
className,
|
|
courseName: extraContext.courseName || className,
|
|
fullName: fullName || 'کارآموز',
|
|
phoneNumber: receiver,
|
|
mobile: receiver,
|
|
...extraContext
|
|
}))
|
|
});
|
|
};
|
|
|
|
const sendClassReminderSms = async (receiver, className, time, place = '', userId = null, extraContext = {}) => {
|
|
const resolvedUserId = userId || await resolveUserIdByPhone(receiver);
|
|
let fullName = extraContext.fullName || '';
|
|
if (!fullName && resolvedUserId) {
|
|
const user = await User.findById(resolvedUserId).select('name').lean();
|
|
if (user?.name) fullName = user.name;
|
|
}
|
|
const { templateId, variables } = await getSmsTemplate('classReminder');
|
|
return recordAndSend({
|
|
userId: resolvedUserId,
|
|
channel: 'sms',
|
|
subject: 'یادآوری کلاس',
|
|
body: `یادآوری کلاس «${className}» ساعت ${time} — مکان: ${place || '-'}`,
|
|
relatedEvent: 'session.reminder',
|
|
sendFn: () => sendSingleSms(receiver, templateId, buildSmsParameters(variables, {
|
|
className,
|
|
courseName: extraContext.courseName || className,
|
|
time,
|
|
place: place || '-',
|
|
fullName: fullName || 'کارآموز',
|
|
phoneNumber: receiver,
|
|
mobile: receiver,
|
|
...extraContext
|
|
}))
|
|
});
|
|
};
|
|
|
|
const sendInvoiceCreatedSms = async (receiver, payload, userId = null) => {
|
|
const resolvedUserId = userId || await resolveUserIdByPhone(receiver);
|
|
const { templateId, variables } = await getSmsTemplate('invoiceCreated');
|
|
|
|
let fullName = '';
|
|
let amount = '';
|
|
let course = '';
|
|
|
|
if (typeof payload === 'object' && payload !== null) {
|
|
fullName = payload.fullName || '';
|
|
amount = payload.amount != null ? String(payload.amount) : '';
|
|
course = payload.course || '';
|
|
} else {
|
|
amount = String(payload || '');
|
|
}
|
|
|
|
const amountLabel = String(amount);
|
|
const courseLabel = course || '-';
|
|
const fullNameLabel = fullName || 'کارآموز';
|
|
|
|
return recordAndSend({
|
|
userId: resolvedUserId,
|
|
channel: 'sms',
|
|
subject: 'ایجاد صورتحساب',
|
|
body: `کارآموز عزیز، ${fullNameLabel}، یک صورتحساب به مبلغ ${amountLabel} تومان بابت دوره «${courseLabel}» برای شما ایجاد شد.`,
|
|
relatedEvent: 'payment.created',
|
|
sendFn: () => sendSingleSms(receiver, templateId, buildSmsParameters(variables, {
|
|
fullName: fullNameLabel,
|
|
amount: amountLabel,
|
|
course: courseLabel,
|
|
phoneNumber: receiver,
|
|
mobile: receiver
|
|
}))
|
|
});
|
|
};
|
|
|
|
module.exports = {
|
|
sendAccountCreatedSms,
|
|
sendClassRegisteredSms,
|
|
sendClassReminderSms,
|
|
sendInvoiceCreatedSms
|
|
};
|