feat: add messaging toggles, password reset SMS, and payment discounts
Allow SuperAdmin to disable SMS, email, and bot from dashboard settings on top of env flags. Add admin password reset with credentials SMS, plus payment discounts, notes, and payable amount handling.
This commit is contained in:
@@ -8,10 +8,14 @@ const bcrypt = require('bcryptjs');
|
||||
const AppError = require('../../utils/AppError');
|
||||
const { calculateMeta, escapeRegex, getSearchTerm } = require('../../utils/pagination');
|
||||
const { generateUsername, generateSimplePassword } = require('../../utils/credentials');
|
||||
const { sendAccountCreatedSms } = require('../../utils/senders/smsMessages');
|
||||
const { sendAccountCreatedSms, sendPasswordResetSms } = require('../../utils/senders/smsMessages');
|
||||
const logger = require('../../utils/logger');
|
||||
const { mergeFullName, normalizeGender } = require('../../utils/userProfile');
|
||||
const { pickNotifyFlags } = require('../../utils/notifyFlags');
|
||||
const {
|
||||
assertCanResetPasswordAndSms,
|
||||
isCredentialsSmsDelivered
|
||||
} = require('./passwordReset');
|
||||
|
||||
const normalizeAdminNotes = (value) => {
|
||||
if (value == null) return undefined;
|
||||
@@ -271,6 +275,37 @@ const deleteUser = async (id) => {
|
||||
if (!user) throw new AppError('USER_NOT_FOUND');
|
||||
};
|
||||
|
||||
const resetPasswordAndSendSms = async (id) => {
|
||||
const user = await User.findById(id);
|
||||
if (!user) throw new AppError('USER_NOT_FOUND');
|
||||
|
||||
const { username, phoneNumber } = assertCanResetPasswordAndSms(user);
|
||||
const plainPassword = generateSimplePassword();
|
||||
user.passwordHash = await bcrypt.hash(plainPassword, 10);
|
||||
user.refreshTokens = [];
|
||||
await user.save();
|
||||
|
||||
let smsSent = false;
|
||||
try {
|
||||
const sendResult = await sendPasswordResetSms(phoneNumber, username, plainPassword, user._id);
|
||||
smsSent = isCredentialsSmsDelivered(sendResult);
|
||||
} catch (err) {
|
||||
logger.error(`[resetPasswordAndSendSms] SMS failed for user=${user._id}: ${err.message}`);
|
||||
}
|
||||
|
||||
logger.info(`[resetPasswordAndSendSms] Password reset for user=${user._id} smsSent=${smsSent}`);
|
||||
|
||||
return {
|
||||
username,
|
||||
phoneNumber,
|
||||
smsSent,
|
||||
generatedCredentials: {
|
||||
username,
|
||||
password: plainPassword
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
const enrollUserInCourse = async (userId, courseId) => {
|
||||
const user = await User.findById(userId);
|
||||
if (!user) throw new AppError('USER_NOT_FOUND');
|
||||
@@ -290,5 +325,6 @@ module.exports = {
|
||||
createUserAdmin,
|
||||
updateUser,
|
||||
deleteUser,
|
||||
resetPasswordAndSendSms,
|
||||
enrollUserInCourse
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user