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

0001 /*
0002  * This file is part of LibKGAPI library
0003  *
0004  * SPDX-FileCopyrightText: 2022 Claudio Cambra <claudio.cambra@kde.org>
0005  *
0006  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007  */
0008 
0009 #include "personfetchjob.h"
0010 #include "peopleservice.h"
0011 #include "person.h"
0012 #include "../debug.h"
0013 #include "utils.h"
0014 #include "account.h"
0015 
0016 #include <QNetworkRequest>
0017 #include <QNetworkReply>
0018 #include <QUrlQuery>
0019 #include <QJsonDocument>
0020 #include <QJsonObject>
0021 #include <QJsonArray>
0022 
0023 namespace KGAPI2::People
0024 {
0025 
0026 class Q_DECL_HIDDEN PersonFetchJob::Private
0027 {
0028 public:
0029     explicit Private(PersonFetchJob *parent);
0030 
0031     QNetworkRequest createRequest(const QUrl &url);
0032     ObjectsList processReceivedData(const QByteArray &rawData);
0033 
0034     QString personResourceName;
0035     QString syncToken;
0036     QString receivedSyncToken;
0037 
0038 public Q_SLOTS:
0039     void startFetch();
0040 
0041 private:
0042     PersonFetchJob * const q;
0043 };
0044 
0045 PersonFetchJob::Private::Private(PersonFetchJob *parent)
0046     : q(parent)
0047 {
0048 }
0049 
0050 QNetworkRequest PersonFetchJob::Private::createRequest(const QUrl& url)
0051 {
0052     QNetworkRequest request(url);
0053     request.setRawHeader("Host", "people.googleapis.com");
0054     return request;
0055 }
0056 
0057 void PersonFetchJob::Private::startFetch()
0058 {
0059     QUrl url;
0060     if (personResourceName.isEmpty()) {
0061         url = PeopleService::fetchAllContactsUrl(syncToken);
0062     } else {
0063         url = PeopleService::fetchContactUrl(personResourceName);
0064     }
0065 
0066     const QNetworkRequest request = createRequest(url);
0067     q->enqueueRequest(request);
0068 }
0069 
0070 ObjectsList PersonFetchJob::Private::processReceivedData(const QByteArray &rawData)
0071 {
0072     FeedData feedData;
0073     ObjectsList items;
0074 
0075     if (personResourceName.isEmpty()) {
0076         items = PeopleService::parseConnectionsJSONFeed(feedData, rawData, syncToken);
0077     } else {
0078         const auto jsonDocumentFromData = QJsonDocument::fromJson(rawData);
0079         if(jsonDocumentFromData.isObject()) {
0080             items << People::Person::fromJSON(jsonDocumentFromData.object());
0081         } else {
0082             qCDebug(KGAPIDebug) << "JSON document does not have object";
0083         }
0084     }
0085 
0086     if (feedData.nextPageUrl.isValid()) {
0087         q->emitProgress(feedData.startIndex, feedData.totalResults);
0088 
0089         const QNetworkRequest request = createRequest(feedData.nextPageUrl);
0090         q->enqueueRequest(request);
0091     } else {
0092         receivedSyncToken = feedData.syncToken;
0093         q->emitFinished();
0094     }
0095 
0096     return items;
0097 }
0098 
0099 PersonFetchJob::PersonFetchJob(const AccountPtr& account, QObject* parent)
0100     : FetchJob(account, parent)
0101     , d(std::make_unique<Private>(this))
0102 {
0103 }
0104 
0105 PersonFetchJob::PersonFetchJob(const QString &resourceName, const AccountPtr &account, QObject* parent)
0106     : FetchJob(account, parent)
0107     , d(std::make_unique<Private>(this))
0108 {
0109     d->personResourceName = resourceName;
0110 }
0111 
0112 PersonFetchJob::~PersonFetchJob() = default;
0113 
0114 QString PersonFetchJob::syncToken() const
0115 {
0116     return d->syncToken;
0117 }
0118 
0119 void PersonFetchJob::setSyncToken(const QString &syncToken)
0120 {
0121     if (syncToken == d->syncToken) {
0122         return;
0123     }
0124 
0125     d->syncToken = syncToken;
0126     Q_EMIT syncTokenChanged();
0127 }
0128 
0129 QString PersonFetchJob::receivedSyncToken() const
0130 {
0131     return d->receivedSyncToken;
0132 }
0133 
0134 void PersonFetchJob::start()
0135 {
0136     d->startFetch();
0137 }
0138 
0139 ObjectsList PersonFetchJob::handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData)
0140 {
0141     const auto contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString();
0142     const auto ct = Utils::stringToContentType(contentType);
0143 
0144     if (ct == KGAPI2::JSON) {
0145         return d->processReceivedData(rawData);
0146     }
0147 
0148     return ObjectsList();
0149 }
0150 
0151 }
0152 
0153 #include "moc_personfetchjob.cpp"