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

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 "teamdrivefetchjob.h"
0010 #include "debug.h"
0011 #include "driveservice.h"
0012 #include "teamdrive.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 TeamdriveFetchJob::Private
0028 {
0029 public:
0030     Private(TeamdriveFetchJob *parent);
0031 
0032     TeamdriveSearchQuery searchQuery;
0033     QString teamdriveId;
0034 
0035     int maxResults = 0;
0036     bool useDomainAdminAccess = false;
0037 
0038     QStringList fields;
0039 
0040 private:
0041     TeamdriveFetchJob *const q;
0042 };
0043 
0044 TeamdriveFetchJob::Private::Private(TeamdriveFetchJob *parent)
0045     : q(parent)
0046 {
0047 }
0048 
0049 TeamdriveFetchJob::TeamdriveFetchJob(const QString &teamdriveId, const AccountPtr &account, QObject *parent)
0050     : FetchJob(account, parent)
0051     , d(new Private(this))
0052 {
0053     d->teamdriveId = teamdriveId;
0054 }
0055 
0056 TeamdriveFetchJob::TeamdriveFetchJob(const TeamdriveSearchQuery &query, const AccountPtr &account, QObject *parent)
0057     : FetchJob(account, parent)
0058     , d(new Private(this))
0059 {
0060     d->useDomainAdminAccess = true;
0061     d->searchQuery = query;
0062 }
0063 
0064 TeamdriveFetchJob::TeamdriveFetchJob(const AccountPtr &account, QObject *parent)
0065     : FetchJob(account, parent)
0066     , d(new Private(this))
0067 {
0068 }
0069 
0070 TeamdriveFetchJob::~TeamdriveFetchJob() = default;
0071 
0072 void TeamdriveFetchJob::setMaxResults(int maxResults)
0073 {
0074     if (isRunning()) {
0075         qCWarning(KGAPIDebug) << "Can't modify maxResults property when job is running";
0076         return;
0077     }
0078 
0079     d->maxResults = maxResults;
0080 }
0081 
0082 int TeamdriveFetchJob::maxResults() const
0083 {
0084     return d->maxResults;
0085 }
0086 
0087 void TeamdriveFetchJob::setUseDomainAdminAccess(bool useDomainAdminAccess)
0088 {
0089     if (isRunning()) {
0090         qCWarning(KGAPIDebug) << "Can't modify useDomainAdminAccess property when job is running";
0091         return;
0092     }
0093 
0094     d->useDomainAdminAccess = useDomainAdminAccess;
0095 }
0096 
0097 bool TeamdriveFetchJob::useDomainAdminAccess() const
0098 {
0099     return d->useDomainAdminAccess;
0100 }
0101 
0102 void TeamdriveFetchJob::setFields(const QStringList &fields)
0103 {
0104     if (isRunning()) {
0105         qCWarning(KGAPIDebug) << "Called setFields() on running job. Ignoring.";
0106         return;
0107     }
0108 
0109     d->fields = fields;
0110 }
0111 
0112 QStringList TeamdriveFetchJob::fields() const
0113 {
0114     return d->fields;
0115 }
0116 
0117 void TeamdriveFetchJob::start()
0118 {
0119     QUrl url;
0120     if (d->teamdriveId.isEmpty()) {
0121         url = DriveService::fetchTeamdrivesUrl();
0122         applyRequestParameters(url);
0123     } else {
0124         url = DriveService::fetchTeamdriveUrl(d->teamdriveId);
0125         if (!d->fields.isEmpty()) {
0126             // Deserializing requires kind attribute, always force add it
0127             if (!d->fields.contains(Teamdrive::Fields::Kind)) {
0128                 d->fields << Teamdrive::Fields::Kind;
0129             }
0130             Job::setFields(d->fields);
0131         }
0132     }
0133 
0134     QNetworkRequest request(url);
0135     enqueueRequest(request);
0136 }
0137 
0138 ObjectsList TeamdriveFetchJob::handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData)
0139 {
0140     FeedData feedData;
0141     feedData.requestUrl = reply->url();
0142 
0143     ObjectsList items;
0144 
0145     const QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString();
0146     ContentType ct = Utils::stringToContentType(contentType);
0147     if (ct == KGAPI2::JSON) {
0148         if (d->teamdriveId.isEmpty()) {
0149             items << Teamdrive::fromJSONFeed(rawData, feedData);
0150         } else {
0151             items << Teamdrive::fromJSON(rawData);
0152         }
0153     } else {
0154         setError(KGAPI2::InvalidResponse);
0155         setErrorString(tr("Invalid response content type"));
0156         emitFinished();
0157         return items;
0158     }
0159 
0160     if (feedData.nextPageUrl.isValid()) {
0161         // Reapply query options
0162         applyRequestParameters(feedData.nextPageUrl);
0163         QNetworkRequest request(feedData.nextPageUrl);
0164         enqueueRequest(request);
0165     }
0166 
0167     return items;
0168 }
0169 
0170 void TeamdriveFetchJob::applyRequestParameters(QUrl &url)
0171 {
0172     QUrlQuery query(url);
0173     if (d->maxResults != 0) {
0174         query.addQueryItem(MaxResultsAttr, QString::number(d->maxResults));
0175     }
0176     if (d->useDomainAdminAccess != false) {
0177         query.addQueryItem(UseDomainAdminAccessAttr, Utils::bool2Str(d->useDomainAdminAccess));
0178     }
0179     if (!d->searchQuery.isEmpty()) {
0180         query.addQueryItem(QStringLiteral("q"), d->searchQuery.serialize());
0181     }
0182     if (!d->fields.isEmpty()) {
0183         // Deserializing requires kind attribute, always force add it
0184         if (!d->fields.contains(Teamdrive::Fields::Kind)) {
0185             d->fields << Teamdrive::Fields::Kind;
0186         }
0187         QString itemFields = Job::buildSubfields(Teamdrive::Fields::Items, d->fields);
0188         Job::setFields({Teamdrive::Fields::Kind, Teamdrive::Fields::NextPageToken, itemFields});
0189     }
0190     url.setQuery(query);
0191 }
0192 
0193 #include "moc_teamdrivefetchjob.cpp"