roomapi.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include "roomapi.h"
  2. #include "qjsonobject.h"
  3. #include "qtjsonserializer_global.h"
  4. #include "util/jsonmapper.h"
  5. #include <cstddef>
  6. #include <utility>
  7. // std::optional<QString> id; // 房间当前id
  8. // std::optional<QString> name; // 房间名
  9. // std::optional<QString> description; // 房间的描述信息
  10. // std::optional<int> maxUsers; // 最大用户数
  11. // std::optional<qint64> status; // 1: normal 2: ban | 状态 1 正常 2 禁用
  12. // std::optional<qint64> createdAt; // 创建日期
  13. // std::optional<qint64> updatedAt; // 修改日期
  14. // std::optional<QString> createdId; // 创建者
  15. // std::optional<QString> ownerId; // 房主ID,关联用户表
  16. #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
  17. // 为 Qt 5 注册 std::optional 类型
  18. Q_DECLARE_METATYPE(std::optional<QString>)
  19. Q_DECLARE_METATYPE(std::optional<int>)
  20. Q_DECLARE_METATYPE(std::optional<qint64>)
  21. // 对于 QString 类型还需要流运算符
  22. QDataStream &operator<<(QDataStream &out, const std::optional<QString> &opt)
  23. {
  24. out << static_cast<bool>(opt.has_value());
  25. if (opt)
  26. out << *opt;
  27. return out;
  28. }
  29. QDataStream &operator>>(QDataStream &in, std::optional<QString> &opt)
  30. {
  31. bool hasValue;
  32. in >> hasValue;
  33. if (hasValue) {
  34. QString value;
  35. in >> value;
  36. opt = value;
  37. } else {
  38. opt = std::nullopt;
  39. }
  40. return in;
  41. }
  42. void initRoomType()
  43. {
  44. QtJsonSerializer::registerTypes();
  45. QtJsonSerializer::JsonSerializer::registerOptionalConverters<QString>();
  46. QtJsonSerializer::JsonSerializer::registerListConverters<RoomInfo>();
  47. qRegisterMetaType<RoomInfo>("RoomInfo");
  48. qRegisterMetaType<RoomListData>("RoomListData");
  49. qRegisterMetaType<std::optional<QString>>("std::optional<QString>");
  50. }
  51. #endif
  52. RoomListData::RoomListData(const QJsonObject &object)
  53. {
  54. // 正式开始
  55. QtJsonSerializer::JsonSerializer serializer;
  56. // serializer.setAllowDefaultNull(true);
  57. RoomListData roomList;
  58. try {
  59. roomList = serializer.deserialize<RoomListData>(object);
  60. data = roomList.data;
  61. total = roomList.total;
  62. } catch (const QtJsonSerializer::Exception &e) {
  63. qDebug() << "Deserialization error:" << e.what();
  64. }
  65. }
  66. QList<RoomInfo> RoomListData::getRooms() const
  67. {
  68. return data;
  69. }
  70. QFuture<HttpResponse> getRoomListApi(const RoomInfo &roomInfo, int page, int pageSize)
  71. {
  72. QJsonObject jsonData;
  73. QJsonValue value = JsonMapper::toJson(roomInfo);
  74. jsonData["page"] = page;
  75. jsonData["pageSize"] = pageSize;
  76. if (value.isObject()) {
  77. QJsonObject nested = value.toObject();
  78. for (const QString &key : nested.keys()) {
  79. if (!nested[key].isNull()) {
  80. jsonData[key] = nested[key];
  81. }
  82. }
  83. }
  84. // 活驴
  85. qDebug() << jsonData;
  86. QJsonDocument doc(jsonData);
  87. return TC::RequestClient::globalInstance()->postAsync("/room/list", doc);
  88. }