feat(professors,sms): merge professor with users, add existing user link, professor portal endpoint, and SMS bypass list

This commit is contained in:
2026-08-25 03:48:19 +03:30
parent b708a6b777
commit 0a022c0917
14 changed files with 865 additions and 205 deletions
+42 -4
View File
@@ -13,7 +13,8 @@ const {
const { parseIncomingMessaging } = require('../../utils/messagingChannels');
const {
getPublicMessaging,
invalidateMessagingCache
invalidateMessagingCache,
normalizePhoneForBypass
} = require('./messagingFlags');
const {
emptyNotificationSettingsMap,
@@ -82,13 +83,28 @@ const toPublicTemplates = (storedMap, notificationMap = {}) => {
});
};
const formatBypassNumbers = (list) => {
if (!Array.isArray(list)) return [];
return list.map((item) => {
const raw = item.toObject ? item.toObject() : item;
return {
_id: raw._id,
phoneNumber: raw.phoneNumber,
label: raw.label || '',
isActive: raw.isActive !== false,
createdAt: raw.createdAt
};
});
};
const getSettings = async () => {
let doc = await Setting.findOne({ key: SETTINGS_KEY }).lean();
if (!doc) {
const created = await Setting.create({
key: SETTINGS_KEY,
smsTemplates: emptyTemplateMap(),
notificationSettings: emptyNotificationSettingsMap()
notificationSettings: emptyNotificationSettingsMap(),
smsBypassNumbers: []
});
doc = created.toObject();
} else {
@@ -110,7 +126,8 @@ const getSettings = async () => {
return {
smsTemplates: toPublicTemplates(storedMap, notificationMap),
messaging: getPublicMessaging(doc),
notificationSettings: await getPublicNotificationSettings(doc)
notificationSettings: await getPublicNotificationSettings(doc),
smsBypassNumbers: formatBypassNumbers(doc.smsBypassNumbers)
};
};
@@ -250,6 +267,26 @@ const saveSettings = async (body = {}) => {
doc.set('notificationSettings', emptyNotificationSettingsMap());
}
// Handle smsBypassNumbers
if (Array.isArray(body.smsBypassNumbers)) {
const nextBypass = body.smsBypassNumbers
.map((item) => {
const rawPhone = item.phoneNumber || item.phone;
const normalized = normalizePhoneForBypass(rawPhone);
return {
_id: item._id || undefined,
phoneNumber: normalized || rawPhone,
label: String(item.label || '').trim(),
isActive: item.isActive !== false,
createdAt: item.createdAt || new Date()
};
})
.filter((item) => item.phoneNumber && item.phoneNumber.length >= 10);
doc.set('smsBypassNumbers', nextBypass);
doc.markModified('smsBypassNumbers');
}
await doc.save();
invalidateMessagingCache();
invalidateNotificationSettingsCache();
@@ -259,7 +296,8 @@ const saveSettings = async (body = {}) => {
return {
smsTemplates: toPublicTemplates(readStoredMap(saved), finalNotificationMap),
messaging: getPublicMessaging(saved),
notificationSettings: await getPublicNotificationSettings(saved)
notificationSettings: await getPublicNotificationSettings(saved),
smsBypassNumbers: formatBypassNumbers(saved.smsBypassNumbers)
};
};