1 /*
2  * SPDX-FileCopyrightText: 2014 Daniel Vrátil <dvratil@redhat.com>
3  *
4  * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
5  */
6 
7 #include "comment.h"
8 
9 #include <QVariant>
10 #include <QJsonDocument>
11 #include <QUrlQuery>
12 
13 using namespace KGAPI2;
14 using namespace KGAPI2::Blogger;
15 
16 class Q_DECL_HIDDEN Comment::Private
17 {
18   public:
19     Private();
20 
21     static CommentPtr fromJSON(const QVariant &json);
22 
23     QString id;
24     QString postId;
25     QString blogId;
26     QDateTime published;
27     QDateTime updated;
28     QString content;
29     QString authorId;
30     QString authorName;
31     QUrl authorUrl;
32     QUrl authorImageUrl;
33     QString inReplyTo;
34     QString status;
35 };
36 
Private()37 Comment::Private::Private()
38 {
39 }
40 
Comment()41 Comment::Comment()
42     : Object()
43     , d(new Private)
44 {
45 }
46 
~Comment()47 Comment::~Comment()
48 {
49     delete d;
50 }
51 
id() const52 QString Comment::id() const
53 {
54     return d->id;
55 }
56 
setId(const QString & id)57 void Comment::setId(const QString &id)
58 {
59     d->id = id;
60 }
61 
postId() const62 QString Comment::postId() const
63 {
64     return d->postId;
65 }
66 
setPostId(const QString & postId)67 void Comment::setPostId(const QString &postId)
68 {
69     d->postId = postId;
70 }
71 
blogId() const72 QString Comment::blogId() const
73 {
74     return d->blogId;
75 }
76 
setBlogId(const QString & blogId)77 void Comment::setBlogId(const QString &blogId)
78 {
79     d->blogId = blogId;
80 }
81 
published() const82 QDateTime Comment::published() const
83 {
84     return d->published;
85 }
86 
setPublished(const QDateTime & published)87 void Comment::setPublished(const QDateTime &published)
88 {
89     d->published = published;
90 }
91 
updated() const92 QDateTime Comment::updated() const
93 {
94     return d->updated;
95 }
96 
setUpdated(const QDateTime & updated)97 void Comment::setUpdated(const QDateTime &updated)
98 {
99     d->updated = updated;
100 }
101 
content() const102 QString Comment::content() const
103 {
104     return d->content;
105 }
106 
setContent(const QString & content)107 void Comment::setContent(const QString &content)
108 {
109     d->content = content;
110 }
111 
authorId() const112 QString Comment::authorId() const
113 {
114     return d->authorId;
115 }
116 
setAuthorId(const QString & authorId)117 void Comment::setAuthorId(const QString &authorId)
118 {
119     d->authorId = authorId;
120 }
121 
authorName() const122 QString Comment::authorName() const
123 {
124     return d->authorName;
125 }
126 
setAuthorName(const QString & authorName)127 void Comment::setAuthorName(const QString &authorName)
128 {
129     d->authorName = authorName;
130 }
131 
authorUrl() const132 QUrl Comment::authorUrl() const
133 {
134     return d->authorUrl;
135 }
136 
setAuthorUrl(const QUrl & url)137 void Comment::setAuthorUrl(const QUrl &url)
138 {
139     d->authorUrl = url;
140 }
141 
authorImageUrl() const142 QUrl Comment::authorImageUrl() const
143 {
144     return d->authorImageUrl;
145 }
146 
setAuthorImageUrl(const QUrl & authorImageUrl)147 void Comment::setAuthorImageUrl(const QUrl &authorImageUrl)
148 {
149     d->authorImageUrl = authorImageUrl;
150 }
151 
inReplyTo() const152 QString Comment::inReplyTo() const
153 {
154     return d->inReplyTo;
155 }
156 
setInReplyTo(const QString & inReplyTo)157 void Comment::setInReplyTo(const QString &inReplyTo)
158 {
159     d->inReplyTo = inReplyTo;
160 }
161 
status() const162 QString Comment::status() const
163 {
164     return d->status;
165 }
166 
setStatus(const QString & status)167 void Comment::setStatus(const QString &status)
168 {
169     d->status = status;
170 }
171 
fromJSON(const QVariant & json)172 CommentPtr Comment::Private::fromJSON(const QVariant &json)
173 {
174     CommentPtr comment(new Comment);
175     const QVariantMap map = json.toMap();
176 
177     comment->d->id = map[QStringLiteral("id")].toString();
178     comment->d->postId = map[QStringLiteral("post")].toMap()[QStringLiteral("id")].toString();
179     comment->d->blogId = map[QStringLiteral("blog")].toMap()[QStringLiteral("id")].toString();
180     comment->d->published = QDateTime::fromString(map[QStringLiteral("published")].toString(), Qt::ISODate);
181     comment->d->updated = QDateTime::fromString(map[QStringLiteral("updated")].toString(), Qt::ISODate);
182     comment->d->content = map[QStringLiteral("content")].toString();
183     const QVariantMap author = map[QStringLiteral("author")].toMap();
184     comment->d->authorId = author[QStringLiteral("id")].toString();
185     comment->d->authorName = author[QStringLiteral("displayName")].toString();
186     comment->d->authorUrl = author[QStringLiteral("url")].toUrl();
187     comment->d->authorImageUrl = author[QStringLiteral("image")].toMap()[QStringLiteral("url")].toUrl();
188     comment->d->inReplyTo = map[QStringLiteral("inReplyTo")].toMap()[QStringLiteral("id")].toString();
189     comment->d->status = map[QStringLiteral("status")].toString();
190 
191     return comment;
192 }
193 
fromJSON(const QByteArray & rawData)194 CommentPtr Comment::fromJSON(const QByteArray &rawData)
195 {
196     QJsonDocument document = QJsonDocument::fromJson(rawData);
197     if (document.isNull()) {
198         return CommentPtr();
199     }
200     const QVariant json = document.toVariant();
201     const QVariantMap map = json.toMap();
202     if (map[QStringLiteral("kind")].toString() != QLatin1String("blogger#comment")) {
203         return CommentPtr();
204     }
205 
206     return Comment::Private::fromJSON(map);
207 }
208 
fromJSONFeed(const QByteArray & rawData,FeedData & feedData)209 ObjectsList Comment::fromJSONFeed(const QByteArray &rawData, FeedData &feedData)
210 {
211     QJsonDocument document = QJsonDocument::fromJson(rawData);
212     if (document.isNull()) {
213         return ObjectsList();
214     }
215     const QVariant json = document.toVariant();
216     const QVariantMap map = json.toMap();
217     if (map[QStringLiteral("kind")].toString() != QLatin1String("blogger#commentList")) {
218         return ObjectsList();
219     }
220 
221     ObjectsList items;
222     if (!map[QStringLiteral("nextPageToken")].toString().isEmpty()) {
223         feedData.nextPageUrl = feedData.requestUrl;
224         QUrlQuery query(feedData.nextPageUrl);
225         query.removeQueryItem(QStringLiteral("pageToken"));
226         query.addQueryItem(QStringLiteral("pageToken"), map[QStringLiteral("nextPageToken")].toString());
227         feedData.nextPageUrl.setQuery(query);
228     }
229     const QVariantList variantList = map[QStringLiteral("items")].toList();
230     items.reserve(variantList.size());
231     for (const QVariant &v : variantList) {
232         items << Comment::Private::fromJSON(v);
233     }
234 
235     return items;
236 }
237