searchWithChannel method
Implementation
Future<List<WKMsg>> searchWithChannel(
String keyword, String channelId, int channelType) async {
List<WKMsg> list = [];
var sql =
"select * from (select $messageCols,$extraCols from ${WKDBConst.tableMessage} left join ${WKDBConst.tableMessageExtra} on ${WKDBConst.tableMessage}.message_id= ${WKDBConst.tableMessageExtra}.message_id where ${WKDBConst.tableMessage}.searchable_word like ? and ${WKDBConst.tableMessage}.channel_id=? and ${WKDBConst.tableMessage}.channel_type=?) where is_deleted=0 and revoke=0";
List<Map<String, Object?>> results = await WKDBHelper.shared
.getDB()!
.rawQuery(sql, ['%$keyword%', channelId, channelType]);
List<String> fromUIDs = [];
WKChannel? channel =
await WKIM.shared.channelManager.getChannel(channelId, channelType);
for (Map<String, Object?> data in results) {
var msg = WKDBConst.serializeWKMsg(data);
if (channel != null) {
msg.setChannelInfo(channel);
}
if (msg.fromUID != '') {
fromUIDs.add(msg.fromUID);
}
list.add(msg);
}
if (fromUIDs.isNotEmpty) {
List<String> uniqueList = fromUIDs.toSet().toList();
List<WKChannel> wkChannels = await ChannelDB.shared
.queryWithChannelIdsAndChannelType(
uniqueList, WKChannelType.personal);
if (wkChannels.isNotEmpty) {
for (WKChannel channel in wkChannels) {
for (WKMsg msg in list) {
if (msg.fromUID == channel.channelID) {
msg.setFrom(channel);
break;
}
}
}
}
if (channelType == WKChannelType.group) {
List<WKChannelMember> members = await ChannelMemberDB.shared
.queryMemberWithUIDs(channelId, channelType, uniqueList);
if (members.isNotEmpty) {
for (WKChannelMember member in members) {
for (WKMsg msg in list) {
if (msg.fromUID == member.memberUID) {
msg.setMemberOfFrom(member);
break;
}
}
}
}
}
}
return list;
}