From d8f017f672982dd2541d3dccadb8c2e89be03232 Mon Sep 17 00:00:00 2001 From: DinoDeveloper Date: Wed, 29 Oct 2025 20:29:37 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=E2=9C=A8=20feat:=20payload=20=EC=A0=91?= =?UTF-8?q?=EA=B7=BC=EC=8B=9C=20=EC=82=AC=EC=9A=A9=ED=95=A0=20=EB=8D=B0?= =?UTF-8?q?=EC=BD=94=EB=A0=88=EC=9D=B4=ED=84=B0=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/src/common/decorator/current-user.decorator.ts | 9 +++++++++ server/src/common/decorator/index.ts | 1 + 2 files changed, 10 insertions(+) create mode 100644 server/src/common/decorator/current-user.decorator.ts create mode 100644 server/src/common/decorator/index.ts diff --git a/server/src/common/decorator/current-user.decorator.ts b/server/src/common/decorator/current-user.decorator.ts new file mode 100644 index 00000000..d251650a --- /dev/null +++ b/server/src/common/decorator/current-user.decorator.ts @@ -0,0 +1,9 @@ +import { createParamDecorator, ExecutionContext } from '@nestjs/common'; +import { Payload } from '../guard/jwt.guard'; + +export const CurrentUser = createParamDecorator( + (data: unknown, ctx: ExecutionContext): Payload | null => { + const request = ctx.switchToHttp().getRequest(); + return request.user; + }, +); diff --git a/server/src/common/decorator/index.ts b/server/src/common/decorator/index.ts new file mode 100644 index 00000000..67e74a52 --- /dev/null +++ b/server/src/common/decorator/index.ts @@ -0,0 +1 @@ +export * from './current-user.decorator'; From 8797d1c09a2ba49840a26995eab08a19f4cbeec4 Mon Sep 17 00:00:00 2001 From: DinoDeveloper Date: Thu, 30 Oct 2025 11:32:50 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor:=20=EC=9D=B8?= =?UTF-8?q?=EC=A6=9D=20payload=20=EC=82=AC=EC=9A=A9=20=EB=B0=A9=EB=B2=95?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../comment/controller/comment.controller.ts | 25 +++++++++++++------ server/src/file/controller/file.controller.ts | 8 +++--- server/src/like/controller/like.controller.ts | 25 +++++++++++++------ server/src/like/service/like.service.ts | 5 +++- server/src/user/controller/user.controller.ts | 16 ++++++------ 5 files changed, 51 insertions(+), 28 deletions(-) diff --git a/server/src/comment/controller/comment.controller.ts b/server/src/comment/controller/comment.controller.ts index e9491166..8f567924 100644 --- a/server/src/comment/controller/comment.controller.ts +++ b/server/src/comment/controller/comment.controller.ts @@ -8,7 +8,6 @@ import { Param, Patch, Post, - Req, UseGuards, } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; @@ -16,13 +15,14 @@ import { CommentService } from '../service/comment.service'; import { ApiCreateComment } from '../api-docs/createComment.api-docs'; import { ApiDeleteComment } from '../api-docs/deleteComment.api-docs'; import { ApiUpdateComment } from '../api-docs/updateComment.api-docs'; -import { JwtGuard } from '../../common/guard/jwt.guard'; +import { JwtGuard, Payload } from '../../common/guard/jwt.guard'; import { ApiResponse } from '../../common/response/common.response'; import { CreateCommentRequestDto } from '../dto/request/createComment.dto'; import { DeleteCommentRequestDto } from '../dto/request/deleteComment.dto'; import { UpdateCommentRequestDto } from '../dto/request/updateComment.dto'; import { GetCommentRequestDto } from '../dto/request/getComment.dto'; import { ApiGetComment } from '../api-docs/getComment.api-docs'; +import { CurrentUser } from '../../common/decorator'; @ApiTags('Comment') @Controller('comment') @@ -43,8 +43,11 @@ export class CommentController { @Post() @UseGuards(JwtGuard) @HttpCode(HttpStatus.CREATED) - async createComment(@Req() req, @Body() commentDto: CreateCommentRequestDto) { - await this.commentService.create(req.user, commentDto); + async createComment( + @CurrentUser() user: Payload, + @Body() commentDto: CreateCommentRequestDto, + ) { + await this.commentService.create(user, commentDto); return ApiResponse.responseWithNoContent('댓글 등록을 성공했습니다.'); } @@ -52,8 +55,11 @@ export class CommentController { @Delete() @UseGuards(JwtGuard) @HttpCode(HttpStatus.OK) - async deleteComment(@Req() req, @Body() commentDto: DeleteCommentRequestDto) { - await this.commentService.delete(req.user, commentDto); + async deleteComment( + @CurrentUser() user: Payload, + @Body() commentDto: DeleteCommentRequestDto, + ) { + await this.commentService.delete(user, commentDto); return ApiResponse.responseWithNoContent('댓글 삭제를 성공했습니다.'); } @@ -61,8 +67,11 @@ export class CommentController { @Patch() @UseGuards(JwtGuard) @HttpCode(HttpStatus.OK) - async updateComment(@Req() req, @Body() commentDto: UpdateCommentRequestDto) { - await this.commentService.update(req.user, commentDto); + async updateComment( + @CurrentUser() user: Payload, + @Body() commentDto: UpdateCommentRequestDto, + ) { + await this.commentService.update(user, commentDto); return ApiResponse.responseWithNoContent('댓글 수정을 성공했습니다.'); } } diff --git a/server/src/file/controller/file.controller.ts b/server/src/file/controller/file.controller.ts index 0cfe29d3..f6fef631 100644 --- a/server/src/file/controller/file.controller.ts +++ b/server/src/file/controller/file.controller.ts @@ -4,7 +4,6 @@ import { Delete, UseInterceptors, UploadedFile, - Req, Param, UseGuards, BadRequestException, @@ -15,13 +14,14 @@ import { import { FileInterceptor } from '@nestjs/platform-express'; import { FileService } from '../service/file.service'; import { ApiTags } from '@nestjs/swagger'; -import { JwtGuard } from '../../common/guard/jwt.guard'; +import { JwtGuard, Payload } from '../../common/guard/jwt.guard'; import { createDynamicStorage } from '../../common/disk/diskStorage'; import { ApiResponse } from '../../common/response/common.response'; import { ApiUploadProfileFile } from '../api-docs/uploadProfileFile.api-docs'; import { ApiDeleteFile } from '../api-docs/deleteFile.api-docs'; import { DeleteFileRequestDto } from '../dto/request/deleteFile.dto'; import { UploadFileQueryDto } from '../dto/request/uploadFile.dto'; +import { CurrentUser } from '../../common/decorator'; @ApiTags('File') @Controller('file') @@ -36,7 +36,7 @@ export class FileController { async upload( @UploadedFile() file: any, @Query() query: UploadFileQueryDto, - @Req() req, + @CurrentUser() user: Payload, ) { if (!file) { throw new BadRequestException('파일이 선택되지 않았습니다.'); @@ -44,7 +44,7 @@ export class FileController { return ApiResponse.responseWithData( '파일 업로드에 성공했습니다.', - await this.fileService.create(file, Number.parseInt(req.user.id)), + await this.fileService.create(file, user.id), ); } diff --git a/server/src/like/controller/like.controller.ts b/server/src/like/controller/like.controller.ts index f0c96a78..d3880dcc 100644 --- a/server/src/like/controller/like.controller.ts +++ b/server/src/like/controller/like.controller.ts @@ -7,11 +7,10 @@ import { HttpStatus, Param, Post, - Req, UseGuards, UseInterceptors, } from '@nestjs/common'; -import { JwtGuard } from '../../common/guard/jwt.guard'; +import { JwtGuard, Payload } from '../../common/guard/jwt.guard'; import { ApiResponse } from '../../common/response/common.response'; import { LikeService } from '../service/like.service'; import { ApiTags } from '@nestjs/swagger'; @@ -20,6 +19,7 @@ import { ApiDeleteLike } from '../api-docs/deleteLike.api-docs'; import { ManageLikeRequestDto } from '../dto/request/manageLike.dto'; import { ApiGetLike } from '../api-docs/getLike.api-docs'; import { InjectUserInterceptor } from '../../common/auth/jwt.interceptor'; +import { CurrentUser } from '../../common/decorator'; @ApiTags('Like') @Controller('like') @@ -30,10 +30,13 @@ export class LikeController { @Get('/:feedId') @HttpCode(HttpStatus.OK) @UseInterceptors(InjectUserInterceptor) - async getLike(@Req() req, @Param() feedLikeDto: ManageLikeRequestDto) { + async getLike( + @CurrentUser() user: Payload | null, + @Param() feedLikeDto: ManageLikeRequestDto, + ) { return ApiResponse.responseWithData( '좋아요 조회를 성공했습니다.', - await this.likeService.get(req.user, feedLikeDto), + await this.likeService.get(user, feedLikeDto), ); } @@ -41,8 +44,11 @@ export class LikeController { @Post() @UseGuards(JwtGuard) @HttpCode(HttpStatus.CREATED) - async createLike(@Req() req, @Body() feedLikeDto: ManageLikeRequestDto) { - await this.likeService.create(req.user, feedLikeDto); + async createLike( + @CurrentUser() user: Payload, + @Body() feedLikeDto: ManageLikeRequestDto, + ) { + await this.likeService.create(user, feedLikeDto); return ApiResponse.responseWithNoContent('좋아요 등록을 성공했습니다.'); } @@ -50,8 +56,11 @@ export class LikeController { @Delete('/:feedId') @UseGuards(JwtGuard) @HttpCode(HttpStatus.OK) - async deleteLike(@Req() req, @Param() feedLikeDto: ManageLikeRequestDto) { - await this.likeService.delete(req.user, feedLikeDto); + async deleteLike( + @CurrentUser() user: Payload, + @Param() feedLikeDto: ManageLikeRequestDto, + ) { + await this.likeService.delete(user, feedLikeDto); return ApiResponse.responseWithNoContent('좋아요 삭제를 성공했습니다.'); } } diff --git a/server/src/like/service/like.service.ts b/server/src/like/service/like.service.ts index 8a8299ca..31be33c7 100644 --- a/server/src/like/service/like.service.ts +++ b/server/src/like/service/like.service.ts @@ -19,7 +19,10 @@ export class LikeService { private readonly dataSource: DataSource, ) {} - async get(userInformation: Payload, feedLikeGetDto: ManageLikeRequestDto) { + async get( + userInformation: Payload | null, + feedLikeGetDto: ManageLikeRequestDto, + ) { await this.feedService.getFeed(feedLikeGetDto.feedId); let isLike = false; diff --git a/server/src/user/controller/user.controller.ts b/server/src/user/controller/user.controller.ts index 7a470c7e..008715f9 100644 --- a/server/src/user/controller/user.controller.ts +++ b/server/src/user/controller/user.controller.ts @@ -8,7 +8,6 @@ import { Patch, Post, Query, - Req, Res, UseGuards, } from '@nestjs/common'; @@ -23,7 +22,7 @@ import { CheckEmailDuplicationRequestDto } from '../dto/request/checkEmailDuplic import { LoginUserRequestDto } from '../dto/request/loginUser.dto'; import { Response } from 'express'; import { ApiLoginUser } from '../api-docs/loginUser.api-docs'; -import { JwtGuard, RefreshJwtGuard } from '../../common/guard/jwt.guard'; +import { JwtGuard, Payload, RefreshJwtGuard } from '../../common/guard/jwt.guard'; import { ApiRefreshToken } from '../api-docs/refreshToken.api-docs'; import { ApiLogoutUser } from '../api-docs/logoutUser.api-docs'; import { UpdateUserRequestDto } from '../dto/request/updateUser.dto'; @@ -32,6 +31,7 @@ import { ResetPasswordRequestDto } from '../dto/request/resetPassword.dto'; import { ForgotPasswordRequestDto } from '../dto/request/forgotPassword.dto'; import { ApiForgotPassword } from '../api-docs/forgotPassword.api-docs'; import { ApiResetPassword } from '../api-docs/resetPassword.api-docs'; +import { CurrentUser } from '../../common/decorator'; @ApiTags('User') @Controller('user') @@ -90,11 +90,10 @@ export class UserController { @Post('/refresh-token') @HttpCode(HttpStatus.OK) @UseGuards(RefreshJwtGuard) - async refreshAccessToken(@Req() req) { - const userInformation = req.user; + async refreshAccessToken(@CurrentUser() user: Payload) { return ApiResponse.responseWithData( '엑세스 토큰을 재발급했습니다.', - this.userService.refreshAccessToken(userInformation), + this.userService.refreshAccessToken(user), ); } @@ -111,8 +110,11 @@ export class UserController { @Patch('/profile') @HttpCode(HttpStatus.OK) @UseGuards(JwtGuard) - async updateUser(@Body() updateUserDto: UpdateUserRequestDto, @Req() req) { - await this.userService.updateUser(req.user.id, updateUserDto); + async updateUser( + @Body() updateUserDto: UpdateUserRequestDto, + @CurrentUser() user: Payload, + ) { + await this.userService.updateUser(user.id, updateUserDto); return ApiResponse.responseWithNoContent( '사용자 프로필 정보가 성공적으로 수정되었습니다.', );