cutelyst 4.8.0
A C++ Web Framework built on top of Qt, using the simple approach of Catalyst (Perl) framework.
validator.cpp
1/*
2 * SPDX-FileCopyrightText: (C) 2017-2023 Matthias Fehring <mf@huessenbergnetz.de>
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5
6#include "validator_p.h"
7
8#include <Cutelyst/application.h>
9#include <Cutelyst/context.h>
10#include <Cutelyst/request.h>
11
12#include <QLoggingCategory>
13
14using namespace Cutelyst;
15using namespace Qt::Literals::StringLiterals;
16
17Q_LOGGING_CATEGORY(C_VALIDATOR, "cutelyst.utils.validator", QtWarningMsg)
18
19Validator::Validator(const char *translationContext)
20 : d_ptr(new ValidatorPrivate(translationContext))
21{
22}
23
24Validator::Validator(std::initializer_list<ValidatorRule *> validators,
25 const char *translationContext)
26 : d_ptr(new ValidatorPrivate(validators, translationContext))
27{
28}
29
30Validator::~Validator() = default;
31
33{
34 Q_D(Validator);
35 d->params.clear();
36 if (!d->validators.empty()) {
37 qDeleteAll(d->validators.begin(), d->validators.end());
38 d->validators.clear();
39 }
40}
41
43{
44 ValidatorResult result;
45
46 Q_ASSERT(c);
47
48 ParamsMultiMap params;
49 if (flags.testFlag(BodyParamsOnly)) {
50 params = c->req()->bodyParameters();
51 } else if (flags.testFlag(QueryParamsOnly)) {
52 params = c->req()->queryParameters();
53 } else {
54 params = c->req()->queryParameters();
55 params.unite(c->req()->bodyParameters());
56 }
57
58 result = validate(c, params, flags);
59
60 return result;
61}
62
64 Validator::validate(Context *c, const ParamsMultiMap &params, ValidatorFlags flags) const
65{
66 ValidatorResult result;
67
68 Q_ASSERT(c);
69 Q_D(const Validator);
70
71 if (d->validators.empty()) {
72 qCWarning(C_VALIDATOR) << "Validation started with empty validator list.";
73 return result;
74 }
75
76 if (params.empty()) {
77 qCWarning(C_VALIDATOR) << "Validation started with empty parameters.";
78 }
79
80 const bool stopOnFirstError = flags.testFlag(StopOnFirstError);
81 const bool noTrimming = flags.testFlag(NoTrimming);
82
83 for (ValidatorRule *v : d->validators) {
84
85 if (noTrimming) {
86 v->setTrimBefore(false);
87 }
88
89 const ValidatorReturnType singleResult = v->validate(c, params);
90
91 if (singleResult.extra.isValid()) {
92 result.addExtra(v->field(), singleResult.extra);
93 }
94
95 if (singleResult) {
96 result.addValue(v->field(), singleResult.value);
97 } else {
98 result.addError(v->field(), singleResult.errorMessage);
99 if (stopOnFirstError) {
100 break;
101 }
102 }
103 }
104
105 if (!result && flags.testFlag(FillStashOnError)) {
106 c->setStash(u"validationErrorStrings"_s, result.errorStrings());
107 c->setStash(u"validationErrors"_s, QVariant::fromValue(result.errors()));
108
109 if (!params.isEmpty()) {
110 auto i = params.constBegin();
111 while (i != params.constEnd()) {
112 if (!i.key().contains(u"password"_s, Qt::CaseInsensitive)) {
113 c->setStash(i.key(), i.value());
114 }
115 ++i;
116 }
117 }
118 }
119
120 return result;
121}
122
124{
125 Q_D(Validator);
126 v->setTranslationContext(d->translationContext);
127 d->validators.push_back(v);
128}
129
131{
132 app->loadTranslations(u"plugin_utils_validator"_s);
133}
The Cutelyst application.
Definition application.h:66
void loadTranslations(const QString &filename, const QString &directory={}, const QString &prefix={}, const QString &suffix={})
The Cutelyst Context.
Definition context.h:42
void setStash(const QString &key, const QVariant &value)
Definition context.cpp:213
Request * req
Definition context.h:66
ParamsMultiMap bodyParameters() const
Definition request.cpp:220
ParamsMultiMap queryParameters() const
Definition request.cpp:256
Provides information about performed validations.
void addExtra(const QString &field, const QVariant &extra)
void addValue(const QString &field, const QVariant &value)
QHash< QString, QStringList > errors() const noexcept
void addError(const QString &field, const QString &message)
QStringList errorStrings() const
Base class for all validator rules.
QString field() const noexcept
virtual ValidatorReturnType validate(Context *c, const ParamsMultiMap &params) const =0
ValidatorResult validate(Context *c, ValidatorFlags flags=NoSpecialBehavior) const
Definition validator.cpp:42
Validator(const char *translationContext=nullptr)
Definition validator.cpp:19
void addValidator(ValidatorRule *v)
static void loadTranslations(Application *app)
QMultiMap< QString, QString > ParamsMultiMap
The Cutelyst namespace holds all public Cutelyst API.
QMultiMap< Key, T >::const_iterator constBegin() const const
QMultiMap< Key, T >::const_iterator constEnd() const const
bool empty() const const
bool isEmpty() const const
QMultiMap< Key, T > & unite(QMultiMap< Key, T > &&other)
CaseInsensitive
QVariant fromValue(T &&value)
bool isValid() const const
Contains the result of a single input parameter validation.