1 |
|
2 |
|
3 |
|
4 | 'use strict';
|
5 |
|
6 | const Base = require('./Validator');
|
7 |
|
8 | module.exports = class CompareValidator extends Base {
|
9 |
|
10 | constructor (config) {
|
11 | super({
|
12 | compareAttr: null,
|
13 | compareValue: null,
|
14 | type: 'string',
|
15 | operator: '==',
|
16 | ...config
|
17 | });
|
18 | }
|
19 |
|
20 | getMessage (params) {
|
21 | let message;
|
22 | switch (this.operator) {
|
23 | case '==': message = 'Value must be repeated exactly'; break;
|
24 | case '===': message = 'Value must be repeated exactly'; break;
|
25 | case '!=': message = 'Value must not be equal to "{compareValue}"'; break;
|
26 | case '!==': message = 'Value must not be equal to "{compareValue}"'; break;
|
27 | case '>': message = 'Value must be greater than "{compareValue}"';break;
|
28 | case '>=': message = 'Value must be greater than or equal to "{compareValue}"'; break;
|
29 | case '<': message = 'Value must be less than "{compareValue}"'; break;
|
30 | case '<=': message = 'Value must be less than or equal to "{compareValue}"'; break;
|
31 | default: message = `Unknown operator: ${this.operator}`;
|
32 | }
|
33 | return this.createMessage(this.message, message, params);
|
34 | }
|
35 |
|
36 | getInvalidValueMessage () {
|
37 | return this.createMessage(this.invalidValue, 'Invalid value');
|
38 | }
|
39 |
|
40 | validateAttr (attr, model) {
|
41 | const value = model.get(attr);
|
42 | let compareAttr, compareValue;
|
43 | if (Array.isArray(value)) {
|
44 | this.addError(model, attr, this.getInvalidValueMessage());
|
45 | } else if (this.compareValue !== null) {
|
46 | compareAttr = compareValue = this.compareValue;
|
47 | } else {
|
48 | compareValue = model.get(this.compareAttr);
|
49 | compareAttr = model.getAttrLabel(this.compareAttr);
|
50 | }
|
51 | if (!this.compareValues(this.operator, this.type, value, compareValue)) {
|
52 | this.addError(model, attr, this.getMessage({compareAttr, compareValue}));
|
53 | }
|
54 | }
|
55 |
|
56 | validateValue (value) {
|
57 | if (this.compareValue === null) {
|
58 | throw new Error('Value must be set');
|
59 | }
|
60 | if (this.compareValues(this.operator, this.type, value, this.compareValue)) {
|
61 | return this.getMessage({
|
62 | compareAttr: this.compareAttr,
|
63 | compareValue: this.compareValue
|
64 | });
|
65 | }
|
66 | }
|
67 |
|
68 | compareValues (operator, type, value, compareValue) {
|
69 | if (type === 'number') {
|
70 | value = Number(value);
|
71 | compareValue = Number(compareValue);
|
72 | } else {
|
73 | value = String(value);
|
74 | compareValue = String(compareValue);
|
75 | }
|
76 | switch (operator) {
|
77 | case '==': return value == compareValue;
|
78 | case '===': return value === compareValue;
|
79 | case '!=': return value != compareValue;
|
80 | case '!==': return value !== compareValue;
|
81 | case '>': return value > compareValue;
|
82 | case '>=': return value >= compareValue;
|
83 | case '<': return value < compareValue;
|
84 | case '<=': return value <= compareValue;
|
85 | }
|
86 | return false;
|
87 | }
|
88 | }; |
\ | No newline at end of file |