S🛸
Size: a a a
S🛸
NN
И
АК
import assert from 'assert';ну и от
export default class BaseDTO {
static schema;
static validateByScheme(data, schema) {
// validate by `ajv`
// `throw new ValidationError()` if data is invalid
}
constructor(data) {
const { schema, validateByScheme } = this.constructor;
assert(schema, 'Schema is not defined');
validateByScheme(data, schema);
Object.assign(this, data);
}
toJSON() {
return { ...this };
}
}
BaseDTO можно отнаследоваться, например вот так:class UserDTO extends BaseDTO {
static schema = {
type: 'object',
properties: {
firstName: { type: 'string' },
lastName: { type: 'string' },
},
};
get fullName() {
return `${this.firstName} ${this.lastName}`;
}
toJSON() {
const { fullName } = this;
return {
...super.toJSON(),
fullName,
};
}
}
т.е. в унаследованном классе прописываем схему, можно даже свою реализацию validateByScheme (например, для валидации Joi-ем, а не ajv), можно какие-то геттеры добавить и, если надо, эти геттеры подставить в результат toJSON'а.const user = new UserDTO({
firstName: 'Pampampam',
lastName: 'Pumpumpum',
});
console.log('user', JSON.stringify(user, null, 2));
/*
user {
"firstName": "Pampampam",
"lastName": "Pumpumpum",
"fullName": "Pampampam Pumpumpum"
}
*/
В принципе, на первый взгляд выглядит более-менее.new FiltersDTO(req.query)
илиnew SearchFormDTO(req.body)
и, если данные неправильные, то ошибка отловится в мидлваре и клиенту уйдёт ответ с ошибками валидации и соответствующим http-кодом. А если данные по схеме прошли, то спокойно этот объект отдавать дальше во внутренние сервисы, в которых единственная необходимая проверка - это что-то типа такого:class UsersService {
/**
* @param {UserDTO} user
*/
constructor(user) {
assert(user instanceof UserDTO);
this.user = user;
}
// someMethod() {}
}
2. из этих схем когда-нибудь потом можно будет прикрутить генерацию документации к api.А
А
S🛸
import assert from 'assert';ну и от
export default class BaseDTO {
static schema;
static validateByScheme(data, schema) {
// validate by `ajv`
// `throw new ValidationError()` if data is invalid
}
constructor(data) {
const { schema, validateByScheme } = this.constructor;
assert(schema, 'Schema is not defined');
validateByScheme(data, schema);
Object.assign(this, data);
}
toJSON() {
return { ...this };
}
}
BaseDTO можно отнаследоваться, например вот так:class UserDTO extends BaseDTO {
static schema = {
type: 'object',
properties: {
firstName: { type: 'string' },
lastName: { type: 'string' },
},
};
get fullName() {
return `${this.firstName} ${this.lastName}`;
}
toJSON() {
const { fullName } = this;
return {
...super.toJSON(),
fullName,
};
}
}
т.е. в унаследованном классе прописываем схему, можно даже свою реализацию validateByScheme (например, для валидации Joi-ем, а не ajv), можно какие-то геттеры добавить и, если надо, эти геттеры подставить в результат toJSON'а.const user = new UserDTO({
firstName: 'Pampampam',
lastName: 'Pumpumpum',
});
console.log('user', JSON.stringify(user, null, 2));
/*
user {
"firstName": "Pampampam",
"lastName": "Pumpumpum",
"fullName": "Pampampam Pumpumpum"
}
*/
В принципе, на первый взгляд выглядит более-менее.new FiltersDTO(req.query)
илиnew SearchFormDTO(req.body)
и, если данные неправильные, то ошибка отловится в мидлваре и клиенту уйдёт ответ с ошибками валидации и соответствующим http-кодом. А если данные по схеме прошли, то спокойно этот объект отдавать дальше во внутренние сервисы, в которых единственная необходимая проверка - это что-то типа такого:class UsersService {
/**
* @param {UserDTO} user
*/
constructor(user) {
assert(user instanceof UserDTO);
this.user = user;
}
// someMethod() {}
}
2. из этих схем когда-нибудь потом можно будет прикрутить генерацию документации к api.АК
S🛸
АК
S🛸
S🛸
NN
АК
UserDTO можно прописать схему, допускающую вариативность, и условного админа туда можно засунуть, разве нет?АК
isAdmin можно добавитьKG
import assert from 'assert';ну и от
export default class BaseDTO {
static schema;
static validateByScheme(data, schema) {
// validate by `ajv`
// `throw new ValidationError()` if data is invalid
}
constructor(data) {
const { schema, validateByScheme } = this.constructor;
assert(schema, 'Schema is not defined');
validateByScheme(data, schema);
Object.assign(this, data);
}
toJSON() {
return { ...this };
}
}
BaseDTO можно отнаследоваться, например вот так:class UserDTO extends BaseDTO {
static schema = {
type: 'object',
properties: {
firstName: { type: 'string' },
lastName: { type: 'string' },
},
};
get fullName() {
return `${this.firstName} ${this.lastName}`;
}
toJSON() {
const { fullName } = this;
return {
...super.toJSON(),
fullName,
};
}
}
т.е. в унаследованном классе прописываем схему, можно даже свою реализацию validateByScheme (например, для валидации Joi-ем, а не ajv), можно какие-то геттеры добавить и, если надо, эти геттеры подставить в результат toJSON'а.const user = new UserDTO({
firstName: 'Pampampam',
lastName: 'Pumpumpum',
});
console.log('user', JSON.stringify(user, null, 2));
/*
user {
"firstName": "Pampampam",
"lastName": "Pumpumpum",
"fullName": "Pampampam Pumpumpum"
}
*/
В принципе, на первый взгляд выглядит более-менее.new FiltersDTO(req.query)
илиnew SearchFormDTO(req.body)
и, если данные неправильные, то ошибка отловится в мидлваре и клиенту уйдёт ответ с ошибками валидации и соответствующим http-кодом. А если данные по схеме прошли, то спокойно этот объект отдавать дальше во внутренние сервисы, в которых единственная необходимая проверка - это что-то типа такого:class UsersService {
/**
* @param {UserDTO} user
*/
constructor(user) {
assert(user instanceof UserDTO);
this.user = user;
}
// someMethod() {}
}
2. из этих схем когда-нибудь потом можно будет прикрутить генерацию документации к api.АК
АК
KG