Skip to content

Commit 2d276cd

Browse files
committed
♻️ refactor: /feed/detail/:feedId 에서 좋아요 API 별도 분리
1 parent 1d086f1 commit 2d276cd

File tree

5 files changed

+97
-4
lines changed

5 files changed

+97
-4
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { applyDecorators } from '@nestjs/common';
2+
import {
3+
ApiBadRequestResponse,
4+
ApiNotFoundResponse,
5+
ApiOkResponse,
6+
ApiOperation,
7+
} from '@nestjs/swagger';
8+
9+
export function ApiGetLike() {
10+
return applyDecorators(
11+
ApiOperation({
12+
summary: '게시글 좋아요 조회 API',
13+
}),
14+
ApiOkResponse({
15+
description: 'Ok',
16+
schema: {
17+
properties: {
18+
message: {
19+
type: 'string',
20+
},
21+
data: {
22+
type: 'object',
23+
properties: {
24+
isLike: {
25+
type: 'boolean',
26+
},
27+
},
28+
},
29+
},
30+
},
31+
example: {
32+
message: '좋아요 조회를 성공했습니다.',
33+
data: {
34+
isLike: false,
35+
},
36+
},
37+
}),
38+
ApiBadRequestResponse({
39+
description: 'Bad Request',
40+
example: {
41+
message: '오류 메세지',
42+
},
43+
}),
44+
ApiNotFoundResponse({
45+
description: '해당 ID의 게시글이 존재하지 않는 경우',
46+
example: {
47+
message: '해당 피드를 찾을 수 없습니다.',
48+
},
49+
}),
50+
);
51+
}

server/src/like/controller/like.controller.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ import {
22
Body,
33
Controller,
44
Delete,
5+
Get,
56
HttpCode,
67
HttpStatus,
78
Param,
89
Post,
910
Req,
1011
UseGuards,
12+
UseInterceptors,
1113
} from '@nestjs/common';
1214
import { JwtGuard } from '../../common/guard/jwt.guard';
1315
import { ApiResponse } from '../../common/response/common.response';
@@ -16,15 +18,28 @@ import { ApiTags } from '@nestjs/swagger';
1618
import { ApiCreateLike } from '../api-docs/createLike.api-docs';
1719
import { ApiDeleteLike } from '../api-docs/deleteLike.api-docs';
1820
import { FeedLikeRequestDto } from '../dto/request/like.dto';
21+
import { ApiGetLike } from '../api-docs/getLike.api-docs';
22+
import { InjectUserInterceptor } from '../../common/auth/jwt.interceptor';
1923

2024
@ApiTags('Like')
2125
@Controller('like')
22-
@UseGuards(JwtGuard)
2326
export class LikeController {
2427
constructor(private readonly likeService: LikeService) {}
2528

29+
@ApiGetLike()
30+
@Get('/:feedId')
31+
@HttpCode(HttpStatus.OK)
32+
@UseInterceptors(InjectUserInterceptor)
33+
async getLike(@Req() req, @Param() feedLikeDto: FeedLikeRequestDto) {
34+
return ApiResponse.responseWithData(
35+
'좋아요 조회를 성공했습니다.',
36+
await this.likeService.get(req.user, feedLikeDto),
37+
);
38+
}
39+
2640
@ApiCreateLike()
2741
@Post()
42+
@UseGuards(JwtGuard)
2843
@HttpCode(HttpStatus.CREATED)
2944
async createLike(@Req() req, @Body() feedLikeDto: FeedLikeRequestDto) {
3045
await this.likeService.create(req.user, feedLikeDto);
@@ -33,6 +48,7 @@ export class LikeController {
3348

3449
@ApiDeleteLike()
3550
@Delete('/:feedId')
51+
@UseGuards(JwtGuard)
3652
@HttpCode(HttpStatus.OK)
3753
async deleteLike(@Req() req, @Param() feedLikeDto: FeedLikeRequestDto) {
3854
await this.likeService.delete(req.user, feedLikeDto);

server/src/like/dto/request/like.dto.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { IsInt, Min } from 'class-validator';
55
export class FeedLikeRequestDto {
66
@ApiProperty({
77
example: 1,
8-
description: '좋아요 등록 및 취소할 피드 ID 입력',
8+
description: '좋아요 등록 및 취소, 조회할 피드 ID 입력',
99
})
1010
@IsInt({
1111
message: '정수를 입력해주세요.',

server/src/like/module/like.module.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ import { LikeController } from '../controller/like.controller';
33
import { LikeService } from '../service/like.service';
44
import { LikeRepository } from '../repository/like.repository';
55
import { FeedModule } from '../../feed/module/feed.module';
6+
import { InjectUserInterceptor } from '../../common/auth/jwt.interceptor';
7+
import { JwtAuthModule } from '../../common/auth/jwt.module';
68

79
@Module({
8-
imports: [forwardRef(() => FeedModule)],
10+
imports: [forwardRef(() => FeedModule), JwtAuthModule],
911
controllers: [LikeController],
10-
providers: [LikeService, LikeRepository],
12+
providers: [LikeService, LikeRepository, InjectUserInterceptor],
1113
exports: [LikeRepository],
1214
})
1315
export class LikeModule {}

server/src/like/service/like.service.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,30 @@ export class LikeService {
1818
private readonly dataSource: DataSource,
1919
) {}
2020

21+
async get(userInformation: Payload, feedLikeGetDto: FeedLikeRequestDto) {
22+
const feed = await this.feedRepository.findOneBy({
23+
id: feedLikeGetDto.feedId,
24+
});
25+
26+
if (!feed) {
27+
throw new NotFoundException('해당 피드를 찾을 수 없습니다.');
28+
}
29+
30+
let isLike = false;
31+
32+
if (userInformation) {
33+
const like = await this.likeRepository.findOneBy({
34+
user: { id: userInformation.id },
35+
feed: { id: feedLikeGetDto.feedId },
36+
});
37+
isLike = !!like;
38+
}
39+
40+
return {
41+
isLike,
42+
};
43+
}
44+
2145
async create(
2246
userInformation: Payload,
2347
feedLikeCreateDto: FeedLikeRequestDto,

0 commit comments

Comments
 (0)