From 42ea02329a15f0e47bb8850ae0aca9bff4da63d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Bosi?= <71827178+bosiraphael@users.noreply.github.com> Date: Tue, 25 Feb 2025 17:44:42 +0100 Subject: [PATCH] Fix thread pagination (#10485) Fixes https://github.com/twentyhq/twenty/issues/10308. The issue came from the fact that the pagination inside the `findAndCount` wasn't working properly. The limit was applied on the joint table. Adding a `groupBy` fixes this, but since it isn't available on the `findAndCount` I had to modify the query using the query builder. --- .../services/timeline-messaging.service.ts | 52 +++++++++---------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/packages/twenty-server/src/engine/core-modules/messaging/services/timeline-messaging.service.ts b/packages/twenty-server/src/engine/core-modules/messaging/services/timeline-messaging.service.ts index 371d4c0eb..cc1d15e4e 100644 --- a/packages/twenty-server/src/engine/core-modules/messaging/services/timeline-messaging.service.ts +++ b/packages/twenty-server/src/engine/core-modules/messaging/services/timeline-messaging.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@nestjs/common'; -import { Any, Not } from 'typeorm'; +import { In, Not } from 'typeorm'; import { TimelineThread } from 'src/engine/core-modules/messaging/dtos/timeline-thread.dto'; import { TwentyORMManager } from 'src/engine/twenty-orm/twenty-orm.manager'; @@ -32,34 +32,32 @@ export class TimelineMessagingService { 'messageThread', ); - const [messageThreadIds, totalNumberOfThreads] = - await messageThreadRepository.findAndCount({ - select: { - id: true, - }, - where: { - messages: { - messageParticipants: { - personId: Any(personIds), - }, - }, - }, - order: { - messages: { - receivedAt: 'DESC', - }, - }, - skip: offset, - take: pageSize, - relations: ['messages'], - }); + const totalNumberOfThreads = await messageThreadRepository + .createQueryBuilder('messageThread') + .innerJoin('messageThread.messages', 'messages') + .innerJoin('messages.messageParticipants', 'messageParticipants') + .where('messageParticipants.personId IN(:...personIds)', { personIds }) + .groupBy('messageThread.id') + .getCount(); + + const threadIdsQuery = await messageThreadRepository + .createQueryBuilder('messageThread') + .select('messageThread.id', 'id') + .addSelect('MAX(messages.receivedAt)', 'max_received_at') + .innerJoin('messageThread.messages', 'messages') + .innerJoin('messages.messageParticipants', 'messageParticipants') + .where('messageParticipants.personId IN (:...personIds)', { personIds }) + .groupBy('messageThread.id') + .orderBy('max_received_at', 'DESC') + .offset(offset) + .limit(pageSize) + .getRawMany(); + + const messageThreadIds = threadIdsQuery.map((thread) => thread.id); const messageThreads = await messageThreadRepository.find({ - select: { - id: true, - }, where: { - id: Any(messageThreadIds.map((thread) => thread.id)), + id: In(messageThreadIds), }, order: { messages: { @@ -187,7 +185,7 @@ export class TimelineMessagingService { id: true, }, where: { - id: Any(messageThreadIds), + id: In(messageThreadIds), messages: { messageChannelMessageAssociations: { messageChannel: {