1 /*
2  * Copyright (C) 2017-2018 Matthias Fehring <kontakt@buschmann23.de>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18 
19 #include "validatorrequiredwith_p.h"
20 
21 using namespace Cutelyst;
22 
ValidatorRequiredWith(const QString & field,const QStringList & otherFields,const Cutelyst::ValidatorMessages & messages)23 ValidatorRequiredWith::ValidatorRequiredWith(const QString &field, const QStringList &otherFields, const Cutelyst::ValidatorMessages &messages) :
24     ValidatorRule(*new ValidatorRequiredWithPrivate(field, otherFields, messages))
25 {
26 }
27 
~ValidatorRequiredWith()28 ValidatorRequiredWith::~ValidatorRequiredWith()
29 {
30 }
31 
validate(Context * c,const ParamsMultiMap & params) const32 ValidatorReturnType ValidatorRequiredWith::validate(Context *c, const ParamsMultiMap &params) const
33 {
34     ValidatorReturnType result;
35 
36     Q_D(const ValidatorRequiredWith);
37 
38     if (d->otherFields.empty()) {
39         result.errorMessage = validationDataError(c);
40         qCWarning(C_VALIDATOR, "ValidatorRequiredWith: invalid validation data for field %s at %s::%s", qPrintable(field()), qPrintable(c->controllerName()), qPrintable(c->actionName()));
41     } else {
42         bool containsOther = false;
43         const QString v = value(params);
44 
45         const QStringList ofc = d->otherFields;
46 
47         for (const QString &other : ofc)  {
48             if (params.contains(other)) {
49                 containsOther = true;
50                 break;
51             }
52         }
53 
54         if (containsOther) {
55             if (!v.isEmpty()) {
56                 result.value.setValue(v);
57             } else {
58                 result.errorMessage = validationError(c);
59                 qCDebug(C_VALIDATOR, "ValidatorRequiredWith: Validation failed for field %s at %s::%s", qPrintable(field()), qPrintable(c->controllerName()), qPrintable(c->actionName()));
60             }
61         } else {
62             if (!v.isEmpty()) {
63                 result.value.setValue(v);
64             }
65         }
66     }
67 
68     return result;
69 }
70 
genericValidationError(Context * c,const QVariant & errorData) const71 QString ValidatorRequiredWith::genericValidationError(Context *c, const QVariant &errorData) const
72 {
73     QString error;
74     Q_UNUSED(errorData)
75     const QString _label = label(c);
76     if (_label.isEmpty()) {
77         error = c->translate("Cutelyst::ValidatorRequiredWith", "This is required.");
78     } else {
79         //: %1 will be replaced by the field label
80         error = c->translate("Cutelyst::ValidatorRequiredWith", "The “%1” field is required.").arg(_label);
81     }
82     return error;
83 }
84