@protocolnebula/ts-openapi-generator
Version:
Build API and models from Swagger/OpenAPI to use in any project type
117 lines (106 loc) • 3.6 kB
text/typescript
import { OpenAPIV3 } from 'openapi-types';
import { ApiModel } from '../../../models/api.model';
import { ModelAttributessModel } from '../../../models/model-attributes.model';
import { StoreI } from '../../../stores/entities.store';
import { getApiDefaultModelName } from '../../../utils/models.util';
import { ParserBaseService } from './parser-base.service';
export class APIParserService extends ParserBaseService {
constructor(protected document: OpenAPIV3.Document, protected store: StoreI) {
super(document, store);
}
process(): void {
console.group("Processing APIs from 'paths'");
const apiRawList = this.document.paths;
for (let url in apiRawList) {
console.group('Processing api', url);
const rawModel = apiRawList[url] as OpenAPIV3.NonArraySchemaObject;
this.parseVerbs(rawModel, url);
console.groupEnd();
}
this.store.apis.sort();
console.groupEnd();
}
private parseVerbs(
rawModel: OpenAPIV3.NonArraySchemaObject,
url: string,
): void {
for (const verb in rawModel) {
const verbRaw = rawModel[verb] as OpenAPIV3.OperationObject;
console.group(verb.toUpperCase(), '-', verbRaw.operationId);
const api = new ApiModel(url, verb);
api.tags = verbRaw.tags || url.substr(1).split('/');
api.description = verbRaw.summary;
api.operationId = verbRaw.operationId;
console.info('Parsing parameters');
console.group();
this.parseRquestParameters(api, verbRaw.parameters);
console.groupEnd();
console.info('Parsing requestBody');
console.group();
this.parseRequestBody(api, verbRaw.requestBody);
console.groupEnd();
console.info('Parsing response');
console.group();
this.parseResponse(api, verbRaw.responses);
console.groupEnd();
this.store.apis.add(api);
console.groupEnd();
}
}
private parseRquestParameters(
apiModel: ApiModel,
parameters: (OpenAPIV3.ReferenceObject | OpenAPIV3.ParameterObject)[],
): void {
if (!parameters) {
console.debug(`No query parameters`);
return;
}
apiModel.queryParams = this.parseApiParameters(
parameters,
getApiDefaultModelName(apiModel, 'Params'),
);
}
private parseRequestBody(
apiModel: ApiModel,
scheme: OpenAPIV3.ReferenceObject | OpenAPIV3.RequestBodyObject,
): void {
if (!scheme) {
console.debug(`No requestBody`);
return;
}
if (this.isRefObject(scheme)) {
console.debug(`is ref of ${scheme.$ref}`);
const instance = new ModelAttributessModel(null);
instance.typeURI = scheme.$ref;
} else if (this.isRequestBodyObject(scheme)) {
const keys = Object.keys(scheme.content);
const mainKey = keys[0];
apiModel.requestContentType = mainKey;
apiModel.requestBody = this.parseSchema(
scheme.content[mainKey].schema,
getApiDefaultModelName(apiModel, 'Request'),
mainKey,
);
} else {
throw `${apiModel.verb.toUpperCase()} ${
apiModel.url
} has no correct scheme.`;
}
}
private parseResponse(
apiModel: ApiModel,
responses: OpenAPIV3.ResponsesObject,
): void {
const response = responses['200'];
if (this.isResponseObject(response)) {
const keys = Object.keys(response.content);
const mainKey = keys[0];
apiModel.responseContentType = mainKey;
apiModel.response = this.parseSchema(
response.content[mainKey].schema,
getApiDefaultModelName(apiModel, 'Response'),
mainKey,
);
}
}
}