cutelyst 5.0.0
A C++ Web Framework built on top of Qt, using the simple approach of Catalyst (Perl) framework.
statusmessage.cpp
1/*
2 * SPDX-FileCopyrightText: (C) 2016-2022 Daniel Nicoletti <dantti12@gmail.com>
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5#include "statusmessage.h"
6
7#include <Cutelyst/Application>
8#include <Cutelyst/Plugins/Session/session.h>
9
10#include <QRandomGenerator>
11#include <QtCore/QDateTime>
12#include <QtCore/QLoggingCategory>
13
14using namespace Cutelyst;
15
16Q_LOGGING_CATEGORY(C_STATUSMESSAGE, "cutelyst.plugins.statusmessage", QtWarningMsg)
17
18namespace {
19thread_local StatusMessage *m_instance = nullptr;
20} // namespace
21
22namespace Cutelyst {
23
25{
26public:
27 static void _q_postFork(Application *app);
28
29 QString sessionPrefix = QStringLiteral("status_msg");
30 QString tokenParam = QStringLiteral("mid");
31 QString statusMsgStashKey = QStringLiteral("status_msg");
32 QString errorMsgStashKey = QStringLiteral("error_msg");
33};
34
35void StatusMessagePrivate::_q_postFork(Application *app)
36{
37 m_instance = app->plugin<StatusMessage *>();
38}
39
40} // namespace Cutelyst
41
43 : Plugin(parent)
44 , d_ptr(new StatusMessagePrivate)
45{
46 m_instance = this;
47}
48
50{
51 delete d_ptr;
52}
53
55{
56 Q_D(const StatusMessage);
57 return d->sessionPrefix;
58}
59
60void StatusMessage::setSessionPrefix(const QString &sessionPrefix)
61{
62 Q_D(StatusMessage);
63 d->sessionPrefix = sessionPrefix;
64}
65
67{
68 Q_D(const StatusMessage);
69 return d->tokenParam;
70}
71
73{
74 Q_D(StatusMessage);
75 d->tokenParam = tokenParam;
76}
77
79{
80 Q_D(const StatusMessage);
81 return d->statusMsgStashKey;
82}
83
84void StatusMessage::setStatusMsgStashKey(const QString &statusMsgStashKey)
85{
86 Q_D(StatusMessage);
87 d->statusMsgStashKey = statusMsgStashKey;
88}
89
91{
92 Q_D(const StatusMessage);
93 return d->errorMsgStashKey;
94}
95
96void StatusMessage::setErrorMgStashKey(const QString &errorMgStashKey)
97{
98 Q_D(StatusMessage);
99 d->errorMsgStashKey = errorMgStashKey;
100}
101
103{
104 if (Q_UNLIKELY(!m_instance)) {
105 qCCritical(C_STATUSMESSAGE, "StatusMessage plugin not registered");
106 return;
107 }
108 StatusMessagePrivate *priv = m_instance->d_ptr;
109
110 const QString token = c->request()->queryParam(priv->tokenParam);
111 if (token.isEmpty()) {
112 return;
113 }
114
115 QStringList deleteKeys;
116 const QString statusKey = priv->sessionPrefix + u"status" + token;
117 const QVariant statusValue = Session::value(c, statusKey);
118 if (!statusValue.isNull()) {
119 deleteKeys.append(statusKey);
120 c->setStash(priv->statusMsgStashKey, statusValue);
121 }
122
123 const QString errorKey = priv->sessionPrefix + u"error" + token;
124 const QVariant errorValue = Session::value(c, errorKey);
125 if (!errorValue.isNull()) {
126 deleteKeys.append(errorKey);
127 c->setStash(priv->errorMsgStashKey, errorValue);
128 }
129
130 if (!deleteKeys.isEmpty()) {
131 Session::deleteValues(c, deleteKeys);
132 }
133}
134
135inline QString createToken()
136{
137 return QString::number(QRandomGenerator::global()->generate() % 99999999)
138 .rightJustified(8, u'0', true);
139}
140
142{
143 QString token;
144 if (Q_UNLIKELY(!m_instance)) {
145 qCCritical(C_STATUSMESSAGE, "StatusMessage plugin not registered");
146 return token;
147 }
148
149 token = createToken();
150 Session::setValue(c, m_instance->d_ptr->sessionPrefix + u"error" + token, msg);
151 return token;
152}
153
155{
156 ParamsMultiMap map(query);
157 if (Q_UNLIKELY(!m_instance)) {
158 qCCritical(C_STATUSMESSAGE, "StatusMessage plugin not registered");
159 return map;
160 }
161 StatusMessagePrivate *priv = m_instance->d_ptr;
162
163 const QString token = createToken();
164 Session::setValue(c, priv->sessionPrefix + u"error" + token, msg);
165 map.insert(priv->tokenParam, token);
166 return map;
167}
168
170{
171 QString token;
172 if (Q_UNLIKELY(!m_instance)) {
173 qCCritical(C_STATUSMESSAGE, "StatusMessage plugin not registered");
174 return token;
175 }
176
177 token = createToken();
178 Session::setValue(c, m_instance->d_ptr->sessionPrefix + u"status" + token, msg);
179 return token;
180}
181
183{
184 ParamsMultiMap map(query);
185 if (Q_UNLIKELY(!m_instance)) {
186 qCCritical(C_STATUSMESSAGE, "StatusMessage plugin not registered");
187 return map;
188 }
189 StatusMessagePrivate *priv = m_instance->d_ptr;
190
191 const QString token = createToken();
192 Session::setValue(c, priv->sessionPrefix + u"status" + token, msg);
193 map.insert(priv->tokenParam, token);
194 return map;
195}
196
198{
199 connect(app, &Application::postForked, this, &StatusMessagePrivate::_q_postFork);
200 return true;
201}
202
203#include "moc_statusmessage.cpp"
The Cutelyst application.
Definition application.h:66
void postForked(Cutelyst::Application *app)
The Cutelyst Context.
Definition context.h:42
Request * request
Definition context.h:71
void setStash(const QString &key, const QVariant &value)
Definition context.cpp:213
Base class for Cutelyst Plugins.
Definition plugin.h:25
QString queryParam(const QString &key, const QString &defaultValue={}) const
Definition request.h:591
static QVariant value(Context *c, const QString &key, const QVariant &defaultValue=QVariant())
Definition session.cpp:171
static void setValue(Context *c, const QString &key, const QVariant &value)
Definition session.cpp:186
static void deleteValues(Context *c, const QStringList &keys)
Definition session.cpp:234
Manage status messages over multiple requests stored in the Session.
static QString error(Context *c, const QString &msg)
static void load(Context *c)
QString errorMgStashKey() const noexcept
void setTokenParam(const QString &tokenParam)
QString statusMsgStashKey() const noexcept
virtual bool setup(Application *app) override
static QString status(Context *c, const QString &msg)
static ParamsMultiMap statusQuery(Context *c, const QString &msg, ParamsMultiMap query={})
void setErrorMgStashKey(const QString &errorMgStashKey)
StatusMessage(Application *parent)
QString sessionPrefix() const noexcept
void setStatusMsgStashKey(const QString &statusMsgStashKey)
QString tokenParam() const noexcept
void setSessionPrefix(const QString &sessionPrefix)
virtual ~StatusMessage() override
static ParamsMultiMap errorQuery(Context *c, const QString &msg, ParamsMultiMap query={})
The Cutelyst namespace holds all public Cutelyst API.
void append(QList::parameter_type value)
bool isEmpty() const const
QMultiMap::iterator insert(QMultiMap::const_iterator pos, const Key &key, const T &value)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QRandomGenerator * global()
bool isEmpty() const const
QString number(double n, char format, int precision)
QString rightJustified(qsizetype width, QChar fill, bool truncate) const const
bool isNull() const const