Regression: Fix sendMessagesToAdmins not in Fiber (#23770)
parent
ed2b4f9123
commit
f9469fcb38
@ -1,8 +0,0 @@ |
||||
type MessageToAdmin = { |
||||
fromId?: string; |
||||
checkFrom?: boolean; |
||||
msgs?: any[] | Function; |
||||
banners?: any[] | Function; |
||||
}; |
||||
|
||||
export declare function sendMessagesToAdmins(config: MessageToAdmin): void; |
||||
@ -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)); |
||||
}); |
||||
} |
||||
@ -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 = <T>(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<IMessage>[] | Function; |
||||
banners?: Banner[] | Function; |
||||
}): 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 } = createDirectMessage([adminUser.username], fromId); |
||||
|
||||
getData<Partial<IMessage>>(msgs, adminUser) |
||||
.forEach((msg) => executeSendMessage(fromId, Object.assign({ rid }, msg))); |
||||
} catch (error) { |
||||
SystemLogger.error(error); |
||||
} |
||||
} |
||||
|
||||
await Promise.all(getData<Banner>(banners, adminUser).map((banner) => Users.addBannerById(adminUser._id, banner))); |
||||
} |
||||
} |
||||
Loading…
Reference in new issue