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

0001 /*
0002  * SPDX-FileCopyrightText: 2014 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 "page.h"
0008 
0009 #include <QJsonDocument>
0010 #include <QVariant>
0011 
0012 using namespace KGAPI2;
0013 using namespace KGAPI2::Blogger;
0014 
0015 class Q_DECL_HIDDEN Page::Private
0016 {
0017 public:
0018     Private();
0019     ~Private();
0020 
0021     static PagePtr fromJSON(const QVariant &json);
0022     static QVariant toJSON(const PagePtr &page);
0023 
0024     QString id;
0025     QString blogId;
0026     QDateTime published;
0027     QDateTime updated;
0028     QUrl url;
0029     QString title;
0030     QString content;
0031     QString authorId;
0032     QString authorName;
0033     QUrl authorUrl;
0034     QUrl authorImageUrl;
0035     Status status;
0036 };
0037 
0038 Page::Private::Private()
0039     : status(Page::UnknownStatus)
0040 {
0041 }
0042 
0043 Page::Private::~Private()
0044 {
0045 }
0046 
0047 Page::Page()
0048     : Object()
0049     , d(new Private)
0050 {
0051 }
0052 
0053 Page::~Page()
0054 {
0055     delete d;
0056 }
0057 
0058 QString Page::id() const
0059 {
0060     return d->id;
0061 }
0062 
0063 void Page::setId(const QString &id)
0064 {
0065     d->id = id;
0066 }
0067 
0068 QString Page::blogId() const
0069 {
0070     return d->blogId;
0071 }
0072 
0073 void Page::setBlogId(const QString &blogId)
0074 {
0075     d->blogId = blogId;
0076 }
0077 
0078 QDateTime Page::published() const
0079 {
0080     return d->published;
0081 }
0082 
0083 void Page::setPublished(const QDateTime &published)
0084 {
0085     d->published = published;
0086 }
0087 
0088 QDateTime Page::updated() const
0089 {
0090     return d->updated;
0091 }
0092 
0093 void Page::setUpdated(const QDateTime &updated)
0094 {
0095     d->updated = updated;
0096 }
0097 
0098 QUrl Page::url() const
0099 {
0100     return d->url;
0101 }
0102 
0103 void Page::setUrl(const QUrl &url)
0104 {
0105     d->url = url;
0106 }
0107 
0108 QString Page::title() const
0109 {
0110     return d->title;
0111 }
0112 
0113 void Page::setTitle(const QString &title)
0114 {
0115     d->title = title;
0116 }
0117 
0118 QString Page::content() const
0119 {
0120     return d->content;
0121 }
0122 
0123 void Page::setContent(const QString &content)
0124 {
0125     d->content = content;
0126 }
0127 
0128 QString Page::authorId() const
0129 {
0130     return d->authorId;
0131 }
0132 
0133 QString Page::authorName() const
0134 {
0135     return d->authorName;
0136 }
0137 
0138 QUrl Page::authorUrl() const
0139 {
0140     return d->authorUrl;
0141 }
0142 
0143 QUrl Page::authorImageUrl() const
0144 {
0145     return d->authorImageUrl;
0146 }
0147 
0148 Page::Status Page::status() const
0149 {
0150     return d->status;
0151 }
0152 
0153 void Page::setStatus(Page::Status status)
0154 {
0155     d->status = status;
0156 }
0157 
0158 PagePtr Page::Private::fromJSON(const QVariant &json)
0159 {
0160     PagePtr page(new Page);
0161     const QVariantMap map = json.toMap();
0162 
0163     page->d->id = map[QStringLiteral("id")].toString();
0164     page->d->blogId = map[QStringLiteral("blog")].toMap()[QStringLiteral("id")].toString();
0165     page->d->published = QDateTime::fromString(map[QStringLiteral("published")].toString(), Qt::ISODate);
0166     page->d->updated = QDateTime::fromString(map[QStringLiteral("updated")].toString(), Qt::ISODate);
0167     page->d->url = map[QStringLiteral("url")].toUrl();
0168     page->d->title = map[QStringLiteral("title")].toString();
0169     page->d->content = map[QStringLiteral("content")].toString();
0170     const QVariantMap author = map[QStringLiteral("author")].toMap();
0171     page->d->authorId = author[QStringLiteral("id")].toString();
0172     page->d->authorName = author[QStringLiteral("displayName")].toString();
0173     page->d->authorUrl = author[QStringLiteral("url")].toUrl();
0174     page->d->authorImageUrl = author[QStringLiteral("image")].toMap()[QStringLiteral("url")].toUrl();
0175 
0176     const QString status = map[QStringLiteral("status")].toString();
0177     if (status == QLatin1StringView("LIVE")) {
0178         page->d->status = Live;
0179     } else if (status == QLatin1StringView("DRAFT")) {
0180         page->d->status = Draft;
0181     } else if (status == QLatin1StringView("IMPORTED")) {
0182         page->d->status = Imported;
0183     } else {
0184         page->d->status = UnknownStatus;
0185     }
0186 
0187     return page;
0188 }
0189 
0190 QVariant Page::Private::toJSON(const PagePtr &page)
0191 {
0192     QVariantMap map;
0193     map[QStringLiteral("kind")] = QLatin1StringView("blogger#page");
0194 
0195     if (!page->d->id.isEmpty()) {
0196         map[QStringLiteral("id")] = page->d->id;
0197     }
0198     map[QStringLiteral("blogId")] = page->d->blogId;
0199     if (page->d->published.isValid()) {
0200         map[QStringLiteral("published")] = page->d->published.toString(Qt::ISODate);
0201     }
0202     if (page->d->updated.isValid()) {
0203         map[QStringLiteral("updated")] = page->d->updated.toString(Qt::ISODate);
0204     }
0205     map[QStringLiteral("url")] = page->d->url.toString();
0206     map[QStringLiteral("title")] = page->d->title;
0207     map[QStringLiteral("content")] = page->d->content;
0208     switch (page->d->status) {
0209     case Blogger::Page::Draft:
0210         map[QStringLiteral("status")] = QLatin1StringView("DRAFT");
0211         break;
0212     case Blogger::Page::Live:
0213         map[QStringLiteral("status")] = QLatin1StringView("LIVE");
0214         break;
0215     default:
0216         break; // not supported for writing
0217     }
0218 
0219     return map;
0220 }
0221 
0222 PagePtr Page::fromJSON(const QByteArray &rawData)
0223 {
0224     QJsonDocument document = QJsonDocument::fromJson(rawData);
0225     if (document.isNull()) {
0226         return PagePtr();
0227     }
0228 
0229     const QVariant json = document.toVariant();
0230     const QVariantMap map = json.toMap();
0231     if (map[QStringLiteral("kind")].toString() != QLatin1StringView("blogger#page")) {
0232         return PagePtr();
0233     }
0234 
0235     return Private::fromJSON(map);
0236 }
0237 
0238 ObjectsList Page::fromJSONFeed(const QByteArray &rawData)
0239 {
0240     QJsonDocument document = QJsonDocument::fromJson(rawData);
0241     if (document.isNull()) {
0242         return ObjectsList();
0243     }
0244     const QVariant json = document.toVariant();
0245     const QVariantMap map = json.toMap();
0246     if (map[QStringLiteral("kind")].toString() != QLatin1StringView("blogger#pageList")) {
0247         return ObjectsList();
0248     }
0249 
0250     ObjectsList list;
0251     const QVariantList variantList = map[QStringLiteral("items")].toList();
0252     list.reserve(variantList.size());
0253     for (const QVariant &item : variantList) {
0254         list << Private::fromJSON(item);
0255     }
0256     return list;
0257 }
0258 
0259 QByteArray Page::toJSON(const PagePtr &page)
0260 {
0261     QJsonDocument document = QJsonDocument::fromVariant(Private::toJSON(page));
0262     return document.toJson(QJsonDocument::Compact);
0263 }