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"