Skip to content

Commit a449fdf

Browse files
authored
Findchat group name treatment
1 parent d522567 commit a449fdf

File tree

1 file changed

+95
-68
lines changed

1 file changed

+95
-68
lines changed

src/api/services/channel.service.ts

Lines changed: 95 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -503,8 +503,29 @@ export class ChannelStartupService {
503503
where['remoteJid'] = remoteJid;
504504
}
505505

506-
return await this.prismaRepository.contact.findMany({
506+
const contactFindManyArgs: Prisma.ContactFindManyArgs = {
507507
where,
508+
};
509+
510+
if (query.offset) contactFindManyArgs.take = query.offset;
511+
if (query.page) {
512+
const validPage = Math.max(query.page as number, 1);
513+
contactFindManyArgs.skip = query.offset * (validPage - 1);
514+
}
515+
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+
};
508529
});
509530
}
510531

@@ -685,88 +706,94 @@ export class ChannelStartupService {
685706
const timestampFilter =
686707
query?.where?.messageTimestamp?.gte && query?.where?.messageTimestamp?.lte
687708
? Prisma.sql`
688-
AND "Message"."messageTimestamp" >= ${Math.floor(new Date(query.where.messageTimestamp.gte).getTime() / 1000)}
689-
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)}`
690711
: Prisma.sql``;
691712

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

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

757776
return {
758-
id: contact.id,
759-
remoteJid: contact.remoteJid,
760-
pushName: contact.pushName,
761-
profilePicUrl: contact.profilePicUrl,
762-
updatedAt: contact.updatedAt,
763-
windowStart: contact.windowStart,
764-
windowExpires: contact.windowExpires,
765-
windowActive: contact.windowActive,
777+
id: item.contactId || null,
778+
remoteJid: item.remoteJid,
779+
pushName: item.pushName,
780+
profilePicUrl: item.profilePicUrl,
781+
updatedAt: item.updatedAt,
782+
windowStart: item.windowStart,
783+
windowExpires: item.windowExpires,
784+
windowActive: item.windowActive,
766785
lastMessage: lastMessage ? this.cleanMessageData(lastMessage) : undefined,
786+
unreadCount: 0,
787+
isSaved: !!item.contactId,
767788
};
768789
});
769790

791+
if (query?.take && query?.skip) {
792+
const skip = query.skip || 0;
793+
const take = query.take || 20;
794+
return mappedResults.slice(skip, skip + take);
795+
}
796+
770797
return mappedResults;
771798
}
772799

0 commit comments

Comments
 (0)