Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 17 additions & 8 deletions server/src/comment/controller/comment.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,21 @@ import {
Param,
Patch,
Post,
Req,
UseGuards,
} from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
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')
Expand All @@ -43,26 +43,35 @@ 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('댓글 등록을 성공했습니다.');
}

@ApiDeleteComment()
@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('댓글 삭제를 성공했습니다.');
}

@ApiUpdateComment()
@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('댓글 수정을 성공했습니다.');
}
}
9 changes: 9 additions & 0 deletions server/src/common/decorator/current-user.decorator.ts
Original file line number Diff line number Diff line change
@@ -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;
},
);
1 change: 1 addition & 0 deletions server/src/common/decorator/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './current-user.decorator';
8 changes: 4 additions & 4 deletions server/src/file/controller/file.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import {
Delete,
UseInterceptors,
UploadedFile,
Req,
Param,
UseGuards,
BadRequestException,
Expand All @@ -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')
Expand All @@ -36,15 +36,15 @@ export class FileController {
async upload(
@UploadedFile() file: any,
@Query() query: UploadFileQueryDto,
@Req() req,
@CurrentUser() user: Payload,
) {
if (!file) {
throw new BadRequestException('파일이 선택되지 않았습니다.');
}

return ApiResponse.responseWithData(
'파일 업로드에 성공했습니다.',
await this.fileService.create(file, Number.parseInt(req.user.id)),
await this.fileService.create(file, user.id),
Copy link

Copilot AI Oct 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The user.id is of type number according to the Payload type definition. However, the old code used Number.parseInt(req.user.id), suggesting that user.id might be a string at runtime. If user.id is actually a string in the JWT payload, this could cause a type mismatch when calling fileService.create() which expects a number. Verify that the JWT payload parsing correctly converts the ID to a number, or add explicit type conversion here.

Suggested change
await this.fileService.create(file, user.id),
await this.fileService.create(file, Number(user.id)),

Copilot uses AI. Check for mistakes.
);
}

Expand Down
25 changes: 17 additions & 8 deletions server/src/like/controller/like.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -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')
Expand All @@ -30,28 +30,37 @@ 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),
);
}

@ApiCreateLike()
@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('좋아요 등록을 성공했습니다.');
}

@ApiDeleteLike()
@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('좋아요 삭제를 성공했습니다.');
}
}
5 changes: 4 additions & 1 deletion server/src/like/service/like.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
16 changes: 9 additions & 7 deletions server/src/user/controller/user.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import {
Patch,
Post,
Query,
Req,
Res,
UseGuards,
} from '@nestjs/common';
Expand All @@ -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';
Expand All @@ -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')
Expand Down Expand Up @@ -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),
);
}

Expand All @@ -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(
'사용자 프로필 정보가 성공적으로 수정되었습니다.',
);
Expand Down
Loading