File indexing completed on 2024-05-12 05:22:26

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