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

0001 /*
0002  * SPDX-FileCopyrightText: 2015 Daniel Vrátil <dvratil@redhat.com>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005  */
0006 
0007 #include "freebusyqueryjob.h"
0008 #include "calendarservice.h"
0009 #include "utils.h"
0010 
0011 #include <QJsonDocument>
0012 #include <QNetworkAccessManager>
0013 #include <QNetworkReply>
0014 #include <QNetworkRequest>
0015 #include <QVariantMap>
0016 
0017 using namespace KGAPI2;
0018 
0019 class Q_DECL_HIDDEN FreeBusyQueryJob::Private
0020 {
0021 public:
0022     Private(const QString &id, const QDateTime &timeMin, const QDateTime &timeMax)
0023         : id(id)
0024         , timeMin(timeMin)
0025         , timeMax(timeMax)
0026     {
0027     }
0028 
0029     const QString id;
0030     const QDateTime timeMin;
0031     const QDateTime timeMax;
0032     FreeBusyQueryJob::BusyRangeList busy;
0033 };
0034 
0035 FreeBusyQueryJob::FreeBusyQueryJob(const QString &id, const QDateTime &timeMin, const QDateTime &timeMax, const AccountPtr &account, QObject *parent)
0036     : FetchJob(account, parent)
0037     , d(new FreeBusyQueryJob::Private(id, timeMin, timeMax))
0038 {
0039 }
0040 
0041 FreeBusyQueryJob::~FreeBusyQueryJob() = default;
0042 
0043 FreeBusyQueryJob::BusyRangeList FreeBusyQueryJob::busy() const
0044 {
0045     return d->busy;
0046 }
0047 
0048 QString FreeBusyQueryJob::id() const
0049 {
0050     return d->id;
0051 }
0052 
0053 QDateTime FreeBusyQueryJob::timeMin() const
0054 {
0055     return d->timeMin;
0056 }
0057 
0058 QDateTime FreeBusyQueryJob::timeMax() const
0059 {
0060     return d->timeMax;
0061 }
0062 
0063 void FreeBusyQueryJob::start()
0064 {
0065     QVariantMap requestData({{QStringLiteral("timeMin"), Utils::rfc3339DateToString(d->timeMin)},
0066                              {QStringLiteral("timeMax"), Utils::rfc3339DateToString(d->timeMax)},
0067                              {QStringLiteral("items"), QVariantList({QVariantMap({{QStringLiteral("id"), d->id}})})}});
0068     QJsonDocument document = QJsonDocument::fromVariant(requestData);
0069     const QByteArray json = document.toJson(QJsonDocument::Compact);
0070 
0071     const auto request = CalendarService::prepareRequest(CalendarService::freeBusyQueryUrl());
0072     enqueueRequest(request, json, QStringLiteral("application/json"));
0073 }
0074 
0075 void FreeBusyQueryJob::dispatchRequest(QNetworkAccessManager *accessManager, const QNetworkRequest &request, const QByteArray &data, const QString &contentType)
0076 {
0077     QNetworkRequest r = request;
0078     if (!r.hasRawHeader("Content-Type")) {
0079         r.setHeader(QNetworkRequest::ContentTypeHeader, contentType);
0080     }
0081 
0082     accessManager->post(r, data);
0083 }
0084 
0085 void FreeBusyQueryJob::handleReply(const QNetworkReply *reply, const QByteArray &rawData)
0086 {
0087     const QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString();
0088     ContentType ct = Utils::stringToContentType(contentType);
0089     if (ct == KGAPI2::JSON) {
0090         const QJsonDocument document = QJsonDocument::fromJson(rawData);
0091         const QVariantMap data = document.toVariant().toMap();
0092         const QVariantMap cals = data[QStringLiteral("calendars")].toMap();
0093         const QVariantMap cal = cals[d->id].toMap();
0094         if (cal.contains(QStringLiteral("errors"))) {
0095             setError(KGAPI2::NotFound);
0096             setErrorString(tr("FreeBusy information is not available"));
0097         } else {
0098             const QVariantList busyList = cal[QStringLiteral("busy")].toList();
0099             for (const QVariant &busyV : busyList) {
0100                 const QVariantMap busy = busyV.toMap();
0101                 d->busy << BusyRange{Utils::rfc3339DateFromString(busy[QStringLiteral("start")].toString()),
0102                                      Utils::rfc3339DateFromString(busy[QStringLiteral("end")].toString())};
0103             }
0104         }
0105     } else {
0106         setError(KGAPI2::InvalidResponse);
0107         setErrorString(tr("Invalid response content type"));
0108     }
0109 
0110     emitFinished();
0111 }