Skip to content

Commit 3c15eb7

Browse files
feat: 좋아요 수 반환 및 피드 조회 기능 구현
# 변경점 👍 1. DiaryLikeCount 조회 쿼리 추가 2. 소셜 기능을 통한 다이어리 조회 시 응답에 likeCount 추가 # 비고 ✏ likeCount 조회의 경우 JPQL 쿼리 결과를 DiaryLikeCountDto list로 받아서 Map으로 변환하는 형식으로 사용했습니다 --------- Co-authored-by: jinwon1234 <[email protected]>
1 parent d5f336f commit 3c15eb7

File tree

20 files changed

+327
-56
lines changed

20 files changed

+327
-56
lines changed

src/main/java/apptive/team5/diary/controller/DiaryController.java

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package apptive.team5.diary.controller;
22

33
import apptive.team5.diary.domain.DiaryEntity;
4-
import apptive.team5.diary.dto.DiaryCreateRequest;
5-
import apptive.team5.diary.dto.DiaryResponseDto;
6-
import apptive.team5.diary.dto.DiaryUpdateRequestDto;
7-
import apptive.team5.diary.dto.UserDiaryResponseDto;
4+
import apptive.team5.diary.dto.*;
85
import apptive.team5.diary.service.DiaryService;
96
import jakarta.validation.Valid;
107
import lombok.RequiredArgsConstructor;
@@ -36,7 +33,7 @@ public class DiaryController {
3633
private final DiaryService diaryService;
3734

3835
@GetMapping("/my")
39-
public ResponseEntity<Page<DiaryResponseDto>> getMyMusicDiary(
36+
public ResponseEntity<Page<MyDiaryResponseDto>> getMyMusicDiary(
4037
@AuthenticationPrincipal
4138
Long userId,
4239
@RequestParam(defaultValue = "0")
@@ -45,7 +42,22 @@ public ResponseEntity<Page<DiaryResponseDto>> getMyMusicDiary(
4542
int size
4643
) {
4744

48-
Page<DiaryResponseDto> response = diaryService.getMyDiaries(userId, PageRequest.of(page, size));
45+
Page<MyDiaryResponseDto> response = diaryService.getMyDiaries(userId, PageRequest.of(page, size));
46+
47+
return ResponseEntity.status(HttpStatus.OK).body(response);
48+
}
49+
50+
@GetMapping("/my/feeds")
51+
public ResponseEntity<Page<FeedDiaryResponseDto>> getMyUserDiaryFeeds(
52+
@AuthenticationPrincipal
53+
Long userId,
54+
@RequestParam(defaultValue = "0")
55+
int page,
56+
@RequestParam(defaultValue = "5")
57+
int size
58+
) {
59+
60+
Page<FeedDiaryResponseDto> response = diaryService.getDiariesFeeds(userId, PageRequest.of(page, size));
4961

5062
return ResponseEntity.status(HttpStatus.OK).body(response);
5163
}
@@ -66,15 +78,15 @@ public ResponseEntity<Page<UserDiaryResponseDto>> getUserDiaries(
6678
}
6779

6880
@GetMapping("/my/calendar")
69-
public ResponseEntity<List<DiaryResponseDto>> getMyDiariesByPeriod(
81+
public ResponseEntity<List<MyDiaryResponseDto>> getMyDiariesByPeriod(
7082
@AuthenticationPrincipal
7183
Long userId,
7284
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
7385
LocalDate start,
7486
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
7587
LocalDate end
7688
) {
77-
List<DiaryResponseDto> response = diaryService.getMyDiariesByPeriod(userId, start, end);
89+
List<MyDiaryResponseDto> response = diaryService.getMyDiariesByPeriod(userId, start, end);
7890
return ResponseEntity.status(HttpStatus.OK).body(response);
7991
}
8092

src/main/java/apptive/team5/diary/domain/DiaryEntity.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ public boolean isScopeKillingPart() {
112112
return this.scope == DiaryScope.KILLING_PART;
113113
}
114114

115+
public boolean isScopePrivate() {
116+
return this.scope == DiaryScope.PRIVATE;
117+
}
118+
115119
public void update(
116120
String musicTitle,
117121
String artist,
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package apptive.team5.diary.dto;
2+
3+
public record DiaryLikeCountDto (
4+
Long diaryId,
5+
Long likeCount
6+
) {
7+
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package apptive.team5.diary.dto;
2+
3+
import apptive.team5.diary.domain.DiaryEntity;
4+
import apptive.team5.diary.domain.DiaryScope;
5+
import apptive.team5.global.exception.BadRequestException;
6+
import apptive.team5.global.exception.ExceptionCode;
7+
import apptive.team5.global.util.S3Util;
8+
import apptive.team5.user.domain.UserEntity;
9+
10+
import java.time.LocalDateTime;
11+
12+
public record FeedDiaryResponseDto(
13+
Long diaryId,
14+
String artist,
15+
String musicTitle,
16+
String albumImageUrl,
17+
String content,
18+
String videoUrl,
19+
DiaryScope scope,
20+
String duration,
21+
String start,
22+
String end,
23+
LocalDateTime createDate,
24+
LocalDateTime updateDate,
25+
boolean isLiked,
26+
Long likeCount,
27+
Long userId,
28+
String username,
29+
String tag,
30+
String profileImageUrl
31+
) {
32+
33+
public static String defaultContentMsg = "비공개 일기입니다.";
34+
public static FeedDiaryResponseDto from(DiaryEntity diary, boolean isLiked, Long likeCount, Long currentUserId, UserEntity user) {
35+
String contentResponse = diary.getContent();
36+
37+
if (!diary.isMyDiary(currentUserId) && diary.isScopeKillingPart()) {
38+
contentResponse = defaultContentMsg;
39+
}
40+
41+
if (!diary.isMyDiary(currentUserId) && diary.isScopePrivate())
42+
throw new BadRequestException(ExceptionCode.ACCESS_DENIED_DIARY.getDescription());
43+
44+
return new FeedDiaryResponseDto(
45+
diary.getId(),
46+
diary.getArtist(),
47+
diary.getMusicTitle(),
48+
diary.getAlbumImageUrl(),
49+
contentResponse,
50+
diary.getVideoUrl(),
51+
diary.getScope(),
52+
diary.getDuration(),
53+
diary.getStart(),
54+
diary.getEnd(),
55+
diary.getCreateDateTime(),
56+
diary.getUpdateDateTime(),
57+
isLiked,
58+
likeCount,
59+
user.getId(),
60+
user.getUsername(),
61+
user.getTag(),
62+
S3Util.s3Url + user.getProfileImage()
63+
);
64+
}
65+
}

src/main/java/apptive/team5/diary/dto/DiaryResponseDto.java renamed to src/main/java/apptive/team5/diary/dto/MyDiaryResponseDto.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import apptive.team5.diary.domain.DiaryScope;
66
import java.time.LocalDateTime;
77

8-
public record DiaryResponseDto(
8+
public record MyDiaryResponseDto(
99
String artist,
1010
String musicTitle,
1111
String albumImageUrl,
@@ -18,8 +18,8 @@ public record DiaryResponseDto(
1818
LocalDateTime createDate,
1919
LocalDateTime updateDate
2020
) {
21-
public static DiaryResponseDto from(DiaryEntity diary) {
22-
return new DiaryResponseDto(
21+
public static MyDiaryResponseDto from(DiaryEntity diary) {
22+
return new MyDiaryResponseDto(
2323
diary.getArtist(),
2424
diary.getMusicTitle(),
2525
diary.getAlbumImageUrl(),

src/main/java/apptive/team5/diary/dto/UserDiaryResponseDto.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
import apptive.team5.diary.domain.DiaryEntity;
44
import apptive.team5.diary.domain.DiaryScope;
5-
import apptive.team5.user.domain.UserEntity;
5+
import apptive.team5.global.exception.BadRequestException;
6+
import apptive.team5.global.exception.ExceptionCode;
67

78
import java.time.LocalDateTime;
89

@@ -19,17 +20,20 @@ public record UserDiaryResponseDto(
1920
String end,
2021
LocalDateTime createDate,
2122
LocalDateTime updateDate,
22-
boolean isLiked
23+
boolean isLiked,
24+
Long likeCount
2325
) {
2426
public static String defaultContentMsg = "비공개 일기입니다.";
25-
public static UserDiaryResponseDto from(DiaryEntity diary, boolean isLiked, Long currentUserId) {
27+
public static UserDiaryResponseDto from(DiaryEntity diary, boolean isLiked, Long likeCount, Long currentUserId) {
2628
String contentResponse = diary.getContent();
2729

28-
if (!diary.isMyDiary(currentUserId) &&
29-
diary.isScopeKillingPart()) {
30+
if (!diary.isMyDiary(currentUserId) && diary.isScopeKillingPart()) {
3031
contentResponse = defaultContentMsg;
3132
}
3233

34+
if (!diary.isMyDiary(currentUserId) && diary.isScopePrivate())
35+
throw new BadRequestException(ExceptionCode.ACCESS_DENIED_DIARY.getDescription());
36+
3337
return new UserDiaryResponseDto(
3438
diary.getId(),
3539
diary.getArtist(),
@@ -43,7 +47,8 @@ public static UserDiaryResponseDto from(DiaryEntity diary, boolean isLiked, Long
4347
diary.getEnd(),
4448
diary.getCreateDateTime(),
4549
diary.getUpdateDateTime(),
46-
isLiked
50+
isLiked,
51+
likeCount
4752
);
4853
}
4954
}

src/main/java/apptive/team5/diary/repository/DiaryLikeRepository.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import apptive.team5.diary.domain.DiaryEntity;
44
import apptive.team5.diary.domain.DiaryLikeEntity;
5+
import apptive.team5.diary.dto.DiaryLikeCountDto;
56
import apptive.team5.user.domain.UserEntity;
67
import org.springframework.data.jpa.repository.JpaRepository;
78
import org.springframework.data.jpa.repository.Modifying;
@@ -31,6 +32,14 @@ Set<Long> findLikedDiaryIdsByUser(
3132
List<Long> diaryIds
3233
);
3334

35+
@Query("""
36+
SELECT new apptive.team5.diary.dto.DiaryLikeCountDto(dl.diary.id, COUNT(dl.id))
37+
FROM DiaryLikeEntity dl
38+
WHERE dl.diary.id IN :diaryIds
39+
GROUP BY dl.diary.id
40+
""")
41+
List<DiaryLikeCountDto> findLikeCountsByDiaryIds(@Param("diaryIds") List<Long> diaryIds);
42+
3443
@Modifying(clearAutomatically = true)
3544
@Query("""
3645
DELETE FROM DiaryLikeEntity dl

src/main/java/apptive/team5/diary/repository/DiaryRepository.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import java.time.LocalDateTime;
1313
import java.util.List;
14+
import java.util.Set;
1415

1516
public interface DiaryRepository extends JpaRepository<DiaryEntity, Long> {
1617
Page<DiaryEntity> findByUser(UserEntity user, Pageable pageable);
@@ -27,4 +28,10 @@ public interface DiaryRepository extends JpaRepository<DiaryEntity, Long> {
2728
@Query("delete from DiaryEntity d where d.user.id = :userId")
2829
@Modifying(clearAutomatically = true)
2930
void deleteByUserId(Long userId);
31+
32+
@Query("select d from DiaryEntity d where d.user.id in :userIds")
33+
Page<DiaryEntity> findByUserIdsPage(Set<Long> userIds, Pageable pageable);
34+
35+
@Query("select d from DiaryEntity d join fetch d.user where d.user.id in :userIds and d.scope in :scopes")
36+
Page<DiaryEntity> findByUserIdsAndScopseWithUserPage(Set<Long> userIds, List<DiaryScope> scopes, Pageable pageable);
3037
}

src/main/java/apptive/team5/diary/service/DiaryLikeLowService.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import apptive.team5.diary.domain.DiaryEntity;
44
import apptive.team5.diary.domain.DiaryLikeEntity;
5+
import apptive.team5.diary.dto.DiaryLikeCountDto;
56
import apptive.team5.diary.repository.DiaryLikeRepository;
67
import apptive.team5.global.exception.ExceptionCode;
78
import apptive.team5.global.exception.NotFoundEntityException;
@@ -11,7 +12,9 @@
1112
import org.springframework.transaction.annotation.Transactional;
1213

1314
import java.util.List;
15+
import java.util.Map;
1416
import java.util.Set;
17+
import java.util.stream.Collectors;
1518

1619
@Service
1720
@RequiredArgsConstructor
@@ -39,6 +42,21 @@ public Set<Long> findLikedDiaryIdsByUser(Long currentUserId, List<Long> diaryIds
3942
return diaryLikeRepository.findLikedDiaryIdsByUser(currentUserId, diaryIds);
4043
}
4144

45+
@Transactional(readOnly = true)
46+
public Map<Long, Long> findLikeCountsByDiaryIds(List<Long> diaryIds) {
47+
if (diaryIds == null || diaryIds.isEmpty()) {
48+
return Map.of();
49+
}
50+
51+
return diaryLikeRepository.findLikeCountsByDiaryIds(diaryIds)
52+
.stream()
53+
.collect(Collectors.toMap(
54+
DiaryLikeCountDto::diaryId,
55+
DiaryLikeCountDto::likeCount,
56+
(a, b) -> a
57+
));
58+
}
59+
4260
public void deleteDiaryLike(DiaryLikeEntity diaryLike) {
4361
diaryLikeRepository.delete(diaryLike);
4462
}

src/main/java/apptive/team5/diary/service/DiaryLowService.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
import java.time.LocalDateTime;
1717
import java.util.List;
18+
import java.util.Set;
1819

1920
@Service
2021
@RequiredArgsConstructor
@@ -76,4 +77,12 @@ public void deleteByUserId(Long userId) {
7677
diaryRepository.deleteByUserId(userId);
7778
}
7879

80+
public Page<DiaryEntity> findByUserIds(Set<Long> userIds, Pageable pageable) {
81+
return diaryRepository.findByUserIdsPage(userIds, pageable);
82+
}
83+
84+
public Page<DiaryEntity> findByUserIdsAndScopseWithUserPage(Set<Long> userIds, List<DiaryScope> scopes, Pageable pageable) {
85+
return diaryRepository.findByUserIdsAndScopseWithUserPage(userIds, scopes, pageable);
86+
}
87+
7988
}

0 commit comments

Comments
 (0)