-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* feat: reviewLike 도메인, 엔티티 추가 * feat: reviewLikeEntity에 컬럼명 추가 * feat: 공감 관련 repository 추가 * feat: 리뷰 공감 & 공감 취소 서비스 코드 구현 * feat: Review 공감 수 디폴트 값 추가 * fix: 저장된 리뷰와 관련된 builder에 좋아요 수 추가 * feat: 공감 후 리뷰 공감 수 갱신 로직 추가 * feat: 리뷰 공감 controller 추가 * test: review 공감수 테스트 추가 * refactor: 불필요한 코드 삭제 * feat: data.sql update * test: 리뷰 공감수 차감 테스트 추가 * test: 리뷰 공감수 증가/차감 테스트 추가 * feat: default 공감수 상수 추가 * feat: 공감수 update 쿼리 추가
- Loading branch information
Showing
21 changed files
with
359 additions
and
30 deletions.
There are no files selected for viewing
37 changes: 37 additions & 0 deletions
37
...cation/src/main/java/org/depromeet/spot/application/review/like/ReviewLikeController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
package org.depromeet.spot.application.review.like; | ||
|
||
import jakarta.validation.constraints.NotNull; | ||
import jakarta.validation.constraints.Positive; | ||
|
||
import org.depromeet.spot.application.common.annotation.CurrentMember; | ||
import org.depromeet.spot.usecase.port.in.review.like.ReviewLikeUsecase; | ||
import org.springframework.http.HttpStatus; | ||
import org.springframework.web.bind.annotation.PathVariable; | ||
import org.springframework.web.bind.annotation.PostMapping; | ||
import org.springframework.web.bind.annotation.RequestMapping; | ||
import org.springframework.web.bind.annotation.ResponseStatus; | ||
import org.springframework.web.bind.annotation.RestController; | ||
|
||
import io.swagger.v3.oas.annotations.Operation; | ||
import io.swagger.v3.oas.annotations.Parameter; | ||
import io.swagger.v3.oas.annotations.tags.Tag; | ||
import lombok.RequiredArgsConstructor; | ||
|
||
@RestController | ||
@Tag(name = "리뷰 공감") | ||
@RequiredArgsConstructor | ||
@RequestMapping("/api/v1/reviews") | ||
public class ReviewLikeController { | ||
|
||
private final ReviewLikeUsecase reviewLikeUsecase; | ||
|
||
@CurrentMember | ||
@ResponseStatus(HttpStatus.OK) | ||
@Operation(summary = "특정 리뷰에 공감한다. 만약 이전에 공감했던 리뷰라면, 공감을 취소한다.") | ||
@PostMapping("/{reviewId}/like") | ||
public void toggleLike( | ||
@PathVariable @Positive @NotNull final Long reviewId, | ||
@Parameter(hidden = true) Long memberId) { | ||
reviewLikeUsecase.toggleLike(memberId, reviewId); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
15 changes: 15 additions & 0 deletions
15
domain/src/main/java/org/depromeet/spot/domain/review/like/ReviewLike.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package org.depromeet.spot.domain.review.like; | ||
|
||
import lombok.AllArgsConstructor; | ||
import lombok.Builder; | ||
import lombok.Getter; | ||
|
||
@Getter | ||
@Builder | ||
@AllArgsConstructor | ||
public class ReviewLike { | ||
|
||
private final Long id; | ||
private final Long memberId; | ||
private final Long reviewId; | ||
} |
67 changes: 67 additions & 0 deletions
67
domain/src/test/java/org/depromeet/spot/domain/review/ReviewTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
package org.depromeet.spot.domain.review; | ||
|
||
import static org.assertj.core.api.Assertions.assertThatThrownBy; | ||
import static org.junit.jupiter.api.Assertions.assertEquals; | ||
|
||
import org.depromeet.spot.common.exception.review.ReviewException.InvalidReviewLikesException; | ||
import org.junit.jupiter.api.Test; | ||
|
||
class ReviewTest { | ||
|
||
@Test | ||
void review_builder에_공감수를_지정하지_않으면_0으로_할당된다() { | ||
// given | ||
// when | ||
Review review = Review.builder().build(); | ||
|
||
// then | ||
assertEquals(review.getLikesCount(), 0); | ||
} | ||
|
||
@Test | ||
void review_builder에_공감수를_음수로_지정하면_에러를_반환한다() { | ||
// given | ||
int likesCount = -99; | ||
|
||
// when | ||
// then | ||
assertThatThrownBy(() -> Review.builder().likesCount(likesCount).build()) | ||
.isInstanceOf(InvalidReviewLikesException.class); | ||
} | ||
|
||
@Test | ||
void review_공감수를_증가할_수_있다() { | ||
// given | ||
Review review = Review.builder().likesCount(0).build(); | ||
|
||
// when | ||
review.addLike(); | ||
|
||
// then | ||
assertEquals(review.getLikesCount(), 1); | ||
} | ||
|
||
@Test | ||
void review_공감수를_감소할_수_있다() { | ||
// given | ||
Review review = Review.builder().likesCount(10).build(); | ||
|
||
// when | ||
review.cancelLike(); | ||
|
||
// then | ||
assertEquals(review.getLikesCount(), 9); | ||
} | ||
|
||
@Test | ||
void review_공감수가_0이라면_공감수를_감소하지_않는다() { | ||
// given | ||
Review review = Review.builder().likesCount(0).build(); | ||
|
||
// when | ||
review.cancelLike(); | ||
|
||
// then | ||
assertEquals(review.getLikesCount(), 0); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
32 changes: 32 additions & 0 deletions
32
.../main/java/org/depromeet/spot/infrastructure/jpa/review/entity/like/ReviewLikeEntity.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
package org.depromeet.spot.infrastructure.jpa.review.entity.like; | ||
|
||
import jakarta.persistence.Column; | ||
import jakarta.persistence.Entity; | ||
import jakarta.persistence.Table; | ||
|
||
import org.depromeet.spot.domain.review.like.ReviewLike; | ||
import org.depromeet.spot.infrastructure.jpa.common.entity.BaseEntity; | ||
|
||
import lombok.AllArgsConstructor; | ||
import lombok.NoArgsConstructor; | ||
|
||
@Entity | ||
@NoArgsConstructor | ||
@AllArgsConstructor | ||
@Table(name = "review_likes") | ||
public class ReviewLikeEntity extends BaseEntity { | ||
|
||
@Column(name = "member_id", nullable = false) | ||
private Long memberId; | ||
|
||
@Column(name = "review_id", nullable = false) | ||
private Long reviewId; | ||
|
||
public static ReviewLikeEntity from(ReviewLike like) { | ||
return new ReviewLikeEntity(like.getMemberId(), like.getReviewId()); | ||
} | ||
|
||
public ReviewLike toDomain() { | ||
return ReviewLike.builder().id(this.getId()).memberId(memberId).reviewId(reviewId).build(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
15 changes: 15 additions & 0 deletions
15
...org/depromeet/spot/infrastructure/jpa/review/repository/like/ReviewLikeJpaRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package org.depromeet.spot.infrastructure.jpa.review.repository.like; | ||
|
||
import org.depromeet.spot.infrastructure.jpa.review.entity.like.ReviewLikeEntity; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
import org.springframework.data.jpa.repository.Modifying; | ||
|
||
public interface ReviewLikeJpaRepository extends JpaRepository<ReviewLikeEntity, Long> { | ||
|
||
long countByReviewId(long reviewId); | ||
|
||
boolean existsByMemberIdAndReviewId(long memberId, long reviewId); | ||
|
||
@Modifying | ||
void deleteByMemberIdAndReviewId(long memberId, long reviewId); | ||
} |
36 changes: 36 additions & 0 deletions
36
...rg/depromeet/spot/infrastructure/jpa/review/repository/like/ReviewLikeRepositoryImpl.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
package org.depromeet.spot.infrastructure.jpa.review.repository.like; | ||
|
||
import org.depromeet.spot.domain.review.like.ReviewLike; | ||
import org.depromeet.spot.infrastructure.jpa.review.entity.like.ReviewLikeEntity; | ||
import org.depromeet.spot.usecase.port.out.review.ReviewLikeRepository; | ||
import org.springframework.stereotype.Repository; | ||
|
||
import lombok.RequiredArgsConstructor; | ||
|
||
@Repository | ||
@RequiredArgsConstructor | ||
public class ReviewLikeRepositoryImpl implements ReviewLikeRepository { | ||
|
||
private final ReviewLikeJpaRepository reviewLikeJpaRepository; | ||
|
||
@Override | ||
public boolean existsBy(final long memberId, final long reviewId) { | ||
return reviewLikeJpaRepository.existsByMemberIdAndReviewId(memberId, reviewId); | ||
} | ||
|
||
@Override | ||
public long countByReview(final long reviewId) { | ||
return reviewLikeJpaRepository.countByReviewId(reviewId); | ||
} | ||
|
||
@Override | ||
public void deleteBy(final long memberId, final long reviewId) { | ||
reviewLikeJpaRepository.deleteByMemberIdAndReviewId(memberId, reviewId); | ||
} | ||
|
||
@Override | ||
public void save(ReviewLike like) { | ||
ReviewLikeEntity entity = ReviewLikeEntity.from(like); | ||
reviewLikeJpaRepository.save(entity); | ||
} | ||
} |
Oops, something went wrong.