diff --git a/packages/stream_chat/lib/src/api/channel.dart b/packages/stream_chat/lib/src/api/channel.dart index 00df74a7..7ca86f78 100644 --- a/packages/stream_chat/lib/src/api/channel.dart +++ b/packages/stream_chat/lib/src/api/channel.dart @@ -514,6 +514,26 @@ class Channel { ); } + /// A message search. + Future search({ + String query, + Map messageFilters, + List sort, + PaginationParams paginationParams, + }) { + return _client.search( + { + 'cid': { + r'$in': [cid], + }, + }, + sort: sort, + query: query, + paginationParams: paginationParams, + messageFilters: messageFilters, + ); + } + /// Delete a file from this channel Future deleteFile( String url, { diff --git a/packages/stream_chat/lib/src/client.dart b/packages/stream_chat/lib/src/client.dart index 20f3f0bd..433a132c 100644 --- a/packages/stream_chat/lib/src/client.dart +++ b/packages/stream_chat/lib/src/client.dart @@ -24,6 +24,7 @@ import 'exceptions.dart'; import 'models/event.dart'; import 'models/message.dart'; import 'models/user.dart'; +import 'extensions/map_extension.dart'; /// Handler function used for logging records. Function requires a single [LogRecord] /// as the only parameter. @@ -1021,27 +1022,36 @@ class StreamChatClient { /// A message search. Future search( - Map filters, - List sort, + Map filters, { String query, - PaginationParams paginationParams, { + List sort, + PaginationParams paginationParams, Map messageFilters, }) async { + assert(() { + if (query == null && messageFilters == null) { + throw ArgumentError('Provide at least `query` or `messageFilters`'); + } + if (query != null && messageFilters != null) { + throw ArgumentError( + "Can't provide both `query` and `messageFilters` at the same time", + ); + } + return true; + }()); + final payload = { 'filter_conditions': filters, - if (messageFilters != null) ...{ - 'message_filter_conditions': messageFilters, - }, + 'message_filter_conditions': messageFilters, 'query': query, 'sort': sort, - }; + if (paginationParams != null) ...paginationParams.toJson(), + }.nullProtected; - if (paginationParams != null) { - payload.addAll(paginationParams.toJson()); - } + final response = await get('/search', queryParameters: { + 'payload': json.encode(payload), + }); - final response = await get('/search', - queryParameters: {'payload': json.encode(payload)}); return decode( response.data, SearchMessagesResponse.fromJson); } diff --git a/packages/stream_chat/lib/src/extensions/map_extension.dart b/packages/stream_chat/lib/src/extensions/map_extension.dart new file mode 100644 index 00000000..3028c20a --- /dev/null +++ b/packages/stream_chat/lib/src/extensions/map_extension.dart @@ -0,0 +1,7 @@ +/// Useful extension functions for [Map] +extension MapX on Map { + /// Returns a new map with null keys or values removed + Map get nullProtected { + return {...this}..removeWhere((key, value) => key == null || value == null); + } +}