From 2df126ab73fd65883ed99c59a76c9c8c356e4a96 Mon Sep 17 00:00:00 2001 From: LimSR12 Date: Wed, 17 Dec 2025 20:55:22 +0900 Subject: [PATCH 1/8] =?UTF-8?q?feat:=20=EB=8F=84=EB=A9=94=EC=9D=B8?= =?UTF-8?q?=EB=B3=84=20=EA=B8=B0=EB=B3=B8=20=EA=B5=AC=EC=A1=B0=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/blog/blog.controller.ts | 0 BE/src/blog/blog.module.ts | 0 BE/src/blog/blog.service.ts | 0 BE/src/project/project.controller.ts | 0 BE/src/project/project.module.ts | 0 BE/src/project/project.service.ts | 0 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 BE/src/blog/blog.controller.ts create mode 100644 BE/src/blog/blog.module.ts create mode 100644 BE/src/blog/blog.service.ts create mode 100644 BE/src/project/project.controller.ts create mode 100644 BE/src/project/project.module.ts create mode 100644 BE/src/project/project.service.ts diff --git a/BE/src/blog/blog.controller.ts b/BE/src/blog/blog.controller.ts new file mode 100644 index 0000000..e69de29 diff --git a/BE/src/blog/blog.module.ts b/BE/src/blog/blog.module.ts new file mode 100644 index 0000000..e69de29 diff --git a/BE/src/blog/blog.service.ts b/BE/src/blog/blog.service.ts new file mode 100644 index 0000000..e69de29 diff --git a/BE/src/project/project.controller.ts b/BE/src/project/project.controller.ts new file mode 100644 index 0000000..e69de29 diff --git a/BE/src/project/project.module.ts b/BE/src/project/project.module.ts new file mode 100644 index 0000000..e69de29 diff --git a/BE/src/project/project.service.ts b/BE/src/project/project.service.ts new file mode 100644 index 0000000..e69de29 From 94f664b61ff427651162688d76bdfcd631c282c9 Mon Sep 17 00:00:00 2001 From: LimSR12 Date: Wed, 17 Dec 2025 21:37:55 +0900 Subject: [PATCH 2/8] =?UTF-8?q?chore:=20class-validator,=20class-transform?= =?UTF-8?q?er=20=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=84=A4=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/package-lock.json | 70 ++++++++++++++++++++++++++++++++++++++++++-- BE/package.json | 2 ++ 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/BE/package-lock.json b/BE/package-lock.json index 629a9f3..d6326e6 100644 --- a/BE/package-lock.json +++ b/BE/package-lock.json @@ -1,17 +1,19 @@ { - "name": "be", + "name": "boostus-be", "version": "0.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "be", + "name": "boostus-be", "version": "0.0.1", "license": "UNLICENSED", "dependencies": { "@nestjs/common": "^11.0.1", "@nestjs/core": "^11.0.1", "@nestjs/platform-express": "^11.0.1", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.3", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1" }, @@ -216,6 +218,7 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -2128,6 +2131,7 @@ "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.9.tgz", "integrity": "sha512-zDntUTReRbAThIfSp3dQZ9kKqI+LjgLp5YZN5c1bgNRDuoeLySAoZg46Bg1a+uV8TMgIRziHocglKGNzr6l+bQ==", "license": "MIT", + "peer": true, "dependencies": { "file-type": "21.1.0", "iterare": "1.2.1", @@ -2160,6 +2164,7 @@ "integrity": "sha512-a00B0BM4X+9z+t3UxJqIZlemIwCQdYoPKrMcM+ky4z3pkqqG1eTWexjs+YXpGObnLnjtMPVKWlcZHp3adDYvUw==", "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "@nuxt/opencollective": "0.4.1", "fast-safe-stringify": "2.1.1", @@ -2200,6 +2205,7 @@ "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.9.tgz", "integrity": "sha512-GVd3+0lO0mJq2m1kl9hDDnVrX3Nd4oH3oDfklz0pZEVEVS0KVSp63ufHq2Lu9cyPdSBuelJr9iPm2QQ1yX+Kmw==", "license": "MIT", + "peer": true, "dependencies": { "cors": "2.8.5", "express": "5.1.0", @@ -2574,6 +2580,7 @@ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -2687,6 +2694,7 @@ "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -2757,6 +2765,12 @@ "@types/superagent": "^8.1.0" } }, + "node_modules/@types/validator": { + "version": "13.15.10", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.10.tgz", + "integrity": "sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==", + "license": "MIT" + }, "node_modules/@types/yargs": { "version": "17.0.35", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", @@ -2819,6 +2833,7 @@ "integrity": "sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.50.0", "@typescript-eslint/types": "8.50.0", @@ -3500,6 +3515,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3549,6 +3565,7 @@ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3959,6 +3976,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -4157,6 +4175,7 @@ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "readdirp": "^4.0.1" }, @@ -4200,6 +4219,25 @@ "dev": true, "license": "MIT" }, + "node_modules/class-transformer": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", + "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==", + "license": "MIT", + "peer": true + }, + "node_modules/class-validator": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.3.tgz", + "integrity": "sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/validator": "^13.15.3", + "libphonenumber-js": "^1.11.1", + "validator": "^13.15.20" + } + }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -4822,6 +4860,7 @@ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -4882,6 +4921,7 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -6129,6 +6169,7 @@ "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "30.2.0", "@jest/types": "30.2.0", @@ -6994,6 +7035,12 @@ "node": ">= 0.8.0" } }, + "node_modules/libphonenumber-js": { + "version": "1.12.31", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.31.tgz", + "integrity": "sha512-Z3IhgVgrqO1S5xPYM3K5XwbkDasU67/Vys4heW+lfSBALcUZjeIIzI8zCLifY+OCzSq+fpDdywMDa7z+4srJPQ==", + "license": "MIT" + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -7882,6 +7929,7 @@ "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -8061,7 +8109,8 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/require-directory": { "version": "2.1.1", @@ -8158,6 +8207,7 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -8755,6 +8805,7 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -9082,6 +9133,7 @@ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -9229,6 +9281,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -9429,6 +9482,15 @@ "node": ">=10.12.0" } }, + "node_modules/validator": { + "version": "13.15.23", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.23.tgz", + "integrity": "sha512-4yoz1kEWqUjzi5zsPbAS/903QXSYp0UOtHsPpp7p9rHAw/W+dkInskAE386Fat3oKRROwO98d9ZB0G4cObgUyw==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -9478,6 +9540,7 @@ "integrity": "sha512-HU1JOuV1OavsZ+mfigY0j8d1TgQgbZ6M+J75zDkpEAwYeXjWSqrGJtgnPblJjd/mAyTNQ7ygw0MiKOn6etz8yw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -9547,6 +9610,7 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", diff --git a/BE/package.json b/BE/package.json index 6c96174..970d888 100644 --- a/BE/package.json +++ b/BE/package.json @@ -23,6 +23,8 @@ "@nestjs/common": "^11.0.1", "@nestjs/core": "^11.0.1", "@nestjs/platform-express": "^11.0.1", + "class-transformer": "^0.5.1", + "class-validator": "^0.14.3", "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1" }, From af548836fc58c5c3e43a696b89e2e86b1eef0bd9 Mon Sep 17 00:00:00 2001 From: LimSR12 Date: Wed, 17 Dec 2025 21:42:04 +0900 Subject: [PATCH 3/8] =?UTF-8?q?feat:=20=EC=A0=84=EC=97=AD=20Pipe=20?= =?UTF-8?q?=EC=97=90=20ValidationPipe=20=EB=93=B1=EB=A1=9D=20-=20DTO=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=EC=9D=84=20=ED=8C=8C=EC=9D=B4=ED=94=84?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=88=98=ED=96=89=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=B4=20Validatio?= =?UTF-8?q?n=20Pipe=20=EC=84=A4=EC=A0=95=20=EC=B6=94=EA=B0=80=ED=95=B4?= =?UTF-8?q?=EB=91=90=EC=97=88=EC=8A=B5=EB=8B=88=EB=8B=A4.=20-=20Nest=20?= =?UTF-8?q?=EA=B3=B5=EC=8B=9D=EB=AC=B8=EC=84=9C=EB=A5=BC=20=ED=99=95?= =?UTF-8?q?=EC=9D=B8=ED=95=B4=EB=B3=B4=EB=8B=88=20=EC=82=AC=EC=9A=A9=20?= =?UTF-8?q?=EA=B0=80=EB=8A=A5=ED=95=9C=20=EC=98=B5=EC=85=98=EC=9D=B4=20?= =?UTF-8?q?=EA=B5=89=EC=9E=A5=ED=9E=88=20=EB=8B=A4=EC=96=91=ED=96=88?= =?UTF-8?q?=EB=8A=94=EB=8D=B0,=20=EC=B6=94=ED=9B=84=20=EB=AC=B8=EC=84=9C?= =?UTF-8?q?=ED=99=94=ED=95=98=EB=A9=B4=EC=84=9C=20=EC=A0=95=EB=A6=AC?= =?UTF-8?q?=ED=95=B4=EB=B3=B4=EA=B2=A0=EC=8A=B5=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/main.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/BE/src/main.ts b/BE/src/main.ts index f76bc8d..9ea6d5b 100644 --- a/BE/src/main.ts +++ b/BE/src/main.ts @@ -1,8 +1,21 @@ import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; +import { ValidationPipe } from '@nestjs/common'; async function bootstrap() { const app = await NestFactory.create(AppModule); + + app.useGlobalPipes( + new ValidationPipe({ + transform: true, + transformOptions: { + enableImplicitConversion: true, + }, + whitelist: true, // DTO에 정의되지 않은 속성 제거 + forbidNonWhitelisted: true, // DTO 외 속성 들어오면 400 Bad Request + }), + ); + await app.listen(process.env.PORT ?? 3000); } bootstrap(); From 07e48312387f6cd01367fb7462f004f34237ae93 Mon Sep 17 00:00:00 2001 From: LimSR12 Date: Thu, 18 Dec 2025 11:24:23 +0900 Subject: [PATCH 4/8] =?UTF-8?q?feat:=20blog/=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/blog/blog.controller.ts | 6 ++++++ BE/src/blog/blog.module.ts | 10 ++++++++++ BE/src/blog/blog.service.ts | 6 ++++++ 3 files changed, 22 insertions(+) diff --git a/BE/src/blog/blog.controller.ts b/BE/src/blog/blog.controller.ts index e69de29..758360a 100644 --- a/BE/src/blog/blog.controller.ts +++ b/BE/src/blog/blog.controller.ts @@ -0,0 +1,6 @@ +import { Controller } from '@nestjs/common'; + +@Controller('/api/blogs') +export class BlogController { + constructor() {} +} diff --git a/BE/src/blog/blog.module.ts b/BE/src/blog/blog.module.ts index e69de29..684a892 100644 --- a/BE/src/blog/blog.module.ts +++ b/BE/src/blog/blog.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { BlogController } from './blog.controller'; +import { BlogsService } from './blog.service'; + +@Module({ + imports: [], + controllers: [BlogController], + providers: [BlogsService], +}) +export class BlogModule {} diff --git a/BE/src/blog/blog.service.ts b/BE/src/blog/blog.service.ts index e69de29..895a0e5 100644 --- a/BE/src/blog/blog.service.ts +++ b/BE/src/blog/blog.service.ts @@ -0,0 +1,6 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class BlogService { + constructor() {} +} From a1746e46b75e325dbc0ba5d94ced2db8bff9d77b Mon Sep 17 00:00:00 2001 From: LimSR12 Date: Thu, 18 Dec 2025 12:06:47 +0900 Subject: [PATCH 5/8] =?UTF-8?q?feat:=20get,=20create,=20update=20DTO=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20-=20get=20=EC=9A=94=EC=B2=AD=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20DTO=EB=8A=94=20=EC=BF=BC=EB=A6=AC=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=EC=9A=A9=EC=9C=BC=EB=A1=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=ED=96=88=EB=8A=94=EB=8D=B0,=20=EA=B4=9C=EC=B0=AE?= =?UTF-8?q?=EC=9D=80=20=EB=B0=A9=EB=B2=95=EC=9D=B8=EC=A7=80=20=EC=95=84?= =?UTF-8?q?=EC=A7=81=20=EA=B0=90=EC=9D=B4=20=EC=95=88=EC=99=80=EC=84=9C=20?= =?UTF-8?q?=EC=B6=94=ED=9B=84=20=EC=88=98=EC=A0=95=ED=95=A0=20=EC=88=98?= =?UTF-8?q?=EB=8F=84=20=EC=9E=88=EC=9D=84=20=EA=B2=83=20=EA=B0=99=EC=8A=B5?= =?UTF-8?q?=EB=8B=88=EB=8B=A4.=20-=20create=20DTO=20=EB=8A=94=20ERD=20?= =?UTF-8?q?=EC=99=80=20API=20=EC=84=A4=EA=B3=84=EB=A5=BC=20=EB=B0=94?= =?UTF-8?q?=ED=83=95=EC=9C=BC=EB=A1=9C=20=EC=83=9D=EC=84=B1=ED=96=88?= =?UTF-8?q?=EA=B3=A0,=20update=20DTO=20=EB=8A=94=20Partial=20Type=20?= =?UTF-8?q?=EC=9D=84=20=EC=82=AC=EC=9A=A9=ED=95=B4=EC=84=9C=20optional=20?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=ED=99=98=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=ED=96=88=EC=8A=B5=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/project/dto/create-project.dto.ts | 68 +++++++++++++++++++++ BE/src/project/dto/get-project.query.dto.ts | 11 ++++ BE/src/project/dto/update-project.dto.ts | 4 ++ 3 files changed, 83 insertions(+) create mode 100644 BE/src/project/dto/create-project.dto.ts create mode 100644 BE/src/project/dto/get-project.query.dto.ts create mode 100644 BE/src/project/dto/update-project.dto.ts diff --git a/BE/src/project/dto/create-project.dto.ts b/BE/src/project/dto/create-project.dto.ts new file mode 100644 index 0000000..7613bf6 --- /dev/null +++ b/BE/src/project/dto/create-project.dto.ts @@ -0,0 +1,68 @@ +import { Type } from 'class-transformer'; +import { + IsArray, + IsDateString, + IsInt, + IsOptional, + IsString, + IsUrl, + MaxLength, + ValidateNested, +} from 'class-validator'; + +class ProjectMemberDto { + @IsString() + @MaxLength(255) + nickname: string; + + @IsOptional() + @IsUrl() + avatarUrl?: string; +} + +export class CreateProjectDto { + @IsOptional() + @IsUrl() + thumbnailUrl?: string; + + @IsString() + @MaxLength(255) + title: string; // required + + @IsOptional() + @IsString() + description?: string; + + @IsOptional() + @IsString() + summary?: string; + + @IsOptional() + @IsString() + contents?: string; + + @IsUrl() + repositoryUrl: string; // required + + @IsOptional() + @IsUrl() + demoUrl?: string; + + @IsOptional() + @IsInt() + cohort?: number; + + @IsOptional() + @IsDateString() + startDate?: string; // YYYY-MM-DD + + @IsOptional() + @IsDateString() + endDate?: string; // YYYY-MM-DD + + @IsOptional() + @IsArray() + @ValidateNested({ each: true }) + @Type(() => ProjectMemberDto) + members?: ProjectMemberDto[]; +} diff --git a/BE/src/project/dto/get-project.query.dto.ts b/BE/src/project/dto/get-project.query.dto.ts new file mode 100644 index 0000000..4fb9cdf --- /dev/null +++ b/BE/src/project/dto/get-project.query.dto.ts @@ -0,0 +1,11 @@ +import { IsInt, IsOptional, IsString } from 'class-validator'; + +export class GetProjectQueryDto { + @IsOptional() + @IsString({ each: true }) + stack?: string[]; + + @IsOptional() + @IsInt() + cohort?: number; +} diff --git a/BE/src/project/dto/update-project.dto.ts b/BE/src/project/dto/update-project.dto.ts new file mode 100644 index 0000000..1d7791f --- /dev/null +++ b/BE/src/project/dto/update-project.dto.ts @@ -0,0 +1,4 @@ +import { PartialType } from '@nestjs/mapped-types'; +import { CreateProjectDto } from './create-project.dto'; + +export class UpdateProjectDto extends PartialType(CreateProjectDto) {} From 0b0187dcb62a2787cd07fb7826a684d07abb0591 Mon Sep 17 00:00:00 2001 From: LimSR12 Date: Thu, 18 Dec 2025 12:07:41 +0900 Subject: [PATCH 6/8] =?UTF-8?q?chore:=20PartialType=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=EC=9D=84=20=EC=9C=84=ED=95=B4=20mapped-types=20=EC=84=A4?= =?UTF-8?q?=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/package-lock.json | 21 +++++++++++++++++++++ BE/package.json | 1 + 2 files changed, 22 insertions(+) diff --git a/BE/package-lock.json b/BE/package-lock.json index d6326e6..391a320 100644 --- a/BE/package-lock.json +++ b/BE/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "@nestjs/common": "^11.0.1", "@nestjs/core": "^11.0.1", + "@nestjs/mapped-types": "^2.1.0", "@nestjs/platform-express": "^11.0.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.3", @@ -2200,6 +2201,26 @@ } } }, + "node_modules/@nestjs/mapped-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nestjs/mapped-types/-/mapped-types-2.1.0.tgz", + "integrity": "sha512-W+n+rM69XsFdwORF11UqJahn4J3xi4g/ZEOlJNL6KoW5ygWSmBB2p0S2BZ4FQeS/NDH72e6xIcu35SfJnE8bXw==", + "license": "MIT", + "peerDependencies": { + "@nestjs/common": "^10.0.0 || ^11.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/platform-express": { "version": "11.1.9", "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-11.1.9.tgz", diff --git a/BE/package.json b/BE/package.json index 970d888..46ed79d 100644 --- a/BE/package.json +++ b/BE/package.json @@ -22,6 +22,7 @@ "dependencies": { "@nestjs/common": "^11.0.1", "@nestjs/core": "^11.0.1", + "@nestjs/mapped-types": "^2.1.0", "@nestjs/platform-express": "^11.0.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.3", From 749feab21a6b6a2271c049c6dd3aa97a6b52a7f1 Mon Sep 17 00:00:00 2001 From: LimSR12 Date: Thu, 18 Dec 2025 12:10:53 +0900 Subject: [PATCH 7/8] =?UTF-8?q?feat:=20project/=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=B4=88=EC=95=88=20=EC=9E=91=EC=84=B1=20?= =?UTF-8?q?-=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=EC=97=90=20ResponseMes?= =?UTF-8?q?sage()=20=EB=8D=B0=EC=BD=94=EB=A0=88=EC=9D=B4=ED=84=B0=EB=8A=94?= =?UTF-8?q?=20=EC=96=B4=EC=A0=9C=20=ED=9A=8C=EC=9D=98=EA=B0=84=20=EB=A7=90?= =?UTF-8?q?=EC=94=80=EB=93=9C=EB=A0=B8=EB=8D=98=20=EC=9D=91=EB=8B=B5?= =?UTF-8?q?=EC=9D=98=20message=20=ED=95=84=EB=93=9C=EC=9D=98=20=EB=AC=B8?= =?UTF-8?q?=EC=9E=90=EC=97=B4=20=EA=B4=80=EB=A0=A8=ED=95=B4=EC=84=9C,=20?= =?UTF-8?q?=EC=9D=B4=EB=9F=B0=20=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=ED=95=98=EB=A9=B4=20=EB=90=A0=20=EA=B2=83=20=EA=B0=99?= =?UTF-8?q?=EC=95=84=20=EC=A3=BC=EC=84=9D=EC=B2=98=EB=A6=AC=ED=95=B4?= =?UTF-8?q?=EC=84=9C=20=EB=84=A3=EC=96=B4=EB=91=90=EC=97=88=EC=8A=B5?= =?UTF-8?q?=EB=8B=88=EB=8B=A4.=20-=20=EC=84=9C=EB=B9=84=EC=8A=A4=EC=97=90?= =?UTF-8?q?=20prisma=20=EC=84=9C=EB=B9=84=EC=8A=A4=EB=8A=94=20=EC=95=84?= =?UTF-8?q?=EC=A7=81=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=A3=BC=EC=9E=85=20?= =?UTF-8?q?=EC=A0=84=EC=9D=B4=EB=9D=BC,=20=ED=94=84=EB=A6=AC=EC=A6=88?= =?UTF-8?q?=EB=A7=88=20=EC=84=B8=ED=8C=85=20=EB=A8=B8=EC=A7=80=20=ED=9B=84?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=ED=95=98=EB=A9=B4=20=EB=90=A0=20=EA=B2=83?= =?UTF-8?q?=20=EA=B0=99=EC=8A=B5=EB=8B=88=EB=8B=A4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/project/project.controller.ts | 51 ++++++++++++++++++++++++++++ BE/src/project/project.module.ts | 10 ++++++ BE/src/project/project.service.ts | 20 +++++++++++ 3 files changed, 81 insertions(+) diff --git a/BE/src/project/project.controller.ts b/BE/src/project/project.controller.ts index e69de29..15a3c88 100644 --- a/BE/src/project/project.controller.ts +++ b/BE/src/project/project.controller.ts @@ -0,0 +1,51 @@ +import { + Body, + Controller, + Delete, + Get, + Param, + ParseIntPipe, + Patch, + Post, + Query, +} from '@nestjs/common'; +import { ProjectsService } from './project.service'; +import { GetProjectQueryDto } from './dto/get-project.query.dto'; +import { CreateProjectDto } from './dto/create-project.dto'; +import { UpdateProjectDto } from './dto/update-project.dto'; +// import { ResponseMessage } from '../core/response/response-message.decorator'; + +@Controller('/api/projects') +export class ProjectsController { + constructor(private readonly projectsService: ProjectsService) {} + + @Get() + // @ResponseMessage('프로젝트 목록 조회 성공') + findAll(@Query() query: GetProjectQueryDto) { + return this.projectsService.findAll(query); + } + + @Get(':id') + // @ResponseMessage('프로젝트 상세 조회 성공') + findOne(@Param('id', ParseIntPipe) id: number) { + return this.projectsService.findOne(id); + } + + @Post() + // @ResponseMessage('프로젝트 생성 성공') + create(@Body() dto: CreateProjectDto) { + return this.projectsService.create(dto); + } + + @Patch(':id') + // @ResponseMessage('프로젝트 수정 성공') + update(@Param('id', ParseIntPipe) id: number, @Body() dto: UpdateProjectDto) { + return this.projectsService.update(id, dto); + } + + @Delete(':id') + // @ResponseMessage('프로젝트 삭제 성공') + remove(@Param('id', ParseIntPipe) id: number) { + return this.projectsService.remove(id); + } +} diff --git a/BE/src/project/project.module.ts b/BE/src/project/project.module.ts index e69de29..3e1fd8b 100644 --- a/BE/src/project/project.module.ts +++ b/BE/src/project/project.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { ProjectsController } from './project.controller'; +import { ProjectsService } from './project.service'; + +@Module({ + imports: [], + controllers: [ProjectsController], + providers: [ProjectsService], +}) +export class ProjectModule {} diff --git a/BE/src/project/project.service.ts b/BE/src/project/project.service.ts index e69de29..6c272ab 100644 --- a/BE/src/project/project.service.ts +++ b/BE/src/project/project.service.ts @@ -0,0 +1,20 @@ +import { Injectable } from '@nestjs/common'; +// import { PrismaService } from '../prisma/prisma.service'; +import { CreateProjectDto } from './dto/create-project.dto'; +import { GetProjectQueryDto } from './dto/get-project.query.dto'; +import { UpdateProjectDto } from './dto/update-project.dto'; + +@Injectable() +export class ProjectsService { + constructor() {} + + async findAll(query: GetProjectQueryDto) {} + + async findOne(id: number) {} + + async create(dto: CreateProjectDto) {} + + async update(id: number, dto: UpdateProjectDto) {} + + async remove(id: number) {} +} From a9882b5af71327edc45d5711f677bf4051fddf3d Mon Sep 17 00:00:00 2001 From: LimSR12 Date: Thu, 18 Dec 2025 12:11:31 +0900 Subject: [PATCH 8/8] =?UTF-8?q?feat:=20app.module=20=EC=97=90=20project,?= =?UTF-8?q?=20blog=20=EB=AA=A8=EB=93=88=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- BE/src/app.module.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/BE/src/app.module.ts b/BE/src/app.module.ts index 8662803..21b2541 100644 --- a/BE/src/app.module.ts +++ b/BE/src/app.module.ts @@ -1,9 +1,11 @@ import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; +import { ProjectModule } from './project/project.module'; +import { BlogModule } from './blog/blog.module'; @Module({ - imports: [], + imports: [ProjectModule, BlogModule], controllers: [AppController], providers: [AppService], })