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 "personcreatejob.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 #include <KContacts/Picture>
0023 
0024 namespace KGAPI2::People
0025 {
0026 
0027 class Q_DECL_HIDDEN PersonCreateJob::Private
0028 {
0029 public:
0030     explicit Private(PersonCreateJob *parent);
0031     void processNextPerson();
0032 
0033     QueueHelper<PersonPtr> people;
0034 
0035 private:
0036     PersonCreateJob * const q;
0037 };
0038 
0039 PersonCreateJob::Private::Private(PersonCreateJob *parent)
0040     : q(parent)
0041 {
0042 }
0043 
0044 void PersonCreateJob::Private::processNextPerson()
0045 {
0046     if (people.atEnd()) {
0047         q->emitFinished();
0048         return;
0049     }
0050 
0051     const auto person = people.current();
0052     static const auto createUrl = PeopleService::createContactUrl();
0053     QNetworkRequest request(createUrl);
0054     request.setRawHeader("Host", "people.googleapis.com");
0055 
0056     const auto personJson = QJsonDocument(person->toJSON().toObject());
0057     const auto rawData = personJson.toJson();
0058     q->enqueueRequest(request, rawData, QStringLiteral("application/json"));
0059 }
0060 
0061 PersonCreateJob::PersonCreateJob(const PersonList &people, const AccountPtr &account, QObject* parent)
0062     : CreateJob(account, parent)
0063     , d(std::make_unique<Private>(this))
0064 {
0065     d->people = people;
0066 }
0067 
0068 PersonCreateJob::PersonCreateJob(const PersonPtr &person, const AccountPtr &account, QObject* parent)
0069     : CreateJob(account, parent)
0070     , d(std::make_unique<Private>(this))
0071 {
0072     d->people << person;
0073 }
0074 
0075 PersonCreateJob::~PersonCreateJob() = default;
0076 
0077 void PersonCreateJob::start()
0078 {
0079     d->processNextPerson();
0080 }
0081 
0082 ObjectsList PersonCreateJob::handleReplyWithItems(const QNetworkReply *reply, const QByteArray &rawData)
0083 {
0084     const auto contentTypeString = reply->header(QNetworkRequest::ContentTypeHeader).toString();
0085     const auto contentType = Utils::stringToContentType(contentTypeString);
0086 
0087     if (contentType != KGAPI2::JSON) {
0088         setError(KGAPI2::InvalidResponse);
0089         setErrorString(tr("Invalid response content type"));
0090         emitFinished();
0091         return {};
0092     }
0093 
0094     ObjectsList items;
0095     const auto json = QJsonDocument::fromJson(rawData);
0096     if (json.isObject()) {
0097         const auto person = Person::fromJSON(json.object());
0098         items << person;
0099     }
0100 
0101     d->people.currentProcessed();
0102     d->processNextPerson();
0103 
0104     return items;
0105 }
0106 
0107 }
0108 
0109 #include "moc_personcreatejob.cpp"