cutelyst 5.0.0
A C++ Web Framework built on top of Qt, using the simple approach of Catalyst (Perl) framework.
viewjson.cpp
1/*
2 * SPDX-FileCopyrightText: (C) 2015-2022 Daniel Nicoletti <dantti12@gmail.com>
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5#include "viewjson_p.h"
6
7#include <Cutelyst/context.h>
8#include <Cutelyst/response.h>
9
10#include <QtCore/QJsonDocument>
11#include <QtCore/QJsonObject>
12
13using namespace Cutelyst;
14using namespace Qt::Literals::StringLiterals;
15
16ViewJson::ViewJson(QObject *parent, const QString &name)
17 : View(new ViewJsonPrivate, parent, name)
18{
19}
20
22{
23 Q_D(const ViewJson);
24 switch (d->format) {
26 return Indented;
27 break;
29 return Compact;
30 }
31 return Compact;
32}
33
35{
36 Q_D(ViewJson);
37 switch (format) {
38 case Indented:
39 d->format = QJsonDocument::Indented;
40 break;
41 case Compact:
42 d->format = QJsonDocument::Compact;
43 }
44}
45
47{
48 Q_D(const ViewJson);
49 return d->exposeMode;
50}
51
53{
54 Q_D(ViewJson);
55 d->exposeMode = ViewJson::String;
56 d->exposeKey = key;
57}
58
60{
61 Q_D(ViewJson);
62 d->exposeMode = ViewJson::StringList;
63 d->exposeKeys = keys;
64}
65
67{
68 Q_D(ViewJson);
69 d->exposeMode = ViewJson::RegularExpression;
70 d->exposeRE = re;
71}
72
73void ViewJson::setXJsonHeader(bool enable)
74{
75 Q_D(ViewJson);
76 d->xJsonHeader = enable;
77}
78
80{
81 Q_D(const ViewJson);
82 return d->xJsonHeader;
83}
84
86{
87 Q_D(const ViewJson);
88
89 QJsonObject obj;
90
91 const QVariantHash stash = c->stash();
92
93 switch (d->exposeMode) {
94 case All:
96 break;
97 case String:
98 {
99 auto it = stash.constFind(d->exposeKey);
100 if (it != stash.constEnd()) {
101 obj.insert(d->exposeKey, QJsonValue::fromVariant(it.value()));
102 }
103 break;
104 }
105 case StringList:
106 {
107 QVariantHash exposedStash;
108 for (const auto &[key, value] : stash.asKeyValueRange()) {
109 if (d->exposeKeys.contains(key)) {
110 exposedStash.insert(key, value);
111 }
112 }
113
114 obj = QJsonObject::fromVariantHash(exposedStash);
115 break;
116 }
118 {
119 QRegularExpression re = d->exposeRE; // thread safety
120
121 QVariantHash exposedStash;
122 for (const auto &[key, value] : stash.asKeyValueRange()) {
123 if (re.match(key).hasMatch()) {
124 exposedStash.insert(key, value);
125 }
126 }
127
128 obj = QJsonObject::fromVariantHash(exposedStash);
129 break;
130 }
131 }
132
133 Response *res = c->response();
134 if (d->xJsonHeader && c->request()->headers().contains("X-Prototype-Version")) {
135 res->setHeader("X-Json"_ba, "eval(\"(\"+this.transport.responseText+\")\")"_ba);
136 }
137
138 res->setContentType("application/json"_ba);
139
140 return QJsonDocument(obj).toJson(d->format);
141}
142
143#include "moc_viewjson.cpp"
The Cutelyst Context.
Definition context.h:42
void stash(const QVariantHash &unite)
Definition context.cpp:563
Request * request
Definition context.h:71
Response * response() const noexcept
Definition context.cpp:98
bool contains(QAnyStringView key) const noexcept
Definition headers.cpp:481
Headers headers() const noexcept
Definition request.cpp:313
A Cutelyst response.
Definition response.h:29
void setContentType(const QByteArray &type)
Definition response.h:230
void setHeader(const QByteArray &key, const QByteArray &value)
A view that returns stash data in JSON format.
Definition viewjson.h:26
ViewJson(QObject *parent, const QString &name={})
Definition viewjson.cpp:16
void setOutputFormat(JsonFormat format)
Definition viewjson.cpp:34
void setExposeStash(const QString &key)
Definition viewjson.cpp:52
bool xJsonHeader() const
Definition viewjson.cpp:79
JsonFormat outputFormat() const
Definition viewjson.cpp:21
QByteArray render(Context *c) const final
Definition viewjson.cpp:85
ExposeMode exposeStashMode() const
Definition viewjson.cpp:46
void setXJsonHeader(bool enable)
Definition viewjson.cpp:73
Abstract View component for Cutelyst.
Definition view.h:25
The Cutelyst namespace holds all public Cutelyst API.
QByteArray toJson(QJsonDocument::JsonFormat format) const const
QJsonObject fromVariantHash(const QVariantHash &hash)
QJsonObject::iterator insert(QLatin1StringView key, const QJsonValue &value)
QJsonValue fromVariant(const QVariant &variant)
QRegularExpressionMatch match(QStringView subjectView, qsizetype offset, QRegularExpression::MatchType matchType, QRegularExpression::MatchOptions matchOptions) const const
bool hasMatch() const const