From 884cbbb6996cf00849680dbce3c8ff09aff8037b Mon Sep 17 00:00:00 2001 From: kwonssshyeon Date: Tue, 9 Jul 2024 13:03:31 +0900 Subject: [PATCH 01/10] =?UTF-8?q?[Fix]:=20UserModel=20->=20UserModel.Info?= =?UTF-8?q?=20=EC=9D=B4=EB=84=88=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=ED=95=A8=EC=97=90=20=EB=94=B0=EB=A5=B8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zzansuni/controller/auth/AuthController.java | 6 +++--- .../org/haedal/zzansuni/controller/auth/AuthRes.java | 2 +- .../org/haedal/zzansuni/domain/auth/AuthService.java | 12 ++++++------ .../domain/challengegroup/ChallengeGroupModel.java | 2 +- .../challengegroup/ChallengeGroupQueryService.java | 2 +- .../challengegroup/review/ChallengeReviewModel.java | 8 ++++---- .../challengegroup/ChallengeGroupReaderImpl.java | 2 +- .../haedal/zzansuni/domain/user/UserServiceTest.java | 4 ++-- 8 files changed, 19 insertions(+), 19 deletions(-) diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthController.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthController.java index a34f434..b9e7497 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthController.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthController.java @@ -27,7 +27,7 @@ public class AuthController { @PostMapping("/api/auth/oauth2") public ApiResponse oauth2( @RequestBody @Valid AuthReq.OAuth2LoginRequest request) { - Pair pair = authService.oAuth2LoginOrSignup(request.provider(), + Pair pair = authService.oAuth2LoginOrSignup(request.provider(), request.code(), request.state()); var response = AuthRes.LoginResponse.from(pair.getFirst(), pair.getSecond()); return ApiResponse.success(response); @@ -37,7 +37,7 @@ public ApiResponse oauth2( @PostMapping("/api/auth/signup") public ApiResponse signup( @RequestBody @Valid AuthReq.EmailSignupRequest request) { - Pair pair = authService.signup(request.toCommand()); + Pair pair = authService.signup(request.toCommand()); var response = AuthRes.LoginResponse.from(pair.getFirst(), pair.getSecond()); return ApiResponse.success(response); } @@ -46,7 +46,7 @@ public ApiResponse signup( @PostMapping("/api/auth/login") public ApiResponse login( @RequestBody @Valid AuthReq.EmailLoginRequest request) { - Pair pair = authService.login(request.email(), request.password()); + Pair pair = authService.login(request.email(), request.password()); var response = AuthRes.LoginResponse.from(pair.getFirst(), pair.getSecond()); return ApiResponse.success(response); } diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthRes.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthRes.java index 7b53e2e..eacbb1f 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthRes.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthRes.java @@ -12,7 +12,7 @@ public record LoginResponse( String refreshToken, UserRes.UserInfo userInfo ) { - public static LoginResponse from(JwtToken jwtToken, UserModel userModel) { + public static LoginResponse from(JwtToken jwtToken, UserModel.Info userModel) { var userInfo = UserRes.UserInfo.from(userModel); return LoginResponse.builder() .accessToken(jwtToken.getAccessToken()) diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/auth/AuthService.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/auth/AuthService.java index c3b1a4b..b15e6ce 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/auth/AuthService.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/auth/AuthService.java @@ -28,7 +28,7 @@ public class AuthService { * OAuth2 로그인 또는 회원가입
[state]는 nullable한 입력 값이다.
1. OAuth2Client를 이용해 해당 provider로부터 * 유저정보를 가져옴 2. authToken으로 유저를 찾거나 없으면 회원가입 3. 토큰 발급, 유저정보 반환 */ - public Pair oAuth2LoginOrSignup(OAuth2Provider provider, + public Pair oAuth2LoginOrSignup(OAuth2Provider provider, @NonNull String code, @Nullable String state) { OAuth2Client oAuth2Client = oAuth2Clients.stream() .filter(client -> client.canHandle(provider)) @@ -45,7 +45,7 @@ public Pair oAuth2LoginOrSignup(OAuth2Provider provider, // 토큰 발급, 유저정보 반환 JwtToken jwtToken = createToken(user); - UserModel userModel = UserModel.from(user); + UserModel.Info userModel = UserModel.Info.from(user); return Pair.of(jwtToken, userModel); } @@ -62,7 +62,7 @@ private JwtToken createToken(User user) { } @Transactional - public Pair signup(UserCommand.Create command) { + public Pair signup(UserCommand.Create command) { if (userReader.existsByEmail(command.getEmail())) { throw new IllegalArgumentException("이미 존재하는 이메일입니다."); } @@ -70,7 +70,7 @@ public Pair signup(UserCommand.Create command) { User user = User.create(command); userStore.store(user); JwtToken jwtToken = createToken(user); - UserModel userModel = UserModel.from(user); + UserModel.Info userModel = UserModel.Info.from(user); return Pair.of(jwtToken, userModel); } @@ -85,7 +85,7 @@ public void createManager(UserCommand.Create command) { } @Transactional(readOnly = true) - public Pair login(String email, String password) { + public Pair login(String email, String password) { User user = userReader.findByEmail(email) .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 이메일입니다.")); @@ -94,7 +94,7 @@ public Pair login(String email, String password) { } JwtToken jwtToken = createToken(user); - UserModel userModel = UserModel.from(user); + UserModel.Info userModel = UserModel.Info.from(user); return Pair.of(jwtToken, userModel); } diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/ChallengeGroupModel.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/ChallengeGroupModel.java index 6c55644..5192d2c 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/ChallengeGroupModel.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/ChallengeGroupModel.java @@ -116,7 +116,7 @@ public static Detail from(ChallengeGroup challengeGroup, List getRankingPage(Pageable pag Integer rank = challengeGroupUserExps.getNumber() * challengeGroupUserExps.getSize() + 1 + i; ChallengeGroupUserExp challengeGroupUserExp = challengeGroupUserExps.getContent().get(i); var rankingModel = ChallengeGroupModel.Ranking.builder() - .user(UserModel.from(challengeGroupUserExp.getUser())) + .user(UserModel.Info.from(challengeGroupUserExp.getUser())) .accumulatedPoint(challengeGroupUserExp.getTotalExp()) .rank(rank) .build(); diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/review/ChallengeReviewModel.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/review/ChallengeReviewModel.java index 0c2f8c3..3fddd14 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/review/ChallengeReviewModel.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/review/ChallengeReviewModel.java @@ -12,13 +12,13 @@ public class ChallengeReviewModel { public record ChallengeReviewWithUserInfo( Long challengeId, String challengeTitle, - UserModel user, + UserModel.Info user, String content, Integer rating ) { public static ChallengeReviewWithUserInfo from(ChallengeReview challengeReview) { - var userModel = UserModel.from(challengeReview.getUserChallenge().getUser()); + var userModel = UserModel.Info.from(challengeReview.getUserChallenge().getUser()); return ChallengeReviewWithUserInfo.builder() .challengeId(challengeReview.getUserChallenge().getChallenge().getId()) .challengeTitle( @@ -36,13 +36,13 @@ public record ChallengeReviewWithChallenge( Long challengeId, String challengeTitle, Integer challengeDifficulty, - UserModel user, + UserModel.Info user, String content, Integer rating ) { public static ChallengeReviewWithChallenge from(ChallengeReview challengeReview) { - var userModel = UserModel.from(challengeReview.getUserChallenge().getUser()); + var userModel = UserModel.Info.from(challengeReview.getUserChallenge().getUser()); return ChallengeReviewWithChallenge.builder() .challengeId(challengeReview.getUserChallenge().getChallenge().getId()) .challengeTitle( diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/ChallengeGroupReaderImpl.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/ChallengeGroupReaderImpl.java index 6e9f0e7..a4d4699 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/ChallengeGroupReaderImpl.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/ChallengeGroupReaderImpl.java @@ -142,7 +142,7 @@ public ChallengeGroupModel.Ranking getRanking(Long challengeGroupId, Long userId return ChallengeGroupModel.Ranking.builder() .rank(rank==null ? 0 : rank) .accumulatedPoint(challengeGroupUserExp != null ? challengeGroupUserExp.getTotalExp() : 0) - .user(UserModel.from(user)) + .user(UserModel.Info.from(user)) .build(); } diff --git a/zzansuni-api-server/app/src/test/java/org/haedal/zzansuni/domain/user/UserServiceTest.java b/zzansuni-api-server/app/src/test/java/org/haedal/zzansuni/domain/user/UserServiceTest.java index 16e2d27..7b7a453 100644 --- a/zzansuni-api-server/app/src/test/java/org/haedal/zzansuni/domain/user/UserServiceTest.java +++ b/zzansuni-api-server/app/src/test/java/org/haedal/zzansuni/domain/user/UserServiceTest.java @@ -39,7 +39,7 @@ public void getUserModel(){ when(userReader.getById(1L)).thenReturn(createUser(1L,"테스트유저1")); //when - UserModel userModel = userService.getUserModel(1L); + UserModel.Info userModel = userService.getUserModel(1L); //then assertNotNull(userModel); @@ -84,7 +84,7 @@ public void getUserPagingByRanking(){ when(userReader.getUserPagingByRanking(pageable)).thenReturn(new PageImpl<>(userList, pageable, userList.size())); //when - Page userPage = userService.getUserPagingByRanking(pageable); + Page userPage = userService.getUserPagingByRanking(pageable); //then From d368f2e9c7fe38c4336d893071c85676cb869660 Mon Sep 17 00:00:00 2001 From: kwonssshyeon Date: Tue, 9 Jul 2024 13:05:59 +0900 Subject: [PATCH 02/10] =?UTF-8?q?[Feat]:=20=EC=9C=A0=EC=A0=80=20=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EB=A6=AD=20=EC=A1=B0=ED=9A=8C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/user/UserController.java | 10 +-- .../zzansuni/controller/user/UserRes.java | 12 +++- .../userchallenge/UserChallengeReader.java | 6 ++ .../zzansuni/domain/user/UserModel.java | 65 ++++++++++++++----- .../zzansuni/domain/user/UserService.java | 27 ++++++-- .../UserChallengeReaderImpl.java | 8 +++ .../UserChallengeRepository.java | 45 +++++++++++++ 7 files changed, 140 insertions(+), 33 deletions(-) diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/user/UserController.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/user/UserController.java index 68c458f..c2fe9b9 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/user/UserController.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/user/UserController.java @@ -14,7 +14,6 @@ import org.springframework.web.bind.annotation.*; import java.time.LocalDate; -import java.util.List; @Tag(name = "user", description = "유저 API") @RequiredArgsConstructor @@ -44,16 +43,13 @@ public ApiResponse updateUser( @Operation(summary = "스트릭 조회", description = "스트릭을 조회한다.") @GetMapping("/api/user/strick") - public ApiResponse> getStrick( + public ApiResponse getStrick( @AuthenticationPrincipal JwtUser jwtUser, @RequestParam(required = false) LocalDate startDate, // false면 오늘 @RequestParam(required = false) LocalDate endDate // false면 365일전 ) { - return ApiResponse.success(List.of( - new UserRes.Strick(List.of( - new UserRes.DayCount(LocalDate.now(), 1) - )) - )); + var userModelStrick = userService.getUserStrick(jwtUser.getId(), startDate, endDate); + return ApiResponse.success(UserRes.Strick.from(userModelStrick)); } @Operation(summary = "유저 랭킹 페이징", description = "전체 유저 랭킹을 조회 페이징") diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/user/UserRes.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/user/UserRes.java index 687461e..8bfd70f 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/user/UserRes.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/user/UserRes.java @@ -16,7 +16,7 @@ public record UserInfo( String email, TierInfo tierInfo ) { - public static UserInfo from(UserModel userModel) { + public static UserInfo from(UserModel.Info userModel) { var tierInfo = TierInfo.from(userModel.exp()); return UserInfo.builder() .id(userModel.id()) @@ -35,7 +35,7 @@ public record User( String profileImageUrl, TierInfo tierInfo ) { - public static User from(UserModel userModel) { + public static User from(UserModel.Info userModel) { var tierInfo = TierInfo.from(userModel.exp()); return User.builder() .id(userModel.id()) @@ -65,8 +65,14 @@ public static TierInfo from(Integer exp) { @Builder public record Strick( - List dayCounts + /** 여기서 Model의 DayCount를 사용해도 되는지 */ + List dayCounts ) { + public static Strick from(UserModel.Strick strick){ + return Strick.builder() + .dayCounts(strick.dayCounts()) + .build(); + } } /** diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/userchallenge/UserChallengeReader.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/userchallenge/UserChallengeReader.java index 1cde291..e1187c0 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/userchallenge/UserChallengeReader.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/userchallenge/UserChallengeReader.java @@ -1,6 +1,10 @@ package org.haedal.zzansuni.domain.challengegroup.userchallenge; +import java.time.LocalDate; +import java.util.List; import java.util.Optional; + +import org.apache.commons.lang3.tuple.Pair; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -21,4 +25,6 @@ public interface UserChallengeReader { Page getCurrentChallengePageByUserId(Long userId, Pageable pageable); Page getCompletedChallengePageByUserId(Long userId, Pageable pageable); + + List> findAllByUserIdAndCreatedAt(Long userId, LocalDate startDate, LocalDate endDate); } diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserModel.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserModel.java index e5f11a1..d1db460 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserModel.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserModel.java @@ -1,23 +1,52 @@ package org.haedal.zzansuni.domain.user; import lombok.Builder; -import lombok.Getter; -@Builder -public record UserModel( - Long id, - String email, - String nickname, - String profileImageUrl, - Integer exp -) { - public static UserModel from(User user) { - return UserModel.builder() - .id(user.getId()) - .email(user.getEmail()) - .nickname(user.getNickname()) - .profileImageUrl(user.getProfileImageUrl()) - .exp(user.getExp()) - .build(); +import java.time.LocalDate; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + + +public class UserModel{ + @Builder + public record Info( + Long id, + String email, + String nickname, + String profileImageUrl, + Integer exp + ) { + public static Info from(User user) { + return Info.builder() + .id(user.getId()) + .email(user.getEmail()) + .nickname(user.getNickname()) + .profileImageUrl(user.getProfileImageUrl()) + .exp(user.getExp()) + .build(); + } + } + + @Builder + public record Strick( + List dayCounts + ) { + /** 여기서 count 0인걸 포함하는 기능을 쓰는게 맞는지 */ + public static Strick from(Map strickCounts, LocalDate startDate, LocalDate endDate) { + List resultList = startDate.datesUntil(endDate.plusDays(1)) + // 날짜가 존재하면 map(date)로 count를 가져오고, 없으면 0을 저장한다. + .map(date -> new DayCount(date, strickCounts.getOrDefault(date, 0))) + .collect(Collectors.toList()); + return new Strick(resultList); + } } -} + @Builder + public record DayCount( + LocalDate date, + Integer count + ) { + } + + +} \ No newline at end of file diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java index 9843d66..77c7f54 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java @@ -1,21 +1,30 @@ package org.haedal.zzansuni.domain.user; import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.tuple.Pair; +import org.haedal.zzansuni.domain.challengegroup.userchallenge.UserChallengeReader; +import org.haedal.zzansuni.domain.challengegroup.verification.ChallengeVerificationReader; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + @RequiredArgsConstructor @Service public class UserService { private final UserReader userReader; - private final UserStore userStore; + private final UserChallengeReader userChallengeReader; + private final ChallengeVerificationReader challengeVerificationReader; @Transactional(readOnly = true) - public UserModel getUserModel(Long id) { + public UserModel.Info getUserModel(Long id) { User user = userReader.getById(id); - return UserModel.from(user); + return UserModel.Info.from(user); } /** @@ -29,8 +38,16 @@ public void updateUser(Long id, UserCommand.Update userUpdate) { @Transactional(readOnly = true) - public Page getUserPagingByRanking(Pageable pageable) { + public Page getUserPagingByRanking(Pageable pageable) { Page users = userReader.getUserPagingByRanking(pageable); - return users.map(UserModel::from); + return users.map(UserModel.Info::from); + } + + @Transactional(readOnly = true) + public UserModel.Strick getUserStrick(Long id, LocalDate startDate, LocalDate endDate){ + List> userStricks = userChallengeReader.findAllByUserIdAndCreatedAt(id, startDate, endDate); + Map map = userStricks.stream() + .collect(Collectors.toMap(Pair::getLeft, Pair::getRight)); + return UserModel.Strick.from(map, startDate, endDate); } } diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeReaderImpl.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeReaderImpl.java index e99713d..3b5c519 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeReaderImpl.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeReaderImpl.java @@ -2,11 +2,14 @@ import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; + +import java.time.LocalDate; import java.util.List; import java.util.NoSuchElementException; import java.util.Optional; import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.tuple.Pair; import org.haedal.zzansuni.domain.challengegroup.challenge.ChallengeStatus; import org.haedal.zzansuni.domain.challengegroup.userchallenge.QUserChallenge; import org.haedal.zzansuni.domain.challengegroup.userchallenge.UserChallenge; @@ -129,4 +132,9 @@ private BooleanExpression eqProceeding() { private BooleanExpression neProceeding() { return QUserChallenge.userChallenge.status.ne(ChallengeStatus.PROCEEDING); } + + @Override + public List> findAllByUserIdAndCreatedAt(Long userId, LocalDate startDate, LocalDate endDate){ + return userChallengeRepository.findAllByUserIdAndCreatedAt(userId, startDate, endDate); + } } diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeRepository.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeRepository.java index 527eb46..2c8237c 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeRepository.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeRepository.java @@ -1,7 +1,13 @@ package org.haedal.zzansuni.infrastructure.challengegroup.userchallenge; +import java.time.LocalDate; + +import java.util.List; import java.util.Optional; + +import org.apache.commons.lang3.tuple.Pair; import org.haedal.zzansuni.domain.challengegroup.userchallenge.UserChallenge; +import org.springframework.context.annotation.Profile; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -28,4 +34,43 @@ Optional findByChallengeIdWithFetchLazy( @Param("challengeId") Long challengeId, @Param("userId") Long userId ); +// /** mysql */ +// @Profile({"dev"}) +// @Query("SELECT DATE(cv.createdAt), count(*) FROM UserChallenge uc " + +// "LEFT JOIN uc.challengeVerifications cv " + +// "WHERE uc.user.id = :userId " + +// "AND DATE(uc.createdAt) >= :startDate " + +// "AND DATE(cv.createdAt) <= :endDate " + +// "AND cv.status = 'APPROVED' " + +// "GROUP BY DATE(cv.createdAt) " + +// "ORDER BY DATE(cv.createdAt)") +// List> findAllByUserIdAndCreatedAt( +// @Param("userId") Long userId, +// @Param("startDate")LocalDate startDate, +// @Param("endDate")LocalDate endDate +// ); + + /** + * h2 database + * 유저의 스트릭을 조회하는 쿼리 + * userId로 챌린지 찾고, userChallenge의 생성시점과 startDate를 비교하고 + * challengeVerification을 left join하여 가져옴 + * verification의 생성시점과 endDate를 비교하고 필터링된 레코드를 날짜기준 그룹화 -> 정렬 + * + * 이 쿼리가 userChallenge에 있는게 맞는지, challengeVerification에 있는게 맞는지 + */ + @Profile({"default"}) + @Query("SELECT FORMATDATETIME(cv.createdAt, 'yyyy-MM-dd'), count(*) FROM UserChallenge uc " + + "LEFT JOIN uc.challengeVerifications cv " + + "WHERE uc.user.id = :userId " + + "AND FORMATDATETIME(cv.createdAt, 'yyyy-MM-dd') >= :startDate " + + "AND FORMATDATETIME(uc.createdAt, 'yyyy-MM-dd') <= :endDate " + + "AND cv.status = 'APPROVED' " + + "GROUP BY FORMATDATETIME(cv.createdAt, 'yyyy-MM-dd') " + + "ORDER BY FORMATDATETIME(cv.createdAt, 'yyyy-MM-dd')") + List> findAllByUserIdAndCreatedAt( + @Param("userId") Long userId, + @Param("startDate")LocalDate startDate, + @Param("endDate")LocalDate endDate + ); } From e8f660cd6f482c8fd32e054545c378228d78ec11 Mon Sep 17 00:00:00 2001 From: kwonssshyeon Date: Tue, 9 Jul 2024 16:06:18 +0900 Subject: [PATCH 03/10] =?UTF-8?q?Fix:=20H2=EC=97=90=EC=84=9C=20MySQL?= =?UTF-8?q?=EB=AC=B8=EB=B2=95=EC=9D=84=20=EC=82=AC=EC=9A=A9=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserChallengeRepository.java | 30 ++++--------------- .../app/src/main/resources/application.yml | 2 +- 2 files changed, 7 insertions(+), 25 deletions(-) diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeRepository.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeRepository.java index 2c8237c..457505b 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeRepository.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeRepository.java @@ -7,7 +7,6 @@ import org.apache.commons.lang3.tuple.Pair; import org.haedal.zzansuni.domain.challengegroup.userchallenge.UserChallenge; -import org.springframework.context.annotation.Profile; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -34,24 +33,8 @@ Optional findByChallengeIdWithFetchLazy( @Param("challengeId") Long challengeId, @Param("userId") Long userId ); -// /** mysql */ -// @Profile({"dev"}) -// @Query("SELECT DATE(cv.createdAt), count(*) FROM UserChallenge uc " + -// "LEFT JOIN uc.challengeVerifications cv " + -// "WHERE uc.user.id = :userId " + -// "AND DATE(uc.createdAt) >= :startDate " + -// "AND DATE(cv.createdAt) <= :endDate " + -// "AND cv.status = 'APPROVED' " + -// "GROUP BY DATE(cv.createdAt) " + -// "ORDER BY DATE(cv.createdAt)") -// List> findAllByUserIdAndCreatedAt( -// @Param("userId") Long userId, -// @Param("startDate")LocalDate startDate, -// @Param("endDate")LocalDate endDate -// ); - /** - * h2 database + * mysql * 유저의 스트릭을 조회하는 쿼리 * userId로 챌린지 찾고, userChallenge의 생성시점과 startDate를 비교하고 * challengeVerification을 left join하여 가져옴 @@ -59,15 +42,14 @@ Optional findByChallengeIdWithFetchLazy( * * 이 쿼리가 userChallenge에 있는게 맞는지, challengeVerification에 있는게 맞는지 */ - @Profile({"default"}) - @Query("SELECT FORMATDATETIME(cv.createdAt, 'yyyy-MM-dd'), count(*) FROM UserChallenge uc " + + @Query("SELECT DATE(cv.createdAt), count(*) FROM UserChallenge uc " + "LEFT JOIN uc.challengeVerifications cv " + "WHERE uc.user.id = :userId " + - "AND FORMATDATETIME(cv.createdAt, 'yyyy-MM-dd') >= :startDate " + - "AND FORMATDATETIME(uc.createdAt, 'yyyy-MM-dd') <= :endDate " + + "AND DATE(uc.createdAt) >= :startDate " + + "AND DATE(cv.createdAt) <= :endDate " + "AND cv.status = 'APPROVED' " + - "GROUP BY FORMATDATETIME(cv.createdAt, 'yyyy-MM-dd') " + - "ORDER BY FORMATDATETIME(cv.createdAt, 'yyyy-MM-dd')") + "GROUP BY DATE(cv.createdAt) " + + "ORDER BY DATE(cv.createdAt)") List> findAllByUserIdAndCreatedAt( @Param("userId") Long userId, @Param("startDate")LocalDate startDate, diff --git a/zzansuni-api-server/app/src/main/resources/application.yml b/zzansuni-api-server/app/src/main/resources/application.yml index 453985d..312a780 100644 --- a/zzansuni-api-server/app/src/main/resources/application.yml +++ b/zzansuni-api-server/app/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: # default test profile datasource: - url: "jdbc:h2:mem:zzansuni;" + url: "jdbc:h2:mem:zzansuni;MODE=MySQL" username: "sa" password: "" driver-class-name: org.h2.Driver From ce0272bd3511ba0f622405a09a23c09f78f4d82f Mon Sep 17 00:00:00 2001 From: kwonssshyeon Date: Wed, 10 Jul 2024 11:37:58 +0900 Subject: [PATCH 04/10] [Rename]: UserModel.Info -> UserModel.Main --- .../zzansuni/controller/auth/AuthController.java | 6 +++--- .../haedal/zzansuni/controller/auth/AuthRes.java | 2 +- .../haedal/zzansuni/controller/user/UserRes.java | 4 ++-- .../haedal/zzansuni/domain/auth/AuthService.java | 14 +++++++------- .../domain/challengegroup/ChallengeGroupModel.java | 3 +-- .../challengegroup/ChallengeGroupQueryService.java | 2 +- .../review/ChallengeReviewModel.java | 8 ++++---- .../org/haedal/zzansuni/domain/user/UserModel.java | 6 +++--- .../haedal/zzansuni/domain/user/UserService.java | 8 ++++---- .../challengegroup/ChallengeGroupReaderImpl.java | 2 +- .../zzansuni/domain/user/UserServiceTest.java | 5 ++--- 11 files changed, 29 insertions(+), 31 deletions(-) diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthController.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthController.java index b9e7497..fbfe93f 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthController.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthController.java @@ -27,7 +27,7 @@ public class AuthController { @PostMapping("/api/auth/oauth2") public ApiResponse oauth2( @RequestBody @Valid AuthReq.OAuth2LoginRequest request) { - Pair pair = authService.oAuth2LoginOrSignup(request.provider(), + Pair pair = authService.oAuth2LoginOrSignup(request.provider(), request.code(), request.state()); var response = AuthRes.LoginResponse.from(pair.getFirst(), pair.getSecond()); return ApiResponse.success(response); @@ -37,7 +37,7 @@ public ApiResponse oauth2( @PostMapping("/api/auth/signup") public ApiResponse signup( @RequestBody @Valid AuthReq.EmailSignupRequest request) { - Pair pair = authService.signup(request.toCommand()); + Pair pair = authService.signup(request.toCommand()); var response = AuthRes.LoginResponse.from(pair.getFirst(), pair.getSecond()); return ApiResponse.success(response); } @@ -46,7 +46,7 @@ public ApiResponse signup( @PostMapping("/api/auth/login") public ApiResponse login( @RequestBody @Valid AuthReq.EmailLoginRequest request) { - Pair pair = authService.login(request.email(), request.password()); + Pair pair = authService.login(request.email(), request.password()); var response = AuthRes.LoginResponse.from(pair.getFirst(), pair.getSecond()); return ApiResponse.success(response); } diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthRes.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthRes.java index eacbb1f..9c67ab9 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthRes.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthRes.java @@ -12,7 +12,7 @@ public record LoginResponse( String refreshToken, UserRes.UserInfo userInfo ) { - public static LoginResponse from(JwtToken jwtToken, UserModel.Info userModel) { + public static LoginResponse from(JwtToken jwtToken, UserModel.Model userModel) { var userInfo = UserRes.UserInfo.from(userModel); return LoginResponse.builder() .accessToken(jwtToken.getAccessToken()) diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/user/UserRes.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/user/UserRes.java index 8bfd70f..49a1c4c 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/user/UserRes.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/user/UserRes.java @@ -16,7 +16,7 @@ public record UserInfo( String email, TierInfo tierInfo ) { - public static UserInfo from(UserModel.Info userModel) { + public static UserInfo from(UserModel.Model userModel) { var tierInfo = TierInfo.from(userModel.exp()); return UserInfo.builder() .id(userModel.id()) @@ -35,7 +35,7 @@ public record User( String profileImageUrl, TierInfo tierInfo ) { - public static User from(UserModel.Info userModel) { + public static User from(UserModel.Model userModel) { var tierInfo = TierInfo.from(userModel.exp()); return User.builder() .id(userModel.id()) diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/auth/AuthService.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/auth/AuthService.java index b15e6ce..0fe3c31 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/auth/AuthService.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/auth/AuthService.java @@ -28,8 +28,8 @@ public class AuthService { * OAuth2 로그인 또는 회원가입
[state]는 nullable한 입력 값이다.
1. OAuth2Client를 이용해 해당 provider로부터 * 유저정보를 가져옴 2. authToken으로 유저를 찾거나 없으면 회원가입 3. 토큰 발급, 유저정보 반환 */ - public Pair oAuth2LoginOrSignup(OAuth2Provider provider, - @NonNull String code, @Nullable String state) { + public Pair oAuth2LoginOrSignup(OAuth2Provider provider, + @NonNull String code, @Nullable String state) { OAuth2Client oAuth2Client = oAuth2Clients.stream() .filter(client -> client.canHandle(provider)) .findFirst() @@ -45,7 +45,7 @@ public Pair oAuth2LoginOrSignup(OAuth2Provider provide // 토큰 발급, 유저정보 반환 JwtToken jwtToken = createToken(user); - UserModel.Info userModel = UserModel.Info.from(user); + UserModel.Model userModel = UserModel.Model.from(user); return Pair.of(jwtToken, userModel); } @@ -62,7 +62,7 @@ private JwtToken createToken(User user) { } @Transactional - public Pair signup(UserCommand.Create command) { + public Pair signup(UserCommand.Create command) { if (userReader.existsByEmail(command.getEmail())) { throw new IllegalArgumentException("이미 존재하는 이메일입니다."); } @@ -70,7 +70,7 @@ public Pair signup(UserCommand.Create command) { User user = User.create(command); userStore.store(user); JwtToken jwtToken = createToken(user); - UserModel.Info userModel = UserModel.Info.from(user); + UserModel.Model userModel = UserModel.Model.from(user); return Pair.of(jwtToken, userModel); } @@ -85,7 +85,7 @@ public void createManager(UserCommand.Create command) { } @Transactional(readOnly = true) - public Pair login(String email, String password) { + public Pair login(String email, String password) { User user = userReader.findByEmail(email) .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 이메일입니다.")); @@ -94,7 +94,7 @@ public Pair login(String email, String password) { } JwtToken jwtToken = createToken(user); - UserModel.Info userModel = UserModel.Info.from(user); + UserModel.Model userModel = UserModel.Model.from(user); return Pair.of(jwtToken, userModel); } diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/ChallengeGroupModel.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/ChallengeGroupModel.java index 5192d2c..e4e5279 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/ChallengeGroupModel.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/ChallengeGroupModel.java @@ -1,7 +1,6 @@ package org.haedal.zzansuni.domain.challengegroup; import lombok.Builder; -import lombok.Getter; import org.haedal.zzansuni.domain.challengegroup.challenge.ChallengeModel; import org.haedal.zzansuni.domain.challengegroup.image.ChallengeGroupImage; import org.haedal.zzansuni.domain.user.UserModel; @@ -116,7 +115,7 @@ public static Detail from(ChallengeGroup challengeGroup, List getRankingPage(Pageable pag Integer rank = challengeGroupUserExps.getNumber() * challengeGroupUserExps.getSize() + 1 + i; ChallengeGroupUserExp challengeGroupUserExp = challengeGroupUserExps.getContent().get(i); var rankingModel = ChallengeGroupModel.Ranking.builder() - .user(UserModel.Info.from(challengeGroupUserExp.getUser())) + .user(UserModel.Model.from(challengeGroupUserExp.getUser())) .accumulatedPoint(challengeGroupUserExp.getTotalExp()) .rank(rank) .build(); diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/review/ChallengeReviewModel.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/review/ChallengeReviewModel.java index 3fddd14..49df3c4 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/review/ChallengeReviewModel.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/review/ChallengeReviewModel.java @@ -12,13 +12,13 @@ public class ChallengeReviewModel { public record ChallengeReviewWithUserInfo( Long challengeId, String challengeTitle, - UserModel.Info user, + UserModel.Model user, String content, Integer rating ) { public static ChallengeReviewWithUserInfo from(ChallengeReview challengeReview) { - var userModel = UserModel.Info.from(challengeReview.getUserChallenge().getUser()); + var userModel = UserModel.Model.from(challengeReview.getUserChallenge().getUser()); return ChallengeReviewWithUserInfo.builder() .challengeId(challengeReview.getUserChallenge().getChallenge().getId()) .challengeTitle( @@ -36,13 +36,13 @@ public record ChallengeReviewWithChallenge( Long challengeId, String challengeTitle, Integer challengeDifficulty, - UserModel.Info user, + UserModel.Model user, String content, Integer rating ) { public static ChallengeReviewWithChallenge from(ChallengeReview challengeReview) { - var userModel = UserModel.Info.from(challengeReview.getUserChallenge().getUser()); + var userModel = UserModel.Model.from(challengeReview.getUserChallenge().getUser()); return ChallengeReviewWithChallenge.builder() .challengeId(challengeReview.getUserChallenge().getChallenge().getId()) .challengeTitle( diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserModel.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserModel.java index d1db460..6a460a6 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserModel.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserModel.java @@ -10,15 +10,15 @@ public class UserModel{ @Builder - public record Info( + public record Model( Long id, String email, String nickname, String profileImageUrl, Integer exp ) { - public static Info from(User user) { - return Info.builder() + public static Model from(User user) { + return Model.builder() .id(user.getId()) .email(user.getEmail()) .nickname(user.getNickname()) diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java index 77c7f54..7573d61 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java @@ -22,9 +22,9 @@ public class UserService { private final ChallengeVerificationReader challengeVerificationReader; @Transactional(readOnly = true) - public UserModel.Info getUserModel(Long id) { + public UserModel.Model getUserModel(Long id) { User user = userReader.getById(id); - return UserModel.Info.from(user); + return UserModel.Model.from(user); } /** @@ -38,9 +38,9 @@ public void updateUser(Long id, UserCommand.Update userUpdate) { @Transactional(readOnly = true) - public Page getUserPagingByRanking(Pageable pageable) { + public Page getUserPagingByRanking(Pageable pageable) { Page users = userReader.getUserPagingByRanking(pageable); - return users.map(UserModel.Info::from); + return users.map(UserModel.Model::from); } @Transactional(readOnly = true) diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/ChallengeGroupReaderImpl.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/ChallengeGroupReaderImpl.java index a4d4699..2e05858 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/ChallengeGroupReaderImpl.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/ChallengeGroupReaderImpl.java @@ -142,7 +142,7 @@ public ChallengeGroupModel.Ranking getRanking(Long challengeGroupId, Long userId return ChallengeGroupModel.Ranking.builder() .rank(rank==null ? 0 : rank) .accumulatedPoint(challengeGroupUserExp != null ? challengeGroupUserExp.getTotalExp() : 0) - .user(UserModel.Info.from(user)) + .user(UserModel.Model.from(user)) .build(); } diff --git a/zzansuni-api-server/app/src/test/java/org/haedal/zzansuni/domain/user/UserServiceTest.java b/zzansuni-api-server/app/src/test/java/org/haedal/zzansuni/domain/user/UserServiceTest.java index 7b7a453..8ac3db6 100644 --- a/zzansuni-api-server/app/src/test/java/org/haedal/zzansuni/domain/user/UserServiceTest.java +++ b/zzansuni-api-server/app/src/test/java/org/haedal/zzansuni/domain/user/UserServiceTest.java @@ -1,7 +1,6 @@ package org.haedal.zzansuni.domain.user; import org.haedal.zzansuni.global.security.Role; -import org.haedal.zzansuni.infrastructure.user.UserRepository; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -39,7 +38,7 @@ public void getUserModel(){ when(userReader.getById(1L)).thenReturn(createUser(1L,"테스트유저1")); //when - UserModel.Info userModel = userService.getUserModel(1L); + UserModel.Model userModel = userService.getUserModel(1L); //then assertNotNull(userModel); @@ -84,7 +83,7 @@ public void getUserPagingByRanking(){ when(userReader.getUserPagingByRanking(pageable)).thenReturn(new PageImpl<>(userList, pageable, userList.size())); //when - Page userPage = userService.getUserPagingByRanking(pageable); + Page userPage = userService.getUserPagingByRanking(pageable); //then From 41fb269fd539894cd106a878438ae6d22022bfa7 Mon Sep 17 00:00:00 2001 From: kwonssshyeon Date: Wed, 10 Jul 2024 12:50:02 +0900 Subject: [PATCH 05/10] =?UTF-8?q?[Rename]:=20=EC=8A=A4=ED=8A=B8=EB=A6=AD?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=A6=84=20=EB=B3=80=EA=B2=BD=20->=20countAllByUserIdAndDate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../userchallenge/UserChallengeReader.java | 2 +- .../org/haedal/zzansuni/domain/user/UserService.java | 3 +-- .../userchallenge/UserChallengeReaderImpl.java | 4 ++-- .../userchallenge/UserChallengeRepository.java | 2 +- .../haedal/zzansuni/domain/user/UserServiceTest.java | 11 ++++++++--- 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/userchallenge/UserChallengeReader.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/userchallenge/UserChallengeReader.java index e1187c0..4bdc08f 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/userchallenge/UserChallengeReader.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/userchallenge/UserChallengeReader.java @@ -26,5 +26,5 @@ public interface UserChallengeReader { Page getCompletedChallengePageByUserId(Long userId, Pageable pageable); - List> findAllByUserIdAndCreatedAt(Long userId, LocalDate startDate, LocalDate endDate); + List> countAllByUserIdAndDate(Long userId, LocalDate startDate, LocalDate endDate); } diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java index 7573d61..c5175ea 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java @@ -19,7 +19,6 @@ public class UserService { private final UserReader userReader; private final UserChallengeReader userChallengeReader; - private final ChallengeVerificationReader challengeVerificationReader; @Transactional(readOnly = true) public UserModel.Model getUserModel(Long id) { @@ -45,7 +44,7 @@ public Page getUserPagingByRanking(Pageable pageable) { @Transactional(readOnly = true) public UserModel.Strick getUserStrick(Long id, LocalDate startDate, LocalDate endDate){ - List> userStricks = userChallengeReader.findAllByUserIdAndCreatedAt(id, startDate, endDate); + List> userStricks = userChallengeReader.countAllByUserIdAndDate(id, startDate, endDate); Map map = userStricks.stream() .collect(Collectors.toMap(Pair::getLeft, Pair::getRight)); return UserModel.Strick.from(map, startDate, endDate); diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeReaderImpl.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeReaderImpl.java index 3b5c519..959baa8 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeReaderImpl.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeReaderImpl.java @@ -134,7 +134,7 @@ private BooleanExpression neProceeding() { } @Override - public List> findAllByUserIdAndCreatedAt(Long userId, LocalDate startDate, LocalDate endDate){ - return userChallengeRepository.findAllByUserIdAndCreatedAt(userId, startDate, endDate); + public List> countAllByUserIdAndDate(Long userId, LocalDate startDate, LocalDate endDate){ + return userChallengeRepository.countAllByUserIdAndDate(userId, startDate, endDate); } } diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeRepository.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeRepository.java index 457505b..1e29f01 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeRepository.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeRepository.java @@ -50,7 +50,7 @@ Optional findByChallengeIdWithFetchLazy( "AND cv.status = 'APPROVED' " + "GROUP BY DATE(cv.createdAt) " + "ORDER BY DATE(cv.createdAt)") - List> findAllByUserIdAndCreatedAt( + List> countAllByUserIdAndDate( @Param("userId") Long userId, @Param("startDate")LocalDate startDate, @Param("endDate")LocalDate endDate diff --git a/zzansuni-api-server/app/src/test/java/org/haedal/zzansuni/domain/user/UserServiceTest.java b/zzansuni-api-server/app/src/test/java/org/haedal/zzansuni/domain/user/UserServiceTest.java index 8ac3db6..bb6bfa4 100644 --- a/zzansuni-api-server/app/src/test/java/org/haedal/zzansuni/domain/user/UserServiceTest.java +++ b/zzansuni-api-server/app/src/test/java/org/haedal/zzansuni/domain/user/UserServiceTest.java @@ -28,8 +28,6 @@ public class UserServiceTest { @Mock private UserReader userReader; -// @Mock -// private UserRepository userRepository; @DisplayName("사용자 정보를 조회한다.") @Test @@ -105,7 +103,7 @@ public void getUserPagingByRankingWithInvalidPage(){ } - // 레포지토리 테스트에 있어야 함ㅎ. + @DisplayName("전체 사용자 랭킹이 내림차순으로 나타난다.") @Test public void getUserPagingByRankingOrder(){ @@ -113,6 +111,13 @@ public void getUserPagingByRankingOrder(){ } + @DisplayName("유저의 스트릭을 조회한다.") + @Test + public void getUserStrick(){ + + } + + User createUser(Long id, String nickname){ return User.builder() From c458e2d1c0a8d08c3434f7c213577d7b08b91346 Mon Sep 17 00:00:00 2001 From: kwonssshyeon Date: Wed, 10 Jul 2024 15:14:42 +0900 Subject: [PATCH 06/10] [Fix]: UserModel.Model -> UserModel.Main --- .../controller/auth/AuthController.java | 6 ++--- .../zzansuni/controller/auth/AuthRes.java | 4 ++-- .../zzansuni/controller/user/UserRes.java | 22 +++++++++---------- .../zzansuni/domain/auth/AuthService.java | 20 ++++++++--------- .../challengegroup/ChallengeGroupModel.java | 2 +- .../ChallengeGroupQueryService.java | 2 +- .../review/ChallengeReviewModel.java | 8 +++---- .../zzansuni/domain/user/UserModel.java | 6 ++--- .../zzansuni/domain/user/UserService.java | 9 ++++---- .../ChallengeGroupReaderImpl.java | 2 +- .../zzansuni/domain/auth/AuthServiceTest.java | 2 +- .../zzansuni/domain/user/UserServiceTest.java | 12 +++++----- 12 files changed, 48 insertions(+), 47 deletions(-) diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthController.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthController.java index fbfe93f..db1bff1 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthController.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthController.java @@ -27,7 +27,7 @@ public class AuthController { @PostMapping("/api/auth/oauth2") public ApiResponse oauth2( @RequestBody @Valid AuthReq.OAuth2LoginRequest request) { - Pair pair = authService.oAuth2LoginOrSignup(request.provider(), + Pair pair = authService.oAuth2LoginOrSignup(request.provider(), request.code(), request.state()); var response = AuthRes.LoginResponse.from(pair.getFirst(), pair.getSecond()); return ApiResponse.success(response); @@ -37,7 +37,7 @@ public ApiResponse oauth2( @PostMapping("/api/auth/signup") public ApiResponse signup( @RequestBody @Valid AuthReq.EmailSignupRequest request) { - Pair pair = authService.signup(request.toCommand()); + Pair pair = authService.signup(request.toCommand()); var response = AuthRes.LoginResponse.from(pair.getFirst(), pair.getSecond()); return ApiResponse.success(response); } @@ -46,7 +46,7 @@ public ApiResponse signup( @PostMapping("/api/auth/login") public ApiResponse login( @RequestBody @Valid AuthReq.EmailLoginRequest request) { - Pair pair = authService.login(request.email(), request.password()); + Pair pair = authService.login(request.email(), request.password()); var response = AuthRes.LoginResponse.from(pair.getFirst(), pair.getSecond()); return ApiResponse.success(response); } diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthRes.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthRes.java index 9c67ab9..739f534 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthRes.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/auth/AuthRes.java @@ -12,8 +12,8 @@ public record LoginResponse( String refreshToken, UserRes.UserInfo userInfo ) { - public static LoginResponse from(JwtToken jwtToken, UserModel.Model userModel) { - var userInfo = UserRes.UserInfo.from(userModel); + public static LoginResponse from(JwtToken jwtToken, UserModel.Main userMain) { + var userInfo = UserRes.UserInfo.from(userMain); return LoginResponse.builder() .accessToken(jwtToken.getAccessToken()) .refreshToken(jwtToken.getRefreshToken()) diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/user/UserRes.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/user/UserRes.java index 49a1c4c..2f971d7 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/user/UserRes.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/controller/user/UserRes.java @@ -16,13 +16,13 @@ public record UserInfo( String email, TierInfo tierInfo ) { - public static UserInfo from(UserModel.Model userModel) { - var tierInfo = TierInfo.from(userModel.exp()); + public static UserInfo from(UserModel.Main userMain) { + var tierInfo = TierInfo.from(userMain.exp()); return UserInfo.builder() - .id(userModel.id()) - .nickname(userModel.nickname()) - .profileImageUrl(userModel.profileImageUrl()) - .email(userModel.email()) + .id(userMain.id()) + .nickname(userMain.nickname()) + .profileImageUrl(userMain.profileImageUrl()) + .email(userMain.email()) .tierInfo(tierInfo) .build(); } @@ -35,12 +35,12 @@ public record User( String profileImageUrl, TierInfo tierInfo ) { - public static User from(UserModel.Model userModel) { - var tierInfo = TierInfo.from(userModel.exp()); + public static User from(UserModel.Main userMain) { + var tierInfo = TierInfo.from(userMain.exp()); return User.builder() - .id(userModel.id()) - .nickname(userModel.nickname()) - .profileImageUrl(userModel.profileImageUrl()) + .id(userMain.id()) + .nickname(userMain.nickname()) + .profileImageUrl(userMain.profileImageUrl()) .tierInfo(tierInfo) .build(); } diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/auth/AuthService.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/auth/AuthService.java index 0fe3c31..44a1fce 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/auth/AuthService.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/auth/AuthService.java @@ -28,8 +28,8 @@ public class AuthService { * OAuth2 로그인 또는 회원가입
[state]는 nullable한 입력 값이다.
1. OAuth2Client를 이용해 해당 provider로부터 * 유저정보를 가져옴 2. authToken으로 유저를 찾거나 없으면 회원가입 3. 토큰 발급, 유저정보 반환 */ - public Pair oAuth2LoginOrSignup(OAuth2Provider provider, - @NonNull String code, @Nullable String state) { + public Pair oAuth2LoginOrSignup(OAuth2Provider provider, + @NonNull String code, @Nullable String state) { OAuth2Client oAuth2Client = oAuth2Clients.stream() .filter(client -> client.canHandle(provider)) .findFirst() @@ -45,8 +45,8 @@ public Pair oAuth2LoginOrSignup(OAuth2Provider provid // 토큰 발급, 유저정보 반환 JwtToken jwtToken = createToken(user); - UserModel.Model userModel = UserModel.Model.from(user); - return Pair.of(jwtToken, userModel); + UserModel.Main userMain = UserModel.Main.from(user); + return Pair.of(jwtToken, userMain); } @@ -62,7 +62,7 @@ private JwtToken createToken(User user) { } @Transactional - public Pair signup(UserCommand.Create command) { + public Pair signup(UserCommand.Create command) { if (userReader.existsByEmail(command.getEmail())) { throw new IllegalArgumentException("이미 존재하는 이메일입니다."); } @@ -70,8 +70,8 @@ public Pair signup(UserCommand.Create command) { User user = User.create(command); userStore.store(user); JwtToken jwtToken = createToken(user); - UserModel.Model userModel = UserModel.Model.from(user); - return Pair.of(jwtToken, userModel); + UserModel.Main userMain = UserModel.Main.from(user); + return Pair.of(jwtToken, userMain); } @Transactional @@ -85,7 +85,7 @@ public void createManager(UserCommand.Create command) { } @Transactional(readOnly = true) - public Pair login(String email, String password) { + public Pair login(String email, String password) { User user = userReader.findByEmail(email) .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 이메일입니다.")); @@ -94,8 +94,8 @@ public Pair login(String email, String password) { } JwtToken jwtToken = createToken(user); - UserModel.Model userModel = UserModel.Model.from(user); - return Pair.of(jwtToken, userModel); + UserModel.Main userMain = UserModel.Main.from(user); + return Pair.of(jwtToken, userMain); } public String reissueToken(String rawToken) { diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/ChallengeGroupModel.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/ChallengeGroupModel.java index e4e5279..f50dd58 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/ChallengeGroupModel.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/ChallengeGroupModel.java @@ -115,7 +115,7 @@ public static Detail from(ChallengeGroup challengeGroup, List getRankingPage(Pageable pag Integer rank = challengeGroupUserExps.getNumber() * challengeGroupUserExps.getSize() + 1 + i; ChallengeGroupUserExp challengeGroupUserExp = challengeGroupUserExps.getContent().get(i); var rankingModel = ChallengeGroupModel.Ranking.builder() - .user(UserModel.Model.from(challengeGroupUserExp.getUser())) + .user(UserModel.Main.from(challengeGroupUserExp.getUser())) .accumulatedPoint(challengeGroupUserExp.getTotalExp()) .rank(rank) .build(); diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/review/ChallengeReviewModel.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/review/ChallengeReviewModel.java index 49df3c4..b67f138 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/review/ChallengeReviewModel.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/review/ChallengeReviewModel.java @@ -12,13 +12,13 @@ public class ChallengeReviewModel { public record ChallengeReviewWithUserInfo( Long challengeId, String challengeTitle, - UserModel.Model user, + UserModel.Main user, String content, Integer rating ) { public static ChallengeReviewWithUserInfo from(ChallengeReview challengeReview) { - var userModel = UserModel.Model.from(challengeReview.getUserChallenge().getUser()); + var userModel = UserModel.Main.from(challengeReview.getUserChallenge().getUser()); return ChallengeReviewWithUserInfo.builder() .challengeId(challengeReview.getUserChallenge().getChallenge().getId()) .challengeTitle( @@ -36,13 +36,13 @@ public record ChallengeReviewWithChallenge( Long challengeId, String challengeTitle, Integer challengeDifficulty, - UserModel.Model user, + UserModel.Main user, String content, Integer rating ) { public static ChallengeReviewWithChallenge from(ChallengeReview challengeReview) { - var userModel = UserModel.Model.from(challengeReview.getUserChallenge().getUser()); + var userModel = UserModel.Main.from(challengeReview.getUserChallenge().getUser()); return ChallengeReviewWithChallenge.builder() .challengeId(challengeReview.getUserChallenge().getChallenge().getId()) .challengeTitle( diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserModel.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserModel.java index 6a460a6..431c535 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserModel.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserModel.java @@ -10,15 +10,15 @@ public class UserModel{ @Builder - public record Model( + public record Main( Long id, String email, String nickname, String profileImageUrl, Integer exp ) { - public static Model from(User user) { - return Model.builder() + public static Main from(User user) { + return Main.builder() .id(user.getId()) .email(user.getEmail()) .nickname(user.getNickname()) diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java index c5175ea..8d8524c 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java @@ -3,7 +3,6 @@ import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.tuple.Pair; import org.haedal.zzansuni.domain.challengegroup.userchallenge.UserChallengeReader; -import org.haedal.zzansuni.domain.challengegroup.verification.ChallengeVerificationReader; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -21,9 +20,9 @@ public class UserService { private final UserChallengeReader userChallengeReader; @Transactional(readOnly = true) - public UserModel.Model getUserModel(Long id) { + public UserModel.Main getUserModel(Long id) { User user = userReader.getById(id); - return UserModel.Model.from(user); + return UserModel.Main.from(user); } /** @@ -37,9 +36,9 @@ public void updateUser(Long id, UserCommand.Update userUpdate) { @Transactional(readOnly = true) - public Page getUserPagingByRanking(Pageable pageable) { + public Page getUserPagingByRanking(Pageable pageable) { Page users = userReader.getUserPagingByRanking(pageable); - return users.map(UserModel.Model::from); + return users.map(UserModel.Main::from); } @Transactional(readOnly = true) diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/ChallengeGroupReaderImpl.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/ChallengeGroupReaderImpl.java index 2e05858..c9584a5 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/ChallengeGroupReaderImpl.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/ChallengeGroupReaderImpl.java @@ -142,7 +142,7 @@ public ChallengeGroupModel.Ranking getRanking(Long challengeGroupId, Long userId return ChallengeGroupModel.Ranking.builder() .rank(rank==null ? 0 : rank) .accumulatedPoint(challengeGroupUserExp != null ? challengeGroupUserExp.getTotalExp() : 0) - .user(UserModel.Model.from(user)) + .user(UserModel.Main.from(user)) .build(); } diff --git a/zzansuni-api-server/app/src/test/java/org/haedal/zzansuni/domain/auth/AuthServiceTest.java b/zzansuni-api-server/app/src/test/java/org/haedal/zzansuni/domain/auth/AuthServiceTest.java index f037baf..88d4074 100644 --- a/zzansuni-api-server/app/src/test/java/org/haedal/zzansuni/domain/auth/AuthServiceTest.java +++ b/zzansuni-api-server/app/src/test/java/org/haedal/zzansuni/domain/auth/AuthServiceTest.java @@ -39,7 +39,7 @@ void oAuth2LoginOrSignup() { String code = "fake-random-code"; // when - Pair pair = authService.oAuth2LoginOrSignup(OAuth2Provider.KAKAO, code, null); + Pair pair = authService.oAuth2LoginOrSignup(OAuth2Provider.KAKAO, code, null); // then User user = userRepository.findAll().get(0); diff --git a/zzansuni-api-server/app/src/test/java/org/haedal/zzansuni/domain/user/UserServiceTest.java b/zzansuni-api-server/app/src/test/java/org/haedal/zzansuni/domain/user/UserServiceTest.java index bb6bfa4..30df993 100644 --- a/zzansuni-api-server/app/src/test/java/org/haedal/zzansuni/domain/user/UserServiceTest.java +++ b/zzansuni-api-server/app/src/test/java/org/haedal/zzansuni/domain/user/UserServiceTest.java @@ -7,6 +7,7 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; @@ -21,6 +22,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.when; +@SpringBootTest @ExtendWith(MockitoExtension.class) public class UserServiceTest { @InjectMocks @@ -36,12 +38,12 @@ public void getUserModel(){ when(userReader.getById(1L)).thenReturn(createUser(1L,"테스트유저1")); //when - UserModel.Model userModel = userService.getUserModel(1L); + UserModel.Main userMain = userService.getUserModel(1L); //then - assertNotNull(userModel); - assertThat(userModel.id()).isEqualTo(1L); - assertThat(userModel.nickname()).isEqualTo("테스트유저1"); + assertNotNull(userMain); + assertThat(userMain.id()).isEqualTo(1L); + assertThat(userMain.nickname()).isEqualTo("테스트유저1"); } @@ -81,7 +83,7 @@ public void getUserPagingByRanking(){ when(userReader.getUserPagingByRanking(pageable)).thenReturn(new PageImpl<>(userList, pageable, userList.size())); //when - Page userPage = userService.getUserPagingByRanking(pageable); + Page userPage = userService.getUserPagingByRanking(pageable); //then From 5e15b2b2747fb9415efd7f6717ff19bf66ad79d9 Mon Sep 17 00:00:00 2001 From: kwonssshyeon Date: Tue, 16 Jul 2024 23:06:16 +0900 Subject: [PATCH 07/10] =?UTF-8?q?[Feat]:=20=EC=8A=A4=ED=8A=B8=EB=A6=AD=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20dto=20toString=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=9E=AC=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zzansuni/domain/user/UserModel.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserModel.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserModel.java index 431c535..3aa0b8b 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserModel.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserModel.java @@ -40,12 +40,35 @@ public static Strick from(Map strickCounts, LocalDate startD .collect(Collectors.toList()); return new Strick(resultList); } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + if (dayCounts == null) { + sb.append("null"); + } else { + for (int i = 0; i < dayCounts.size(); i++) { + sb.append(dayCounts.get(i).toString()); + if (i < dayCounts.size() - 1) + sb.append("\n"); + } + } + return sb.toString(); + } + } @Builder public record DayCount( LocalDate date, Integer count ) { + + @Override + public String toString() { + return "DayCount{" + + "date=" + date + + ", count=" + count + '}'; + } } From f5484f5bedca71001579343c42e703c1c829309e Mon Sep 17 00:00:00 2001 From: kwonssshyeon Date: Tue, 16 Jul 2024 23:12:07 +0900 Subject: [PATCH 08/10] =?UTF-8?q?[Fix]:=20=EC=8A=A4=ED=8A=B8=EB=A6=AD=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=BF=BC=EB=A6=AC=20=EC=9D=B8=ED=84=B0?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=8A=A4=20=EA=B8=B0=EB=B0=98=20projection?= =?UTF-8?q?=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../challengegroup/userchallenge/UserChallengeReader.java | 4 ++-- .../challengegroup/userchallenge/DayCountType.java | 8 ++++++++ .../userchallenge/UserChallengeReaderImpl.java | 3 +-- 3 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/DayCountType.java diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/userchallenge/UserChallengeReader.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/userchallenge/UserChallengeReader.java index 4bdc08f..6c19613 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/userchallenge/UserChallengeReader.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/userchallenge/UserChallengeReader.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Optional; -import org.apache.commons.lang3.tuple.Pair; +import org.haedal.zzansuni.infrastructure.challengegroup.userchallenge.DayCountType; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -26,5 +26,5 @@ public interface UserChallengeReader { Page getCompletedChallengePageByUserId(Long userId, Pageable pageable); - List> countAllByUserIdAndDate(Long userId, LocalDate startDate, LocalDate endDate); + List countAllByUserIdAndDate(Long userId, LocalDate startDate, LocalDate endDate); } diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/DayCountType.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/DayCountType.java new file mode 100644 index 0000000..b12e39b --- /dev/null +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/DayCountType.java @@ -0,0 +1,8 @@ +package org.haedal.zzansuni.infrastructure.challengegroup.userchallenge; + +import java.time.LocalDate; + +public interface DayCountType { + LocalDate getDate(); + Integer getCount(); +} diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeReaderImpl.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeReaderImpl.java index 959baa8..0cf3f85 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeReaderImpl.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeReaderImpl.java @@ -9,7 +9,6 @@ import java.util.Optional; import lombok.RequiredArgsConstructor; -import org.apache.commons.lang3.tuple.Pair; import org.haedal.zzansuni.domain.challengegroup.challenge.ChallengeStatus; import org.haedal.zzansuni.domain.challengegroup.userchallenge.QUserChallenge; import org.haedal.zzansuni.domain.challengegroup.userchallenge.UserChallenge; @@ -134,7 +133,7 @@ private BooleanExpression neProceeding() { } @Override - public List> countAllByUserIdAndDate(Long userId, LocalDate startDate, LocalDate endDate){ + public List countAllByUserIdAndDate(Long userId, LocalDate startDate, LocalDate endDate){ return userChallengeRepository.countAllByUserIdAndDate(userId, startDate, endDate); } } From bceaf5f16b8e3daa5d33b89611e3a26626eca9b4 Mon Sep 17 00:00:00 2001 From: kwonssshyeon Date: Tue, 16 Jul 2024 23:12:54 +0900 Subject: [PATCH 09/10] =?UTF-8?q?[Fix]:=20=EC=8A=A4=ED=8A=B8=EB=A6=AD=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20SQL=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/haedal/zzansuni/domain/user/UserService.java | 6 +++--- .../userchallenge/UserChallengeRepository.java | 9 ++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java index 8d8524c..65ea285 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java @@ -1,8 +1,8 @@ package org.haedal.zzansuni.domain.user; import lombok.RequiredArgsConstructor; -import org.apache.commons.lang3.tuple.Pair; import org.haedal.zzansuni.domain.challengegroup.userchallenge.UserChallengeReader; +import org.haedal.zzansuni.infrastructure.challengegroup.userchallenge.DayCountType; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -43,9 +43,9 @@ public Page getUserPagingByRanking(Pageable pageable) { @Transactional(readOnly = true) public UserModel.Strick getUserStrick(Long id, LocalDate startDate, LocalDate endDate){ - List> userStricks = userChallengeReader.countAllByUserIdAndDate(id, startDate, endDate); + List userStricks = userChallengeReader.countAllByUserIdAndDate(id, startDate, endDate); Map map = userStricks.stream() - .collect(Collectors.toMap(Pair::getLeft, Pair::getRight)); + .collect(Collectors.toMap(DayCountType::getDate, DayCountType::getCount)); return UserModel.Strick.from(map, startDate, endDate); } } diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeRepository.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeRepository.java index 1e29f01..1e9da0d 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeRepository.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeRepository.java @@ -5,14 +5,12 @@ import java.util.List; import java.util.Optional; -import org.apache.commons.lang3.tuple.Pair; import org.haedal.zzansuni.domain.challengegroup.userchallenge.UserChallenge; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; public interface UserChallengeRepository extends JpaRepository { - Optional findByUserIdAndChallengeId(Long userId, Long challengeId); /** @@ -42,15 +40,16 @@ Optional findByChallengeIdWithFetchLazy( * * 이 쿼리가 userChallenge에 있는게 맞는지, challengeVerification에 있는게 맞는지 */ - @Query("SELECT DATE(cv.createdAt), count(*) FROM UserChallenge uc " + - "LEFT JOIN uc.challengeVerifications cv " + + @Query("SELECT DATE(cv.createdAt) as date, count(*) as count FROM UserChallenge uc " + + "JOIN uc.challengeVerifications cv " + "WHERE uc.user.id = :userId " + + "AND uc.id = cv.userChallenge.id " + "AND DATE(uc.createdAt) >= :startDate " + "AND DATE(cv.createdAt) <= :endDate " + "AND cv.status = 'APPROVED' " + "GROUP BY DATE(cv.createdAt) " + "ORDER BY DATE(cv.createdAt)") - List> countAllByUserIdAndDate( + List countAllByUserIdAndDate( @Param("userId") Long userId, @Param("startDate")LocalDate startDate, @Param("endDate")LocalDate endDate From 972d9fd769b1311621bac10140e82d3fcdd57607 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=86=90=ED=99=8D=EC=84=9D?= <78216059+bayy1216@users.noreply.github.com> Date: Sun, 21 Jul 2024 14:12:29 +0900 Subject: [PATCH 10/10] =?UTF-8?q?[Fix]:=20DayCountType=20=ED=8C=A8?= =?UTF-8?q?=ED=82=A4=EC=A7=80=20domain=EC=9C=BC=EB=A1=9C=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../challengegroup/userchallenge/DayCountType.java | 2 +- .../challengegroup/userchallenge/UserChallengeReader.java | 1 - .../main/java/org/haedal/zzansuni/domain/user/UserService.java | 2 +- .../challengegroup/userchallenge/UserChallengeReaderImpl.java | 1 + .../challengegroup/userchallenge/UserChallengeRepository.java | 1 + 5 files changed, 4 insertions(+), 3 deletions(-) rename zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/{infrastructure => domain}/challengegroup/userchallenge/DayCountType.java (60%) diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/DayCountType.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/userchallenge/DayCountType.java similarity index 60% rename from zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/DayCountType.java rename to zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/userchallenge/DayCountType.java index b12e39b..cf29c53 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/DayCountType.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/userchallenge/DayCountType.java @@ -1,4 +1,4 @@ -package org.haedal.zzansuni.infrastructure.challengegroup.userchallenge; +package org.haedal.zzansuni.domain.challengegroup.userchallenge; import java.time.LocalDate; diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/userchallenge/UserChallengeReader.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/userchallenge/UserChallengeReader.java index 6c19613..b359523 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/userchallenge/UserChallengeReader.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/challengegroup/userchallenge/UserChallengeReader.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.Optional; -import org.haedal.zzansuni.infrastructure.challengegroup.userchallenge.DayCountType; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java index 65ea285..314281a 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/domain/user/UserService.java @@ -2,7 +2,7 @@ import lombok.RequiredArgsConstructor; import org.haedal.zzansuni.domain.challengegroup.userchallenge.UserChallengeReader; -import org.haedal.zzansuni.infrastructure.challengegroup.userchallenge.DayCountType; +import org.haedal.zzansuni.domain.challengegroup.userchallenge.DayCountType; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeReaderImpl.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeReaderImpl.java index 0cf3f85..1242ea7 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeReaderImpl.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeReaderImpl.java @@ -10,6 +10,7 @@ import lombok.RequiredArgsConstructor; import org.haedal.zzansuni.domain.challengegroup.challenge.ChallengeStatus; +import org.haedal.zzansuni.domain.challengegroup.userchallenge.DayCountType; import org.haedal.zzansuni.domain.challengegroup.userchallenge.QUserChallenge; import org.haedal.zzansuni.domain.challengegroup.userchallenge.UserChallenge; import org.haedal.zzansuni.domain.challengegroup.userchallenge.UserChallengeReader; diff --git a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeRepository.java b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeRepository.java index 1e9da0d..13af697 100644 --- a/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeRepository.java +++ b/zzansuni-api-server/app/src/main/java/org/haedal/zzansuni/infrastructure/challengegroup/userchallenge/UserChallengeRepository.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Optional; +import org.haedal.zzansuni.domain.challengegroup.userchallenge.DayCountType; import org.haedal.zzansuni.domain.challengegroup.userchallenge.UserChallenge; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query;