diff --git a/Fabric.Backend.Center/package-lock.json b/Fabric.Backend.Center/package-lock.json index 57d26b6..52271a7 100644 --- a/Fabric.Backend.Center/package-lock.json +++ b/Fabric.Backend.Center/package-lock.json @@ -11,6 +11,7 @@ "@nestjs/common": "^10.4.8", "@nestjs/core": "^10.4.8", "@nestjs/platform-express": "^10.4.8", + "@nestjs/swagger": "^7.4.2", "@nestjs/typeorm": "^11.0.1", "bcryptjs": "^3.0.3", "class-transformer": "^0.5.1", @@ -19,6 +20,7 @@ "mysql2": "^3.22.3", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", + "swagger-ui-express": "^5.0.1", "typeorm": "^0.3.29" }, "devDependencies": { @@ -357,6 +359,12 @@ "node": ">=8" } }, + "node_modules/@microsoft/tsdoc": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", + "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", + "license": "MIT" + }, "node_modules/@nestjs/common": { "version": "10.4.22", "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.4.22.tgz", @@ -446,6 +454,59 @@ "@nestjs/core": "^10.0.0" } }, + "node_modules/@nestjs/swagger": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.4.2.tgz", + "integrity": "sha512-Mu6TEn1M/owIvAx2B4DUQObQXqo2028R2s9rSZ/hJEgBK95+doTwS0DjmVA2wTeZTyVtXOoN7CsoM5pONBzvKQ==", + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "^0.15.0", + "@nestjs/mapped-types": "2.0.5", + "js-yaml": "4.1.0", + "lodash": "4.17.21", + "path-to-regexp": "3.3.0", + "swagger-ui-dist": "5.17.14" + }, + "peerDependencies": { + "@fastify/static": "^6.0.0 || ^7.0.0", + "@nestjs/common": "^9.0.0 || ^10.0.0", + "@nestjs/core": "^9.0.0 || ^10.0.0", + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12 || ^0.2.0" + }, + "peerDependenciesMeta": { + "@fastify/static": { + "optional": true + }, + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/swagger/node_modules/@nestjs/mapped-types": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.5.tgz", + "integrity": "sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "class-transformer": "^0.4.0 || ^0.5.0", + "class-validator": "^0.13.0 || ^0.14.0", + "reflect-metadata": "^0.1.12 || ^0.2.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, "node_modules/@nestjs/typeorm": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-11.0.1.tgz", @@ -1125,6 +1186,12 @@ "devOptional": true, "license": "MIT" }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -2625,6 +2692,18 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -2741,6 +2820,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -3740,6 +3825,27 @@ "node": ">=8" } }, + "node_modules/swagger-ui-dist": { + "version": "5.17.14", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.17.14.tgz", + "integrity": "sha512-CVbSfaLpstV65OnSjbXfVd6Sta3q3F7Cj/yYuvHMp1P90LztOLs6PfUnKEVAeiIVQt9u2SaPwv0LiH/OyMjHRw==", + "license": "Apache-2.0" + }, + "node_modules/swagger-ui-express": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.1.tgz", + "integrity": "sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA==", + "license": "MIT", + "dependencies": { + "swagger-ui-dist": ">=5.0.0" + }, + "engines": { + "node": ">= v0.10.32" + }, + "peerDependencies": { + "express": ">=4.0.0 || >=5.0.0-beta" + } + }, "node_modules/tinyglobby": { "version": "0.2.16", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", diff --git a/Fabric.Backend.Center/package.json b/Fabric.Backend.Center/package.json index ae5d0e5..6e7c9e6 100644 --- a/Fabric.Backend.Center/package.json +++ b/Fabric.Backend.Center/package.json @@ -15,6 +15,7 @@ "@nestjs/common": "^10.4.8", "@nestjs/core": "^10.4.8", "@nestjs/platform-express": "^10.4.8", + "@nestjs/swagger": "^7.4.2", "@nestjs/typeorm": "^11.0.1", "bcryptjs": "^3.0.3", "class-transformer": "^0.5.1", @@ -23,6 +24,7 @@ "mysql2": "^3.22.3", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", + "swagger-ui-express": "^5.0.1", "typeorm": "^0.3.29" }, "devDependencies": { diff --git a/Fabric.Backend.Center/src/main.ts b/Fabric.Backend.Center/src/main.ts index 3b31a2b..b7b6bc6 100644 --- a/Fabric.Backend.Center/src/main.ts +++ b/Fabric.Backend.Center/src/main.ts @@ -1,6 +1,7 @@ import 'reflect-metadata'; import { ValidationPipe } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; +import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import { AppModule } from './app.module'; function requireEnv(name: string): string { @@ -34,6 +35,15 @@ async function bootstrap() { transform: true, }), ); + + const swaggerConfig = new DocumentBuilder() + .setTitle('Fabric Backend Center API') + .setDescription('Identity Hub APIs for Fabric') + .setVersion('1.0.0') + .build(); + const swaggerDoc = SwaggerModule.createDocument(app, swaggerConfig); + SwaggerModule.setup('docs', app, swaggerDoc); + const port = process.env.PORT ? Number(process.env.PORT) : 7001; await app.listen(port); console.log(`Fabric.Backend.Center listening on :${port}`); diff --git a/Fabric.Backend.Guild/package-lock.json b/Fabric.Backend.Guild/package-lock.json index b4aea73..d4c82ec 100644 --- a/Fabric.Backend.Guild/package-lock.json +++ b/Fabric.Backend.Guild/package-lock.json @@ -11,12 +11,14 @@ "@nestjs/common": "^10.4.8", "@nestjs/core": "^10.4.8", "@nestjs/platform-express": "^10.4.8", + "@nestjs/swagger": "^7.4.2", "@nestjs/typeorm": "^11.0.1", "class-transformer": "^0.5.1", "class-validator": "^0.15.1", "mysql2": "^3.22.3", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", + "swagger-ui-express": "^5.0.1", "typeorm": "^0.3.29" }, "devDependencies": { @@ -353,6 +355,12 @@ "node": ">=8" } }, + "node_modules/@microsoft/tsdoc": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", + "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", + "license": "MIT" + }, "node_modules/@nestjs/common": { "version": "10.4.22", "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.4.22.tgz", @@ -442,6 +450,59 @@ "@nestjs/core": "^10.0.0" } }, + "node_modules/@nestjs/swagger": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.4.2.tgz", + "integrity": "sha512-Mu6TEn1M/owIvAx2B4DUQObQXqo2028R2s9rSZ/hJEgBK95+doTwS0DjmVA2wTeZTyVtXOoN7CsoM5pONBzvKQ==", + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "^0.15.0", + "@nestjs/mapped-types": "2.0.5", + "js-yaml": "4.1.0", + "lodash": "4.17.21", + "path-to-regexp": "3.3.0", + "swagger-ui-dist": "5.17.14" + }, + "peerDependencies": { + "@fastify/static": "^6.0.0 || ^7.0.0", + "@nestjs/common": "^9.0.0 || ^10.0.0", + "@nestjs/core": "^9.0.0 || ^10.0.0", + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12 || ^0.2.0" + }, + "peerDependenciesMeta": { + "@fastify/static": { + "optional": true + }, + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/swagger/node_modules/@nestjs/mapped-types": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.5.tgz", + "integrity": "sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", + "class-transformer": "^0.4.0 || ^0.5.0", + "class-validator": "^0.13.0 || ^0.14.0", + "reflect-metadata": "^0.1.12 || ^0.2.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, "node_modules/@nestjs/typeorm": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/@nestjs/typeorm/-/typeorm-11.0.1.tgz", @@ -1096,6 +1157,12 @@ "devOptional": true, "license": "MIT" }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -2572,6 +2639,18 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -2639,6 +2718,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, "node_modules/long": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", @@ -3597,6 +3682,27 @@ "node": ">=8" } }, + "node_modules/swagger-ui-dist": { + "version": "5.17.14", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.17.14.tgz", + "integrity": "sha512-CVbSfaLpstV65OnSjbXfVd6Sta3q3F7Cj/yYuvHMp1P90LztOLs6PfUnKEVAeiIVQt9u2SaPwv0LiH/OyMjHRw==", + "license": "Apache-2.0" + }, + "node_modules/swagger-ui-express": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.1.tgz", + "integrity": "sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA==", + "license": "MIT", + "dependencies": { + "swagger-ui-dist": ">=5.0.0" + }, + "engines": { + "node": ">= v0.10.32" + }, + "peerDependencies": { + "express": ">=4.0.0 || >=5.0.0-beta" + } + }, "node_modules/tinyglobby": { "version": "0.2.16", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", diff --git a/Fabric.Backend.Guild/package.json b/Fabric.Backend.Guild/package.json index 5748ded..9ad98e5 100644 --- a/Fabric.Backend.Guild/package.json +++ b/Fabric.Backend.Guild/package.json @@ -15,12 +15,14 @@ "@nestjs/common": "^10.4.8", "@nestjs/core": "^10.4.8", "@nestjs/platform-express": "^10.4.8", + "@nestjs/swagger": "^7.4.2", "@nestjs/typeorm": "^11.0.1", "class-transformer": "^0.5.1", "class-validator": "^0.15.1", "mysql2": "^3.22.3", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", + "swagger-ui-express": "^5.0.1", "typeorm": "^0.3.29" }, "devDependencies": { diff --git a/Fabric.Backend.Guild/src/main.ts b/Fabric.Backend.Guild/src/main.ts index 7ab10cc..c5f280d 100644 --- a/Fabric.Backend.Guild/src/main.ts +++ b/Fabric.Backend.Guild/src/main.ts @@ -1,6 +1,7 @@ import 'reflect-metadata'; import { ValidationPipe } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; +import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import { AppModule } from './app.module'; async function bootstrap() { @@ -13,6 +14,15 @@ async function bootstrap() { transform: true, }), ); + + const swaggerConfig = new DocumentBuilder() + .setTitle('Fabric Backend Guild API') + .setDescription('Guild Node APIs for Fabric') + .setVersion('1.0.0') + .build(); + const swaggerDoc = SwaggerModule.createDocument(app, swaggerConfig); + SwaggerModule.setup('docs', app, swaggerDoc); + const port = process.env.PORT ? Number(process.env.PORT) : 7002; await app.listen(port); console.log(`Fabric.Backend.Guild listening on :${port}`); diff --git a/docs/TODO-backend-center-guild.md b/docs/TODO-backend-center-guild.md index 7ed76b3..dd16fa2 100644 --- a/docs/TODO-backend-center-guild.md +++ b/docs/TODO-backend-center-guild.md @@ -87,7 +87,7 @@ ### 5.2 质量门禁 - [ ] lint/typecheck/build 全绿 -- [ ] API 文档(OpenAPI/Swagger) +- [x] API 文档(OpenAPI/Swagger) - [ ] 关键链路压测(发送/拉取/回补) ---