From 08f2476b10149da8c326962a9d6466587ebb9582 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 28 Sep 2024 16:43:09 +0900 Subject: [PATCH 01/26] =?UTF-8?q?[refactor]=20SoptampPoint=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20(#346)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/entity/soptamp/SoptampPoint.java | 43 ------------ .../SoptampPointJpaRepository.java | 15 ---- .../soptamp_point/SoptampPointRepository.java | 23 ------- .../SoptampPointRepositoryImpl.java | 69 ------------------- 4 files changed, 150 deletions(-) delete mode 100755 src/main/java/org/sopt/app/domain/entity/soptamp/SoptampPoint.java delete mode 100755 src/main/java/org/sopt/app/interfaces/postgres/soptamp_point/SoptampPointJpaRepository.java delete mode 100755 src/main/java/org/sopt/app/interfaces/postgres/soptamp_point/SoptampPointRepository.java delete mode 100755 src/main/java/org/sopt/app/interfaces/postgres/soptamp_point/SoptampPointRepositoryImpl.java diff --git a/src/main/java/org/sopt/app/domain/entity/soptamp/SoptampPoint.java b/src/main/java/org/sopt/app/domain/entity/soptamp/SoptampPoint.java deleted file mode 100755 index c9b2891f..00000000 --- a/src/main/java/org/sopt/app/domain/entity/soptamp/SoptampPoint.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.sopt.app.domain.entity.soptamp; - -import javax.persistence.*; -import lombok.*; -import org.sopt.app.domain.entity.BaseEntity; - -@Entity -@Getter -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class SoptampPoint extends BaseEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - private Long generation; - - private Long soptampUserId; - - private Long points; - - public void addPointsByLevelValue(Integer level) { - this.points += level; - } - - public void subtractPointsByLevelValue(Integer level) { - this.points -= level; - } - - public void initPoint() { - this.points = 0L; - } - - public static SoptampPoint createNewSoptampPoint(Long generation, Long soptampUserId) { - return SoptampPoint.builder() - .generation(generation) - .soptampUserId(soptampUserId) - .points(0L) - .build(); - } -} diff --git a/src/main/java/org/sopt/app/interfaces/postgres/soptamp_point/SoptampPointJpaRepository.java b/src/main/java/org/sopt/app/interfaces/postgres/soptamp_point/SoptampPointJpaRepository.java deleted file mode 100755 index 7aeb789b..00000000 --- a/src/main/java/org/sopt/app/interfaces/postgres/soptamp_point/SoptampPointJpaRepository.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.sopt.app.interfaces.postgres.soptamp_point; - -import java.util.List; -import java.util.Optional; -import org.sopt.app.domain.entity.soptamp.SoptampPoint; -import org.springframework.data.jpa.repository.JpaRepository; - -public interface SoptampPointJpaRepository extends JpaRepository { - - List findAllByGeneration(Long currentGeneration); - - Optional findBySoptampUserIdAndGeneration(Long soptampUserId, Long currentGeneration); - - List findAllBySoptampUserIdInAndGeneration(List soptampUserIdList, Long currentGeneration); -} diff --git a/src/main/java/org/sopt/app/interfaces/postgres/soptamp_point/SoptampPointRepository.java b/src/main/java/org/sopt/app/interfaces/postgres/soptamp_point/SoptampPointRepository.java deleted file mode 100755 index 763e71b7..00000000 --- a/src/main/java/org/sopt/app/interfaces/postgres/soptamp_point/SoptampPointRepository.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.sopt.app.interfaces.postgres.soptamp_point; - -import java.util.List; -import java.util.Optional; -import org.sopt.app.domain.entity.soptamp.SoptampPoint; -import org.sopt.app.domain.enums.Part; - -public interface SoptampPointRepository { - - SoptampPoint save(SoptampPoint soptampPoint); - - void saveAll(List soptampPoint); - - void deleteAll(); - - List findAllByGeneration(Long currentGeneration); - - Optional findBySoptampUserIdAndGeneration(Long soptampUserId, Long currentGeneration); - - List findAllBySoptampUserIdInAndGeneration(List soptampUserIdList, Long currentGeneration); - - Long findSumOfPointBySamePartAndGeneration(Part part, Long generation); -} diff --git a/src/main/java/org/sopt/app/interfaces/postgres/soptamp_point/SoptampPointRepositoryImpl.java b/src/main/java/org/sopt/app/interfaces/postgres/soptamp_point/SoptampPointRepositoryImpl.java deleted file mode 100755 index 108f667e..00000000 --- a/src/main/java/org/sopt/app/interfaces/postgres/soptamp_point/SoptampPointRepositoryImpl.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.sopt.app.interfaces.postgres.soptamp_point; - -import com.querydsl.jpa.impl.JPAQueryFactory; -import java.util.List; -import java.util.Optional; -import lombok.RequiredArgsConstructor; -import org.sopt.app.domain.entity.soptamp.QSoptampPoint; -import org.sopt.app.domain.entity.soptamp.QSoptampUser; -import org.sopt.app.domain.entity.soptamp.SoptampPoint; -import org.sopt.app.domain.enums.Part; -import org.springframework.stereotype.Repository; - -@Repository -@RequiredArgsConstructor -public class SoptampPointRepositoryImpl implements SoptampPointRepository { - - private final SoptampPointJpaRepository soptampPointJpaRepository; - private final JPAQueryFactory queryFactory; - - @Override - public SoptampPoint save(SoptampPoint soptampPoint) { - return soptampPointJpaRepository.save(soptampPoint); - } - - @Override - public void saveAll(List soptampPoints) { - soptampPointJpaRepository.saveAll(soptampPoints); - } - - @Override - public void deleteAll() { - soptampPointJpaRepository.deleteAll(); - } - - @Override - public List findAllByGeneration(Long currentGeneration) { - return soptampPointJpaRepository.findAllByGeneration(currentGeneration); - } - - @Override - public Optional findBySoptampUserIdAndGeneration(Long soptampUserId, Long currentGeneration) { - return soptampPointJpaRepository.findBySoptampUserIdAndGeneration(soptampUserId, currentGeneration); - } - - @Override - public List findAllBySoptampUserIdInAndGeneration(List soptampUserIdList, - Long currentGeneration) { - return soptampPointJpaRepository.findAllBySoptampUserIdInAndGeneration(soptampUserIdList, currentGeneration); - } - - @Override - public Long findSumOfPointBySamePartAndGeneration(Part part, Long generation) { - QSoptampPoint soptampPoint = new QSoptampPoint("soptampPoint"); - QSoptampUser soptampUser = new QSoptampUser("soptampUser"); - - return Optional.ofNullable( - queryFactory - .select(soptampPoint.points.sum()) - .from(soptampUser) - .join(soptampPoint) - .on(soptampPoint.soptampUserId.eq(soptampUser.id) - .and(soptampUser.part.eq(String.valueOf(part)) - .and(soptampUser.generation.eq(generation)))) - . fetchOne()) - .orElse(0L); - } - - -} From 324a90ff2a5426b0ed9c889ea87b1b00f5edad02 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sat, 28 Sep 2024 23:54:39 +0900 Subject: [PATCH 02/26] =?UTF-8?q?[refactor]=20AdminSoptampFacade=20?= =?UTF-8?q?=EC=88=98=20(#33)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/sopt/app/facade/AdminSoptampFacade.java | 8 -------- .../sopt/app/presentation/admin/AdminSoptampResponse.java | 4 ---- 2 files changed, 12 deletions(-) diff --git a/src/main/java/org/sopt/app/facade/AdminSoptampFacade.java b/src/main/java/org/sopt/app/facade/AdminSoptampFacade.java index 82957d03..fd272e3c 100755 --- a/src/main/java/org/sopt/app/facade/AdminSoptampFacade.java +++ b/src/main/java/org/sopt/app/facade/AdminSoptampFacade.java @@ -6,7 +6,6 @@ import lombok.val; import org.sopt.app.application.playground.PlaygroundAuthService; import org.sopt.app.application.mission.MissionService; -import org.sopt.app.application.soptamp.SoptampPointService; import org.sopt.app.application.soptamp.SoptampUserPlaygroundInfo; import org.sopt.app.application.soptamp.SoptampUserService; import org.sopt.app.application.stamp.StampService; @@ -24,7 +23,6 @@ public class AdminSoptampFacade { private final MissionService missionService; private final StampService stampService; - private final SoptampPointService soptampPointService; private final SoptampUserService soptampUserService; private final PlaygroundAuthService playgroundAuthService; private final UserService userService; @@ -33,7 +31,6 @@ public class AdminSoptampFacade { public void initAllMissionAndStampAndPoints() { missionService.deleteAll(); stampService.deleteAll(); - soptampPointService.deleteAll(); soptampUserService.initAllSoptampUserPoints(); } @@ -74,13 +71,8 @@ public AdminSoptampResponse.Rows initCurrentGenerationInfo(User user) { val updatedSoptampUserList = soptampUserService.initAllCurrentGenerationSoptampUser(soptampUserList, userInfoList); - // 플그 아이디로 SoptampPoint 현활기수 row 추가 - val currentGenerationSoptampPointList = soptampPointService.createCurrentGenerationSoptampPointList( - updatedSoptampUserList); - return Rows.builder() .soptampUserRows(updatedSoptampUserList.size()) - .soptampPointRows(currentGenerationSoptampPointList.size()) .build(); } } diff --git a/src/main/java/org/sopt/app/presentation/admin/AdminSoptampResponse.java b/src/main/java/org/sopt/app/presentation/admin/AdminSoptampResponse.java index a09b50fb..81a89690 100755 --- a/src/main/java/org/sopt/app/presentation/admin/AdminSoptampResponse.java +++ b/src/main/java/org/sopt/app/presentation/admin/AdminSoptampResponse.java @@ -15,9 +15,5 @@ public static class Rows { @Schema(description = "SoptampUser 초기화 성공 회원 수", example = "200") private int soptampUserRows; - - - @Schema(description = "SoptampPoint 초기화 성공 회원 수", example = "200") - private int soptampPointRows; } } From e326c603c16f8c6c6d12456477dbd285a81e25c8 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 01:14:04 +0900 Subject: [PATCH 03/26] =?UTF-8?q?[refactor]=20SoptampPointService=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20(#33)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../soptamp/SoptampPointService.java | 104 ------------------ 1 file changed, 104 deletions(-) delete mode 100755 src/main/java/org/sopt/app/application/soptamp/SoptampPointService.java diff --git a/src/main/java/org/sopt/app/application/soptamp/SoptampPointService.java b/src/main/java/org/sopt/app/application/soptamp/SoptampPointService.java deleted file mode 100755 index ed3b7d99..00000000 --- a/src/main/java/org/sopt/app/application/soptamp/SoptampPointService.java +++ /dev/null @@ -1,104 +0,0 @@ -package org.sopt.app.application.soptamp; - -import java.util.List; -import java.util.Objects; -import lombok.RequiredArgsConstructor; -import lombok.val; -import org.sopt.app.application.soptamp.SoptampPointInfo.PartPoint; -import org.sopt.app.application.soptamp.SoptampPointInfo.Point; -import org.sopt.app.domain.entity.soptamp.SoptampPoint; -import org.sopt.app.domain.entity.soptamp.SoptampUser; -import org.sopt.app.domain.enums.Part; -import org.sopt.app.domain.enums.UserStatus; -import org.sopt.app.interfaces.postgres.soptamp_point.SoptampPointRepository; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@RequiredArgsConstructor -public class SoptampPointService { - - private final SoptampPointRepository soptampPointRepository; - - @Value("${sopt.current.generation}") - private Long currentGeneration; - - public List findCurrentGenerationPoints() { - return soptampPointRepository.findAllByGeneration(currentGeneration).stream() - .map(Point::of) - .toList(); - } - - public List findCurrentPointListBySoptampUserIds(List soptampUserIdList) { - return soptampPointRepository.findAllBySoptampUserIdInAndGeneration(soptampUserIdList, currentGeneration) - .stream() - .map(Point::of) - .toList(); - } - - @Transactional - public void addPoint(Long soptampUserId, Integer level) { - val soptampPoint = soptampPointRepository.findBySoptampUserIdAndGeneration(soptampUserId, currentGeneration); - soptampPoint.ifPresent(point -> point.addPointsByLevelValue(level)); - } - - @Transactional - public void subtractPoint(Long soptampUserId, Integer level) { - val soptampPoint = soptampPointRepository.findBySoptampUserIdAndGeneration(soptampUserId, currentGeneration); - soptampPoint.ifPresent(point -> point.subtractPointsByLevelValue(level)); - } - - @Transactional - public void upsertSoptampPoint(UserStatus status, Long soptampUserId) { - if (status.equals(UserStatus.INACTIVE)) { - return; - } - val soptampPoint = soptampPointRepository.findBySoptampUserIdAndGeneration(soptampUserId, currentGeneration); - - if (soptampPoint.isEmpty()) { - soptampPointRepository.save(SoptampPoint.createNewSoptampPoint(currentGeneration, soptampUserId)); - } - } - - @Transactional - public void initPoint(Long soptampUserId) { - val soptampPoint = soptampPointRepository.findBySoptampUserIdAndGeneration(soptampUserId, currentGeneration); - soptampPoint.ifPresent(SoptampPoint::initPoint); - } - - public void deleteAll() { - soptampPointRepository.deleteAll(); - } - - public List createCurrentGenerationSoptampPointList( - List soptampUserList - ) { - val soptampUserIdList = soptampUserList.stream().map(SoptampUser::getId).toList(); - - val prevSoptampUserIdList = soptampPointRepository.findAllBySoptampUserIdInAndGeneration( - soptampUserIdList, currentGeneration - ).stream().map(SoptampPoint::getSoptampUserId).toList(); - - val newSoptampUserList = soptampUserList.stream() - .map(soptampUser -> prevSoptampUserIdList.contains(soptampUser.getId()) ? null : soptampUser) - .filter(Objects::nonNull) - .toList(); - - val soptampPointList = newSoptampUserList.stream().map(soptampUser -> - SoptampPoint.createNewSoptampPoint(currentGeneration, soptampUser.getId()) - ).toList(); - - soptampPointRepository.saveAll(soptampPointList); - return soptampPointList; - } - - public List findSumOfPointAllParts() { - List allParts = Part.getAllParts(); - return allParts.stream() - .map(part -> { - Long point = soptampPointRepository.findSumOfPointBySamePartAndGeneration(part, currentGeneration); - return new PartPoint(part, point); - }).toList(); - } -} From 4ccc3dd9c16acaab2859d641fb355e8a668a19b7 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 01:17:29 +0900 Subject: [PATCH 04/26] =?UTF-8?q?[refactor]=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20controller=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=A0=9C=EA=B1=B0=20(#33)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/app/facade/RankFacade.java | 35 ++++++------------- .../app/presentation/rank/RankController.java | 11 ------ 2 files changed, 10 insertions(+), 36 deletions(-) diff --git a/src/main/java/org/sopt/app/facade/RankFacade.java b/src/main/java/org/sopt/app/facade/RankFacade.java index 5ebacf47..b37c0956 100755 --- a/src/main/java/org/sopt/app/facade/RankFacade.java +++ b/src/main/java/org/sopt/app/facade/RankFacade.java @@ -7,10 +7,10 @@ import org.sopt.app.application.soptamp.SoptampPointInfo.Main; import org.sopt.app.application.soptamp.SoptampPointInfo.PartPoint; import org.sopt.app.application.soptamp.SoptampPointInfo.PartRank; -import org.sopt.app.application.soptamp.SoptampPointInfo.Point; -import org.sopt.app.application.soptamp.SoptampPointService; +import org.sopt.app.application.soptamp.SoptampUserFinder; import org.sopt.app.application.soptamp.SoptampUserInfo; import org.sopt.app.application.soptamp.SoptampUserService; +import org.sopt.app.domain.entity.soptamp.SoptampUser; import org.sopt.app.domain.enums.Part; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -20,42 +20,27 @@ public class RankFacade { private final SoptampUserService soptampUserService; - private final SoptampPointService soptampPointService; + private final SoptampUserFinder soptampUserFinder; - @Transactional(readOnly = true) - @Deprecated - public List
findAllSoptampUserRanks() { - List soptampUsers = soptampUserService.findAllSoptampUsers(); - SoptampUserRankCalculator soptampUserRankCalculator = new SoptampUserRankCalculator(soptampUsers); - return soptampUserRankCalculator.calculateRank(); - } @Transactional(readOnly = true) public List
findCurrentRanks() { - List soptampPointList = soptampPointService.findCurrentGenerationPoints(); - List soptampUserIdList = soptampPointList.stream().map(Point::getSoptampUserId).toList(); - - return getMainsByCalculateRanking(soptampUserIdList, soptampPointList); + List soptampUserInfos = soptampUserFinder.findAllCurrentGenerationSoptampUsers(); + SoptampUserRankCalculator soptampUserRankCalculator = new SoptampUserRankCalculator(soptampUserInfos); + return soptampUserRankCalculator.calculateRank(); } - private List
getMainsByCalculateRanking(List soptampUserIdList, List soptampPointList) { - List userList = soptampUserService.findAllBySoptampUserIds(soptampUserIdList); - - SoptampUserRankCalculator soptampUserRankCalculator = new SoptampUserRankCalculator(userList); - return soptampUserRankCalculator.calculateRanking(soptampPointList); - } @Transactional(readOnly = true) public List
findCurrentRanksByPart(Part part) { - List soptampUserIdList = soptampUserService.findSoptampUserByPart(part); - List soptampPointList = soptampPointService.findCurrentPointListBySoptampUserIds(soptampUserIdList); - - return getMainsByCalculateRanking(soptampUserIdList, soptampPointList); + List soptampUserInfos = soptampUserFinder.findSoptampUserIdByPart(part); + SoptampUserRankCalculator soptampUserRankCalculator = new SoptampUserRankCalculator(soptampUserInfos); + return soptampUserRankCalculator.calculateRank(); } @Transactional(readOnly = true) public List findAllPartRanks() { - List partPoints = soptampPointService.findSumOfPointAllParts(); + List partPoints = soptampUserService.findSumOfPointAllParts(); SoptampPartRankCalculator soptampPartRankCalculator = new SoptampPartRankCalculator(partPoints); return soptampPartRankCalculator.findAllPartRanks(); } diff --git a/src/main/java/org/sopt/app/presentation/rank/RankController.java b/src/main/java/org/sopt/app/presentation/rank/RankController.java index f1f87cdf..5584f962 100755 --- a/src/main/java/org/sopt/app/presentation/rank/RankController.java +++ b/src/main/java/org/sopt/app/presentation/rank/RankController.java @@ -29,17 +29,6 @@ public class RankController { private final SoptampFacade soptampFacade; private final RankResponseMapper rankResponseMapper; - @Operation(summary = "랭킹 목록 조회") - @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "success"), - @ApiResponse(responseCode = "500", description = "server error", content = @Content) - }) - @GetMapping("") - public ResponseEntity> findAllRanks() { - val result = rankFacade.findAllSoptampUserRanks(); - return ResponseEntity.ok(rankResponseMapper.of(result)); - } - @Operation(summary = "현재 기수 랭킹 목록 조회") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "success"), From ea0403aadf6de205377c4b4ce9282707cd9b66c9 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 13:50:23 +0900 Subject: [PATCH 05/26] =?UTF-8?q?[refactor]=20PartRank=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EB=B0=A9=EC=8B=9D=20=EB=B3=80=EA=B2=BD=20(#333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rank/SoptampPartRankCalculator.java | 67 +++++++++++++++---- .../java/org/sopt/app/facade/AuthFacade.java | 6 +- 2 files changed, 54 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/sopt/app/application/rank/SoptampPartRankCalculator.java b/src/main/java/org/sopt/app/application/rank/SoptampPartRankCalculator.java index 9eead552..66ce42f0 100755 --- a/src/main/java/org/sopt/app/application/rank/SoptampPartRankCalculator.java +++ b/src/main/java/org/sopt/app/application/rank/SoptampPartRankCalculator.java @@ -1,35 +1,74 @@ package org.sopt.app.application.rank; import java.util.List; +import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; import lombok.RequiredArgsConstructor; -import org.sopt.app.application.soptamp.SoptampPointInfo.PartPoint; import org.sopt.app.application.soptamp.SoptampPointInfo.PartRank; +import org.sopt.app.application.soptamp.SoptampUserInfo; +import org.sopt.app.domain.enums.Part; @RequiredArgsConstructor public class SoptampPartRankCalculator { - private final List partPoints; + private final List userInfos; - public List findAllPartRanks() { + private final Map partScores = Map.of( + Part.SERVER.getPartName(), new AtomicInteger(0), + Part.WEB.getPartName(), new AtomicInteger(0), + Part.DESIGN.getPartName(), new AtomicInteger(0), + Part.ANDROID.getPartName(), new AtomicInteger(0), + Part.IOS.getPartName(), new AtomicInteger(0), + Part.PLAN.getPartName(), new AtomicInteger(0) + ); - return partPoints.stream().map(this::createPartRank).toList(); - } + private final List partReturnOrder = List.of( + Part.PLAN, Part.DESIGN, Part.WEB, Part.IOS, Part.ANDROID, Part.SERVER + ); - private PartRank createPartRank(PartPoint targetPartPoint) { + public List calculatePartRank() { + userInfos.forEach(this::calculatePartScore); + return partReturnOrder.stream().map(part -> PartRank.builder() + .part(part.getPartName()) + .rank(getTargetPartRank(partScores.get(part.getPartName()).get())) + .points(partScores.get(part.getPartName()).longValue()) + .build()).toList(); + } - return PartRank.builder() - .part(targetPartPoint.part().getPartName()) - .rank(getTargetPartRank(targetPartPoint)) - .points(targetPartPoint.points()) - .build(); + private void calculatePartScore(SoptampUserInfo userInfo) { + String nickname = userInfo.getNickname(); + if(nickname.startsWith(Part.SERVER.getPartName())){ + partScores.get(Part.SERVER.getPartName()).getAndIncrement(); + return; + } + if(nickname.startsWith(Part.WEB.getPartName())){ + partScores.get(Part.WEB.getPartName()).getAndIncrement(); + return; + } + if(nickname.startsWith(Part.DESIGN.getPartName())){ + partScores.get(Part.DESIGN.getPartName()).getAndIncrement(); + return; + } + if(nickname.startsWith(Part.ANDROID.getPartName())){ + partScores.get(Part.ANDROID.getPartName()).getAndIncrement(); + return; + } + if(nickname.startsWith(Part.IOS.getPartName())){ + partScores.get(Part.IOS.getPartName()).getAndIncrement(); + return; + } + if(nickname.startsWith(Part.PLAN.getPartName())){ + partScores.get(Part.PLAN.getPartName()).getAndIncrement(); + return; + } } - private int getTargetPartRank(PartPoint targetPartPoint) { + private int getTargetPartRank(int targetPartPoint) { int rankPoint = 1; - for (PartPoint comparisonPartPoint : partPoints) { - if (targetPartPoint.points() < comparisonPartPoint.points()) { + for (AtomicInteger atomicInteger : partScores.values()) { + if (targetPartPoint < atomicInteger.get()) { rankPoint++; } } diff --git a/src/main/java/org/sopt/app/facade/AuthFacade.java b/src/main/java/org/sopt/app/facade/AuthFacade.java index 5ae35705..0505a91a 100755 --- a/src/main/java/org/sopt/app/facade/AuthFacade.java +++ b/src/main/java/org/sopt/app/facade/AuthFacade.java @@ -4,7 +4,6 @@ import lombok.val; import org.sopt.app.application.auth.JwtTokenService; import org.sopt.app.application.playground.PlaygroundAuthService; -import org.sopt.app.application.soptamp.SoptampPointService; import org.sopt.app.application.soptamp.SoptampUserService; import org.sopt.app.application.user.UserService; import org.sopt.app.presentation.auth.AppAuthRequest; @@ -23,7 +22,6 @@ public class AuthFacade { private final PlaygroundAuthService playgroundAuthService; private final AppAuthResponseMapper authResponseMapper; private final SoptampUserService soptampUserService; - private final SoptampPointService soptampPointService; @Transactional public Token loginWithPlayground(AppAuthRequest.CodeRequest codeRequest) { @@ -33,10 +31,8 @@ public Token loginWithPlayground(AppAuthRequest.CodeRequest codeRequest) { val playgroundToken = playgroundAuthService.refreshPlaygroundToken(temporaryToken); // PlayGround User Info 받아옴 val playgroundMember = playgroundAuthService.getPlaygroundInfo(playgroundToken.getAccessToken()); - val userId = userService.loginWithUserPlaygroundId(playgroundMember); - val soptampUserId = soptampUserService.updateSoptampUser(playgroundMember.getName(), userId.getId()); - soptampPointService.upsertSoptampPoint(playgroundMember.getStatus(), soptampUserId); + soptampUserService.createSoptampUser(playgroundMember.getName(), userId.getId()); // Response 할 Body 생성 val appToken = jwtTokenService.issueNewTokens(userId, playgroundMember); From 32e397dd6ee0210b2030168a96032fd350aba87e Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 13:55:26 +0900 Subject: [PATCH 06/26] =?UTF-8?q?[refactor]=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20DTO=20=EC=82=AD=EC=A0=9C=20(#3?= =?UTF-8?q?33)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/user/UserInfo.java | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/src/main/java/org/sopt/app/application/user/UserInfo.java b/src/main/java/org/sopt/app/application/user/UserInfo.java index 5b801d19..24f9cd4d 100755 --- a/src/main/java/org/sopt/app/application/user/UserInfo.java +++ b/src/main/java/org/sopt/app/application/user/UserInfo.java @@ -1,8 +1,6 @@ package org.sopt.app.application.user; -import lombok.Builder; -import lombok.Getter; -import lombok.ToString; +import lombok.*; public class UserInfo { @@ -13,13 +11,6 @@ public static class Id { private Long id; } - @Getter - @Builder - @ToString - public static class Token { - private String accessToken; - } - @Getter @Builder @ToString @@ -36,13 +27,6 @@ public static class ProfileMessage { private String profileMessage; } - @Getter - @Builder - @ToString - public static class IsOptIn { - private Boolean isOptIn; - } - @Getter @Builder @ToString From 4f3e8052aa4a059807526a97298f10dbaed2ebad Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 13:55:40 +0900 Subject: [PATCH 07/26] =?UTF-8?q?[refactor]=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20Controller=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=82=AD=EC=A0=9C=20(#333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/presentation/user/UserController.java | 29 ------------------- 1 file changed, 29 deletions(-) diff --git a/src/main/java/org/sopt/app/presentation/user/UserController.java b/src/main/java/org/sopt/app/presentation/user/UserController.java index 0284561c..61bc228d 100755 --- a/src/main/java/org/sopt/app/presentation/user/UserController.java +++ b/src/main/java/org/sopt/app/presentation/user/UserController.java @@ -57,35 +57,6 @@ public ResponseEntity getSoptampInfo(@AuthenticationPrinci return ResponseEntity.ok(response); } - @Operation(summary = "닉네임 중복 검사") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "success", content = @Content), - @ApiResponse(responseCode = "400", description = "duplicate nickname", content = @Content), - @ApiResponse(responseCode = "500", description = "server error", content = @Content) - }) - @GetMapping(value = "/nickname/{nickname}") - public ResponseEntity validateUserNickname(@PathVariable String nickname) { - soptampUserService.checkUserNickname(nickname); - return ResponseEntity.ok().build(); - } - - @Operation(summary = "닉네임 변경") - @ApiResponses({ - @ApiResponse(responseCode = "200", description = "success"), - @ApiResponse(responseCode = "500", description = "server error", content = @Content) - }) - @PatchMapping(value = "/nickname") - public ResponseEntity editNickname( - @AuthenticationPrincipal User user, - @Valid @RequestBody UserRequest.EditNicknameRequest editNicknameRequest - ) { - val result = soptampFacade.editSoptampUserNickname(user.getId(), editNicknameRequest.getNickname()); - val response = UserResponse.Nickname.builder() - .nickname(result.getNickname()) - .build(); - return ResponseEntity.ok(response); - } - @Operation(summary = "한마디 변경") @ApiResponses({ @ApiResponse(responseCode = "200", description = "success"), From e76f223ddfc5698e6ba36de0d206a925d3f9ef4c Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 13:57:21 +0900 Subject: [PATCH 08/26] =?UTF-8?q?[refactor]=20SoptampUser=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=8B=A8=EC=88=9C=20?= =?UTF-8?q?(#333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../soptamp/SoptampUserService.java | 158 ++++-------------- .../domain/entity/soptamp/SoptampUser.java | 12 ++ .../postgres/SoptampUserRepository.java | 4 +- 3 files changed, 50 insertions(+), 124 deletions(-) diff --git a/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java b/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java index 430099df..7f5d9693 100755 --- a/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java +++ b/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java @@ -2,18 +2,11 @@ import static org.sopt.app.domain.enums.PlaygroundPart.findPlaygroundPart; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import lombok.RequiredArgsConstructor; -import lombok.val; +import java.util.*; +import lombok.*; import org.sopt.app.common.exception.BadRequestException; import org.sopt.app.common.response.ErrorCode; import org.sopt.app.domain.entity.soptamp.SoptampUser; -import org.sopt.app.domain.enums.Part; import org.sopt.app.domain.enums.PlaygroundPart; import org.sopt.app.interfaces.postgres.SoptampUserRepository; import org.springframework.stereotype.Service; @@ -27,147 +20,66 @@ public class SoptampUserService { @Transactional(readOnly = true) public SoptampUserInfo getSoptampUserInfo(Long userId) { - val user = soptampUserRepository.findByUserId(userId) + SoptampUser user = soptampUserRepository.findByUserId(userId) .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); - return SoptampUserInfo.builder() - .id(user.getId()) - .userId(user.getUserId()) - .profileMessage(user.getProfileMessage()) - .totalPoints(user.getTotalPoints()) - .nickname(user.getNickname()) - .build(); - } - - @Transactional(readOnly = true) - public void checkUserNickname(String nickname) { - val nicknameUser = soptampUserRepository.findUserByNickname(nickname); - if (nicknameUser.isPresent()) { - throw new BadRequestException(ErrorCode.DUPLICATE_NICKNAME.getMessage()); - } + return SoptampUserInfo.of(user); } @Transactional - public SoptampUserInfo editNickname(SoptampUserInfo soptampUserInfo, String nickname) { - val newSoptampUser = SoptampUser.builder() - .id(soptampUserInfo.getId()) - .userId(soptampUserInfo.getUserId()) - .profileMessage(soptampUserInfo.getProfileMessage()) - .totalPoints(soptampUserInfo.getTotalPoints()) - .nickname(nickname) - .build(); - soptampUserRepository.save(newSoptampUser); - return SoptampUserInfo.builder() - .id(newSoptampUser.getId()) - .userId(newSoptampUser.getUserId()) - .profileMessage(newSoptampUser.getProfileMessage()) - .totalPoints(newSoptampUser.getTotalPoints()) - .nickname(newSoptampUser.getNickname()) - .build(); + public SoptampUserInfo editNickname(Long userId, String nickname) { + SoptampUser soptampUser = soptampUserRepository.findByUserId(userId) + .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); + soptampUser.updateNickname(nickname); + return SoptampUserInfo.of(soptampUser); } @Transactional - public SoptampUserInfo editProfileMessage(SoptampUserInfo soptampUserInfo, String profileMessage) { - val newSoptampUser = SoptampUser.builder() - .id(soptampUserInfo.getId()) - .userId(soptampUserInfo.getUserId()) - .profileMessage(profileMessage) - .totalPoints(soptampUserInfo.getTotalPoints()) - .nickname(soptampUserInfo.getNickname()) - .build(); - return SoptampUserInfo.of(soptampUserRepository.save(newSoptampUser)); + public SoptampUserInfo editProfileMessage(Long userId, String profileMessage) { + SoptampUser soptampUser = soptampUserRepository.findByUserId(userId) + .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); + soptampUser.updateProfileMessage(profileMessage); + return SoptampUserInfo.of(soptampUser); } @Transactional - public Long updateSoptampUser(String name, Long userId) { - val registerUser = soptampUserRepository.findByUserId(userId); - if (registerUser.isEmpty()) { - val newSoptampUser = SoptampUser.builder() - .userId(userId) - .profileMessage(null) - .totalPoints(0L) - .nickname(name) - .build(); + public Long createSoptampUser(String name, Long userId) { + Optional registeredUser = soptampUserRepository.findByUserId(userId); + if (registeredUser.isEmpty()) { + val newSoptampUser = this.createNewSoptampUser(name, userId); return soptampUserRepository.save(newSoptampUser).getId(); - } - return registerUser.get().getId(); - } - - public List findAllBySoptampUserIds(List userIdList) { - return soptampUserRepository.findAllById(userIdList) - .stream().map(SoptampUserInfo::of) - .toList(); + return registeredUser.get().getId(); } - @Deprecated - public List findAllSoptampUsers() { - return soptampUserRepository.findAll() - .stream().map(SoptampUserInfo::of) - .toList(); - } - - public List findSoptampUserByPart(Part part) { - return soptampUserRepository.findAllByNicknameStartingWith(part.getPartName()) - .stream() - .map(SoptampUser::getId) - .toList(); - } - - public SoptampUserInfo findSoptampUserByNickname(String nickname) { - return SoptampUserInfo.of( - soptampUserRepository.findUserByNickname(nickname) - .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())) - ); - } - - @Transactional - public SoptampUserInfo addPoint(Long userId, Integer level) { - val user = soptampUserRepository.findByUserId(userId) - .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); - val newTotalPoint = user.getTotalPoints() + level; - val newSoptampUser = SoptampUser.builder() - .id(user.getId()) - .userId(user.getUserId()) - .profileMessage(user.getProfileMessage()) - .totalPoints(newTotalPoint) - .nickname(user.getNickname()) + private SoptampUser createNewSoptampUser(String name, Long userId) { + return SoptampUser.builder() + .userId(userId) + .nickname(name) + .profileMessage("") + .totalPoints(0L) .build(); - return SoptampUserInfo.of(soptampUserRepository.save(newSoptampUser)); } @Transactional - public SoptampUserInfo subtractPoint(Long userId, Integer level) { - val user = soptampUserRepository.findByUserId(userId) + public void addPointByLevel(Long userId, Integer level) { + SoptampUser soptampUser = soptampUserRepository.findByUserId(userId) .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); - val newTotalPoint = user.getTotalPoints() - level; - val newSoptampUser = SoptampUser.builder() - .id(user.getId()) - .userId(user.getUserId()) - .profileMessage(user.getProfileMessage()) - .totalPoints(newTotalPoint) - .nickname(user.getNickname()) - .build(); - return SoptampUserInfo.of(soptampUserRepository.save(newSoptampUser)); + soptampUser.addPointsByLevel(level); } - public SoptampUserInfo findByNickname(String nickname) { - val soptampUser = soptampUserRepository.findUserByNickname(nickname) + @Transactional + public void subtractPointByLevel(Long userId, Integer level) { + SoptampUser soptampUser = soptampUserRepository.findByUserId(userId) .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); - return SoptampUserInfo.of(soptampUser); + soptampUser.subtractPointsByLevel(level); } @Transactional public void initPoint(Long userId) { - val soptampUser = soptampUserRepository.findByUserId(userId) + SoptampUser soptampUser = soptampUserRepository.findByUserId(userId) .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); - val newSoptampUser = SoptampUser.builder() - .id(soptampUser.getId()) - .userId(soptampUser.getUserId()) - .profileMessage(soptampUser.getProfileMessage()) - .totalPoints(0L) - .nickname(soptampUser.getNickname()) - .build(); - soptampUserRepository.save(newSoptampUser); + soptampUser.initTotalPoints(); + soptampUserRepository.save(soptampUser); } @Transactional diff --git a/src/main/java/org/sopt/app/domain/entity/soptamp/SoptampUser.java b/src/main/java/org/sopt/app/domain/entity/soptamp/SoptampUser.java index 33dfe025..369b0e00 100755 --- a/src/main/java/org/sopt/app/domain/entity/soptamp/SoptampUser.java +++ b/src/main/java/org/sopt/app/domain/entity/soptamp/SoptampUser.java @@ -40,4 +40,16 @@ public void updateGenerationAndPart(Long generation, PlaygroundPart part) { this.generation = generation; this.part = part.name(); } + + public void addPointsByLevel(Integer level) { + this.totalPoints += level; + } + + public void subtractPointsByLevel(Integer level) { + this.totalPoints -= level; + } + + public void updateProfileMessage(String profileMessage) { + this.profileMessage = profileMessage; + } } diff --git a/src/main/java/org/sopt/app/interfaces/postgres/SoptampUserRepository.java b/src/main/java/org/sopt/app/interfaces/postgres/SoptampUserRepository.java index 82e88086..ea16402d 100755 --- a/src/main/java/org/sopt/app/interfaces/postgres/SoptampUserRepository.java +++ b/src/main/java/org/sopt/app/interfaces/postgres/SoptampUserRepository.java @@ -11,7 +11,9 @@ public interface SoptampUserRepository extends JpaRepository Optional findUserByNickname(String nickname); - List findAllByNicknameStartingWith(String part); + List findAllByNicknameStartingWithAndGeneration(String part, Long generation); List findAllByUserIdIn(List userIdList); + + List findAllByGeneration(Long generation); } From c4e23953049776459d205771b203197f90835a13 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 13:58:09 +0900 Subject: [PATCH 09/26] =?UTF-8?q?[refactor]=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20DTO=20=EC=82=AD=EC=A0=9C=20(#3?= =?UTF-8?q?33)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/application/soptamp/SoptampUserInfo.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/main/java/org/sopt/app/application/soptamp/SoptampUserInfo.java b/src/main/java/org/sopt/app/application/soptamp/SoptampUserInfo.java index a7927a6b..9efacc7e 100755 --- a/src/main/java/org/sopt/app/application/soptamp/SoptampUserInfo.java +++ b/src/main/java/org/sopt/app/application/soptamp/SoptampUserInfo.java @@ -26,16 +26,4 @@ public static SoptampUserInfo of(SoptampUser soptampUser) { .nickname(soptampUser.getNickname()) .build(); } - - @Getter - @Builder - public static class SoptampUserPlaygroundInfo { - - private Long userId; - private Long playgroundId; - private String name; - private Integer generation; - private String part; - } - } From 13421ddd7ca5a58f960fc25af8f257c22c2822eb Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 13:58:35 +0900 Subject: [PATCH 10/26] =?UTF-8?q?[refactor]=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20DTO=20=EC=82=AD=EC=A0=9C=20(#3?= =?UTF-8?q?33)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/soptamp/SoptampPointInfo.java | 36 +------------------ 1 file changed, 1 insertion(+), 35 deletions(-) diff --git a/src/main/java/org/sopt/app/application/soptamp/SoptampPointInfo.java b/src/main/java/org/sopt/app/application/soptamp/SoptampPointInfo.java index 80bdb4f1..070642d1 100755 --- a/src/main/java/org/sopt/app/application/soptamp/SoptampPointInfo.java +++ b/src/main/java/org/sopt/app/application/soptamp/SoptampPointInfo.java @@ -1,13 +1,6 @@ package org.sopt.app.application.soptamp; -import java.util.List; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.sopt.app.domain.entity.soptamp.Mission; -import org.sopt.app.domain.entity.soptamp.SoptampPoint; +import lombok.*; import org.sopt.app.domain.enums.Part; @NoArgsConstructor(access = AccessLevel.PRIVATE) @@ -33,33 +26,6 @@ public static Main of(Integer rank, SoptampUserInfo soptampUserInfo) { } } - @Getter - public static class Detail { - - private String nickname; - private String profileMessage; - private List userMissions; - } - - @Getter - @Builder - @AllArgsConstructor(access = AccessLevel.PRIVATE) - public static class Point { - private Long id; - private Long generation; - private Long soptampUserId; - private Long points; - - public static Point of(SoptampPoint soptampPoint) { - return new Point( - soptampPoint.getId(), - soptampPoint.getGeneration(), - soptampPoint.getSoptampUserId(), - soptampPoint.getPoints() - ); - } - } - @Getter @Builder @AllArgsConstructor(access = AccessLevel.PRIVATE) From 1edada0ea8e99a48a17c3b3370cfbec50f1a724f Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 13:59:08 +0900 Subject: [PATCH 11/26] =?UTF-8?q?[refactor]=20SoptampUserService=EC=97=90?= =?UTF-8?q?=EC=84=9C=20SoptampUserFinder=EB=A5=BC=20=EC=B1=85=EC=9E=84=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=20(#333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../soptamp/SoptampUserFinder.java | 55 +++++++++++++++++++ .../org/sopt/app/facade/SoptampFacade.java | 33 ++++------- 2 files changed, 67 insertions(+), 21 deletions(-) create mode 100644 src/main/java/org/sopt/app/application/soptamp/SoptampUserFinder.java diff --git a/src/main/java/org/sopt/app/application/soptamp/SoptampUserFinder.java b/src/main/java/org/sopt/app/application/soptamp/SoptampUserFinder.java new file mode 100644 index 00000000..dacfb719 --- /dev/null +++ b/src/main/java/org/sopt/app/application/soptamp/SoptampUserFinder.java @@ -0,0 +1,55 @@ +package org.sopt.app.application.soptamp; + +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.sopt.app.common.exception.BadRequestException; +import org.sopt.app.common.response.ErrorCode; +import org.sopt.app.domain.entity.soptamp.SoptampUser; +import org.sopt.app.domain.enums.Part; +import org.sopt.app.interfaces.postgres.SoptampUserRepository; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class SoptampUserFinder { + + private final SoptampUserRepository soptampUserRepository; + + @Value("${sopt.current.generation}") + private Long currentGeneration; + + public List findAllBySoptampUserIds(List userIdList) { + return soptampUserRepository.findAllById(userIdList) + .stream() + .map(SoptampUserInfo::of) + .toList(); + } + + public List findAllCurrentGenerationSoptampUsers() { + return soptampUserRepository.findAllByGeneration(currentGeneration) + .stream() + .map(SoptampUserInfo::of) + .toList(); + } + + public List findSoptampUserIdByPart(Part part) { + return soptampUserRepository.findAllByNicknameStartingWithAndGeneration(part.getPartName(), currentGeneration) + .stream() + .map(SoptampUserInfo::of) + .toList(); + } + + public SoptampUserInfo findSoptampUserByNickname(String nickname) { + return SoptampUserInfo.of( + soptampUserRepository.findUserByNickname(nickname) + .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())) + ); + } + + public SoptampUserInfo findByNickname(String nickname) { + SoptampUser soptampUser = soptampUserRepository.findUserByNickname(nickname) + .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); + return SoptampUserInfo.of(soptampUser); + } +} diff --git a/src/main/java/org/sopt/app/facade/SoptampFacade.java b/src/main/java/org/sopt/app/facade/SoptampFacade.java index 1d4c9bae..3a7ceb1d 100755 --- a/src/main/java/org/sopt/app/facade/SoptampFacade.java +++ b/src/main/java/org/sopt/app/facade/SoptampFacade.java @@ -3,12 +3,14 @@ import java.util.List; import lombok.RequiredArgsConstructor; import lombok.val; +import org.sopt.app.application.mission.MissionInfo.Level; import org.sopt.app.application.mission.MissionService; import org.sopt.app.application.s3.S3Service; -import org.sopt.app.application.soptamp.SoptampPointService; +import org.sopt.app.application.soptamp.SoptampUserFinder; import org.sopt.app.application.soptamp.SoptampUserInfo; import org.sopt.app.application.soptamp.SoptampUserService; import org.sopt.app.application.stamp.StampInfo; +import org.sopt.app.application.stamp.StampInfo.Stamp; import org.sopt.app.application.stamp.StampService; import org.sopt.app.domain.entity.soptamp.Mission; import org.sopt.app.presentation.rank.RankResponse; @@ -27,8 +29,8 @@ public class SoptampFacade { private final S3Service s3Service; private final MissionService missionService; private final SoptampUserService soptampUserService; - private final SoptampPointService soptampPointService; private final RankResponseMapper rankResponseMapper; + private final SoptampUserFinder soptampUserFinder; @Transactional public StampInfo.Stamp uploadStampDeprecated(Long userId, Long missionId, RegisterStampRequest registerStampRequest, List multipartFileList){ @@ -36,18 +38,16 @@ public StampInfo.Stamp uploadStampDeprecated(Long userId, Long missionId, Regist val imgPaths = s3Service.uploadDeprecated(multipartFileList); val result = stampService.uploadStampDeprecated(registerStampRequest, imgPaths, userId, missionId); val mission = missionService.getMissionById(missionId); - val soptampUser = soptampUserService.addPoint(userId, mission.getLevel()); - soptampPointService.addPoint(soptampUser.getId(), mission.getLevel()); + soptampUserService.addPointByLevel(userId, mission.getLevel()); return result; } @Transactional public StampInfo.Stamp uploadStamp(Long userId, RegisterStampRequest registerStampRequest){ stampService.checkDuplicateStamp(userId, registerStampRequest.getMissionId()); - val result = stampService.uploadStamp(registerStampRequest, userId); - val mission = missionService.getMissionById(registerStampRequest.getMissionId()); - val soptampUser = soptampUserService.addPoint(userId, mission.getLevel()); - soptampPointService.addPoint(soptampUser.getId(), mission.getLevel()); + Stamp result = stampService.uploadStamp(registerStampRequest, userId); + Level mission = missionService.getMissionById(registerStampRequest.getMissionId()); + soptampUserService.addPointByLevel(userId, mission.getLevel()); return result; } @@ -55,8 +55,7 @@ public StampInfo.Stamp uploadStamp(Long userId, RegisterStampRequest registerSta public void deleteStamp(Long userId, Long stampId){ val missionId = stampService.getMissionIdByStampId(stampId); val mission = missionService.getMissionById(missionId); - val soptampUser = soptampUserService.subtractPoint(userId, mission.getLevel()); - soptampPointService.subtractPoint(soptampUser.getId(), mission.getLevel()); + soptampUserService.subtractPointByLevel(userId, mission.getLevel()); stampService.deleteStampById(stampId); } @@ -64,24 +63,16 @@ public void deleteStamp(Long userId, Long stampId){ public void deleteStampAll(Long userId){ stampService.deleteAllStamps(userId); soptampUserService.initPoint(userId); - soptampPointService.initPoint(userId); - } - - @Transactional - public SoptampUserInfo editSoptampUserNickname(Long userId, String nickname){ - val soptampUser = soptampUserService.getSoptampUserInfo(userId); - return soptampUserService.editNickname(soptampUser, nickname); } @Transactional public SoptampUserInfo editSoptampUserProfileMessage(Long userId, String newProfileMessage){ - val soptampUser = soptampUserService.getSoptampUserInfo(userId); - return soptampUserService.editProfileMessage(soptampUser, newProfileMessage); + return soptampUserService.editProfileMessage(userId, newProfileMessage); } @Transactional public StampInfo.Stamp getStampInfo(Long missionId, String nickname){ - val userId = soptampUserService.findByNickname(nickname).getUserId(); + val userId = soptampUserFinder.findByNickname(nickname).getUserId(); return stampService.findStamp(missionId, userId); } @@ -96,7 +87,7 @@ public StampInfo.Stamp editStamp(StampRequest.EditStampRequest editStampRequest, } public RankResponse.Detail findSoptampUserAndCompletedMissionByNickname(String nickname) { - SoptampUserInfo soptampUserInfo = soptampUserService.findSoptampUserByNickname(nickname); + SoptampUserInfo soptampUserInfo = soptampUserFinder.findSoptampUserByNickname(nickname); List missionList = missionService.getCompleteMission(soptampUserInfo.getUserId()); return rankResponseMapper.of(soptampUserInfo, missionList); From 919eb6c121ed8e0f7460b28b5dcde87025d54ffc Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 13:59:46 +0900 Subject: [PATCH 12/26] =?UTF-8?q?[refactor]=20SoptampRankCalculator=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(#333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rank/SoptampUserRankCalculator.java | 57 +++---------------- .../java/org/sopt/app/facade/RankFacade.java | 7 +-- 2 files changed, 11 insertions(+), 53 deletions(-) diff --git a/src/main/java/org/sopt/app/application/rank/SoptampUserRankCalculator.java b/src/main/java/org/sopt/app/application/rank/SoptampUserRankCalculator.java index a7d6c37c..65548c0f 100755 --- a/src/main/java/org/sopt/app/application/rank/SoptampUserRankCalculator.java +++ b/src/main/java/org/sopt/app/application/rank/SoptampUserRankCalculator.java @@ -1,64 +1,23 @@ package org.sopt.app.application.rank; -import java.util.ArrayList; import java.util.Comparator; import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; +import java.util.concurrent.atomic.AtomicInteger; import lombok.RequiredArgsConstructor; -import org.sopt.app.application.slack.SlackService; import org.sopt.app.application.soptamp.SoptampPointInfo.Main; -import org.sopt.app.application.soptamp.SoptampPointInfo.Point; import org.sopt.app.application.soptamp.SoptampUserInfo; @RequiredArgsConstructor public class SoptampUserRankCalculator { - private final List soptampUsers; - private final List
ranking = new ArrayList<>(); - private int rankPoint = 1; + private final List soptampUserInfos; - public List
calculateRanking(List soptampPointList) { - soptampPointList.stream() - .sorted(Comparator.comparing(Point::getPoints).reversed()) - .forEach(point -> - findSoptampUserInfo(point.getSoptampUserId()) - .ifPresentOrElse( - user -> addUserToRanking(user, point.getPoints()), - () -> SlackService.sendSlackMessage( - "Warning", - "soptamp_point에 해당하지 않는 soptamp_user가 확인되었습니다.\n" - + "soptampPointId: " + point.getId() + "\n" - + "soptampUserId: " + point.getSoptampUserId() - ) - )); - return ranking; - } - - private void addUserToRanking(SoptampUserInfo user, Long userPoint) { - ranking.add(Main.builder() - .rank(getCurrentRankPointAndIncrement()) - .nickname(user.getNickname()) - .profileMessage(user.getProfileMessage()) - .point(userPoint) - .build()); - } - - private Optional findSoptampUserInfo(Long soptampUserId) { - return soptampUsers.stream() - .filter(user -> user.getId().equals(soptampUserId)) - .findAny(); - } - - private int getCurrentRankPointAndIncrement() { - return rankPoint++; - } - - @Deprecated public List
calculateRank() { - return soptampUsers.stream().sorted( - Comparator.comparing(SoptampUserInfo::getTotalPoints).reversed()) - .map(user -> Main.of(getCurrentRankPointAndIncrement(), user)) - .collect(Collectors.toList()); + AtomicInteger rankPoint = new AtomicInteger(1); + + return soptampUserInfos.stream() + .sorted(Comparator.comparing(SoptampUserInfo::getTotalPoints).reversed()) + .map(user -> Main.of(rankPoint.getAndIncrement(), user)) + .toList(); } } diff --git a/src/main/java/org/sopt/app/facade/RankFacade.java b/src/main/java/org/sopt/app/facade/RankFacade.java index b37c0956..a278ba62 100755 --- a/src/main/java/org/sopt/app/facade/RankFacade.java +++ b/src/main/java/org/sopt/app/facade/RankFacade.java @@ -19,7 +19,6 @@ @RequiredArgsConstructor public class RankFacade { - private final SoptampUserService soptampUserService; private final SoptampUserFinder soptampUserFinder; @@ -40,8 +39,8 @@ public List
findCurrentRanksByPart(Part part) { @Transactional(readOnly = true) public List findAllPartRanks() { - List partPoints = soptampUserService.findSumOfPointAllParts(); - SoptampPartRankCalculator soptampPartRankCalculator = new SoptampPartRankCalculator(partPoints); - return soptampPartRankCalculator.findAllPartRanks(); + List soptampUserInfos = soptampUserFinder.findAllCurrentGenerationSoptampUsers(); + SoptampPartRankCalculator soptampPartRankCalculator = new SoptampPartRankCalculator(soptampUserInfos); + return soptampPartRankCalculator.calculatePartRank(); } } From 0ce5e28b4cfd9ab5ff9e9800a35879e7f411946f Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 14:00:15 +0900 Subject: [PATCH 13/26] =?UTF-8?q?[refactor]=20import=EB=AC=B8=20=EB=8B=A8?= =?UTF-8?q?=EC=88=9C=ED=99=94=20(#333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/sopt/app/application/soptamp/SoptampUserInfo.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/org/sopt/app/application/soptamp/SoptampUserInfo.java b/src/main/java/org/sopt/app/application/soptamp/SoptampUserInfo.java index 9efacc7e..c32abc70 100755 --- a/src/main/java/org/sopt/app/application/soptamp/SoptampUserInfo.java +++ b/src/main/java/org/sopt/app/application/soptamp/SoptampUserInfo.java @@ -1,9 +1,6 @@ package org.sopt.app.application.soptamp; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; +import lombok.*; import org.sopt.app.domain.entity.soptamp.SoptampUser; @Getter From 6b99f643ab994168aedd2370539590be30f78ad9 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 14:01:19 +0900 Subject: [PATCH 14/26] =?UTF-8?q?[refactor]=20=EC=82=AC=EC=9A=A9=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20SoptampPointServiceTest=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20(#333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/SoptampPointServiceTest.java | 218 ------------------ 1 file changed, 218 deletions(-) delete mode 100755 src/test/java/org/sopt/app/application/SoptampPointServiceTest.java diff --git a/src/test/java/org/sopt/app/application/SoptampPointServiceTest.java b/src/test/java/org/sopt/app/application/SoptampPointServiceTest.java deleted file mode 100755 index b5cc55d1..00000000 --- a/src/test/java/org/sopt/app/application/SoptampPointServiceTest.java +++ /dev/null @@ -1,218 +0,0 @@ -package org.sopt.app.application; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.Mockito.when; - -import java.util.List; -import java.util.Optional; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.sopt.app.application.soptamp.SoptampPointInfo.Point; -import org.sopt.app.application.soptamp.SoptampPointService; -import org.sopt.app.domain.entity.soptamp.SoptampPoint; -import org.sopt.app.domain.enums.UserStatus; -import org.sopt.app.interfaces.postgres.soptamp_point.SoptampPointRepository; -import org.springframework.test.util.ReflectionTestUtils; - -@ExtendWith(MockitoExtension.class) -class SoptampPointServiceTest { - - @Mock - private SoptampPointRepository soptampPointRepository; - - @InjectMocks - private SoptampPointService soptampPointService; - - @BeforeEach - void setUp() { - ReflectionTestUtils.setField(soptampPointService, "currentGeneration", 34L); - } - - @Test - @DisplayName("SUCCESS_현재 포인트 리스트 찾기") - void SUCCESS_findCurrentGenerationPoints() { - //given - final Long anyGeneration = anyLong(); - - List soptampPointList = List.of( - SoptampPoint.builder() - .id(1L) - .generation(anyGeneration) - .soptampUserId(1L) - .points(100L) - .build(), - SoptampPoint.builder() - .id(2L) - .generation(anyGeneration) - .soptampUserId(2L) - .points(200L) - .build() - ); - - //when - when(soptampPointRepository.findAllByGeneration(anyGeneration)).thenReturn(soptampPointList); - - List result = soptampPointService.findCurrentGenerationPoints(); - List expected = List.of( - Point.builder() - .id(1L) - .generation(anyGeneration) - .soptampUserId(1L) - .points(100L) - .build(), - Point.builder() - .id(2L) - .generation(anyGeneration) - .soptampUserId(2L) - .points(200L) - .build() - - ); - - //then - assertThat(result).usingRecursiveComparison().isEqualTo(expected); - } - - - @Test - @DisplayName("SUCCESS_유저 아이디 리스트로 현재 포인트 리스트 찾기") - void SUCCESS_findCurrentGenerationPointsBySoptampUserIds() { - //given - List soptampUserIdList = any(); - Long anyGeneration = anyLong(); - List soptampPointList = List.of( - SoptampPoint.builder() - .id(1L) - .generation(anyGeneration) - .soptampUserId(1L) - .points(100L) - .build(), - SoptampPoint.builder() - .id(2L) - .generation(anyGeneration) - .soptampUserId(2L) - .points(200L) - .build() - ); - - //when - when(soptampPointRepository.findAllBySoptampUserIdInAndGeneration(soptampUserIdList, anyGeneration)).thenReturn( - soptampPointList); - List result = soptampPointService.findCurrentPointListBySoptampUserIds(soptampUserIdList); - List expected = List.of( - Point.builder() - .id(1L) - .generation(anyGeneration) - .soptampUserId(1L) - .points(100L) - .build(), - Point.builder() - .id(2L) - .generation(anyGeneration) - .soptampUserId(2L) - .points(200L) - .build() - ); - - //then - assertThat(result).usingRecursiveComparison().isEqualTo(expected); - } - - @Test - @DisplayName("SUCCESS_솝탬프 포인트가 있을 때 포인트 추가") - void SUCCESS_addPointSoptampIsPresent() { - //given - SoptampPoint soptampPoint = SoptampPoint.builder() - .id(1L) - .generation(34L) - .soptampUserId(1L) - .points(100L) - .build(); - - //when - when(soptampPointRepository.findBySoptampUserIdAndGeneration(anyLong(), anyLong())).thenReturn( - Optional.of(soptampPoint)); - - //then - Assertions.assertDoesNotThrow(() -> soptampPointService.addPoint(anyLong(), anyInt())); - } - - @Test - @DisplayName("SUCCESS_솝탬프 포인트가 없으면 아무것도 안함") - void SUCCESS_addPointSoptampNotPresent() { - //when - when(soptampPointRepository.findBySoptampUserIdAndGeneration(anyLong(), anyLong())).thenReturn( - Optional.empty()); - //then - Assertions.assertDoesNotThrow(() -> soptampPointService.addPoint(anyLong(), anyInt())); - } - - @Test - @DisplayName("SUCCESS_솝탬프 포인트가 있을 때 포인트 추가") - void SUCCESS_subtractPointIsPresent() { - //given - SoptampPoint soptampPoint = SoptampPoint.builder() - .id(1L) - .generation(34L) - .soptampUserId(1L) - .points(100L) - .build(); - - //when - when(soptampPointRepository.findBySoptampUserIdAndGeneration(anyLong(), anyLong())).thenReturn( - Optional.of(soptampPoint)); - - //then - Assertions.assertDoesNotThrow(() -> soptampPointService.subtractPoint(anyLong(), anyInt())); - } - - @Test - @DisplayName("SUCCESS_솝탬프 포인트가 없으면 아무것도 안함") - void SUCCESS_subtractPointSoptampNotPresent() { - //when - when(soptampPointRepository.findBySoptampUserIdAndGeneration(anyLong(), anyLong())).thenReturn( - Optional.empty()); - //then - Assertions.assertDoesNotThrow(() -> soptampPointService.subtractPoint(anyLong(), anyInt())); - } - - @Test - @DisplayName("SUCCESS_유저 상태가 ACTIVE일 때 솝탬프 포인트 업서트") - void SUCCESS_upsertSoptampPointUserStatusACTIVE() { - //given - Long anyUserId = anyLong(); - - //when - when(soptampPointRepository.findBySoptampUserIdAndGeneration(anyUserId, anyLong())) - .thenReturn(Optional.of(new SoptampPoint())); - - //then - Assertions.assertDoesNotThrow(() -> soptampPointService.upsertSoptampPoint(UserStatus.ACTIVE, anyUserId)); - } - - @Test - @DisplayName("SUCCESS_유저 상태가 INACTIVE일 때 업서트하지 않음") - void SUCCESS_upsertSoptampPointUserStatusINACTIVE() { - //then - Assertions.assertDoesNotThrow(() -> soptampPointService.upsertSoptampPoint(UserStatus.INACTIVE, 1L)); - } - - @Test - @DisplayName("SUCCESS_솝탬프 포인트가 Empty일 때 업서트하지 않음") - void SUCCESS_upsertSoptampPointNotPresent() { - //when - when(soptampPointRepository.findBySoptampUserIdAndGeneration(anyLong(), anyLong())) - .thenReturn(Optional.empty()); - //then - Assertions.assertDoesNotThrow(() -> soptampPointService.upsertSoptampPoint(UserStatus.ACTIVE, 1L)); - } -} \ No newline at end of file From 91bee3f964d0bf08c5c5bf03e77974a40eb41416 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 15:49:26 +0900 Subject: [PATCH 15/26] =?UTF-8?q?[refactor]=20Spring=203=EB=8C=80=EC=99=80?= =?UTF-8?q?=20=ED=98=B8=ED=99=98=EB=90=98=EB=8A=94=20ListArrayType?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20(#333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/app/domain/entity/soptamp/Mission.java | 5 ++--- src/main/java/org/sopt/app/domain/entity/soptamp/Stamp.java | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/sopt/app/domain/entity/soptamp/Mission.java b/src/main/java/org/sopt/app/domain/entity/soptamp/Mission.java index c4ca629e..7adde025 100755 --- a/src/main/java/org/sopt/app/domain/entity/soptamp/Mission.java +++ b/src/main/java/org/sopt/app/domain/entity/soptamp/Mission.java @@ -1,7 +1,6 @@ package org.sopt.app.domain.entity.soptamp; - -import io.hypersistence.utils.hibernate.type.array.StringArrayType; +import io.hypersistence.utils.hibernate.type.array.ListArrayType; import jakarta.persistence.*; import java.util.List; import lombok.*; @@ -25,7 +24,7 @@ public class Mission { private boolean display; - @Type(value= StringArrayType.class) + @Type(value= ListArrayType.class) @Column(columnDefinition = "text[]") private List profileImage; } diff --git a/src/main/java/org/sopt/app/domain/entity/soptamp/Stamp.java b/src/main/java/org/sopt/app/domain/entity/soptamp/Stamp.java index d179e117..c57f9189 100755 --- a/src/main/java/org/sopt/app/domain/entity/soptamp/Stamp.java +++ b/src/main/java/org/sopt/app/domain/entity/soptamp/Stamp.java @@ -1,7 +1,7 @@ package org.sopt.app.domain.entity.soptamp; -import io.hypersistence.utils.hibernate.type.array.StringArrayType; +import io.hypersistence.utils.hibernate.type.array.ListArrayType; import jakarta.persistence.*; import java.util.List; import lombok.*; @@ -22,7 +22,7 @@ public class Stamp extends BaseEntity { private String contents; @Column(columnDefinition = "text[]") - @Type(value= StringArrayType.class) + @Type(value= ListArrayType.class) private List images; private Long userId; From 544cb9b33cec25dee06c6a8a83a875027916c5c9 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 15:51:56 +0900 Subject: [PATCH 16/26] =?UTF-8?q?[refactor]=20PartRankCaculator=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20(#333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rank/SoptampPartRankCalculator.java | 62 +++++++------------ 1 file changed, 24 insertions(+), 38 deletions(-) diff --git a/src/main/java/org/sopt/app/application/rank/SoptampPartRankCalculator.java b/src/main/java/org/sopt/app/application/rank/SoptampPartRankCalculator.java index 66ce42f0..ca37fd92 100755 --- a/src/main/java/org/sopt/app/application/rank/SoptampPartRankCalculator.java +++ b/src/main/java/org/sopt/app/application/rank/SoptampPartRankCalculator.java @@ -1,8 +1,8 @@ package org.sopt.app.application.rank; +import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; import lombok.RequiredArgsConstructor; import org.sopt.app.application.soptamp.SoptampPointInfo.PartRank; import org.sopt.app.application.soptamp.SoptampUserInfo; @@ -14,14 +14,15 @@ public class SoptampPartRankCalculator { private final List userInfos; - private final Map partScores = Map.of( - Part.SERVER.getPartName(), new AtomicInteger(0), - Part.WEB.getPartName(), new AtomicInteger(0), - Part.DESIGN.getPartName(), new AtomicInteger(0), - Part.ANDROID.getPartName(), new AtomicInteger(0), - Part.IOS.getPartName(), new AtomicInteger(0), - Part.PLAN.getPartName(), new AtomicInteger(0) - ); + private final HashMap partScores = + new HashMap<>(Map.of( + Part.SERVER.getPartName(), 0L, + Part.WEB.getPartName(), 0L, + Part.DESIGN.getPartName(), 0L, + Part.ANDROID.getPartName(), 0L, + Part.IOS.getPartName(), 0L, + Part.PLAN.getPartName(), 0L + )); private final List partReturnOrder = List.of( Part.PLAN, Part.DESIGN, Part.WEB, Part.IOS, Part.ANDROID, Part.SERVER @@ -31,44 +32,29 @@ public List calculatePartRank() { userInfos.forEach(this::calculatePartScore); return partReturnOrder.stream().map(part -> PartRank.builder() .part(part.getPartName()) - .rank(getTargetPartRank(partScores.get(part.getPartName()).get())) - .points(partScores.get(part.getPartName()).longValue()) + .rank(getTargetPartRank(partScores.get(part.getPartName()))) + .points(partScores.get(part.getPartName())) .build()).toList(); } private void calculatePartScore(SoptampUserInfo userInfo) { String nickname = userInfo.getNickname(); - if(nickname.startsWith(Part.SERVER.getPartName())){ - partScores.get(Part.SERVER.getPartName()).getAndIncrement(); - return; - } - if(nickname.startsWith(Part.WEB.getPartName())){ - partScores.get(Part.WEB.getPartName()).getAndIncrement(); - return; - } - if(nickname.startsWith(Part.DESIGN.getPartName())){ - partScores.get(Part.DESIGN.getPartName()).getAndIncrement(); - return; - } - if(nickname.startsWith(Part.ANDROID.getPartName())){ - partScores.get(Part.ANDROID.getPartName()).getAndIncrement(); - return; - } - if(nickname.startsWith(Part.IOS.getPartName())){ - partScores.get(Part.IOS.getPartName()).getAndIncrement(); - return; - } - if(nickname.startsWith(Part.PLAN.getPartName())){ - partScores.get(Part.PLAN.getPartName()).getAndIncrement(); - return; - } + partReturnOrder.forEach(part -> { + if(nickname.startsWith(part.getPartName())){ + this.putPartScore(part.getPartName(), userInfo.getTotalPoints()); + } + }); + } + + private void putPartScore(String partName, Long point) { + partScores.put(partName, partScores.get(partName) + point); } - private int getTargetPartRank(int targetPartPoint) { + private int getTargetPartRank(Long targetPartPoint) { int rankPoint = 1; - for (AtomicInteger atomicInteger : partScores.values()) { - if (targetPartPoint < atomicInteger.get()) { + for (Long partScore : partScores.values()) { + if (targetPartPoint < partScore) { rankPoint++; } } From f6ce17fe7d7eda2988b293a29875a47965decf4f Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 16:38:11 +0900 Subject: [PATCH 17/26] =?UTF-8?q?[refactor]=20SoptampPointRepositoryTest?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0=20(#333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../postgres/SoptampPointRepositoryTest.java | 92 ------------------- 1 file changed, 92 deletions(-) delete mode 100755 src/test/java/org/sopt/app/interfaces/postgres/SoptampPointRepositoryTest.java diff --git a/src/test/java/org/sopt/app/interfaces/postgres/SoptampPointRepositoryTest.java b/src/test/java/org/sopt/app/interfaces/postgres/SoptampPointRepositoryTest.java deleted file mode 100755 index 27f289c7..00000000 --- a/src/test/java/org/sopt/app/interfaces/postgres/SoptampPointRepositoryTest.java +++ /dev/null @@ -1,92 +0,0 @@ -package org.sopt.app.interfaces.postgres; - -import java.util.List; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.sopt.app.common.config.QuerydslConfiguration; -import org.sopt.app.interfaces.postgres.soptamp_point.SoptampPointRepository; -import org.sopt.app.interfaces.postgres.soptamp_point.SoptampPointRepositoryImpl; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.context.annotation.Import; - -@DataJpaTest -@AutoConfigureTestDatabase(replace = Replace.NONE) -@Import({QuerydslConfiguration.class, SoptampPointRepositoryImpl.class}) -class SoptampPointRepositoryTest { - - @Autowired - private SoptampPointRepository soptampPointRepository; - - private SoptampPoint generation1soptampPointId1; - private SoptampPoint generation1soptampPointId2; - - @BeforeEach - void beforeTest() { - generation1soptampPointId1 = soptampPointRepository.save( - SoptampPoint.builder() - .generation(1L) - .soptampUserId(1L) - .build() - ); - - generation1soptampPointId2 = soptampPointRepository.save( - SoptampPoint.builder() - .generation(1L) - .soptampUserId(2L) - .build() - ); - - soptampPointRepository.save( - SoptampPoint.builder() - .generation(1L) - .soptampUserId(3L) - .build() - ); - - soptampPointRepository.save( - SoptampPoint.builder() - .generation(2L) - .soptampUserId(4L) - .build() - ); - - } - - @Test - @DisplayName("SUCCESS_기수별 솝탬프 포인트 찾기") - void SUCCESS_findAllByGeneration() { - Assertions.assertThat(soptampPointRepository.findAllByGeneration(1L)) - .containsAll( - List.of(generation1soptampPointId1, generation1soptampPointId2) - ); - } - - @Test - @DisplayName("SUCCESS_유저 아이디와 기수로 솝탬프 포인트 리스트 찾기") - void SUCCESS_findAllBySoptampUserIdAndGeneration() { - Assertions.assertThat(soptampPointRepository.findBySoptampUserIdAndGeneration(1L, 1L) - .orElseThrow().getId()) - .isEqualTo(generation1soptampPointId1.getId()); - } - - @Test - @DisplayName("SUCCESS_유저 아이디 리스트와 기수로 솝탬프 포인트 리스트 찾기") - void SUCCESS_findAllBySoptampUserIdInAndGeneration() { - // given - List userIdList = List.of(1L, 2L); - - // when - List result = soptampPointRepository.findAllBySoptampUserIdInAndGeneration(userIdList, 1L); - - // then - Assertions.assertThat(result) - .hasSameElementsAs( - List.of(generation1soptampPointId1, generation1soptampPointId2) - ); - } -} \ No newline at end of file From 36a2ccbceb22d530c90fee438cd092a52ca4d199 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 17:13:41 +0900 Subject: [PATCH 18/26] =?UTF-8?q?[refactor]=20=EC=82=AC=EC=9A=A9=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EB=B0=8F=20import=EB=AC=B8=20=EB=8B=A8?= =?UTF-8?q?=EC=88=9C=ED=99=94=20(#333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/soptamp/SoptampUserFinder.java | 7 ------- .../sopt/app/presentation/admin/AdminSoptampResponse.java | 5 +---- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/src/main/java/org/sopt/app/application/soptamp/SoptampUserFinder.java b/src/main/java/org/sopt/app/application/soptamp/SoptampUserFinder.java index dacfb719..295ae007 100644 --- a/src/main/java/org/sopt/app/application/soptamp/SoptampUserFinder.java +++ b/src/main/java/org/sopt/app/application/soptamp/SoptampUserFinder.java @@ -19,13 +19,6 @@ public class SoptampUserFinder { @Value("${sopt.current.generation}") private Long currentGeneration; - public List findAllBySoptampUserIds(List userIdList) { - return soptampUserRepository.findAllById(userIdList) - .stream() - .map(SoptampUserInfo::of) - .toList(); - } - public List findAllCurrentGenerationSoptampUsers() { return soptampUserRepository.findAllByGeneration(currentGeneration) .stream() diff --git a/src/main/java/org/sopt/app/presentation/admin/AdminSoptampResponse.java b/src/main/java/org/sopt/app/presentation/admin/AdminSoptampResponse.java index 81a89690..b9090a81 100755 --- a/src/main/java/org/sopt/app/presentation/admin/AdminSoptampResponse.java +++ b/src/main/java/org/sopt/app/presentation/admin/AdminSoptampResponse.java @@ -1,10 +1,7 @@ package org.sopt.app.presentation.admin; import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; @NoArgsConstructor(access = AccessLevel.PRIVATE) public class AdminSoptampResponse { From c8321ad0e6e94860e8e8af851c21786bb1ff7fdb Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 17:13:58 +0900 Subject: [PATCH 19/26] =?UTF-8?q?[refactor]=20=EC=82=AC=EC=9A=A9=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20(#333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/soptamp/SoptampUserService.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java b/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java index 7f5d9693..37fed9ef 100755 --- a/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java +++ b/src/main/java/org/sopt/app/application/soptamp/SoptampUserService.java @@ -25,14 +25,6 @@ public SoptampUserInfo getSoptampUserInfo(Long userId) { return SoptampUserInfo.of(user); } - @Transactional - public SoptampUserInfo editNickname(Long userId, String nickname) { - SoptampUser soptampUser = soptampUserRepository.findByUserId(userId) - .orElseThrow(() -> new BadRequestException(ErrorCode.USER_NOT_FOUND.getMessage())); - soptampUser.updateNickname(nickname); - return SoptampUserInfo.of(soptampUser); - } - @Transactional public SoptampUserInfo editProfileMessage(Long userId, String profileMessage) { SoptampUser soptampUser = soptampUserRepository.findByUserId(userId) From 0e456d1b12b8b9a7955a610027817bd6d2fc5648 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 17:16:36 +0900 Subject: [PATCH 20/26] =?UTF-8?q?[refactor]=20=EC=8B=A4=ED=8C=A8=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(#333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/app/application/S3ServiceTest.java | 12 +- .../application/SoptampUserFinderTest.java | 77 ++++++++++++ .../application/SoptampUserServiceTest.java | 113 +----------------- .../common/fixtures/SoptampPointFixture.java | 22 ---- .../org/sopt/app/facade/AuthFacadeTest.java | 1 - .../sopt/app/facade/SoptampFacadeTest.java | 45 ++----- 6 files changed, 90 insertions(+), 180 deletions(-) create mode 100644 src/test/java/org/sopt/app/application/SoptampUserFinderTest.java diff --git a/src/test/java/org/sopt/app/application/S3ServiceTest.java b/src/test/java/org/sopt/app/application/S3ServiceTest.java index e3ce4e9d..794ee011 100755 --- a/src/test/java/org/sopt/app/application/S3ServiceTest.java +++ b/src/test/java/org/sopt/app/application/S3ServiceTest.java @@ -2,10 +2,8 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; -import com.amazonaws.AmazonServiceException; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.model.PutObjectResult; import java.net.MalformedURLException; @@ -25,7 +23,7 @@ import org.springframework.mock.web.MockMultipartFile; @ExtendWith(MockitoExtension.class) -public class S3ServiceTest { +class S3ServiceTest { @Mock private AmazonS3 s3Client; @@ -113,12 +111,4 @@ void SUCCESS_deleteFiles() { s3Service.deleteFiles(List.of("https://url.com"), "folderName") ); } - - @Test - @DisplayName("FAIL_파일 삭제 중 AmazonServiceException 발생") - void FAIL_deleteFilesAmazonServiceException() { - doThrow(AmazonServiceException.class).when(s3Client).deleteObject(any(), any()); - - s3Service.deleteFiles(List.of("https://url.com"), "folderName"); - } } \ No newline at end of file diff --git a/src/test/java/org/sopt/app/application/SoptampUserFinderTest.java b/src/test/java/org/sopt/app/application/SoptampUserFinderTest.java new file mode 100644 index 00000000..a4c4c847 --- /dev/null +++ b/src/test/java/org/sopt/app/application/SoptampUserFinderTest.java @@ -0,0 +1,77 @@ +package org.sopt.app.application; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyString; + +import java.util.Optional; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; +import org.sopt.app.application.soptamp.SoptampUserFinder; +import org.sopt.app.application.soptamp.SoptampUserInfo; +import org.sopt.app.common.exception.BadRequestException; +import org.sopt.app.domain.entity.soptamp.SoptampUser; +import org.sopt.app.interfaces.postgres.SoptampUserRepository; + +@ExtendWith(MockitoExtension.class) +class SoptampUserFinderTest { + + @Mock + private SoptampUserRepository soptampUserRepository; + + @InjectMocks + private SoptampUserFinder soptampUserFinder; + + @Test + @DisplayName("SUCCESS_닉네임으로 유저 조회") + void SUCCESS_findByNickname() { + //given + final Long id = 1L; + final Long userId = 1L; + final String profileMessage = "profileMessage"; + final Long totalPoints = 100L; + final String anyNickname = anyString(); + + final SoptampUser soptampUser = SoptampUser.builder() + .id(id) + .userId(userId) + .profileMessage(profileMessage) + .totalPoints(totalPoints) + .nickname(anyNickname) + .build(); + //when + Mockito.when(soptampUserRepository.findUserByNickname(anyNickname)).thenReturn(Optional.of(soptampUser)); + SoptampUserInfo expected = SoptampUserInfo.builder() + .id(id) + .userId(userId) + .profileMessage(profileMessage) + .totalPoints(totalPoints) + .nickname(anyNickname) + .build(); + + //then + assertThat(soptampUserFinder.findByNickname(anyNickname)).usingRecursiveComparison().isEqualTo(expected); + } + + @Test + @DisplayName("FAIL_닉네임으로 유저 조회 실패시 BadRequestException 발생") + void FAIL_findByNickname() { + //given + final String anyNickname = anyString(); + + //when + Mockito.when(soptampUserRepository.findUserByNickname(anyNickname)).thenReturn(Optional.empty()); + + //then + Assertions.assertThrows(BadRequestException.class, () -> { + soptampUserFinder.findByNickname(anyNickname); + }); + } + + +} diff --git a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java index 07b66fc2..da463a48 100755 --- a/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java +++ b/src/test/java/org/sopt/app/application/SoptampUserServiceTest.java @@ -1,9 +1,9 @@ package org.sopt.app.application; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.BDDMockito.given; import static org.sopt.app.common.fixtures.SoptampUserFixture.SOPTAMP_USER_1; @@ -93,7 +93,7 @@ void SUCCESS_editProfileMessage() { .profileMessage(newProfileMessage) .build(); - given(soptampUserRepository.save(any(SoptampUser.class))).willReturn(editedSoptampUser); + given(soptampUserRepository.findByUserId(anyLong())).willReturn(Optional.of(editedSoptampUser)); // when String result = soptampUserService.editProfileMessage(SOPTAMP_USER_1.getUserId(), newProfileMessage) @@ -144,37 +144,6 @@ void FAIL_createSoptampUser() { Assertions.assertEquals(soptampUserService.createSoptampUser(newNickname, anyUserId), id); } - @Test - @DisplayName("SUCCESS_닉네임으로 랭킹 조회") - void SUCCESS_findSoptampUserByNickname() { - // given - final String anyNickname = anyString(); - final SoptampUser soptampUser = SoptampUser.builder().nickname(anyNickname).build(); - - //when - Mockito.when(soptampUserRepository.findUserByNickname(anyNickname)).thenReturn(Optional.of(soptampUser)); - Optional result = soptampUserRepository.findUserByNickname(anyNickname); - - //then - assertThat(result).usingRecursiveComparison().isEqualTo(Optional.of(soptampUser)); - } - - @Test - @DisplayName("FAIL_닉네임으로 랭킹 조회") - void FAIL_findSoptampUserByNickname() { - // given - final String anyNickname = anyString(); - - //when - Mockito.when(soptampUserRepository.findUserByNickname(anyNickname)).thenReturn(Optional.empty()); - - //then - Assertions.assertThrows(BadRequestException.class, () -> { - soptampUserService.findSoptampUserByNickname(anyNickname); - }); - - } - @Test @DisplayName("SUCCESS_미션 레벨별로 유저의 포인트 추가") void SUCCESS_addPointByLevel() { @@ -186,25 +155,12 @@ void SUCCESS_addPointByLevel() { .userId(anyUserId) .totalPoints(soptampUserTotalPoints) .build(); - final SoptampUser newSoptampUser = SoptampUser.builder() - .userId(anyUserId) - .totalPoints(soptampUserTotalPoints + level) - .build(); - //when - SoptampUserInfo result = SoptampUserInfo.builder() - .id(newSoptampUser.getId()) - .userId(newSoptampUser.getUserId()) - .profileMessage(newSoptampUser.getProfileMessage()) - .totalPoints(newSoptampUser.getTotalPoints()) - .nickname(newSoptampUser.getNickname()) - .build(); Mockito.when(soptampUserRepository.findByUserId(anyUserId)).thenReturn(Optional.of(oldSoptampUser)); - Mockito.when(soptampUserRepository.save(any(SoptampUser.class))).thenReturn(newSoptampUser); //then - assertThat(soptampUserService.addPointByLevel(anyUserId, level)).usingRecursiveComparison().isEqualTo(result); + assertDoesNotThrow(() -> soptampUserService.addPointByLevel(anyUserId, level)); } @Test @@ -233,25 +189,12 @@ void SUCCESS_subtractPointByLevel() { .userId(anyUserId) .totalPoints(soptampUserTotalPoints) .build(); - final SoptampUser newSoptampUser = SoptampUser.builder() - .userId(anyUserId) - .totalPoints(soptampUserTotalPoints - level) - .build(); //when - SoptampUserInfo result = SoptampUserInfo.builder() - .id(newSoptampUser.getId()) - .userId(newSoptampUser.getUserId()) - .profileMessage(newSoptampUser.getProfileMessage()) - .totalPoints(newSoptampUser.getTotalPoints()) - .nickname(newSoptampUser.getNickname()) - .build(); - Mockito.when(soptampUserRepository.findByUserId(anyUserId)).thenReturn(Optional.of(oldSoptampUser)); - Mockito.when(soptampUserRepository.save(any(SoptampUser.class))).thenReturn(newSoptampUser); //then - assertThat(soptampUserService.subtractPointByLevel(anyUserId, level)).usingRecursiveComparison().isEqualTo(result); + assertDoesNotThrow(()-> soptampUserService.subtractPointByLevel(anyUserId, level)); } @Test @@ -269,52 +212,6 @@ void FAIL_subtractPointByLevel() { }); } - @Test - @DisplayName("SUCCESS_닉네임으로 유저 조회") - void SUCCESS_findByNickname() { - //given - final Long id = 1L; - final Long userId = 1L; - final String profileMessage = "profileMessage"; - final Long totalPoints = 100L; - final String anyNickname = anyString(); - - final SoptampUser soptampUser = SoptampUser.builder() - .id(id) - .userId(userId) - .profileMessage(profileMessage) - .totalPoints(totalPoints) - .nickname(anyNickname) - .build(); - //when - Mockito.when(soptampUserRepository.findUserByNickname(anyNickname)).thenReturn(Optional.of(soptampUser)); - SoptampUserInfo expected = SoptampUserInfo.builder() - .id(id) - .userId(userId) - .profileMessage(profileMessage) - .totalPoints(totalPoints) - .nickname(anyNickname) - .build(); - - //then - assertThat(soptampUserService.findByNickname(anyNickname)).usingRecursiveComparison().isEqualTo(expected); - } - - @Test - @DisplayName("FAIL_닉네임으로 유저 조회 실패시 BadRequestException 발생") - void FAIL_findByNickname() { - //given - final String anyNickname = anyString(); - - //when - Mockito.when(soptampUserRepository.findUserByNickname(anyNickname)).thenReturn(Optional.empty()); - - //then - Assertions.assertThrows(BadRequestException.class, () -> { - soptampUserService.findByNickname(anyNickname); - }); - } - @Test @DisplayName("SUCCESS_포인트 초기화") void SUCCESS_initPoint() { @@ -329,7 +226,7 @@ void SUCCESS_initPoint() { Mockito.when(soptampUserRepository.save(any(SoptampUser.class))).thenReturn(soptampUser); //then - Assertions.assertDoesNotThrow(() -> { + assertDoesNotThrow(() -> { soptampUserService.initPoint(anyUserId); }); } diff --git a/src/test/java/org/sopt/app/common/fixtures/SoptampPointFixture.java b/src/test/java/org/sopt/app/common/fixtures/SoptampPointFixture.java index 3f41ce51..009f6fa4 100755 --- a/src/test/java/org/sopt/app/common/fixtures/SoptampPointFixture.java +++ b/src/test/java/org/sopt/app/common/fixtures/SoptampPointFixture.java @@ -1,34 +1,12 @@ package org.sopt.app.common.fixtures; -import static org.sopt.app.common.fixtures.SoptampUserFixture.SOPTAMP_USER_1; -import static org.sopt.app.common.fixtures.SoptampUserFixture.SOPTAMP_USER_2; -import static org.sopt.app.common.fixtures.SoptampUserFixture.SOPTAMP_USER_3; - import java.util.List; import org.sopt.app.application.soptamp.SoptampPointInfo.PartPoint; import org.sopt.app.application.soptamp.SoptampPointInfo.PartRank; -import org.sopt.app.application.soptamp.SoptampPointInfo.Point; import org.sopt.app.domain.enums.Part; public class SoptampPointFixture { - public static final Point POINT_1 = Point.builder() - .id(1L) - .generation(1L) - .soptampUserId(SOPTAMP_USER_1.getId()) - .points(100L).build(); - public static final Point POINT_2 = Point.builder() - .id(2L) - .generation(1L) - .soptampUserId(SOPTAMP_USER_2.getId()) - .points(200L).build(); - public static final Point POINT_3 = Point.builder() - .id(3L) - .generation(1L) - .soptampUserId(SOPTAMP_USER_3.getId()) - .points(300L).build(); - public static final List SOPTAMP_POINT_LIST = List.of(POINT_1, POINT_2, POINT_3); - public static final PartRank PART_RANK_PLAN = PartRank.builder() .part(Part.PLAN.getPartName()) .rank(1) diff --git a/src/test/java/org/sopt/app/facade/AuthFacadeTest.java b/src/test/java/org/sopt/app/facade/AuthFacadeTest.java index 4d8bbf20..433ae4f2 100755 --- a/src/test/java/org/sopt/app/facade/AuthFacadeTest.java +++ b/src/test/java/org/sopt/app/facade/AuthFacadeTest.java @@ -61,7 +61,6 @@ void SUCCESS_loginWithPlaygroundActive() { when(userService.loginWithUserPlaygroundId(playgroundMain)).thenReturn(userId); when(soptampUserService.createSoptampUser(playgroundMain.getName(), userId.getId())) .thenReturn(soptampUserId); - doNothing().when(soptampPointService).upsertSoptampPoint(playgroundMain.getStatus(), soptampUserId); when(jwtTokenService.issueNewTokens(userId, playgroundMain)).thenReturn(appToken); when(appAuthResponseMapper.of(appToken.getAccessToken(), appToken.getRefreshToken(), playgroundMain.getAccessToken(), playgroundMain.getStatus())).thenReturn(token); diff --git a/src/test/java/org/sopt/app/facade/SoptampFacadeTest.java b/src/test/java/org/sopt/app/facade/SoptampFacadeTest.java index ce622bfc..8b546888 100755 --- a/src/test/java/org/sopt/app/facade/SoptampFacadeTest.java +++ b/src/test/java/org/sopt/app/facade/SoptampFacadeTest.java @@ -3,14 +3,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.then; -import static org.sopt.app.common.fixtures.SoptampFixture.MISSION_ID; -import static org.sopt.app.common.fixtures.SoptampFixture.MISSION_LEVEL; -import static org.sopt.app.common.fixtures.SoptampFixture.MULTIPART_FILE_LIST; -import static org.sopt.app.common.fixtures.SoptampFixture.NICKNAME; -import static org.sopt.app.common.fixtures.SoptampFixture.SOPTAMP_USER_ID; -import static org.sopt.app.common.fixtures.SoptampFixture.STAMP_ID; -import static org.sopt.app.common.fixtures.SoptampFixture.STAMP_IMG_PATHS; -import static org.sopt.app.common.fixtures.SoptampFixture.USER_ID; +import static org.sopt.app.common.fixtures.SoptampFixture.*; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -18,13 +11,10 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.sopt.app.application.mission.MissionInfo; -import org.sopt.app.application.mission.MissionService; +import org.sopt.app.application.mission.*; import org.sopt.app.application.s3.S3Service; -import org.sopt.app.application.soptamp.SoptampUserInfo; -import org.sopt.app.application.soptamp.SoptampUserService; -import org.sopt.app.application.stamp.StampInfo; -import org.sopt.app.application.stamp.StampService; +import org.sopt.app.application.soptamp.*; +import org.sopt.app.application.stamp.*; import org.sopt.app.common.fixtures.SoptampFixture; import org.sopt.app.presentation.stamp.StampRequest; import org.sopt.app.presentation.stamp.StampRequest.EditStampRequest; @@ -41,7 +31,7 @@ class SoptampFacadeTest { @Mock private SoptampUserService soptampUserService; @Mock - private SoptampPointService soptampPointService; + private SoptampUserFinder soptampUserFinder; @InjectMocks private SoptampFacade soptampFacade; @@ -52,7 +42,7 @@ class SoptampFacadeTest { void SUCCESS_getStampInfo() { // given final StampInfo.Stamp stampInfo = SoptampFixture.getStampInfo(); - given(soptampUserService.findByNickname(NICKNAME)).willReturn(SoptampFixture.getUserInfo()); + given(soptampUserFinder.findByNickname(NICKNAME)).willReturn(SoptampFixture.getUserInfo()); given(stampService.findStamp(MISSION_ID, USER_ID)).willReturn(stampInfo); // when @@ -71,7 +61,6 @@ void SUCCESS_uploadStamp() { final StampRequest.RegisterStampRequest registerStampRequest = SoptampFixture.getRegisterStampRequest(); given(stampService.uploadStamp(registerStampRequest, SOPTAMP_USER_ID)).willReturn(uploadedStamp); given(missionService.getMissionById(MISSION_ID)).willReturn(MissionInfo.Level.of(MISSION_LEVEL)); - given(soptampUserService.addPointByLevel(SOPTAMP_USER_ID, MISSION_LEVEL)).willReturn(SoptampFixture.getUserInfo()); // when StampInfo.Stamp result = soptampFacade.uploadStamp(SOPTAMP_USER_ID, registerStampRequest); @@ -90,7 +79,6 @@ void uploadStampDeprecated() { given(stampService.uploadStampDeprecated(registerStampRequest, STAMP_IMG_PATHS, SOPTAMP_USER_ID, MISSION_ID)) .willReturn(uploadedStamp); given(missionService.getMissionById(MISSION_ID)).willReturn(MissionInfo.Level.of(MISSION_LEVEL)); - given(soptampUserService.addPointByLevel(SOPTAMP_USER_ID, MISSION_LEVEL)).willReturn(SoptampFixture.getUserInfo()); // when StampInfo.Stamp result = soptampFacade.uploadStampDeprecated( @@ -124,14 +112,11 @@ void SUCCESS_deleteStamp() { // given given(stampService.getMissionIdByStampId(STAMP_ID)).willReturn(MISSION_ID); given(missionService.getMissionById(MISSION_ID)).willReturn(MissionInfo.Level.of(MISSION_LEVEL)); - given(soptampUserService.subtractPointByLevel(SOPTAMP_USER_ID, MISSION_LEVEL)) - .willReturn(SoptampFixture.getUserInfo()); // when soptampFacade.deleteStamp(SOPTAMP_USER_ID, STAMP_ID); // then - then(soptampPointService).should().subtractPoint(SOPTAMP_USER_ID, MISSION_LEVEL); then(stampService).should().deleteStampById(STAMP_ID); } @@ -144,21 +129,6 @@ void SUCCESS_deleteStampAll() { // then then(stampService).should().deleteAllStamps(SOPTAMP_USER_ID); then(soptampUserService).should().initPoint(SOPTAMP_USER_ID); - then(soptampPointService).should().initPoint(SOPTAMP_USER_ID); - } - - @Test - @DisplayName("SUCCESS_솝탬프 유저 닉네임 수정하기") - void SUCCESS_editSoptampUserNickname() { - // given - final SoptampUserInfo soptampUser = SoptampFixture.getUserInfo(); - given(soptampUserService.getSoptampUserInfo(USER_ID)).willReturn(soptampUser); - - // when - soptampFacade.editSoptampUserNickname(USER_ID, NICKNAME); - - // then - then(soptampUserService).should().editNickname(soptampUser, NICKNAME); } @Test @@ -167,12 +137,11 @@ void SUCCESS_editSoptampUserProfileMessage() { // given final SoptampUserInfo soptampUser = SoptampFixture.getUserInfo(); final String newProfileMessage = "new message"; - given(soptampUserService.getSoptampUserInfo(USER_ID)).willReturn(soptampUser); // when soptampFacade.editSoptampUserProfileMessage(USER_ID, newProfileMessage); // then - then(soptampUserService).should().editProfileMessage(soptampUser, newProfileMessage); + then(soptampUserService).should().editProfileMessage(soptampUser.getUserId(), newProfileMessage); } } \ No newline at end of file From 643cccd9916456bc1e310aa0184988e4834df28b Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 18:06:38 +0900 Subject: [PATCH 21/26] =?UTF-8?q?[refactor]=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20SoptampPointFixture=20=EC=82=AD=EC=A0=9C=20(#333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/fixtures/SoptampPointFixture.java | 49 ------------------- 1 file changed, 49 deletions(-) delete mode 100755 src/test/java/org/sopt/app/common/fixtures/SoptampPointFixture.java diff --git a/src/test/java/org/sopt/app/common/fixtures/SoptampPointFixture.java b/src/test/java/org/sopt/app/common/fixtures/SoptampPointFixture.java deleted file mode 100755 index 009f6fa4..00000000 --- a/src/test/java/org/sopt/app/common/fixtures/SoptampPointFixture.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.sopt.app.common.fixtures; - -import java.util.List; -import org.sopt.app.application.soptamp.SoptampPointInfo.PartPoint; -import org.sopt.app.application.soptamp.SoptampPointInfo.PartRank; -import org.sopt.app.domain.enums.Part; - -public class SoptampPointFixture { - - public static final PartRank PART_RANK_PLAN = PartRank.builder() - .part(Part.PLAN.getPartName()) - .rank(1) - .points(50L) - .build(); - public static final PartRank PART_RANK_SERVER = PartRank.builder() - .part(Part.SERVER.getPartName()) - .rank(2) - .points(40L) - .build(); - public static final PartRank PART_RANK_WEB = PartRank.builder() - .part(Part.WEB.getPartName()) - .rank(3) - .points(30L) - .build(); - public static final PartRank PART_RANK_IOS = PartRank.builder() - .part(Part.IOS.getPartName()) - .rank(4) - .points(20L) - .build(); - public static final PartRank PART_RANK_ANDROID = PartRank.builder() - .part(Part.ANDROID.getPartName()) - .rank(5) - .points(10L) - .build(); - public static final PartRank PART_RANK_DESIGN = PartRank.builder() - .part(Part.DESIGN.getPartName()) - .rank(6) - .points(0L) - .build(); - - public static final List PART_POINTS = List.of( - new PartPoint(Part.PLAN, 50L), - new PartPoint(Part.DESIGN, 0L), - new PartPoint(Part.WEB, 30L), - new PartPoint(Part.IOS, 20L), - new PartPoint(Part.ANDROID, 10L), - new PartPoint(Part.SERVER, 40L)); -} - From e8f80e3ec3614c7412fb416da961eaf3ca9fc487 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 18:07:02 +0900 Subject: [PATCH 22/26] =?UTF-8?q?[refactor]=20=ED=98=84=EC=9E=AC=20?= =?UTF-8?q?=EA=B8=B0=EC=88=98=EC=9D=98=20=EC=86=9D=ED=83=AC=ED=94=84=20?= =?UTF-8?q?=EC=9C=A0=EC=A0=80=20=EB=9E=AD=ED=82=B9=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80=20(#333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/fixtures/SoptampUserFixture.java | 38 ++++--- .../org/sopt/app/facade/RankFacadeTest.java | 99 +++++++------------ 2 files changed, 59 insertions(+), 78 deletions(-) mode change 100755 => 100644 src/test/java/org/sopt/app/facade/RankFacadeTest.java diff --git a/src/test/java/org/sopt/app/common/fixtures/SoptampUserFixture.java b/src/test/java/org/sopt/app/common/fixtures/SoptampUserFixture.java index 1929d541..31fa0441 100755 --- a/src/test/java/org/sopt/app/common/fixtures/SoptampUserFixture.java +++ b/src/test/java/org/sopt/app/common/fixtures/SoptampUserFixture.java @@ -7,20 +7,34 @@ public class SoptampUserFixture { public static final SoptampUser SOPTAMP_USER_1 = - SoptampUser.builder().id(1L).userId(10L).nickname("1stUser").totalPoints(100L).build(); + SoptampUser.builder().id(1L).userId(10L).nickname("서버1stUser").totalPoints(100L).build(); public static final SoptampUser SOPTAMP_USER_2 = - SoptampUser.builder().id(2L).userId(20L).nickname("2stUser").totalPoints(200L).build(); + SoptampUser.builder().id(2L).userId(20L).nickname("안드2stUser").totalPoints(200L).build(); public static final SoptampUser SOPTAMP_USER_3 = - SoptampUser.builder().id(3L).userId(30L).nickname("3stUser").totalPoints(300L).build(); - public static final List SOPTAMP_USER_ID_LIST = - List.of(SOPTAMP_USER_1.getId(), SOPTAMP_USER_2.getId(), SOPTAMP_USER_3.getId()); + SoptampUser.builder().id(3L).userId(30L).nickname("아요3stUser").totalPoints(300L).build(); + public static final SoptampUser SOPTAMP_USER_4 = + SoptampUser.builder().id(4L).userId(40L).nickname("디자인3stUser").totalPoints(300L).build(); - public static final SoptampUserInfo SOPTAMP_USER_INFO_1 = - SoptampUserInfo.builder().id(1L).userId(10L).nickname("1stUser").totalPoints(100L).build(); - public static final SoptampUserInfo SOPTAMP_USER_INFO_2 = - SoptampUserInfo.builder().id(2L).userId(20L).nickname("2stUser").totalPoints(200L).build(); - public static final SoptampUserInfo SOPTAMP_USER_INFO_3 = - SoptampUserInfo.builder().id(3L).userId(30L).nickname("3stUser").totalPoints(300L).build(); + public static final SoptampUserInfo SOPTAMP_USER_INFO_1 = SoptampUserInfo.builder() + .id(SOPTAMP_USER_1.getId()) + .userId(SOPTAMP_USER_1.getUserId()) + .nickname(SOPTAMP_USER_1.getNickname()) + .totalPoints(SOPTAMP_USER_1.getTotalPoints()).build(); + public static final SoptampUserInfo SOPTAMP_USER_INFO_2 = SoptampUserInfo.builder() + .id(SOPTAMP_USER_2.getId()) + .userId(SOPTAMP_USER_2.getUserId()) + .nickname(SOPTAMP_USER_2.getNickname()) + .totalPoints(SOPTAMP_USER_2.getTotalPoints()).build(); + public static final SoptampUserInfo SOPTAMP_USER_INFO_3 = SoptampUserInfo.builder() + .id(SOPTAMP_USER_3.getId()) + .userId(SOPTAMP_USER_3.getUserId()) + .nickname(SOPTAMP_USER_3.getNickname()) + .totalPoints(SOPTAMP_USER_3.getTotalPoints()).build(); + public static final SoptampUserInfo SOPTAMP_USER_INFO_4 = SoptampUserInfo.builder(). + id(SOPTAMP_USER_4.getId()) + .userId(SOPTAMP_USER_4.getUserId()) + .nickname(SOPTAMP_USER_4.getNickname()) + .totalPoints(SOPTAMP_USER_4.getTotalPoints()).build(); public static final List SOPTAMP_USER_INFO_LIST = - List.of(SOPTAMP_USER_INFO_1, SOPTAMP_USER_INFO_2, SOPTAMP_USER_INFO_3); + List.of(SOPTAMP_USER_INFO_1, SOPTAMP_USER_INFO_2, SOPTAMP_USER_INFO_3, SOPTAMP_USER_INFO_4); } diff --git a/src/test/java/org/sopt/app/facade/RankFacadeTest.java b/src/test/java/org/sopt/app/facade/RankFacadeTest.java old mode 100755 new mode 100644 index 4a8af240..3a1be9ce --- a/src/test/java/org/sopt/app/facade/RankFacadeTest.java +++ b/src/test/java/org/sopt/app/facade/RankFacadeTest.java @@ -1,23 +1,8 @@ package org.sopt.app.facade; -import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.BDDMockito.given; -import static org.sopt.app.common.fixtures.SoptampPointFixture.PART_POINTS; -import static org.sopt.app.common.fixtures.SoptampPointFixture.PART_RANK_ANDROID; -import static org.sopt.app.common.fixtures.SoptampPointFixture.PART_RANK_DESIGN; -import static org.sopt.app.common.fixtures.SoptampPointFixture.PART_RANK_IOS; -import static org.sopt.app.common.fixtures.SoptampPointFixture.PART_RANK_PLAN; -import static org.sopt.app.common.fixtures.SoptampPointFixture.PART_RANK_SERVER; -import static org.sopt.app.common.fixtures.SoptampPointFixture.PART_RANK_WEB; -import static org.sopt.app.common.fixtures.SoptampPointFixture.POINT_1; -import static org.sopt.app.common.fixtures.SoptampPointFixture.POINT_2; -import static org.sopt.app.common.fixtures.SoptampPointFixture.POINT_3; -import static org.sopt.app.common.fixtures.SoptampPointFixture.SOPTAMP_POINT_LIST; -import static org.sopt.app.common.fixtures.SoptampUserFixture.SOPTAMP_USER_ID_LIST; -import static org.sopt.app.common.fixtures.SoptampUserFixture.SOPTAMP_USER_INFO_1; -import static org.sopt.app.common.fixtures.SoptampUserFixture.SOPTAMP_USER_INFO_2; -import static org.sopt.app.common.fixtures.SoptampUserFixture.SOPTAMP_USER_INFO_3; -import static org.sopt.app.common.fixtures.SoptampUserFixture.SOPTAMP_USER_INFO_LIST; +import static org.sopt.app.common.fixtures.SoptampUserFixture.*; import java.util.List; import org.junit.jupiter.api.DisplayName; @@ -27,78 +12,60 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.sopt.app.application.soptamp.SoptampPointInfo.Main; -import org.sopt.app.application.soptamp.SoptampPointInfo.PartRank; -import org.sopt.app.application.soptamp.SoptampUserService; +import org.sopt.app.application.soptamp.SoptampUserFinder; @ExtendWith(MockitoExtension.class) class RankFacadeTest { @Mock - private SoptampUserService soptampUserService; - - @Mock - private SoptampPointService soptampPointService; + private SoptampUserFinder soptampUserFinder; @InjectMocks private RankFacade rankFacade; @Test - @DisplayName("SUCCESS_솝탬프 포인트 리스트를 받아 랭크를 조회") + @DisplayName("SUCCESS_현재 기수의 솝탬프 유저 랭킹 조회") void SUCCESS_findCurrentRanks() { //given - given(soptampPointService.findCurrentGenerationPoints()).willReturn(SOPTAMP_POINT_LIST); - given(soptampUserService.findAllBySoptampUserIds(SOPTAMP_USER_ID_LIST)).willReturn(SOPTAMP_USER_INFO_LIST); + given(soptampUserFinder.findAllCurrentGenerationSoptampUsers()).willReturn(SOPTAMP_USER_INFO_LIST); - //when + // when + List
result = rankFacade.findCurrentRanks(); List
expected = List.of( - Main.builder().rank(1).nickname(SOPTAMP_USER_INFO_3.getNickname()).point(POINT_3.getPoints()).build(), - Main.builder().rank(2).nickname(SOPTAMP_USER_INFO_2.getNickname()).point(POINT_2.getPoints()).build(), - Main.builder().rank(3).nickname(SOPTAMP_USER_INFO_1.getNickname()).point(POINT_1.getPoints()).build() + Main.builder().rank(3) + .nickname(SOPTAMP_USER_3.getNickname()) + .point(SOPTAMP_USER_3.getTotalPoints()).build(), + Main.builder().rank(3) + .nickname(SOPTAMP_USER_4.getNickname()) + .point(SOPTAMP_USER_4.getTotalPoints()).build(), + Main.builder().rank(2) + .nickname(SOPTAMP_USER_2.getNickname()) + .point(SOPTAMP_USER_2.getTotalPoints()).build(), + Main.builder().rank(1) + .nickname(SOPTAMP_USER_1.getNickname()) + .point(SOPTAMP_USER_1.getTotalPoints()).build() ); - List
result = rankFacade.findCurrentRanks(); - //then - assertThat(result).usingRecursiveComparison().isEqualTo(expected); + // then + assertEquals(expected.size(), result.size()); + for (int i = 0; i < expected.size(); i++) { + assertEquals(expected.get(i).getNickname(), result.get(i).getNickname()); + } } + /** @Test - @DisplayName("SUCCESS_솝탬프 포인트 해당하는 유저가 없다면 슬랙 알림을 보내기") - void SUCCESS_findCurrentRanks_Requirement1() { - //given - given(soptampPointService.findCurrentGenerationPoints()).willReturn(SOPTAMP_POINT_LIST); - given(soptampUserService.findAllBySoptampUserIds(SOPTAMP_USER_ID_LIST)).willReturn( - List.of(SOPTAMP_USER_INFO_1, SOPTAMP_USER_INFO_2) // 3번 유저가 존재하지 않음 - ); + @DisplayName("SUCCESS 파트별 현재 기수의 솝탬프 유저 랭킹 조회") + void findCurrentRanksByPart() { - //when - List
expected = List.of( - Main.builder().rank(1).nickname(SOPTAMP_USER_INFO_2.getNickname()).point(POINT_2.getPoints()).build(), - Main.builder().rank(2).nickname(SOPTAMP_USER_INFO_1.getNickname()).point(POINT_1.getPoints()).build() - ); - List
result = rankFacade.findCurrentRanks(); - - //then - assertThat(result).usingRecursiveComparison().isEqualTo(expected); + List
result = rankFacade.findCurrentRanksByPart(); } @Test - @DisplayName("SUCCESS_파트 랭킹 찾기") - void SUCCESS_findAllPartRanks() { - //given - given(soptampPointService.findSumOfPointAllParts()).willReturn(PART_POINTS); + @DisplayName("SUCCESS 파트끼리의 솝탬프 포인트 랭킹 조회") + void findAllPartRanks() { - //when List result = rankFacade.findAllPartRanks(); - List expected = List.of( - PART_RANK_PLAN, - PART_RANK_DESIGN, - PART_RANK_WEB, - PART_RANK_IOS, - PART_RANK_ANDROID, - PART_RANK_SERVER - ); - - //then - assertThat(result).usingRecursiveComparison().isEqualTo(expected); } -} + **/ +} \ No newline at end of file From 95f4b9e696d32486aad0e79610e206b0bee7b8f5 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 18:07:16 +0900 Subject: [PATCH 23/26] =?UTF-8?q?[refactor]=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EA=B3=B5=EB=B0=B1=20=EC=82=AD=EC=A0=9C=20(#333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/sopt/app/facade/RankFacade.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/org/sopt/app/facade/RankFacade.java b/src/main/java/org/sopt/app/facade/RankFacade.java index a278ba62..d2424415 100755 --- a/src/main/java/org/sopt/app/facade/RankFacade.java +++ b/src/main/java/org/sopt/app/facade/RankFacade.java @@ -5,12 +5,9 @@ import org.sopt.app.application.rank.SoptampPartRankCalculator; import org.sopt.app.application.rank.SoptampUserRankCalculator; import org.sopt.app.application.soptamp.SoptampPointInfo.Main; -import org.sopt.app.application.soptamp.SoptampPointInfo.PartPoint; import org.sopt.app.application.soptamp.SoptampPointInfo.PartRank; import org.sopt.app.application.soptamp.SoptampUserFinder; import org.sopt.app.application.soptamp.SoptampUserInfo; -import org.sopt.app.application.soptamp.SoptampUserService; -import org.sopt.app.domain.entity.soptamp.SoptampUser; import org.sopt.app.domain.enums.Part; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -21,7 +18,6 @@ public class RankFacade { private final SoptampUserFinder soptampUserFinder; - @Transactional(readOnly = true) public List
findCurrentRanks() { List soptampUserInfos = soptampUserFinder.findAllCurrentGenerationSoptampUsers(); @@ -29,7 +25,6 @@ public List
findCurrentRanks() { return soptampUserRankCalculator.calculateRank(); } - @Transactional(readOnly = true) public List
findCurrentRanksByPart(Part part) { List soptampUserInfos = soptampUserFinder.findSoptampUserIdByPart(part); From 6972ccc4edc585e0b79e97986f936dba09b9c6d6 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 18:14:51 +0900 Subject: [PATCH 24/26] =?UTF-8?q?[refactor]=20=ED=8C=8C=ED=8A=B8=EB=B3=84?= =?UTF-8?q?=20=ED=98=84=EC=9E=AC=20=EA=B8=B0=EC=88=98=EC=9D=98=20=EC=86=9D?= =?UTF-8?q?=ED=83=AC=ED=94=84=20=EC=9C=A0=EC=A0=80=20=EB=9E=AD=ED=82=B9=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/fixtures/SoptampUserFixture.java | 24 ++++++++++++++--- .../org/sopt/app/facade/RankFacadeTest.java | 26 ++++++++++++++++--- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/src/test/java/org/sopt/app/common/fixtures/SoptampUserFixture.java b/src/test/java/org/sopt/app/common/fixtures/SoptampUserFixture.java index 31fa0441..45533bbe 100755 --- a/src/test/java/org/sopt/app/common/fixtures/SoptampUserFixture.java +++ b/src/test/java/org/sopt/app/common/fixtures/SoptampUserFixture.java @@ -7,13 +7,17 @@ public class SoptampUserFixture { public static final SoptampUser SOPTAMP_USER_1 = - SoptampUser.builder().id(1L).userId(10L).nickname("서버1stUser").totalPoints(100L).build(); + SoptampUser.builder().id(1L).userId(10L).nickname("서버유저").totalPoints(100L).build(); public static final SoptampUser SOPTAMP_USER_2 = - SoptampUser.builder().id(2L).userId(20L).nickname("안드2stUser").totalPoints(200L).build(); + SoptampUser.builder().id(2L).userId(20L).nickname("안드유저").totalPoints(200L).build(); public static final SoptampUser SOPTAMP_USER_3 = - SoptampUser.builder().id(3L).userId(30L).nickname("아요3stUser").totalPoints(300L).build(); + SoptampUser.builder().id(3L).userId(30L).nickname("아요유저").totalPoints(300L).build(); public static final SoptampUser SOPTAMP_USER_4 = - SoptampUser.builder().id(4L).userId(40L).nickname("디자인3stUser").totalPoints(300L).build(); + SoptampUser.builder().id(4L).userId(40L).nickname("디자인유저").totalPoints(300L).build(); + public static final SoptampUser SOPTAMP_USER_5 = + SoptampUser.builder().id(5L).userId(50L).nickname("서버유저A").totalPoints(500L).build(); + public static final SoptampUser SOPTAMP_USER_6 = + SoptampUser.builder().id(6L).userId(60L).nickname("서버유저B").totalPoints(600L).build(); public static final SoptampUserInfo SOPTAMP_USER_INFO_1 = SoptampUserInfo.builder() .id(SOPTAMP_USER_1.getId()) @@ -35,6 +39,18 @@ public class SoptampUserFixture { .userId(SOPTAMP_USER_4.getUserId()) .nickname(SOPTAMP_USER_4.getNickname()) .totalPoints(SOPTAMP_USER_4.getTotalPoints()).build(); + public static final SoptampUserInfo SOPTAMP_USER_INFO_5 = SoptampUserInfo.builder() + .id(SOPTAMP_USER_5.getId()) + .userId(SOPTAMP_USER_5.getUserId()) + .nickname(SOPTAMP_USER_5.getNickname()) + .totalPoints(SOPTAMP_USER_5.getTotalPoints()).build(); + public static final SoptampUserInfo SOPTAMP_USER_INFO_6 = SoptampUserInfo.builder() + .id(SOPTAMP_USER_6.getId()) + .userId(SOPTAMP_USER_6.getUserId()) + .nickname(SOPTAMP_USER_6.getNickname()) + .totalPoints(SOPTAMP_USER_6.getTotalPoints()).build(); public static final List SOPTAMP_USER_INFO_LIST = List.of(SOPTAMP_USER_INFO_1, SOPTAMP_USER_INFO_2, SOPTAMP_USER_INFO_3, SOPTAMP_USER_INFO_4); + public static final List SERVER_PART_SOPTAMP_USER_INFO_LIST = + List.of(SOPTAMP_USER_INFO_6, SOPTAMP_USER_INFO_5, SOPTAMP_USER_INFO_1); } diff --git a/src/test/java/org/sopt/app/facade/RankFacadeTest.java b/src/test/java/org/sopt/app/facade/RankFacadeTest.java index 3a1be9ce..77bf755a 100644 --- a/src/test/java/org/sopt/app/facade/RankFacadeTest.java +++ b/src/test/java/org/sopt/app/facade/RankFacadeTest.java @@ -13,6 +13,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.sopt.app.application.soptamp.SoptampPointInfo.Main; import org.sopt.app.application.soptamp.SoptampUserFinder; +import org.sopt.app.domain.enums.Part; @ExtendWith(MockitoExtension.class) class RankFacadeTest { @@ -53,14 +54,31 @@ void SUCCESS_findCurrentRanks() { } } - /** @Test @DisplayName("SUCCESS 파트별 현재 기수의 솝탬프 유저 랭킹 조회") void findCurrentRanksByPart() { - - List
result = rankFacade.findCurrentRanksByPart(); + // given + given(soptampUserFinder.findSoptampUserIdByPart(Part.SERVER)).willReturn(SERVER_PART_SOPTAMP_USER_INFO_LIST); + // when + List
result = rankFacade.findCurrentRanksByPart(Part.SERVER); + List
expected = List.of( + Main.builder().rank(1) + .nickname(SOPTAMP_USER_6.getNickname()) + .point(SOPTAMP_USER_6.getTotalPoints()).build(), + Main.builder().rank(2) + .nickname(SOPTAMP_USER_5.getNickname()) + .point(SOPTAMP_USER_5.getTotalPoints()).build(), + Main.builder().rank(3) + .nickname(SOPTAMP_USER_1.getNickname()) + .point(SOPTAMP_USER_1.getTotalPoints()).build() + ); + // then + assertEquals(expected.size(), result.size()); + for (int i = 0; i < expected.size(); i++) { + assertEquals(expected.get(i).getNickname(), result.get(i).getNickname()); + } } - + /** @Test @DisplayName("SUCCESS 파트끼리의 솝탬프 포인트 랭킹 조회") void findAllPartRanks() { From bde28ba886512d4931add1e20c75a61d7ae4ca06 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 18:31:00 +0900 Subject: [PATCH 25/26] =?UTF-8?q?[feat]=20=ED=8C=8C=ED=8A=B8=EB=81=BC?= =?UTF-8?q?=EB=A6=AC=EC=9D=98=20=EC=86=9D=ED=83=AC=ED=94=84=20=ED=8F=AC?= =?UTF-8?q?=EC=9D=B8=ED=8A=B8=20=EB=9E=AD=ED=82=B9=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=B6=94=EA=B0=80=20(#333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/fixtures/SoptampUserFixture.java | 3 +- .../org/sopt/app/facade/RankFacadeTest.java | 57 ++++++++++++++++--- 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/src/test/java/org/sopt/app/common/fixtures/SoptampUserFixture.java b/src/test/java/org/sopt/app/common/fixtures/SoptampUserFixture.java index 45533bbe..ae024747 100755 --- a/src/test/java/org/sopt/app/common/fixtures/SoptampUserFixture.java +++ b/src/test/java/org/sopt/app/common/fixtures/SoptampUserFixture.java @@ -50,7 +50,8 @@ public class SoptampUserFixture { .nickname(SOPTAMP_USER_6.getNickname()) .totalPoints(SOPTAMP_USER_6.getTotalPoints()).build(); public static final List SOPTAMP_USER_INFO_LIST = - List.of(SOPTAMP_USER_INFO_1, SOPTAMP_USER_INFO_2, SOPTAMP_USER_INFO_3, SOPTAMP_USER_INFO_4); + List.of(SOPTAMP_USER_INFO_1, SOPTAMP_USER_INFO_2, SOPTAMP_USER_INFO_3, + SOPTAMP_USER_INFO_4, SOPTAMP_USER_INFO_5, SOPTAMP_USER_INFO_6); public static final List SERVER_PART_SOPTAMP_USER_INFO_LIST = List.of(SOPTAMP_USER_INFO_6, SOPTAMP_USER_INFO_5, SOPTAMP_USER_INFO_1); } diff --git a/src/test/java/org/sopt/app/facade/RankFacadeTest.java b/src/test/java/org/sopt/app/facade/RankFacadeTest.java index 77bf755a..a4db39c2 100644 --- a/src/test/java/org/sopt/app/facade/RankFacadeTest.java +++ b/src/test/java/org/sopt/app/facade/RankFacadeTest.java @@ -12,8 +12,10 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.sopt.app.application.soptamp.SoptampPointInfo.Main; +import org.sopt.app.application.soptamp.SoptampPointInfo.PartRank; import org.sopt.app.application.soptamp.SoptampUserFinder; import org.sopt.app.domain.enums.Part; +import org.springframework.security.core.parameters.P; @ExtendWith(MockitoExtension.class) class RankFacadeTest { @@ -33,16 +35,22 @@ void SUCCESS_findCurrentRanks() { // when List
result = rankFacade.findCurrentRanks(); List
expected = List.of( - Main.builder().rank(3) + Main.builder().rank(1) + .nickname(SOPTAMP_USER_6.getNickname()) + .point(SOPTAMP_USER_6.getTotalPoints()).build(), + Main.builder().rank(2) + .nickname(SOPTAMP_USER_5.getNickname()) + .point(SOPTAMP_USER_5.getTotalPoints()).build(), + Main.builder().rank(5) .nickname(SOPTAMP_USER_3.getNickname()) .point(SOPTAMP_USER_3.getTotalPoints()).build(), - Main.builder().rank(3) + Main.builder().rank(5) .nickname(SOPTAMP_USER_4.getNickname()) .point(SOPTAMP_USER_4.getTotalPoints()).build(), - Main.builder().rank(2) + Main.builder().rank(4) .nickname(SOPTAMP_USER_2.getNickname()) .point(SOPTAMP_USER_2.getTotalPoints()).build(), - Main.builder().rank(1) + Main.builder().rank(3) .nickname(SOPTAMP_USER_1.getNickname()) .point(SOPTAMP_USER_1.getTotalPoints()).build() ); @@ -50,7 +58,7 @@ void SUCCESS_findCurrentRanks() { // then assertEquals(expected.size(), result.size()); for (int i = 0; i < expected.size(); i++) { - assertEquals(expected.get(i).getNickname(), result.get(i).getNickname()); + assertEquals(expected.get(i).getNickname(), result.get(i).getNickname(), i + "번째 index"); } } @@ -75,15 +83,46 @@ void findCurrentRanksByPart() { // then assertEquals(expected.size(), result.size()); for (int i = 0; i < expected.size(); i++) { - assertEquals(expected.get(i).getNickname(), result.get(i).getNickname()); + assertEquals(expected.get(i).getNickname(), result.get(i).getNickname(), i + "번째 index"); } } - /** + @Test @DisplayName("SUCCESS 파트끼리의 솝탬프 포인트 랭킹 조회") void findAllPartRanks() { - + // given + given(soptampUserFinder.findAllCurrentGenerationSoptampUsers()).willReturn(SOPTAMP_USER_INFO_LIST); + // when List result = rankFacade.findAllPartRanks(); + List expected = List.of( // 기-디-웹-아-안-서 순서 + PartRank.builder().rank(5) // 동점이라면 rank도 같아야 함 + .part(Part.PLAN.getPartName()) + .points(0L).build(), + PartRank.builder().rank(2) + .part(Part.DESIGN.getPartName()) + .points(SOPTAMP_USER_4.getTotalPoints()).build(), + PartRank.builder().rank(5) + .part(Part.WEB.getPartName()) + .points(0L).build(), + PartRank.builder().rank(2) + .part(Part.IOS.getPartName()) + .points(SOPTAMP_USER_3.getTotalPoints()).build(), + PartRank.builder().rank(4) // 2등, 2등 다음 rank는 3등이 아닌 4등이다. + .part(Part.ANDROID.getPartName()) + .points(SOPTAMP_USER_2.getTotalPoints()).build(), + PartRank.builder().rank(1) + .part(Part.SERVER.getPartName()) + .points(SOPTAMP_USER_6.getTotalPoints() + + SOPTAMP_USER_5.getTotalPoints() + + SOPTAMP_USER_1.getTotalPoints()).build() + ); + + // then + assertEquals(expected.size(), result.size()); + for (int i = 0; i < expected.size(); i++) { + assertEquals(expected.get(i).getPart(), result.get(i).getPart(), i + "번째 index"); + assertEquals(expected.get(i).getRank(), result.get(i).getRank(), i + "번째 index"); + assertEquals(expected.get(i).getPoints(), result.get(i).getPoints(), i + "번째 index"); + } } - **/ } \ No newline at end of file From 85fddfafbd10dc8a54936bbe3b86eb4dd69ada33 Mon Sep 17 00:00:00 2001 From: kseysh Date: Sun, 29 Sep 2024 18:31:27 +0900 Subject: [PATCH 26/26] =?UTF-8?q?[refactor]=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20import=20=EC=82=AD=EC=A0=9C=20(#333)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/sopt/app/facade/RankFacadeTest.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/test/java/org/sopt/app/facade/RankFacadeTest.java b/src/test/java/org/sopt/app/facade/RankFacadeTest.java index a4db39c2..a7c43f9b 100644 --- a/src/test/java/org/sopt/app/facade/RankFacadeTest.java +++ b/src/test/java/org/sopt/app/facade/RankFacadeTest.java @@ -15,7 +15,6 @@ import org.sopt.app.application.soptamp.SoptampPointInfo.PartRank; import org.sopt.app.application.soptamp.SoptampUserFinder; import org.sopt.app.domain.enums.Part; -import org.springframework.security.core.parameters.P; @ExtendWith(MockitoExtension.class) class RankFacadeTest { @@ -96,20 +95,20 @@ void findAllPartRanks() { List result = rankFacade.findAllPartRanks(); List expected = List.of( // 기-디-웹-아-안-서 순서 PartRank.builder().rank(5) // 동점이라면 rank도 같아야 함 - .part(Part.PLAN.getPartName()) - .points(0L).build(), + .part(Part.PLAN.getPartName()) + .points(0L).build(), PartRank.builder().rank(2) - .part(Part.DESIGN.getPartName()) - .points(SOPTAMP_USER_4.getTotalPoints()).build(), + .part(Part.DESIGN.getPartName()) + .points(SOPTAMP_USER_4.getTotalPoints()).build(), PartRank.builder().rank(5) - .part(Part.WEB.getPartName()) - .points(0L).build(), + .part(Part.WEB.getPartName()) + .points(0L).build(), PartRank.builder().rank(2) - .part(Part.IOS.getPartName()) - .points(SOPTAMP_USER_3.getTotalPoints()).build(), + .part(Part.IOS.getPartName()) + .points(SOPTAMP_USER_3.getTotalPoints()).build(), PartRank.builder().rank(4) // 2등, 2등 다음 rank는 3등이 아닌 4등이다. - .part(Part.ANDROID.getPartName()) - .points(SOPTAMP_USER_2.getTotalPoints()).build(), + .part(Part.ANDROID.getPartName()) + .points(SOPTAMP_USER_2.getTotalPoints()).build(), PartRank.builder().rank(1) .part(Part.SERVER.getPartName()) .points(SOPTAMP_USER_6.getTotalPoints() +