The communications platform that puts data protection first.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
Rocket.Chat/apps/meteor/server/lib/sendMessagesToAdmins.ts

58 lines
1.7 KiB

import type { IUser, IMessage } from '@rocket.chat/core-typings';
import { Roles, Users } from '@rocket.chat/models';
import { SystemLogger } from './logger/system';
import { executeSendMessage } from '../../app/lib/server/methods/sendMessage';
import { createDirectMessage } from '../methods/createDirectMessage';
type Banner = {
id: string;
priority: number;
title: string;
text: string;
textArguments?: string[];
modifiers: string[];
link: string;
};
const getData = async <T>(param: T[] | ((params: { adminUser: IUser }) => Promise<T[] | T>), adminUser: IUser): Promise<T[]> => {
const result = typeof param === 'function' ? await 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<IMessage>[] | ((params: { adminUser: IUser }) => Promise<Partial<IMessage>[] | Partial<IMessage>>);
banners?: Banner[] | ((params: { adminUser: IUser }) => Promise<Banner[]>);
}): Promise<void> {
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 } = await createDirectMessage([adminUser.username], fromId);
await Promise.all(
(await getData<Partial<IMessage>>(msgs, adminUser)).map((msg) => executeSendMessage(fromId, Object.assign({ rid }, msg))),
);
} catch (error) {
SystemLogger.error(error);
}
}
await Promise.all((await getData<Banner>(banners, adminUser)).map((banner) => Users.addBannerById(adminUser._id, banner)));
}
}