Skip to content

Commit b94b452

Browse files
committed
fix(api): modifica fetchChats para trazer mensagens de contatos não salvos
- Muda tabela base da consulta de Contact para Message - Altera INNER JOIN para LEFT JOIN entre Message e Contact - Usa COALESCE para campos que podem estar vazios - Adiciona flag isSaved para identificar contatos salvos/não salvos - Preserva toda funcionalidade de filtros existente Resolve issue #1376
1 parent 2ded197 commit b94b452

File tree

1 file changed

+68
-78
lines changed

1 file changed

+68
-78
lines changed

src/api/services/channel.service.ts

Lines changed: 68 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -682,13 +682,6 @@ export class ChannelStartupService {
682682
: createJid(query.where?.remoteJid)
683683
: null;
684684

685-
const limit =
686-
query.offset && !query.page
687-
? Prisma.sql` LIMIT ${query.offset}`
688-
: query.offset && query.page
689-
? Prisma.sql` LIMIT ${query.offset} OFFSET ${((query.page as number) - 1) * query.offset}`
690-
: Prisma.sql``;
691-
692685
const where = {
693686
instanceId: this.instanceId,
694687
};
@@ -700,91 +693,88 @@ export class ChannelStartupService {
700693
const timestampFilter =
701694
query?.where?.messageTimestamp?.gte && query?.where?.messageTimestamp?.lte
702695
? Prisma.sql`
703-
AND "Message"."messageTimestamp" >= ${Math.floor(new Date(query.where.messageTimestamp.gte).getTime() / 1000)}
704-
AND "Message"."messageTimestamp" <= ${Math.floor(new Date(query.where.messageTimestamp.lte).getTime() / 1000)}`
696+
AND "Message"."messageTimestamp" >= ${Math.floor(new Date(query.where.messageTimestamp.gte).getTime() / 1000)}
697+
AND "Message"."messageTimestamp" <= ${Math.floor(new Date(query.where.messageTimestamp.lte).getTime() / 1000)}`
705698
: Prisma.sql``;
706699

707700
const results = await this.prismaRepository.$queryRaw`
708-
WITH rankedMessages AS (
709-
SELECT DISTINCT ON ("Contact"."remoteJid")
710-
"Contact"."id",
711-
"Contact"."remoteJid",
712-
"Contact"."pushName",
713-
"Contact"."profilePicUrl",
714-
COALESCE(
715-
to_timestamp("Message"."messageTimestamp"::double precision),
716-
"Contact"."updatedAt"
717-
) as "updatedAt",
718-
"Chat"."name" as "chatName",
719-
"Chat"."createdAt" as "windowStart",
720-
"Chat"."createdAt" + INTERVAL '24 hours' as "windowExpires",
721-
CASE
722-
WHEN "Chat"."createdAt" + INTERVAL '24 hours' > NOW() THEN true
723-
ELSE false
724-
END as "windowActive",
725-
"Message"."id" AS lastMessageId,
726-
"Message"."key" AS lastMessage_key,
727-
"Message"."pushName" AS lastMessagePushName,
728-
"Message"."participant" AS lastMessageParticipant,
729-
"Message"."messageType" AS lastMessageMessageType,
730-
"Message"."message" AS lastMessageMessage,
731-
"Message"."contextInfo" AS lastMessageContextInfo,
732-
"Message"."source" AS lastMessageSource,
733-
"Message"."messageTimestamp" AS lastMessageMessageTimestamp,
734-
"Message"."instanceId" AS lastMessageInstanceId,
735-
"Message"."sessionId" AS lastMessageSessionId,
736-
"Message"."status" AS lastMessageStatus
737-
FROM "Contact"
738-
INNER JOIN "Message" ON "Message"."key"->>'remoteJid' = "Contact"."remoteJid"
739-
LEFT JOIN "Chat" ON "Chat"."remoteJid" = "Contact"."remoteJid"
740-
AND "Chat"."instanceId" = "Contact"."instanceId"
741-
WHERE
742-
"Contact"."instanceId" = ${this.instanceId}
743-
AND "Message"."instanceId" = ${this.instanceId}
744-
${remoteJid ? Prisma.sql`AND "Contact"."remoteJid" = ${remoteJid}` : Prisma.sql``}
745-
${timestampFilter}
746-
ORDER BY
747-
"Contact"."remoteJid",
748-
"Message"."messageTimestamp" DESC
749-
${limit}
750-
)
751-
SELECT * FROM rankedMessages
752-
ORDER BY "updatedAt" DESC NULLS LAST;
701+
WITH rankedMessages AS (
702+
SELECT DISTINCT ON ("Message"."key"->>'remoteJid')
703+
"Contact"."id" as "contactId",
704+
"Message"."key"->>'remoteJid' as "remoteJid",
705+
COALESCE("Contact"."pushName", "Message"."pushName") as "pushName",
706+
"Contact"."profilePicUrl",
707+
COALESCE(
708+
to_timestamp("Message"."messageTimestamp"::double precision),
709+
"Contact"."updatedAt"
710+
) as "updatedAt",
711+
"Chat"."createdAt" as "windowStart",
712+
"Chat"."createdAt" + INTERVAL '24 hours' as "windowExpires",
713+
CASE WHEN "Chat"."createdAt" + INTERVAL '24 hours' > NOW() THEN true ELSE false END as "windowActive",
714+
"Message"."id" AS lastMessageId,
715+
"Message"."key" AS lastMessage_key,
716+
"Message"."pushName" AS lastMessagePushName,
717+
"Message"."participant" AS lastMessageParticipant,
718+
"Message"."messageType" AS lastMessageMessageType,
719+
"Message"."message" AS lastMessageMessage,
720+
"Message"."contextInfo" AS lastMessageContextInfo,
721+
"Message"."source" AS lastMessageSource,
722+
"Message"."messageTimestamp" AS lastMessageMessageTimestamp,
723+
"Message"."instanceId" AS lastMessageInstanceId,
724+
"Message"."sessionId" AS lastMessageSessionId,
725+
"Message"."status" AS lastMessageStatus
726+
FROM "Message"
727+
LEFT JOIN "Contact" ON "Contact"."remoteJid" = "Message"."key"->>'remoteJid' AND "Contact"."instanceId" = "Message"."instanceId"
728+
LEFT JOIN "Chat" ON "Chat"."remoteJid" = "Message"."key"->>'remoteJid' AND "Chat"."instanceId" = "Message"."instanceId"
729+
WHERE "Message"."instanceId" = ${this.instanceId}
730+
${remoteJid ? Prisma.sql`AND "Message"."key"->>'remoteJid' = ${remoteJid}` : Prisma.sql``}
731+
${timestampFilter}
732+
ORDER BY "Message"."key"->>'remoteJid', "Message"."messageTimestamp" DESC
733+
)
734+
SELECT * FROM rankedMessages
735+
ORDER BY "updatedAt" DESC NULLS LAST;
753736
`;
754737

755-
if (results && isArray(results) && results.length > 0) {
756-
const mappedResults = results.map((contact) => {
757-
const lastMessage = contact.lastMessageId
738+
if (results && Array.isArray(results) && results.length > 0) {
739+
const mappedResults = results.map((item) => {
740+
const lastMessage = item.lastMessageId
758741
? {
759-
id: contact.lastMessageId,
760-
key: contact.lastMessageKey,
761-
pushName: contact.lastMessagePushName,
762-
participant: contact.lastMessageParticipant,
763-
messageType: contact.lastMessageMessageType,
764-
message: contact.lastMessageMessage,
765-
contextInfo: contact.lastMessageContextInfo,
766-
source: contact.lastMessageSource,
767-
messageTimestamp: contact.lastMessageMessageTimestamp,
768-
instanceId: contact.lastMessageInstanceId,
769-
sessionId: contact.lastMessageSessionId,
770-
status: contact.lastMessageStatus,
742+
id: item.lastMessageId,
743+
key: item.lastMessage_key,
744+
pushName: item.lastMessagePushName,
745+
participant: item.lastMessageParticipant,
746+
messageType: item.lastMessageMessageType,
747+
message: item.lastMessageMessage,
748+
contextInfo: item.lastMessageContextInfo,
749+
source: item.lastMessageSource,
750+
messageTimestamp: item.lastMessageMessageTimestamp,
751+
instanceId: item.lastMessageInstanceId,
752+
sessionId: item.lastMessageSessionId,
753+
status: item.lastMessageStatus,
771754
}
772755
: undefined;
773756

774757
return {
775-
id: contact.id,
776-
remoteJid: contact.remoteJid,
777-
pushName: contact.pushName,
778-
chatName: contact.chatName,
779-
profilePicUrl: contact.profilePicUrl,
780-
updatedAt: contact.updatedAt,
781-
windowStart: contact.windowStart,
782-
windowExpires: contact.windowExpires,
783-
windowActive: contact.windowActive,
758+
id: item.contactId || null,
759+
remoteJid: item.remoteJid,
760+
pushName: item.pushName,
761+
profilePicUrl: item.profilePicUrl,
762+
updatedAt: item.updatedAt,
763+
windowStart: item.windowStart,
764+
windowExpires: item.windowExpires,
765+
windowActive: item.windowActive,
784766
lastMessage: lastMessage ? this.cleanMessageData(lastMessage) : undefined,
767+
unreadCount: 0,
768+
isSaved: !!item.contactId,
785769
};
786770
});
787771

772+
if (query?.take && query?.skip) {
773+
const skip = query.skip || 0;
774+
const take = query.take || 20;
775+
return mappedResults.slice(skip, skip + take);
776+
}
777+
788778
return mappedResults;
789779
}
790780

0 commit comments

Comments
 (0)