From 02d200d9f6b16909f8a15871bbb0a5dc716e3c8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E7=A7=8B=E6=97=AD?= Date: Wed, 15 Feb 2023 21:26:41 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9D=20add=20@nestjs/swagger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nest-cli.json | 3 ++- package.json | 1 + pnpm-lock.yaml | 37 +++++++++++++++++++++++++++++-- src/main.ts | 10 +++++++++ src/users/dto/create-user.dto.ts | 3 --- src/users/entities/user.entity.ts | 10 +++++++++ src/users/users.controller.ts | 6 +++++ 7 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 src/users/entities/user.entity.ts diff --git a/nest-cli.json b/nest-cli.json index 14f97f1..5026014 100644 --- a/nest-cli.json +++ b/nest-cli.json @@ -6,6 +6,7 @@ "spec": false }, "compilerOptions": { - "deleteOutDir": true + "deleteOutDir": true, + "plugins": ["@nestjs/swagger/plugin"] } } diff --git a/package.json b/package.json index c2e1f0b..9c83953 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "@nestjs/core": "^9.0.0", "@nestjs/mapped-types": "^1.2.2", "@nestjs/platform-express": "^9.0.0", + "@nestjs/swagger": "^6.2.1", "@prisma/client": "^4.10.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b717304..1e8342c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,7 @@ specifiers: '@nestjs/mapped-types': ^1.2.2 '@nestjs/platform-express': ^9.0.0 '@nestjs/schematics': ^9.0.0 + '@nestjs/swagger': ^6.2.1 '@prisma/client': ^4.10.1 '@types/express': ^4.17.13 '@types/node': 18.11.18 @@ -38,6 +39,7 @@ dependencies: '@nestjs/core': 9.3.9_q6agyr4hwia55oswpsa7zjxcpm '@nestjs/mapped-types': 1.2.2_sm5si6oczf3vcbfl6qa276t67m '@nestjs/platform-express': 9.3.9_77foi4w27ghy47yutmnzv7krjy + '@nestjs/swagger': 6.2.1_ldzmua2hsw2tga2e42i6lmmdty '@prisma/client': 4.10.1_prisma@4.10.1 class-transformer: 0.5.1 class-validator: 0.14.0 @@ -497,6 +499,35 @@ packages: - chokidar dev: true + /@nestjs/swagger/6.2.1_ldzmua2hsw2tga2e42i6lmmdty: + resolution: {integrity: sha512-9M2vkfJHIzLqDZwvM5TEZO0MxRCvIb0xVy0LsmWwxH1lrb0z/4MhU+r2CWDhBtTccVJrKxVPiU2s3T3b9uUJbg==} + peerDependencies: + '@fastify/static': ^6.0.0 + '@nestjs/common': ^9.0.0 + '@nestjs/core': ^9.0.0 + class-transformer: '*' + class-validator: '*' + reflect-metadata: ^0.1.12 + peerDependenciesMeta: + '@fastify/static': + optional: true + class-transformer: + optional: true + class-validator: + optional: true + dependencies: + '@nestjs/common': 9.3.9_welcnyot5bzd5wa2aovbkxpi4i + '@nestjs/core': 9.3.9_q6agyr4hwia55oswpsa7zjxcpm + '@nestjs/mapped-types': 1.2.2_sm5si6oczf3vcbfl6qa276t67m + class-transformer: 0.5.1 + class-validator: 0.14.0 + js-yaml: 4.1.0 + lodash: 4.17.21 + path-to-regexp: 3.2.0 + reflect-metadata: 0.1.13 + swagger-ui-dist: 4.15.5 + dev: false + /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1061,7 +1092,6 @@ packages: /argparse/2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true /array-flatten/1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} @@ -2261,7 +2291,6 @@ packages: hasBin: true dependencies: argparse: 2.0.1 - dev: true /json-parse-even-better-errors/2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -3250,6 +3279,10 @@ packages: engines: {node: '>= 0.4'} dev: true + /swagger-ui-dist/4.15.5: + resolution: {integrity: sha512-V3eIa28lwB6gg7/wfNvAbjwJYmDXy1Jo1POjyTzlB6wPcHiGlRxq39TSjYGVjQrUSAzpv+a7nzp7mDxgNy57xA==} + dev: false + /symbol-observable/4.0.0: resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} engines: {node: '>=0.10'} diff --git a/src/main.ts b/src/main.ts index 531ce57..0d212e0 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,6 +1,7 @@ import { HttpAdapterHost, NestFactory } from '@nestjs/core' import { ValidationPipe } from '@nestjs/common' import { ConfigService } from '@nestjs/config' +import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger' import { PrismaClientExceptionFilter, PrismaService } from 'nestjs-prisma' import { AppModule } from './app.module' @@ -18,6 +19,15 @@ async function bootstrap() { const { httpAdapter } = app.get(HttpAdapterHost) app.useGlobalFilters(new PrismaClientExceptionFilter(httpAdapter)) + // Swagger Api + const options = new DocumentBuilder() + .setTitle('Nest Project') + .setDescription('The Nest-Project API description') + .setVersion('1.0') + .build() + const document = SwaggerModule.createDocument(app, options) + SwaggerModule.setup('api', app, document) + const configService = app.get(ConfigService) const PORT = configService.get('PORT', 12400) diff --git a/src/users/dto/create-user.dto.ts b/src/users/dto/create-user.dto.ts index 15162b4..720b864 100644 --- a/src/users/dto/create-user.dto.ts +++ b/src/users/dto/create-user.dto.ts @@ -1,7 +1,6 @@ import { IsNotEmpty, IsOptional, - IsString, Length, IsEmail, IsStrongPassword, @@ -13,11 +12,9 @@ export class CreateUserDto { email: string @IsOptional() - @IsString() @Length(5, 20) username?: string - @IsString() @IsNotEmpty() @IsStrongPassword() password: string diff --git a/src/users/entities/user.entity.ts b/src/users/entities/user.entity.ts new file mode 100644 index 0000000..6d5bc22 --- /dev/null +++ b/src/users/entities/user.entity.ts @@ -0,0 +1,10 @@ +import { User } from '@prisma/client' + +export class UserEntity implements User { + id: string + email: string + username: string | null + password: string + createdAt: Date + updatedAt: Date +} diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index b14b34f..e7399de 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -1,16 +1,22 @@ import { Controller, Get, Post, Body, Param } from '@nestjs/common' import { UsersService } from './users.service' import { CreateUserDto } from './dto/create-user.dto' +import { ApiOkResponse, ApiTags } from '@nestjs/swagger' +import { UserEntity } from './entities/user.entity' +@ApiTags('user') @Controller() export class UsersController { constructor(private readonly userService: UsersService) {} + // TODO: 分页 + @ApiOkResponse({ type: UserEntity, isArray: true }) @Get('users') async findUsers() { return this.userService.findUsers() } + @ApiOkResponse({ type: UserEntity }) @Get('users/:id') async getUserInfo(@Param('id') id: string) { return this.userService.getUserInfo(id)