File indexing completed on 2025-02-02 04:51:43

0001 /*
0002    SPDX-FileCopyrightText: 2021-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #include "directoryjob.h"
0008 #include "restapimethod.h"
0009 #include "rocketchatqtrestapi_debug.h"
0010 #include <QJsonDocument>
0011 #include <QJsonObject>
0012 #include <QNetworkReply>
0013 #include <QUrlQuery>
0014 using namespace RocketChatRestApi;
0015 DirectoryJob::DirectoryJob(QObject *parent)
0016     : RestApiAbstractJob(parent)
0017 {
0018 }
0019 
0020 DirectoryJob::~DirectoryJob() = default;
0021 
0022 bool DirectoryJob::requireHttpAuthentication() const
0023 {
0024     return true;
0025 }
0026 
0027 bool DirectoryJob::start()
0028 {
0029     if (!canStart()) {
0030         deleteLater();
0031         return false;
0032     }
0033     initialQueryParameters();
0034     submitGetRequest();
0035 
0036     addStartRestApiInfo(QByteArrayLiteral("DirectoryJob: Ask for search room or users or teams"));
0037     return true;
0038 }
0039 
0040 void DirectoryJob::initialQueryParameters()
0041 {
0042     QueryParameters parameters = queryParameters();
0043     QMap<QString, QString> map;
0044     switch (mDirectoryInfo.searchType) {
0045     case Unknown:
0046         qCWarning(ROCKETCHATQTRESTAPI_LOG) << "mDirectoryInfo.searchType is undefined";
0047         break;
0048     case Rooms:
0049         map.insert(QStringLiteral("type"), QStringLiteral("channels"));
0050         break;
0051     case Users:
0052         map.insert(QStringLiteral("type"), QStringLiteral("users"));
0053         break;
0054     case Teams:
0055         map.insert(QStringLiteral("type"), QStringLiteral("teams")); // Verify
0056         break;
0057     }
0058 
0059     map.insert(QStringLiteral("text"), mDirectoryInfo.pattern);
0060     map.insert(QStringLiteral("workspace"), QStringLiteral("local"));
0061     parameters.setCustom(map);
0062     setQueryParameters(parameters);
0063 }
0064 
0065 void DirectoryJob::onGetRequestResponse(const QString &replyErrorString, const QJsonDocument &replyJson)
0066 {
0067     const QJsonObject replyObject = replyJson.object();
0068 
0069     if (replyObject[QLatin1String("success")].toBool()) {
0070         addLoggerInfo(QByteArrayLiteral("DirectoryJob: success: ") + replyJson.toJson(QJsonDocument::Indented));
0071         Q_EMIT directoryDone(replyObject);
0072     } else {
0073         emitFailedMessage(replyErrorString, replyObject);
0074         addLoggerWarning(QByteArrayLiteral("DirectoryJob: Problem: ") + replyJson.toJson(QJsonDocument::Indented));
0075     }
0076 }
0077 
0078 DirectoryJob::DirectoryInfo DirectoryJob::directoryInfo() const
0079 {
0080     return mDirectoryInfo;
0081 }
0082 
0083 void DirectoryJob::setDirectoryInfo(const DirectoryInfo &directoryInfo)
0084 {
0085     mDirectoryInfo = directoryInfo;
0086 }
0087 
0088 bool DirectoryJob::hasQueryParameterSupport() const
0089 {
0090     return true;
0091 }
0092 
0093 QNetworkRequest DirectoryJob::request() const
0094 {
0095     QUrl url = mRestApiMethod->generateUrl(RestApiUtil::RestApiUrlType::Directory);
0096     QUrlQuery queryUrl;
0097     addQueryParameter(queryUrl);
0098     url.setQuery(queryUrl);
0099     QNetworkRequest request(url);
0100     addAuthRawHeader(request);
0101     addRequestAttribute(request, false);
0102     return request;
0103 }
0104 
0105 bool DirectoryJob::canStart() const
0106 {
0107     if (!RestApiAbstractJob::canStart()) {
0108         return false;
0109     }
0110     if (!mDirectoryInfo.canStart()) {
0111         qCWarning(ROCKETCHATQTRESTAPI_LOG) << "DirectoryJob: mSearchType is undefined";
0112         return false;
0113     }
0114     return true;
0115 }
0116 
0117 bool DirectoryJob::DirectoryInfo::canStart() const
0118 {
0119     return searchType != SearchType::Unknown;
0120 }
0121 
0122 bool DirectoryJob::DirectoryInfo::operator==(const DirectoryJob::DirectoryInfo &other) const
0123 {
0124     return other.searchType == searchType && other.pattern == pattern;
0125 }
0126 
0127 #include "moc_directoryjob.cpp"