diff --git a/packages/stream_chat_persistence/lib/src/dao/message_dao.dart b/packages/stream_chat_persistence/lib/src/dao/message_dao.dart index ae238069..8d36b758 100644 --- a/packages/stream_chat_persistence/lib/src/dao/message_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/message_dao.dart @@ -99,9 +99,26 @@ class MessageDao extends DatabaseAccessor .map(_messageFromJoinRow) .get()); - if (options?.lessThan != null && msgList.isNotEmpty) { - final lessThanIndex = msgList.indexWhere((m) => m.id == options.lessThan); - msgList.removeRange(lessThanIndex, msgList.length); + if (msgList.isNotEmpty) { + if (options?.lessThan != null) { + final lessThanIndex = msgList.indexWhere( + (m) => m.id == options.lessThan, + ); + if (lessThanIndex != -1) { + msgList.removeRange(lessThanIndex, msgList.length); + } + } + if (options?.greaterThanOrEqual != null) { + final greaterThanIndex = msgList.indexWhere( + (m) => m.id == options.greaterThanOrEqual, + ); + if (greaterThanIndex != -1) { + msgList.removeRange(0, greaterThanIndex); + } + } + if (options?.limit != null) { + return msgList.take(options.limit).toList(); + } } return msgList; } @@ -124,24 +141,26 @@ class MessageDao extends DatabaseAccessor .map(_messageFromJoinRow) .get()); - if (messagePagination?.lessThan != null) { - final lessThanIndex = msgList.indexWhere( - (m) => m.id == messagePagination.lessThan, - ); - if (lessThanIndex != -1) { - msgList.removeRange(lessThanIndex, msgList.length); + if (msgList.isNotEmpty) { + if (messagePagination?.lessThan != null) { + final lessThanIndex = msgList.indexWhere( + (m) => m.id == messagePagination.lessThan, + ); + if (lessThanIndex != -1) { + msgList.removeRange(lessThanIndex, msgList.length); + } } - } - if (messagePagination?.greaterThanOrEqual != null) { - final greaterThanIndex = msgList.indexWhere( - (m) => m.id == messagePagination.greaterThanOrEqual, - ); - if (greaterThanIndex != -1) { - msgList.removeRange(0, greaterThanIndex); + if (messagePagination?.greaterThanOrEqual != null) { + final greaterThanIndex = msgList.indexWhere( + (m) => m.id == messagePagination.greaterThanOrEqual, + ); + if (greaterThanIndex != -1) { + msgList.removeRange(0, greaterThanIndex); + } + } + if (messagePagination?.limit != null) { + return msgList.take(messagePagination.limit).toList(); } - } - if (messagePagination?.limit != null) { - return msgList.take(messagePagination.limit).toList(); } return msgList; } diff --git a/packages/stream_chat_persistence/lib/src/dao/pinned_message_dao.dart b/packages/stream_chat_persistence/lib/src/dao/pinned_message_dao.dart index cb634703..34ee4c28 100644 --- a/packages/stream_chat_persistence/lib/src/dao/pinned_message_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/pinned_message_dao.dart @@ -99,9 +99,26 @@ class PinnedMessageDao extends DatabaseAccessor .map(_messageFromJoinRow) .get()); - if (options?.lessThan != null) { - final lessThanIndex = msgList.indexWhere((m) => m.id == options.lessThan); - msgList.removeRange(lessThanIndex, msgList.length); + if (msgList.isNotEmpty) { + if (options?.lessThan != null) { + final lessThanIndex = msgList.indexWhere( + (m) => m.id == options.lessThan, + ); + if (lessThanIndex != -1) { + msgList.removeRange(lessThanIndex, msgList.length); + } + } + if (options?.greaterThanOrEqual != null) { + final greaterThanIndex = msgList.indexWhere( + (m) => m.id == options.greaterThanOrEqual, + ); + if (greaterThanIndex != -1) { + msgList.removeRange(0, greaterThanIndex); + } + } + if (options?.limit != null) { + return msgList.take(options.limit).toList(); + } } return msgList; } @@ -124,24 +141,26 @@ class PinnedMessageDao extends DatabaseAccessor .map(_messageFromJoinRow) .get()); - if (messagePagination?.lessThan != null) { - final lessThanIndex = msgList.indexWhere( - (m) => m.id == messagePagination.lessThan, - ); - if (lessThanIndex != -1) { - msgList.removeRange(lessThanIndex, msgList.length); + if (msgList.isNotEmpty) { + if (messagePagination?.lessThan != null) { + final lessThanIndex = msgList.indexWhere( + (m) => m.id == messagePagination.lessThan, + ); + if (lessThanIndex != -1) { + msgList.removeRange(lessThanIndex, msgList.length); + } } - } - if (messagePagination?.greaterThanOrEqual != null) { - final greaterThanIndex = msgList.indexWhere( - (m) => m.id == messagePagination.greaterThanOrEqual, - ); - if (greaterThanIndex != -1) { - msgList.removeRange(0, greaterThanIndex); + if (messagePagination?.greaterThanOrEqual != null) { + final greaterThanIndex = msgList.indexWhere( + (m) => m.id == messagePagination.greaterThanOrEqual, + ); + if (greaterThanIndex != -1) { + msgList.removeRange(0, greaterThanIndex); + } + } + if (messagePagination?.limit != null) { + return msgList.take(messagePagination.limit).toList(); } - } - if (messagePagination?.limit != null) { - return msgList.take(messagePagination.limit).toList(); } return msgList; } diff --git a/packages/stream_chat_persistence/test/src/dao/message_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/message_dao_test.dart index dccb414c..7207002e 100644 --- a/packages/stream_chat_persistence/test/src/dao/message_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/message_dao_test.dart @@ -17,6 +17,7 @@ void main() { Future> _prepareTestData( String cid, { bool threads = false, + bool mapAllThreadToFirstMessage = false, int count = 3, }) async { final messages = List.generate( @@ -43,7 +44,8 @@ void main() { id: 'testThreadMessageId$cid$index', type: 'testType', user: User(id: 'testUserId$index'), - parentId: messages[index].id, + parentId: + mapAllThreadToFirstMessage ? messages[0].id : messages[index].id, createdAt: DateTime.now(), shadowed: math.Random().nextBool(), showInChannel: math.Random().nextBool(), @@ -184,6 +186,40 @@ void main() { expect(threadMessages.first.parentId, parentId); }); + test('getThreadMessagesByParentId along with pagination', () async { + const cid = 'testCid'; + const parentId = 'testMessageId${cid}0'; + const options = PaginationParams( + limit: 15, + lessThan: 'testThreadMessageId${cid}25', + greaterThanOrEqual: 'testThreadMessageId${cid}5', + ); + + // Messages should be empty initially + final messages = await messageDao.getThreadMessagesByParentId( + parentId, + options: options, + ); + expect(messages, isEmpty); + + // Preparing test data + final insertedMessages = await _prepareTestData( + cid, + threads: true, + mapAllThreadToFirstMessage: true, + count: 30, + ); + expect(insertedMessages, isNotEmpty); + + // Should fetch all the thread messages of parentId and apply the pagination + final threadMessages = await messageDao.getThreadMessagesByParentId( + parentId, + options: options, + ); + expect(threadMessages.length, 15); + expect(threadMessages.first.parentId, parentId); + }); + test('getMessagesByCid', () async { const cid = 'testCid'; diff --git a/packages/stream_chat_persistence/test/src/dao/pinned_message_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/pinned_message_dao_test.dart index 5c1bce46..3e197e2b 100644 --- a/packages/stream_chat_persistence/test/src/dao/pinned_message_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/pinned_message_dao_test.dart @@ -17,6 +17,7 @@ void main() { Future> _prepareTestData( String cid, { bool threads = false, + bool mapAllThreadToFirstMessage = false, int count = 3, }) async { final messages = List.generate( @@ -43,7 +44,8 @@ void main() { id: 'testThreadMessageId$cid$index', type: 'testType', user: User(id: 'testUserId$index'), - parentId: messages[index].id, + parentId: + mapAllThreadToFirstMessage ? messages[0].id : messages[index].id, createdAt: DateTime.now(), shadowed: math.Random().nextBool(), showInChannel: math.Random().nextBool(), @@ -185,6 +187,40 @@ void main() { expect(threadMessages.first.parentId, parentId); }); + test('getThreadMessagesByParentId along with pagination', () async { + const cid = 'testCid'; + const parentId = 'testMessageId${cid}0'; + const options = PaginationParams( + limit: 15, + lessThan: 'testThreadMessageId${cid}25', + greaterThanOrEqual: 'testThreadMessageId${cid}5', + ); + + // Messages should be empty initially + final messages = await pinnedMessageDao.getThreadMessagesByParentId( + parentId, + options: options, + ); + expect(messages, isEmpty); + + // Preparing test data + final insertedMessages = await _prepareTestData( + cid, + threads: true, + mapAllThreadToFirstMessage: true, + count: 30, + ); + expect(insertedMessages, isNotEmpty); + + // Should fetch all the thread messages of parentId and apply the pagination + final threadMessages = await pinnedMessageDao.getThreadMessagesByParentId( + parentId, + options: options, + ); + expect(threadMessages.length, 15); + expect(threadMessages.first.parentId, parentId); + }); + test('getMessagesByCid', () async { const cid = 'testCid';