|
|
@@ -6,11 +6,6 @@ import {RequestContext, TrieRouter} from '@e22m4u/js-trie-router';
|
|
|
import {DATA_TYPE_LIST, DataParser} from '@e22m4u/js-data-schema';
|
|
|
import {validateDataMappingSchema} from './validate-data-mapping-schema.js';
|
|
|
|
|
|
-/**
|
|
|
- * @typedef {object} TrieRouterDataMapperOptions
|
|
|
- * @property {boolean} [ignoreResponseDataSchema]
|
|
|
- */
|
|
|
-
|
|
|
/**
|
|
|
* Константа HttpData определяет какое свойство контекста
|
|
|
* запроса будет использовано для формирования данных.
|
|
|
@@ -29,20 +24,12 @@ const HTTP_DATA_TO_CONTEXT_PROPERTY_MAP = {
|
|
|
* Trie router data mapper.
|
|
|
*/
|
|
|
export class TrieRouterDataMapper extends Service {
|
|
|
- /**
|
|
|
- * Options.
|
|
|
- *
|
|
|
- * @type {TrieRouterDataMapperOptions}
|
|
|
- */
|
|
|
- _options;
|
|
|
-
|
|
|
/**
|
|
|
* Constructor.
|
|
|
*
|
|
|
* @param {import('@e22m4u/js-service').ServiceContainer} container
|
|
|
- * @param {TrieRouterDataMapperOptions} [options]
|
|
|
*/
|
|
|
- constructor(container, options = {}) {
|
|
|
+ constructor(container) {
|
|
|
super(container);
|
|
|
const router = this.getService(TrieRouter);
|
|
|
if (!router.hasPreHandler(dataMappingPreHandler)) {
|
|
|
@@ -51,23 +38,6 @@ export class TrieRouterDataMapper extends Service {
|
|
|
if (!router.hasPostHandler(dataMappingPostHandler)) {
|
|
|
router.addPostHandler(dataMappingPostHandler);
|
|
|
}
|
|
|
- if (!options || typeof options !== 'object' || Array.isArray(options)) {
|
|
|
- throw new InvalidArgumentError(
|
|
|
- 'Parameter "options" must be an Object, but %v was given.',
|
|
|
- options,
|
|
|
- );
|
|
|
- }
|
|
|
- if (
|
|
|
- options.ignoreResponseDataSchema !== undefined &&
|
|
|
- typeof options.ignoreResponseDataSchema !== 'boolean'
|
|
|
- ) {
|
|
|
- throw new InvalidArgumentError(
|
|
|
- 'Option "ignoreResponseDataSchema" must be a Boolean, ' +
|
|
|
- 'but %v was given.',
|
|
|
- options.ignoreResponseDataSchema,
|
|
|
- );
|
|
|
- }
|
|
|
- this.options = options;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -112,8 +82,8 @@ export class TrieRouterDataMapper extends Service {
|
|
|
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
|
value = value[propOptions.property];
|
|
|
}
|
|
|
- // если свойство контекста не является
|
|
|
- // объектом, то выбрасывается ошибка
|
|
|
+ // если свойство контекста не содержит
|
|
|
+ // объект, то выбрасывается ошибка
|
|
|
else {
|
|
|
throw new InvalidArgumentError(
|
|
|
'Property %v does not exist in %v value ' +
|
|
|
@@ -140,7 +110,7 @@ export class TrieRouterDataMapper extends Service {
|
|
|
// если определена схема проекции,
|
|
|
// то выполняется создание проекции
|
|
|
if (propOptions.projection !== undefined) {
|
|
|
- value = dataProjector.projectInput(value, propOptions.projection);
|
|
|
+ value = dataProjector.project(value, propOptions.projection);
|
|
|
}
|
|
|
// значение присваивается
|
|
|
// результирующему объекту
|
|
|
@@ -184,24 +154,22 @@ export class TrieRouterDataMapper extends Service {
|
|
|
propOptions.property,
|
|
|
);
|
|
|
}
|
|
|
- // если определена схема данных,
|
|
|
- // то выполняется разбор значения
|
|
|
- if (
|
|
|
- !this.options.ignoreResponseDataSchema &&
|
|
|
- propOptions.schema !== undefined
|
|
|
- ) {
|
|
|
+ // если определена схема данных, то выполняется
|
|
|
+ // разбор значения без валидации данных
|
|
|
+ if (propOptions.schema !== undefined) {
|
|
|
const sourcePath = 'response.body';
|
|
|
+ const parsingOptions = {sourcePath, noParsingErrors: true};
|
|
|
if (DATA_TYPE_LIST.includes(propOptions.schema)) {
|
|
|
const dataSchema = {type: propOptions.schema};
|
|
|
- res = dataParser.parse(res, dataSchema, {sourcePath});
|
|
|
+ res = dataParser.parse(res, dataSchema, parsingOptions);
|
|
|
} else {
|
|
|
- res = dataParser.parse(res, propOptions.schema, {sourcePath});
|
|
|
+ res = dataParser.parse(res, propOptions.schema, parsingOptions);
|
|
|
}
|
|
|
}
|
|
|
// если определена схема проекции,
|
|
|
// то выполняется создание проекции
|
|
|
if (propOptions.projection !== undefined) {
|
|
|
- res = dataProjector.projectOutput(res, propOptions.projection);
|
|
|
+ res = dataProjector.project(res, propOptions.projection);
|
|
|
}
|
|
|
});
|
|
|
return res;
|
|
|
@@ -214,7 +182,7 @@ export class TrieRouterDataMapper extends Service {
|
|
|
* @type {import('@e22m4u/js-trie-router').PreHandlerHook}
|
|
|
*/
|
|
|
function dataMappingPreHandler(ctx) {
|
|
|
- const schema = (ctx.meta || {}).dataMap;
|
|
|
+ const schema = (ctx.meta || {}).dataMapper;
|
|
|
if (schema === undefined) {
|
|
|
return;
|
|
|
}
|
|
|
@@ -229,7 +197,7 @@ function dataMappingPreHandler(ctx) {
|
|
|
* @type {import('@e22m4u/js-trie-router').PostHandlerHook}
|
|
|
*/
|
|
|
function dataMappingPostHandler(ctx, data) {
|
|
|
- const schema = (ctx.meta || {}).dataMap;
|
|
|
+ const schema = (ctx.meta || {}).dataMapper;
|
|
|
if (schema === undefined) {
|
|
|
return;
|
|
|
}
|