feat: Automatically mark messages as delivered when recipients come online or receive new messages.

This commit is contained in:
pradeepkumar
2026-03-28 02:02:49 +05:30
parent 0abfa51ed9
commit 1697d638b6
2 changed files with 78 additions and 0 deletions

View File

@@ -99,6 +99,26 @@ export class MessagesGateway implements OnGatewayConnection, OnGatewayDisconnect
.catch((err) => {
this.logger.warn(`Failed to update online status for ${userId}: ${err.message}`);
});
// Mark pending SENT messages as DELIVERED now that this user is online
this.messagesService.markPendingMessagesAsDelivered(userId)
.then((results) => {
for (const result of results) {
// Notify each sender that their messages were delivered
const deliveredEvent = {
messageIds: result.messageIds,
conversationId: result.conversationId,
deliveredAt: result.deliveredAt,
};
this.sendToUser(result.senderId, 'message_delivered', deliveredEvent);
}
if (results.length > 0) {
this.logger.log(`Marked pending messages as delivered for ${userId} across ${results.length} conversation(s)`);
}
})
.catch((err) => {
this.logger.warn(`Failed to mark pending messages as delivered for ${userId}: ${err.message}`);
});
}
/**
@@ -190,6 +210,18 @@ export class MessagesGateway implements OnGatewayConnection, OnGatewayDisconnect
? participants.agentUserId
: participants.userId;
this.sendToUser(otherUserId, 'new_message', message);
// Auto-mark as DELIVERED if recipient is online
if (this.isUserOnline(otherUserId)) {
await this.messagesService.markMessageDelivered(message.id);
const deliveredEvent = {
messageId: message.id,
conversationId: data.conversationId,
deliveredAt: new Date(),
};
// Notify sender that message was delivered
this.sendToUser(client.userId, 'message_delivered', deliveredEvent);
}
}
} catch (participantError) {
this.logger.warn(`Failed to get participants for direct delivery in ${data.conversationId}: ${participantError.message}`);