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/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..9c1b14dc3f35b 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 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..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): 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;