Skip to content

Commit d139b6c

Browse files
Added logic to parse parameters from Components
1 parent 2ea9b6b commit d139b6c

3 files changed

Lines changed: 118 additions & 39 deletions

File tree

src/services/parsers/open-api-v3/api-parser.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export class APIParserService extends ParserBaseService {
6363
console.debug(`No query parameters`);
6464
return;
6565
}
66-
apiModel.queryParams = this.parseParameters(
66+
apiModel.queryParams = this.parseApiParameters(
6767
parameters,
6868
getApiDefaultModelName(apiModel, 'Params'),
6969
);
Lines changed: 72 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1+
import { ParameterModel } from '../../../models/parameter.model';
12
import { OpenAPIV3 } from 'openapi-types';
23
import { EnumModel } from '../../../models/enum.model';
34
import { ModelModel } from '../../../models/model.model';
45
import { StoreI } from '../../../stores/entities.store';
56
import { ModelType } from '../../../stores/model.store';
67
import { ParserBaseService } from './parser-base.service';
8+
import { findInObject } from '../../../utils/objects.util';
79

810
/**
911
* This service Process all COMPONENTS (components/schemas/*) and convert it to ModelModel instances
@@ -15,6 +17,29 @@ export class ComponentsParserService extends ParserBaseService {
1517
}
1618

1719
process(): void {
20+
this.processParameters();
21+
this.processSchemas();
22+
}
23+
24+
private processParameters(): void {
25+
console.group("Processing parameters from 'components'");
26+
const parameterRawList = this.document.components?.parameters;
27+
for (let parameterName in parameterRawList) {
28+
console.group('Processing parameter', parameterName);
29+
const rawModel = parameterRawList[
30+
parameterName
31+
] as OpenAPIV3.ParameterObject;
32+
const parameter = new ParameterModel(
33+
parameterName,
34+
this.parseParameter(rawModel, parameterName),
35+
);
36+
this.parameterStore.add(parameter);
37+
console.groupEnd();
38+
}
39+
console.groupEnd();
40+
}
41+
42+
private processSchemas(): void {
1843
console.group("Processing models from 'components'");
1944
const modelRawList = this.document.components?.schemas;
2045
for (let modelName in modelRawList) {
@@ -23,34 +48,57 @@ export class ComponentsParserService extends ParserBaseService {
2348
modelName
2449
] as OpenAPIV3.NonArraySchemaObject;
2550

26-
let elementRef: ModelType;
27-
if (rawModel.type === 'object') {
28-
const modelInstance = new ModelModel(modelName);
29-
elementRef = modelInstance;
30-
modelInstance.addAttributes(
31-
this.parseAttributes(rawModel, modelInstance.name),
32-
);
33-
this.modelStore.add(modelInstance);
34-
} else if (this.isEnumObject(rawModel)) {
35-
console.debug(`${modelName} is ENUM of type ${rawModel.type}`);
36-
const enumInstance = new EnumModel(modelName);
37-
enumInstance.type = rawModel.type;
38-
enumInstance.values = rawModel.enum;
39-
this.modelStore.add(enumInstance);
40-
} else {
41-
console.error(`ERROR: ${modelName} not a correct Schema`);
42-
if ((rawModel as any)?.type === 'array') {
43-
console.error(`ERROR: ARRAY not supported on COMPONENTS SCHEMA`);
44-
}
51+
const schemaParsed = this.processSchema(modelName, rawModel);
52+
if (schemaParsed) {
53+
this.modelStore.add(schemaParsed);
4554
}
4655

47-
if (elementRef) {
48-
elementRef.description = rawModel.description;
49-
elementRef.example = rawModel.example;
50-
elementRef.deprecated = rawModel.deprecated;
51-
}
5256
console.groupEnd();
5357
}
5458
console.groupEnd();
5559
}
60+
61+
private processSchema(
62+
modelName,
63+
rawModel: OpenAPIV3.NonArraySchemaObject,
64+
): ModelType {
65+
let elementRef: ModelType;
66+
if (rawModel.type === 'object') {
67+
elementRef = new ModelModel(modelName);
68+
elementRef.addAttributes(this.parseAttributes(rawModel, elementRef.name));
69+
} else if (this.isEnumObject(rawModel)) {
70+
console.debug(`${modelName} is ENUM of type ${rawModel.type}`);
71+
elementRef = new EnumModel(modelName);
72+
elementRef.type = rawModel.type;
73+
elementRef.values = rawModel.enum;
74+
} else if (this.isRefObject(rawModel)) {
75+
const ref = (rawModel as OpenAPIV3.ReferenceObject).$ref;
76+
console.error(`${modelName} is a pure ref of ${ref}`);
77+
const refSchema = this.findRefSchema(ref);
78+
if (!refSchema) {
79+
throw `Schema ${ref} not found`;
80+
}
81+
return this.processSchema(modelName, refSchema);
82+
} else {
83+
console.error(`ERROR: ${modelName} not a correct Schema`);
84+
if ((rawModel as any)?.type === 'array') {
85+
console.error(`ERROR: ARRAY not supported on COMPONENTS SCHEMA`);
86+
}
87+
}
88+
89+
if (elementRef) {
90+
elementRef.description = rawModel.description;
91+
elementRef.example = rawModel.example;
92+
elementRef.deprecated = rawModel.deprecated;
93+
}
94+
return elementRef;
95+
}
96+
97+
private findRefSchema($ref: string): OpenAPIV3.NonArraySchemaObject {
98+
if ($ref.indexOf('#') === 0) {
99+
return findInObject($ref, this.document);
100+
}
101+
102+
throw `$ref: ${$ref} not supported yet!`;
103+
}
56104
}

src/services/parsers/open-api-v3/parser-base.service.ts

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { USED_IN_ATTRIBUTE } from '@model/entities';
2+
import { ParameterStore } from '@src/stores/parameter.store';
13
import { capital } from 'case';
24
import { OpenAPIV3 } from 'openapi-types';
35
import { EnumModel } from '../../../models/enum.model';
@@ -20,6 +22,21 @@ export abstract class ParserBaseService {
2022
return this.store.models;
2123
}
2224

25+
get parameterStore(): ParameterStore {
26+
return this.store.parameters;
27+
}
28+
29+
protected getParameterUsedInType(inValue: string): USED_IN_ATTRIBUTE {
30+
switch (inValue) {
31+
case 'query':
32+
case 'param':
33+
return inValue;
34+
default:
35+
console.error(`Parameter "in" ${inValue} not found. Query used.`);
36+
return 'query';
37+
}
38+
}
39+
2340
protected isEnumObject(
2441
rawAttribute: any,
2542
): rawAttribute is OpenAPIV3.SchemaObject {
@@ -81,26 +98,18 @@ export abstract class ParserBaseService {
8198
* @param schema
8299
* @param modelName Name for the model if is not a "ref"
83100
*/
84-
protected parseParameters(
101+
protected parseApiParameters(
85102
parameters: (OpenAPIV3.ReferenceObject | OpenAPIV3.ParameterObject)[],
86103
modelName: string,
87104
): ModelAttributessModel {
88105
const newModel = new ModelModel(modelName);
89106
for (const rawParameter of parameters) {
90107
if (this.isRefObject(rawParameter)) {
91-
throw 'Not implemented REF OBJECT for parameterParser';
92-
// const instance = new ModelAttributessModel(null);
93-
// instance.typeURI = parameter.$ref;
94-
// newModel.addAttribute(instance);
108+
console.debug('Parameter object:', rawParameter.$ref);
109+
const parameter = this.store.parameters.getByUri(rawParameter.$ref);
110+
newModel.addAttribute(parameter.getAttribute());
95111
} else if (this.isParameterObject(rawParameter)) {
96-
const parameter = new ModelAttributessModel(rawParameter.name);
97-
parameter.typeURI = this.parseSchema(
98-
rawParameter.schema,
99-
capital(`${modelName} ${rawParameter.name}`, '', true),
100-
)?.typeURI;
101-
parameter.description = rawParameter.description;
102-
parameter.deprecated = rawParameter.deprecated;
103-
parameter.example = rawParameter.example;
112+
const parameter = this.parseParameter(rawParameter, modelName);
104113
newModel.addAttribute(parameter);
105114
} else {
106115
throw 'No schema available for this schema';
@@ -116,6 +125,25 @@ export abstract class ParserBaseService {
116125
return instance;
117126
}
118127

128+
protected parseParameter(
129+
rawParameter: OpenAPIV3.ParameterObject,
130+
modelName: string,
131+
): ModelAttributessModel {
132+
const parameter = new ModelAttributessModel(rawParameter.name);
133+
parameter.typeURI = this.parseSchema(
134+
rawParameter.schema,
135+
capital(`${modelName} ${rawParameter.name}`, '', true),
136+
)?.typeURI;
137+
parameter.usedIn = this.getParameterUsedInType(rawParameter.in);
138+
parameter.description = rawParameter.description;
139+
parameter.deprecated = rawParameter.deprecated;
140+
parameter.example = rawParameter.example;
141+
if (rawParameter.required) {
142+
parameter.isOptional = false;
143+
}
144+
return parameter;
145+
}
146+
119147
protected parseSchema(
120148
schema: OpenAPIV3.ReferenceObject | OpenAPIV3.SchemaObject,
121149
defaultName: string,
@@ -199,6 +227,7 @@ export abstract class ParserBaseService {
199227
console.debug(`${attrName} is ref of ${rawAttribute.$ref}`);
200228
attribute.typeURI = rawAttribute.$ref;
201229
} else {
230+
attribute.usedIn = this.getParameterUsedInType(rawAttribute.in);
202231
attribute.description = rawAttribute.description;
203232
attribute.example = rawAttribute.example;
204233
attribute.deprecated = rawAttribute.deprecated;
@@ -222,7 +251,9 @@ export abstract class ParserBaseService {
222251
attribute.typeURI = newModel.uri;
223252
} else if (rawAttribute.type === 'object' && rawAttribute.properties) {
224253
const newModel = new ModelModel(defaultName);
225-
newModel.addAttributes(this.parseAttributes(rawAttribute, defaultName));
254+
newModel.addAttributes(
255+
this.parseAttributes(rawAttribute, defaultName),
256+
);
226257
this.store.models.add(newModel);
227258
attribute.typeURI = newModel.uri;
228259
} else {

0 commit comments

Comments
 (0)