|
|
@@ -6,6 +6,12 @@ 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} [ignoreRequestDataSchema]
|
|
|
+ * @property {boolean} [ignoreResponseDataSchema]
|
|
|
+ */
|
|
|
+
|
|
|
/**
|
|
|
* Константа HttpData определяет какое свойство контекста
|
|
|
* запроса будет использовано для формирования данных.
|
|
|
@@ -24,12 +30,20 @@ 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) {
|
|
|
+ constructor(container, options = {}) {
|
|
|
super(container);
|
|
|
const router = this.getService(TrieRouter);
|
|
|
if (!router.hasPreHandler(dataMappingPreHandler)) {
|
|
|
@@ -38,6 +52,33 @@ 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.ignoreRequestDataSchema !== undefined &&
|
|
|
+ typeof options.ignoreRequestDataSchema !== 'boolean'
|
|
|
+ ) {
|
|
|
+ throw new InvalidArgumentError(
|
|
|
+ 'Option "ignoreRequestDataSchema" must be a Boolean, ' +
|
|
|
+ 'but %v was given.',
|
|
|
+ options.ignoreRequestDataSchema,
|
|
|
+ );
|
|
|
+ }
|
|
|
+ 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;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -96,7 +137,10 @@ export class TrieRouterDataMapper extends Service {
|
|
|
}
|
|
|
// если определена схема данных,
|
|
|
// то выполняется разбор значения
|
|
|
- if (propOptions.schema !== undefined) {
|
|
|
+ if (
|
|
|
+ !this.options.ignoreRequestDataSchema &&
|
|
|
+ propOptions.schema !== undefined
|
|
|
+ ) {
|
|
|
const sourcePath = propOptions.property
|
|
|
? `request.${ctxProp}.${propOptions.property}`
|
|
|
: `request.${ctxProp}`;
|
|
|
@@ -156,7 +200,10 @@ export class TrieRouterDataMapper extends Service {
|
|
|
}
|
|
|
// если определена схема данных,
|
|
|
// то выполняется разбор значения
|
|
|
- if (propOptions.schema !== undefined) {
|
|
|
+ if (
|
|
|
+ !this.options.ignoreResponseDataSchema &&
|
|
|
+ propOptions.schema !== undefined
|
|
|
+ ) {
|
|
|
const sourcePath = 'response.body';
|
|
|
if (DATA_TYPE_LIST.includes(propOptions.schema)) {
|
|
|
const dataSchema = {type: propOptions.schema};
|