diff --git a/app/models/server/models/Users.js b/app/models/server/models/Users.js index 6b755bd01a0..f33198de0ab 100644 --- a/app/models/server/models/Users.js +++ b/app/models/server/models/Users.js @@ -1436,23 +1436,6 @@ export class Users extends Base { return this.find(query).count() !== 0; } - addBannerById(_id, banner) { - const query = { - _id, - [`banners.${ banner.id }.read`]: { - $ne: true, - }, - }; - - const update = { - $set: { - [`banners.${ banner.id }`]: banner, - }, - }; - - return this.update(query, update); - } - setBannerReadById(_id, bannerId) { const update = { $set: { diff --git a/app/models/server/raw/Users.js b/app/models/server/raw/Users.js index 0d6ce77ed78..dc2cab7b623 100644 --- a/app/models/server/raw/Users.js +++ b/app/models/server/raw/Users.js @@ -751,4 +751,21 @@ export class UsersRaw extends BaseRaw { const found = await this.findOne(query, options); return !!found; } + + addBannerById(_id, banner) { + const query = { + _id, + [`banners.${ banner.id }.read`]: { + $ne: true, + }, + }; + + const update = { + $set: { + [`banners.${ banner.id }`]: banner, + }, + }; + + return this.updateOne(query, update); + } } diff --git a/server/lib/sendMessagesToAdmins.d.ts b/server/lib/sendMessagesToAdmins.d.ts deleted file mode 100644 index 6c418291f9c..00000000000 --- a/server/lib/sendMessagesToAdmins.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -type MessageToAdmin = { - fromId?: string; - checkFrom?: boolean; - msgs?: any[] | Function; - banners?: any[] | Function; -}; - -export declare function sendMessagesToAdmins(config: MessageToAdmin): void; diff --git a/server/lib/sendMessagesToAdmins.js b/server/lib/sendMessagesToAdmins.js deleted file mode 100644 index 08af72647e9..00000000000 --- a/server/lib/sendMessagesToAdmins.js +++ /dev/null @@ -1,45 +0,0 @@ - -import { Meteor } from 'meteor/meteor'; - -import { SystemLogger } from './logger/system'; -import { Users } from '../../app/models/server'; -import { Roles } from '../../app/models/server/raw'; - -export async function sendMessagesToAdmins(message) { - const fromUser = message.checkFrom ? Users.findOneById(message.fromId, { fields: { _id: 1 } }) : true; - const users = await Roles.findUsersInRole('admin'); - - users.forEach((adminUser) => { - if (fromUser) { - try { - Meteor.runAsUser(message.fromId, () => Meteor.call('createDirectMessage', adminUser.username)); - - const rid = [adminUser._id, message.fromId].sort().join(''); - - if (typeof message.msgs === 'function') { - message.msgs = message.msgs({ adminUser }); - } - - if (!Array.isArray(message.msgs)) { - message.msgs = [message.msgs]; - } - - if (typeof message.banners === 'function') { - message.banners = message.banners({ adminUser }); - } - - if (!Array.isArray(message.banners)) { - message.banners = [message.banners]; - } - - Meteor.runAsUser(message.fromId, () => { - message.msgs.forEach((msg) => Meteor.call('sendMessage', Object.assign({ rid }, msg))); - }); - } catch (e) { - SystemLogger.error(e); - } - } - - message.banners.forEach((banner) => Users.addBannerById(adminUser._id, banner)); - }); -} diff --git a/server/lib/sendMessagesToAdmins.ts b/server/lib/sendMessagesToAdmins.ts new file mode 100644 index 00000000000..eed6ad798a6 --- /dev/null +++ b/server/lib/sendMessagesToAdmins.ts @@ -0,0 +1,57 @@ +import { SystemLogger } from './logger/system'; +import { Roles, Users } from '../../app/models/server/raw'; +import { executeSendMessage } from '../../app/lib/server/methods/sendMessage'; +import { createDirectMessage } from '../methods/createDirectMessage'; +import { IUser } from '../../definition/IUser'; +import { IMessage } from '../../definition/IMessage'; + +type Banner = { + id: string; + priority: number; + title: string; + text: string; + textArguments?: string[]; + modifiers: string[]; + link: string; +}; + +const getData = (param: T[] | Function, adminUser: IUser): T[] => { + const result = typeof param === 'function' ? param({ adminUser }) : param; + + if (!Array.isArray(result)) { + return [result]; + } + + return result; +}; + +export async function sendMessagesToAdmins({ + fromId = 'rocket.cat', + checkFrom = true, + msgs = [], + banners = [], +}: { + fromId?: string; + checkFrom?: boolean; + msgs?: Partial[] | Function; + banners?: Banner[] | Function; +}): Promise { + const fromUser = checkFrom ? await Users.findOneById(fromId, { projection: { _id: 1 } }) : true; + + const users = await (await Roles.findUsersInRole('admin')).toArray(); + + for await (const adminUser of users) { + if (fromUser) { + try { + const { rid } = createDirectMessage([adminUser.username], fromId); + + getData>(msgs, adminUser) + .forEach((msg) => executeSendMessage(fromId, Object.assign({ rid }, msg))); + } catch (error) { + SystemLogger.error(error); + } + } + + await Promise.all(getData(banners, adminUser).map((banner) => Users.addBannerById(adminUser._id, banner))); + } +} diff --git a/server/services/nps/notification.ts b/server/services/nps/notification.ts index af483278108..0c65301812a 100644 --- a/server/services/nps/notification.ts +++ b/server/services/nps/notification.ts @@ -6,7 +6,7 @@ import moment from 'moment'; import { settings } from '../../../app/settings/server'; import { IBanner, BannerPlatform } from '../../../definition/IBanner'; -import { sendMessagesToAdmins } from '../../lib/sendMessagesToAdmins.js'; +import { sendMessagesToAdmins } from '../../lib/sendMessagesToAdmins'; export const getBannerForAdmins = Meteor.bindEnvironment((expireAt: Date): Omit => { const lng = settings.get('Language') || 'en';