File indexing completed on 2024-05-12 05:22:18

0001 /*
0002  * This file is part of LibKGAPI library
0003  *
0004  * SPDX-FileCopyrightText: 2019 David Barchiesi <david@barchie.si>
0005  *
0006  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007  */
0008 
0009 #include "drivesfetchjob.h"
0010 #include "debug.h"
0011 #include "drives.h"
0012 #include "driveservice.h"
0013 #include "utils.h"
0014 
0015 #include <QNetworkReply>
0016 #include <QNetworkRequest>
0017 #include <QUrlQuery>
0018 
0019 namespace
0020 {
0021 static const QString MaxResultsAttr = QStringLiteral("maxResults");
0022 static const QString UseDomainAdminAccessAttr = QStringLiteral("useDomainAdminAccess");
0023 }
0024 using namespace KGAPI2;
0025 using namespace KGAPI2::Drive;
0026 
0027 class Q_DECL_HIDDEN DrivesFetchJob::Private
0028 {
0029 public:
0030     Private(DrivesFetchJob *parent);
0031 
0032     DrivesSearchQuery searchQuery;
0033     QString drivesId;
0034 
0035     int maxResults = 0;
0036     QVariant useDomainAdminAccess;
0037 
0038     QStringList fields;
0039 
0040 private:
0041     DrivesFetchJob *const q;
0042 };
0043 
0044 DrivesFetchJob::Private::Private(DrivesFetchJob *parent)
0045     : q(parent)
0046 {
0047 }
0048 
0049 DrivesFetchJob::DrivesFetchJob(const QString &drivesId, const AccountPtr &account, QObject *parent)
0050     : FetchJob(account, parent)
0051     , d(new Private(this))
0052 {
0053     d->drivesId = drivesId;
0054 }
0055 
0056 DrivesFetchJob::DrivesFetchJob(const DrivesSearchQuery &query, const AccountPtr &account, QObject *parent)
0057     : FetchJob(account, parent)
0058     , d(new Private(this))
0059 {
0060     d->searchQuery = query;
0061 }
0062 
0063 DrivesFetchJob::DrivesFetchJob(const AccountPtr &account, QObject *parent)
0064     : FetchJob(account, parent)
0065     , d(new Private(this))
0066 {
0067 }
0068 
0069 DrivesFetchJob::~DrivesFetchJob() = default;
0070 
0071 void DrivesFetchJob::setMaxResults(int maxResults)
0072 {
0073     if (isRunning()) {
0074         qCWarning(KGAPIDebug) << "Can't modify maxResults property when job is running";
0075         return;
0076     }
0077 
0078     d->maxResults = maxResults;
0079 }
0080 
0081 int DrivesFetchJob::maxResults() const
0082 {
0083     return d->maxResults;
0084 }
0085 
0086 void DrivesFetchJob::setUseDomainAdminAccess(bool useDomainAdminAccess)
0087 {
0088     if (isRunning()) {
0089         qCWarning(KGAPIDebug) << "Can't modify useDomainAdminAccess property when job is running";
0090         return;
0091     }
0092 
0093     d->useDomainAdminAccess = useDomainAdminAccess;
0094 }
0095 
0096 bool DrivesFetchJob::useDomainAdminAccess() const
0097 {
0098     return d->useDomainAdminAccess.toBool();
0099 }
0100 
0101 void DrivesFetchJob::setFields(const QStringList &fields)
0102 {
0103     if (isRunning()) {
0104         qCWarning(KGAPIDebug) << "Called setFields() on running job. Ignoring.";
0105         return;
0106     }
0107 
0108     d->fields = fields;
0109 }
0110 
0111 QStringList DrivesFetchJob::fields() const
0112 {
0113     return d->fields;
0114 }
0115 
0116 void DrivesFetchJob::start()
0117 {
0118     QUrl url;
0119     if (d->drivesId.isEmpty()) {
0120         url = DriveService::fetchDrivesUrl();
0121         applyRequestParameters(url);
0122     } else {
0123         url = DriveService::fetchDrivesUrl(d->drivesId);
0124         if (!d->fields.isEmpty()) {
0125             // Deserializing requires kind attribute, always force add it
0126             if (!d->fields.contains(Drives::Fields::Kind)) {
0127                 d->fields << Drives::Fields::Kind;
0128             }
0129             Job::setFields(d->fields);
0130         }
0131     }
0132 
0133     QNetworkRequest request(url);
0134     enqueueRequest(request);
0135 }
0136 
0137 ObjectsList DrivesFetchJob::handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData)
0138 {
0139     FeedData feedData;
0140     feedData.requestUrl = reply->url();
0141 
0142     ObjectsList items;
0143 
0144     const QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString();
0145     ContentType ct = Utils::stringToContentType(contentType);
0146     if (ct == KGAPI2::JSON) {
0147         if (d->drivesId.isEmpty()) {
0148             items << Drives::fromJSONFeed(rawData, feedData);
0149         } else {
0150             items << Drives::fromJSON(rawData);
0151         }
0152     } else {
0153         setError(KGAPI2::InvalidResponse);
0154         setErrorString(tr("Invalid response content type"));
0155         emitFinished();
0156         return items;
0157     }
0158 
0159     if (feedData.nextPageUrl.isValid()) {
0160         // Reapply query options
0161         applyRequestParameters(feedData.nextPageUrl);
0162         QNetworkRequest request(feedData.nextPageUrl);
0163         enqueueRequest(request);
0164     }
0165 
0166     return items;
0167 }
0168 
0169 void DrivesFetchJob::applyRequestParameters(QUrl &url)
0170 {
0171     QUrlQuery query(url);
0172     if (d->maxResults != 0) {
0173         query.addQueryItem(MaxResultsAttr, QString::number(d->maxResults));
0174     }
0175     if (!d->useDomainAdminAccess.isNull()) {
0176         query.addQueryItem(UseDomainAdminAccessAttr, Utils::bool2Str(d->useDomainAdminAccess.toBool()));
0177     }
0178     if (!d->searchQuery.isEmpty()) {
0179         query.addQueryItem(QStringLiteral("q"), d->searchQuery.serialize());
0180     }
0181     if (!d->fields.isEmpty()) {
0182         // Deserializing requires kind attribute, always force add it
0183         if (!d->fields.contains(Drives::Fields::Kind)) {
0184             d->fields << Drives::Fields::Kind;
0185         }
0186         QString itemFields = Job::buildSubfields(Drives::Fields::Items, d->fields);
0187         Job::setFields({Drives::Fields::Kind, Drives::Fields::NextPageToken, itemFields});
0188     }
0189     url.setQuery(query);
0190 }
0191 
0192 #include "moc_drivesfetchjob.cpp"