mirror of https://github.com/msgbyte/tailchat
docs: add all json schema for openapi
parent
592e4ab8bd
commit
0b9233d7f9
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"name": "tailchat-service-openapi-generator",
|
||||||
|
"private": true,
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "",
|
||||||
|
"main": "index.js",
|
||||||
|
"bin": "./dist/index.js",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "tsc --watch",
|
||||||
|
"prepare": "tsc",
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"msgbyte",
|
||||||
|
"moonrailgun",
|
||||||
|
"tailchat"
|
||||||
|
],
|
||||||
|
"author": "moonrailgun <moonrailgun@gmail.com>",
|
||||||
|
"license": "MIT",
|
||||||
|
"dependencies": {
|
||||||
|
"@apidevtools/swagger-parser": "^10.1.0",
|
||||||
|
"globby": "11.1.0",
|
||||||
|
"openapi3-ts": "^4.3.1",
|
||||||
|
"tailchat-server-sdk": "workspace:^",
|
||||||
|
"ts-node": "^10.9.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@types/node": "^18.11.18",
|
||||||
|
"typescript": "^4.9.4"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
import _ from 'lodash';
|
||||||
|
import type { TcService } from 'tailchat-server-sdk';
|
||||||
|
import type { PathsObject, SchemaObject } from 'openapi3-ts/oas31';
|
||||||
|
|
||||||
|
export function generateOpenapiPath(service: TcService): PathsObject {
|
||||||
|
const serviceName = service.serviceName;
|
||||||
|
const actions = service.getActionList();
|
||||||
|
|
||||||
|
const paths: PathsObject = {};
|
||||||
|
|
||||||
|
for (const action of actions) {
|
||||||
|
const pathName = '/' + serviceName + '/' + action.name;
|
||||||
|
paths[pathName] = {
|
||||||
|
post: {
|
||||||
|
requestBody: {
|
||||||
|
content: {
|
||||||
|
'application/json': {
|
||||||
|
schema: {
|
||||||
|
type: 'object',
|
||||||
|
properties: generateRequestBodyProperties(action.params),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return paths;
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateRequestBodyProperties(params: {
|
||||||
|
[x: string]: any;
|
||||||
|
}): Record<string, SchemaObject> {
|
||||||
|
return _.mapValues(params, (type) => {
|
||||||
|
return type;
|
||||||
|
});
|
||||||
|
}
|
@ -0,0 +1,70 @@
|
|||||||
|
import globby from 'globby';
|
||||||
|
import { TcBroker, TcService } from 'tailchat-server-sdk';
|
||||||
|
import { generateOpenapiPath } from './generateOpenapiPath';
|
||||||
|
import type { OpenAPIObject } from 'openapi3-ts/oas31';
|
||||||
|
import SwaggerParser from '@apidevtools/swagger-parser';
|
||||||
|
import fs from 'fs-extra';
|
||||||
|
import path from 'path';
|
||||||
|
import 'ts-node/register';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* https://ts-morph.com/setup/
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 扫描服务
|
||||||
|
*/
|
||||||
|
async function scanServices(): Promise<OpenAPIObject> {
|
||||||
|
const packageJsonPath = path.resolve(__dirname, '../../../../package.json');
|
||||||
|
const version = (await fs.readJson(packageJsonPath)).verson || '0.0.0';
|
||||||
|
const serviceFiles = await globby(
|
||||||
|
['./services/**/*.service.ts', './plugins/**/*.service.ts'],
|
||||||
|
{
|
||||||
|
absolute: true,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
console.log('Service List:', serviceFiles);
|
||||||
|
|
||||||
|
const openapiObj: OpenAPIObject = {
|
||||||
|
openapi: '3.1.0',
|
||||||
|
info: {
|
||||||
|
title: 'Tailchat Openapi',
|
||||||
|
version,
|
||||||
|
},
|
||||||
|
paths: {},
|
||||||
|
};
|
||||||
|
const broker = new TcBroker({
|
||||||
|
logger: false,
|
||||||
|
});
|
||||||
|
for (const servicePath of serviceFiles) {
|
||||||
|
const { default: serviceCls } = await import(servicePath);
|
||||||
|
|
||||||
|
if (TcService.prototype.isPrototypeOf(serviceCls.prototype)) {
|
||||||
|
const service: TcService = new serviceCls(broker);
|
||||||
|
|
||||||
|
openapiObj.paths = {
|
||||||
|
...openapiObj.paths,
|
||||||
|
...generateOpenapiPath(service),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
broker.stop();
|
||||||
|
|
||||||
|
try {
|
||||||
|
await SwaggerParser.validate(openapiObj as any);
|
||||||
|
|
||||||
|
return openapiObj;
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
scanServices().then(async (openapiObj) => {
|
||||||
|
await fs.writeJSON('./openapi.json', openapiObj, {
|
||||||
|
spaces: 2,
|
||||||
|
});
|
||||||
|
console.log(
|
||||||
|
'generate completed, if process not exist auto, you can exit it by yourself'
|
||||||
|
);
|
||||||
|
});
|
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"extends": "../../tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"declaration": true,
|
||||||
|
"outDir": "./dist",
|
||||||
|
"paths": {}
|
||||||
|
},
|
||||||
|
"include": ["./src/**/*"],
|
||||||
|
"exclude": ["./node_modules/**/*", "./dist/**/*"]
|
||||||
|
}
|
Loading…
Reference in New Issue