Regression: Fix sendMessagesToAdmins not in Fiber (#23770)

pull/23769/head
Diego Sampaio 5 years ago committed by GitHub
parent ed2b4f9123
commit f9469fcb38
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 17
      app/models/server/models/Users.js
  2. 17
      app/models/server/raw/Users.js
  3. 8
      server/lib/sendMessagesToAdmins.d.ts
  4. 45
      server/lib/sendMessagesToAdmins.js
  5. 57
      server/lib/sendMessagesToAdmins.ts
  6. 2
      server/services/nps/notification.ts

@ -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: {

@ -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);
}
}

@ -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)));
}
}

@ -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<IBanner, '_id'> => {
const lng = settings.get<string>('Language') || 'en';

Loading…
Cancel
Save