From 142193166359d3a803b1a399d2a78be06b25a3fd Mon Sep 17 00:00:00 2001 From: LeeJaeHyeok97 Date: Sat, 17 Aug 2024 06:50:33 +0900 Subject: [PATCH] =?UTF-8?q?[FEAT]=20=ED=94=84=EB=A1=A0=ED=8A=B8=20?= =?UTF-8?q?=EC=9A=94=EA=B5=AC=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/report/dto/response/ReportRes.java | 1 + .../domain/report/service/ReportService.java | 11 ++- .../UserQueryDslRepositoryImpl.java | 69 +++++++++++-------- 3 files changed, 51 insertions(+), 30 deletions(-) diff --git a/src/main/java/depth/mvp/ns/domain/report/dto/response/ReportRes.java b/src/main/java/depth/mvp/ns/domain/report/dto/response/ReportRes.java index 4ea88bc..0bcf1aa 100644 --- a/src/main/java/depth/mvp/ns/domain/report/dto/response/ReportRes.java +++ b/src/main/java/depth/mvp/ns/domain/report/dto/response/ReportRes.java @@ -14,6 +14,7 @@ public record ReportRes( @Builder public static record LongestWriter( Long userId, + boolean isCurrentUser, String nickname, String imageUrl, int length diff --git a/src/main/java/depth/mvp/ns/domain/report/service/ReportService.java b/src/main/java/depth/mvp/ns/domain/report/service/ReportService.java index c8622f4..e5ba415 100644 --- a/src/main/java/depth/mvp/ns/domain/report/service/ReportService.java +++ b/src/main/java/depth/mvp/ns/domain/report/service/ReportService.java @@ -85,20 +85,24 @@ public ResponseEntity findReport(CustomUserDetails customUserDetails, LocalDa ReportRes.LongestWriter longestWriter = null; if (longestBoardByTheme != null && longestBoardByTheme.getUser() != null) { User user = longestBoardByTheme.getUser(); + boolean isCurrentUser = customUserDetails != null && customUserDetails.getId().equals(user.getId()); longestWriter = new ReportRes.LongestWriter( user.getId(), + isCurrentUser, user.getNickname(), user.getImageUrl(), longestBoardByTheme.getLength() ); } - return ResponseEntity.ok(ReportRes.builder() + ReportRes reportRes = ReportRes.builder() .selectedDate(parsedDate) .themeName(theme.getContent()) .writtenTotal(writtenTotal) - .longestWriter(longestWriter) // longestWriter는 null일 수 있음 - .build()); + .longestWriter(customUserDetails != null ? longestWriter : null) // 로그인하지 않은 경우 longestWriter 정보를 제공하지 않음 + .build(); + + return ResponseEntity.ok(reportRes); } else { // 과거 레포트 조회 @@ -162,6 +166,7 @@ public ResponseEntity findReport(CustomUserDetails customUserDetails, LocalDa .count(report.getCount()) .longestWriter(new ReportRes.LongestWriter( user.getId(), + customUserDetails != null && customUserDetails.getId().equals(user.getId()), user.getNickname(), user.getImageUrl(), longestBoardByTheme.getLength() diff --git a/src/main/java/depth/mvp/ns/domain/user/domain/repository/UserQueryDslRepositoryImpl.java b/src/main/java/depth/mvp/ns/domain/user/domain/repository/UserQueryDslRepositoryImpl.java index 6a4a192..7da2362 100644 --- a/src/main/java/depth/mvp/ns/domain/user/domain/repository/UserQueryDslRepositoryImpl.java +++ b/src/main/java/depth/mvp/ns/domain/user/domain/repository/UserQueryDslRepositoryImpl.java @@ -2,8 +2,10 @@ import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.impl.JPAQueryFactory; +import depth.mvp.ns.domain.user.domain.QUser; import depth.mvp.ns.domain.user.domain.RankingType; import depth.mvp.ns.domain.user.dto.response.*; +import depth.mvp.ns.domain.user_point.domain.QUserPoint; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -11,10 +13,10 @@ import java.time.DayOfWeek; import java.time.LocalDateTime; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; import java.util.stream.Collectors; -import static depth.mvp.ns.domain.user_point.domain.QUserPoint.userPoint; import static depth.mvp.ns.domain.user.domain.QUser.user; @RequiredArgsConstructor @@ -57,6 +59,9 @@ public UserRankingRes getNRankingDesc(Long id, RankingType type) { LocalDateTime startDate; LocalDateTime endDate = LocalDateTime.now(); + QUserPoint userPoint = QUserPoint.userPoint; + QUser user = QUser.user; + switch (type) { case DAILY: startDate = endDate.toLocalDate().atStartOfDay(); @@ -78,7 +83,7 @@ public UserRankingRes getNRankingDesc(Long id, RankingType type) { user.id, user.nickname, user.imageUrl, - userPoint.score.sum(), + Expressions.asNumber(userPoint.score.sum()).coalesce(0), id != null ? user.id.eq(id) : Expressions.asBoolean(false) )) .from(userPoint) @@ -86,13 +91,18 @@ public UserRankingRes getNRankingDesc(Long id, RankingType type) { .on(userPoint.user.id.eq(user.id)) .where(userPoint.createdDate.between(startDate, endDate)) .groupBy(user.id, user.nickname, user.imageUrl) - .orderBy(userPoint.score.sum().desc()) + .orderBy(Expressions.numberTemplate(Integer.class, "COALESCE({0}, {1})", userPoint.score.sum(), 0).desc()) .limit(3) .fetch(); + + AtomicBoolean isUserIncluded = new AtomicBoolean(false); + AtomicLong ranking = new AtomicLong(1); + + // optionRankingUsers 리스트를 가져옵니다. List optionRankingUsers = queryFactory .select(new QUserRankingRes_OptionRankingRes( - Expressions.constant(0L), // 랭킹 + Expressions.constant(0L), // 초기 랭킹 user.id, user.nickname, userPoint.score.sum(), @@ -104,40 +114,44 @@ public UserRankingRes getNRankingDesc(Long id, RankingType type) { .where(userPoint.createdDate.between(startDate, endDate)) .groupBy(user.id, user.nickname) .orderBy(userPoint.score.sum().desc()) - .limit(10) - .fetch(); - - - AtomicLong ranking = new AtomicLong(1); - optionRankingUsers = optionRankingUsers.stream() - .map(optionRankingUser -> new UserRankingRes.OptionRankingRes( - ranking.getAndIncrement(), - optionRankingUser.userId(), - optionRankingUser.nickname(), - optionRankingUser.point(), - optionRankingUser.isCurrentUser() - )) + .fetch() + .stream() + .map(optionRankingUser -> { + boolean isCurrentUser = optionRankingUser.userId().equals(id); + if (isCurrentUser) { + isUserIncluded.set(true); + } + return new UserRankingRes.OptionRankingRes( + ranking.getAndIncrement(), + optionRankingUser.userId(), + optionRankingUser.nickname(), + optionRankingUser.point(), + isCurrentUser + ); + }) .collect(Collectors.toList()); - optionRankingUsers = optionRankingUsers.stream() - .filter(optionRankingUser -> !optionRankingUser.isCurrentUser()) - .limit(9) - .collect(Collectors.toList()); - - if (id != null) { + // 현재 사용자가 포함되지 않았을 때 랭킹을 추가합니다. + if (id != null && !isUserIncluded.get()) { UserRankingRes.OptionRankingRes userRanking = queryFactory .select(new QUserRankingRes_OptionRankingRes( - Expressions.constant(0L), + Expressions.constant(ranking.get()), // 랭킹 설정 user.id, user.nickname, userPoint.score.sum(), - user.id.eq(id) + Expressions.asBoolean(true) // 현재 사용자임을 명확히 표시 )) - .from(user) + .from(userPoint) + .leftJoin(user) + .on(userPoint.user.id.eq(user.id)) .where(user.id.eq(id)) + .groupBy(user.id, user.nickname) .fetchOne(); - optionRankingUsers.add(0, userRanking); + // 현재 사용자를 추가 + if (userRanking != null) { + optionRankingUsers.add(userRanking); + } } return UserRankingRes.builder() @@ -145,5 +159,6 @@ public UserRankingRes getNRankingDesc(Long id, RankingType type) { .optionRankingRes(optionRankingUsers) .build(); + } }