Skip to content

Commit f6bc2ad

Browse files
authored
Merge pull request #50 from FlipNoteTeam/refactor/like
Refactor: Like 도메인 리팩토링
2 parents 8a9c39e + eed6391 commit f6bc2ad

13 files changed

Lines changed: 119 additions & 56 deletions

src/main/java/project/flipnote/like/controller/LikeController.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
import project.flipnote.common.model.response.PagingResponse;
1616
import project.flipnote.common.security.dto.AuthPrinciple;
1717
import project.flipnote.like.controller.docs.LikeControllerDocs;
18-
import project.flipnote.like.model.LikeResponse;
19-
import project.flipnote.like.model.LikeSearchRequest;
20-
import project.flipnote.like.model.LikeTargetResponse;
21-
import project.flipnote.like.model.LikeTargetTypeRequest;
18+
import project.flipnote.like.model.response.LikeResponse;
19+
import project.flipnote.like.model.request.LikeSearchRequest;
20+
import project.flipnote.like.model.response.LikeTargetResponse;
21+
import project.flipnote.like.model.request.LikeTargetTypeRequest;
2222
import project.flipnote.like.service.LikeService;
2323

2424
@RequiredArgsConstructor

src/main/java/project/flipnote/like/controller/docs/LikeControllerDocs.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
import io.swagger.v3.oas.annotations.tags.Tag;
88
import project.flipnote.common.model.response.PagingResponse;
99
import project.flipnote.common.security.dto.AuthPrinciple;
10-
import project.flipnote.like.model.LikeResponse;
11-
import project.flipnote.like.model.LikeSearchRequest;
12-
import project.flipnote.like.model.LikeTargetResponse;
13-
import project.flipnote.like.model.LikeTargetTypeRequest;
10+
import project.flipnote.like.model.response.LikeResponse;
11+
import project.flipnote.like.model.request.LikeSearchRequest;
12+
import project.flipnote.like.model.response.LikeTargetResponse;
13+
import project.flipnote.like.model.request.LikeTargetTypeRequest;
1414

