Skip to content

Commit a97d94f

Browse files
committed
feat: 좋아요 취소 API 구현
1 parent fe0f0f8 commit a97d94f

File tree

6 files changed

+60
-2
lines changed

6 files changed

+60
-2
lines changed

src/main/java/com/example/log4u/domain/diary/entity/Diary.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,13 @@ public class Diary extends BaseEntity {
4646
@Column(nullable = false)
4747
private Long likeCount;
4848

49-
public Long updateLikeCount() {
49+
public Long incrementLikeCount() {
5050
this.likeCount++;
5151
return this.likeCount;
5252
}
53+
54+
public Long decreaseLikeCount() {
55+
this.likeCount--;
56+
return this.likeCount;
57+
}
5358
}

src/main/java/com/example/log4u/domain/diary/service/DiaryService.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,16 @@ public Diary getDiary(Long diaryId) {
2222

2323
public Long incrementLikeCount(Long diaryId) {
2424
Diary diary = getDiary(diaryId);
25-
return diary.updateLikeCount();
25+
return diary.incrementLikeCount();
26+
}
27+
28+
public Long decreaseLikeCount(Long diaryId) {
29+
Diary diary = getDiary(diaryId);
30+
return diary.decreaseLikeCount();
31+
}
32+
33+
public Long getLikeCount(Long diaryId) {
34+
Diary diary = getDiary(diaryId);
35+
return diary.getLikeCount();
2636
}
2737
}

src/main/java/com/example/log4u/domain/like/controller/LikeController.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package com.example.log4u.domain.like.controller;
22

33
import org.springframework.http.ResponseEntity;
4+
import org.springframework.web.bind.annotation.DeleteMapping;
5+
import org.springframework.web.bind.annotation.PathVariable;
46
import org.springframework.web.bind.annotation.PostMapping;
57
import org.springframework.web.bind.annotation.RequestBody;
68
import org.springframework.web.bind.annotation.RequestMapping;
79
import org.springframework.web.bind.annotation.RestController;
810

911
import com.example.log4u.domain.like.dto.request.LikeAddRequestDto;
1012
import com.example.log4u.domain.like.dto.response.LikeAddResponseDto;
13+
import com.example.log4u.domain.like.dto.response.LikeCancelResponseDto;
1114
import com.example.log4u.domain.like.service.LikeService;
1215

1316
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -29,4 +32,12 @@ public ResponseEntity<LikeAddResponseDto> addLike(@Valid @RequestBody LikeAddReq
2932
LikeAddResponseDto response = likeService.addLike(userId, requestDto);
3033
return ResponseEntity.ok(response);
3134
}
35+
36+
@DeleteMapping("/{diaryId}")
37+
public ResponseEntity<LikeCancelResponseDto> cancelLike(@PathVariable Long diaryId){
38+
Long userId = 1L;// 실제 구현에서는 토큰에서 추출
39+
40+
LikeCancelResponseDto response = likeService.cancelLike(userId, diaryId);
41+
return ResponseEntity.ok(response);
42+
}
3243
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.example.log4u.domain.like.dto.response;
2+
3+
public record LikeCancelResponseDto(
4+
boolean liked,
5+
Long likeCount) {
6+
7+
public static LikeCancelResponseDto of(boolean liked, Long likeCount) {
8+
return new LikeCancelResponseDto(liked, likeCount);
9+
}
10+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package com.example.log4u.domain.like.repository;
22

3+
import java.util.List;
4+
import java.util.Optional;
5+
36
import org.springframework.data.jpa.repository.JpaRepository;
47

58
import com.example.log4u.domain.like.entity.Like;
69

710
public interface LikeRepository extends JpaRepository<Like, Long> {
811
boolean existsByUserIdAndDiaryId(Long userId, Long diaryId);
12+
13+
Optional<Like> findByUserIdAndDiaryId(Long userId, Long diaryId);
914
}

src/main/java/com/example/log4u/domain/like/service/LikeService.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package com.example.log4u.domain.like.service;
22

3+
import java.util.Optional;
4+
35
import org.springframework.stereotype.Service;
46
import org.springframework.transaction.annotation.Transactional;
57

68
import com.example.log4u.domain.diary.service.DiaryService;
79
import com.example.log4u.domain.like.dto.request.LikeAddRequestDto;
810
import com.example.log4u.domain.like.dto.response.LikeAddResponseDto;
11+
import com.example.log4u.domain.like.dto.response.LikeCancelResponseDto;
912
import com.example.log4u.domain.like.entity.Like;
1013
import com.example.log4u.domain.like.exception.DuplicateLikeException;
1114
import com.example.log4u.domain.like.repository.LikeRepository;
@@ -30,6 +33,20 @@ public LikeAddResponseDto addLike(Long userId, LikeAddRequestDto requestDto) {
3033
return LikeAddResponseDto.of(true, likeCount);
3134
}
3235

36+
@Transactional
37+
public LikeCancelResponseDto cancelLike(Long userId, Long diaryId) {
38+
return likeRepository.findByUserIdAndDiaryId(userId, diaryId)
39+
.map(like -> {
40+
likeRepository.delete(like);
41+
Long likeCount = diaryService.decreaseLikeCount(diaryId);
42+
return LikeCancelResponseDto.of(false, likeCount);
43+
})
44+
.orElseGet(() -> {
45+
Long currentCount = diaryService.getLikeCount(diaryId);
46+
return LikeCancelResponseDto.of(false, currentCount);
47+
});
48+
}
49+
3350
private void validateDuplicateLike(Long userId, Long diaryId) {
3451
if (likeRepository.existsByUserIdAndDiaryId(userId, diaryId)) {
3552
throw new DuplicateLikeException();

0 commit comments

Comments
 (0)