feat(professors,sms): merge professor with users, add existing user link, professor portal endpoint, and SMS bypass list
This commit is contained in:
@@ -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)
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user