Move sms.ir template IDs out of env into settings so SuperAdmin can manage them, and record every outbound SMS status in notifications.
85 lines
3.1 KiB
JavaScript
85 lines
3.1 KiB
JavaScript
// /utils/senders/smsMessages.js
|
|
'use strict';
|
|
|
|
const { sendSingleSms } = require('./sms.base');
|
|
const { recordAndSend } = require('./notificationRecorder');
|
|
const { getSmsTemplateId } = require('../../components/settings/settingService');
|
|
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);
|
|
const templateId = await getSmsTemplateId('accountCreated');
|
|
return recordAndSend({
|
|
userId: resolvedUserId,
|
|
channel: 'sms',
|
|
subject: 'ایجاد حساب کاربری',
|
|
body: `حساب کاربری شما ایجاد شد. نام کاربری: ${username}`,
|
|
relatedEvent: 'user.created',
|
|
sendFn: () => sendSingleSms(receiver, templateId, [
|
|
{ name: 'user', value: String(username) },
|
|
{ name: 'password', value: String(password) }
|
|
])
|
|
});
|
|
};
|
|
|
|
const sendClassRegisteredSms = async (receiver, className, userId = null) => {
|
|
const resolvedUserId = userId || await resolveUserIdByPhone(receiver);
|
|
const templateId = await getSmsTemplateId('classRegistered');
|
|
return recordAndSend({
|
|
userId: resolvedUserId,
|
|
channel: 'sms',
|
|
subject: 'ثبتنام در کلاس',
|
|
body: `ثبتنام شما در کلاس «${className}» انجام شد.`,
|
|
relatedEvent: 'user.enrolled',
|
|
sendFn: () => sendSingleSms(receiver, templateId, [
|
|
{ name: 'className', value: String(className) }
|
|
])
|
|
});
|
|
};
|
|
|
|
const sendClassReminderSms = async (receiver, className, time, place = '', userId = null) => {
|
|
const resolvedUserId = userId || await resolveUserIdByPhone(receiver);
|
|
const templateId = await getSmsTemplateId('classReminder');
|
|
return recordAndSend({
|
|
userId: resolvedUserId,
|
|
channel: 'sms',
|
|
subject: 'یادآوری کلاس',
|
|
body: `یادآوری کلاس «${className}» ساعت ${time} — مکان: ${place || '-'}`,
|
|
relatedEvent: 'session.reminder',
|
|
sendFn: () => sendSingleSms(receiver, templateId, [
|
|
{ name: 'className', value: String(className) },
|
|
{ name: 'time', value: String(time) },
|
|
{ name: 'place', value: String(place || '-') }
|
|
])
|
|
});
|
|
};
|
|
|
|
const sendInvoiceCreatedSms = async (receiver, amount, userId = null) => {
|
|
const resolvedUserId = userId || await resolveUserIdByPhone(receiver);
|
|
const templateId = await getSmsTemplateId('invoiceCreated');
|
|
const amountLabel = String(amount);
|
|
return recordAndSend({
|
|
userId: resolvedUserId,
|
|
channel: 'sms',
|
|
subject: 'ایجاد صورتحساب',
|
|
body: `صورتحساب جدید به مبلغ ${amountLabel} تومان صادر شد.`,
|
|
relatedEvent: 'payment.created',
|
|
sendFn: () => sendSingleSms(receiver, templateId, [
|
|
{ name: 'amount', value: amountLabel }
|
|
])
|
|
});
|
|
};
|
|
|
|
module.exports = {
|
|
sendAccountCreatedSms,
|
|
sendClassRegisteredSms,
|
|
sendClassReminderSms,
|
|
sendInvoiceCreatedSms
|
|
};
|