@@ -80,6 +80,34 @@ func (s *store) GetAllMembersByChatId(_ context.Context, chatId chat.ChatId) ([]
8080 return cloneMemberRecords (items ), nil
8181}
8282
83+ // GetAllMembersByPlatformId implements chat.store.GetAllMembersByPlatformId
84+ func (s * store ) GetAllMembersByPlatformId (_ context.Context , platform chat.Platform , platformId string , cursor query.Cursor , direction query.Ordering , limit uint64 ) ([]* chat.MemberRecord , error ) {
85+ s .mu .Lock ()
86+ defer s .mu .Unlock ()
87+
88+ items := s .findMembersByPlatformId (platform , platformId )
89+ items , err := s .getMemberRecordPage (items , cursor , direction , limit )
90+ if err != nil {
91+ return nil , err
92+ }
93+
94+ if len (items ) == 0 {
95+ return nil , chat .ErrMemberNotFound
96+ }
97+ return cloneMemberRecords (items ), nil
98+ }
99+
100+ // GetUnreadCount implements chat.store.GetUnreadCount
101+ func (s * store ) GetUnreadCount (_ context.Context , chatId chat.ChatId , readPointer chat.MessageId ) (uint32 , error ) {
102+ s .mu .Lock ()
103+ defer s .mu .Unlock ()
104+
105+ items := s .findMessagesByChatId (chatId )
106+ items = s .filterMessagesAfter (items , readPointer )
107+ items = s .filterNotifiedMessages (items )
108+ return uint32 (len (items )), nil
109+ }
110+
83111// GetAllMessagesByChatId implements chat.Store.GetAllMessagesByChatId
84112func (s * store ) GetAllMessagesByChatId (_ context.Context , chatId chat.ChatId , cursor query.Cursor , direction query.Ordering , limit uint64 ) ([]* chat.MessageRecord , error ) {
85113 s .mu .Lock ()
@@ -296,6 +324,55 @@ func (s *store) findMembersByChatId(chatId chat.ChatId) []*chat.MemberRecord {
296324 return res
297325}
298326
327+ func (s * store ) findMembersByPlatformId (platform chat.Platform , platformId string ) []* chat.MemberRecord {
328+ var res []* chat.MemberRecord
329+ for _ , item := range s .memberRecords {
330+ if platform == item .Platform && platformId == item .PlatformId {
331+ res = append (res , item )
332+ }
333+ }
334+ return res
335+ }
336+
337+ func (s * store ) getMemberRecordPage (items []* chat.MemberRecord , cursor query.Cursor , direction query.Ordering , limit uint64 ) ([]* chat.MemberRecord , error ) {
338+ if len (items ) == 0 {
339+ return nil , nil
340+ }
341+
342+ var memberIdCursor * uint64
343+ if len (cursor ) > 0 {
344+ cursorValue := query .FromCursor (cursor )
345+ memberIdCursor = & cursorValue
346+ }
347+
348+ var res []* chat.MemberRecord
349+ if memberIdCursor == nil {
350+ res = items
351+ } else {
352+ for _ , item := range items {
353+ if item .Id > int64 (* memberIdCursor ) && direction == query .Ascending {
354+ res = append (res , item )
355+ }
356+
357+ if item .Id < int64 (* memberIdCursor ) && direction == query .Descending {
358+ res = append (res , item )
359+ }
360+ }
361+ }
362+
363+ if direction == query .Ascending {
364+ sort .Sort (chat .MembersById (res ))
365+ } else {
366+ sort .Sort (sort .Reverse (chat .MembersById (res )))
367+ }
368+
369+ if len (res ) >= int (limit ) {
370+ return res [:limit ], nil
371+ }
372+
373+ return res , nil
374+ }
375+
299376func (s * store ) findMessage (data * chat.MessageRecord ) * chat.MessageRecord {
300377 for _ , item := range s .messageRecords {
301378 if data .Id == item .Id {
@@ -328,6 +405,26 @@ func (s *store) findMessagesByChatId(chatId chat.ChatId) []*chat.MessageRecord {
328405 return res
329406}
330407
408+ func (s * store ) filterMessagesAfter (items []* chat.MessageRecord , pointer chat.MessageId ) []* chat.MessageRecord {
409+ var res []* chat.MessageRecord
410+ for _ , item := range items {
411+ if item .MessageId .After (pointer ) {
412+ res = append (res , item )
413+ }
414+ }
415+ return res
416+ }
417+
418+ func (s * store ) filterNotifiedMessages (items []* chat.MessageRecord ) []* chat.MessageRecord {
419+ var res []* chat.MessageRecord
420+ for _ , item := range items {
421+ if ! item .IsSilent {
422+ res = append (res , item )
423+ }
424+ }
425+ return res
426+ }
427+
331428func (s * store ) getMessageRecordPage (items []* chat.MessageRecord , cursor query.Cursor , direction query.Ordering , limit uint64 ) ([]* chat.MessageRecord , error ) {
332429 if len (items ) == 0 {
333430 return nil , nil
@@ -358,9 +455,9 @@ func (s *store) getMessageRecordPage(items []*chat.MessageRecord, cursor query.C
358455 }
359456
360457 if direction == query .Ascending {
361- sort .Sort (chat .MessagesById (res ))
458+ sort .Sort (chat .MessagesByMessageId (res ))
362459 } else {
363- sort .Sort (sort .Reverse (chat .MessagesById (res )))
460+ sort .Sort (sort .Reverse (chat .MessagesByMessageId (res )))
364461 }
365462
366463 if len (res ) >= int (limit ) {
0 commit comments