1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.exploreApiParametersMetadata = void 0;
|
4 | const lodash_1 = require("lodash");
|
5 | const constants_1 = require("../constants");
|
6 | const model_properties_accessor_1 = require("../services/model-properties-accessor");
|
7 | const parameter_metadata_accessor_1 = require("../services/parameter-metadata-accessor");
|
8 | const parameters_metadata_mapper_1 = require("../services/parameters-metadata-mapper");
|
9 | const schema_object_factory_1 = require("../services/schema-object-factory");
|
10 | const swagger_types_mapper_1 = require("../services/swagger-types-mapper");
|
11 | const parameterMetadataAccessor = new parameter_metadata_accessor_1.ParameterMetadataAccessor();
|
12 | const modelPropertiesAccessor = new model_properties_accessor_1.ModelPropertiesAccessor();
|
13 | const parametersMetadataMapper = new parameters_metadata_mapper_1.ParametersMetadataMapper(modelPropertiesAccessor);
|
14 | const swaggerTypesMapper = new swagger_types_mapper_1.SwaggerTypesMapper();
|
15 | const schemaObjectFactory = new schema_object_factory_1.SchemaObjectFactory(modelPropertiesAccessor, swaggerTypesMapper);
|
16 | const exploreApiParametersMetadata = (schemas, instance, prototype, method) => {
|
17 | const explicitParameters = Reflect.getMetadata(constants_1.DECORATORS.API_PARAMETERS, method);
|
18 | const parametersMetadata = parameterMetadataAccessor.explore(instance, prototype, method);
|
19 | const noExplicitMetadata = lodash_1.isNil(explicitParameters);
|
20 | if (noExplicitMetadata && lodash_1.isNil(parametersMetadata)) {
|
21 | return undefined;
|
22 | }
|
23 | const reflectedParametersAsProperties = parametersMetadataMapper.transformModelToProperties(parametersMetadata || {});
|
24 | let properties = reflectedParametersAsProperties;
|
25 | if (!noExplicitMetadata) {
|
26 | const mergeImplicitAndExplicit = (item) => lodash_1.assign(item, lodash_1.find(explicitParameters, ['name', item.name]));
|
27 | properties = removeBodyMetadataIfExplicitExists(properties, explicitParameters);
|
28 | properties = lodash_1.map(properties, mergeImplicitAndExplicit);
|
29 | properties = lodash_1.unionWith(properties, explicitParameters, (arrVal, othVal) => {
|
30 | return arrVal.name === othVal.name && arrVal.in === othVal.in;
|
31 | });
|
32 | }
|
33 | const paramsWithDefinitions = schemaObjectFactory.createFromModel(properties, schemas);
|
34 | const parameters = swaggerTypesMapper.mapParamTypes(paramsWithDefinitions);
|
35 | return parameters ? { parameters } : undefined;
|
36 | };
|
37 | exports.exploreApiParametersMetadata = exploreApiParametersMetadata;
|
38 | function removeBodyMetadataIfExplicitExists(properties, explicitParams) {
|
39 | const isBodyReflected = lodash_1.some(properties, (p) => p.in === 'body');
|
40 | const isBodyDefinedExplicitly = lodash_1.some(explicitParams, (p) => p.in === 'body');
|
41 | if (isBodyReflected && isBodyDefinedExplicitly) {
|
42 | return lodash_1.omitBy(properties, (p) => p.in === 'body');
|
43 | }
|
44 | return properties;
|
45 | }
|