Skip to content

Commit 375fa0f

Browse files
committed
Align validation errors API and extend Error class
1 parent 498cce0 commit 375fa0f

File tree

6 files changed

+50
-67
lines changed

6 files changed

+50
-67
lines changed

lib/errors/validation/attribute-error.js

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,12 @@
22

33
const ValidationError = require('./validation-error');
44

5-
class AttributeError extends ValidationError {
5+
class AttributeValidationError extends ValidationError {
66
constructor(originalError) {
7-
super(originalError.instance);
8-
this.name = 'AttributeError';
9-
this.original = originalError;
10-
}
11-
12-
get message() {
13-
return `${this.name}: ${this.original.message}; ${this.instanceInfo}`;
7+
const { instance, message } = originalError;
8+
super(instance, message);
9+
this.originalError = originalError;
1410
}
1511
}
1612

17-
module.exports = AttributeError;
13+
module.exports = AttributeValidationError;

lib/errors/validation/consumable-error.js

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,15 @@
22

33
const ValidationError = require('./validation-error');
44

5-
class ConsumableError extends ValidationError {
5+
class ConsumableValidationError extends ValidationError {
66
constructor(instance, association) {
7-
super(...arguments);
8-
this.name = 'ConsumableError';
7+
super(instance, getMessage(association));
98
this.association = association;
109
}
11-
12-
get message() {
13-
return `${this.name}: Invalid consumable association: ${this.association.associationAccessor}; ${this.instanceInfo}`;
14-
}
1510
}
1611

17-
module.exports = ConsumableError;
12+
module.exports = ConsumableValidationError;
13+
14+
function getMessage(association) {
15+
return `Invalid consumable association: ${association.associationAccessor}`;
16+
}

lib/errors/validation/domain-error.js

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,11 @@
22

33
const ValidationError = require('./validation-error');
44

5-
class DomainError extends ValidationError {
6-
constructor(instance, originalMessage) {
7-
super(...arguments);
8-
this.name = 'DomainError';
9-
this.originalMessage = originalMessage;
10-
}
11-
12-
get message() {
13-
return `${this.name}: ${this.originalMessage}; ${this.instanceInfo}`;
5+
class DomainValidationError extends ValidationError {
6+
constructor(instance, message) {
7+
super(instance, message);
8+
this.originalMessage = message;
149
}
1510
}
1611

17-
module.exports = DomainError;
12+
module.exports = DomainValidationError;

lib/errors/validation/fk-error.js

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,19 @@
22

33
const ValidationError = require('./validation-error');
44

5-
class ValidationFkError extends ValidationError {
5+
class ForeignKeyValidationError extends ValidationError {
66
constructor(instance, association) {
7-
super(...arguments);
8-
this.name = 'ValidationFkError';
9-
this.alias = association.associationAccessor;
10-
this.fk = association.identifier;
7+
const alias = association.associationAccessor;
8+
const fk = association.identifier;
9+
const value = instance[fk];
10+
const message = getMessage(alias, fk, value);
11+
super(instance, message);
12+
Object.assign(this, { alias, fk, value });
1113
}
14+
}
1215

13-
get message() {
14-
return `${this.name}: No ${this.alias} found for ${this.fk}: ${this.value}; ${this.instanceInfo}`;
15-
}
16+
module.exports = ForeignKeyValidationError;
1617

17-
get value() {
18-
return this.instance[this.fk];
19-
}
18+
function getMessage(alias, fk, value) {
19+
return `No ${alias} found for ${fk}: ${value}`;
2020
}
21-
22-
module.exports = ValidationFkError;

lib/errors/validation/uniqueness-error.js

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,24 @@ const map = require('lodash/map');
55
const transform = require('lodash/transform');
66
const ValidationError = require('./validation-error');
77

8-
class ValidationUniquenessError extends ValidationError {
9-
constructor(instance, index) {
10-
super(...arguments);
11-
this.name = 'ValidationUniquenessError';
12-
this.index = index;
13-
this.values = parseValues(instance, index);
14-
}
15-
16-
get message() {
17-
return `${this.name}: duplicate value for ${this.index.join()}: ${map(this.values).join()}; ${this.instanceInfo}`;
8+
class UniquenessValidationError extends ValidationError {
9+
constructor(instance, index = []) {
10+
const values = parseValues(instance, index);
11+
const message = getMessage(index, values);
12+
super(instance, message);
13+
Object.assign(this, { values, index });
1814
}
1915
}
2016

21-
module.exports = ValidationUniquenessError;
17+
module.exports = UniquenessValidationError;
2218

2319
function parseValues(instance, index) {
2420
return transform(index, (acc, it) => {
2521
const attribute = find(instance.rawAttributes, { field: it }).fieldName;
2622
acc[it] = instance[attribute];
2723
}, {});
2824
}
25+
26+
function getMessage(index, values) {
27+
return `Duplicate value for ${index.join()}: ${map(values).join()}`;
28+
}
Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,17 @@
11
'use strict';
22

3-
class ValidationError {
4-
constructor(instance) {
5-
this.name = 'ValidationError';
6-
this.instance = instance;
7-
}
8-
9-
get id() {
10-
return this.instance.id;
11-
}
12-
13-
get modelName() {
14-
return this.instance.constructor.name;
15-
}
16-
17-
get instanceInfo() {
18-
return `${this.modelName} id: ${this.id}`;
3+
class ValidationError extends Error {
4+
constructor(instance, message = '') {
5+
const modelName = instance.constructor.name;
6+
const id = instance.id;
7+
super(getMessage(message, modelName, id));
8+
Object.assign(this, { instance, id, modelName });
199
}
2010
}
2111

2212
module.exports = ValidationError;
13+
14+
function getMessage(message, modelName, id) {
15+
const instanceInfo = `${modelName} id: ${id}`;
16+
return [message, instanceInfo].filter(Boolean).join('; ');
17+
}

0 commit comments

Comments
 (0)