1515
@Tag(name = "Like", description = "Like API")
1616
public interface LikeControllerDocs {

src/main/java/project/flipnote/like/model/LikeSearchRequest.java renamed to src/main/java/project/flipnote/like/model/request/LikeSearchRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package project.flipnote.like.model;
1+
package project.flipnote.like.model.request;
22

33
import org.springframework.data.domain.PageRequest;
44
import org.springframework.data.domain.Sort;

src/main/java/project/flipnote/like/model/LikeTargetTypeRequest.java renamed to src/main/java/project/flipnote/like/model/request/LikeTargetTypeRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package project.flipnote.like.model;
1+
package project.flipnote.like.model.request;
22

33
import project.flipnote.like.entity.LikeTargetType;
44

src/main/java/project/flipnote/like/model/CardSetLikeResponse.java renamed to src/main/java/project/flipnote/like/model/response/CardSetLikeResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package project.flipnote.like.model;
1+
package project.flipnote.like.model.response;
22

33
import lombok.AllArgsConstructor;
44
import lombok.Data;

src/main/java/project/flipnote/like/model/LikeResponse.java renamed to src/main/java/project/flipnote/like/model/response/LikeResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package project.flipnote.like.model;
1+
package project.flipnote.like.model.response;
22

33
import java.time.LocalDateTime;
44

src/main/java/project/flipnote/like/model/LikeTargetResponse.java renamed to src/main/java/project/flipnote/like/model/response/LikeTargetResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package project.flipnote.like.model;
1+
package project.flipnote.like.model.response;
22

33
public abstract class LikeTargetResponse {
44
public abstract Long getId();

src/main/java/project/flipnote/like/service/LikePolicyService.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,21 @@
33
import org.springframework.stereotype.Service;
44

55
import lombok.RequiredArgsConstructor;
6-
import project.flipnote.cardset.service.CardSetService;
76
import project.flipnote.common.exception.BizException;
87
import project.flipnote.like.entity.LikeTargetType;
98
import project.flipnote.like.exception.LikeErrorCode;
9+
import project.flipnote.like.model.response.LikeTargetResponse;
1010
import project.flipnote.like.repository.LikeRepository;
1111

1212
@RequiredArgsConstructor
1313
@Service
1414
public class LikePolicyService {
1515

16-
private final CardSetService cardSetService;
1716
private final LikeRepository likeRepository;
17+
private final LikeTargetFetchService<LikeTargetResponse> likeTargetFetchService;
1818

19-
public void validateTargetExists(LikeTargetType targetType, Long targetId) {
20-
boolean targetExists = false;
21-
switch (targetType) {
22-
case CARD_SET -> targetExists = cardSetService.existsById(targetId);
23-
}
24-
25-
if (!targetExists) {
19+
public void validateTargetExists(LikeTargetType targetType, Long targetId, Long userId) {
20+
if (!likeTargetFetchService.isTargetViewable(targetType, targetId, userId)) {
2621
throw new BizException(LikeErrorCode.LIKE_TARGET_NOT_FOUND);
2722
}
2823
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package project.flipnote.like.service;
2+
3+
import org.springframework.stereotype.Service;
4+
5+
import lombok.RequiredArgsConstructor;
6+
import project.flipnote.common.exception.BizException;
7+
import project.flipnote.like.entity.Like;
8+
import project.flipnote.like.entity.LikeTargetType;
9+
import project.flipnote.like.exception.LikeErrorCode;
10+
import project.flipnote.like.repository.LikeRepository;
11+
12+
@RequiredArgsConstructor
13+
@Service
14+
public class LikeReader {
15+
16+
private final LikeRepository likeRepository;
17+
18+
public Like findByTargetAndUserId(LikeTargetType targetType, Long targetId, Long userId) {
19+
return likeRepository.findByTargetTypeAndTargetIdAndUserId(targetType, targetId, userId)
20+
.orElseThrow(() -> new BizException(LikeErrorCode.LIKE_NOT_FOUND));
21+
}
22+
}

src/main/java/project/flipnote/like/service/LikeService.java

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package project.flipnote.like.service;
22

33
import java.time.LocalDateTime;
4-
import java.util.List;
54
import java.util.Map;
65
import java.util.Set;
7-
import java.util.function.Function;
86
import java.util.stream.Collectors;
97

108
import org.springframework.context.ApplicationEventPublisher;
@@ -13,7 +11,6 @@
1311
import org.springframework.stereotype.Service;
1412
import org.springframework.transaction.annotation.Transactional;
1513

16-
import jakarta.annotation.PostConstruct;
1714
import lombok.RequiredArgsConstructor;
1815
import lombok.extern.slf4j.Slf4j;
1916
import project.flipnote.common.exception.BizException;
@@ -23,11 +20,10 @@
2320
import project.flipnote.like.entity.Like;
2421
import project.flipnote.like.entity.LikeTargetType;
2522
import project.flipnote.like.exception.LikeErrorCode;
26-
import project.flipnote.like.model.LikeResponse;
27-
import project.flipnote.like.model.LikeSearchRequest;
28-
import project.flipnote.like.model.LikeTargetResponse;
23+
import project.flipnote.like.model.response.LikeResponse;
24+
import project.flipnote.like.model.request.LikeSearchRequest;
25+
import project.flipnote.like.model.response.LikeTargetResponse;
2926
import project.flipnote.like.repository.LikeRepository;
30-
import project.flipnote.like.service.fetcher.LikeTargetFetcher;
3127

3228
@Slf4j
3329
@RequiredArgsConstructor
@@ -38,15 +34,8 @@ public class LikeService {
3834
private final LikeRepository likeRepository;
3935
private final ApplicationEventPublisher eventPublisher;
4036
private final LikePolicyService likePolicyService;
41-
private final List<LikeTargetFetcher<?>> fetchers;
42-
43-
private Map<LikeTargetType, LikeTargetFetcher<?>> fetcherMap;
44-
45-
@PostConstruct
46-
public void init() {
47-
this.fetcherMap = this.fetchers.stream()
48-
.collect(Collectors.toMap(LikeTargetFetcher::getTargetType, Function.identity()));
49-
}
37+
private final LikeTargetFetchService<LikeTargetResponse> likeTargetFetchService;
38+
private final LikeReader likeReader;
5039

5140
/**
5241
* 좋아요 추가
@@ -58,7 +47,7 @@ public void init() {
5847
*/
5948
@Transactional
6049
public void addLike(Long userId, LikeTargetType targetType, Long targetId) {
61-
likePolicyService.validateTargetExists(targetType, targetId);
50+
likePolicyService.validateTargetExists(targetType, targetId, userId);
6251
likePolicyService.validateNotAlreadyLiked(targetType, targetId, userId);
6352

6453
Like like = Like.builder()
@@ -86,8 +75,7 @@ public void addLike(Long userId, LikeTargetType targetType, Long targetId) {
8675
*/
8776
@Transactional
8877
public void removeLike(Long userId, LikeTargetType targetType, Long targetId) {
89-
Like like = likeRepository.findByTargetTypeAndTargetIdAndUserId(targetType, targetId, userId)
90-
.orElseThrow(() -> new BizException(LikeErrorCode.LIKE_NOT_FOUND));
78+
Like like = likeReader.findByTargetAndUserId(targetType, targetId, userId);
9179

9280
likeRepository.delete(like);
9381

@@ -100,11 +88,10 @@ public void removeLike(Long userId, LikeTargetType targetType, Long targetId) {
10088
* @param userId 좋아요 누른 목록을 조회하는 회원의 ID
10189
* @param targetType 조회할 좋아요 대상 타입
10290
* @param req 페이징 및 검색 조건이 포함된 요청 정보
103-
* @param <T> 좋아요 대상의 상세 정보를 담은 DTO 타입 (LikeTargetResponse 하위 타입)
10491
* @return 페이징된 좋아요 누른 목록
10592
* @author 윤정환
10693
*/
107-
public <T extends LikeTargetResponse> PagingResponse<LikeResponse<T>> getLikes(
94+
public PagingResponse<LikeResponse<LikeTargetResponse>> getLikes(
10895
Long userId,
10996
LikeTargetType targetType,
11097
LikeSearchRequest req
@@ -114,14 +101,9 @@ public <T extends LikeTargetResponse> PagingResponse<LikeResponse<T>> getLikes(
114101
.collect(Collectors.toMap(Like::getTargetId, Like::getCreatedAt));
115102
Set<Long> targetIds = likedAtMap.keySet();
116103

117-
// TODO: 제네릭이 아닌 타입 별로 엔드포인트를 따로 만드는게 좋으려나 고민중, 현재 방법을 유지하면서 더 나은 구조 알고싶음...
118-
LikeTargetFetcher<T> fetcher = (LikeTargetFetcher<T>)fetcherMap.get(targetType);
119-
if (fetcher == null) {
120-
throw new BizException(LikeErrorCode.INVALID_LIKE_TYPE);
121-
}
122-
123-
Map<Long, T> targetMap = fetcher.fetchByIds(targetIds);
124-
Page<LikeResponse<T>> content = likePage
104+
Map<Long, LikeTargetResponse> targetMap
105+
= likeTargetFetchService.fetchByTypeAndIds(targetType, targetIds, userId);
106+
Page<LikeResponse<LikeTargetResponse>> content = likePage
125107
.map(like -> new LikeResponse<>(targetMap.get(like.getTargetId()), likedAtMap.get(like.getTargetId())));
126108

127109
return PagingResponse.from(content);

0 commit comments

Comments
 (0)