searchMsgWithChannelAndContentTypes method

Future<List<WKMsg>> searchMsgWithChannelAndContentTypes(
  1. String channelID,
  2. int channelType,
  3. int oldestOrderSeq,
  4. int limit,
  5. List<int> contentTypes,
)

Implementation

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;
}