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