Initial commit: teaching institution management API.

Express/MongoDB backend with JWT auth, RBAC, S3 uploads, notifications, and scheduled jobs.
This commit is contained in:
2026-08-09 04:18:08 +02:00
commit f04c797be6
107 changed files with 9190 additions and 0 deletions
+64
View File
@@ -0,0 +1,64 @@
// /utils/senders/smsMessages.js
'use strict';
const config = require('../../config/config');
const { sendSingleSms } = require('./sms.base');
const { recordAndSend } = require('./notificationRecorder');
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) => {
const userId = await resolveUserIdByPhone(receiver);
return recordAndSend({
userId,
channel: 'sms',
subject: 'ایجاد حساب کاربری',
body: `حساب کاربری شما ایجاد شد. نام کاربری: ${username}`,
relatedEvent: 'user.created',
sendFn: () => sendSingleSms(receiver, config.SMS_TEMPLATE_ACCOUNT_CREATED, [
{ name: 'username', value: String(username) },
{ name: 'password', value: String(password) }
])
});
};
const sendClassRegisteredSms = async (receiver, className, userId = null) => {
const resolvedUserId = userId || await resolveUserIdByPhone(receiver);
return recordAndSend({
userId: resolvedUserId,
channel: 'sms',
subject: 'ثبت‌نام در کلاس',
body: `ثبت‌نام شما در کلاس «${className}» انجام شد.`,
relatedEvent: 'user.enrolled',
sendFn: () => sendSingleSms(receiver, config.SMS_TEMPLATE_CLASS_REGISTERED, [
{ name: 'className', value: String(className) }
])
});
};
const sendClassReminderSms = async (receiver, className, time, place = '', userId = null) => {
const resolvedUserId = userId || await resolveUserIdByPhone(receiver);
return recordAndSend({
userId: resolvedUserId,
channel: 'sms',
subject: 'یادآوری کلاس',
body: `یادآوری کلاس «${className}» ساعت ${time} — مکان: ${place || '-'}`,
relatedEvent: 'session.reminder',
sendFn: () => sendSingleSms(receiver, config.SMS_TEMPLATE_CLASS_REMINDER, [
{ name: 'className', value: String(className) },
{ name: 'time', value: String(time) },
{ name: 'place', value: String(place || '-') }
])
});
};
module.exports = {
sendAccountCreatedSms,
sendClassRegisteredSms,
sendClassReminderSms
};