From 9ec47a276afeeca3f692d0aff024fb4781386900 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Tue, 19 Dec 2023 10:23:20 -0300 Subject: [PATCH 1/2] chore: remove Messages model dep of Rooms model --- .../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 | 30 +++++++++++-------- .../server/services/messages/service.ts | 22 +++++++++----- .../model-typings/src/models/IRoomsModel.ts | 2 +- 6 files changed, 42 insertions(+), 42 deletions(-) diff --git a/apps/meteor/app/lib/server/functions/cleanRoomHistory.ts b/apps/meteor/app/lib/server/functions/cleanRoomHistory.ts index 64202ab39dabc..2b495ec4b0d0a 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 c197f93518ce0..37ae722544187 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 536719c5983af..afd2800d7bf89 100644 --- a/apps/meteor/server/models/raw/Rooms.ts +++ b/apps/meteor/server/models/raw/Rooms.ts @@ -1566,20 +1566,26 @@ 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'], msgCounter?: number): Promise { const query: Filter = { _id }; - const update: UpdateFilter = lastMessage - ? { - $set: { - lastMessage, - }, - } - : { - $unset: { - lastMessage: 1, - }, - }; + const update: UpdateFilter = {}; + + if (lastMessage) { + update.$set = { + lastMessage, + }; + } else { + update.$unset = { + lastMessage: 1, + }; + } + + if (msgCounter) { + update.$inc = { + msgs: msgCounter, + }; + } return this.updateOne(query, update); } diff --git a/apps/meteor/server/services/messages/service.ts b/apps/meteor/server/services/messages/service.ts index 22b05029a65e2..f20c545f6abef 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 66ffe92327498..70cc7117c1aac 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, msgCounter?: number): Promise; replaceUsername(username: string, newUsername: string): Promise; replaceMutedUsername(username: string, newUsername: string): Promise; replaceUsernameOfUserByUserId(userId: string, newUsername: string): Promise; From ece2b29eaa5f4ae18c25dea0d7b0f886d635b067 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Thu, 28 Dec 2023 15:49:41 -0300 Subject: [PATCH 2/2] minor code improvements --- .../server/classes/ImportDataConverter.ts | 2 +- apps/meteor/server/models/raw/Rooms.ts | 23 ++++--------------- .../model-typings/src/models/IRoomsModel.ts | 2 +- 3 files changed, 7 insertions(+), 20 deletions(-) diff --git a/apps/meteor/app/importer/server/classes/ImportDataConverter.ts b/apps/meteor/app/importer/server/classes/ImportDataConverter.ts index fff8e8c9efd48..95c22db148ed3 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/server/models/raw/Rooms.ts b/apps/meteor/server/models/raw/Rooms.ts index afd2800d7bf89..9c1b14dc3f35b 100644 --- a/apps/meteor/server/models/raw/Rooms.ts +++ b/apps/meteor/server/models/raw/Rooms.ts @@ -1566,26 +1566,13 @@ export class RoomsRaw extends BaseRaw implements IRoomsModel { return this.updateOne(query, update); } - async resetLastMessageById(_id: IRoom['_id'], lastMessage?: IRoom['lastMessage'], msgCounter?: number): Promise { + async resetLastMessageById(_id: IRoom['_id'], lastMessage: IRoom['lastMessage'] | null, msgCountDelta?: number): Promise { const query: Filter = { _id }; - const update: UpdateFilter = {}; - - if (lastMessage) { - update.$set = { - lastMessage, - }; - } else { - update.$unset = { - lastMessage: 1, - }; - } - - if (msgCounter) { - update.$inc = { - msgs: msgCounter, - }; - } + const update = { + ...(lastMessage ? { $set: { lastMessage } } : { $unset: { lastMessage: 1 as const } }), + ...(msgCountDelta ? { $inc: { msgs: msgCountDelta } } : {}), + }; return this.updateOne(query, update); } diff --git a/packages/model-typings/src/models/IRoomsModel.ts b/packages/model-typings/src/models/IRoomsModel.ts index 70cc7117c1aac..215eac8b232d6 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, msgCounter?: number): 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;