From 6088a6b7544315243ce80ce84f0974a146fe6c8d Mon Sep 17 00:00:00 2001 From: publdaze Date: Fri, 21 Jul 2023 02:36:40 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20swagger=EB=A1=9C=20api=20=EB=AC=B8?= =?UTF-8?q?=EC=84=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nest-cli.json | 10 ++- package-lock.json | 87 +++++++++++++++++++++-- package.json | 1 + src/buildings/dtos/create-building.dto.ts | 7 -- src/buildings/floors/floors.controller.ts | 8 +++ src/main.ts | 8 +++ 6 files changed, 107 insertions(+), 14 deletions(-) diff --git a/nest-cli.json b/nest-cli.json index f9aa683..b246267 100644 --- a/nest-cli.json +++ b/nest-cli.json @@ -3,6 +3,14 @@ "collection": "@nestjs/schematics", "sourceRoot": "src", "compilerOptions": { - "deleteOutDir": true + "deleteOutDir": true, + "plugins": [ + { + "name": "@nestjs/swagger", + "options": { + "introspectComments": true + } + } + ] } } diff --git a/package-lock.json b/package-lock.json index 2b6a084..c4d7301 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@nestjs/core": "^10.0.0", "@nestjs/mongoose": "^10.0.0", "@nestjs/platform-express": "^10.0.0", + "@nestjs/swagger": "^7.1.2", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "mongoose": "^7.3.4", @@ -1457,6 +1458,25 @@ } } }, + "node_modules/@nestjs/mapped-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.2.tgz", + "integrity": "sha512-V0izw6tWs6fTp9+KiiPUbGHWALy563Frn8X6Bm87ANLRuE46iuBMD5acKBDP5lKL/75QFvrzSJT7HkCbB0jTpg==", + "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" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, "node_modules/@nestjs/mongoose": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/@nestjs/mongoose/-/mongoose-10.0.0.tgz", @@ -1549,6 +1569,37 @@ "yarn": ">= 1.13.0" } }, + "node_modules/@nestjs/swagger": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.1.2.tgz", + "integrity": "sha512-/eWlV3YuMpvEAGi3FcP0SbRGI+gqIJ93mxXaRc/GRKAOHLj5UzQ22jsUVqmSLmNMCSmp6PTLNcRGoLW++SExJA==", + "dependencies": { + "@nestjs/mapped-types": "2.0.2", + "js-yaml": "4.1.0", + "lodash": "4.17.21", + "path-to-regexp": "3.2.0", + "swagger-ui-dist": "5.1.0" + }, + "peerDependencies": { + "@fastify/static": "^6.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" + }, + "peerDependenciesMeta": { + "@fastify/static": { + "optional": true + }, + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, "node_modules/@nestjs/testing": { "version": "10.0.5", "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.0.5.tgz", @@ -2499,8 +2550,7 @@ "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==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-flatten": { "version": "1.1.1", @@ -5457,7 +5507,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -7430,6 +7479,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/swagger-ui-dist": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.1.0.tgz", + "integrity": "sha512-c1KmAjuVODxw+vwkNLALQZrgdlBAuBbr2xSPfYrJgseEi7gFKcTvShysPmyuDI4kcUa1+5rFpjWvXdusKY74mg==" + }, "node_modules/symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", @@ -9336,6 +9390,12 @@ "uid": "2.0.2" } }, + "@nestjs/mapped-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.0.2.tgz", + "integrity": "sha512-V0izw6tWs6fTp9+KiiPUbGHWALy563Frn8X6Bm87ANLRuE46iuBMD5acKBDP5lKL/75QFvrzSJT7HkCbB0jTpg==", + "requires": {} + }, "@nestjs/mongoose": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/@nestjs/mongoose/-/mongoose-10.0.0.tgz", @@ -9395,6 +9455,18 @@ } } }, + "@nestjs/swagger": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@nestjs/swagger/-/swagger-7.1.2.tgz", + "integrity": "sha512-/eWlV3YuMpvEAGi3FcP0SbRGI+gqIJ93mxXaRc/GRKAOHLj5UzQ22jsUVqmSLmNMCSmp6PTLNcRGoLW++SExJA==", + "requires": { + "@nestjs/mapped-types": "2.0.2", + "js-yaml": "4.1.0", + "lodash": "4.17.21", + "path-to-regexp": "3.2.0", + "swagger-ui-dist": "5.1.0" + } + }, "@nestjs/testing": { "version": "10.0.5", "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.0.5.tgz", @@ -10166,8 +10238,7 @@ "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "array-flatten": { "version": "1.1.1", @@ -12377,7 +12448,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "requires": { "argparse": "^2.0.1" } @@ -13822,6 +13892,11 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "swagger-ui-dist": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.1.0.tgz", + "integrity": "sha512-c1KmAjuVODxw+vwkNLALQZrgdlBAuBbr2xSPfYrJgseEi7gFKcTvShysPmyuDI4kcUa1+5rFpjWvXdusKY74mg==" + }, "symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", diff --git a/package.json b/package.json index e26fe8c..5cc3f4a 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "@nestjs/core": "^10.0.0", "@nestjs/mongoose": "^10.0.0", "@nestjs/platform-express": "^10.0.0", + "@nestjs/swagger": "^7.1.2", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "mongoose": "^7.3.4", diff --git a/src/buildings/dtos/create-building.dto.ts b/src/buildings/dtos/create-building.dto.ts index 04aa532..fa5a4a3 100644 --- a/src/buildings/dtos/create-building.dto.ts +++ b/src/buildings/dtos/create-building.dto.ts @@ -6,11 +6,4 @@ export class CreateBuildingDto { @IsString() readonly buildingName: string; - - status: { - regular: number; - bottle: number; - plastic: number; - paper: number; - }; } diff --git a/src/buildings/floors/floors.controller.ts b/src/buildings/floors/floors.controller.ts index e19bc15..805b1c9 100644 --- a/src/buildings/floors/floors.controller.ts +++ b/src/buildings/floors/floors.controller.ts @@ -1,10 +1,18 @@ import { Body, Controller, Param, Post } from '@nestjs/common'; import { FloorsService } from './floors.service'; +import { ApiBody } from '@nestjs/swagger'; @Controller() export class FloorsController { constructor(private readonly floorsService: FloorsService) {} + @ApiBody({ + schema: { + properties: { + floorNumber: { type: 'number' }, + }, + }, + }) @Post('/buildings/:buildingNumber/floors') createFloor( @Param('buildingNumber') buildingNumber: number, diff --git a/src/main.ts b/src/main.ts index fae3d21..af008f5 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,6 +1,7 @@ import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { ValidationPipe } from '@nestjs/common'; +import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; async function bootstrap() { const app = await NestFactory.create(AppModule); @@ -13,6 +14,13 @@ async function bootstrap() { }), ); + const config = new DocumentBuilder() + .setTitle('Trashcan API') + .setDescription('쓰레기통 API 입니다.') + .build(); + const document = SwaggerModule.createDocument(app, config); + SwaggerModule.setup('docs', app, document); + await app.listen(3000); } bootstrap();