File indexing completed on 2024-05-12 05:22:29
0001 /* 0002 * This file is part of LibKGAPI library 0003 * 0004 * SPDX-FileCopyrightText: 2023 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 "personmodifyjob.h" 0010 #include "peopleservice.h" 0011 #include "person.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 PersonModifyJob::Private 0026 { 0027 public: 0028 explicit Private(PersonModifyJob *parent); 0029 void processNextPerson(); 0030 0031 QueueHelper<PersonPtr> people; 0032 0033 private: 0034 PersonModifyJob * const q; 0035 }; 0036 0037 PersonModifyJob::Private::Private(PersonModifyJob *parent) 0038 : q(parent) 0039 { 0040 } 0041 0042 void PersonModifyJob::Private::processNextPerson() 0043 { 0044 if (people.atEnd()) { 0045 q->emitFinished(); 0046 return; 0047 } 0048 0049 const auto person = people.current(); 0050 const auto modifyUrl = PeopleService::updateContactUrl(person->resourceName(), PeopleService::allUpdatablePersonFields()); 0051 QNetworkRequest request(modifyUrl); 0052 request.setRawHeader("Host", "people.googleapis.com"); 0053 0054 const auto personJson = QJsonDocument(person->toJSON().toObject()); 0055 const auto rawData = personJson.toJson(); 0056 q->enqueueRequest(request, rawData, QStringLiteral("application/json")); 0057 } 0058 0059 PersonModifyJob::PersonModifyJob(const PersonList &people, const AccountPtr &account, QObject* parent) 0060 : ModifyJob(account, parent) 0061 , d(std::make_unique<Private>(this)) 0062 { 0063 d->people = people; 0064 } 0065 0066 PersonModifyJob::PersonModifyJob(const PersonPtr &person, const AccountPtr &account, QObject* parent) 0067 : ModifyJob(account, parent) 0068 , d(std::make_unique<Private>(this)) 0069 { 0070 d->people << person; 0071 } 0072 0073 PersonModifyJob::~PersonModifyJob() = default; 0074 0075 void PersonModifyJob::start() 0076 { 0077 d->processNextPerson(); 0078 } 0079 0080 void PersonModifyJob::dispatchRequest(QNetworkAccessManager *accessManager, 0081 const QNetworkRequest &request, 0082 const QByteArray &data, 0083 const QString &contentType) 0084 { 0085 QNetworkRequest r = request; 0086 if (!r.hasRawHeader("Content-Type")) { 0087 r.setHeader(QNetworkRequest::ContentTypeHeader, contentType); 0088 } 0089 0090 if (!r.hasRawHeader("If-Match")) { 0091 r.setRawHeader("If-Match", "*"); 0092 } 0093 0094 accessManager->sendCustomRequest(r, "PATCH", data); 0095 } 0096 0097 ObjectsList PersonModifyJob::handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData) 0098 { 0099 const auto contentTypeString = reply->header(QNetworkRequest::ContentTypeHeader).toString(); 0100 const auto contentType = Utils::stringToContentType(contentTypeString); 0101 0102 if (contentType != KGAPI2::JSON) { 0103 setError(KGAPI2::InvalidResponse); 0104 setErrorString(tr("Invalid response content type")); 0105 emitFinished(); 0106 return {}; 0107 } 0108 0109 ObjectsList items; 0110 const auto json = QJsonDocument::fromJson(rawData); 0111 if (json.isObject()) { 0112 const auto person = Person::fromJSON(json.object()); 0113 items << person; 0114 } 0115 0116 d->people.currentProcessed(); 0117 d->processNextPerson(); 0118 0119 return items; 0120 } 0121 0122 } 0123 0124 #include "moc_personmodifyjob.cpp"