roomapi.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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::registerOptionalConverters<int>();
  47. QtJsonSerializer::JsonSerializer::registerOptionalConverters<qint64>();
  48. QtJsonSerializer::JsonSerializer::registerListConverters<RoomInfo>();
  49. qRegisterMetaType<RoomInfo>("RoomInfo");
  50. qRegisterMetaType<RoomListData>("RoomListData");
  51. qRegisterMetaType<std::optional<QString>>("std::optional<QString>");
  52. qRegisterMetaType<std::optional<int>>("std::optional<int>");
  53. qRegisterMetaType<std::optional<qint64>>("std::optional<qint64>");
  54. }
  55. #endif
  56. RoomListData::RoomListData(const QJsonObject &object)
  57. {
  58. // 正式开始
  59. QtJsonSerializer::JsonSerializer serializer;
  60. // serializer.setAllowDefaultNull(true);
  61. RoomListData roomList;
  62. try {
  63. roomList = serializer.deserialize<RoomListData>(object);
  64. data = roomList.data;
  65. total = roomList.total;
  66. } catch (const QtJsonSerializer::Exception &e) {
  67. qDebug() << "Deserialization error:" << e.what();
  68. }
  69. }
  70. QList<RoomInfo> RoomListData::getRooms() const
  71. {
  72. return data;
  73. }
  74. QFuture<HttpResponse> getRoomListApi(const RoomInfo &roomInfo, int page, int pageSize)
  75. {
  76. QJsonObject jsonData;
  77. QJsonValue value = JsonMapper::toJson(roomInfo);
  78. jsonData["page"] = page;
  79. jsonData["pageSize"] = pageSize;
  80. if (value.isObject()) {
  81. QJsonObject nested = value.toObject();
  82. for (const QString &key : nested.keys()) {
  83. if (!nested[key].isNull()) {
  84. jsonData[key] = nested[key];
  85. }
  86. }
  87. }
  88. // 活驴
  89. qDebug() << jsonData;
  90. QJsonDocument doc(jsonData);
  91. return TC::RequestClient::globalInstance()->postAsync("/room/list", doc);
  92. }
  93. QFuture<HttpResponse> getRoomApi(const QString &id)
  94. {
  95. QJsonObject jsonData;
  96. jsonData["id"] = id;
  97. // 活驴
  98. qDebug() << jsonData;
  99. QJsonDocument doc(jsonData);
  100. return TC::RequestClient::globalInstance()->postAsync("/room", doc);
  101. }