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"