cutelyst 4.3.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;
15
16Q_LOGGING_CATEGORY(C_VALIDATOR, "cutelyst.utils.validator", QtWarningMsg)
17
18Validator::Validator(const char *translationContext)
19 : d_ptr(new ValidatorPrivate(translationContext))
20{
21}
22
23Validator::Validator(std::initializer_list<ValidatorRule *> validators,
24 const char *translationContext)
25 : d_ptr(new ValidatorPrivate(validators, translationContext))
26{
27}
28
29Validator::~Validator() = default;
30
32{
33 Q_D(Validator);
34 d->params.clear();
35 if (!d->validators.empty()) {
36 qDeleteAll(d->validators.begin(), d->validators.end());
37 d->validators.clear();
38 }
39}
40
42{
43 ValidatorResult result;
44
45 Q_ASSERT(c);
46
47 ParamsMultiMap params;
48 if (flags.testFlag(BodyParamsOnly)) {
49 params = c->req()->bodyParameters();
50 } else if (flags.testFlag(QueryParamsOnly)) {
51 params = c->req()->queryParameters();
52 } else {
53 params = c->req()->queryParameters();
54 params.unite(c->req()->bodyParameters());
55 }
56
57 result = validate(c, params, flags);
58
59 return result;
60}
61
63 Validator::validate(Context *c, const ParamsMultiMap &params, ValidatorFlags flags) const
64{
65 ValidatorResult result;
66
67 Q_ASSERT(c);
68 Q_D(const Validator);
69
70 if (d->validators.empty()) {
71 qCWarning(C_VALIDATOR) << "Validation started with empty validator list.";
72 return result;
73 }
74
75 if (params.empty()) {
76 qCWarning(C_VALIDATOR) << "Validation started with empty parameters.";
77 }
78
79 const bool stopOnFirstError = flags.testFlag(StopOnFirstError);
80 const bool noTrimming = flags.testFlag(NoTrimming);
81
82 for (ValidatorRule *v : d->validators) {
83
84 if (noTrimming) {
85 v->setTrimBefore(false);
86 }
87
88 const ValidatorReturnType singleResult = v->validate(c, params);
89
90 if (singleResult.extra.isValid()) {
91 result.addExtra(v->field(), singleResult.extra);
92 }
93
94 if (singleResult) {
95 result.addValue(v->field(), singleResult.value);
96 } else {
97 result.addError(v->field(), singleResult.errorMessage);
98 if (stopOnFirstError) {
99 break;
100 }
101 }
102 }
103
104 if (!result && flags.testFlag(FillStashOnError)) {
105 c->setStash(u"validationErrorStrings"_qs, result.errorStrings());
106 c->setStash(u"validationErrors"_qs, QVariant::fromValue(result.errors()));
107
108 if (!params.isEmpty()) {
109 auto i = params.constBegin();
110 while (i != params.constEnd()) {
111 if (!i.key().contains(u"password"_qs, Qt::CaseInsensitive)) {
112 c->setStash(i.key(), i.value());
113 }
114 ++i;
115 }
116 }
117 }
118
119 return result;
120}
121
123{
124 Q_D(Validator);
125 v->setTranslationContext(d->translationContext);
126 d->validators.push_back(v);
127}
128
130{
131 app->loadTranslations(u"plugin_utils_validator"_qs);
132}
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:212
Request * req
Definition context.h:66
ParamsMultiMap bodyParameters() const
Definition request.cpp:219
ParamsMultiMap queryParameters() const
Definition request.cpp:255
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.
Validation processor for input data.
Definition validator.h:274
ValidatorResult validate(Context *c, ValidatorFlags flags=NoSpecialBehavior) const
Definition validator.cpp:41
Validator(const char *translationContext=nullptr)
Definition validator.cpp:18
void addValidator(ValidatorRule *v)
static void loadTranslations(Application *app)
The Cutelyst namespace holds all public Cutelyst API.
QMultiMap::const_iterator constBegin() const const
QMultiMap::const_iterator constEnd() const const
bool empty() const const
bool isEmpty() const const
QMultiMap< Key, T > & unite(QMultiMap< Key, T > &&other)
CaseInsensitive
QVariant fromValue(const T &value)
bool isValid() const const
Contains the result of a single input parameter validation.