feat: send account and invoice SMS from stored template IDs
Move sms.ir template IDs out of env into settings so SuperAdmin can manage them, and record every outbound SMS status in notifications.
This commit is contained in:
@@ -12,11 +12,19 @@ const toBoolean = (value) => {
|
||||
return ['true', '1', 'yes', 'on'].includes(normalized);
|
||||
};
|
||||
|
||||
const redactSmsParams = (params = []) => (
|
||||
params.map((param) => (
|
||||
String(param?.name || '').toLowerCase() === 'password'
|
||||
? { ...param, value: '[redacted]' }
|
||||
: param
|
||||
))
|
||||
);
|
||||
|
||||
const sendSingleSms = async (mobile, templateId, params = []) => {
|
||||
console.log('[SMS] About to send notification:', {
|
||||
mobile,
|
||||
templateId,
|
||||
params,
|
||||
params: redactSmsParams(params),
|
||||
SMS_ENABLED: config.SMS_ENABLED,
|
||||
});
|
||||
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
// /utils/senders/smsMessages.js
|
||||
'use strict';
|
||||
|
||||
const config = require('../../config/config');
|
||||
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) => {
|
||||
@@ -12,16 +12,17 @@ const resolveUserIdByPhone = async (phoneNumber) => {
|
||||
return user?._id || null;
|
||||
};
|
||||
|
||||
const sendAccountCreatedSms = async (receiver, username, password) => {
|
||||
const userId = await resolveUserIdByPhone(receiver);
|
||||
const sendAccountCreatedSms = async (receiver, username, password, userId = null) => {
|
||||
const resolvedUserId = userId || await resolveUserIdByPhone(receiver);
|
||||
const templateId = await getSmsTemplateId('accountCreated');
|
||||
return recordAndSend({
|
||||
userId,
|
||||
userId: resolvedUserId,
|
||||
channel: 'sms',
|
||||
subject: 'ایجاد حساب کاربری',
|
||||
body: `حساب کاربری شما ایجاد شد. نام کاربری: ${username}`,
|
||||
relatedEvent: 'user.created',
|
||||
sendFn: () => sendSingleSms(receiver, config.SMS_TEMPLATE_ACCOUNT_CREATED, [
|
||||
{ name: 'username', value: String(username) },
|
||||
sendFn: () => sendSingleSms(receiver, templateId, [
|
||||
{ name: 'user', value: String(username) },
|
||||
{ name: 'password', value: String(password) }
|
||||
])
|
||||
});
|
||||
@@ -29,13 +30,14 @@ const sendAccountCreatedSms = async (receiver, username, 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, config.SMS_TEMPLATE_CLASS_REGISTERED, [
|
||||
sendFn: () => sendSingleSms(receiver, templateId, [
|
||||
{ name: 'className', value: String(className) }
|
||||
])
|
||||
});
|
||||
@@ -43,13 +45,14 @@ const sendClassRegisteredSms = async (receiver, className, userId = null) => {
|
||||
|
||||
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, config.SMS_TEMPLATE_CLASS_REMINDER, [
|
||||
sendFn: () => sendSingleSms(receiver, templateId, [
|
||||
{ name: 'className', value: String(className) },
|
||||
{ name: 'time', value: String(time) },
|
||||
{ name: 'place', value: String(place || '-') }
|
||||
@@ -57,8 +60,25 @@ const sendClassReminderSms = async (receiver, className, time, place = '', userI
|
||||
});
|
||||
};
|
||||
|
||||
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
|
||||
sendClassReminderSms,
|
||||
sendInvoiceCreatedSms
|
||||
};
|
||||
|
||||
@@ -7,6 +7,7 @@ const {
|
||||
sendAccountCreatedSms,
|
||||
sendClassRegisteredSms,
|
||||
sendClassReminderSms,
|
||||
sendInvoiceCreatedSms,
|
||||
} = require('./smsMessages');
|
||||
|
||||
/**
|
||||
@@ -34,4 +35,5 @@ module.exports = {
|
||||
sendAccountCreatedSms,
|
||||
sendClassRegisteredSms,
|
||||
sendClassReminderSms,
|
||||
sendInvoiceCreatedSms,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user