cutelyst  3.7.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 <QtCore/QDateTime>
11 #include <QtCore/QLoggingCategory>
12 
13 #include <QRandomGenerator>
14 
15 using namespace Cutelyst;
16 
17 Q_LOGGING_CATEGORY(C_STATUSMESSAGE, "cutelyst.plugins.statusmessage", QtWarningMsg)
18 
19 static thread_local StatusMessage *m_instance = nullptr;
20 
21 namespace Cutelyst {
22 
24 {
25 public:
26  static void _q_postFork(Application *app);
27 
28  QString sessionPrefix = QStringLiteral("status_msg");
29  QString tokenParam = QStringLiteral("mid");
30  QString statusMsgStashKey = QStringLiteral("status_msg");
31  QString errorMsgStashKey = QStringLiteral("error_msg");
32 };
33 
34 void StatusMessagePrivate::_q_postFork(Application *app)
35 {
36  m_instance = app->plugin<StatusMessage *>();
37 }
38 
39 }
40 
41 StatusMessage::StatusMessage(Application *parent) : Plugin(parent), d_ptr(new StatusMessagePrivate)
42 {
43  m_instance = this;
44 }
45 
46 StatusMessage::~StatusMessage()
47 {
48  delete d_ptr;
49 }
50 
52 {
53  Q_D(const StatusMessage);
54  return d->sessionPrefix;
55 }
56 
57 void StatusMessage::setSessionPrefix(const QString &sessionPrefix)
58 {
59  Q_D(StatusMessage);
60  d->sessionPrefix = sessionPrefix;
61 }
62 
64 {
65  Q_D(const StatusMessage);
66  return d->tokenParam;
67 }
68 
69 void StatusMessage::setTokenParam(const QString &tokenParam)
70 {
71  Q_D(StatusMessage);
72  d->tokenParam = tokenParam;
73 }
74 
76 {
77  Q_D(const StatusMessage);
78  return d->statusMsgStashKey;
79 }
80 
81 void StatusMessage::setStatusMsgStashKey(const QString &statusMsgStashKey)
82 {
83  Q_D(StatusMessage);
84  d->statusMsgStashKey = statusMsgStashKey;
85 }
86 
88 {
89  Q_D(const StatusMessage);
90  return d->errorMsgStashKey;
91 }
92 
93 void StatusMessage::setErrorMgStashKey(const QString &errorMgStashKey)
94 {
95  Q_D(StatusMessage);
96  d->errorMsgStashKey = errorMgStashKey;
97 }
98 
100 {
101  if (Q_UNLIKELY(!m_instance)) {
102  qCCritical(C_STATUSMESSAGE, "StatusMessage plugin not registered");
103  return;
104  }
105  StatusMessagePrivate *priv = m_instance->d_ptr;
106 
107  const QString token = c->request()->queryParam(priv->tokenParam);
108  if (token.isEmpty()) {
109  return;
110  }
111 
112  QStringList deleteKeys;
113  const QString statusKey = priv->sessionPrefix + QLatin1String("status") + token;
114  const QVariant statusValue = Session::value(c, statusKey);
115  if (!statusValue.isNull()) {
116  deleteKeys.append(statusKey);
117  c->setStash(priv->statusMsgStashKey, statusValue);
118  }
119 
120  const QString errorKey = priv->sessionPrefix + QLatin1String("error") + token;
121  const QVariant errorValue = Session::value(c, errorKey);
122  if (!errorValue.isNull()) {
123  deleteKeys.append(errorKey);
124  c->setStash(priv->errorMsgStashKey, errorValue);
125  }
126 
127  if (!deleteKeys.isEmpty()) {
128  Session::deleteValues(c, deleteKeys);
129  }
130 }
131 
132 inline QString createToken()
133 {
134  return QString::number(QRandomGenerator::global()->generate() % 99999999).rightJustified(8, u'0', true);
135 }
136 
137 QString StatusMessage::error(Context *c, const QString &msg)
138 {
139  QString token;
140  if (Q_UNLIKELY(!m_instance)) {
141  qCCritical(C_STATUSMESSAGE, "StatusMessage plugin not registered");
142  return token;
143  }
144 
145  token = createToken();
146  Session::setValue(c, m_instance->d_ptr->sessionPrefix + QLatin1String("error") + token, msg);
147  return token;
148 }
149 
151 {
152  ParamsMultiMap map(query);
153  if (Q_UNLIKELY(!m_instance)) {
154  qCCritical(C_STATUSMESSAGE, "StatusMessage plugin not registered");
155  return map;
156  }
157  StatusMessagePrivate *priv = m_instance->d_ptr;
158 
159  const QString token = createToken();
160  Session::setValue(c, priv->sessionPrefix + QLatin1String("error") + token, msg);
161  map.insert(priv->tokenParam, token);
162  return map;
163 }
164 
165 QString StatusMessage::status(Context *c, const QString &msg)
166 {
167  QString token;
168  if (Q_UNLIKELY(!m_instance)) {
169  qCCritical(C_STATUSMESSAGE, "StatusMessage plugin not registered");
170  return token;
171  }
172 
173  token = createToken();
174  Session::setValue(c, m_instance->d_ptr->sessionPrefix + QLatin1String("status") + token, msg);
175  return token;
176 }
177 
179 {
180  ParamsMultiMap map(query);
181  if (Q_UNLIKELY(!m_instance)) {
182  qCCritical(C_STATUSMESSAGE, "StatusMessage plugin not registered");
183  return map;
184  }
185  StatusMessagePrivate *priv = m_instance->d_ptr;
186 
187  const QString token = createToken();
188  Session::setValue(c, priv->sessionPrefix + QLatin1String("status") + token, msg);
189  map.insert(priv->tokenParam, token);
190  return map;
191 }
192 
194 {
195  connect(app, &Application::postForked, this, &StatusMessagePrivate::_q_postFork);
196  return true;
197 }
198 
199 #include "moc_statusmessage.cpp"
The Cutelyst Application.
Definition: application.h:43
T plugin()
Returns the registered plugin that casts to the template type T.
Definition: application.h:107
void postForked(Cutelyst::Application *app)
The Cutelyst Context.
Definition: context.h:39
void setStash(const QString &key, const QVariant &value)
Definition: context.cpp:218
QString queryParam(const QString &key, const QString &defaultValue={}) const
Definition: request.h:542
static QVariant value(Context *c, const QString &key, const QVariant &defaultValue=QVariant())
Definition: session.cpp:150
static void setValue(Context *c, const QString &key, const QVariant &value)
Definition: session.cpp:165
static void deleteValues(Context *c, const QStringList &keys)
Definition: session.cpp:211
static ParamsMultiMap errorQuery(Context *c, const QString &msg, ParamsMultiMap query=ParamsMultiMap())
static QString error(Context *c, const QString &msg)
QString tokenParam() const
static void load(Context *c)
QString sessionPrefix() const
QString errorMgStashKey() const
void setTokenParam(const QString &tokenParam)
virtual bool setup(Application *app) override
static QString status(Context *c, const QString &msg)
void setErrorMgStashKey(const QString &errorMgStashKey)
QString statusMsgStashKey() const
void setStatusMsgStashKey(const QString &statusMsgStashKey)
void setSessionPrefix(const QString &sessionPrefix)
static ParamsMultiMap statusQuery(Context *c, const QString &msg, ParamsMultiMap query=ParamsMultiMap())
The Cutelyst namespace holds all public Cutelyst API.
Definition: Mainpage.dox:8
QMultiMap< QString, QString > ParamsMultiMap