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"