Files
gameno-api/utils/senders/smsMessages.js
T

113 lines
4.0 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);
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
}))
});
};
const sendClassRegisteredSms = async (receiver, className, userId = null) => {
const resolvedUserId = userId || await resolveUserIdByPhone(receiver);
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
}))
});
};
const sendClassReminderSms = async (receiver, className, time, place = '', userId = null) => {
const resolvedUserId = userId || await resolveUserIdByPhone(receiver);
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,
time,
place: place || '-'
}))
});
};
const sendInvoiceCreatedSms = async (receiver, payloadOrAmount, userId = null, extraCourse = '') => {
const isObject = typeof payloadOrAmount === 'object' && payloadOrAmount !== null;
const resolvedUserId = (isObject && payloadOrAmount.userId)
? payloadOrAmount.userId
: (userId || await resolveUserIdByPhone(receiver));
let fullName = '';
let amount = 0;
let course = '';
if (isObject) {
fullName = payloadOrAmount.fullName || '';
amount = payloadOrAmount.amount ?? 0;
course = payloadOrAmount.course || '';
} else {
amount = payloadOrAmount;
course = typeof extraCourse === 'string' ? extraCourse : '';
}
if (!fullName && resolvedUserId) {
const user = await User.findById(resolvedUserId).select('name').lean();
fullName = user?.name || '';
}
const { templateId, variables } = await getSmsTemplate('invoiceCreated');
const amountLabel = String(amount);
const fullNameLabel = String(fullName || '').trim();
const courseLabel = String(course || '').trim();
return recordAndSend({
userId: resolvedUserId,
channel: 'sms',
subject: 'ایجاد صورتحساب',
body: `صورتحساب جدید به مبلغ ${amountLabel} تومان بابت دوره «${courseLabel || '-'}» برای ${fullNameLabel || 'کارآموز'} صادر شد.`,
relatedEvent: 'payment.created',
sendFn: () => sendSingleSms(receiver, templateId, buildSmsParameters(variables, {
fullName: fullNameLabel,
amount: amountLabel,
course: courseLabel
}))
});
};
module.exports = {
sendAccountCreatedSms,
sendClassRegisteredSms,
sendClassReminderSms,
sendInvoiceCreatedSms
};