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/moderation/reportMessage.ts

55 lines
1.5 KiB

import { Messages, ModerationReports, Rooms, Users } from '@rocket.chat/models';
import type { IMessage, IUser } from '@rocket.chat/core-typings';
import { canAccessRoomAsync } from '../../../app/authorization/server/functions/canAccessRoom';
import { AppEvents, Apps } from '../../../ee/server/apps';
export const reportMessage = async (messageId: IMessage['_id'], description: string, uid: IUser['_id']) => {
if (!uid) {
throw new Error('error-invalid-user');
}
if (!description.trim()) {
throw new Error('error-invalid-description');
}
const message = await Messages.findOneById(messageId);
if (!message) {
throw new Error('error-invalid-message_id');
}
const user = await Users.findOneById(uid);
if (!user) {
throw new Error('error-invalid-user');
}
const { rid } = message;
// If the user can't access the room where the message is, report that the message id is invalid
const room = await Rooms.findOneById(rid);
if (!room || !(await canAccessRoomAsync(room, { _id: uid }))) {
throw new Error('error-invalid-message_id');
}
const reportedBy = {
_id: user._id,
username: user.username,
name: user.name,
createdAt: user.createdAt,
};
const roomInfo = {
_id: rid,
name: room.name,
t: room.t,
federated: room.federated,
fname: room.fname,
};
await ModerationReports.createWithMessageDescriptionAndUserId(message, description, roomInfo, reportedBy);
await Apps.triggerEvent(AppEvents.IPostMessageReported, message, user, description);
return true;
};