File indexing completed on 2024-05-12 16:25:36

0001 /*
0002    SPDX-FileCopyrightText: 2020-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "customuserstatuses.h"
0008 #include "ruqola_debug.h"
0009 
0010 #include <QJsonArray>
0011 #include <QJsonObject>
0012 
0013 CustomUserStatuses::CustomUserStatuses() = default;
0014 
0015 CustomUserStatuses::~CustomUserStatuses() = default;
0016 
0017 void CustomUserStatuses::parseCustomUserStatuses(const QJsonObject &customStatusObj)
0018 {
0019     mCustomUserCount = customStatusObj[QLatin1String("count")].toInt();
0020     mOffset = customStatusObj[QLatin1String("offset")].toInt();
0021     mTotal = customStatusObj[QLatin1String("total")].toInt();
0022     mCustomUserses.clear();
0023     parseListCustomUserStatuses(customStatusObj);
0024 }
0025 
0026 void CustomUserStatuses::parseListCustomUserStatuses(const QJsonObject &customStatusObj)
0027 {
0028     const QJsonArray customsUserArray = customStatusObj[QLatin1String("statuses")].toArray();
0029     mCustomUserses.reserve(mCustomUserses.count() + customsUserArray.count());
0030     for (const QJsonValue &current : customsUserArray) {
0031         if (current.type() == QJsonValue::Object) {
0032             const QJsonObject customUserObj = current.toObject();
0033             CustomUserStatus m;
0034             m.parseCustomStatus(customUserObj);
0035             mCustomUserses.append(std::move(m));
0036         } else {
0037             qCWarning(RUQOLA_LOG) << "Problem when parsing customStatusUser" << current;
0038         }
0039     }
0040 }
0041 
0042 bool CustomUserStatuses::isEmpty() const
0043 {
0044     return mCustomUserses.isEmpty();
0045 }
0046 
0047 void CustomUserStatuses::clear()
0048 {
0049     mCustomUserses.clear();
0050 }
0051 
0052 int CustomUserStatuses::count() const
0053 {
0054     return mCustomUserses.count();
0055 }
0056 
0057 CustomUserStatus CustomUserStatuses::at(int index) const
0058 {
0059     if (index < 0 || index > mCustomUserses.count()) {
0060         qCWarning(RUQOLA_LOG) << "Invalid index " << index;
0061         return {};
0062     }
0063     return mCustomUserses.at(index);
0064 }
0065 
0066 int CustomUserStatuses::offset() const
0067 {
0068     return mOffset;
0069 }
0070 
0071 void CustomUserStatuses::setOffset(int offset)
0072 {
0073     mOffset = offset;
0074 }
0075 
0076 int CustomUserStatuses::total() const
0077 {
0078     return mTotal;
0079 }
0080 
0081 void CustomUserStatuses::setTotal(int total)
0082 {
0083     mTotal = total;
0084 }
0085 
0086 QVector<CustomUserStatus> CustomUserStatuses::customUserses() const
0087 {
0088     return mCustomUserses;
0089 }
0090 
0091 void CustomUserStatuses::setCustomUserses(const QVector<CustomUserStatus> &customUserses)
0092 {
0093     mCustomUserses = customUserses;
0094 }
0095 
0096 void CustomUserStatuses::deleteCustomUserStatuses(const QJsonArray &replyArray)
0097 {
0098     for (int i = 0, total = replyArray.count(); i < total; ++i) {
0099         const QJsonObject obj = replyArray.at(i).toObject();
0100         const QJsonObject customStatusObj = obj.value(QLatin1String("userStatusData")).toObject();
0101         if (!customStatusObj.isEmpty()) {
0102             if (customStatusObj.contains(QLatin1String("_id"))) {
0103                 const QString identifier = customStatusObj.value(QLatin1String("_id")).toString();
0104                 for (const CustomUserStatus &status : std::as_const(mCustomUserses)) {
0105                     if (status.identifier() == identifier) {
0106                         mCustomUserses.removeOne(status);
0107                         break;
0108                     }
0109                 }
0110                 // TODO fix total ???
0111             } else {
0112                 qCWarning(RUQOLA_LOG) << "deleteCustomUser invalid QJsonObject" << customStatusObj;
0113             }
0114         }
0115     }
0116 }
0117 
0118 void CustomUserStatuses::updateCustomUserStatues(const QJsonArray &replyArray)
0119 {
0120     // TODO fix total
0121     for (int i = 0; i < replyArray.count(); ++i) {
0122         const QJsonObject obj = replyArray.at(i).toObject();
0123         const QJsonObject customStatusObj = obj.value(QLatin1String("userStatusData")).toObject();
0124         if (!customStatusObj.isEmpty()) {
0125             if (customStatusObj.contains(QLatin1String("_id"))) {
0126                 // previousStatusType
0127                 // previousName
0128                 //=> update otherwise add
0129                 bool found = false;
0130                 const QString identifier = customStatusObj.value(QLatin1String("_id")).toString();
0131                 for (CustomUserStatus &status : mCustomUserses) {
0132                     if (status.identifier() == identifier) {
0133                         status.parseCustomStatus(customStatusObj);
0134                         found = true;
0135                         break;
0136                     }
0137                 }
0138                 if (!found) {
0139                     // Parse
0140                     CustomUserStatus newStatus;
0141                     newStatus.parseCustomStatus(customStatusObj, false);
0142                     if (newStatus.isValid()) {
0143                         mCustomUserses.append(std::move(newStatus));
0144                     }
0145                 }
0146             } else {
0147                 // It's a bug in RC server see https://github.com/RocketChat/Rocket.Chat/issues/28542
0148 
0149                 qCWarning(RUQOLA_LOG) << "updateCustomUser invalid QJsonObject" << customStatusObj;
0150             }
0151         }
0152     }
0153 }
0154 
0155 QDebug operator<<(QDebug d, const CustomUserStatuses &t)
0156 {
0157     d.space() << "total" << t.total();
0158     d.space() << "offset" << t.offset();
0159     d.space() << "customStatus Count" << t.count() << "\n";
0160     for (int i = 0, total = t.customUserses().count(); i < total; ++i) {
0161         d.space() << t.customUserses().at(i) << "\n";
0162     }
0163     return d;
0164 }