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

0001 /*
0002  * This file is part of LibKGAPI library
0003  *
0004  * SPDX-FileCopyrightText: 2022 Claudio Cambra <claudio.cambra@kde.org>
0005  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006  *
0007  */
0008 
0009 #include "contactgroupfetchjob.h"
0010 #include "peopleservice.h"
0011 #include "contactgroup.h"
0012 #include "utils.h"
0013 
0014 #include <QNetworkRequest>
0015 #include <QNetworkReply>
0016 #include <QUrlQuery>
0017 #include <QJsonDocument>
0018 #include <QJsonObject>
0019 #include <QJsonArray>
0020 
0021 namespace KGAPI2::People
0022 {
0023 
0024 class Q_DECL_HIDDEN ContactGroupFetchJob::Private
0025 {
0026 public:
0027     explicit Private(ContactGroupFetchJob *parent);
0028 
0029     QNetworkRequest createRequest(const QUrl &url);
0030 
0031     QString resourceName;
0032 
0033 private:
0034     ContactGroupFetchJob * const q;
0035 };
0036 
0037 ContactGroupFetchJob::Private::Private(ContactGroupFetchJob *parent)
0038     : q(parent)
0039 {
0040 }
0041 
0042 ContactGroupFetchJob::ContactGroupFetchJob(const AccountPtr& account, QObject* parent)
0043     : FetchJob(account, parent)
0044     , d(std::make_unique<Private>(this))
0045 {
0046 }
0047 
0048 QNetworkRequest ContactGroupFetchJob::Private::createRequest(const QUrl& url)
0049 {
0050     QNetworkRequest request(url);
0051     request.setRawHeader("Host", "people.googleapis.com");
0052     return request;
0053 }
0054 
0055 ContactGroupFetchJob::ContactGroupFetchJob(const QString &resourceName,
0056                                            const AccountPtr &account,
0057                                            QObject* parent)
0058     : FetchJob(account, parent)
0059     , d(std::make_unique<Private>(this))
0060 {
0061     d->resourceName = resourceName;
0062 }
0063 
0064 ContactGroupFetchJob::~ContactGroupFetchJob() = default;
0065 
0066 void ContactGroupFetchJob::start()
0067 {
0068     QUrl url;
0069     if (d->resourceName.isEmpty()) {
0070         url = PeopleService::fetchAllContactGroupsUrl();
0071     } else {
0072         url = PeopleService::fetchContactGroupUrl(d->resourceName);
0073     }
0074 
0075     const QNetworkRequest request = d->createRequest(url);
0076     enqueueRequest(request);
0077 }
0078 
0079 
0080 ObjectsList ContactGroupFetchJob::handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData)
0081 {
0082     FeedData feedData;
0083     ObjectsList items;
0084 
0085     const auto contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString();
0086     ContentType ct = Utils::stringToContentType(contentType);
0087 
0088     if (ct != KGAPI2::JSON) {
0089         return ObjectsList();
0090     }
0091 
0092     if (d->resourceName.isEmpty()) {
0093         items = PeopleService::parseContactGroupsJSONFeed(feedData, rawData);
0094     } else {
0095         const auto jsonDocumentFromData = QJsonDocument::fromJson(rawData);
0096         if(jsonDocumentFromData.isObject()) {
0097             items << People::ContactGroup::fromJSON(jsonDocumentFromData.object());
0098         } else {
0099             qDebug() << "JSON document does not have object";
0100         }
0101     }
0102 
0103     if (feedData.nextPageUrl.isValid()) {
0104         emitProgress(feedData.startIndex, feedData.totalResults);
0105 
0106         const auto request = d->createRequest(feedData.nextPageUrl);
0107         enqueueRequest(request);
0108     } else {
0109         emitFinished();
0110     }
0111 
0112     return items;
0113 }
0114 
0115 }
0116 
0117 #include "moc_contactgroupfetchjob.cpp"