From 7610aa4fbd9a301235c16e2b2db229372daff114 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Fri, 29 Dec 2023 10:25:54 -0300 Subject: [PATCH] chore: remove Messages model dependency of Rooms model (#31272) --- .../server/classes/ImportDataConverter.ts | 2 +- .../lib/server/functions/cleanRoomHistory.ts | 4 +++- .../app/lib/server/functions/deleteMessage.ts | 14 +++++------- apps/meteor/server/models/raw/Messages.ts | 12 ---------- apps/meteor/server/models/raw/Rooms.ts | 17 +++++--------- .../server/services/messages/service.ts | 22 ++++++++++++------- .../model-typings/src/models/IRoomsModel.ts | 2 +- 7 files changed, 30 insertions(+), 43 deletions(-) diff --git a/apps/meteor/app/importer/server/classes/ImportDataConverter.ts b/apps/meteor/app/importer/server/classes/ImportDataConverter.ts index fff8e8c9efd..95c22db148e 100644 --- a/apps/meteor/app/importer/server/classes/ImportDataConverter.ts +++ b/apps/meteor/app/importer/server/classes/ImportDataConverter.ts @@ -807,7 +807,7 @@ export class ImportDataConverter { for await (const rid of rids) { try { - await Rooms.resetLastMessageById(rid); + await Rooms.resetLastMessageById(rid, null); } catch (e) { this._logger.warn(`Failed to update last message of room ${rid}`); this._logger.error(e); diff --git a/apps/meteor/app/lib/server/functions/cleanRoomHistory.ts b/apps/meteor/app/lib/server/functions/cleanRoomHistory.ts index 64202ab39da..2b495ec4b0d 100644 --- a/apps/meteor/app/lib/server/functions/cleanRoomHistory.ts +++ b/apps/meteor/app/lib/server/functions/cleanRoomHistory.ts @@ -111,7 +111,9 @@ export async function cleanRoomHistory({ if (count) { const lastMessage = await Messages.getLastVisibleMessageSentWithNoTypeByRoomId(rid); - await Rooms.resetLastMessageById(rid, lastMessage); + + await Rooms.resetLastMessageById(rid, lastMessage, -count); + void api.broadcast('notify.deleteMessageBulk', rid, { rid, excludePinned, diff --git a/apps/meteor/app/lib/server/functions/deleteMessage.ts b/apps/meteor/app/lib/server/functions/deleteMessage.ts index c197f93518c..37ae7225441 100644 --- a/apps/meteor/app/lib/server/functions/deleteMessage.ts +++ b/apps/meteor/app/lib/server/functions/deleteMessage.ts @@ -79,16 +79,14 @@ export async function deleteMessage(message: IMessage, user: IUser): Promise implements IMessagesModel { const data = Object.assign(record, extraData); - await Rooms.incMsgCountById(rid, 1); - return this.insertOne(data); } @@ -1464,10 +1461,6 @@ export class MessagesRaw extends BaseRaw implements IMessagesModel { if (!limit) { const count = (await this.deleteMany(query)).deletedCount - notCountedMessages; - if (count) { - // decrease message count - await Rooms.decreaseMessageCountById(rid, count); - } return count; } @@ -1481,11 +1474,6 @@ export class MessagesRaw extends BaseRaw implements IMessagesModel { }) ).deletedCount - notCountedMessages; - if (count) { - // decrease message count - await Rooms.decreaseMessageCountById(rid, count); - } - return count; } diff --git a/apps/meteor/server/models/raw/Rooms.ts b/apps/meteor/server/models/raw/Rooms.ts index 536719c5983..9c1b14dc3f3 100644 --- a/apps/meteor/server/models/raw/Rooms.ts +++ b/apps/meteor/server/models/raw/Rooms.ts @@ -1566,20 +1566,13 @@ export class RoomsRaw extends BaseRaw implements IRoomsModel { return this.updateOne(query, update); } - async resetLastMessageById(_id: IRoom['_id'], lastMessage: IRoom['lastMessage']): Promise { + async resetLastMessageById(_id: IRoom['_id'], lastMessage: IRoom['lastMessage'] | null, msgCountDelta?: number): Promise { const query: Filter = { _id }; - const update: UpdateFilter = lastMessage - ? { - $set: { - lastMessage, - }, - } - : { - $unset: { - lastMessage: 1, - }, - }; + const update = { + ...(lastMessage ? { $set: { lastMessage } } : { $unset: { lastMessage: 1 as const } }), + ...(msgCountDelta ? { $inc: { msgs: msgCountDelta } } : {}), + }; return this.updateOne(query, update); } diff --git a/apps/meteor/server/services/messages/service.ts b/apps/meteor/server/services/messages/service.ts index 22b05029a65..f20c545f6ab 100644 --- a/apps/meteor/server/services/messages/service.ts +++ b/apps/meteor/server/services/messages/service.ts @@ -108,18 +108,24 @@ export class MessageService extends ServiceClassInternal implements IMessageServ if (!username) { throw new Error('The username cannot be empty.'); } - const result = await Messages.createWithTypeRoomIdMessageUserAndUnread( - type, - rid, - message, - { _id: userId, username, name }, - settings.get('Message_Read_Receipt_Enabled'), - extraData, - ); + + const [result] = await Promise.all([ + Messages.createWithTypeRoomIdMessageUserAndUnread( + type, + rid, + message, + { _id: userId, username, name }, + settings.get('Message_Read_Receipt_Enabled'), + extraData, + ), + Rooms.incMsgCountById(rid, 1), + ]); + void broadcastMessageSentEvent({ id: result.insertedId, broadcastCallback: async (message) => this.api?.broadcast('message.sent', message), }); + return result.insertedId; } diff --git a/packages/model-typings/src/models/IRoomsModel.ts b/packages/model-typings/src/models/IRoomsModel.ts index 66ffe923274..215eac8b232 100644 --- a/packages/model-typings/src/models/IRoomsModel.ts +++ b/packages/model-typings/src/models/IRoomsModel.ts @@ -239,7 +239,7 @@ export interface IRoomsModel extends IBaseModel { incUsersCountById(rid: string, inc: number): Promise; incUsersCountNotDMsByIds(rids: string[], inc: number): Promise; setLastMessageById(rid: string, lastMessage: IRoom['lastMessage']): Promise; - resetLastMessageById(rid: string, lastMessage?: IMessage | null): Promise; + resetLastMessageById(rid: string, lastMessage: IMessage | null, msgCountDelta?: number): Promise; replaceUsername(username: string, newUsername: string): Promise; replaceMutedUsername(username: string, newUsername: string): Promise; replaceUsernameOfUserByUserId(userId: string, newUsername: string): Promise;