getMessages method

Future<List<WKMsg>> getMessages(
  1. String channelId,
  2. int channelType,
  3. int oldestOrderSeq,
  4. bool contain,
  5. int pullMode,
  6. int limit,
)

Implementation

Future<List<WKMsg>> getMessages(String channelId, int channelType,
    int oldestOrderSeq, bool contain, int pullMode, int limit) async {
  List<WKMsg> msgList = [];
  String sql;
  var args = [];
  if (oldestOrderSeq <= 0) {
    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) where is_deleted=0 and is_mutual_deleted=0 order by order_seq desc limit 0,?";
    args.add(channelId);
    args.add(channelType);
    args.add(limit);
  } else {
    if (pullMode == 0) {
      if (contain) {
        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}.order_seq<=?) where is_deleted=0 and is_mutual_deleted=0 order by order_seq desc limit 0,?";
      } else {
        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}.order_seq<?) where is_deleted=0 and is_mutual_deleted=0 order by order_seq desc limit 0,?";
      }
    } else {
      if (contain) {
        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}.order_seq>=?) where is_deleted=0 and is_mutual_deleted=0 order by order_seq asc limit 0,?";
      } else {
        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}.order_seq>?) where is_deleted=0 and is_mutual_deleted=0 order by order_seq asc limit 0,?";
      }
    }
    args.add(channelId);
    args.add(channelType);
    args.add(oldestOrderSeq);
    args.add(limit);
  }
  List<String> messageIds = [];
  List<String> replyMsgIds = [];
  List<String> fromUIDs = [];
  List<Map<String, Object?>> results =
      await WKDBHelper.shared.getDB()!.rawQuery(sql, args);
  if (results.isNotEmpty) {
    WKChannel? wkChannel =
        await ChannelDB.shared.query(channelId, channelType);
    for (Map<String, Object?> data in results) {
      WKMsg wkMsg = WKDBConst.serializeWKMsg(data);
      wkMsg.setChannelInfo(wkChannel);
      if (wkMsg.messageID != '') {
        messageIds.add(wkMsg.messageID);
      }

      if (wkMsg.messageContent != null &&
          wkMsg.messageContent!.reply != null &&
          wkMsg.messageContent!.reply!.messageId != '') {
        replyMsgIds.add(wkMsg.messageContent!.reply!.messageId);
      }
      if (wkMsg.fromUID != '') {
        bool isAdd = true;
        for (int i = 0; i < fromUIDs.length; i++) {
          if (fromUIDs[i] == wkMsg.fromUID) {
            isAdd = false;
            break;
          }
        }
        if (isAdd) {
          fromUIDs.add(wkMsg.fromUID);
        }
      }
      if (pullMode == 0) {
        msgList.insert(0, wkMsg);
      } else {
        msgList.add(wkMsg);
      }
    }
  }
  //扩展消息
  List<WKMsgReaction> list =
      await ReactionDB.shared.queryWithMessageIds(messageIds);
  if (list.isNotEmpty) {
    for (int i = 0, size = msgList.length; i < size; i++) {
      for (int j = 0, len = list.length; j < len; j++) {
        if (list[j].messageID == msgList[i].messageID) {
          if (msgList[i].reactionList == null) {
            msgList[i].reactionList = [];
          }
          msgList[i].reactionList!.add(list[j]);
        }
      }
    }
  }
  // 发送者成员信息
  if (channelType == WKChannelType.group) {
    List<WKChannelMember> memberList = await ChannelMemberDB.shared
        .queryMemberWithUIDs(channelId, channelType, fromUIDs);
    if (memberList.isNotEmpty) {
      for (WKChannelMember member in memberList) {
        for (int i = 0, size = msgList.length; i < size; i++) {
          if (msgList[i].fromUID != '' &&
              msgList[i].fromUID == member.memberUID) {
            msgList[i].setMemberOfFrom(member);
          }
        }
      }
    }
  }
  //消息发送者信息
  List<WKChannel> wkChannels = await ChannelDB.shared
      .queryWithChannelIdsAndChannelType(fromUIDs, WKChannelType.personal);
  if (wkChannels.isNotEmpty) {
    for (WKChannel wkChannel in wkChannels) {
      for (int i = 0, size = msgList.length; i < size; i++) {
        if (msgList[i].fromUID != '' &&
            msgList[i].fromUID == wkChannel.channelID) {
          msgList[i].setFrom(wkChannel);
        }
      }
    }
  }
  // 查询编辑内容
  if (replyMsgIds.isNotEmpty) {
    List<WKMsgExtra> msgExtraList =
        await queryMsgExtrasWithMsgIds(replyMsgIds);
    if (msgExtraList.isNotEmpty) {
      for (WKMsgExtra extra in msgExtraList) {
        for (int i = 0, size = msgList.length; i < size; i++) {
          if (msgList[i].messageContent != null &&
              msgList[i].messageContent!.reply != null &&
              extra.messageID ==
                  msgList[i].messageContent!.reply!.messageId) {
            msgList[i].messageContent!.reply!.revoke = extra.revoke;
          }
          if (extra.contentEdit != '' &&
              msgList[i].messageContent != null &&
              msgList[i].messageContent!.reply != null &&
              msgList[i].messageContent!.reply!.messageId != '' &&
              extra.messageID ==
                  msgList[i].messageContent!.reply!.messageId) {
            msgList[i].messageContent!.reply!.editAt = extra.editedAt;
            msgList[i].messageContent!.reply!.contentEdit = extra.contentEdit;
            var json = jsonEncode(extra.contentEdit);
            var type = WKDBConst.readInt(json, 'type');
            msgList[i].messageContent!.reply!.contentEditMsgModel =
                WKIM.shared.messageManager.getMessageModel(type, json);
            break;
          }
        }
      }
    }
  }
  return msgList;
}