File indexing completed on 2024-05-12 05:22:25
0001 /* 0002 * This file is part of LibKGAPI library 0003 * 0004 * SPDX-FileCopyrightText: 2023 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 "contactgroupcreatejob.h" 0010 #include "contactgroup.h" 0011 #include "peopleservice.h" 0012 #include "private/queuehelper_p.h" 0013 #include "utils.h" 0014 0015 #include <QNetworkRequest> 0016 #include <QNetworkReply> 0017 #include <QUrlQuery> 0018 #include <QJsonDocument> 0019 #include <QJsonObject> 0020 #include <QJsonArray> 0021 0022 namespace KGAPI2::People 0023 { 0024 0025 class Q_DECL_HIDDEN ContactGroupCreateJob::Private 0026 { 0027 public: 0028 explicit Private(ContactGroupCreateJob *parent); 0029 void processNextContactGroup(); 0030 0031 QueueHelper<ContactGroupPtr> groups; 0032 ContactGroupPtr lastGroup; 0033 0034 private: 0035 ContactGroupCreateJob * const q; 0036 }; 0037 0038 ContactGroupCreateJob::Private::Private(ContactGroupCreateJob *parent) 0039 : q(parent) 0040 { 0041 } 0042 0043 void ContactGroupCreateJob::Private::processNextContactGroup() 0044 { 0045 if (groups.atEnd()) { 0046 q->emitFinished(); 0047 return; 0048 } 0049 0050 const auto group = groups.current(); 0051 static const auto createUrl = PeopleService::createContactGroupUrl(); 0052 QNetworkRequest request(createUrl); 0053 request.setRawHeader("Host", "people.googleapis.com"); 0054 0055 const auto groupJson = group->toJSON().toObject(); 0056 const QJsonObject rootObject { 0057 { QStringLiteral("contactGroup"), groupJson }, 0058 { QStringLiteral("readGroupFields"), PeopleService::allContactGroupRecentlyCreatedAvailableFields() } 0059 }; 0060 const auto rawData = QJsonDocument(rootObject).toJson(); 0061 q->enqueueRequest(request, rawData, QStringLiteral("application/json")); 0062 } 0063 0064 0065 ContactGroupCreateJob::ContactGroupCreateJob(const ContactGroupList &contactGroups, const AccountPtr& account, QObject* parent) 0066 : CreateJob(account, parent) 0067 , d(std::make_unique<Private>(this)) 0068 { 0069 d->groups = contactGroups; 0070 } 0071 0072 ContactGroupCreateJob::ContactGroupCreateJob(const ContactGroupPtr &contactGroup, const AccountPtr &account, QObject* parent) 0073 : CreateJob(account, parent) 0074 , d(std::make_unique<Private>(this)) 0075 { 0076 d->groups << contactGroup; 0077 } 0078 0079 ContactGroupCreateJob::~ContactGroupCreateJob() = default; 0080 0081 void ContactGroupCreateJob::start() 0082 { 0083 d->processNextContactGroup(); 0084 } 0085 0086 ObjectsList ContactGroupCreateJob::handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData) 0087 { 0088 const auto contentTypeString = reply->header(QNetworkRequest::ContentTypeHeader).toString(); 0089 const auto contentType = Utils::stringToContentType(contentTypeString); 0090 0091 if (contentType != KGAPI2::JSON) { 0092 setError(KGAPI2::InvalidResponse); 0093 setErrorString(tr("Invalid response content type")); 0094 emitFinished(); 0095 return {}; 0096 } 0097 0098 ObjectsList items; 0099 const auto json = QJsonDocument::fromJson(rawData); 0100 if (json.isObject()) { 0101 const auto group = ContactGroup::fromJSON(json.object()); 0102 items << group; 0103 } 0104 0105 d->groups.currentProcessed(); 0106 d->processNextContactGroup(); 0107 0108 return items; 0109 } 0110 0111 } 0112 0113 #include "moc_contactgroupcreatejob.cpp"