Skip to content

Commit

Permalink
docs: add all json schema for openapi
Browse files Browse the repository at this point in the history
  • Loading branch information
moonrailgun committed Apr 5, 2024
1 parent 592e4ab commit 0b9233d
Show file tree
Hide file tree
Showing 9 changed files with 3,939 additions and 163 deletions.
560 changes: 400 additions & 160 deletions pnpm-lock.yaml

Large diffs are not rendered by default.

3,361 changes: 3,361 additions & 0 deletions server/openapi.json

Large diffs are not rendered by default.

4 changes: 3 additions & 1 deletion server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
"admin": "cd admin && pnpm run build && pnpm run start",
"plugin:install": "node ./scripts/installPlugin.js",
"protobuf": "proto-loader-gen-types --longs=String --enums=String --defaults --oneofs --grpcLib=@grpc/grpc-js --outDir=proto/ proto/*.proto",
"gen:swagger": "ts-node ./scripts/swagger.ts"
"gen:swagger:old": "ts-node ./scripts/swagger.ts",
"gen:openapi": "tailchat-service-openapi-generator"
},
"pnpm": {
"peerDependencyRules": {
Expand Down Expand Up @@ -117,6 +118,7 @@
"prettier": "^2.3.2",
"socket.io-client": "^4.1.3",
"swagger-jsdoc": "^6.2.8",
"tailchat-service-openapi-generator": "workspace:^",
"tailchat-service-swagger-generator": "workspace:^1.0.0",
"ts-jest": "27.1.4",
"vinyl-fs": "^3.0.3"
Expand Down
31 changes: 31 additions & 0 deletions server/packages/openapi-generator/package.json
Original file line number Diff line number Diff line change
@@ -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"
}
}
38 changes: 38 additions & 0 deletions server/packages/openapi-generator/src/generateOpenapiPath.ts
Original file line number Diff line number Diff line change
@@ -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;
});
}
70 changes: 70 additions & 0 deletions server/packages/openapi-generator/src/index.ts
Original file line number Diff line number Diff line change
@@ -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'
);
});
10 changes: 10 additions & 0 deletions server/packages/openapi-generator/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"declaration": true,
"outDir": "./dist",
"paths": {}
},
"include": ["./src/**/*"],
"exclude": ["./node_modules/**/*", "./dist/**/*"]
}
4 changes: 2 additions & 2 deletions server/packages/sdk/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "tailchat-server-sdk",
"version": "0.0.17",
"version": "0.0.18",
"description": "",
"main": "dist/index.js",
"bin": {
Expand All @@ -10,7 +10,7 @@
"build": "tsc",
"watch": "tsc --watch",
"test": "echo \"Error: no test specified\" && exit 1",
"prepare": "pnpm build",
"prepare": "tsc",
"release": "npm version patch && npm publish --registry https://registry.npmjs.com/"
},
"repository": {
Expand Down
24 changes: 24 additions & 0 deletions server/packages/sdk/src/services/base.ts
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,26 @@ export abstract class TcService extends Service {
};
}

/**
* 获取服务操作列表
*/
getActionList() {
return Object.entries(this._actions).map(
([name, schema]: [string, ServiceActionSchema]) => {
return {
name,
params: _.mapValues(schema.params, (type) => {
if (typeof type === 'string') {
return { type: type };
} else {
return type;
}
}),
};
}
);
}

registerMixin(mixin: Partial<ServiceSchema>): void {
this._mixins.push(mixin);
}
Expand Down Expand Up @@ -423,6 +443,10 @@ export abstract class TcService extends Service {
* NOTICE: 这里使用Redis作为缓存管理器,因此不需要通知所有的service
*/
async cleanActionCache(actionName: string, keys: string[] = []) {
if (!this.broker.cacher) {
console.error('Can not clean cache because no cacher existed.');
}

if (keys.length === 0) {
await this.broker.cacher.clean(`${this.serviceName}.${actionName}`);
} else {
Expand Down

0 comments on commit 0b9233d

Please sign in to comment.