cutelyst  5.0.1
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 
13 using namespace Cutelyst;
14 using namespace Qt::Literals::StringLiterals;
15 
16 ViewJson::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 
73 void 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:
95  obj = QJsonObject::fromVariantHash(stash);
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  }
117  case RegularExpression:
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"
Request request
Definition: context.h:72
void setXJsonHeader(bool enable)
Definition: viewjson.cpp:73
QByteArray toJson(JsonFormat format) const const
ViewJson(QObject *parent, const QString &name={})
Definition: viewjson.cpp:16
QJsonObject fromVariantHash(const QVariantHash &hash)
void setContentType(const QByteArray &type)
Definition: response.h:230
QJsonValue fromVariant(const QVariant &variant)
A Cutelyst response.
Definition: response.h:28
void setExposeStash(const QString &key)
Definition: viewjson.cpp:52
The Cutelyst Context.
Definition: context.h:42
JsonFormat outputFormat() const
Definition: viewjson.cpp:21
void stash(const QVariantHash &unite)
Definition: context.cpp:562
Headers headers() const noexcept
Definition: request.cpp:312
bool xJsonHeader() const
Definition: viewjson.cpp:79
iterator insert(QLatin1StringView key, const QJsonValue &value)
void setOutputFormat(JsonFormat format)
Definition: viewjson.cpp:34
bool hasMatch() const const
bool contains(QAnyStringView key) const noexcept
Definition: headers.cpp:506
The Cutelyst namespace holds all public Cutelyst API.
A view that returns stash data in JSON format.
Definition: viewjson.h:25
QRegularExpressionMatch match(QStringView subjectView, qsizetype offset, MatchType matchType, MatchOptions matchOptions) const const
QByteArray render(Context *c) const final
Definition: viewjson.cpp:85
Abstract View component for Cutelyst.
Definition: view.h:24
ExposeMode exposeStashMode() const
Definition: viewjson.cpp:46
Response * response() const noexcept
Definition: context.cpp:98
void setHeader(const QByteArray &key, const QByteArray &value)