Skip to content

Commit ccbd866

Browse files
Merge pull request #1384 from leandrosroc/develop
fix(api): modifica fetchChats para trazer mensagens de contatos não salvos
2 parents 2ded197 + eeedfb0 commit ccbd866

File tree

1 file changed

+86
-78
lines changed

1 file changed

+86
-78
lines changed

src/api/services/channel.service.ts

Lines changed: 86 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,20 @@ export class ChannelStartupService {
513513
contactFindManyArgs.skip = query.offset * (validPage - 1);
514514
}
515515

516-
return await this.prismaRepository.contact.findMany(contactFindManyArgs);
516+
const contacts = await this.prismaRepository.contact.findMany(contactFindManyArgs);
517+
518+
return contacts.map((contact) => {
519+
const remoteJid = contact.remoteJid;
520+
const isGroup = remoteJid.endsWith('@g.us');
521+
const isSaved = !!contact.pushName || !!contact.profilePicUrl;
522+
const type = isGroup ? 'group' : isSaved ? 'contact' : 'group_member';
523+
return {
524+
...contact,
525+
isGroup,
526+
isSaved,
527+
type,
528+
};
529+
});
517530
}
518531

519532
public cleanMessageData(message: any) {
@@ -682,13 +695,6 @@ export class ChannelStartupService {
682695
: createJid(query.where?.remoteJid)
683696
: null;
684697

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-
692698
const where = {
693699
instanceId: this.instanceId,
694700
};
@@ -700,91 +706,93 @@ export class ChannelStartupService {
700706
const timestampFilter =
701707
query?.where?.messageTimestamp?.gte && query?.where?.messageTimestamp?.lte
702708
? 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)}`
709+
AND "Message"."messageTimestamp" >= ${Math.floor(new Date(query.where.messageTimestamp.gte).getTime() / 1000)}
710+
AND "Message"."messageTimestamp" <= ${Math.floor(new Date(query.where.messageTimestamp.lte).getTime() / 1000)}`
705711
: Prisma.sql``;
706712

713+
const limit = query?.take ? Prisma.sql`LIMIT ${query.take}` : Prisma.sql``;
714+
const offset = query?.skip ? Prisma.sql`OFFSET ${query.skip}` : Prisma.sql``;
715+
707716
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;
717+
WITH rankedMessages AS (
718+
SELECT DISTINCT ON ("Message"."key"->>'remoteJid')
719+
"Contact"."id" as "contactId",
720+
"Message"."key"->>'remoteJid' as "remoteJid",
721+
COALESCE("Contact"."pushName", "Message"."pushName") as "pushName",
722+
"Contact"."profilePicUrl",
723+
COALESCE(
724+
to_timestamp("Message"."messageTimestamp"::double precision),
725+
"Contact"."updatedAt"
726+
) as "updatedAt",
727+
"Chat"."createdAt" as "windowStart",
728+
"Chat"."createdAt" + INTERVAL '24 hours' as "windowExpires",
729+
CASE WHEN "Chat"."createdAt" + INTERVAL '24 hours' > NOW() THEN true ELSE false END as "windowActive",
730+
"Message"."id" AS lastMessageId,
731+
"Message"."key" AS lastMessage_key,
732+
"Message"."pushName" AS lastMessagePushName,
733+
"Message"."participant" AS lastMessageParticipant,
734+
"Message"."messageType" AS lastMessageMessageType,
735+
"Message"."message" AS lastMessageMessage,
736+
"Message"."contextInfo" AS lastMessageContextInfo,
737+
"Message"."source" AS lastMessageSource,
738+
"Message"."messageTimestamp" AS lastMessageMessageTimestamp,
739+
"Message"."instanceId" AS lastMessageInstanceId,
740+
"Message"."sessionId" AS lastMessageSessionId,
741+
"Message"."status" AS lastMessageStatus
742+
FROM "Message"
743+
LEFT JOIN "Contact" ON "Contact"."remoteJid" = "Message"."key"->>'remoteJid' AND "Contact"."instanceId" = "Message"."instanceId"
744+
LEFT JOIN "Chat" ON "Chat"."remoteJid" = "Message"."key"->>'remoteJid' AND "Chat"."instanceId" = "Message"."instanceId"
745+
WHERE "Message"."instanceId" = ${this.instanceId}
746+
${remoteJid ? Prisma.sql`AND "Message"."key"->>'remoteJid' = ${remoteJid}` : Prisma.sql``}
747+
${timestampFilter}
748+
ORDER BY "Message"."key"->>'remoteJid', "Message"."messageTimestamp" DESC
749+
)
750+
SELECT * FROM rankedMessages
751+
ORDER BY "updatedAt" DESC NULLS LAST
752+
${limit}
753+
${offset};
753754
`;
754755

755756
if (results && isArray(results) && results.length > 0) {
756-
const mappedResults = results.map((contact) => {
757-
const lastMessage = contact.lastMessageId
757+
const mappedResults = results.map((item) => {
758+
const lastMessage = item.lastMessageId
758759
? {
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,
760+
id: item.lastMessageId,
761+
key: item.lastMessage_key,
762+
pushName: item.lastMessagePushName,
763+
participant: item.lastMessageParticipant,
764+
messageType: item.lastMessageMessageType,
765+
message: item.lastMessageMessage,
766+
contextInfo: item.lastMessageContextInfo,
767+
source: item.lastMessageSource,
768+
messageTimestamp: item.lastMessageMessageTimestamp,
769+
instanceId: item.lastMessageInstanceId,
770+
sessionId: item.lastMessageSessionId,
771+
status: item.lastMessageStatus,
771772
}
772773
: undefined;
773774

774775
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,
776+
id: item.contactId || null,
777+
remoteJid: item.remoteJid,
778+
pushName: item.pushName,
779+
profilePicUrl: item.profilePicUrl,
780+
updatedAt: item.updatedAt,
781+
windowStart: item.windowStart,
782+
windowExpires: item.windowExpires,
783+
windowActive: item.windowActive,
784784
lastMessage: lastMessage ? this.cleanMessageData(lastMessage) : undefined,
785+
unreadCount: 0,
786+
isSaved: !!item.contactId,
785787
};
786788
});
787789

790+
if (query?.take && query?.skip) {
791+
const skip = query.skip || 0;
792+
const take = query.take || 20;
793+
return mappedResults.slice(skip, skip + take);
794+
}
795+
788796
return mappedResults;
789797
}
790798

0 commit comments

Comments
 (0)