@@ -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