Findchat group name treatment

This commit is contained in:
luiis716 2025-05-12 16:14:59 -03:00 committed by GitHub
parent d52256718d
commit a449fdf0ef
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -503,8 +503,29 @@ export class ChannelStartupService {
where['remoteJid'] = remoteJid; where['remoteJid'] = remoteJid;
} }
return await this.prismaRepository.contact.findMany({ const contactFindManyArgs: Prisma.ContactFindManyArgs = {
where, where,
};
if (query.offset) contactFindManyArgs.take = query.offset;
if (query.page) {
const validPage = Math.max(query.page as number, 1);
contactFindManyArgs.skip = query.offset * (validPage - 1);
}
const contacts = await this.prismaRepository.contact.findMany(contactFindManyArgs);
return contacts.map((contact) => {
const remoteJid = contact.remoteJid;
const isGroup = remoteJid.endsWith('@g.us');
const isSaved = !!contact.pushName || !!contact.profilePicUrl;
const type = isGroup ? 'group' : isSaved ? 'contact' : 'group_member';
return {
...contact,
isGroup,
isSaved,
type,
};
}); });
} }
@ -685,88 +706,94 @@ export class ChannelStartupService {
const timestampFilter = const timestampFilter =
query?.where?.messageTimestamp?.gte && query?.where?.messageTimestamp?.lte query?.where?.messageTimestamp?.gte && query?.where?.messageTimestamp?.lte
? Prisma.sql` ? Prisma.sql`
AND "Message"."messageTimestamp" >= ${Math.floor(new Date(query.where.messageTimestamp.gte).getTime() / 1000)} AND "Message"."messageTimestamp" >= ${Math.floor(new Date(query.where.messageTimestamp.gte).getTime() / 1000)}
AND "Message"."messageTimestamp" <= ${Math.floor(new Date(query.where.messageTimestamp.lte).getTime() / 1000)}` AND "Message"."messageTimestamp" <= ${Math.floor(new Date(query.where.messageTimestamp.lte).getTime() / 1000)}`
: Prisma.sql``; : Prisma.sql``;
const limit = query?.take ? Prisma.sql`LIMIT ${query.take}` : Prisma.sql``;
const offset = query?.skip ? Prisma.sql`OFFSET ${query.skip}` : Prisma.sql``;
const results = await this.prismaRepository.$queryRaw` const results = await this.prismaRepository.$queryRaw`
WITH rankedMessages AS ( WITH rankedMessages AS (
SELECT DISTINCT ON ("Contact"."remoteJid") SELECT DISTINCT ON ("Message"."key"->>'remoteJid')
"Contact"."id", "Contact"."id" as "contactId",
"Contact"."remoteJid", "Message"."key"->>'remoteJid' as "remoteJid",
"Chat"."name" as "pushName", COALESCE("Contact"."pushName", "Message"."pushName") as "pushName",
"Contact"."profilePicUrl", "Contact"."profilePicUrl",
COALESCE( COALESCE(
to_timestamp("Message"."messageTimestamp"::double precision), to_timestamp("Message"."messageTimestamp"::double precision),
"Contact"."updatedAt" "Contact"."updatedAt"
) as "updatedAt", ) as "updatedAt",
"Chat"."createdAt" as "windowStart", "Chat"."name" as "pushName",
"Chat"."createdAt" + INTERVAL '24 hours' as "windowExpires", "Chat"."createdAt" as "windowStart",
CASE "Chat"."createdAt" + INTERVAL '24 hours' as "windowExpires",
WHEN "Chat"."createdAt" + INTERVAL '24 hours' > NOW() THEN true CASE WHEN "Chat"."createdAt" + INTERVAL '24 hours' > NOW() THEN true ELSE false END as "windowActive",
ELSE false "Message"."id" AS lastMessageId,
END as "windowActive", "Message"."key" AS lastMessage_key,
"Message"."id" AS lastMessageId, "Message"."pushName" AS lastMessagePushName,
"Message"."key" AS lastMessage_key, "Message"."participant" AS lastMessageParticipant,
"Message"."pushName" AS lastMessagePushName, "Message"."messageType" AS lastMessageMessageType,
"Message"."participant" AS lastMessageParticipant, "Message"."message" AS lastMessageMessage,
"Message"."messageType" AS lastMessageMessageType, "Message"."contextInfo" AS lastMessageContextInfo,
"Message"."message" AS lastMessageMessage, "Message"."source" AS lastMessageSource,
"Message"."contextInfo" AS lastMessageContextInfo, "Message"."messageTimestamp" AS lastMessageMessageTimestamp,
"Message"."source" AS lastMessageSource, "Message"."instanceId" AS lastMessageInstanceId,
"Message"."messageTimestamp" AS lastMessageMessageTimestamp, "Message"."sessionId" AS lastMessageSessionId,
"Message"."instanceId" AS lastMessageInstanceId, "Message"."status" AS lastMessageStatus
"Message"."sessionId" AS lastMessageSessionId, FROM "Message"
"Message"."status" AS lastMessageStatus LEFT JOIN "Contact" ON "Contact"."remoteJid" = "Message"."key"->>'remoteJid' AND "Contact"."instanceId" = "Message"."instanceId"
FROM "Contact" LEFT JOIN "Chat" ON "Chat"."remoteJid" = "Message"."key"->>'remoteJid' AND "Chat"."instanceId" = "Message"."instanceId"
INNER JOIN "Message" ON "Message"."key"->>'remoteJid' = "Contact"."remoteJid" WHERE "Message"."instanceId" = ${this.instanceId}
LEFT JOIN "Chat" ON "Chat"."remoteJid" = "Contact"."remoteJid" ${remoteJid ? Prisma.sql`AND "Message"."key"->>'remoteJid' = ${remoteJid}` : Prisma.sql``}
AND "Chat"."instanceId" = "Contact"."instanceId" ${timestampFilter}
WHERE ORDER BY "Message"."key"->>'remoteJid', "Message"."messageTimestamp" DESC
"Contact"."instanceId" = ${this.instanceId} )
AND "Message"."instanceId" = ${this.instanceId} SELECT * FROM rankedMessages
${remoteJid ? Prisma.sql`AND "Contact"."remoteJid" = ${remoteJid}` : Prisma.sql``} ORDER BY "updatedAt" DESC NULLS LAST
${timestampFilter} ${limit}
ORDER BY ${offset};
"Contact"."remoteJid",
"Message"."messageTimestamp" DESC
)
SELECT * FROM rankedMessages
ORDER BY "updatedAt" DESC NULLS LAST;
`; `;
if (results && isArray(results) && results.length > 0) { if (results && isArray(results) && results.length > 0) {
const mappedResults = results.map((contact) => { const mappedResults = results.map((item) => {
const lastMessage = contact.lastMessageId const lastMessage = item.lastMessageId
? { ? {
id: contact.lastMessageId, id: item.lastMessageId,
key: contact.lastMessageKey, key: item.lastMessage_key,
pushName: contact.lastMessagePushName, pushName: item.lastMessagePushName,
participant: contact.lastMessageParticipant, participant: item.lastMessageParticipant,
messageType: contact.lastMessageMessageType, messageType: item.lastMessageMessageType,
message: contact.lastMessageMessage, message: item.lastMessageMessage,
contextInfo: contact.lastMessageContextInfo, contextInfo: item.lastMessageContextInfo,
source: contact.lastMessageSource, source: item.lastMessageSource,
messageTimestamp: contact.lastMessageMessageTimestamp, messageTimestamp: item.lastMessageMessageTimestamp,
instanceId: contact.lastMessageInstanceId, instanceId: item.lastMessageInstanceId,
sessionId: contact.lastMessageSessionId, sessionId: item.lastMessageSessionId,
status: contact.lastMessageStatus, status: item.lastMessageStatus,
} }
: undefined; : undefined;
return { return {
id: contact.id, id: item.contactId || null,
remoteJid: contact.remoteJid, remoteJid: item.remoteJid,
pushName: contact.pushName, pushName: item.pushName,
profilePicUrl: contact.profilePicUrl, profilePicUrl: item.profilePicUrl,
updatedAt: contact.updatedAt, updatedAt: item.updatedAt,
windowStart: contact.windowStart, windowStart: item.windowStart,
windowExpires: contact.windowExpires, windowExpires: item.windowExpires,
windowActive: contact.windowActive, windowActive: item.windowActive,
lastMessage: lastMessage ? this.cleanMessageData(lastMessage) : undefined, lastMessage: lastMessage ? this.cleanMessageData(lastMessage) : undefined,
unreadCount: 0,
isSaved: !!item.contactId,
}; };
}); });
if (query?.take && query?.skip) {
const skip = query.skip || 0;
const take = query.take || 20;
return mappedResults.slice(skip, skip + take);
}
return mappedResults; return mappedResults;
} }