import { Apps, AppEvents } from '@rocket.chat/apps'; import type { IMessage, IUser } from '@rocket.chat/core-typings'; import type { ServerMethods } from '@rocket.chat/ddp-client'; import { Messages, Subscriptions, Rooms } from '@rocket.chat/models'; import { Meteor } from 'meteor/meteor'; import { settings } from '../../../settings'; import { canAccessRoomAsync, roomAccessAttributes } from '../../authorization'; import { methodDeprecationLogger } from '../../deprecationWarningLogger'; import { isTheLastMessage } from '../../messages/isTheLastMessage'; import { notifyOnRoomChangedById, notifyOnMessageChange } from '../../notifyListener'; declare module '@rocket.chat/ddp-client' { // eslint-disable-next-line @typescript-eslint/naming-convention interface ServerMethods { starMessage(message: Pick & { starred: boolean }): boolean; } } export const starMessage = async (user: IUser, message: Pick & { starred: boolean }): Promise => { if (!settings.get('Message_AllowStarring')) { throw new Meteor.Error('error-action-not-allowed', 'Message starring not allowed', { method: 'starMessage', action: 'Message_starring', }); } const subscription = await Subscriptions.findOneByRoomIdAndUserId(message.rid, user._id, { projection: { _id: 1 }, }); if (!subscription) { return false; } if (!(await Messages.findOneByRoomIdAndMessageId(message.rid, message._id))) { return false; } const room = await Rooms.findOneById(message.rid, { projection: { ...roomAccessAttributes, lastMessage: 1 } }); if (!room) { throw new Meteor.Error('error-not-allowed', 'Not allowed', { method: 'starMessage' }); } if (!(await canAccessRoomAsync(room, { _id: user._id }))) { throw new Meteor.Error('not-authorized', 'Not Authorized', { method: 'starMessage' }); } if (isTheLastMessage(room, message)) { await Rooms.updateLastMessageStar(room._id, user._id, message.starred); void notifyOnRoomChangedById(room._id); } await Apps.self?.triggerEvent(AppEvents.IPostMessageStarred, message, user, message.starred); await Messages.updateUserStarById(message._id, user._id, message.starred); void notifyOnMessageChange({ id: message._id, }); return true; }; Meteor.methods({ async starMessage(message) { methodDeprecationLogger.method('starMessage', '9.0.0', '/v1/chat.starMessage'); const user = (await Meteor.userAsync()) as IUser; if (!user) { throw new Meteor.Error('error-invalid-user', 'Invalid user', { method: 'starMessage', }); } return starMessage(user, message); }, });