Skip to content

Commit 1ea5ea8

Browse files
authored
Merge pull request #528 from projects200/feat/comment/post-like
[FEAT] 좋아요 댓글 API 개발
2 parents ea3df69 + de072c2 commit 1ea5ea8

File tree

14 files changed

+636
-1
lines changed

14 files changed

+636
-1
lines changed

src/docs/asciidoc/index.adoc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,4 +266,8 @@ include::overview/공통-개발-참고-사항.adoc[]
266266

267267
- 특정 피드에 댓글 작성 API #POST# `/api/v1/feeds/{feedId}/comments`
268268

269-
- 댓글 삭제 API #DELETE# `/api/v1/comments/{commentId}`
269+
- 댓글 삭제 API #DELETE# `/api/v1/comments/{commentId}`
270+
271+
=== xref:좋아요-API.html[좋아요 API]
272+
273+
- 특정 댓글의 좋아요 작성 API #POST# `/api/v1/comments/{commentId}/like`
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
== 특정 댓글의 좋아요 작성 API
2+
3+
=== 설명
4+
5+
- #POST# `/api/v1/comments/{commentId}/like`
6+
- 특정 댓글에 좋아요를 하거나 취소하는 API 입니다.
7+
- `status` 필드가 `true`이면 좋아요, `false`이면 좋아요 취소입니다.
8+
9+
=== 개발 이력
10+
11+
- Sprint 24 (2026-02-04): 기능 개발이 완료되었습니다.
12+
13+
=== 개발 참고 사항
14+
15+
- <<공통-개발-참고-사항,공통 개발 참고 사항>>을 참고하세요.
16+
17+
=== 코드 샘플
18+
19+
operation::create-comment-like/create-comment-like_success[snippets="curl-request,http-request,http-response"]
20+
21+
=== 매개 변수
22+
23+
operation::create-comment-like/create-comment-like_success[snippets="request-headers,path-parameters,request-fields,response-fields"]
24+
25+
==== 응답 상태 코드
26+
27+
|===
28+
|상태 코드|설명
29+
|201|리소스가 성공적으로 생성되었습니다. (좋아요 성공/취소 모두 성공 응답)
30+
|401|인증되지 않은 요청입니다. Access Token이 없거나 유효하지 않습니다.
31+
|404|존재하지 않는 댓글입니다.
32+
|===
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
= 좋아요 API
2+
:doctype: book
3+
:source-highlighter: highlightjs
4+
:toc: left
5+
:toclevels: 3
6+
:seclinks:
7+
8+
:operation-request-headers-title: 요청 헤더
9+
:operation-path-parameters-title: 경로 매개 변수
10+
:operation-request-parts-title: 요청 파트(Form Data)
11+
:operation-request-fields-title: 요청 필드
12+
:operation-response-fields-title: 응답 필드
13+
:operation-curl-request-title: Curl 요청 예시
14+
:operation-http-request-title: HTTP 요청 예시
15+
:operation-http-response-title: HTTP 응답 예시
16+
17+
[[공통-개발-참고-사항]]
18+
== 공통 개발 참고 사항
19+
20+
include::overview/공통-개발-참고-사항.adoc[]
21+
22+
include::like/특정-댓글의-좋아요-작성-API.adoc[]

src/main/java/com/project200/undabang/comment/entity/Comment.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,16 @@ public boolean isDeleted() {
7070
return this.deletedAt != null;
7171
}
7272

73+
public void incrementLikesCount() {
74+
this.likesCount++;
75+
}
76+
77+
public void decrementLikesCount() {
78+
if (this.likesCount > 0) {
79+
this.likesCount--;
80+
}
81+
}
82+
7383
public static Comment create(Member member, Feed feed, Comment parent, CreateCommentRequest request) {
7484
return Comment.builder()
7585
.member(member)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.project200.undabang.like.controller;
2+
3+
import com.project200.undabang.common.web.response.CommonResponse;
4+
import com.project200.undabang.like.dto.request.CreateCommentLikeRequest;
5+
import com.project200.undabang.like.dto.response.CreateCommentLikeResponse;
6+
import com.project200.undabang.like.service.impl.CommentCommandLikeServiceImpl;
7+
import jakarta.validation.Valid;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.http.HttpStatus;
10+
import org.springframework.http.ResponseEntity;
11+
import org.springframework.web.bind.annotation.*;
12+
13+
@RestController
14+
@RequiredArgsConstructor
15+
@RequestMapping("/api")
16+
public class CommentLikeCommandController {
17+
18+
private final CommentCommandLikeServiceImpl commentCommandLikeService;
19+
20+
@PostMapping("/v1/comments/{commentId}/like")
21+
public ResponseEntity<CommonResponse<CreateCommentLikeResponse>> createCommentLike(@PathVariable Long commentId,
22+
@Valid @RequestBody CreateCommentLikeRequest request) {
23+
return ResponseEntity.status(HttpStatus.CREATED)
24+
.body(CommonResponse.create(commentCommandLikeService.createCommentLike(commentId, request)));
25+
26+
}
27+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.project200.undabang.like.dto.request;
2+
3+
import jakarta.validation.constraints.NotNull;
4+
5+
public record CreateCommentLikeRequest(
6+
@NotNull(message = "좋아요 여부는 필수 값입니다.")
7+
Boolean liked) {
8+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.project200.undabang.like.dto.response;
2+
3+
public record CreateCommentLikeResponse(
4+
Boolean liked,
5+
Integer likesCount) {
6+
}

src/main/java/com/project200/undabang/like/entity/CommentLike.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,11 @@ public class CommentLike {
3535
@Builder.Default
3636
@Column(name = "comment_like_created_at", nullable = false, updatable = false)
3737
private LocalDateTime createdAt = LocalDateTime.now();
38+
39+
public static CommentLike create(Comment comment, Member member) {
40+
return CommentLike.builder()
41+
.comment(comment)
42+
.member(member)
43+
.build();
44+
}
3845
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
package com.project200.undabang.like.repository;
22

3+
import com.project200.undabang.comment.entity.Comment;
34
import com.project200.undabang.like.entity.CommentLike;
5+
import com.project200.undabang.member.entity.Member;
46
import org.springframework.data.jpa.repository.JpaRepository;
57

8+
import java.util.Optional;
9+
610
public interface CommentLikeRepository extends JpaRepository<CommentLike, Long> {
11+
Optional<CommentLike> findByCommentAndMember(Comment comment, Member member);
712
}
13+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.project200.undabang.like.service;
2+
3+
import com.project200.undabang.like.dto.request.CreateCommentLikeRequest;
4+
import com.project200.undabang.like.dto.response.CreateCommentLikeResponse;
5+
6+
public interface CommentCommandLikeService {
7+
8+
CreateCommentLikeResponse createCommentLike(Long CommentId, CreateCommentLikeRequest request);
9+
}

0 commit comments

Comments
 (0)