fix: Add search channel and message method

This commit is contained in:
SL 2024-09-06 16:37:42 +08:00
parent 8661615227
commit b5d6723950
8 changed files with 252 additions and 2 deletions

View File

@ -101,4 +101,6 @@
### 1.5.0
* fix: Upgrade send noPersist message
### 1.5.1
* fix: Add connection ack and return nodeId
* fix: Add connection ack and return nodeId
### 1.5.2
* fix: Add search channel and message method

View File

@ -1,3 +1,4 @@
import 'dart:async';
import 'dart:collection';
import 'dart:convert';
@ -110,6 +111,52 @@ class ChannelDB {
return list;
}
Future<List<WKChannelSearchResult>> search(String keyword) async {
List<WKChannelSearchResult> list = [];
var sql =
"select t.*,cm.member_name,cm.member_remark from (select ${WKDBConst.tableChannel}.*,max( ${WKDBConst.tableChannelMember}.id) mid from ${WKDBConst.tableChannel}, ${WKDBConst.tableChannelMember} where ${WKDBConst.tableChannel}.channel_id=${WKDBConst.tableChannelMember}.channel_id and ${WKDBConst.tableChannel}.channel_type=${WKDBConst.tableChannelMember}.channel_type and (${WKDBConst.tableChannel}.channel_name like ? or ${WKDBConst.tableChannel}.channel_remark like ? or ${WKDBConst.tableChannelMember}.member_name like ? or ${WKDBConst.tableChannelMember}.member_remark like ?) group by ${WKDBConst.tableChannel}.channel_id,${WKDBConst.tableChannel}.channel_type) t,${WKDBConst.tableChannelMember} cm where t.channel_id=cm.channel_id and t.channel_type=cm.channel_type and t.mid=cm.id";
List<Map<String, Object?>> results = await WKDBHelper.shared
.getDB()!
.rawQuery(
sql, ['%$keyword%', '%$keyword%', '%$keyword%', '%$keyword%']);
for (Map<String, Object?> data in results) {
var memberName = WKDBConst.readString(data, 'member_name');
var memberRemark = WKDBConst.readString(data, 'member_remark');
var channel = WKDBConst.serializeChannel(data);
var result = WKChannelSearchResult();
result.channel = channel;
if (memberRemark != '') {
if (memberRemark.toUpperCase() == keyword.toUpperCase()) {
result.containMemberName = memberRemark;
}
}
if (result.containMemberName == '') {
if (memberName != '') {
if (memberName.toUpperCase() == keyword.toUpperCase()) {
result.containMemberName = memberName;
}
}
}
list.add(result);
}
return list;
}
Future<List<WKChannel>> searchWithChannelTypeAndFollow(
String keyword, int channelType, int follow) async {
List<WKChannel> list = [];
var sql =
"select * from ${WKDBConst.tableChannel} where (channel_name LIKE ? or channel_remark LIKE ?) and channel_type=? and follow=?";
List<Map<String, Object?>> results = await WKDBHelper.shared
.getDB()!
.rawQuery(sql, ['%$keyword%', '%$keyword%', channelType, follow]);
for (Map<String, Object?> data in results) {
var channel = WKDBConst.serializeChannel(data);
list.add(channel);
}
return list;
}
dynamic getMap(WKChannel channel) {
var data = HashMap<String, Object>();
data['channel_id'] = channel.channelID;

View File

@ -829,6 +829,147 @@ class MessageDB {
whereArgs: [channelId, channelType]);
}
Future<List<WKMessageSearchResult>> search(String keyword) async {
List<WKMessageSearchResult> list = [];
var sql =
"select distinct c.*, count(*) message_count, case count(*) WHEN 1 then m.client_seq else ''END client_seq, CASE count(*) WHEN 1 THEN m.searchable_word else '' end searchable_word from ${WKDBConst.tableChannel} c LEFT JOIN ${WKDBConst.tableMessage} m ON m.channel_id = c.channel_id and m.channel_type = c.channel_type WHERE m.is_deleted=0 and searchable_word LIKE ? GROUP BY c.channel_id, c.channel_type ORDER BY m.created_at DESC limit 100";
List<Map<String, Object?>> results =
await WKDBHelper.shared.getDB()!.rawQuery(sql, ['%$keyword%']);
for (Map<String, Object?> data in results) {
var channel = WKDBConst.serializeChannel(data);
var message = WKMessageSearchResult();
message.channel = channel;
message.messageCount = WKDBConst.readInt(data, 'message_count');
message.searchableWord = WKDBConst.readString(data, 'searchable_word');
list.add(message);
}
return list;
}
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;
}
Future<List<WKMsg>> searchMsgWithChannelAndContentTypes(
String channelID,
int channelType,
int oldestOrderSeq,
int limit,
List<int> contentTypes) async {
var sql = "";
List<WKMsg> list = [];
List<Object?> arguments = [];
if (oldestOrderSeq <= 0) {
arguments = [channelID, channelType, contentTypes];
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}.channel_id=? and ${WKDBConst.tableMessage}.channel_type=? and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 and ${WKDBConst.tableMessage}.type in (${WKDBConst.getPlaceholders(contentTypes.length)})) where is_deleted=0 and revoke=0 order by order_seq desc limit 0,$limit";
} else {
arguments = [channelID, channelType, oldestOrderSeq, contentTypes];
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}.channel_id=? and ${WKDBConst.tableMessage}.channel_type=? and ${WKDBConst.tableMessage}.order_seq<? and ${WKDBConst.tableMessage}.type<>0 and ${WKDBConst.tableMessage}.type<>99 and ${WKDBConst.tableMessage}.type in (${WKDBConst.getPlaceholders(contentTypes.length)})) where is_deleted=0 and revoke=0 order by order_seq desc limit 0,$limit";
}
List<Map<String, Object?>> results =
await WKDBHelper.shared.getDB()!.rawQuery(sql, arguments);
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;
}
dynamic getMap(WKMsg msg) {
var map = <String, Object>{};
map['message_id'] = msg.messageID;

View File

@ -52,3 +52,9 @@ class WKChannel {
int parentChannelType = 0;
WKChannel(this.channelID, this.channelType);
}
class WKChannelSearchResult {
WKChannel? channel;
//
String containMemberName = '';
}

View File

@ -302,3 +302,11 @@ class WKSendOptions {
int expire = 0;
String topicID = "";
}
class WKMessageSearchResult {
WKChannel? channel;
//
String searchableWord = "";
//
int messageCount = 0;
}

View File

@ -52,6 +52,18 @@ class WKChannelManager {
ChannelDB.shared.insertOrUpdateList(list);
}
//
Future<List<WKChannelSearchResult>> search(String keyword) {
return ChannelDB.shared.search(keyword);
}
// channel()
Future<List<WKChannel>> searchWithChannelTypeAndFollow(
String searchKey, int channelType, int follow) {
return ChannelDB.shared
.searchWithChannelTypeAndFollow(searchKey, channelType, follow);
}
addOrUpdateChannel(WKChannel channel) {
_updateChannel(channel);
_setRefresh(channel);

View File

@ -134,6 +134,40 @@ class WKMessageManager {
}
}
//
Future<List<WKMessageSearchResult>> search(String keyword) {
return MessageDB.shared.search(keyword);
}
/*
*
*
* @param searchKey
* @param channelID ID
* @param channelType
* @return List<WKMsg>
*/
Future<List<WKMsg>> searchWithChannel(
String keyword, String channelID, int channelType) {
return MessageDB.shared.searchWithChannel(keyword, channelID, channelType);
}
/*
*
*
* @param channelID ID
* @param channelType
* @param oldestOrderSeq orderSeq
* @param limit
* @param contentTypes
* @return List<WKMsg>
*/
Future<List<WKMsg>> searchMsgWithChannelAndContentTypes(String channelID,
int channelType, int oldestOrderSeq, int limit, List<int> contentTypes) {
return MessageDB.shared.searchMsgWithChannelAndContentTypes(
channelID, channelType, oldestOrderSeq, limit, contentTypes);
}
Future<WKMsg?> getWithClientMsgNo(String clientMsgNo) {
return MessageDB.shared.queryWithClientMsgNo(clientMsgNo);
}

View File

@ -15,7 +15,7 @@ description: wukong IM flutter sdk
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
# In Windows, build-name is used as the major, minor, and patch parts
# of the product and file versions while build-number is used as the build suffix.
version: 1.5.1
version: 1.5.2
homepage: https://github.com/WuKongIM/WuKongIMFlutterSDK
environment: