From fb97d1c30a4b59322e8743f3dfc1443c5cc4c203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Tue, 1 Aug 2023 16:12:06 +0900 Subject: [PATCH 001/273] =?UTF-8?q?[FEAT]=20GGBE-12=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/game/service/GameAdminService.java | 8 +-- .../admin/noti/service/NotiAdminService.java | 3 +- .../penalty/service/PenaltyAdminService.java | 2 +- .../admin/rank/service/RankAdminService.java | 2 +- .../rank/service/RankRedisAdminService.java | 4 +- .../team/data/TeamUserAdminRepository.java | 3 +- .../admin/user/data/UserAdminRepository.java | 2 +- .../server/admin/user/dto/UserAdminDto.java | 2 +- .../user/dto/UserDetailAdminResponseDto.java | 3 +- .../admin/user/dto/UserSearchAdminDto.java | 3 +- .../user/dto/UserSearchAdminResponseDto.java | 3 - .../admin/user/service/UserAdminService.java | 14 +--- .../server/domain/coin/data/CoinHistory.java | 34 +++++++++ .../server/domain/coin/data/CoinPolicy.java | 38 ++++++++++ .../controller/FeedbackController.java | 2 +- .../server/domain/feedback/data/Feedback.java | 2 +- .../feedback/dto/FeedbackRequestDto.java | 1 - .../feedback/service/FeedbackService.java | 4 +- .../domain/game/service/GameService.java | 1 - .../com/gg/server/domain/item/data/Item.java | 52 ++++++++++++++ .../domain/match/dto/MatchStatusDto.java | 6 +- .../match/service/GameUpdateService.java | 7 +- .../match/service/MatchFindService.java | 4 +- .../domain/megaphone/data/Megaphone.java | 44 ++++++++++++ .../com/gg/server/domain/noti/data/Noti.java | 2 +- .../domain/noti/data/NotiRepository.java | 2 +- .../domain/noti/service/NotiService.java | 5 +- .../server/domain/pchange/data/PChange.java | 2 +- .../pchange/service/PChangeService.java | 6 +- .../server/domain/penalty/data/Penalty.java | 3 +- .../penalty/service/PenaltyService.java | 4 +- .../com/gg/server/domain/rank/data/Rank.java | 7 +- .../gg/server/domain/rank/dto/ExpRankDto.java | 2 +- .../server/domain/rank/redis/RankRedis.java | 1 - .../domain/rank/service/RankService.java | 6 +- .../server/domain/receipt/data/Receipt.java | 71 +++++++++++++++++++ .../domain/receipt/type/ItemStatus.java | 14 ++++ .../gg/server/domain/team/data/TeamUser.java | 3 +- .../domain/team/data/TeamUserRepository.java | 2 - .../com/gg/server/domain/tier/data/Tier.java | 25 +++++++ .../server/domain/user/{ => data}/User.java | 22 ++++-- .../gg/server/domain/user/data/UserImage.java | 43 +++++++++++ .../user/{ => data}/UserRepository.java | 7 +- .../user/dto/UserDetailResponseDto.java | 2 +- .../gg/server/domain/user/dto/UserDto.java | 2 +- .../domain/user/service/UserFindService.java | 5 +- .../domain/user/service/UserService.java | 9 +-- .../domain/user/type/BackgroundType.java | 17 +++++ .../gg/server/domain/user/type/EdgeType.java | 17 +++++ .../gg/server/global/config/WebConfig.java | 2 +- .../server/global/security/UserPrincipal.java | 2 +- .../OAuthAuthenticationSuccessHandler.java | 4 +- .../service/CustomOAuth2UserService.java | 7 +- .../service/CustomUserDetailsService.java | 4 +- .../server/global/utils/UserImageHandler.java | 2 +- .../LoginMemberArgumentResolver.java | 4 +- .../utils/aws/AsyncNewUserImageUploader.java | 4 +- .../FeedbackAdminControllerTest.java | 4 +- .../controller/GameAdminControllerTest.java | 10 +-- .../controller/NotiAdminControllerTest.java | 8 +-- .../PenaltyAdminControllerTest.java | 4 +- .../controller/UserAdminControllerTest.java | 4 +- .../match/service/MatchBothServiceTest.java | 4 +- .../match/service/MatchServiceTest.java | 2 +- .../domain/match/service/MatchTestUtils.java | 4 +- .../noti/controller/NotiControllerTest.java | 7 +- .../domain/noti/service/NotiServiceTest.java | 7 +- .../rank/controller/RankControllerTest.java | 4 +- .../user/controller/UserControllerTest.java | 6 +- .../gg/server/game/GameControllerTest.java | 2 +- .../game/service/GameFindServiceTest.java | 2 +- .../server/game/service/GameServiceTest.java | 3 +- .../game/service/GameStatusServiceTest.java | 2 +- .../com/gg/server/utils/TestDataUtils.java | 5 +- 74 files changed, 464 insertions(+), 166 deletions(-) create mode 100644 src/main/java/com/gg/server/domain/coin/data/CoinHistory.java create mode 100644 src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java create mode 100644 src/main/java/com/gg/server/domain/item/data/Item.java create mode 100644 src/main/java/com/gg/server/domain/megaphone/data/Megaphone.java create mode 100644 src/main/java/com/gg/server/domain/receipt/data/Receipt.java create mode 100644 src/main/java/com/gg/server/domain/receipt/type/ItemStatus.java create mode 100644 src/main/java/com/gg/server/domain/tier/data/Tier.java rename src/main/java/com/gg/server/domain/user/{ => data}/User.java (84%) create mode 100644 src/main/java/com/gg/server/domain/user/data/UserImage.java rename src/main/java/com/gg/server/domain/user/{ => data}/UserRepository.java (96%) create mode 100644 src/main/java/com/gg/server/domain/user/type/BackgroundType.java create mode 100644 src/main/java/com/gg/server/domain/user/type/EdgeType.java diff --git a/src/main/java/com/gg/server/admin/game/service/GameAdminService.java b/src/main/java/com/gg/server/admin/game/service/GameAdminService.java index 52f89d5fe..cc243c153 100644 --- a/src/main/java/com/gg/server/admin/game/service/GameAdminService.java +++ b/src/main/java/com/gg/server/admin/game/service/GameAdminService.java @@ -10,7 +10,6 @@ import com.gg.server.admin.team.data.TeamUserAdminRepository; import com.gg.server.admin.user.data.UserAdminRepository; import com.gg.server.domain.game.data.Game; -import com.gg.server.domain.game.data.GameRepository; import com.gg.server.domain.game.dto.GameTeamUser; import com.gg.server.domain.game.exception.GameNotExistException; import com.gg.server.domain.game.type.StatusType; @@ -18,16 +17,11 @@ import com.gg.server.domain.pchange.data.PChange; import com.gg.server.domain.pchange.data.PChangeRepository; -import com.gg.server.domain.rank.data.Rank; -import com.gg.server.domain.rank.data.RankRepository; -import com.gg.server.domain.rank.exception.RankNotFoundException; -import com.gg.server.domain.rank.redis.RankRedis; import com.gg.server.domain.rank.redis.RankRedisService; import com.gg.server.domain.season.data.Season; import com.gg.server.domain.season.exception.SeasonNotFoundException; import com.gg.server.domain.team.data.TeamUser; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.exception.UserNotFoundException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/com/gg/server/admin/noti/service/NotiAdminService.java b/src/main/java/com/gg/server/admin/noti/service/NotiAdminService.java index 4ab186da5..58f7c5c27 100644 --- a/src/main/java/com/gg/server/admin/noti/service/NotiAdminService.java +++ b/src/main/java/com/gg/server/admin/noti/service/NotiAdminService.java @@ -7,12 +7,11 @@ import com.gg.server.admin.user.data.UserAdminRepository; import com.gg.server.domain.noti.data.Noti; import com.gg.server.domain.noti.type.NotiType; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.exception.UserNotFoundException; import lombok.AllArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/gg/server/admin/penalty/service/PenaltyAdminService.java b/src/main/java/com/gg/server/admin/penalty/service/PenaltyAdminService.java index 2d8d807f0..861f07683 100644 --- a/src/main/java/com/gg/server/admin/penalty/service/PenaltyAdminService.java +++ b/src/main/java/com/gg/server/admin/penalty/service/PenaltyAdminService.java @@ -10,7 +10,7 @@ import com.gg.server.domain.penalty.exception.PenaltyNotFoundException; import com.gg.server.domain.penalty.exception.RedisPenaltyUserNotFoundException; import com.gg.server.domain.penalty.type.PenaltyType; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.service.UserFindService; import java.time.LocalDateTime; import java.util.List; diff --git a/src/main/java/com/gg/server/admin/rank/service/RankAdminService.java b/src/main/java/com/gg/server/admin/rank/service/RankAdminService.java index 3d5838c24..72172d92e 100644 --- a/src/main/java/com/gg/server/admin/rank/service/RankAdminService.java +++ b/src/main/java/com/gg/server/admin/rank/service/RankAdminService.java @@ -8,7 +8,7 @@ import com.gg.server.domain.season.data.SeasonRepository; import com.gg.server.domain.season.exception.SeasonForbiddenException; import com.gg.server.domain.season.exception.SeasonTimeBeforeException; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/gg/server/admin/rank/service/RankRedisAdminService.java b/src/main/java/com/gg/server/admin/rank/service/RankRedisAdminService.java index c16d362a2..fa380170c 100644 --- a/src/main/java/com/gg/server/admin/rank/service/RankRedisAdminService.java +++ b/src/main/java/com/gg/server/admin/rank/service/RankRedisAdminService.java @@ -4,8 +4,8 @@ import com.gg.server.domain.rank.redis.RankRedis; import com.gg.server.domain.rank.redis.RankRedisRepository; import com.gg.server.domain.rank.redis.RedisKeyManager; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/gg/server/admin/team/data/TeamUserAdminRepository.java b/src/main/java/com/gg/server/admin/team/data/TeamUserAdminRepository.java index d6434b496..4dab20a0d 100644 --- a/src/main/java/com/gg/server/admin/team/data/TeamUserAdminRepository.java +++ b/src/main/java/com/gg/server/admin/team/data/TeamUserAdminRepository.java @@ -1,12 +1,11 @@ package com.gg.server.admin.team.data; import com.gg.server.domain.team.data.TeamUser; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import java.time.LocalDateTime; import java.util.List; public interface TeamUserAdminRepository extends JpaRepository { diff --git a/src/main/java/com/gg/server/admin/user/data/UserAdminRepository.java b/src/main/java/com/gg/server/admin/user/data/UserAdminRepository.java index 44a2245a7..5253a8b24 100644 --- a/src/main/java/com/gg/server/admin/user/data/UserAdminRepository.java +++ b/src/main/java/com/gg/server/admin/user/data/UserAdminRepository.java @@ -1,6 +1,6 @@ package com.gg.server.admin.user.data; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/gg/server/admin/user/dto/UserAdminDto.java b/src/main/java/com/gg/server/admin/user/dto/UserAdminDto.java index b1f47ca24..41c56418b 100644 --- a/src/main/java/com/gg/server/admin/user/dto/UserAdminDto.java +++ b/src/main/java/com/gg/server/admin/user/dto/UserAdminDto.java @@ -1,6 +1,6 @@ package com.gg.server.admin.user.dto; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.type.RacketType; import com.gg.server.domain.user.type.RoleType; import com.gg.server.domain.user.type.SnsType; diff --git a/src/main/java/com/gg/server/admin/user/dto/UserDetailAdminResponseDto.java b/src/main/java/com/gg/server/admin/user/dto/UserDetailAdminResponseDto.java index d34e2ba8c..09e2f30a1 100644 --- a/src/main/java/com/gg/server/admin/user/dto/UserDetailAdminResponseDto.java +++ b/src/main/java/com/gg/server/admin/user/dto/UserDetailAdminResponseDto.java @@ -1,8 +1,7 @@ package com.gg.server.admin.user.dto; -import com.gg.server.domain.rank.data.Rank; import com.gg.server.domain.rank.redis.RankRedis; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/gg/server/admin/user/dto/UserSearchAdminDto.java b/src/main/java/com/gg/server/admin/user/dto/UserSearchAdminDto.java index 3bc7cd6e4..2c233b415 100644 --- a/src/main/java/com/gg/server/admin/user/dto/UserSearchAdminDto.java +++ b/src/main/java/com/gg/server/admin/user/dto/UserSearchAdminDto.java @@ -1,8 +1,7 @@ package com.gg.server.admin.user.dto; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.type.RoleType; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/gg/server/admin/user/dto/UserSearchAdminResponseDto.java b/src/main/java/com/gg/server/admin/user/dto/UserSearchAdminResponseDto.java index 6329da76b..63c811e93 100644 --- a/src/main/java/com/gg/server/admin/user/dto/UserSearchAdminResponseDto.java +++ b/src/main/java/com/gg/server/admin/user/dto/UserSearchAdminResponseDto.java @@ -1,10 +1,7 @@ package com.gg.server.admin.user.dto; -import com.gg.server.domain.user.User; import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Getter; -import org.springframework.data.domain.Page; import java.util.List; import java.util.stream.Collectors; diff --git a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java index d89380bb7..2137cc094 100644 --- a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java +++ b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java @@ -4,44 +4,32 @@ import com.gg.server.admin.user.data.UserAdminRepository; import com.gg.server.admin.user.dto.UserDetailAdminResponseDto; import com.gg.server.admin.user.dto.UserSearchAdminDto; -import com.gg.server.admin.user.dto.UserSearchAdminRequestDto; import com.gg.server.admin.user.dto.UserSearchAdminResponseDto; import com.gg.server.admin.user.dto.UserUpdateAdminRequestDto; -import com.gg.server.domain.match.type.Option; import com.gg.server.domain.rank.data.Rank; import com.gg.server.domain.rank.data.RankRepository; import com.gg.server.domain.rank.exception.RankNotFoundException; -import com.gg.server.domain.rank.exception.RankUpdateException; import com.gg.server.domain.rank.exception.RedisDataNotFoundException; import com.gg.server.domain.rank.redis.RankRedis; import com.gg.server.domain.rank.redis.RankRedisRepository; import com.gg.server.domain.rank.redis.RedisKeyManager; import com.gg.server.domain.season.data.Season; import com.gg.server.domain.season.exception.SeasonNotFoundException; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.service.UserFindService; -import com.gg.server.domain.user.type.RacketType; -import com.gg.server.domain.user.type.RoleType; -import com.gg.server.global.exception.ErrorCode; import com.gg.server.global.utils.aws.AsyncNewUserImageUploader; import lombok.AllArgsConstructor; -import org.apache.tomcat.jni.Local; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.data.redis.core.convert.RedisData; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import org.webjars.NotFoundException; import java.io.IOException; -import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; -import java.util.NoSuchElementException; -import java.util.Optional; @Service @AllArgsConstructor diff --git a/src/main/java/com/gg/server/domain/coin/data/CoinHistory.java b/src/main/java/com/gg/server/domain/coin/data/CoinHistory.java new file mode 100644 index 000000000..fe2e70d9a --- /dev/null +++ b/src/main/java/com/gg/server/domain/coin/data/CoinHistory.java @@ -0,0 +1,34 @@ +package com.gg.server.domain.coin.data; + +import com.gg.server.domain.user.data.User; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Entity +public class CoinHistory { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + @Column(name = "history", length = 30) + private String history; + + @Column(name = "amount") + private Long amount; + + @CreatedDate + @Column(name = "createdAt", updatable = false, nullable = false) + private LocalDateTime createdAt; +} \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java b/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java new file mode 100644 index 000000000..a5c977d53 --- /dev/null +++ b/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java @@ -0,0 +1,38 @@ +package com.gg.server.domain.coin.data; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Entity +public class CoinPolicy { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "user_id", length = 30) + private String CreateUserId; + + @Column(name = "attendance") + private Long attendance; + + @Column(name = "nomal") + private Long nomal; + + @Column(name = "rankWin") + private Long rankWin; + + @Column(name = "rankLose") + private Long rankLose; + + @CreatedDate + @Column(name = "createdAt", updatable = false, nullable = false) + private LocalDateTime createdAt; +} \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/feedback/controller/FeedbackController.java b/src/main/java/com/gg/server/domain/feedback/controller/FeedbackController.java index 4a6a54716..b99ae5bf1 100644 --- a/src/main/java/com/gg/server/domain/feedback/controller/FeedbackController.java +++ b/src/main/java/com/gg/server/domain/feedback/controller/FeedbackController.java @@ -3,7 +3,7 @@ import com.gg.server.domain.feedback.dto.FeedbackRequestDto; import com.gg.server.domain.feedback.service.FeedbackService; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.global.utils.argumentresolver.Login; import io.swagger.v3.oas.annotations.Parameter; diff --git a/src/main/java/com/gg/server/domain/feedback/data/Feedback.java b/src/main/java/com/gg/server/domain/feedback/data/Feedback.java index 76fc60e16..d03b6b042 100644 --- a/src/main/java/com/gg/server/domain/feedback/data/Feedback.java +++ b/src/main/java/com/gg/server/domain/feedback/data/Feedback.java @@ -1,6 +1,6 @@ package com.gg.server.domain.feedback.data; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.domain.feedback.type.FeedbackType; import com.gg.server.global.utils.BaseTimeEntity; import lombok.*; diff --git a/src/main/java/com/gg/server/domain/feedback/dto/FeedbackRequestDto.java b/src/main/java/com/gg/server/domain/feedback/dto/FeedbackRequestDto.java index 2441dc784..7fb56fa10 100644 --- a/src/main/java/com/gg/server/domain/feedback/dto/FeedbackRequestDto.java +++ b/src/main/java/com/gg/server/domain/feedback/dto/FeedbackRequestDto.java @@ -1,7 +1,6 @@ package com.gg.server.domain.feedback.dto; import com.gg.server.domain.feedback.type.FeedbackType; -import com.gg.server.domain.user.User; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/gg/server/domain/feedback/service/FeedbackService.java b/src/main/java/com/gg/server/domain/feedback/service/FeedbackService.java index 3279ef5c7..29a99827a 100644 --- a/src/main/java/com/gg/server/domain/feedback/service/FeedbackService.java +++ b/src/main/java/com/gg/server/domain/feedback/service/FeedbackService.java @@ -3,8 +3,8 @@ import com.gg.server.domain.feedback.data.Feedback; import com.gg.server.domain.feedback.data.FeedbackRepository; import com.gg.server.domain.feedback.dto.FeedbackRequestDto; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import lombok.RequiredArgsConstructor; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/gg/server/domain/game/service/GameService.java b/src/main/java/com/gg/server/domain/game/service/GameService.java index e563bf5f1..7ffc04a9f 100644 --- a/src/main/java/com/gg/server/domain/game/service/GameService.java +++ b/src/main/java/com/gg/server/domain/game/service/GameService.java @@ -16,7 +16,6 @@ import com.gg.server.domain.team.data.TeamUser; import com.gg.server.domain.team.data.TeamUserRepository; import com.gg.server.domain.team.exception.TeamIdNotMatchException; -import com.gg.server.domain.user.User; import com.gg.server.global.exception.ErrorCode; import com.gg.server.global.exception.custom.InvalidParameterException; import com.gg.server.global.utils.ExpLevelCalculator; diff --git a/src/main/java/com/gg/server/domain/item/data/Item.java b/src/main/java/com/gg/server/domain/item/data/Item.java new file mode 100644 index 000000000..ecbc94484 --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/data/Item.java @@ -0,0 +1,52 @@ +package com.gg.server.domain.item.data; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Entity +@Getter +@NoArgsConstructor +public class Item { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "name", length = 30) + private String name; + + @Column(name = "content", length = 255) + private String content; + + @Column(name = "image_uri", length = 255) + private String imageUri; + + @NotNull + @Column(name = "price") + private Integer price; + + @NotNull + @Column(name = "is_visible") + private Boolean isVisible; + + @Column(name = "discount") + private Integer discount; + + @NotNull + @Column(name = "created_at") + private LocalDateTime createdAt; + + public Item(String name, String content, String imageUri, Integer price, + Boolean isVisible, Integer discount, LocalDateTime createdAt) { + this.name = name; + this.content = content; + this.imageUri = imageUri; + this.price = price; + this.isVisible = isVisible; + this.discount = discount; + this.createdAt = createdAt; + } +} \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/match/dto/MatchStatusDto.java b/src/main/java/com/gg/server/domain/match/dto/MatchStatusDto.java index 780e7e721..c16e52569 100644 --- a/src/main/java/com/gg/server/domain/match/dto/MatchStatusDto.java +++ b/src/main/java/com/gg/server/domain/match/dto/MatchStatusDto.java @@ -4,13 +4,11 @@ import com.gg.server.domain.game.data.Game; import com.gg.server.domain.match.data.RedisMatchTime; import com.gg.server.domain.slotmanagement.SlotManagement; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.dto.UserDto; + import java.time.LocalDateTime; import java.util.List; -import java.util.stream.Collectors; + import lombok.AccessLevel; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/gg/server/domain/match/service/GameUpdateService.java b/src/main/java/com/gg/server/domain/match/service/GameUpdateService.java index d2f180123..75b906f02 100644 --- a/src/main/java/com/gg/server/domain/match/service/GameUpdateService.java +++ b/src/main/java/com/gg/server/domain/match/service/GameUpdateService.java @@ -2,10 +2,7 @@ import com.gg.server.domain.game.data.Game; import com.gg.server.domain.game.data.GameRepository; -import com.gg.server.domain.game.exception.GameAlreadyExistException; -import com.gg.server.domain.game.type.StatusType; import com.gg.server.domain.match.dto.GameAddDto; -import com.gg.server.domain.match.exception.EnrolledSlotException; import com.gg.server.domain.match.exception.SlotNotFoundException; import com.gg.server.domain.noti.data.Noti; import com.gg.server.domain.noti.service.NotiService; @@ -16,8 +13,8 @@ import com.gg.server.domain.team.data.TeamRepository; import com.gg.server.domain.team.data.TeamUser; import com.gg.server.domain.team.data.TeamUserRepository; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.domain.user.exception.UserNotFoundException; import java.time.LocalDateTime; diff --git a/src/main/java/com/gg/server/domain/match/service/MatchFindService.java b/src/main/java/com/gg/server/domain/match/service/MatchFindService.java index a70b88476..1d15ccbfb 100644 --- a/src/main/java/com/gg/server/domain/match/service/MatchFindService.java +++ b/src/main/java/com/gg/server/domain/match/service/MatchFindService.java @@ -20,8 +20,8 @@ import com.gg.server.domain.season.service.SeasonFindService; import com.gg.server.domain.slotmanagement.SlotManagement; import com.gg.server.domain.slotmanagement.data.SlotManagementRepository; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.domain.user.type.RoleType; import java.time.LocalDateTime; diff --git a/src/main/java/com/gg/server/domain/megaphone/data/Megaphone.java b/src/main/java/com/gg/server/domain/megaphone/data/Megaphone.java new file mode 100644 index 000000000..d35b41759 --- /dev/null +++ b/src/main/java/com/gg/server/domain/megaphone/data/Megaphone.java @@ -0,0 +1,44 @@ +package com.gg.server.domain.megaphone.data; + +import com.gg.server.domain.user.data.User; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.time.LocalDate; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity +public class Megaphone { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + /* @NotNull + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "receipt_id") + private Receipt receipt;*/ + + @Column(name = "content", length = 30) + private String content; + + @NotNull + @Column(name = "used_at") + private LocalDate usedAt; + + //public Megaphone(User user, Receipt receipt, String content, LocalDate usedAt) { + public Megaphone(User user, String content, LocalDate usedAt) { + this.user = user; + //this.receipt = receipt; + this.content = content; + this.usedAt = usedAt; + } +} diff --git a/src/main/java/com/gg/server/domain/noti/data/Noti.java b/src/main/java/com/gg/server/domain/noti/data/Noti.java index fb425e0d6..63c49672b 100644 --- a/src/main/java/com/gg/server/domain/noti/data/Noti.java +++ b/src/main/java/com/gg/server/domain/noti/data/Noti.java @@ -1,6 +1,6 @@ package com.gg.server.domain.noti.data; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.domain.noti.type.NotiType; import com.gg.server.global.utils.BaseTimeEntity; import lombok.*; diff --git a/src/main/java/com/gg/server/domain/noti/data/NotiRepository.java b/src/main/java/com/gg/server/domain/noti/data/NotiRepository.java index ff7d99be0..7c924cb78 100644 --- a/src/main/java/com/gg/server/domain/noti/data/NotiRepository.java +++ b/src/main/java/com/gg/server/domain/noti/data/NotiRepository.java @@ -1,6 +1,6 @@ package com.gg.server.domain.noti.data; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; import java.util.Optional; diff --git a/src/main/java/com/gg/server/domain/noti/service/NotiService.java b/src/main/java/com/gg/server/domain/noti/service/NotiService.java index 114c705d8..c61b36843 100644 --- a/src/main/java/com/gg/server/domain/noti/service/NotiService.java +++ b/src/main/java/com/gg/server/domain/noti/service/NotiService.java @@ -5,10 +5,9 @@ import com.gg.server.domain.noti.dto.NotiDto; import com.gg.server.domain.noti.dto.NotiResponseDto; import com.gg.server.domain.noti.type.NotiType; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; -import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.global.exception.ErrorCode; import com.gg.server.global.exception.custom.NotExistException; import lombok.AllArgsConstructor; diff --git a/src/main/java/com/gg/server/domain/pchange/data/PChange.java b/src/main/java/com/gg/server/domain/pchange/data/PChange.java index 9eb657115..d513b2173 100644 --- a/src/main/java/com/gg/server/domain/pchange/data/PChange.java +++ b/src/main/java/com/gg/server/domain/pchange/data/PChange.java @@ -1,7 +1,7 @@ package com.gg.server.domain.pchange.data; import com.gg.server.domain.game.data.Game; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.global.utils.BaseTimeEntity; import lombok.*; diff --git a/src/main/java/com/gg/server/domain/pchange/service/PChangeService.java b/src/main/java/com/gg/server/domain/pchange/service/PChangeService.java index 465d88453..fd572adb4 100644 --- a/src/main/java/com/gg/server/domain/pchange/service/PChangeService.java +++ b/src/main/java/com/gg/server/domain/pchange/service/PChangeService.java @@ -1,13 +1,9 @@ package com.gg.server.domain.pchange.service; import com.gg.server.domain.game.data.Game; -import com.gg.server.domain.game.dto.ExpChangeResultResDto; -import com.gg.server.domain.game.dto.PPPChangeResultResDto; -import com.gg.server.domain.game.service.GameService; import com.gg.server.domain.pchange.data.PChange; import com.gg.server.domain.pchange.data.PChangeRepository; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/gg/server/domain/penalty/data/Penalty.java b/src/main/java/com/gg/server/domain/penalty/data/Penalty.java index 689939a0d..2281b65b8 100644 --- a/src/main/java/com/gg/server/domain/penalty/data/Penalty.java +++ b/src/main/java/com/gg/server/domain/penalty/data/Penalty.java @@ -1,10 +1,9 @@ package com.gg.server.domain.penalty.data; import com.gg.server.domain.penalty.type.PenaltyType; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.global.utils.BaseTimeEntity; import lombok.AccessLevel; -import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; diff --git a/src/main/java/com/gg/server/domain/penalty/service/PenaltyService.java b/src/main/java/com/gg/server/domain/penalty/service/PenaltyService.java index c1aaef2d4..9880f726d 100644 --- a/src/main/java/com/gg/server/domain/penalty/service/PenaltyService.java +++ b/src/main/java/com/gg/server/domain/penalty/service/PenaltyService.java @@ -5,10 +5,10 @@ import com.gg.server.domain.penalty.redis.PenaltyUserRedisRepository; import com.gg.server.domain.penalty.redis.RedisPenaltyUser; import com.gg.server.domain.penalty.type.PenaltyType; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.domain.user.service.UserFindService; -import com.gg.server.domain.user.service.UserService; + import java.time.LocalDateTime; import java.util.Optional; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/gg/server/domain/rank/data/Rank.java b/src/main/java/com/gg/server/domain/rank/data/Rank.java index a6c68f1c4..fe30e94b5 100644 --- a/src/main/java/com/gg/server/domain/rank/data/Rank.java +++ b/src/main/java/com/gg/server/domain/rank/data/Rank.java @@ -2,7 +2,8 @@ import com.gg.server.admin.user.dto.UserUpdateAdminRequestDto; import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.user.User; +import com.gg.server.domain.tier.data.Tier; +import com.gg.server.domain.user.data.User; import com.gg.server.global.utils.BaseTimeEntity; import lombok.AllArgsConstructor; import lombok.Builder; @@ -33,6 +34,10 @@ public class Rank extends BaseTimeEntity implements Serializable { @JoinColumn(name = "season_id") private Season season; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "tier_id") + private Tier tier; + @NotNull @Column(name = "ppp") private Integer ppp; diff --git a/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java b/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java index 1d6effe0c..3786ceeea 100644 --- a/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java +++ b/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java @@ -1,6 +1,6 @@ package com.gg.server.domain.rank.dto; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.global.utils.ExpLevelCalculator; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java b/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java index d19519b20..a1fafb25c 100644 --- a/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java +++ b/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java @@ -1,7 +1,6 @@ package com.gg.server.domain.rank.redis; import com.gg.server.domain.rank.data.Rank; -import com.gg.server.domain.user.User; import com.gg.server.domain.user.dto.UserDto; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/com/gg/server/domain/rank/service/RankService.java b/src/main/java/com/gg/server/domain/rank/service/RankService.java index 0306fe7b8..4268c5f8c 100644 --- a/src/main/java/com/gg/server/domain/rank/service/RankService.java +++ b/src/main/java/com/gg/server/domain/rank/service/RankService.java @@ -10,17 +10,15 @@ import com.gg.server.domain.rank.redis.RedisKeyManager; import com.gg.server.domain.season.data.Season; import com.gg.server.domain.season.service.SeasonFindService; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; -import com.gg.server.global.dto.PageRequestDto; import com.gg.server.global.exception.ErrorCode; import com.gg.server.global.exception.custom.PageNotFoundException; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Configuration; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/gg/server/domain/receipt/data/Receipt.java b/src/main/java/com/gg/server/domain/receipt/data/Receipt.java new file mode 100644 index 000000000..f79ce2b7e --- /dev/null +++ b/src/main/java/com/gg/server/domain/receipt/data/Receipt.java @@ -0,0 +1,71 @@ +package com.gg.server.domain.receipt.data; + +import com.gg.server.domain.item.data.Item; +import com.gg.server.domain.receipt.type.ItemStatus; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Entity +public class Receipt { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "item_id") + private Item item; + + @NotNull + @Column(name = "purchaser_intra_id") + private String purchaserIntraId; + + @NotNull + @Column(name = "owner_intra_id") + private String ownerIntraId; + + @NotNull + @Enumerated(EnumType.STRING) + private ItemStatus status; + + @NotNull + @Column(name = "created_At") + private LocalDateTime purchasedAt; + + public Receipt(Item item, String purchaserIntraId, String ownerIntraId, + ItemStatus status, LocalDateTime purchasedAt){ + this.item = item; + this.purchaserIntraId = purchaserIntraId; + this.ownerIntraId = ownerIntraId; + this.status = status; + this.purchasedAt = purchasedAt; + } + + @Override + public String toString() { + return "Receipt{" + + "id=" + id + + ", item=" + item + + ", purchaserIntraId='" + purchaserIntraId + '\'' + + ", ownerIntraId='" + ownerIntraId + '\'' + + ", status=" + status + + ", purchasedAt=" + purchasedAt + + '}'; + } + + public void updateStatus() { + if (status == ItemStatus.BEFORE) { + this.status = ItemStatus.USING; + } else { + this.status = ItemStatus.USED; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/receipt/type/ItemStatus.java b/src/main/java/com/gg/server/domain/receipt/type/ItemStatus.java new file mode 100644 index 000000000..0b0622d80 --- /dev/null +++ b/src/main/java/com/gg/server/domain/receipt/type/ItemStatus.java @@ -0,0 +1,14 @@ +package com.gg.server.domain.receipt.type; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum ItemStatus { + BEFORE("before", "사용 전"), USING("using", "사용 중"), + USED("used", "사용 완료"); + + private final String code; + private final String desc; +} \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/team/data/TeamUser.java b/src/main/java/com/gg/server/domain/team/data/TeamUser.java index 405d31e18..0d22085bb 100644 --- a/src/main/java/com/gg/server/domain/team/data/TeamUser.java +++ b/src/main/java/com/gg/server/domain/team/data/TeamUser.java @@ -1,11 +1,10 @@ package com.gg.server.domain.team.data; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import lombok.*; import javax.persistence.*; import javax.validation.constraints.NotNull; -import java.util.List; @NoArgsConstructor(access = AccessLevel.PROTECTED) @AllArgsConstructor diff --git a/src/main/java/com/gg/server/domain/team/data/TeamUserRepository.java b/src/main/java/com/gg/server/domain/team/data/TeamUserRepository.java index a34e99c4f..a595a79a1 100644 --- a/src/main/java/com/gg/server/domain/team/data/TeamUserRepository.java +++ b/src/main/java/com/gg/server/domain/team/data/TeamUserRepository.java @@ -1,9 +1,7 @@ package com.gg.server.domain.team.data; -import com.gg.server.domain.user.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; import java.time.LocalDateTime; import java.util.List; diff --git a/src/main/java/com/gg/server/domain/tier/data/Tier.java b/src/main/java/com/gg/server/domain/tier/data/Tier.java new file mode 100644 index 000000000..3ff5cc673 --- /dev/null +++ b/src/main/java/com/gg/server/domain/tier/data/Tier.java @@ -0,0 +1,25 @@ +package com.gg.server.domain.tier.data; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Entity +@NoArgsConstructor +@AllArgsConstructor +public class Tier { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "image_uri") + private String imageUri; + + @Column(name = "name") + private String name; + + public Tier(String imageUri) { + this.imageUri = imageUri; + } +} \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/user/User.java b/src/main/java/com/gg/server/domain/user/data/User.java similarity index 84% rename from src/main/java/com/gg/server/domain/user/User.java rename to src/main/java/com/gg/server/domain/user/data/User.java index 2ff650d27..7151f051a 100644 --- a/src/main/java/com/gg/server/domain/user/User.java +++ b/src/main/java/com/gg/server/domain/user/data/User.java @@ -1,9 +1,7 @@ -package com.gg.server.domain.user; +package com.gg.server.domain.user.data; import com.gg.server.admin.user.dto.UserUpdateAdminRequestDto; -import com.gg.server.domain.user.type.RacketType; -import com.gg.server.domain.user.type.RoleType; -import com.gg.server.domain.user.type.SnsType; +import com.gg.server.domain.user.type.*; import com.gg.server.global.utils.BaseTimeEntity; import lombok.*; @@ -48,6 +46,20 @@ public class User extends BaseTimeEntity implements Serializable { @Column(name = "kakao_id") private Long kakaoId; + @Column(name = "gg_coin") + private Integer ggCoin; + + @Column(name = "background") + @Enumerated(EnumType.STRING) + private BackgroundType background; + + @Column(name = "text_color", length = 10) + private String textColor; + + @Column(name = "edge") + @Enumerated(EnumType.STRING) + private EdgeType edge; + @Builder public User(String intraId, String eMail, String imageUri, RacketType racketType, RoleType roleType, Integer totalExp, SnsType snsNotiOpt, Long kakaoId) { @@ -87,4 +99,4 @@ public void updateExp(int beforeExp) { public void updateKakaoId(Long kakaoId) { this.kakaoId = kakaoId; } -} +} \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/user/data/UserImage.java b/src/main/java/com/gg/server/domain/user/data/UserImage.java new file mode 100644 index 000000000..d7cfa431c --- /dev/null +++ b/src/main/java/com/gg/server/domain/user/data/UserImage.java @@ -0,0 +1,43 @@ +package com.gg.server.domain.userImage; + +import com.gg.server.global.utils.BaseTimeEntity; +import com.sun.istack.NotNull; + +import javax.persistence.*; +import java.io.Serializable; + +public class UserImage extends BaseTimeEntity implements Serializable { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @ManyToOne + @Column(name = "user_id", length = 30) + private String userId; + + @NotNull + @Column(name = "image_url") + private String imageUrl; + + public UserImage(String userId, String imageUrl) { + this.userId = userId; + this.imageUrl = imageUrl; + } + + public String getImageId() { + return imageUrl; + } + + public String getuserId() { + return userId; + } + + public String getUserImageUrl() { + return imageUrl; + } + + public void imageUpdate(String imageUrl) { + this.imageUrl = imageUrl; + } +} \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/user/UserRepository.java b/src/main/java/com/gg/server/domain/user/data/UserRepository.java similarity index 96% rename from src/main/java/com/gg/server/domain/user/UserRepository.java rename to src/main/java/com/gg/server/domain/user/data/UserRepository.java index be0fc843e..59154e228 100644 --- a/src/main/java/com/gg/server/domain/user/UserRepository.java +++ b/src/main/java/com/gg/server/domain/user/data/UserRepository.java @@ -1,6 +1,7 @@ -package com.gg.server.domain.user; +package com.gg.server.domain.user.data; import java.util.List; + import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -11,11 +12,15 @@ public interface UserRepository extends JpaRepository { Optional findByIntraId(String intraId); + User getUserByIntraId(String IntraId); + Page findByIntraIdContains(Pageable pageable, String intraId); Page findAllByTotalExpGreaterThan(Pageable pageable, Integer exp); + Optional findByKakaoId(Long kakaoId); + @Query(nativeQuery = true, value = "select ranking from " + "(select intra_id, row_number() over (order by total_exp desc, intra_id asc) as ranking from user) ranked where intra_id=:intraId") Long findExpRankingByIntraId(@Param("intraId") String intraId); diff --git a/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java b/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java index 842f7497d..1202711e1 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java @@ -1,6 +1,6 @@ package com.gg.server.domain.user.dto; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.type.SnsType; import com.gg.server.global.utils.ExpLevelCalculator; import lombok.*; diff --git a/src/main/java/com/gg/server/domain/user/dto/UserDto.java b/src/main/java/com/gg/server/domain/user/dto/UserDto.java index 13382c45d..dc6242384 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserDto.java @@ -1,6 +1,6 @@ package com.gg.server.domain.user.dto; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.type.RacketType; import com.gg.server.domain.user.type.RoleType; import com.gg.server.domain.user.type.SnsType; diff --git a/src/main/java/com/gg/server/domain/user/service/UserFindService.java b/src/main/java/com/gg/server/domain/user/service/UserFindService.java index 16479021a..c0c682930 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserFindService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserFindService.java @@ -6,10 +6,9 @@ import com.gg.server.domain.rank.redis.RedisKeyManager; import com.gg.server.domain.season.data.Season; import com.gg.server.domain.season.service.SeasonFindService; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.exception.UserNotFoundException; -import com.gg.server.global.exception.ErrorCode; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 29a985ed3..bf0553ca0 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -16,17 +16,12 @@ import com.gg.server.domain.rank.service.RankFindService; import com.gg.server.domain.season.data.Season; import com.gg.server.domain.season.service.SeasonFindService; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.*; -import com.gg.server.domain.user.exception.TokenNotValidException; import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.type.RacketType; import com.gg.server.domain.user.type.SnsType; -import com.gg.server.global.security.config.properties.AppProperties; -import com.gg.server.global.security.jwt.repository.JwtRedisRepository; -import com.gg.server.global.security.jwt.utils.AuthTokenProvider; -import jdk.jshell.Snippet; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; diff --git a/src/main/java/com/gg/server/domain/user/type/BackgroundType.java b/src/main/java/com/gg/server/domain/user/type/BackgroundType.java new file mode 100644 index 000000000..a1010daa3 --- /dev/null +++ b/src/main/java/com/gg/server/domain/user/type/BackgroundType.java @@ -0,0 +1,17 @@ +package com.gg.server.domain.user.type; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public enum BackgroundType { + COLOR1(0, "color1"), + COLOR2(1, "color2"), + COLOR3(2, "color3"); + + private final Integer value; + private final String code; + + public static BackgroundType of(String code) { + return BackgroundType.valueOf(code); + } +} \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/user/type/EdgeType.java b/src/main/java/com/gg/server/domain/user/type/EdgeType.java new file mode 100644 index 000000000..8bc218d84 --- /dev/null +++ b/src/main/java/com/gg/server/domain/user/type/EdgeType.java @@ -0,0 +1,17 @@ +package com.gg.server.domain.user.type; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public enum EdgeType { + COLOR1(0, "color1"), + COLOR2(1, "color2"), + COLOR3(2, "color3"); + + private final Integer value; + private final String code; + + public static EdgeType of(String code) { + return EdgeType.valueOf(code); + } +} diff --git a/src/main/java/com/gg/server/global/config/WebConfig.java b/src/main/java/com/gg/server/global/config/WebConfig.java index d914c1642..20708d21d 100644 --- a/src/main/java/com/gg/server/global/config/WebConfig.java +++ b/src/main/java/com/gg/server/global/config/WebConfig.java @@ -1,6 +1,6 @@ package com.gg.server.global.config; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; import com.gg.server.global.utils.argumentresolver.LoginMemberArgumentResolver; import com.gg.server.global.utils.querytracker.LoggingInterceptor; diff --git a/src/main/java/com/gg/server/global/security/UserPrincipal.java b/src/main/java/com/gg/server/global/security/UserPrincipal.java index 1428d76b1..7dd850db1 100644 --- a/src/main/java/com/gg/server/global/security/UserPrincipal.java +++ b/src/main/java/com/gg/server/global/security/UserPrincipal.java @@ -1,6 +1,6 @@ package com.gg.server.global.security; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.type.RoleType; import lombok.Getter; import org.springframework.security.core.GrantedAuthority; diff --git a/src/main/java/com/gg/server/global/security/handler/OAuthAuthenticationSuccessHandler.java b/src/main/java/com/gg/server/global/security/handler/OAuthAuthenticationSuccessHandler.java index 6cb5bfb58..439842e19 100644 --- a/src/main/java/com/gg/server/global/security/handler/OAuthAuthenticationSuccessHandler.java +++ b/src/main/java/com/gg/server/global/security/handler/OAuthAuthenticationSuccessHandler.java @@ -1,8 +1,8 @@ package com.gg.server.global.security.handler; import com.gg.server.domain.rank.redis.RedisKeyManager; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.type.RoleType; import com.gg.server.global.security.UserPrincipal; diff --git a/src/main/java/com/gg/server/global/security/service/CustomOAuth2UserService.java b/src/main/java/com/gg/server/global/security/service/CustomOAuth2UserService.java index ac78b1ee0..efaeecfe6 100644 --- a/src/main/java/com/gg/server/global/security/service/CustomOAuth2UserService.java +++ b/src/main/java/com/gg/server/global/security/service/CustomOAuth2UserService.java @@ -5,10 +5,9 @@ import com.gg.server.domain.rank.redis.RankRedis; import com.gg.server.domain.rank.redis.RankRedisRepository; import com.gg.server.domain.rank.redis.RedisKeyManager; -import com.gg.server.domain.season.data.Season; import com.gg.server.domain.season.data.SeasonRepository; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.global.security.UserPrincipal; import com.gg.server.global.security.info.OAuthUserInfo; @@ -29,8 +28,6 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; -import java.util.List; -import java.util.NoSuchElementException; @Service @RequiredArgsConstructor diff --git a/src/main/java/com/gg/server/global/security/service/CustomUserDetailsService.java b/src/main/java/com/gg/server/global/security/service/CustomUserDetailsService.java index 3526ca8ee..d2345d079 100644 --- a/src/main/java/com/gg/server/global/security/service/CustomUserDetailsService.java +++ b/src/main/java/com/gg/server/global/security/service/CustomUserDetailsService.java @@ -1,9 +1,7 @@ package com.gg.server.global.security.service; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.service.UserFindService; -import com.gg.server.domain.user.service.UserService; import com.gg.server.global.security.UserPrincipal; import lombok.RequiredArgsConstructor; import org.springframework.security.core.userdetails.UserDetails; diff --git a/src/main/java/com/gg/server/global/utils/UserImageHandler.java b/src/main/java/com/gg/server/global/utils/UserImageHandler.java index aa9312011..4ebc65848 100644 --- a/src/main/java/com/gg/server/global/utils/UserImageHandler.java +++ b/src/main/java/com/gg/server/global/utils/UserImageHandler.java @@ -5,7 +5,7 @@ import com.amazonaws.services.s3.model.DeleteObjectRequest; import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.PutObjectRequest; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; diff --git a/src/main/java/com/gg/server/global/utils/argumentresolver/LoginMemberArgumentResolver.java b/src/main/java/com/gg/server/global/utils/argumentresolver/LoginMemberArgumentResolver.java index b4f2e8051..df32529e4 100644 --- a/src/main/java/com/gg/server/global/utils/argumentresolver/LoginMemberArgumentResolver.java +++ b/src/main/java/com/gg/server/global/utils/argumentresolver/LoginMemberArgumentResolver.java @@ -1,7 +1,7 @@ package com.gg.server.global.utils.argumentresolver; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; import com.gg.server.global.utils.HeaderUtil; diff --git a/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java b/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java index 90e5cd866..16e328c9b 100644 --- a/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java +++ b/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java @@ -1,7 +1,7 @@ package com.gg.server.global.utils.aws; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.global.utils.UserImageHandler; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; diff --git a/src/test/java/com/gg/server/admin/feedback/controller/FeedbackAdminControllerTest.java b/src/test/java/com/gg/server/admin/feedback/controller/FeedbackAdminControllerTest.java index 571eb24ae..e056c7921 100644 --- a/src/test/java/com/gg/server/admin/feedback/controller/FeedbackAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/feedback/controller/FeedbackAdminControllerTest.java @@ -5,8 +5,8 @@ import com.gg.server.admin.feedback.dto.FeedbackListAdminResponseDto; import com.gg.server.domain.feedback.data.Feedback; import com.gg.server.domain.feedback.type.FeedbackType; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; import com.gg.server.utils.TestDataUtils; import lombok.RequiredArgsConstructor; diff --git a/src/test/java/com/gg/server/admin/game/controller/GameAdminControllerTest.java b/src/test/java/com/gg/server/admin/game/controller/GameAdminControllerTest.java index 8c1057d7f..9f600cb7a 100644 --- a/src/test/java/com/gg/server/admin/game/controller/GameAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/game/controller/GameAdminControllerTest.java @@ -3,22 +3,18 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.gg.server.admin.game.dto.GameLogListAdminResponseDto; import com.gg.server.admin.game.dto.RankGamePPPModifyReqDto; -import com.gg.server.domain.game.data.Game; import com.gg.server.domain.game.data.GameRepository; import com.gg.server.domain.game.dto.GameTeamUser; import com.gg.server.domain.game.dto.req.RankResultReqDto; import com.gg.server.domain.game.service.GameService; import com.gg.server.domain.game.type.Mode; -import com.gg.server.domain.match.dto.GameAddDto; import com.gg.server.domain.match.service.GameUpdateService; import com.gg.server.domain.rank.data.Rank; import com.gg.server.domain.rank.data.RankRepository; -import com.gg.server.domain.rank.redis.RankRedis; import com.gg.server.domain.rank.redis.RankRedisRepository; -import com.gg.server.domain.rank.redis.RedisKeyManager; import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.controller.dto.GameInfoDto; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; import com.gg.server.utils.TestDataUtils; @@ -35,10 +31,8 @@ import java.time.LocalDateTime; import java.util.List; -import java.util.stream.DoubleStream; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.InstanceOfAssertFactories.completableFuture; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; diff --git a/src/test/java/com/gg/server/admin/noti/controller/NotiAdminControllerTest.java b/src/test/java/com/gg/server/admin/noti/controller/NotiAdminControllerTest.java index d6c5b4e40..88a7807f5 100644 --- a/src/test/java/com/gg/server/admin/noti/controller/NotiAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/noti/controller/NotiAdminControllerTest.java @@ -8,11 +8,9 @@ import com.gg.server.admin.noti.service.NotiAdminService; import com.gg.server.domain.noti.data.Noti; import com.gg.server.domain.noti.data.NotiRepository; -import com.gg.server.domain.noti.dto.NotiListResponseDto; -import com.gg.server.domain.noti.dto.NotiResponseDto; import com.gg.server.domain.noti.type.NotiType; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; import com.gg.server.utils.TestDataUtils; import lombok.RequiredArgsConstructor; @@ -27,7 +25,6 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; import org.springframework.test.web.servlet.MockMvc; import javax.transaction.Transactional; @@ -36,7 +33,6 @@ import java.util.UUID; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import static org.junit.jupiter.api.Assertions.*; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; diff --git a/src/test/java/com/gg/server/admin/penalty/controller/PenaltyAdminControllerTest.java b/src/test/java/com/gg/server/admin/penalty/controller/PenaltyAdminControllerTest.java index 454ed782e..c0bfb8213 100644 --- a/src/test/java/com/gg/server/admin/penalty/controller/PenaltyAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/penalty/controller/PenaltyAdminControllerTest.java @@ -15,8 +15,8 @@ import com.gg.server.admin.penalty.dto.PenaltyRequestDto; import com.gg.server.admin.penalty.service.PenaltyAdminService; import com.gg.server.domain.penalty.type.PenaltyType; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.type.RacketType; import com.gg.server.domain.user.type.RoleType; import com.gg.server.domain.user.type.SnsType; diff --git a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java index cbf95c49f..31654f054 100644 --- a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java @@ -6,8 +6,8 @@ import com.gg.server.admin.user.dto.UserSearchAdminDto; import com.gg.server.admin.user.dto.UserSearchAdminResponseDto; import com.gg.server.admin.user.service.UserAdminService; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; import com.gg.server.utils.TestDataUtils; import lombok.RequiredArgsConstructor; diff --git a/src/test/java/com/gg/server/domain/match/service/MatchBothServiceTest.java b/src/test/java/com/gg/server/domain/match/service/MatchBothServiceTest.java index 5b3a1a842..6bc818980 100644 --- a/src/test/java/com/gg/server/domain/match/service/MatchBothServiceTest.java +++ b/src/test/java/com/gg/server/domain/match/service/MatchBothServiceTest.java @@ -1,7 +1,6 @@ package com.gg.server.domain.match.service; import com.gg.server.admin.penalty.data.PenaltyAdminRepository; -import com.gg.server.admin.penalty.data.PenaltyUserAdminRedisRepository; import com.gg.server.admin.penalty.type.PenaltyKey; import com.gg.server.domain.game.data.Game; import com.gg.server.domain.game.data.GameRepository; @@ -11,11 +10,10 @@ import com.gg.server.domain.match.type.Option; import com.gg.server.domain.noti.data.NotiRepository; import com.gg.server.domain.penalty.redis.PenaltyUserRedisRepository; -import com.gg.server.domain.penalty.redis.RedisPenaltyUser; import com.gg.server.domain.rank.redis.RankRedisRepository; import com.gg.server.domain.season.data.Season; import com.gg.server.domain.slotmanagement.SlotManagement; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.dto.UserDto; import java.time.LocalDateTime; import java.util.ArrayList; diff --git a/src/test/java/com/gg/server/domain/match/service/MatchServiceTest.java b/src/test/java/com/gg/server/domain/match/service/MatchServiceTest.java index 142a70e0c..9cdf756b7 100644 --- a/src/test/java/com/gg/server/domain/match/service/MatchServiceTest.java +++ b/src/test/java/com/gg/server/domain/match/service/MatchServiceTest.java @@ -26,7 +26,7 @@ import com.gg.server.domain.rank.redis.RedisKeyManager; import com.gg.server.domain.season.data.Season; import com.gg.server.domain.slotmanagement.SlotManagement; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.dto.UserDto; import java.time.LocalDateTime; import java.util.ArrayList; diff --git a/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java b/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java index cb9e40dd0..c7720eb3e 100644 --- a/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java +++ b/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java @@ -8,8 +8,8 @@ import com.gg.server.domain.season.data.SeasonRepository; import com.gg.server.domain.slotmanagement.SlotManagement; import com.gg.server.domain.slotmanagement.data.SlotManagementRepository; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.type.RacketType; import com.gg.server.domain.user.type.RoleType; import com.gg.server.domain.user.type.SnsType; diff --git a/src/test/java/com/gg/server/domain/noti/controller/NotiControllerTest.java b/src/test/java/com/gg/server/domain/noti/controller/NotiControllerTest.java index 4d5af57de..995c46d25 100644 --- a/src/test/java/com/gg/server/domain/noti/controller/NotiControllerTest.java +++ b/src/test/java/com/gg/server/domain/noti/controller/NotiControllerTest.java @@ -4,11 +4,10 @@ import com.gg.server.domain.noti.data.Noti; import com.gg.server.domain.noti.data.NotiRepository; import com.gg.server.domain.noti.dto.NotiListResponseDto; -import com.gg.server.domain.noti.dto.NotiResponseDto; import com.gg.server.domain.noti.service.NotiService; import com.gg.server.domain.noti.type.NotiType; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; import com.gg.server.utils.TestDataUtils; @@ -19,7 +18,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.ResponseEntity; import org.springframework.test.web.servlet.MockMvc; import javax.transaction.Transactional; @@ -27,7 +25,6 @@ import java.util.List; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import static org.junit.jupiter.api.Assertions.*; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; diff --git a/src/test/java/com/gg/server/domain/noti/service/NotiServiceTest.java b/src/test/java/com/gg/server/domain/noti/service/NotiServiceTest.java index 9be547533..dbed48d53 100644 --- a/src/test/java/com/gg/server/domain/noti/service/NotiServiceTest.java +++ b/src/test/java/com/gg/server/domain/noti/service/NotiServiceTest.java @@ -3,15 +3,14 @@ import com.gg.server.domain.noti.data.Noti; import com.gg.server.domain.noti.data.NotiRepository; import com.gg.server.domain.noti.type.NotiType; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; import com.gg.server.utils.TestDataUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.assertj.core.api.Assertions; -import org.checkerframework.checker.units.qual.A; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -23,8 +22,6 @@ import java.time.format.DateTimeFormatter; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; - @RequiredArgsConstructor @SpringBootTest @Slf4j diff --git a/src/test/java/com/gg/server/domain/rank/controller/RankControllerTest.java b/src/test/java/com/gg/server/domain/rank/controller/RankControllerTest.java index c9aaf755b..059b2158e 100644 --- a/src/test/java/com/gg/server/domain/rank/controller/RankControllerTest.java +++ b/src/test/java/com/gg/server/domain/rank/controller/RankControllerTest.java @@ -8,7 +8,7 @@ import com.gg.server.domain.rank.service.RedisUploadService; import com.gg.server.domain.season.data.Season; import com.gg.server.domain.season.data.SeasonRepository; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; import com.gg.server.utils.TestDataUtils; import org.apache.http.HttpHeaders; @@ -17,8 +17,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; diff --git a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java index eaea6012c..3f429d47d 100644 --- a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java +++ b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java @@ -13,8 +13,8 @@ import com.gg.server.domain.rank.redis.RedisKeyManager; import com.gg.server.domain.season.data.Season; import com.gg.server.domain.season.data.SeasonRepository; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.controller.dto.GameInfoDto; import com.gg.server.domain.user.dto.*; import com.gg.server.domain.user.type.RacketType; @@ -24,11 +24,9 @@ import org.junit.jupiter.api.AfterEach; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.http.MediaType; -import org.springframework.test.annotation.Rollback; import org.springframework.test.web.servlet.MockMvc; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; import com.gg.server.utils.TestDataUtils; -import lombok.RequiredArgsConstructor; import org.apache.http.HttpHeaders; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/gg/server/game/GameControllerTest.java b/src/test/java/com/gg/server/game/GameControllerTest.java index 37f5832b0..688813ead 100644 --- a/src/test/java/com/gg/server/game/GameControllerTest.java +++ b/src/test/java/com/gg/server/game/GameControllerTest.java @@ -24,7 +24,7 @@ import com.gg.server.domain.team.data.TeamRepository; import com.gg.server.domain.team.data.TeamUser; import com.gg.server.domain.team.data.TeamUserRepository; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.domain.user.type.RacketType; import com.gg.server.domain.user.type.RoleType; diff --git a/src/test/java/com/gg/server/game/service/GameFindServiceTest.java b/src/test/java/com/gg/server/game/service/GameFindServiceTest.java index 5b6c13b76..4d167053f 100644 --- a/src/test/java/com/gg/server/game/service/GameFindServiceTest.java +++ b/src/test/java/com/gg/server/game/service/GameFindServiceTest.java @@ -12,7 +12,7 @@ import com.gg.server.domain.rank.redis.RankRedisRepository; import com.gg.server.domain.rank.redis.RedisKeyManager; import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; import com.gg.server.utils.TestDataUtils; diff --git a/src/test/java/com/gg/server/game/service/GameServiceTest.java b/src/test/java/com/gg/server/game/service/GameServiceTest.java index 376a487d4..dbafd50d4 100644 --- a/src/test/java/com/gg/server/game/service/GameServiceTest.java +++ b/src/test/java/com/gg/server/game/service/GameServiceTest.java @@ -17,9 +17,8 @@ import com.gg.server.domain.team.data.TeamRepository; import com.gg.server.domain.team.data.TeamUser; import com.gg.server.domain.team.data.TeamUserRepository; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.dto.UserDto; -import com.gg.server.global.exception.custom.NotExistException; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; import com.gg.server.utils.TestDataUtils; import lombok.RequiredArgsConstructor; diff --git a/src/test/java/com/gg/server/game/service/GameStatusServiceTest.java b/src/test/java/com/gg/server/game/service/GameStatusServiceTest.java index 480c2c2e6..82e4208e2 100644 --- a/src/test/java/com/gg/server/game/service/GameStatusServiceTest.java +++ b/src/test/java/com/gg/server/game/service/GameStatusServiceTest.java @@ -12,7 +12,7 @@ import com.gg.server.domain.team.data.TeamRepository; import com.gg.server.domain.team.data.TeamUser; import com.gg.server.domain.team.data.TeamUserRepository; -import com.gg.server.domain.user.User; +import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.type.RacketType; import com.gg.server.domain.user.type.RoleType; import com.gg.server.domain.user.type.SnsType; diff --git a/src/test/java/com/gg/server/utils/TestDataUtils.java b/src/test/java/com/gg/server/utils/TestDataUtils.java index debc2cd41..9db387adb 100644 --- a/src/test/java/com/gg/server/utils/TestDataUtils.java +++ b/src/test/java/com/gg/server/utils/TestDataUtils.java @@ -18,8 +18,8 @@ import com.gg.server.domain.team.data.TeamRepository; import com.gg.server.domain.team.data.TeamUser; import com.gg.server.domain.team.data.TeamUserRepository; -import com.gg.server.domain.user.User; -import com.gg.server.domain.user.UserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.controller.dto.GameInfoDto; import com.gg.server.domain.user.type.RacketType; import com.gg.server.domain.user.type.RoleType; @@ -28,7 +28,6 @@ import com.gg.server.domain.game.type.Mode; import com.gg.server.domain.game.type.StatusType; import lombok.RequiredArgsConstructor; -import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Component; import java.time.LocalDateTime; From f0df306811fd15c9dc28b37d5e59d9fe79e6669e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Tue, 1 Aug 2023 17:08:07 +0900 Subject: [PATCH 002/273] =?UTF-8?q?[REFACTOR]=20GGBE-12=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/coin/data/CoinHistory.java | 2 +- .../com/gg/server/domain/coin/data/CoinPolicy.java | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gg/server/domain/coin/data/CoinHistory.java b/src/main/java/com/gg/server/domain/coin/data/CoinHistory.java index fe2e70d9a..bf77df74f 100644 --- a/src/main/java/com/gg/server/domain/coin/data/CoinHistory.java +++ b/src/main/java/com/gg/server/domain/coin/data/CoinHistory.java @@ -26,7 +26,7 @@ public class CoinHistory { private String history; @Column(name = "amount") - private Long amount; + private int amount; @CreatedDate @Column(name = "createdAt", updatable = false, nullable = false) diff --git a/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java b/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java index a5c977d53..63d3441c5 100644 --- a/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java +++ b/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java @@ -1,5 +1,6 @@ package com.gg.server.domain.coin.data; +import com.gg.server.domain.user.data.User; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -17,14 +18,15 @@ public class CoinPolicy { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column(name = "user_id", length = 30) - private String CreateUserId; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; @Column(name = "attendance") private Long attendance; - @Column(name = "nomal") - private Long nomal; + @Column(name = "normal") + private Long normal; @Column(name = "rankWin") private Long rankWin; From fd6422d8b4406a60a16c4c2a375eab85bc434e5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Tue, 1 Aug 2023 17:09:05 +0900 Subject: [PATCH 003/273] =?UTF-8?q?[FEAT]=20GGBE-12=20flyway=20=EB=B2=84?= =?UTF-8?q?=EC=A0=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db/migration/V2__migration_42gg_4th.sql | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 src/main/resources/db/migration/V2__migration_42gg_4th.sql diff --git a/src/main/resources/db/migration/V2__migration_42gg_4th.sql b/src/main/resources/db/migration/V2__migration_42gg_4th.sql new file mode 100644 index 000000000..2f01fdb53 --- /dev/null +++ b/src/main/resources/db/migration/V2__migration_42gg_4th.sql @@ -0,0 +1,102 @@ +create table coin_history +( + id bigint not null auto_increment, + amount integer, + created_at datetime(6) not null, + history varchar(30), + user_id bigint, + primary key (id) +); + +create table coin_policy +( + id bigint not null auto_increment, + user_id bigint, + attendance bigint, + created_at datetime(6) not null, + normal bigint, + rank_lose bigint, + rank_win bigint, + primary key (id) +); + +create table item +( + id bigint not null auto_increment, + content varchar(255), + created_at datetime(6) not null, + discount integer, + image_uri varchar(255), + is_visible bit not null, + name varchar(30), + price integer not null, + primary key (id) +); + +create table megaphone +( + id bigint not null auto_increment, + content varchar(30), + used_at date not null, + user_id bigint not null, + primary key (id) +); + +alter table ranks + add column tier_id bigint; + +create table receipt +( + id bigint not null auto_increment, + owner_intra_id varchar(255) not null, + created_at datetime(6) not null, + purchaser_intra_id varchar(255) not null, + status varchar(255) not null, + item_id bigint not null, + primary key (id) +); + +create table tier +( + id bigint not null auto_increment, + image_uri varchar(255), + name varchar(255), + primary key (id) +); + +alter table user + add column background varchar(255) default "basic"; + +alter table user + add column edge varchar(255) default "basic"; + +alter table user + add column gg_coin integer default 0; + +alter table user + add column text_color varchar(10); + +alter table coin_history + add constraint fk_coin_history_user_user_id + foreign key (user_id) + references user (id); + +alter table coin_policy + add constraint fk_coin_policy_user_user_id + foreign key (user_id) + references user (id); + +alter table megaphone + add constraint fk_megaphone_user_user_id + foreign key (user_id) + references user (id); + +alter table ranks + add constraint fk_ranks_tier_tier_id + foreign key (tier_id) + references tier (id); + +alter table receipt + add constraint fk_receipt_item_item_id + foreign key (item_id) + references item (id); \ No newline at end of file From 01b92739ca55ace7c25efa3edcb33d3942d0746f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Wed, 2 Aug 2023 14:28:22 +0900 Subject: [PATCH 004/273] =?UTF-8?q?[FEAT]=20GGBE-21=20=EC=BD=94=EC=9D=B8?= =?UTF-8?q?=20=EC=A0=95=EC=B1=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/coin/data/CoinPolicy.java | 8 ++++---- .../db/migration/V2__migration_42gg_4th.sql | 12 ++++++------ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java b/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java index 63d3441c5..f7dfcfe95 100644 --- a/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java +++ b/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java @@ -23,16 +23,16 @@ public class CoinPolicy { private User user; @Column(name = "attendance") - private Long attendance; + private int attendance; @Column(name = "normal") - private Long normal; + private int normal; @Column(name = "rankWin") - private Long rankWin; + private int rankWin; @Column(name = "rankLose") - private Long rankLose; + private int rankLose; @CreatedDate @Column(name = "createdAt", updatable = false, nullable = false) diff --git a/src/main/resources/db/migration/V2__migration_42gg_4th.sql b/src/main/resources/db/migration/V2__migration_42gg_4th.sql index 2f01fdb53..04c56121c 100644 --- a/src/main/resources/db/migration/V2__migration_42gg_4th.sql +++ b/src/main/resources/db/migration/V2__migration_42gg_4th.sql @@ -12,11 +12,11 @@ create table coin_policy ( id bigint not null auto_increment, user_id bigint, - attendance bigint, + attendance integer, created_at datetime(6) not null, - normal bigint, - rank_lose bigint, - rank_win bigint, + normal integer, + rank_lose integer, + rank_win integer, primary key (id) ); @@ -65,10 +65,10 @@ create table tier ); alter table user - add column background varchar(255) default "basic"; + add column background varchar(255) default "BASIC"; alter table user - add column edge varchar(255) default "basic"; + add column edge varchar(255) default "BASIC"; alter table user add column gg_coin integer default 0; From fff23124c49b3de60556f1eb59b393d51cea7816 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Wed, 2 Aug 2023 14:28:56 +0900 Subject: [PATCH 005/273] =?UTF-8?q?[FEAT]=20GGBE-21=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=20=EA=B8=B0=EB=B3=B8=EA=B0=92=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gg/server/domain/user/data/User.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/com/gg/server/domain/user/data/User.java b/src/main/java/com/gg/server/domain/user/data/User.java index 7151f051a..54d3d2493 100644 --- a/src/main/java/com/gg/server/domain/user/data/User.java +++ b/src/main/java/com/gg/server/domain/user/data/User.java @@ -71,6 +71,10 @@ public User(String intraId, String eMail, String imageUri, RacketType racketType this.totalExp = totalExp; this.snsNotiOpt = snsNotiOpt; this.kakaoId = kakaoId; + this.background = BackgroundType.BASIC; + this.textColor = "#000000"; + this.edge = EdgeType.BASIC; + this.ggCoin = 0; } public void modifyUserDetail(UserUpdateAdminRequestDto updateReq) { @@ -99,4 +103,9 @@ public void updateExp(int beforeExp) { public void updateKakaoId(Long kakaoId) { this.kakaoId = kakaoId; } + + public int addGgCoin(int plus) { + this.ggCoin += plus; + return this.ggCoin; + } } \ No newline at end of file From 826432ad228246c0481bf852e296ec80c44be265 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Wed, 2 Aug 2023 14:29:56 +0900 Subject: [PATCH 006/273] =?UTF-8?q?[FEAT]=20GGBE-21=20=EC=B6=9C=EC=84=9D?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20api=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/coin/data/CoinHistory.java | 7 ++ .../coin/data/CoinHistoryRepository.java | 13 +++ .../coin/data/CoinPolicyRepository.java | 8 ++ .../user/controller/UserController.java | 11 ++- .../user/dto/UserAttendanceResponseDto.java | 12 +++ .../UserAlreadyAttendanceException.java | 10 +++ .../domain/user/service/UserService.java | 81 +++++++++++-------- .../domain/user/type/BackgroundType.java | 2 +- .../gg/server/domain/user/type/EdgeType.java | 2 +- .../gg/server/global/exception/ErrorCode.java | 2 +- 10 files changed, 104 insertions(+), 44 deletions(-) create mode 100644 src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java create mode 100644 src/main/java/com/gg/server/domain/coin/data/CoinPolicyRepository.java create mode 100644 src/main/java/com/gg/server/domain/user/dto/UserAttendanceResponseDto.java create mode 100644 src/main/java/com/gg/server/domain/user/exception/UserAlreadyAttendanceException.java diff --git a/src/main/java/com/gg/server/domain/coin/data/CoinHistory.java b/src/main/java/com/gg/server/domain/coin/data/CoinHistory.java index bf77df74f..aeaeb406f 100644 --- a/src/main/java/com/gg/server/domain/coin/data/CoinHistory.java +++ b/src/main/java/com/gg/server/domain/coin/data/CoinHistory.java @@ -31,4 +31,11 @@ public class CoinHistory { @CreatedDate @Column(name = "createdAt", updatable = false, nullable = false) private LocalDateTime createdAt; + + public CoinHistory(User user, String history, int amount) { + this.user = user; + this.history = history; + this.amount = amount; + this.createdAt = LocalDateTime.now(); + } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java b/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java new file mode 100644 index 000000000..10c303365 --- /dev/null +++ b/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java @@ -0,0 +1,13 @@ +package com.gg.server.domain.coin.data; + +import com.gg.server.domain.user.data.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.time.LocalDateTime; + +public interface CoinHistoryRepository extends JpaRepository { + @Query("SELECT CASE WHEN COUNT(ch) > 0 THEN true ELSE false END FROM CoinHistory ch WHERE ch.user = :user AND ch.history = :history AND ch.createdAt >= :startOfDay AND ch.createdAt <= :endOfDay") + boolean existsCoinHistoryByUserAndHistoryAndCreatedAtToday(User user, String history, LocalDateTime startOfDay, LocalDateTime endOfDay); + +} diff --git a/src/main/java/com/gg/server/domain/coin/data/CoinPolicyRepository.java b/src/main/java/com/gg/server/domain/coin/data/CoinPolicyRepository.java new file mode 100644 index 000000000..cc248726d --- /dev/null +++ b/src/main/java/com/gg/server/domain/coin/data/CoinPolicyRepository.java @@ -0,0 +1,8 @@ +package com.gg.server.domain.coin.data; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CoinPolicyRepository extends JpaRepository { + CoinPolicy findTopByOrderByCreatedAtDesc(); + +} diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index 96f600d0a..5e178f4b3 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -3,21 +3,15 @@ import com.gg.server.domain.game.type.Mode; import com.gg.server.domain.user.dto.*; import com.gg.server.domain.user.exception.KakaoOauth2AlreadyExistException; -import com.gg.server.domain.user.exception.KakaoOauth2NotFoundException; import com.gg.server.domain.user.service.UserAuthenticationService; import com.gg.server.domain.user.service.UserService; import com.gg.server.domain.user.type.OauthType; import com.gg.server.domain.user.type.RoleType; import com.gg.server.global.security.config.properties.AppProperties; import com.gg.server.global.security.cookie.CookieUtil; -import com.gg.server.global.security.jwt.utils.AuthTokenProvider; import com.gg.server.global.security.jwt.utils.TokenHeaders; -import com.gg.server.global.utils.ApplicationYmlRead; -import com.gg.server.global.utils.HeaderUtil; import com.gg.server.global.utils.argumentresolver.Login; import io.swagger.v3.oas.annotations.Parameter; -import java.io.IOException; -import javax.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; @@ -120,4 +114,9 @@ public UserImageResponseDto getUserImage(@RequestParam(required = false) Long se return userService.getRankedUserImagesByExp(pageRequest); } } + + @PostMapping("/attendance") + public UserAttendanceResponseDto attendUser(@Parameter(hidden = true) @Login UserDto user) { + return userService.attendUser(user.getId()); + } } diff --git a/src/main/java/com/gg/server/domain/user/dto/UserAttendanceResponseDto.java b/src/main/java/com/gg/server/domain/user/dto/UserAttendanceResponseDto.java new file mode 100644 index 000000000..617752424 --- /dev/null +++ b/src/main/java/com/gg/server/domain/user/dto/UserAttendanceResponseDto.java @@ -0,0 +1,12 @@ +package com.gg.server.domain.user.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class UserAttendanceResponseDto { + private int beforeCoin; + private int afterCoin; + private int coinIncrement; +} diff --git a/src/main/java/com/gg/server/domain/user/exception/UserAlreadyAttendanceException.java b/src/main/java/com/gg/server/domain/user/exception/UserAlreadyAttendanceException.java new file mode 100644 index 000000000..60a59a849 --- /dev/null +++ b/src/main/java/com/gg/server/domain/user/exception/UserAlreadyAttendanceException.java @@ -0,0 +1,10 @@ +package com.gg.server.domain.user.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.InvalidParameterException; + +public class UserAlreadyAttendanceException extends InvalidParameterException { + public UserAlreadyAttendanceException() { + super("이미 출석한 유저입니다.", ErrorCode.USER_ALREADY_ATTENDANCE); + } +} diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index bf0553ca0..4251717f6 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -1,5 +1,8 @@ package com.gg.server.domain.user.service; +import com.gg.server.domain.coin.data.CoinHistory; +import com.gg.server.domain.coin.data.CoinHistoryRepository; +import com.gg.server.domain.coin.data.CoinPolicyRepository; import com.gg.server.domain.game.data.Game; import com.gg.server.domain.game.data.GameRepository; import com.gg.server.domain.game.type.StatusType; @@ -19,6 +22,7 @@ import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.*; +import com.gg.server.domain.user.exception.UserAlreadyAttendanceException; import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.type.RacketType; import com.gg.server.domain.user.type.SnsType; @@ -51,8 +55,8 @@ public class UserService { private final PChangeRepository pChangeRepository; private final RankFindService rankFindService; private final RedisMatchUserRepository redisMatchUserRepository; - - + private final CoinHistoryRepository coinHistoryRepository; + private final CoinPolicyRepository coinPolicyRepository; /** * @param intraId @@ -67,17 +71,15 @@ public List findByPartOfIntraId(String intraId) { } /** - * - * @param user - * - event: - * - null → 로그인 유저가 잡힌 매칭이 하나도 없을 때 - * - match → 매칭은 되었으나 게임시작 전일 때 or 매칭중인 경우 - * - game → 유저가 게임이 잡혔고 현재 게임중인 경우 - * - * - currentMatchMode - * - normal - * - rank - * - null -> 매칭이 안잡혔을 때 or 게임 전 + * @param user - event: + * - null → 로그인 유저가 잡힌 매칭이 하나도 없을 때 + * - match → 매칭은 되었으나 게임시작 전일 때 or 매칭중인 경우 + * - game → 유저가 게임이 잡혔고 현재 게임중인 경우 + *

+ * - currentMatchMode + * - normal + * - rank + * - null -> 매칭이 안잡혔을 때 or 게임 전 */ @Transactional() public UserLiveResponseDto getUserLiveDetail(UserDto user) { @@ -99,7 +101,7 @@ else if (game.getStatus() == StatusType.END) { if (game.getStatus() == StatusType.BEFORE) return new UserLiveResponseDto(notiCnt, "match", null, null); } - if (userMatchCnt > 0){ + if (userMatchCnt > 0) { return new UserLiveResponseDto(notiCnt, "match", null, null); } return new UserLiveResponseDto(notiCnt, null, null, null); @@ -135,25 +137,22 @@ private void updateRedisRankStatusMessage(String statusMessage, User user, Seaso } /** - * * @param intraId - * @param seasonId - * seasonId == 0 -> current season, else -> 해당 Id를 가진 season의 데이터 - * - * 기존 쿼리 - * @Query(nativeQuery = true, value = "SELECT * FROM pchange " + - * "where game_id in (SELECT id FROM game where season = :season and mode = :mode ) " + - * "AND user_id = :intraId ORDER BY id Desc limit :limit") - * -> Limit에는 10이 기본으로 들어감 - * + * @param seasonId seasonId == 0 -> current season, else -> 해당 Id를 가진 season의 데이터 + *

+ * 기존 쿼리 * @return 유저의 최근 10개의 랭크 경기 기록 + * @Query(nativeQuery = true, value = "SELECT * FROM pchange " + + * "where game_id in (SELECT id FROM game where season = :season and mode = :mode ) " + + * "AND user_id = :intraId ORDER BY id Desc limit :limit") + * -> Limit에는 10이 기본으로 들어감 */ @Transactional(readOnly = true) public UserHistoryResponseDto getUserHistory(String intraId, Long seasonId) { Season season; - if (seasonId == 0){ + if (seasonId == 0) { season = seasonFindService.findCurrentSeason(LocalDateTime.now()); - }else{ + } else { season = seasonFindService.findSeasonById(seasonId); } List pChanges = pChangeRepository.findPChangesHistory(intraId, season.getId()); @@ -163,18 +162,16 @@ public UserHistoryResponseDto getUserHistory(String intraId, Long seasonId) { } /** - * * @param targetUserIntraId - * @param seasonId - * seasonId == 0 -> current season, else -> 해당 Id를 가진 season의 데이터 + * @param seasonId seasonId == 0 -> current season, else -> 해당 Id를 가진 season의 데이터 * @return */ @Transactional(readOnly = true) public UserRankResponseDto getUserRankDetail(String targetUserIntraId, Long seasonId) { Season season; - if (seasonId == 0){ + if (seasonId == 0) { season = seasonFindService.findCurrentSeason(LocalDateTime.now()); - }else{ + } else { season = seasonFindService.findSeasonById(seasonId); } String ZSetKey = RedisKeyManager.getZSetKey(season.getId()); @@ -184,11 +181,11 @@ public UserRankResponseDto getUserRankDetail(String targetUserIntraId, Long seas Long userRanking = rankRedisRepository.getRankInZSet(ZSetKey, user.getId()); userRanking += 1; RankRedis userRank = rankRedisRepository.findRankByUserId(hashKey, user.getId()); - double winRate = (double)(userRank.getWins() * 10000 / (userRank.getWins() + userRank.getLosses())) / 100; + double winRate = (double) (userRank.getWins() * 10000 / (userRank.getWins() + userRank.getLosses())) / 100; return new UserRankResponseDto(userRanking.intValue(), userRank.getPpp(), userRank.getWins(), userRank.getLosses(), winRate); - } catch (RedisDataNotFoundException ex){ + } catch (RedisDataNotFoundException ex) { return new UserRankResponseDto(-1, season.getStartPpp(), 0, 0, 0); - } catch (ArithmeticException ex2){ + } catch (ArithmeticException ex2) { return new UserRankResponseDto(-1, season.getStartPpp(), 0, 0, 0); } } @@ -220,7 +217,7 @@ public UserImageResponseDto getRankedUserImagesByPPP(Long seasonId) { userImages.add(new UserImageDto(user.getIntraId(), user.getImageUri())); }); return new UserImageResponseDto(userImages); - } catch (RedisDataNotFoundException ex){ + } catch (RedisDataNotFoundException ex) { return new UserImageResponseDto(new ArrayList<>()); } } @@ -233,4 +230,18 @@ public UserImageResponseDto getRankedUserImagesByExp(PageRequest pageRequest) { } return new UserImageResponseDto(userImages); } + + public UserAttendanceResponseDto attendUser(Long userId) { + User user = userRepository.findById(userId).orElseThrow(() -> new UsernameNotFoundException("User" + userId)); + LocalDateTime startOfDay = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0); + LocalDateTime endOfDay = LocalDateTime.now().withHour(23).withMinute(59).withSecond(59); + if (coinHistoryRepository.existsCoinHistoryByUserAndHistoryAndCreatedAtToday(user, "ATTENDANCE", startOfDay, endOfDay)) + throw new UserAlreadyAttendanceException(); + int plus = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getAttendance(); + CoinHistory coinHistory = new CoinHistory(user, "ATTENDANCE", plus); + coinHistoryRepository.save(coinHistory); + int beforeCoin = user.getGgCoin(); + user.addGgCoin(plus); + return new UserAttendanceResponseDto(beforeCoin, user.getGgCoin(), plus); + } } diff --git a/src/main/java/com/gg/server/domain/user/type/BackgroundType.java b/src/main/java/com/gg/server/domain/user/type/BackgroundType.java index a1010daa3..c2fcc8aaa 100644 --- a/src/main/java/com/gg/server/domain/user/type/BackgroundType.java +++ b/src/main/java/com/gg/server/domain/user/type/BackgroundType.java @@ -4,7 +4,7 @@ @RequiredArgsConstructor public enum BackgroundType { - COLOR1(0, "color1"), + BASIC(0, "basic"), COLOR2(1, "color2"), COLOR3(2, "color3"); diff --git a/src/main/java/com/gg/server/domain/user/type/EdgeType.java b/src/main/java/com/gg/server/domain/user/type/EdgeType.java index 8bc218d84..0da8878d3 100644 --- a/src/main/java/com/gg/server/domain/user/type/EdgeType.java +++ b/src/main/java/com/gg/server/domain/user/type/EdgeType.java @@ -4,7 +4,7 @@ @RequiredArgsConstructor public enum EdgeType { - COLOR1(0, "color1"), + BASIC(0, "basic"), COLOR2(1, "color2"), COLOR3(2, "color3"); diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index 84b8b1b92..9da8be2b9 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -13,7 +13,7 @@ public enum ErrorCode { USER_IMAGE_WRONG_TYPE(415, "UR402", "USER IMAGE TYPE IS WRONG"), KAKAO_OAUTH2_NOT_FOUND(404, "UR101", "KAKAO OAUTH2 NOT FOUND"), KAKAO_OAUTH2_DUPLICATE(409, "UR300", "KAKAO OAUTH2 ALREADY EXIST"), - + USER_ALREADY_ATTENDANCE(409, "UR301", "USER ALREADY ATTENDANCE"), //announcement ANNOUNCE_NOT_FOUND(404, "AN100", "ANNOUNCEMENT NOT FOUND"), From 1b45a5a48820425ada2507981ba938fbfa6a1916 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Wed, 2 Aug 2023 14:35:45 +0900 Subject: [PATCH 007/273] [Feat] GGBE-23 post coinpolicy api --- .../controller/CoinPolicyAdminController.java | 34 +++++++++++++++++++ .../coin/data/CoinPolicyAdminRepository.java | 7 ++++ .../admin/coin/dto/CoinPolicyAdminAddDto.java | 24 +++++++++++++ .../coin/service/CoinPolicyAdminService.java | 27 +++++++++++++++ .../server/domain/coin/data/CoinPolicy.java | 32 ++++++++++++++--- .../db/migration/V2__migration_42gg_4th.sql | 12 +++---- 6 files changed, 126 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/gg/server/admin/coin/controller/CoinPolicyAdminController.java create mode 100644 src/main/java/com/gg/server/admin/coin/data/CoinPolicyAdminRepository.java create mode 100644 src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminAddDto.java create mode 100644 src/main/java/com/gg/server/admin/coin/service/CoinPolicyAdminService.java diff --git a/src/main/java/com/gg/server/admin/coin/controller/CoinPolicyAdminController.java b/src/main/java/com/gg/server/admin/coin/controller/CoinPolicyAdminController.java new file mode 100644 index 000000000..03f99c779 --- /dev/null +++ b/src/main/java/com/gg/server/admin/coin/controller/CoinPolicyAdminController.java @@ -0,0 +1,34 @@ +package com.gg.server.admin.coin.controller; + +import com.gg.server.admin.announcement.dto.AnnouncementAdminAddDto; +import com.gg.server.admin.coin.dto.CoinPolicyAdminAddDto; +import com.gg.server.admin.coin.service.CoinPolicyAdminService; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.global.utils.argumentresolver.Login; +import io.swagger.v3.oas.annotations.Parameter; +import lombok.AllArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +@RestController +@AllArgsConstructor +@RequestMapping("pingpong/admin") +@Validated +public class CoinPolicyAdminController { + private final CoinPolicyAdminService coinPolicyAdminService; + + @PostMapping("/coinpolicy") + public ResponseEntity addCoinPolicy(@Parameter(hidden = true) @Login UserDto userDto, @Valid @RequestBody CoinPolicyAdminAddDto addDto){ + + + return new ResponseEntity(HttpStatus.CREATED); + } + +} diff --git a/src/main/java/com/gg/server/admin/coin/data/CoinPolicyAdminRepository.java b/src/main/java/com/gg/server/admin/coin/data/CoinPolicyAdminRepository.java new file mode 100644 index 000000000..4117dccf9 --- /dev/null +++ b/src/main/java/com/gg/server/admin/coin/data/CoinPolicyAdminRepository.java @@ -0,0 +1,7 @@ +package com.gg.server.admin.coin.data; + +import com.gg.server.domain.coin.data.CoinPolicy; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CoinPolicyAdminRepository extends JpaRepository { +} diff --git a/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminAddDto.java b/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminAddDto.java new file mode 100644 index 000000000..4e4d461d0 --- /dev/null +++ b/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminAddDto.java @@ -0,0 +1,24 @@ +package com.gg.server.admin.coin.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class CoinPolicyAdminAddDto { + @NotNull(message = "plz. attendance") + private int attendance; + + @NotNull(message = "plz. normal") + private int normal; + + @NotNull(message = "plz. rankWin") + private int rankWin; + + @NotNull(message = "plz. rankLose") + private int rankLose; +} \ No newline at end of file diff --git a/src/main/java/com/gg/server/admin/coin/service/CoinPolicyAdminService.java b/src/main/java/com/gg/server/admin/coin/service/CoinPolicyAdminService.java new file mode 100644 index 000000000..f1d9a59ec --- /dev/null +++ b/src/main/java/com/gg/server/admin/coin/service/CoinPolicyAdminService.java @@ -0,0 +1,27 @@ +package com.gg.server.admin.coin.service; + +import com.gg.server.admin.coin.data.CoinPolicyAdminRepository; +import com.gg.server.admin.coin.dto.CoinPolicyAdminAddDto; +import com.gg.server.admin.user.data.UserAdminRepository; +import com.gg.server.domain.coin.data.CoinPolicy; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.domain.user.exception.UserNotFoundException; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@AllArgsConstructor +public class CoinPolicyAdminService { + private final CoinPolicyAdminRepository coinPolicyAdminRepository; + private final UserAdminRepository userAdminRepository; + @Transactional + public void addCoinPolicy(UserDto userDto, CoinPolicyAdminAddDto addDto){ + User user = userAdminRepository.findByIntraId(userDto.getIntraId()).orElseThrow(() -> new UserNotFoundException()); + + CoinPolicy coinPolicy = CoinPolicy.from(user, addDto); + + coinPolicyAdminRepository.save(coinPolicy); + } +} diff --git a/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java b/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java index 63d3441c5..50a9fa55b 100644 --- a/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java +++ b/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java @@ -1,7 +1,11 @@ package com.gg.server.domain.coin.data; +import com.gg.server.admin.announcement.dto.AnnouncementAdminAddDto; +import com.gg.server.admin.coin.dto.CoinPolicyAdminAddDto; +import com.gg.server.domain.announcement.data.Announcement; import com.gg.server.domain.user.data.User; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.springframework.data.annotation.CreatedDate; @@ -23,18 +27,38 @@ public class CoinPolicy { private User user; @Column(name = "attendance") - private Long attendance; + private int attendance; @Column(name = "normal") - private Long normal; + private int normal; @Column(name = "rankWin") - private Long rankWin; + private int rankWin; @Column(name = "rankLose") - private Long rankLose; + private int rankLose; @CreatedDate @Column(name = "createdAt", updatable = false, nullable = false) private LocalDateTime createdAt; + + + @Builder + public CoinPolicy(User user, int attendance, int normal, int rankWin, int rankLose) { + this.user = user; + this.attendance = attendance; + this.normal = normal; + this.rankWin = rankWin; + this.rankLose = rankLose; + } + + static public CoinPolicy from(User user, CoinPolicyAdminAddDto addDto) { + return CoinPolicy.builder() + .user(user) + .attendance(addDto.getAttendance()) + .normal(addDto.getNormal()) + .rankWin(addDto.getRankWin()) + .rankLose(addDto.getRankLose()) + .build(); + } } \ No newline at end of file diff --git a/src/main/resources/db/migration/V2__migration_42gg_4th.sql b/src/main/resources/db/migration/V2__migration_42gg_4th.sql index 2f01fdb53..04c56121c 100644 --- a/src/main/resources/db/migration/V2__migration_42gg_4th.sql +++ b/src/main/resources/db/migration/V2__migration_42gg_4th.sql @@ -12,11 +12,11 @@ create table coin_policy ( id bigint not null auto_increment, user_id bigint, - attendance bigint, + attendance integer, created_at datetime(6) not null, - normal bigint, - rank_lose bigint, - rank_win bigint, + normal integer, + rank_lose integer, + rank_win integer, primary key (id) ); @@ -65,10 +65,10 @@ create table tier ); alter table user - add column background varchar(255) default "basic"; + add column background varchar(255) default "BASIC"; alter table user - add column edge varchar(255) default "basic"; + add column edge varchar(255) default "BASIC"; alter table user add column gg_coin integer default 0; From 87d16c6db0a471c6e622a272654a3e3d32fa194a Mon Sep 17 00:00:00 2001 From: sion99 Date: Wed, 2 Aug 2023 15:00:28 +0900 Subject: [PATCH 008/273] =?UTF-8?q?[FEAT]=20GGBE-35=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=EB=B3=80=EA=B2=BD=EB=82=B4=EC=97=AD=20=EC=A0=84?= =?UTF-8?q?=EC=B2=B4=20=EC=A1=B0=ED=9A=8C=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/controller/ItemAdminController.java | 27 ++++++++++++ .../admin/item/data/ItemAdminRepository.java | 10 +++++ .../item/dto/ItemHistoryResponseDto.java | 44 +++++++++++++++++++ .../admin/item/dto/ItemListResponseDto.java | 15 +++++++ .../admin/item/service/ItemAdminService.java | 23 ++++++++++ .../domain/item/data/ItemRepository.java | 7 +++ .../com/gg/server/domain/user/data/User.java | 4 ++ .../domain/user/type/BackgroundType.java | 2 +- .../gg/server/domain/user/type/EdgeType.java | 2 +- 9 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java create mode 100644 src/main/java/com/gg/server/admin/item/data/ItemAdminRepository.java create mode 100644 src/main/java/com/gg/server/admin/item/dto/ItemHistoryResponseDto.java create mode 100644 src/main/java/com/gg/server/admin/item/dto/ItemListResponseDto.java create mode 100644 src/main/java/com/gg/server/admin/item/service/ItemAdminService.java create mode 100644 src/main/java/com/gg/server/domain/item/data/ItemRepository.java diff --git a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java new file mode 100644 index 000000000..e8a7eb7eb --- /dev/null +++ b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java @@ -0,0 +1,27 @@ +package com.gg.server.admin.item.controller; + +import com.gg.server.admin.item.dto.ItemHistoryResponseDto; +import com.gg.server.admin.item.dto.ItemListResponseDto; +import com.gg.server.admin.item.service.ItemAdminService; +import com.gg.server.global.dto.PageRequestDto; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/pingpong/admin/items") +public class ItemAdminController { + private final ItemAdminService itemAdminService; + + @GetMapping("/history") + public ItemListResponseDto getItemHistory(@ModelAttribute @Valid PageRequestDto pageRequestDto) { + Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, pageRequestDto.getSize(), + Sort.by("createdAt").descending()); + return itemAdminService.getAllItemHistory(pageable); + } +} diff --git a/src/main/java/com/gg/server/admin/item/data/ItemAdminRepository.java b/src/main/java/com/gg/server/admin/item/data/ItemAdminRepository.java new file mode 100644 index 000000000..7525bc053 --- /dev/null +++ b/src/main/java/com/gg/server/admin/item/data/ItemAdminRepository.java @@ -0,0 +1,10 @@ +package com.gg.server.admin.item.data; + +import com.gg.server.domain.item.data.Item; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ItemAdminRepository extends JpaRepository { + Page findAll(Pageable pageable); +} diff --git a/src/main/java/com/gg/server/admin/item/dto/ItemHistoryResponseDto.java b/src/main/java/com/gg/server/admin/item/dto/ItemHistoryResponseDto.java new file mode 100644 index 000000000..8f3afb7d0 --- /dev/null +++ b/src/main/java/com/gg/server/admin/item/dto/ItemHistoryResponseDto.java @@ -0,0 +1,44 @@ +package com.gg.server.admin.item.dto; + +import com.gg.server.domain.item.data.Item; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ItemHistoryResponseDto { + private Long itemId; + private String name; + private String content; + private String imageUri; + private Integer price; + private Integer discount; + private LocalDateTime createdAt; + + public ItemHistoryResponseDto(Item item) { + this.itemId = item.getId(); + this.name = item.getName(); + this.content = item.getContent(); + this.imageUri = item.getImageUri(); + this.price = item.getPrice(); + this.discount = item.getDiscount(); + this.createdAt = item.getCreatedAt(); + } + + @Override + public String toString() { + return "ItemHistoryResponseDto{" + + "itemId=" + itemId + + ", name='" + name + '\'' + + ", content='" + content + '\'' + + ", imageUri='" + imageUri + '\'' + + ", price=" + price + + ", discount=" + discount + + ", createdAt=" + createdAt + + '}'; + } +} diff --git a/src/main/java/com/gg/server/admin/item/dto/ItemListResponseDto.java b/src/main/java/com/gg/server/admin/item/dto/ItemListResponseDto.java new file mode 100644 index 000000000..17c77182d --- /dev/null +++ b/src/main/java/com/gg/server/admin/item/dto/ItemListResponseDto.java @@ -0,0 +1,15 @@ +package com.gg.server.admin.item.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ItemListResponseDto { + List historyList; + Integer totalPage; +} diff --git a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java new file mode 100644 index 000000000..381f4fa57 --- /dev/null +++ b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java @@ -0,0 +1,23 @@ +package com.gg.server.admin.item.service; + +import com.gg.server.admin.item.data.ItemAdminRepository; +import com.gg.server.admin.item.dto.ItemHistoryResponseDto; +import com.gg.server.admin.item.dto.ItemListResponseDto; +import com.gg.server.domain.item.data.Item; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + + +@Service +@RequiredArgsConstructor +public class ItemAdminService { + private final ItemAdminRepository itemRepository; + @Transactional(readOnly = true) + public ItemListResponseDto getAllItemHistory(Pageable pageable) { + Page responseDtos = itemRepository.findAll(pageable).map(ItemHistoryResponseDto::new); + return new ItemListResponseDto(responseDtos.getContent(), responseDtos.getTotalPages()); + } +} diff --git a/src/main/java/com/gg/server/domain/item/data/ItemRepository.java b/src/main/java/com/gg/server/domain/item/data/ItemRepository.java new file mode 100644 index 000000000..253280780 --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/data/ItemRepository.java @@ -0,0 +1,7 @@ +package com.gg.server.domain.item.data; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ItemRepository extends JpaRepository { + +} diff --git a/src/main/java/com/gg/server/domain/user/data/User.java b/src/main/java/com/gg/server/domain/user/data/User.java index 7151f051a..52c85123e 100644 --- a/src/main/java/com/gg/server/domain/user/data/User.java +++ b/src/main/java/com/gg/server/domain/user/data/User.java @@ -71,6 +71,10 @@ public User(String intraId, String eMail, String imageUri, RacketType racketType this.totalExp = totalExp; this.snsNotiOpt = snsNotiOpt; this.kakaoId = kakaoId; + this.background = BackgroundType.BASIC; + this.textColor = "#000000"; + this.edge = EdgeType.BASIC; + this.ggCoin = 0; } public void modifyUserDetail(UserUpdateAdminRequestDto updateReq) { diff --git a/src/main/java/com/gg/server/domain/user/type/BackgroundType.java b/src/main/java/com/gg/server/domain/user/type/BackgroundType.java index a1010daa3..c2fcc8aaa 100644 --- a/src/main/java/com/gg/server/domain/user/type/BackgroundType.java +++ b/src/main/java/com/gg/server/domain/user/type/BackgroundType.java @@ -4,7 +4,7 @@ @RequiredArgsConstructor public enum BackgroundType { - COLOR1(0, "color1"), + BASIC(0, "basic"), COLOR2(1, "color2"), COLOR3(2, "color3"); diff --git a/src/main/java/com/gg/server/domain/user/type/EdgeType.java b/src/main/java/com/gg/server/domain/user/type/EdgeType.java index 8bc218d84..0da8878d3 100644 --- a/src/main/java/com/gg/server/domain/user/type/EdgeType.java +++ b/src/main/java/com/gg/server/domain/user/type/EdgeType.java @@ -4,7 +4,7 @@ @RequiredArgsConstructor public enum EdgeType { - COLOR1(0, "color1"), + BASIC(0, "basic"), COLOR2(1, "color2"), COLOR3(2, "color3"); From 6fc0a2f4e1d057a9dc262fb564d4127e77dea767 Mon Sep 17 00:00:00 2001 From: sion99 Date: Wed, 2 Aug 2023 16:12:34 +0900 Subject: [PATCH 009/273] =?UTF-8?q?[FEAT]=20GGBE-35=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=EB=B3=80=EA=B2=BD=EB=82=B4=EC=97=AD=20=EC=A0=84?= =?UTF-8?q?=EC=B2=B4=20=EC=A1=B0=ED=9A=8C=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ItemAdminControllerTest.java | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java diff --git a/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java b/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java new file mode 100644 index 000000000..972c2e159 --- /dev/null +++ b/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java @@ -0,0 +1,72 @@ +package com.gg.server.admin.item.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.admin.item.data.ItemAdminRepository; +import com.gg.server.admin.item.dto.ItemListResponseDto; +import com.gg.server.admin.item.service.ItemAdminService; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import org.apache.http.HttpHeaders; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.test.web.servlet.MockMvc; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; + + +import javax.transaction.Transactional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +class ItemAdminControllerTest { + @Autowired + ItemAdminService itemAdminService; + @Autowired + UserRepository userRepository; + @Autowired + TestDataUtils testDataUtils; + @Autowired + ObjectMapper objectMapper; + @Autowired + AuthTokenProvider tokenProvider; + @Autowired + ItemAdminRepository itemAdminRepository; + @Autowired + MockMvc mockMvc; + + @Test + @DisplayName("GET /pingpong/admin/items/history") + public void getAllItemHistoryTest() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Integer page = 1; + Integer size = 20; + String url = "/pingpong/admin/items/history?page=" + page + "&size=" + size; + Pageable pageable = PageRequest.of(page - 1, size, Sort.by("createdAt").descending()); + + String contentAsString = mockMvc.perform(get(url) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + + System.out.println(contentAsString); + ItemListResponseDto expect = itemAdminService.getAllItemHistory(pageable); + ItemListResponseDto result = objectMapper.readValue(contentAsString, ItemListResponseDto.class); + System.out.println(expect.getHistoryList()); + System.out.println(result.getHistoryList()); + assertThat(result.getHistoryList().get(0).getItemId()); + assertThat(result.getHistoryList().get(0).getName()); + assertThat(result.getHistoryList().get(0).getContent()); + assertThat(result.getHistoryList().get(0).getPrice()); + } +} \ No newline at end of file From 1b4830fb0beea372a6133232d4b128eb82001a18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Wed, 2 Aug 2023 16:15:38 +0900 Subject: [PATCH 010/273] =?UTF-8?q?[TEST]=20GGBE-21=20=EC=B6=9C=EC=84=9D?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20api=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coin/data/CoinHistoryRepository.java | 4 +- .../user/dto/UserAttendanceResponseDto.java | 2 + .../user/controller/UserControllerTest.java | 50 +++++++++++++------ 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java b/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java index 10c303365..47b78280a 100644 --- a/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java +++ b/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java @@ -3,11 +3,13 @@ import com.gg.server.domain.user.data.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.time.LocalDateTime; public interface CoinHistoryRepository extends JpaRepository { @Query("SELECT CASE WHEN COUNT(ch) > 0 THEN true ELSE false END FROM CoinHistory ch WHERE ch.user = :user AND ch.history = :history AND ch.createdAt >= :startOfDay AND ch.createdAt <= :endOfDay") - boolean existsCoinHistoryByUserAndHistoryAndCreatedAtToday(User user, String history, LocalDateTime startOfDay, LocalDateTime endOfDay); + boolean existsCoinHistoryByUserAndHistoryAndCreatedAtToday(@Param("user") User user, @Param("history") String history, @Param("startOfDay") LocalDateTime startOfDay, @Param("endOfDay") LocalDateTime endOfDay); + CoinHistory findFirstByOrderByIdDesc(); } diff --git a/src/main/java/com/gg/server/domain/user/dto/UserAttendanceResponseDto.java b/src/main/java/com/gg/server/domain/user/dto/UserAttendanceResponseDto.java index 617752424..c9f7b2ea6 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserAttendanceResponseDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserAttendanceResponseDto.java @@ -2,9 +2,11 @@ import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; @Getter @AllArgsConstructor +@NoArgsConstructor public class UserAttendanceResponseDto { private int beforeCoin; private int afterCoin; diff --git a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java index 3f429d47d..a3255aaad 100644 --- a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java +++ b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java @@ -1,6 +1,8 @@ package com.gg.server.domain.user.controller; import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.domain.coin.data.CoinHistoryRepository; +import com.gg.server.domain.coin.data.CoinPolicyRepository; import com.gg.server.domain.game.data.Game; import com.gg.server.domain.game.data.GameRepository; import com.gg.server.domain.game.dto.req.RankResultReqDto; @@ -77,6 +79,13 @@ class UserControllerTest { @Autowired GameService gameService; + @Autowired + CoinPolicyRepository coinPolicyRepository; + + @Autowired + CoinHistoryRepository coinHistoryRepository; + + @AfterEach public void flushRedis() { redisRepository.deleteAll(); @@ -131,10 +140,10 @@ public void userLiveTest() throws Exception { assertThat(userLiveResponseDto3.getCurrentMatchMode()).isEqualTo(null); assertThat(userLiveResponseDto3.getGameId()).isEqualTo(null); } - + @Test @DisplayName("/") - public void userNormalDetail () throws Exception { + public void userNormalDetail() throws Exception { //given String url = "/pingpong/users"; String intraId = "intra"; @@ -158,8 +167,7 @@ public void userNormalDetail () throws Exception { @Test @DisplayName("searches?intraId=${IntraId}") - public void searchUser() throws Exception - { + public void searchUser() throws Exception { //given String intraId[] = {"intraId", "2intra2", "2intra", "aaaa", "bbbb"}; String email = "email"; @@ -185,8 +193,7 @@ public void searchUser() throws Exception @Test @DisplayName("[GET] {targetId}") - public void getUserDetail () throws Exception - { + public void getUserDetail() throws Exception { //given Season season = testDataUtils.createSeason(); String intraId = "intraId"; @@ -215,8 +222,7 @@ public void getUserDetail () throws Exception @Test @DisplayName("/{intraId}/rank?season={seasonId}") - public void userRankDetail () throws Exception - { + public void userRankDetail() throws Exception { //given Season season = testDataUtils.createSeason(); User newUser = testDataUtils.createNewUser(); @@ -239,8 +245,7 @@ public void userRankDetail () throws Exception @Test @DisplayName("/{intraId}/historics?season={seasonId}") - public void getUserHistory () throws Exception - { + public void getUserHistory() throws Exception { //given Season season = testDataUtils.createSeason(); User newUser = testDataUtils.createNewUser(); @@ -276,8 +281,7 @@ public void getUserHistory () throws Exception @Test @DisplayName("[put] {intraId}") - public void updateUser() throws Exception - { + public void updateUser() throws Exception { //given Season season = testDataUtils.createSeason(); String intraId = "intraId"; @@ -296,8 +300,8 @@ public void updateUser() throws Exception //when mockMvc.perform(put(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new UserModifyRequestDto(newRacketType, newStatusMessage, newSnsType)))) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(new UserModifyRequestDto(newRacketType, newStatusMessage, newSnsType)))) .andExpect(status().isOk()); //then String hashKey = RedisKeyManager.getHashKey(season.getId()); @@ -315,4 +319,22 @@ public void updateUser() throws Exception Assertions.fail("유저 업데이트 실패"); }); } + + @Test + @DisplayName("[post] /attendance") + public void attendUserTest() throws Exception { + //given + String accessToken = testDataUtils.getLoginAccessToken(); + String url = "/pingpong/users/attendance"; + + //when + String contentAsString = mockMvc.perform(post(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + UserAttendanceResponseDto result = objectMapper.readValue(contentAsString, UserAttendanceResponseDto.class); + + //then + System.out.println(result.getAfterCoin()); + Assertions.assertThat(result.getAfterCoin() - result.getBeforeCoin()).isEqualTo(result.getCoinIncrement()); + } } \ No newline at end of file From 444cbcf49bcb0dd4bf246ac0610954c70a5dc1b5 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Wed, 2 Aug 2023 16:16:41 +0900 Subject: [PATCH 011/273] [test] GGBE-23 post coinpolicy api --- .../controller/CoinPolicyAdminController.java | 2 +- .../coin/data/CoinPolicyAdminRepository.java | 4 + .../admin/coin/dto/CoinPolicyAdminAddDto.java | 6 ++ .../coin/service/CoinPolicyAdminService.java | 1 - .../server/domain/coin/data/CoinPolicy.java | 4 +- .../CoinPolicyNotFoundException.java | 10 +++ .../gg/server/global/exception/ErrorCode.java | 3 + .../CoinPolicyAdminControllerFailTest.java | 63 ++++++++++++++++ .../CoinPolicyAdminControllerTest.java | 74 +++++++++++++++++++ 9 files changed, 162 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/gg/server/domain/coin/exception/CoinPolicyNotFoundException.java create mode 100644 src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerFailTest.java create mode 100644 src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerTest.java diff --git a/src/main/java/com/gg/server/admin/coin/controller/CoinPolicyAdminController.java b/src/main/java/com/gg/server/admin/coin/controller/CoinPolicyAdminController.java index 03f99c779..48b771e61 100644 --- a/src/main/java/com/gg/server/admin/coin/controller/CoinPolicyAdminController.java +++ b/src/main/java/com/gg/server/admin/coin/controller/CoinPolicyAdminController.java @@ -27,7 +27,7 @@ public class CoinPolicyAdminController { @PostMapping("/coinpolicy") public ResponseEntity addCoinPolicy(@Parameter(hidden = true) @Login UserDto userDto, @Valid @RequestBody CoinPolicyAdminAddDto addDto){ - + coinPolicyAdminService.addCoinPolicy(userDto, addDto); return new ResponseEntity(HttpStatus.CREATED); } diff --git a/src/main/java/com/gg/server/admin/coin/data/CoinPolicyAdminRepository.java b/src/main/java/com/gg/server/admin/coin/data/CoinPolicyAdminRepository.java index 4117dccf9..d1b1c45bb 100644 --- a/src/main/java/com/gg/server/admin/coin/data/CoinPolicyAdminRepository.java +++ b/src/main/java/com/gg/server/admin/coin/data/CoinPolicyAdminRepository.java @@ -1,7 +1,11 @@ package com.gg.server.admin.coin.data; +import com.gg.server.domain.announcement.data.Announcement; import com.gg.server.domain.coin.data.CoinPolicy; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + public interface CoinPolicyAdminRepository extends JpaRepository { + Optional findFirstByOrderByIdDesc(); } diff --git a/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminAddDto.java b/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminAddDto.java index 4e4d461d0..04143977d 100644 --- a/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminAddDto.java +++ b/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminAddDto.java @@ -4,21 +4,27 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import javax.validation.constraints.PositiveOrZero; @Getter @NoArgsConstructor @AllArgsConstructor public class CoinPolicyAdminAddDto { @NotNull(message = "plz. attendance") + @PositiveOrZero(message = "plz. attendance PositiveOrZero") private int attendance; @NotNull(message = "plz. normal") + @PositiveOrZero(message = "plz. normal PositiveOrZero") private int normal; @NotNull(message = "plz. rankWin") + @PositiveOrZero(message = "plz. rankWin PositiveOrZero") private int rankWin; @NotNull(message = "plz. rankLose") + @PositiveOrZero(message = "plz. rankLose PositiveOrZero") private int rankLose; } \ No newline at end of file diff --git a/src/main/java/com/gg/server/admin/coin/service/CoinPolicyAdminService.java b/src/main/java/com/gg/server/admin/coin/service/CoinPolicyAdminService.java index f1d9a59ec..6a2ffad75 100644 --- a/src/main/java/com/gg/server/admin/coin/service/CoinPolicyAdminService.java +++ b/src/main/java/com/gg/server/admin/coin/service/CoinPolicyAdminService.java @@ -21,7 +21,6 @@ public void addCoinPolicy(UserDto userDto, CoinPolicyAdminAddDto addDto){ User user = userAdminRepository.findByIntraId(userDto.getIntraId()).orElseThrow(() -> new UserNotFoundException()); CoinPolicy coinPolicy = CoinPolicy.from(user, addDto); - coinPolicyAdminRepository.save(coinPolicy); } } diff --git a/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java b/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java index 50a9fa55b..367c08f23 100644 --- a/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java +++ b/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java @@ -1,8 +1,6 @@ package com.gg.server.domain.coin.data; -import com.gg.server.admin.announcement.dto.AnnouncementAdminAddDto; import com.gg.server.admin.coin.dto.CoinPolicyAdminAddDto; -import com.gg.server.domain.announcement.data.Announcement; import com.gg.server.domain.user.data.User; import lombok.AllArgsConstructor; import lombok.Builder; @@ -42,7 +40,6 @@ public class CoinPolicy { @Column(name = "createdAt", updatable = false, nullable = false) private LocalDateTime createdAt; - @Builder public CoinPolicy(User user, int attendance, int normal, int rankWin, int rankLose) { this.user = user; @@ -50,6 +47,7 @@ public CoinPolicy(User user, int attendance, int normal, int rankWin, int rankLo this.normal = normal; this.rankWin = rankWin; this.rankLose = rankLose; + this.createdAt = LocalDateTime.now(); } static public CoinPolicy from(User user, CoinPolicyAdminAddDto addDto) { diff --git a/src/main/java/com/gg/server/domain/coin/exception/CoinPolicyNotFoundException.java b/src/main/java/com/gg/server/domain/coin/exception/CoinPolicyNotFoundException.java new file mode 100644 index 000000000..5e857eeab --- /dev/null +++ b/src/main/java/com/gg/server/domain/coin/exception/CoinPolicyNotFoundException.java @@ -0,0 +1,10 @@ +package com.gg.server.domain.coin.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.CustomRuntimeException; + +public class CoinPolicyNotFoundException extends CustomRuntimeException { + public CoinPolicyNotFoundException() { + super(ErrorCode.CoinPolicy_NOT_FOUND.getMessage(), ErrorCode.CoinPolicy_NOT_FOUND); + } +} diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index 84b8b1b92..ca9b74d08 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -19,6 +19,9 @@ public enum ErrorCode { ANNOUNCE_NOT_FOUND(404, "AN100", "ANNOUNCEMENT NOT FOUND"), ANNOUNCE_DUPLICATE(409, "AN300", "ANNOUNCEMENT DUPLICATION"), + //coinPolicy + CoinPolicy_NOT_FOUND(404, "CP100", "COINPOLICY NOT FOUND"), + //season SEASON_NOT_FOUND(404, "SE100", "SEASON NOT FOUND"), SEASON_FORBIDDEN(400, "SE500", "SEASON FORBIDDEN ERROR"), diff --git a/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerFailTest.java b/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerFailTest.java new file mode 100644 index 000000000..85770f900 --- /dev/null +++ b/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerFailTest.java @@ -0,0 +1,63 @@ +package com.gg.server.admin.coin.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.admin.coin.data.CoinPolicyAdminRepository; +import com.gg.server.admin.coin.dto.CoinPolicyAdminAddDto; +import com.gg.server.domain.coin.data.CoinPolicy; +import com.gg.server.domain.coin.exception.CoinPolicyNotFoundException; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import lombok.RequiredArgsConstructor; +import org.apache.http.HttpHeaders; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RequiredArgsConstructor +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +public class CoinPolicyAdminControllerFailTest { + @Autowired + TestDataUtils testDataUtils; + + @Autowired + private MockMvc mockMvc; + + @Autowired + ObjectMapper objectMapper; + + @Autowired + AuthTokenProvider tokenProvider; + + @Autowired + CoinPolicyAdminRepository coinPolicyAdminRepository; + + @Test + @DisplayName("[Post FAIL]/pingpong/admin/coinpolicy") + void addAnnouncement() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + + CoinPolicyAdminAddDto addDto = new CoinPolicyAdminAddDto(1,2,5,-1); + + String content = objectMapper.writeValueAsString(addDto); + String url = "/pingpong/admin/coinpolicy"; + + String contentAsString = mockMvc.perform(post(url) + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isBadRequest()) + .andReturn().getResponse().getContentAsString(); + } +} diff --git a/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerTest.java b/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerTest.java new file mode 100644 index 000000000..677d794bf --- /dev/null +++ b/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerTest.java @@ -0,0 +1,74 @@ +package com.gg.server.admin.coin.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.admin.announcement.dto.AnnouncementAdminAddDto; +import com.gg.server.admin.coin.data.CoinPolicyAdminRepository; +import com.gg.server.admin.coin.dto.CoinPolicyAdminAddDto; +import com.gg.server.domain.announcement.data.Announcement; +import com.gg.server.domain.announcement.exception.AnnounceNotFoundException; +import com.gg.server.domain.coin.data.CoinPolicy; +import com.gg.server.domain.coin.exception.CoinPolicyNotFoundException; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import lombok.RequiredArgsConstructor; +import org.apache.http.HttpHeaders; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RequiredArgsConstructor +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +class CoinPolicyAdminControllerTest { + @Autowired + TestDataUtils testDataUtils; + + @Autowired + private MockMvc mockMvc; + + @Autowired + ObjectMapper objectMapper; + + @Autowired + AuthTokenProvider tokenProvider; + + @Autowired + CoinPolicyAdminRepository coinPolicyAdminRepository; + + @Test + @DisplayName("[Post]/pingpong/admin/coinpolicy") + void addAnnouncement() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + + CoinPolicyAdminAddDto addDto = new CoinPolicyAdminAddDto(1,2,5,0); + + String content = objectMapper.writeValueAsString(addDto); + String url = "/pingpong/admin/coinpolicy"; + + String contentAsString = mockMvc.perform(post(url) + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isCreated()) + .andReturn().getResponse().getContentAsString(); + + CoinPolicy result = coinPolicyAdminRepository.findFirstByOrderByIdDesc().orElseThrow(()-> new CoinPolicyNotFoundException()); + + assertThat(result.getAttendance()).isEqualTo(addDto.getAttendance()); + assertThat(result.getNormal()).isEqualTo(addDto.getNormal()); + assertThat(result.getRankWin()).isEqualTo(addDto.getRankWin()); + assertThat(result.getRankLose()).isEqualTo(addDto.getRankLose()); + } +} \ No newline at end of file From eb43e50f33df5242acfcf5db57894b944e9035f2 Mon Sep 17 00:00:00 2001 From: sion99 Date: Wed, 2 Aug 2023 16:17:11 +0900 Subject: [PATCH 012/273] =?UTF-8?q?[TEST]=20GGBE-35=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=EB=B3=80=EA=B2=BD=EB=82=B4=EC=97=AD=20=EC=A0=84?= =?UTF-8?q?=EC=B2=B4=20=EC=A1=B0=ED=9A=8C=20API=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/admin/item/controller/ItemAdminControllerTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java b/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java index 972c2e159..f1ba2bec4 100644 --- a/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java @@ -4,7 +4,6 @@ import com.gg.server.admin.item.data.ItemAdminRepository; import com.gg.server.admin.item.dto.ItemListResponseDto; import com.gg.server.admin.item.service.ItemAdminService; -import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; import com.gg.server.utils.TestDataUtils; From 38b7911de8385fd59d9e4e4c5706cd270004bd55 Mon Sep 17 00:00:00 2001 From: sion99 Date: Wed, 2 Aug 2023 16:18:58 +0900 Subject: [PATCH 013/273] =?UTF-8?q?[FEAT]=20GGBE-35=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=EB=B3=80=EA=B2=BD=EB=82=B4=EC=97=AD=20=EC=A0=84?= =?UTF-8?q?=EC=B2=B4=20=EC=A1=B0=ED=9A=8C=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/admin/item/controller/ItemAdminController.java | 1 - .../java/com/gg/server/admin/item/service/ItemAdminService.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java index e8a7eb7eb..203a31ccb 100644 --- a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java +++ b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java @@ -1,6 +1,5 @@ package com.gg.server.admin.item.controller; -import com.gg.server.admin.item.dto.ItemHistoryResponseDto; import com.gg.server.admin.item.dto.ItemListResponseDto; import com.gg.server.admin.item.service.ItemAdminService; import com.gg.server.global.dto.PageRequestDto; diff --git a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java index 381f4fa57..5fd4720b4 100644 --- a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java +++ b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java @@ -3,7 +3,6 @@ import com.gg.server.admin.item.data.ItemAdminRepository; import com.gg.server.admin.item.dto.ItemHistoryResponseDto; import com.gg.server.admin.item.dto.ItemListResponseDto; -import com.gg.server.domain.item.data.Item; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; From 86b06acfa9dc31855e0676f33dd02c7b18fac1da Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Wed, 2 Aug 2023 16:20:35 +0900 Subject: [PATCH 014/273] =?UTF-8?q?[style]=20GGBE-23=20=EC=95=88=EC=93=B0?= =?UTF-8?q?=EB=8A=94=20import=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/coin/controller/CoinPolicyAdminController.java | 1 - .../gg/server/admin/coin/data/CoinPolicyAdminRepository.java | 1 - .../com/gg/server/admin/coin/dto/CoinPolicyAdminAddDto.java | 1 - .../coin/controller/CoinPolicyAdminControllerFailTest.java | 3 --- .../admin/coin/controller/CoinPolicyAdminControllerTest.java | 3 --- 5 files changed, 9 deletions(-) diff --git a/src/main/java/com/gg/server/admin/coin/controller/CoinPolicyAdminController.java b/src/main/java/com/gg/server/admin/coin/controller/CoinPolicyAdminController.java index 48b771e61..03824a39d 100644 --- a/src/main/java/com/gg/server/admin/coin/controller/CoinPolicyAdminController.java +++ b/src/main/java/com/gg/server/admin/coin/controller/CoinPolicyAdminController.java @@ -1,6 +1,5 @@ package com.gg.server.admin.coin.controller; -import com.gg.server.admin.announcement.dto.AnnouncementAdminAddDto; import com.gg.server.admin.coin.dto.CoinPolicyAdminAddDto; import com.gg.server.admin.coin.service.CoinPolicyAdminService; import com.gg.server.domain.user.dto.UserDto; diff --git a/src/main/java/com/gg/server/admin/coin/data/CoinPolicyAdminRepository.java b/src/main/java/com/gg/server/admin/coin/data/CoinPolicyAdminRepository.java index d1b1c45bb..87e8f5412 100644 --- a/src/main/java/com/gg/server/admin/coin/data/CoinPolicyAdminRepository.java +++ b/src/main/java/com/gg/server/admin/coin/data/CoinPolicyAdminRepository.java @@ -1,6 +1,5 @@ package com.gg.server.admin.coin.data; -import com.gg.server.domain.announcement.data.Announcement; import com.gg.server.domain.coin.data.CoinPolicy; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminAddDto.java b/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminAddDto.java index 04143977d..cf35609b3 100644 --- a/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminAddDto.java +++ b/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminAddDto.java @@ -4,7 +4,6 @@ import lombok.Getter; import lombok.NoArgsConstructor; -import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.PositiveOrZero; diff --git a/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerFailTest.java b/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerFailTest.java index 85770f900..5aa2cc706 100644 --- a/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerFailTest.java +++ b/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerFailTest.java @@ -3,8 +3,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.gg.server.admin.coin.data.CoinPolicyAdminRepository; import com.gg.server.admin.coin.dto.CoinPolicyAdminAddDto; -import com.gg.server.domain.coin.data.CoinPolicy; -import com.gg.server.domain.coin.exception.CoinPolicyNotFoundException; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; import com.gg.server.utils.TestDataUtils; import lombok.RequiredArgsConstructor; @@ -18,7 +16,6 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.transaction.annotation.Transactional; -import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; diff --git a/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerTest.java b/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerTest.java index 677d794bf..69ee4f72a 100644 --- a/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerTest.java @@ -1,11 +1,8 @@ package com.gg.server.admin.coin.controller; import com.fasterxml.jackson.databind.ObjectMapper; -import com.gg.server.admin.announcement.dto.AnnouncementAdminAddDto; import com.gg.server.admin.coin.data.CoinPolicyAdminRepository; import com.gg.server.admin.coin.dto.CoinPolicyAdminAddDto; -import com.gg.server.domain.announcement.data.Announcement; -import com.gg.server.domain.announcement.exception.AnnounceNotFoundException; import com.gg.server.domain.coin.data.CoinPolicy; import com.gg.server.domain.coin.exception.CoinPolicyNotFoundException; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; From b79374a6a9c9a90e8ffb4feba7d26c3b00adf7d9 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Wed, 2 Aug 2023 17:23:36 +0900 Subject: [PATCH 015/273] [FEAT] GGBE-28 User TextColor API --- .../admin/game/service/GameAdminService.java | 310 ++++---- .../admin/noti/service/NotiAdminService.java | 94 +-- .../penalty/service/PenaltyAdminService.java | 220 +++--- .../admin/rank/service/RankAdminService.java | 106 +-- .../rank/service/RankRedisAdminService.java | 116 +-- .../team/data/TeamUserAdminRepository.java | 34 +- .../admin/user/data/UserAdminRepository.java | 30 +- .../server/admin/user/dto/UserAdminDto.java | 106 +-- .../user/dto/UserDetailAdminResponseDto.java | 134 ++-- .../admin/user/dto/UserSearchAdminDto.java | 64 +- .../user/dto/UserSearchAdminResponseDto.java | 44 +- .../admin/user/service/UserAdminService.java | 232 +++--- .../server/domain/coin/data/CoinHistory.java | 66 +- .../server/domain/coin/data/CoinPolicy.java | 78 +- .../controller/FeedbackController.java | 66 +- .../server/domain/feedback/data/Feedback.java | 88 +-- .../feedback/dto/FeedbackRequestDto.java | 50 +- .../feedback/service/FeedbackService.java | 60 +- .../domain/game/service/GameService.java | 374 ++++----- .../com/gg/server/domain/item/data/Item.java | 102 +-- .../domain/match/dto/MatchStatusDto.java | 114 +-- .../match/service/GameUpdateService.java | 142 ++-- .../match/service/MatchFindService.java | 238 +++--- .../domain/megaphone/data/Megaphone.java | 88 +-- .../com/gg/server/domain/noti/data/Noti.java | 106 +-- .../domain/noti/data/NotiRepository.java | 28 +- .../domain/noti/service/NotiService.java | 196 ++--- .../server/domain/pchange/data/PChange.java | 144 ++-- .../pchange/service/PChangeService.java | 80 +- .../server/domain/penalty/data/Penalty.java | 108 +-- .../penalty/service/PenaltyService.java | 106 +-- .../com/gg/server/domain/rank/data/Rank.java | 188 ++--- .../gg/server/domain/rank/dto/ExpRankDto.java | 58 +- .../server/domain/rank/redis/RankRedis.java | 152 ++-- .../domain/rank/service/RankService.java | 242 +++--- .../server/domain/receipt/data/Receipt.java | 140 ++-- .../domain/receipt/type/ItemStatus.java | 26 +- .../gg/server/domain/team/data/TeamUser.java | 64 +- .../domain/team/data/TeamUserRepository.java | 38 +- .../com/gg/server/domain/tier/data/Tier.java | 48 +- .../user/controller/UserController.java | 25 +- .../com/gg/server/domain/user/data/User.java | 210 ++--- .../gg/server/domain/user/data/UserImage.java | 84 +- .../domain/user/data/UserRepository.java | 72 +- .../user/dto/UserDetailResponseDto.java | 74 +- .../gg/server/domain/user/dto/UserDto.java | 115 +-- .../domain/user/dto/UserTextColorDto.java | 12 + .../exception/UserTextColorException.java | 10 + .../domain/user/service/UserFindService.java | 92 +-- .../domain/user/service/UserService.java | 478 +++++------ .../service/UserTextColorCheckService.java | 23 + .../domain/user/type/BackgroundType.java | 32 +- .../gg/server/domain/user/type/EdgeType.java | 34 +- .../gg/server/global/config/WebConfig.java | 62 +- .../gg/server/global/exception/ErrorCode.java | 2 +- .../server/global/security/UserPrincipal.java | 164 ++-- .../OAuthAuthenticationSuccessHandler.java | 270 +++---- .../service/CustomOAuth2UserService.java | 212 ++--- .../service/CustomUserDetailsService.java | 58 +- .../server/global/utils/UserImageHandler.java | 152 ++-- .../LoginMemberArgumentResolver.java | 78 +- .../utils/aws/AsyncNewUserImageUploader.java | 114 +-- .../db/migration/V2__migration_42gg_4th.sql | 202 ++--- .../FeedbackAdminControllerTest.java | 254 +++--- .../controller/GameAdminControllerTest.java | 352 ++++----- .../controller/NotiAdminControllerTest.java | 284 +++---- .../PenaltyAdminControllerTest.java | 710 ++++++++--------- .../controller/UserAdminControllerTest.java | 292 +++---- .../match/service/MatchBothServiceTest.java | 272 +++---- .../match/service/MatchServiceTest.java | 740 +++++++++--------- .../domain/match/service/MatchTestUtils.java | 228 +++--- .../noti/controller/NotiControllerTest.java | 246 +++--- .../domain/noti/service/NotiServiceTest.java | 146 ++-- .../rank/controller/RankControllerTest.java | 332 ++++---- .../user/controller/UserControllerTest.java | 634 +++++++-------- .../gg/server/game/GameControllerTest.java | 740 +++++++++--------- .../game/service/GameFindServiceTest.java | 192 ++--- .../server/game/service/GameServiceTest.java | 222 +++--- .../game/service/GameStatusServiceTest.java | 208 ++--- .../com/gg/server/utils/TestDataUtils.java | 476 +++++------ 80 files changed, 6828 insertions(+), 6755 deletions(-) create mode 100644 src/main/java/com/gg/server/domain/user/dto/UserTextColorDto.java create mode 100644 src/main/java/com/gg/server/domain/user/exception/UserTextColorException.java create mode 100644 src/main/java/com/gg/server/domain/user/service/UserTextColorCheckService.java diff --git a/src/main/java/com/gg/server/admin/game/service/GameAdminService.java b/src/main/java/com/gg/server/admin/game/service/GameAdminService.java index cc243c153..227ccd095 100644 --- a/src/main/java/com/gg/server/admin/game/service/GameAdminService.java +++ b/src/main/java/com/gg/server/admin/game/service/GameAdminService.java @@ -1,155 +1,155 @@ -package com.gg.server.admin.game.service; - -import com.gg.server.admin.game.dto.GameLogAdminDto; -import com.gg.server.admin.game.dto.GameLogListAdminResponseDto; -import com.gg.server.admin.game.data.GameAdminRepository; -import com.gg.server.admin.game.dto.RankGamePPPModifyReqDto; -import com.gg.server.admin.game.exception.NotRecentlyGameException; -import com.gg.server.admin.pchange.data.PChangeAdminRepository; -import com.gg.server.admin.season.data.SeasonAdminRepository; -import com.gg.server.admin.team.data.TeamUserAdminRepository; -import com.gg.server.admin.user.data.UserAdminRepository; -import com.gg.server.domain.game.data.Game; -import com.gg.server.domain.game.dto.GameTeamUser; -import com.gg.server.domain.game.exception.GameNotExistException; -import com.gg.server.domain.game.type.StatusType; -import com.gg.server.domain.match.data.RedisMatchUserRepository; -import com.gg.server.domain.pchange.data.PChange; -import com.gg.server.domain.pchange.data.PChangeRepository; - -import com.gg.server.domain.rank.redis.RankRedisService; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.season.exception.SeasonNotFoundException; -import com.gg.server.domain.team.data.TeamUser; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.exception.UserNotFoundException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.Caching; -import org.springframework.data.domain.*; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -@Service -@RequiredArgsConstructor -@Slf4j -public class GameAdminService { - - private final GameAdminRepository gameAdminRepository; - private final SeasonAdminRepository seasonAdminRepository; - private final UserAdminRepository userAdminRepository; - private final PChangeRepository pChangeRepository; - private final PChangeAdminRepository pChangeAdminRepository; - private final RankRedisService rankRedisService; - private final TeamUserAdminRepository teamUserAdminRepository; - private final RedisMatchUserRepository redisMatchUserRepository; - - @Transactional(readOnly = true) - public GameLogListAdminResponseDto findAllGamesByAdmin(Pageable pageable) { - Page gamePage = gameAdminRepository.findAllByStatus(pageable, StatusType.END); //모든 게임 정보 가져오기 - return new GameLogListAdminResponseDto(getGameLogList(gamePage.getContent().stream().map(Game::getId).collect(Collectors.toList())), gamePage.getTotalPages()); - } - - - @Transactional(readOnly = true) - public GameLogListAdminResponseDto findGamesBySeasonId(Long seasonId, Pageable pageable){ - Season season = seasonAdminRepository.findById(seasonId).orElseThrow(()-> new SeasonNotFoundException()); - Page games = gameAdminRepository.findBySeason(pageable, season); //시즌 id로 게임들 찾아오기 - return new GameLogListAdminResponseDto(getGameLogList(games.getContent().stream().map(Game::getId).collect(Collectors.toList())), games.getTotalPages()); - } - - @Transactional(readOnly = true) - public List getGameLogList(List gameIdList){ - List teamViews = gameAdminRepository.findTeamsByGameIsIn(gameIdList); - return teamViews.stream().map(GameLogAdminDto::new).collect(Collectors.toList()); - } - - @Transactional(readOnly = true) - public GameLogListAdminResponseDto findGamesByIntraId(String intraId, Pageable pageable){ - User user = userAdminRepository.findByIntraId(intraId).orElseThrow(() -> new UserNotFoundException()); - List pChangeList = pChangeRepository.findAllByUserId(user.getId()); - List gameList = new ArrayList<>(); - - for(PChange pChange : pChangeList) - gameList.add(pChange.getGame()); - - int start = (int)pageable.getOffset(); - int end = Math.min((start + pageable.getPageSize()), gameList.size()); - Page games = new PageImpl<>(gameList.subList(start, end), pageable, gameList.size()); - return new GameLogListAdminResponseDto(getGameLogList(games.getContent().stream().map(Game::getId).collect(Collectors.toList())), games.getTotalPages()); - } - - @Transactional - @Caching(evict = { - @CacheEvict(value = "rankGameListByIntra", allEntries = true), - @CacheEvict(value = "rankGameList", allEntries = true), - @CacheEvict(value = "allGameList", allEntries = true), - @CacheEvict(value = "allGameListByUser", allEntries = true) - }) - public void rankResultEdit(RankGamePPPModifyReqDto reqDto, Long gameId) { - // 게임이 두명 다 가장 마지막 게임인지 확인 (그 game에 해당하는 팀이 맞는지 확인) - List teamUsers = teamUserAdminRepository.findUsersByTeamIdIn(List.of(reqDto.getTeam1Id(), reqDto.getTeam2Id())); - Game game = gameAdminRepository.findById(gameId) - .orElseThrow(GameNotExistException::new); - Season season = seasonAdminRepository.findById(game.getSeason().getId()) - .orElseThrow(SeasonNotFoundException::new); - if (!isRecentlyGame(teamUsers, gameId) || EnrollSlots(teamUsers)) { - throw new NotRecentlyGameException(); - } - // pchange 가져와서 rank ppp 이전 값을 가지고 새 점수를 바탕으로 다시 계산 - for (TeamUser teamUser : - teamUsers) { - List pChanges = pChangeAdminRepository.findByTeamUser(teamUser.getUser().getId()); - rollbackGameResult(reqDto, season, teamUser, pChanges); - pChangeAdminRepository.delete(pChanges.get(0)); - } - rankRedisService.updateRankRedis(teamUsers.get(0), teamUsers.get(1), game); - } - - private void rollbackGameResult(RankGamePPPModifyReqDto reqDto, Season season, TeamUser teamUser, List pChanges) { - // pchange ppp도 update - // rankredis 에 ppp 다시 반영 - // rank zset 도 update - // 이전 ppp, exp 되돌리기 - // rank data 에 있는 ppp 되돌리기 - if (teamUser.getTeam().getId().equals(reqDto.getTeam1Id())) { - teamUser.getTeam().updateScore(reqDto.getTeam1Score(), reqDto.getTeam1Score() > reqDto.getTeam2Score()); - } else if (teamUser.getTeam().getId().equals(reqDto.getTeam2Id())) { - teamUser.getTeam().updateScore(reqDto.getTeam2Score(), reqDto.getTeam2Score() > reqDto.getTeam1Score()); - } - if (pChanges.size() == 1) { - rankRedisService.rollbackRank(teamUser, season.getStartPpp(), season.getId()); - teamUser.getUser().updateExp(0); - } else { - rankRedisService.rollbackRank(teamUser, pChanges.get(1).getPppResult(), season.getId()); - teamUser.getUser().updateExp(pChanges.get(1).getExp()); - } - } - - private Boolean isRecentlyGame(List teamUsers, Long gameId) { - for (TeamUser teamUser : teamUsers) { - List pChanges = pChangeAdminRepository.findByTeamUser(teamUser.getUser().getId()); - if (!pChanges.get(0).getGame().getId().equals(gameId)) - return false; - } - return true; - } - - private Boolean EnrollSlots(List teamUsers) { - for (TeamUser teamUser : teamUsers) { - Long userId = teamUser.getUser().getId(); - if (redisMatchUserRepository.countMatchTime(userId) > 0) { - return true; - } - if (gameAdminRepository.findByStatusTypeAndUserId(StatusType.BEFORE, userId).isPresent()) { - return true; - } - } - return false; - } -} +package com.gg.server.admin.game.service; + +import com.gg.server.admin.game.dto.GameLogAdminDto; +import com.gg.server.admin.game.dto.GameLogListAdminResponseDto; +import com.gg.server.admin.game.data.GameAdminRepository; +import com.gg.server.admin.game.dto.RankGamePPPModifyReqDto; +import com.gg.server.admin.game.exception.NotRecentlyGameException; +import com.gg.server.admin.pchange.data.PChangeAdminRepository; +import com.gg.server.admin.season.data.SeasonAdminRepository; +import com.gg.server.admin.team.data.TeamUserAdminRepository; +import com.gg.server.admin.user.data.UserAdminRepository; +import com.gg.server.domain.game.data.Game; +import com.gg.server.domain.game.dto.GameTeamUser; +import com.gg.server.domain.game.exception.GameNotExistException; +import com.gg.server.domain.game.type.StatusType; +import com.gg.server.domain.match.data.RedisMatchUserRepository; +import com.gg.server.domain.pchange.data.PChange; +import com.gg.server.domain.pchange.data.PChangeRepository; + +import com.gg.server.domain.rank.redis.RankRedisService; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.season.exception.SeasonNotFoundException; +import com.gg.server.domain.team.data.TeamUser; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.exception.UserNotFoundException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Caching; +import org.springframework.data.domain.*; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +@Slf4j +public class GameAdminService { + + private final GameAdminRepository gameAdminRepository; + private final SeasonAdminRepository seasonAdminRepository; + private final UserAdminRepository userAdminRepository; + private final PChangeRepository pChangeRepository; + private final PChangeAdminRepository pChangeAdminRepository; + private final RankRedisService rankRedisService; + private final TeamUserAdminRepository teamUserAdminRepository; + private final RedisMatchUserRepository redisMatchUserRepository; + + @Transactional(readOnly = true) + public GameLogListAdminResponseDto findAllGamesByAdmin(Pageable pageable) { + Page gamePage = gameAdminRepository.findAllByStatus(pageable, StatusType.END); //모든 게임 정보 가져오기 + return new GameLogListAdminResponseDto(getGameLogList(gamePage.getContent().stream().map(Game::getId).collect(Collectors.toList())), gamePage.getTotalPages()); + } + + + @Transactional(readOnly = true) + public GameLogListAdminResponseDto findGamesBySeasonId(Long seasonId, Pageable pageable){ + Season season = seasonAdminRepository.findById(seasonId).orElseThrow(()-> new SeasonNotFoundException()); + Page games = gameAdminRepository.findBySeason(pageable, season); //시즌 id로 게임들 찾아오기 + return new GameLogListAdminResponseDto(getGameLogList(games.getContent().stream().map(Game::getId).collect(Collectors.toList())), games.getTotalPages()); + } + + @Transactional(readOnly = true) + public List getGameLogList(List gameIdList){ + List teamViews = gameAdminRepository.findTeamsByGameIsIn(gameIdList); + return teamViews.stream().map(GameLogAdminDto::new).collect(Collectors.toList()); + } + + @Transactional(readOnly = true) + public GameLogListAdminResponseDto findGamesByIntraId(String intraId, Pageable pageable){ + User user = userAdminRepository.findByIntraId(intraId).orElseThrow(() -> new UserNotFoundException()); + List pChangeList = pChangeRepository.findAllByUserId(user.getId()); + List gameList = new ArrayList<>(); + + for(PChange pChange : pChangeList) + gameList.add(pChange.getGame()); + + int start = (int)pageable.getOffset(); + int end = Math.min((start + pageable.getPageSize()), gameList.size()); + Page games = new PageImpl<>(gameList.subList(start, end), pageable, gameList.size()); + return new GameLogListAdminResponseDto(getGameLogList(games.getContent().stream().map(Game::getId).collect(Collectors.toList())), games.getTotalPages()); + } + + @Transactional + @Caching(evict = { + @CacheEvict(value = "rankGameListByIntra", allEntries = true), + @CacheEvict(value = "rankGameList", allEntries = true), + @CacheEvict(value = "allGameList", allEntries = true), + @CacheEvict(value = "allGameListByUser", allEntries = true) + }) + public void rankResultEdit(RankGamePPPModifyReqDto reqDto, Long gameId) { + // 게임이 두명 다 가장 마지막 게임인지 확인 (그 game에 해당하는 팀이 맞는지 확인) + List teamUsers = teamUserAdminRepository.findUsersByTeamIdIn(List.of(reqDto.getTeam1Id(), reqDto.getTeam2Id())); + Game game = gameAdminRepository.findById(gameId) + .orElseThrow(GameNotExistException::new); + Season season = seasonAdminRepository.findById(game.getSeason().getId()) + .orElseThrow(SeasonNotFoundException::new); + if (!isRecentlyGame(teamUsers, gameId) || EnrollSlots(teamUsers)) { + throw new NotRecentlyGameException(); + } + // pchange 가져와서 rank ppp 이전 값을 가지고 새 점수를 바탕으로 다시 계산 + for (TeamUser teamUser : + teamUsers) { + List pChanges = pChangeAdminRepository.findByTeamUser(teamUser.getUser().getId()); + rollbackGameResult(reqDto, season, teamUser, pChanges); + pChangeAdminRepository.delete(pChanges.get(0)); + } + rankRedisService.updateRankRedis(teamUsers.get(0), teamUsers.get(1), game); + } + + private void rollbackGameResult(RankGamePPPModifyReqDto reqDto, Season season, TeamUser teamUser, List pChanges) { + // pchange ppp도 update + // rankredis 에 ppp 다시 반영 + // rank zset 도 update + // 이전 ppp, exp 되돌리기 + // rank data 에 있는 ppp 되돌리기 + if (teamUser.getTeam().getId().equals(reqDto.getTeam1Id())) { + teamUser.getTeam().updateScore(reqDto.getTeam1Score(), reqDto.getTeam1Score() > reqDto.getTeam2Score()); + } else if (teamUser.getTeam().getId().equals(reqDto.getTeam2Id())) { + teamUser.getTeam().updateScore(reqDto.getTeam2Score(), reqDto.getTeam2Score() > reqDto.getTeam1Score()); + } + if (pChanges.size() == 1) { + rankRedisService.rollbackRank(teamUser, season.getStartPpp(), season.getId()); + teamUser.getUser().updateExp(0); + } else { + rankRedisService.rollbackRank(teamUser, pChanges.get(1).getPppResult(), season.getId()); + teamUser.getUser().updateExp(pChanges.get(1).getExp()); + } + } + + private Boolean isRecentlyGame(List teamUsers, Long gameId) { + for (TeamUser teamUser : teamUsers) { + List pChanges = pChangeAdminRepository.findByTeamUser(teamUser.getUser().getId()); + if (!pChanges.get(0).getGame().getId().equals(gameId)) + return false; + } + return true; + } + + private Boolean EnrollSlots(List teamUsers) { + for (TeamUser teamUser : teamUsers) { + Long userId = teamUser.getUser().getId(); + if (redisMatchUserRepository.countMatchTime(userId) > 0) { + return true; + } + if (gameAdminRepository.findByStatusTypeAndUserId(StatusType.BEFORE, userId).isPresent()) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/com/gg/server/admin/noti/service/NotiAdminService.java b/src/main/java/com/gg/server/admin/noti/service/NotiAdminService.java index 58f7c5c27..82e83a479 100644 --- a/src/main/java/com/gg/server/admin/noti/service/NotiAdminService.java +++ b/src/main/java/com/gg/server/admin/noti/service/NotiAdminService.java @@ -1,47 +1,47 @@ -package com.gg.server.admin.noti.service; - -import com.gg.server.admin.noti.data.NotiAdminRepository; -import com.gg.server.admin.noti.dto.NotiAdminDto; -import com.gg.server.admin.noti.dto.NotiListAdminResponseDto; -import com.gg.server.admin.noti.dto.SendNotiAdminRequestDto; -import com.gg.server.admin.user.data.UserAdminRepository; -import com.gg.server.domain.noti.data.Noti; -import com.gg.server.domain.noti.type.NotiType; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.exception.UserNotFoundException; -import lombok.AllArgsConstructor; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@AllArgsConstructor -public class NotiAdminService { - private final NotiAdminRepository notiAdminRepository; - private final UserAdminRepository userAdminRepository; - - @Transactional - public void sendAnnounceNotiToUser(SendNotiAdminRequestDto sendNotiAdminRequestDto) { - String message = sendNotiAdminRequestDto.getMessage(); - String intraId = sendNotiAdminRequestDto.getIntraId(); - - User user = userAdminRepository.findByIntraId(intraId) - .orElseThrow(() -> new UserNotFoundException()); - notiAdminRepository.save(new Noti(user, NotiType.ANNOUNCE, message, false)); - } - - @Transactional(readOnly = true) - public NotiListAdminResponseDto getAllNoti(Pageable pageable) { - Page allNotiPage = notiAdminRepository.findAll(pageable); - Page notiAdminDtoPage = allNotiPage.map(NotiAdminDto::new); - return new NotiListAdminResponseDto(notiAdminDtoPage.getContent(), notiAdminDtoPage.getTotalPages()); - } - - @Transactional(readOnly = true) - public NotiListAdminResponseDto getFilteredNotifications(Pageable pageable, String intraId) { - Page findNotis = notiAdminRepository.findNotisByUserIntraId(pageable, intraId); - Page notiResponseDtoPage = findNotis.map(NotiAdminDto::new); - return new NotiListAdminResponseDto(notiResponseDtoPage.getContent(), notiResponseDtoPage.getTotalPages()); - } -} +package com.gg.server.admin.noti.service; + +import com.gg.server.admin.noti.data.NotiAdminRepository; +import com.gg.server.admin.noti.dto.NotiAdminDto; +import com.gg.server.admin.noti.dto.NotiListAdminResponseDto; +import com.gg.server.admin.noti.dto.SendNotiAdminRequestDto; +import com.gg.server.admin.user.data.UserAdminRepository; +import com.gg.server.domain.noti.data.Noti; +import com.gg.server.domain.noti.type.NotiType; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.exception.UserNotFoundException; +import lombok.AllArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@AllArgsConstructor +public class NotiAdminService { + private final NotiAdminRepository notiAdminRepository; + private final UserAdminRepository userAdminRepository; + + @Transactional + public void sendAnnounceNotiToUser(SendNotiAdminRequestDto sendNotiAdminRequestDto) { + String message = sendNotiAdminRequestDto.getMessage(); + String intraId = sendNotiAdminRequestDto.getIntraId(); + + User user = userAdminRepository.findByIntraId(intraId) + .orElseThrow(() -> new UserNotFoundException()); + notiAdminRepository.save(new Noti(user, NotiType.ANNOUNCE, message, false)); + } + + @Transactional(readOnly = true) + public NotiListAdminResponseDto getAllNoti(Pageable pageable) { + Page allNotiPage = notiAdminRepository.findAll(pageable); + Page notiAdminDtoPage = allNotiPage.map(NotiAdminDto::new); + return new NotiListAdminResponseDto(notiAdminDtoPage.getContent(), notiAdminDtoPage.getTotalPages()); + } + + @Transactional(readOnly = true) + public NotiListAdminResponseDto getFilteredNotifications(Pageable pageable, String intraId) { + Page findNotis = notiAdminRepository.findNotisByUserIntraId(pageable, intraId); + Page notiResponseDtoPage = findNotis.map(NotiAdminDto::new); + return new NotiListAdminResponseDto(notiResponseDtoPage.getContent(), notiResponseDtoPage.getTotalPages()); + } +} diff --git a/src/main/java/com/gg/server/admin/penalty/service/PenaltyAdminService.java b/src/main/java/com/gg/server/admin/penalty/service/PenaltyAdminService.java index 861f07683..dcff03b48 100644 --- a/src/main/java/com/gg/server/admin/penalty/service/PenaltyAdminService.java +++ b/src/main/java/com/gg/server/admin/penalty/service/PenaltyAdminService.java @@ -1,110 +1,110 @@ -package com.gg.server.admin.penalty.service; - -import com.gg.server.admin.penalty.data.PenaltyAdminRepository; -import com.gg.server.domain.penalty.data.Penalty; -import com.gg.server.domain.penalty.redis.RedisPenaltyUser; -import com.gg.server.admin.penalty.data.PenaltyUserAdminRedisRepository; -import com.gg.server.admin.penalty.dto.PenaltyListResponseDto; -import com.gg.server.admin.penalty.dto.PenaltyUserResponseDto; -import com.gg.server.domain.penalty.exception.PenaltyExpiredException; -import com.gg.server.domain.penalty.exception.PenaltyNotFoundException; -import com.gg.server.domain.penalty.exception.RedisPenaltyUserNotFoundException; -import com.gg.server.domain.penalty.type.PenaltyType; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.service.UserFindService; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; -import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@RequiredArgsConstructor -public class PenaltyAdminService { - private final PenaltyUserAdminRedisRepository penaltyUserAdminRedisRepository; - private final UserFindService userFindService; - private final PenaltyAdminRepository penaltyRepository; - - @Transactional - public void givePenalty(String intraId, Integer penaltyTime, String reason) { - User user = userFindService.findByIntraId(intraId); - Optional redisPenaltyUser = penaltyUserAdminRedisRepository.findByIntraId(intraId); - LocalDateTime releaseTime; - RedisPenaltyUser penaltyUser; - Penalty penalty; - LocalDateTime now = LocalDateTime.now(); - if (redisPenaltyUser.isPresent()) { - releaseTime = redisPenaltyUser.get().getReleaseTime().plusHours(penaltyTime); - penaltyUser = new RedisPenaltyUser(intraId, redisPenaltyUser.get().getPenaltyTime() + penaltyTime * 60, - releaseTime, redisPenaltyUser.get().getStartTime(), reason); - penalty = new Penalty(user, PenaltyType.NOSHOW, reason, redisPenaltyUser.get().getReleaseTime(), penaltyTime * 60); - } else { - releaseTime = now.plusHours(penaltyTime); - penaltyUser = new RedisPenaltyUser(intraId, penaltyTime * 60, releaseTime, now, reason); - penalty = new Penalty(user, PenaltyType.NOSHOW, reason, now, penaltyTime * 60); - } - penaltyRepository.save(penalty); - penaltyUserAdminRedisRepository.addPenaltyUser(penaltyUser, releaseTime); - } - - - @Transactional(readOnly = true) - public PenaltyListResponseDto getAllPenalties(Pageable pageable, Boolean current) { - Page allPenalties; - if (current) { - allPenalties = penaltyRepository.findAllCurrent(pageable, LocalDateTime.now()); - } else { - allPenalties = penaltyRepository.findAll(pageable); - } - Page responseDtos = allPenalties.map(PenaltyUserResponseDto::new); - return new PenaltyListResponseDto(responseDtos.getContent(), responseDtos.getTotalPages()); - } - - - @Transactional - public void deletePenalty(Long penaltyId) { - Penalty penalty = penaltyRepository.findById(penaltyId).orElseThrow(() - -> new PenaltyNotFoundException()); - if (penalty.getStartTime().plusMinutes(penalty.getPenaltyTime()).isBefore(LocalDateTime.now())) { - throw new PenaltyExpiredException(); - } - RedisPenaltyUser penaltyUser = penaltyUserAdminRedisRepository - .findByIntraId(penalty.getUser().getIntraId()).orElseThrow(() - -> new RedisPenaltyUserNotFoundException()); - penaltyUserAdminRedisRepository.deletePenaltyInUser(penaltyUser, - penalty.getPenaltyTime());//redis 시간 줄여주기 - //뒤에 있는 penalty 시간 당겨주기 - modifyStartTimeOfAfterPenalties(penalty); - penaltyRepository.delete(penalty); - } - - @Transactional(readOnly = true) - public PenaltyListResponseDto getAllPenaltiesByIntraId(Pageable pageable, String intraId, Boolean current) { - Page allPenalties; - if (current) { - allPenalties = penaltyRepository.findAllCurrentByIntraId(pageable, LocalDateTime.now(), intraId); - } else { - allPenalties = penaltyRepository.findAllByIntraId(pageable, intraId); - } - Page responseDtos = allPenalties.map(PenaltyUserResponseDto::new); - return new PenaltyListResponseDto(responseDtos.getContent(), responseDtos.getTotalPages()); - } - - private void modifyStartTimeOfAfterPenalties(Penalty penalty) { - List afterPenalties = penaltyRepository.findAfterPenaltiesByUser(penalty.getUser().getId(), - penalty.getStartTime()); - LocalDateTime newStartTime; - if (penalty.getStartTime().isAfter(LocalDateTime.now())) { - newStartTime = penalty.getStartTime(); - } else { - newStartTime = LocalDateTime.now(); - } - for (Penalty afterPenalty : afterPenalties) { - afterPenalty.updateStartTime(newStartTime); - newStartTime = newStartTime.plusMinutes(afterPenalty.getPenaltyTime()); - } - } -} +package com.gg.server.admin.penalty.service; + +import com.gg.server.admin.penalty.data.PenaltyAdminRepository; +import com.gg.server.domain.penalty.data.Penalty; +import com.gg.server.domain.penalty.redis.RedisPenaltyUser; +import com.gg.server.admin.penalty.data.PenaltyUserAdminRedisRepository; +import com.gg.server.admin.penalty.dto.PenaltyListResponseDto; +import com.gg.server.admin.penalty.dto.PenaltyUserResponseDto; +import com.gg.server.domain.penalty.exception.PenaltyExpiredException; +import com.gg.server.domain.penalty.exception.PenaltyNotFoundException; +import com.gg.server.domain.penalty.exception.RedisPenaltyUserNotFoundException; +import com.gg.server.domain.penalty.type.PenaltyType; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.service.UserFindService; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class PenaltyAdminService { + private final PenaltyUserAdminRedisRepository penaltyUserAdminRedisRepository; + private final UserFindService userFindService; + private final PenaltyAdminRepository penaltyRepository; + + @Transactional + public void givePenalty(String intraId, Integer penaltyTime, String reason) { + User user = userFindService.findByIntraId(intraId); + Optional redisPenaltyUser = penaltyUserAdminRedisRepository.findByIntraId(intraId); + LocalDateTime releaseTime; + RedisPenaltyUser penaltyUser; + Penalty penalty; + LocalDateTime now = LocalDateTime.now(); + if (redisPenaltyUser.isPresent()) { + releaseTime = redisPenaltyUser.get().getReleaseTime().plusHours(penaltyTime); + penaltyUser = new RedisPenaltyUser(intraId, redisPenaltyUser.get().getPenaltyTime() + penaltyTime * 60, + releaseTime, redisPenaltyUser.get().getStartTime(), reason); + penalty = new Penalty(user, PenaltyType.NOSHOW, reason, redisPenaltyUser.get().getReleaseTime(), penaltyTime * 60); + } else { + releaseTime = now.plusHours(penaltyTime); + penaltyUser = new RedisPenaltyUser(intraId, penaltyTime * 60, releaseTime, now, reason); + penalty = new Penalty(user, PenaltyType.NOSHOW, reason, now, penaltyTime * 60); + } + penaltyRepository.save(penalty); + penaltyUserAdminRedisRepository.addPenaltyUser(penaltyUser, releaseTime); + } + + + @Transactional(readOnly = true) + public PenaltyListResponseDto getAllPenalties(Pageable pageable, Boolean current) { + Page allPenalties; + if (current) { + allPenalties = penaltyRepository.findAllCurrent(pageable, LocalDateTime.now()); + } else { + allPenalties = penaltyRepository.findAll(pageable); + } + Page responseDtos = allPenalties.map(PenaltyUserResponseDto::new); + return new PenaltyListResponseDto(responseDtos.getContent(), responseDtos.getTotalPages()); + } + + + @Transactional + public void deletePenalty(Long penaltyId) { + Penalty penalty = penaltyRepository.findById(penaltyId).orElseThrow(() + -> new PenaltyNotFoundException()); + if (penalty.getStartTime().plusMinutes(penalty.getPenaltyTime()).isBefore(LocalDateTime.now())) { + throw new PenaltyExpiredException(); + } + RedisPenaltyUser penaltyUser = penaltyUserAdminRedisRepository + .findByIntraId(penalty.getUser().getIntraId()).orElseThrow(() + -> new RedisPenaltyUserNotFoundException()); + penaltyUserAdminRedisRepository.deletePenaltyInUser(penaltyUser, + penalty.getPenaltyTime());//redis 시간 줄여주기 + //뒤에 있는 penalty 시간 당겨주기 + modifyStartTimeOfAfterPenalties(penalty); + penaltyRepository.delete(penalty); + } + + @Transactional(readOnly = true) + public PenaltyListResponseDto getAllPenaltiesByIntraId(Pageable pageable, String intraId, Boolean current) { + Page allPenalties; + if (current) { + allPenalties = penaltyRepository.findAllCurrentByIntraId(pageable, LocalDateTime.now(), intraId); + } else { + allPenalties = penaltyRepository.findAllByIntraId(pageable, intraId); + } + Page responseDtos = allPenalties.map(PenaltyUserResponseDto::new); + return new PenaltyListResponseDto(responseDtos.getContent(), responseDtos.getTotalPages()); + } + + private void modifyStartTimeOfAfterPenalties(Penalty penalty) { + List afterPenalties = penaltyRepository.findAfterPenaltiesByUser(penalty.getUser().getId(), + penalty.getStartTime()); + LocalDateTime newStartTime; + if (penalty.getStartTime().isAfter(LocalDateTime.now())) { + newStartTime = penalty.getStartTime(); + } else { + newStartTime = LocalDateTime.now(); + } + for (Penalty afterPenalty : afterPenalties) { + afterPenalty.updateStartTime(newStartTime); + newStartTime = newStartTime.plusMinutes(afterPenalty.getPenaltyTime()); + } + } +} diff --git a/src/main/java/com/gg/server/admin/rank/service/RankAdminService.java b/src/main/java/com/gg/server/admin/rank/service/RankAdminService.java index 72172d92e..44f6c5cd0 100644 --- a/src/main/java/com/gg/server/admin/rank/service/RankAdminService.java +++ b/src/main/java/com/gg/server/admin/rank/service/RankAdminService.java @@ -1,53 +1,53 @@ -package com.gg.server.admin.rank.service; - -import com.gg.server.admin.season.dto.SeasonAdminDto; -import com.gg.server.admin.user.data.UserAdminRepository; -import com.gg.server.domain.rank.data.Rank; -import com.gg.server.domain.rank.data.RankRepository; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.season.data.SeasonRepository; -import com.gg.server.domain.season.exception.SeasonForbiddenException; -import com.gg.server.domain.season.exception.SeasonTimeBeforeException; -import com.gg.server.domain.user.data.User; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -import static com.gg.server.domain.user.type.RoleType.GUEST; - -@Service -@AllArgsConstructor -public class RankAdminService { - private final RankRepository rankRepository; - private final UserAdminRepository userAdminRepository; - private final SeasonRepository seasonRepository; - - @Transactional - public void addAllUserRankByNewSeason(SeasonAdminDto seasonAdminDto) { - if (LocalDateTime.now().isAfter(seasonAdminDto.getStartTime())) - throw new SeasonTimeBeforeException(); - List users = userAdminRepository.findAll(); - - List ranks = new ArrayList<>(); - Season season = seasonRepository.findById(seasonAdminDto.getSeasonId()).get(); - users.forEach(user -> { - if (user.getRoleType() != GUEST) { - Rank userRank = Rank.from(user, season, seasonAdminDto.getStartPpp()); - ranks.add(userRank); - } - }); - rankRepository.saveAll(ranks); - } - - @Transactional - public void deleteAllUserRankBySeason(SeasonAdminDto seasonAdminDto) { - if (LocalDateTime.now().isAfter(seasonAdminDto.getStartTime())) - throw new SeasonForbiddenException(); - - rankRepository.deleteAllBySeasonId(seasonAdminDto.getSeasonId()); - } -} +package com.gg.server.admin.rank.service; + +import com.gg.server.admin.season.dto.SeasonAdminDto; +import com.gg.server.admin.user.data.UserAdminRepository; +import com.gg.server.domain.rank.data.Rank; +import com.gg.server.domain.rank.data.RankRepository; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.season.data.SeasonRepository; +import com.gg.server.domain.season.exception.SeasonForbiddenException; +import com.gg.server.domain.season.exception.SeasonTimeBeforeException; +import com.gg.server.domain.user.data.User; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import static com.gg.server.domain.user.type.RoleType.GUEST; + +@Service +@AllArgsConstructor +public class RankAdminService { + private final RankRepository rankRepository; + private final UserAdminRepository userAdminRepository; + private final SeasonRepository seasonRepository; + + @Transactional + public void addAllUserRankByNewSeason(SeasonAdminDto seasonAdminDto) { + if (LocalDateTime.now().isAfter(seasonAdminDto.getStartTime())) + throw new SeasonTimeBeforeException(); + List users = userAdminRepository.findAll(); + + List ranks = new ArrayList<>(); + Season season = seasonRepository.findById(seasonAdminDto.getSeasonId()).get(); + users.forEach(user -> { + if (user.getRoleType() != GUEST) { + Rank userRank = Rank.from(user, season, seasonAdminDto.getStartPpp()); + ranks.add(userRank); + } + }); + rankRepository.saveAll(ranks); + } + + @Transactional + public void deleteAllUserRankBySeason(SeasonAdminDto seasonAdminDto) { + if (LocalDateTime.now().isAfter(seasonAdminDto.getStartTime())) + throw new SeasonForbiddenException(); + + rankRepository.deleteAllBySeasonId(seasonAdminDto.getSeasonId()); + } +} diff --git a/src/main/java/com/gg/server/admin/rank/service/RankRedisAdminService.java b/src/main/java/com/gg/server/admin/rank/service/RankRedisAdminService.java index fa380170c..70573e033 100644 --- a/src/main/java/com/gg/server/admin/rank/service/RankRedisAdminService.java +++ b/src/main/java/com/gg/server/admin/rank/service/RankRedisAdminService.java @@ -1,58 +1,58 @@ -package com.gg.server.admin.rank.service; - -import com.gg.server.admin.season.dto.SeasonAdminDto; -import com.gg.server.domain.rank.redis.RankRedis; -import com.gg.server.domain.rank.redis.RankRedisRepository; -import com.gg.server.domain.rank.redis.RedisKeyManager; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.domain.user.dto.UserDto; -import lombok.AllArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -import static com.gg.server.domain.user.type.RoleType.GUEST; - -@Service -@AllArgsConstructor -public class RankRedisAdminService { - private final UserRepository userRepository; - private final RankRedisRepository rankRedisRepository; - - @Transactional - public void addAllUserRankByNewSeason(SeasonAdminDto seasonAdminDto) { - List users = userRepository.findAll(); - - String redisHashKey = RedisKeyManager.getHashKey(seasonAdminDto.getSeasonId()); - - users.forEach(user -> { - if (user.getRoleType() != GUEST) { - UserDto userDto = UserDto.from(user); - RankRedis userRank = RankRedis.from(userDto, seasonAdminDto.getStartPpp()); - - rankRedisRepository.addRankData(redisHashKey, user.getId(), userRank); - } - }); - } - - @Transactional - public void deleteSeasonRankBySeasonId(Long seasonId) { - String redisHashKey = RedisKeyManager.getHashKey(seasonId); - - rankRedisRepository.deleteHashKey(redisHashKey); - } - - public void updateRankUser(String hashKey, String zsetKey, Long userId, RankRedis userRank) { - rankRedisRepository.updateRankData(hashKey, userId, userRank); - if (userPlayedRank(userRank)){ - rankRedisRepository.deleteFromZSet(zsetKey, userId); - rankRedisRepository.addToZSet(zsetKey, userId, userRank.getPpp()); - } - } - - private boolean userPlayedRank(RankRedis userRank) { - return (userRank.getWins() + userRank.getLosses()) != 0; - } -} +package com.gg.server.admin.rank.service; + +import com.gg.server.admin.season.dto.SeasonAdminDto; +import com.gg.server.domain.rank.redis.RankRedis; +import com.gg.server.domain.rank.redis.RankRedisRepository; +import com.gg.server.domain.rank.redis.RedisKeyManager; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.dto.UserDto; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +import static com.gg.server.domain.user.type.RoleType.GUEST; + +@Service +@AllArgsConstructor +public class RankRedisAdminService { + private final UserRepository userRepository; + private final RankRedisRepository rankRedisRepository; + + @Transactional + public void addAllUserRankByNewSeason(SeasonAdminDto seasonAdminDto) { + List users = userRepository.findAll(); + + String redisHashKey = RedisKeyManager.getHashKey(seasonAdminDto.getSeasonId()); + + users.forEach(user -> { + if (user.getRoleType() != GUEST) { + UserDto userDto = UserDto.from(user); + RankRedis userRank = RankRedis.from(userDto, seasonAdminDto.getStartPpp()); + + rankRedisRepository.addRankData(redisHashKey, user.getId(), userRank); + } + }); + } + + @Transactional + public void deleteSeasonRankBySeasonId(Long seasonId) { + String redisHashKey = RedisKeyManager.getHashKey(seasonId); + + rankRedisRepository.deleteHashKey(redisHashKey); + } + + public void updateRankUser(String hashKey, String zsetKey, Long userId, RankRedis userRank) { + rankRedisRepository.updateRankData(hashKey, userId, userRank); + if (userPlayedRank(userRank)){ + rankRedisRepository.deleteFromZSet(zsetKey, userId); + rankRedisRepository.addToZSet(zsetKey, userId, userRank.getPpp()); + } + } + + private boolean userPlayedRank(RankRedis userRank) { + return (userRank.getWins() + userRank.getLosses()) != 0; + } +} diff --git a/src/main/java/com/gg/server/admin/team/data/TeamUserAdminRepository.java b/src/main/java/com/gg/server/admin/team/data/TeamUserAdminRepository.java index 4dab20a0d..07974e80d 100644 --- a/src/main/java/com/gg/server/admin/team/data/TeamUserAdminRepository.java +++ b/src/main/java/com/gg/server/admin/team/data/TeamUserAdminRepository.java @@ -1,17 +1,17 @@ -package com.gg.server.admin.team.data; - -import com.gg.server.domain.team.data.TeamUser; -import com.gg.server.domain.user.data.User; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.util.List; - -public interface TeamUserAdminRepository extends JpaRepository { - @Query("SELECT tu.user FROM TeamUser tu WHERE tu.team.id = :teamId") - List findUsersByTeamId(@Param("teamId") Long teamId); - - @Query("SELECT tu FROM TeamUser tu, Team t WHERE tu.team.id IN (:teamId) AND t.id = tu.team.id") - List findUsersByTeamIdIn(@Param("teamId") List teamId); -} +package com.gg.server.admin.team.data; + +import com.gg.server.domain.team.data.TeamUser; +import com.gg.server.domain.user.data.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +public interface TeamUserAdminRepository extends JpaRepository { + @Query("SELECT tu.user FROM TeamUser tu WHERE tu.team.id = :teamId") + List findUsersByTeamId(@Param("teamId") Long teamId); + + @Query("SELECT tu FROM TeamUser tu, Team t WHERE tu.team.id IN (:teamId) AND t.id = tu.team.id") + List findUsersByTeamIdIn(@Param("teamId") List teamId); +} diff --git a/src/main/java/com/gg/server/admin/user/data/UserAdminRepository.java b/src/main/java/com/gg/server/admin/user/data/UserAdminRepository.java index 5253a8b24..3eb4712ea 100644 --- a/src/main/java/com/gg/server/admin/user/data/UserAdminRepository.java +++ b/src/main/java/com/gg/server/admin/user/data/UserAdminRepository.java @@ -1,15 +1,15 @@ -package com.gg.server.admin.user.data; - -import com.gg.server.domain.user.data.User; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.Optional; - -public interface UserAdminRepository extends JpaRepository { - Optional findByIntraId(String intraId); - Page findByIntraIdContains(Pageable pageable, String intraId); - Page findByIntraId(Pageable pageable, String intraId); - Page findAll(Pageable pageable); -} +package com.gg.server.admin.user.data; + +import com.gg.server.domain.user.data.User; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface UserAdminRepository extends JpaRepository { + Optional findByIntraId(String intraId); + Page findByIntraIdContains(Pageable pageable, String intraId); + Page findByIntraId(Pageable pageable, String intraId); + Page findAll(Pageable pageable); +} diff --git a/src/main/java/com/gg/server/admin/user/dto/UserAdminDto.java b/src/main/java/com/gg/server/admin/user/dto/UserAdminDto.java index 41c56418b..30e12eb66 100644 --- a/src/main/java/com/gg/server/admin/user/dto/UserAdminDto.java +++ b/src/main/java/com/gg/server/admin/user/dto/UserAdminDto.java @@ -1,53 +1,53 @@ -package com.gg.server.admin.user.dto; - -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.type.RacketType; -import com.gg.server.domain.user.type.RoleType; -import com.gg.server.domain.user.type.SnsType; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class UserAdminDto { - private Long id; - private String intraId; - private String eMail; - private String imageUri; - private RacketType racketType; - private RoleType roleType; - private Integer totalExp; - private SnsType snsNotiOpt; - - static public UserAdminDto from (User user) { - UserAdminDto userDto; - if (user == null) { - userDto = null; - } else { - userDto = UserAdminDto.builder() - .id(user.getId()) - .intraId(user.getIntraId()) - .eMail(user.getEMail()) - .imageUri(user.getImageUri()) - .racketType(user.getRacketType()) - .roleType(user.getRoleType()) - .totalExp(user.getTotalExp()) - .snsNotiOpt(user.getSnsNotiOpt()) - .build(); - } - return userDto; - } - - @Override - public String toString() { - return "UserDto{" + - "id=" + id + - ", intraId='" + intraId + '\'' + - ", eMail='" + eMail + '\'' + - ", imageUri='" + imageUri + '\'' + - ", racketType=" + racketType + '\'' + - ", roleType=" + roleType + '\'' + - ", totalExp=" + totalExp + - '}'; - } -} +package com.gg.server.admin.user.dto; + +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.type.RacketType; +import com.gg.server.domain.user.type.RoleType; +import com.gg.server.domain.user.type.SnsType; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class UserAdminDto { + private Long id; + private String intraId; + private String eMail; + private String imageUri; + private RacketType racketType; + private RoleType roleType; + private Integer totalExp; + private SnsType snsNotiOpt; + + static public UserAdminDto from (User user) { + UserAdminDto userDto; + if (user == null) { + userDto = null; + } else { + userDto = UserAdminDto.builder() + .id(user.getId()) + .intraId(user.getIntraId()) + .eMail(user.getEMail()) + .imageUri(user.getImageUri()) + .racketType(user.getRacketType()) + .roleType(user.getRoleType()) + .totalExp(user.getTotalExp()) + .snsNotiOpt(user.getSnsNotiOpt()) + .build(); + } + return userDto; + } + + @Override + public String toString() { + return "UserDto{" + + "id=" + id + + ", intraId='" + intraId + '\'' + + ", eMail='" + eMail + '\'' + + ", imageUri='" + imageUri + '\'' + + ", racketType=" + racketType + '\'' + + ", roleType=" + roleType + '\'' + + ", totalExp=" + totalExp + + '}'; + } +} diff --git a/src/main/java/com/gg/server/admin/user/dto/UserDetailAdminResponseDto.java b/src/main/java/com/gg/server/admin/user/dto/UserDetailAdminResponseDto.java index 09e2f30a1..e5c8ebd7a 100644 --- a/src/main/java/com/gg/server/admin/user/dto/UserDetailAdminResponseDto.java +++ b/src/main/java/com/gg/server/admin/user/dto/UserDetailAdminResponseDto.java @@ -1,67 +1,67 @@ -package com.gg.server.admin.user.dto; - -import com.gg.server.domain.rank.redis.RankRedis; -import com.gg.server.domain.user.data.User; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@AllArgsConstructor -@NoArgsConstructor -public class UserDetailAdminResponseDto { - private Long userId; - private String intraId; - private String userImageUri; - private String racketType; - private String statusMessage; - private Integer wins; - private Integer losses; - private Integer ppp; - private String email; - private String roleType; - private Integer exp; - - public UserDetailAdminResponseDto(User user, RankRedis rank) { - this.userId = user.getId(); - this.intraId = user.getIntraId(); - this.userImageUri = user.getImageUri(); - this.racketType = user.getRacketType().getCode(); - this.statusMessage = rank.getStatusMessage(); - this.wins = rank.getWins(); - this.losses = rank.getLosses(); - this.ppp = rank.getPpp(); - this.email = user.getEMail(); - this.roleType = user.getRoleType().getKey(); - this.exp = user.getTotalExp(); - } - - public UserDetailAdminResponseDto(User user) { - this.userId = user.getId(); - this.intraId = user.getIntraId(); - this.userImageUri = user.getImageUri(); - this.racketType = user.getRacketType().getCode(); - this.statusMessage = ""; - this.wins = 0; - this.losses = 0; - this.ppp = 0; - this.email = user.getEMail() == null ? "" : user.getEMail(); - this.roleType = user.getRoleType().getKey(); - this.exp = user.getTotalExp(); - } - - @Override - public String toString() { - return "UserDetailResponseDto{" + - "intraId='" + intraId + '\'' + - ", userImageUri='" + userImageUri + '\'' + - ", racketType='" + racketType + '\'' + - ", statusMessage='" + statusMessage + '\'' + - ", wins='" + wins.toString() + '\'' + - ", losses='" + losses.toString() + '\'' + - ", ppp='" + ppp.toString() + '\'' + - ", email='" + email + '\'' + - ", roleType='" + roleType + '\'' + - '}'; - } -} +package com.gg.server.admin.user.dto; + +import com.gg.server.domain.rank.redis.RankRedis; +import com.gg.server.domain.user.data.User; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class UserDetailAdminResponseDto { + private Long userId; + private String intraId; + private String userImageUri; + private String racketType; + private String statusMessage; + private Integer wins; + private Integer losses; + private Integer ppp; + private String email; + private String roleType; + private Integer exp; + + public UserDetailAdminResponseDto(User user, RankRedis rank) { + this.userId = user.getId(); + this.intraId = user.getIntraId(); + this.userImageUri = user.getImageUri(); + this.racketType = user.getRacketType().getCode(); + this.statusMessage = rank.getStatusMessage(); + this.wins = rank.getWins(); + this.losses = rank.getLosses(); + this.ppp = rank.getPpp(); + this.email = user.getEMail(); + this.roleType = user.getRoleType().getKey(); + this.exp = user.getTotalExp(); + } + + public UserDetailAdminResponseDto(User user) { + this.userId = user.getId(); + this.intraId = user.getIntraId(); + this.userImageUri = user.getImageUri(); + this.racketType = user.getRacketType().getCode(); + this.statusMessage = ""; + this.wins = 0; + this.losses = 0; + this.ppp = 0; + this.email = user.getEMail() == null ? "" : user.getEMail(); + this.roleType = user.getRoleType().getKey(); + this.exp = user.getTotalExp(); + } + + @Override + public String toString() { + return "UserDetailResponseDto{" + + "intraId='" + intraId + '\'' + + ", userImageUri='" + userImageUri + '\'' + + ", racketType='" + racketType + '\'' + + ", statusMessage='" + statusMessage + '\'' + + ", wins='" + wins.toString() + '\'' + + ", losses='" + losses.toString() + '\'' + + ", ppp='" + ppp.toString() + '\'' + + ", email='" + email + '\'' + + ", roleType='" + roleType + '\'' + + '}'; + } +} diff --git a/src/main/java/com/gg/server/admin/user/dto/UserSearchAdminDto.java b/src/main/java/com/gg/server/admin/user/dto/UserSearchAdminDto.java index 2c233b415..a354e9a96 100644 --- a/src/main/java/com/gg/server/admin/user/dto/UserSearchAdminDto.java +++ b/src/main/java/com/gg/server/admin/user/dto/UserSearchAdminDto.java @@ -1,32 +1,32 @@ -package com.gg.server.admin.user.dto; - -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.type.RoleType; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor -public class UserSearchAdminDto { - private Long id; - private String intraId; - private String statusMessage; - private RoleType roleType; - - public UserSearchAdminDto (User user, String statusMessage) { - this.id = user.getId(); - this.intraId = user.getIntraId(); - this.statusMessage = statusMessage; - this.roleType = user.getRoleType(); - } - - @Override - public String toString() { - return "UserAdminDto{" + - "id=" + id + - ", intraId='" + intraId + '\'' + - ", statusMessage='" + statusMessage + '\'' + - ", roleType=" + roleType + - '}'; - } -} +package com.gg.server.admin.user.dto; + +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.type.RoleType; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class UserSearchAdminDto { + private Long id; + private String intraId; + private String statusMessage; + private RoleType roleType; + + public UserSearchAdminDto (User user, String statusMessage) { + this.id = user.getId(); + this.intraId = user.getIntraId(); + this.statusMessage = statusMessage; + this.roleType = user.getRoleType(); + } + + @Override + public String toString() { + return "UserAdminDto{" + + "id=" + id + + ", intraId='" + intraId + '\'' + + ", statusMessage='" + statusMessage + '\'' + + ", roleType=" + roleType + + '}'; + } +} diff --git a/src/main/java/com/gg/server/admin/user/dto/UserSearchAdminResponseDto.java b/src/main/java/com/gg/server/admin/user/dto/UserSearchAdminResponseDto.java index 63c811e93..9fe6df5ec 100644 --- a/src/main/java/com/gg/server/admin/user/dto/UserSearchAdminResponseDto.java +++ b/src/main/java/com/gg/server/admin/user/dto/UserSearchAdminResponseDto.java @@ -1,22 +1,22 @@ -package com.gg.server.admin.user.dto; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.List; -import java.util.stream.Collectors; - -@Getter -@AllArgsConstructor -public class UserSearchAdminResponseDto { - private List userSearchAdminDtos; - private Integer totalPage; - - public void filterUser(String filterString) { - if (filterString == null) - return ; - this.userSearchAdminDtos = this.userSearchAdminDtos.stream() - .filter(userSearchAdminDto -> userSearchAdminDto.getIntraId().equals(filterString)) - .collect(Collectors.toList()); - } -} +package com.gg.server.admin.user.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.List; +import java.util.stream.Collectors; + +@Getter +@AllArgsConstructor +public class UserSearchAdminResponseDto { + private List userSearchAdminDtos; + private Integer totalPage; + + public void filterUser(String filterString) { + if (filterString == null) + return ; + this.userSearchAdminDtos = this.userSearchAdminDtos.stream() + .filter(userSearchAdminDto -> userSearchAdminDto.getIntraId().equals(filterString)) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java index 2137cc094..d2438e87d 100644 --- a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java +++ b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java @@ -1,116 +1,116 @@ -package com.gg.server.admin.user.service; -import com.gg.server.admin.rank.service.RankRedisAdminService; -import com.gg.server.admin.season.data.SeasonAdminRepository; -import com.gg.server.admin.user.data.UserAdminRepository; -import com.gg.server.admin.user.dto.UserDetailAdminResponseDto; -import com.gg.server.admin.user.dto.UserSearchAdminDto; -import com.gg.server.admin.user.dto.UserSearchAdminResponseDto; -import com.gg.server.admin.user.dto.UserUpdateAdminRequestDto; -import com.gg.server.domain.rank.data.Rank; -import com.gg.server.domain.rank.data.RankRepository; -import com.gg.server.domain.rank.exception.RankNotFoundException; -import com.gg.server.domain.rank.exception.RedisDataNotFoundException; -import com.gg.server.domain.rank.redis.RankRedis; -import com.gg.server.domain.rank.redis.RankRedisRepository; -import com.gg.server.domain.rank.redis.RedisKeyManager; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.season.exception.SeasonNotFoundException; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.exception.UserNotFoundException; -import com.gg.server.domain.user.service.UserFindService; -import com.gg.server.global.utils.aws.AsyncNewUserImageUploader; -import lombok.AllArgsConstructor; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -@Service -@AllArgsConstructor -public class UserAdminService { - - private final UserAdminRepository userAdminRepository; - private final SeasonAdminRepository seasonAdminRepository; - private final RankRepository rankRepository; - private final RankRedisRepository rankRedisRepository; - private final RankRedisAdminService rankRedisAdminService; - private final AsyncNewUserImageUploader asyncNewUserImageUploader; - private final UserFindService userFindService; - - @Transactional(readOnly = true) - public UserSearchAdminResponseDto searchAll(Pageable pageable) { - Page userPage = userAdminRepository.findAll(pageable); - List userSearchAdminDtos = new ArrayList(); - for (User user : userPage.getContent()) - userSearchAdminDtos.add(new UserSearchAdminDto(user, userFindService.getUserStatusMessage(user))); - return new UserSearchAdminResponseDto(userSearchAdminDtos, userPage.getTotalPages()); - } - - @Transactional(readOnly = true) - public UserSearchAdminResponseDto searchByIntraId(Pageable pageable, String intraId) { - Page userPage = userAdminRepository.findByIntraId(pageable, intraId); - List userSearchAdminDtos = new ArrayList(); - for (User user : userPage.getContent()) - userSearchAdminDtos.add(new UserSearchAdminDto(user, userFindService.getUserStatusMessage(user))); - return new UserSearchAdminResponseDto(userSearchAdminDtos, userPage.getTotalPages()); - } - - /* 문자열을 포함하는 intraId를 가진 유저 찾기 */ - @Transactional(readOnly = true) - public UserSearchAdminResponseDto findByPartsOfIntraId(String intraId, Pageable pageable) { - Page userPage = userAdminRepository.findByIntraIdContains(pageable, intraId); - List userSearchAdminDtos = new ArrayList(); - for (User user : userPage.getContent()) - userSearchAdminDtos.add(new UserSearchAdminDto(user, userFindService.getUserStatusMessage(user))); - return new UserSearchAdminResponseDto(userSearchAdminDtos, userPage.getTotalPages()); - } - - @Transactional(readOnly = true) - public UserDetailAdminResponseDto getUserDetailByIntraId(String intraId) { - User user = userAdminRepository.findByIntraId(intraId).orElseThrow(() -> new UserNotFoundException()); - Season currSeason = seasonAdminRepository.findCurrentSeason(LocalDateTime.now()).orElseThrow(() -> new SeasonNotFoundException()); - try { - RankRedis userCurrRank = rankRedisRepository.findRankByUserId(RedisKeyManager.getHashKey(currSeason.getId()), - user.getId()); - return new UserDetailAdminResponseDto(user, userCurrRank); - } catch (RedisDataNotFoundException e){ - return new UserDetailAdminResponseDto(user); - } - } - - @Transactional - public void updateUserDetail(String intraId, - UserUpdateAdminRequestDto userUpdateAdminRequestDto, - MultipartFile userImageFile) throws IOException{ - Season currSeason = seasonAdminRepository.findCurrentSeason(LocalDateTime.now()).orElseThrow(() -> new SeasonNotFoundException()); - User user = userAdminRepository.findByIntraId(intraId).orElseThrow(() -> new UserNotFoundException()); - - user.modifyUserDetail(userUpdateAdminRequestDto); - if (userImageFile != null) - asyncNewUserImageUploader.update(intraId, userImageFile); - updateUserRank(user.getId(), currSeason.getId(), userUpdateAdminRequestDto); - } - - private void updateUserRank(Long userId, Long currSeasonId, UserUpdateAdminRequestDto updateReq) { - Rank userCurrRank = rankRepository.findByUserIdAndSeasonId(userId, currSeasonId).orElseThrow(() -> new RankNotFoundException()); - RankRedis userCurrRankRedis = rankRedisRepository.findRankByUserId(RedisKeyManager.getHashKey(currSeasonId), - userId); - - userCurrRank.modifyUserRank(updateReq); - userCurrRank.setStatusMessage(updateReq.getStatusMessage()); - - userCurrRankRedis.changedRank(updateReq.getPpp(), - updateReq.getWins(), - updateReq.getLosses()); - userCurrRankRedis.setStatusMessage(updateReq.getStatusMessage()); - rankRedisAdminService.updateRankUser(RedisKeyManager.getHashKey(currSeasonId), - RedisKeyManager.getZSetKey(currSeasonId), - userId, userCurrRankRedis); - } -} +package com.gg.server.admin.user.service; +import com.gg.server.admin.rank.service.RankRedisAdminService; +import com.gg.server.admin.season.data.SeasonAdminRepository; +import com.gg.server.admin.user.data.UserAdminRepository; +import com.gg.server.admin.user.dto.UserDetailAdminResponseDto; +import com.gg.server.admin.user.dto.UserSearchAdminDto; +import com.gg.server.admin.user.dto.UserSearchAdminResponseDto; +import com.gg.server.admin.user.dto.UserUpdateAdminRequestDto; +import com.gg.server.domain.rank.data.Rank; +import com.gg.server.domain.rank.data.RankRepository; +import com.gg.server.domain.rank.exception.RankNotFoundException; +import com.gg.server.domain.rank.exception.RedisDataNotFoundException; +import com.gg.server.domain.rank.redis.RankRedis; +import com.gg.server.domain.rank.redis.RankRedisRepository; +import com.gg.server.domain.rank.redis.RedisKeyManager; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.season.exception.SeasonNotFoundException; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.exception.UserNotFoundException; +import com.gg.server.domain.user.service.UserFindService; +import com.gg.server.global.utils.aws.AsyncNewUserImageUploader; +import lombok.AllArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@Service +@AllArgsConstructor +public class UserAdminService { + + private final UserAdminRepository userAdminRepository; + private final SeasonAdminRepository seasonAdminRepository; + private final RankRepository rankRepository; + private final RankRedisRepository rankRedisRepository; + private final RankRedisAdminService rankRedisAdminService; + private final AsyncNewUserImageUploader asyncNewUserImageUploader; + private final UserFindService userFindService; + + @Transactional(readOnly = true) + public UserSearchAdminResponseDto searchAll(Pageable pageable) { + Page userPage = userAdminRepository.findAll(pageable); + List userSearchAdminDtos = new ArrayList(); + for (User user : userPage.getContent()) + userSearchAdminDtos.add(new UserSearchAdminDto(user, userFindService.getUserStatusMessage(user))); + return new UserSearchAdminResponseDto(userSearchAdminDtos, userPage.getTotalPages()); + } + + @Transactional(readOnly = true) + public UserSearchAdminResponseDto searchByIntraId(Pageable pageable, String intraId) { + Page userPage = userAdminRepository.findByIntraId(pageable, intraId); + List userSearchAdminDtos = new ArrayList(); + for (User user : userPage.getContent()) + userSearchAdminDtos.add(new UserSearchAdminDto(user, userFindService.getUserStatusMessage(user))); + return new UserSearchAdminResponseDto(userSearchAdminDtos, userPage.getTotalPages()); + } + + /* 문자열을 포함하는 intraId를 가진 유저 찾기 */ + @Transactional(readOnly = true) + public UserSearchAdminResponseDto findByPartsOfIntraId(String intraId, Pageable pageable) { + Page userPage = userAdminRepository.findByIntraIdContains(pageable, intraId); + List userSearchAdminDtos = new ArrayList(); + for (User user : userPage.getContent()) + userSearchAdminDtos.add(new UserSearchAdminDto(user, userFindService.getUserStatusMessage(user))); + return new UserSearchAdminResponseDto(userSearchAdminDtos, userPage.getTotalPages()); + } + + @Transactional(readOnly = true) + public UserDetailAdminResponseDto getUserDetailByIntraId(String intraId) { + User user = userAdminRepository.findByIntraId(intraId).orElseThrow(() -> new UserNotFoundException()); + Season currSeason = seasonAdminRepository.findCurrentSeason(LocalDateTime.now()).orElseThrow(() -> new SeasonNotFoundException()); + try { + RankRedis userCurrRank = rankRedisRepository.findRankByUserId(RedisKeyManager.getHashKey(currSeason.getId()), + user.getId()); + return new UserDetailAdminResponseDto(user, userCurrRank); + } catch (RedisDataNotFoundException e){ + return new UserDetailAdminResponseDto(user); + } + } + + @Transactional + public void updateUserDetail(String intraId, + UserUpdateAdminRequestDto userUpdateAdminRequestDto, + MultipartFile userImageFile) throws IOException{ + Season currSeason = seasonAdminRepository.findCurrentSeason(LocalDateTime.now()).orElseThrow(() -> new SeasonNotFoundException()); + User user = userAdminRepository.findByIntraId(intraId).orElseThrow(() -> new UserNotFoundException()); + + user.modifyUserDetail(userUpdateAdminRequestDto); + if (userImageFile != null) + asyncNewUserImageUploader.update(intraId, userImageFile); + updateUserRank(user.getId(), currSeason.getId(), userUpdateAdminRequestDto); + } + + private void updateUserRank(Long userId, Long currSeasonId, UserUpdateAdminRequestDto updateReq) { + Rank userCurrRank = rankRepository.findByUserIdAndSeasonId(userId, currSeasonId).orElseThrow(() -> new RankNotFoundException()); + RankRedis userCurrRankRedis = rankRedisRepository.findRankByUserId(RedisKeyManager.getHashKey(currSeasonId), + userId); + + userCurrRank.modifyUserRank(updateReq); + userCurrRank.setStatusMessage(updateReq.getStatusMessage()); + + userCurrRankRedis.changedRank(updateReq.getPpp(), + updateReq.getWins(), + updateReq.getLosses()); + userCurrRankRedis.setStatusMessage(updateReq.getStatusMessage()); + rankRedisAdminService.updateRankUser(RedisKeyManager.getHashKey(currSeasonId), + RedisKeyManager.getZSetKey(currSeasonId), + userId, userCurrRankRedis); + } +} diff --git a/src/main/java/com/gg/server/domain/coin/data/CoinHistory.java b/src/main/java/com/gg/server/domain/coin/data/CoinHistory.java index bf77df74f..9292aebb2 100644 --- a/src/main/java/com/gg/server/domain/coin/data/CoinHistory.java +++ b/src/main/java/com/gg/server/domain/coin/data/CoinHistory.java @@ -1,34 +1,34 @@ -package com.gg.server.domain.coin.data; - -import com.gg.server.domain.user.data.User; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.springframework.data.annotation.CreatedDate; - -import javax.persistence.*; -import java.time.LocalDateTime; - -@NoArgsConstructor -@AllArgsConstructor -@Getter -@Entity -public class CoinHistory { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private User user; - - @Column(name = "history", length = 30) - private String history; - - @Column(name = "amount") - private int amount; - - @CreatedDate - @Column(name = "createdAt", updatable = false, nullable = false) - private LocalDateTime createdAt; +package com.gg.server.domain.coin.data; + +import com.gg.server.domain.user.data.User; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Entity +public class CoinHistory { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + @Column(name = "history", length = 30) + private String history; + + @Column(name = "amount") + private int amount; + + @CreatedDate + @Column(name = "createdAt", updatable = false, nullable = false) + private LocalDateTime createdAt; } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java b/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java index 63d3441c5..165615d7f 100644 --- a/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java +++ b/src/main/java/com/gg/server/domain/coin/data/CoinPolicy.java @@ -1,40 +1,40 @@ -package com.gg.server.domain.coin.data; - -import com.gg.server.domain.user.data.User; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.springframework.data.annotation.CreatedDate; - -import javax.persistence.*; -import java.time.LocalDateTime; - -@NoArgsConstructor -@AllArgsConstructor -@Getter -@Entity -public class CoinPolicy { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private User user; - - @Column(name = "attendance") - private Long attendance; - - @Column(name = "normal") - private Long normal; - - @Column(name = "rankWin") - private Long rankWin; - - @Column(name = "rankLose") - private Long rankLose; - - @CreatedDate - @Column(name = "createdAt", updatable = false, nullable = false) - private LocalDateTime createdAt; +package com.gg.server.domain.coin.data; + +import com.gg.server.domain.user.data.User; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.data.annotation.CreatedDate; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Entity +public class CoinPolicy { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + @Column(name = "attendance") + private Long attendance; + + @Column(name = "normal") + private Long normal; + + @Column(name = "rankWin") + private Long rankWin; + + @Column(name = "rankLose") + private Long rankLose; + + @CreatedDate + @Column(name = "createdAt", updatable = false, nullable = false) + private LocalDateTime createdAt; } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/feedback/controller/FeedbackController.java b/src/main/java/com/gg/server/domain/feedback/controller/FeedbackController.java index b99ae5bf1..b18bd2edd 100644 --- a/src/main/java/com/gg/server/domain/feedback/controller/FeedbackController.java +++ b/src/main/java/com/gg/server/domain/feedback/controller/FeedbackController.java @@ -1,33 +1,33 @@ -package com.gg.server.domain.feedback.controller; - - -import com.gg.server.domain.feedback.dto.FeedbackRequestDto; -import com.gg.server.domain.feedback.service.FeedbackService; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.domain.user.dto.UserDto; -import com.gg.server.global.utils.argumentresolver.Login; -import io.swagger.v3.oas.annotations.Parameter; -import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.validation.Valid; - -@RestController -@RequiredArgsConstructor -@RequestMapping(value = "/pingpong") -public class FeedbackController { - private final FeedbackService feedbackService; - private final UserRepository userRepository; - - @PostMapping(value = "/feedback") - public ResponseEntity feedbackSave(@Valid @RequestBody FeedbackRequestDto feedbackRequestDto, - @Parameter(hidden = true) @Login UserDto user) { - feedbackService.addFeedback(feedbackRequestDto, user.getId()); - return new ResponseEntity(HttpStatus.CREATED); - } -} +package com.gg.server.domain.feedback.controller; + + +import com.gg.server.domain.feedback.dto.FeedbackRequestDto; +import com.gg.server.domain.feedback.service.FeedbackService; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.global.utils.argumentresolver.Login; +import io.swagger.v3.oas.annotations.Parameter; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +@RestController +@RequiredArgsConstructor +@RequestMapping(value = "/pingpong") +public class FeedbackController { + private final FeedbackService feedbackService; + private final UserRepository userRepository; + + @PostMapping(value = "/feedback") + public ResponseEntity feedbackSave(@Valid @RequestBody FeedbackRequestDto feedbackRequestDto, + @Parameter(hidden = true) @Login UserDto user) { + feedbackService.addFeedback(feedbackRequestDto, user.getId()); + return new ResponseEntity(HttpStatus.CREATED); + } +} diff --git a/src/main/java/com/gg/server/domain/feedback/data/Feedback.java b/src/main/java/com/gg/server/domain/feedback/data/Feedback.java index d03b6b042..f70d61947 100644 --- a/src/main/java/com/gg/server/domain/feedback/data/Feedback.java +++ b/src/main/java/com/gg/server/domain/feedback/data/Feedback.java @@ -1,44 +1,44 @@ -package com.gg.server.domain.feedback.data; - -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.feedback.type.FeedbackType; -import com.gg.server.global.utils.BaseTimeEntity; -import lombok.*; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; - -@NoArgsConstructor -@Entity -@Getter -public class Feedback extends BaseTimeEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private User user; - - @NotNull - @Enumerated(EnumType.STRING) - @Column(name = "category", length = 15) - private FeedbackType category; - - @NotNull - @Column(name = "content", length = 600) - private String content; - - @Setter - @NotNull - @Column(name = "is_solved") - private Boolean isSolved; - - @Builder - public Feedback(User user, FeedbackType category, String content) { - this.user = user; - this.category = category; - this.content = content; - this.isSolved = false; - } -} +package com.gg.server.domain.feedback.data; + +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.feedback.type.FeedbackType; +import com.gg.server.global.utils.BaseTimeEntity; +import lombok.*; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; + +@NoArgsConstructor +@Entity +@Getter +public class Feedback extends BaseTimeEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + @NotNull + @Enumerated(EnumType.STRING) + @Column(name = "category", length = 15) + private FeedbackType category; + + @NotNull + @Column(name = "content", length = 600) + private String content; + + @Setter + @NotNull + @Column(name = "is_solved") + private Boolean isSolved; + + @Builder + public Feedback(User user, FeedbackType category, String content) { + this.user = user; + this.category = category; + this.content = content; + this.isSolved = false; + } +} diff --git a/src/main/java/com/gg/server/domain/feedback/dto/FeedbackRequestDto.java b/src/main/java/com/gg/server/domain/feedback/dto/FeedbackRequestDto.java index 7fb56fa10..3755c23aa 100644 --- a/src/main/java/com/gg/server/domain/feedback/dto/FeedbackRequestDto.java +++ b/src/main/java/com/gg/server/domain/feedback/dto/FeedbackRequestDto.java @@ -1,25 +1,25 @@ -package com.gg.server.domain.feedback.dto; - -import com.gg.server.domain.feedback.type.FeedbackType; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.NotNull; - -@Getter -@NoArgsConstructor -public class FeedbackRequestDto { - @NotNull(message = "plz. content") - private FeedbackType category; - @NotNull(message = "plz. content") - @Length(max = 600, message = "plz. maxSizeMessage 600") - private String content; - - @Builder - public FeedbackRequestDto(FeedbackType category, String content) { - this.category = category; - this.content = content; - } -} +package com.gg.server.domain.feedback.dto; + +import com.gg.server.domain.feedback.type.FeedbackType; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotNull; + +@Getter +@NoArgsConstructor +public class FeedbackRequestDto { + @NotNull(message = "plz. content") + private FeedbackType category; + @NotNull(message = "plz. content") + @Length(max = 600, message = "plz. maxSizeMessage 600") + private String content; + + @Builder + public FeedbackRequestDto(FeedbackType category, String content) { + this.category = category; + this.content = content; + } +} diff --git a/src/main/java/com/gg/server/domain/feedback/service/FeedbackService.java b/src/main/java/com/gg/server/domain/feedback/service/FeedbackService.java index 29a99827a..1075f538f 100644 --- a/src/main/java/com/gg/server/domain/feedback/service/FeedbackService.java +++ b/src/main/java/com/gg/server/domain/feedback/service/FeedbackService.java @@ -1,30 +1,30 @@ -package com.gg.server.domain.feedback.service; - -import com.gg.server.domain.feedback.data.Feedback; -import com.gg.server.domain.feedback.data.FeedbackRepository; -import com.gg.server.domain.feedback.dto.FeedbackRequestDto; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@RequiredArgsConstructor -public class FeedbackService { - private final FeedbackRepository feedbackRepository; - private final UserRepository userRepository; - - @Transactional - public void addFeedback(FeedbackRequestDto feedbackRequestDto, Long userId) { - User user = userRepository.findById(userId).orElseThrow(() -> new UsernameNotFoundException("User" + userId)); - - Feedback feedback = Feedback.builder() - .user(user) - .category(feedbackRequestDto.getCategory()) - .content(feedbackRequestDto.getContent()) - .build(); - feedbackRepository.save(feedback); - } -} +package com.gg.server.domain.feedback.service; + +import com.gg.server.domain.feedback.data.Feedback; +import com.gg.server.domain.feedback.data.FeedbackRepository; +import com.gg.server.domain.feedback.dto.FeedbackRequestDto; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class FeedbackService { + private final FeedbackRepository feedbackRepository; + private final UserRepository userRepository; + + @Transactional + public void addFeedback(FeedbackRequestDto feedbackRequestDto, Long userId) { + User user = userRepository.findById(userId).orElseThrow(() -> new UsernameNotFoundException("User" + userId)); + + Feedback feedback = Feedback.builder() + .user(user) + .category(feedbackRequestDto.getCategory()) + .content(feedbackRequestDto.getContent()) + .build(); + feedbackRepository.save(feedback); + } +} diff --git a/src/main/java/com/gg/server/domain/game/service/GameService.java b/src/main/java/com/gg/server/domain/game/service/GameService.java index 7ffc04a9f..2f7262815 100644 --- a/src/main/java/com/gg/server/domain/game/service/GameService.java +++ b/src/main/java/com/gg/server/domain/game/service/GameService.java @@ -1,188 +1,188 @@ -package com.gg.server.domain.game.service; - -import com.gg.server.domain.game.data.Game; -import com.gg.server.domain.game.data.GameRepository; -import com.gg.server.domain.game.dto.*; -import com.gg.server.domain.game.dto.req.NormalResultReqDto; -import com.gg.server.domain.game.dto.req.RankResultReqDto; -import com.gg.server.domain.game.exception.GameNotExistException; -import com.gg.server.domain.pchange.data.PChange; -import com.gg.server.domain.pchange.data.PChangeRepository; -import com.gg.server.domain.pchange.exception.PChangeNotExistException; -import com.gg.server.domain.pchange.service.PChangeService; -import com.gg.server.domain.rank.redis.RankRedisService; -import com.gg.server.domain.game.type.StatusType; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.team.data.TeamUser; -import com.gg.server.domain.team.data.TeamUserRepository; -import com.gg.server.domain.team.exception.TeamIdNotMatchException; -import com.gg.server.global.exception.ErrorCode; -import com.gg.server.global.exception.custom.InvalidParameterException; -import com.gg.server.global.utils.ExpLevelCalculator; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.cache.annotation.Caching; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.*; - -@Service -@RequiredArgsConstructor -@Slf4j -public class GameService { - private final GameRepository gameRepository; - private final TeamUserRepository teamUserRepository; - private final RankRedisService rankRedisService; - private final PChangeService pChangeService; - private final PChangeRepository pChangeRepository; - - private final GameFindService gameFindService; - - @Transactional(readOnly = true) - public GameTeamInfo getUserGameInfo(Long gameId, Long userId) { - List infos = gameRepository.findTeamGameUser(gameId); - if (infos.size() == 0) { - throw new GameNotExistException(); - } - return new GameTeamInfo(infos, userId); - } - - @Transactional - @Caching(evict = { - @CacheEvict(value = "rankGameListByIntra", allEntries = true), - @CacheEvict(value = "rankGameList", allEntries = true), - @CacheEvict(value = "allGameList", allEntries = true), - @CacheEvict(value = "allGameListByUser", allEntries = true) - }) - public synchronized Boolean createRankResult(RankResultReqDto scoreDto, Long userId) { - // 현재 게임 id - Game game = gameFindService.findByGameId(scoreDto.getGameId()); - if (game.getStatus() != StatusType.WAIT && game.getStatus() != StatusType.LIVE) { - return false; - } - return updateScore(game, scoreDto, userId); - } - - @Transactional - @Caching(evict = { - @CacheEvict(value = "normalGameListByIntra", allEntries = true), - @CacheEvict(value = "normalGameList", allEntries = true), - @CacheEvict(value = "allGameList", allEntries = true), - @CacheEvict(value = "allGameListByUser", allEntries = true) - }) - public synchronized Boolean normalExpResult(NormalResultReqDto normalResultReqDto, Long loginUserId) { - Game game = gameFindService.findByGameId(normalResultReqDto.getGameId()); - List teamUsers = teamUserRepository.findAllByGameId(game.getId()); - if (teamUsers.size() == 2 && - (game.getStatus() == StatusType.WAIT || game.getStatus() == StatusType.LIVE)) { - expUpdates(game, teamUsers); - savePChange(game, teamUsers, loginUserId); - return true; - } else if (teamUsers.size() == 2 && game.getStatus() == StatusType.END) { - updatePchangeIsChecked(game, loginUserId); - return true; - } else if (teamUsers.size() != 2) { - throw new InvalidParameterException("team 이 잘못되었습니다.", ErrorCode.VALID_FAILED); - } - return false; - } - - private void updatePchangeIsChecked(Game game, Long loginUserId) { - pChangeRepository.findPChangeByUserIdAndGameId(loginUserId, game.getId()) - .ifPresentOrElse(pChange -> { - pChange.userCheckResult(); - pChangeRepository.save(pChange); - }, () -> { - throw new PChangeNotExistException(); - }); - } - - private void savePChange(Game game, List teamUsers, Long loginUserId) { - Long team1UserId = teamUsers.get(0).getUser().getId(); - Long team2UserId = teamUsers.get(1).getUser().getId(); - pChangeService.addPChange(game, teamUsers.get(0).getUser(), - rankRedisService.getUserPpp(team1UserId, game.getSeason().getId()), team1UserId.equals(loginUserId)); - pChangeService.addPChange(game, teamUsers.get(1).getUser(), - rankRedisService.getUserPpp(team2UserId, game.getSeason().getId()), team2UserId.equals(loginUserId)); - } - - @Transactional(readOnly = true) - public ExpChangeResultResDto expChangeResult(Long gameId, Long userId) { - List pChanges = pChangeService.findExpChangeHistory(gameId, userId); - if (pChanges.size() == 1) { - return new ExpChangeResultResDto(0, pChanges.get(0).getExp()); - } else { - log.info("before:", pChanges.get(1).getExp(), ", after: ", pChanges.get(0).getExp()); - return new ExpChangeResultResDto(pChanges.get(1).getExp(), pChanges.get(0).getExp()); - } - } - - @Transactional(readOnly = true) - public PPPChangeResultResDto pppChangeResult(Long gameId, Long userId) throws PChangeNotExistException { - Season season = gameFindService.findByGameId(gameId).getSeason(); - List pppHistory = pChangeService.findPPPChangeHistory(gameId, userId, season.getId()); - List expHistory = pChangeService.findExpChangeHistory(gameId, userId); - return new PPPChangeResultResDto(expHistory.size() <= 1 ? 0 : expHistory.get(1).getExp(), - pppHistory.get(0).getExp(), - pppHistory.size() <= 1 ? season.getStartPpp() : pppHistory.get(1).getPppResult(), - pppHistory.get(0).getPppResult()); - } - - public void expUpdates(Game game, List teamUsers) { - LocalDateTime time = getToday(game.getStartTime()); - for (TeamUser tu : - teamUsers) { - expUpdate(tu, time); - } - if (game.getStatus() == StatusType.LIVE) { - game.updateStatus(); - } - game.updateStatus(); - } - - private void expUpdate(TeamUser teamUser, LocalDateTime time) { - Integer gamePerDay = teamUserRepository.findByDateAndUser(time, teamUser.getUser().getId()); - teamUser.getUser().addExp(ExpLevelCalculator.getExpPerGame() + (ExpLevelCalculator.getExpBonus() * gamePerDay)); - } - - private static LocalDateTime getToday(LocalDateTime gameTime) { - return LocalDateTime.of(gameTime.getYear(), gameTime.getMonthValue(), gameTime.getDayOfMonth(), 0, 0); - } - - private void setTeamScore(TeamUser tu, int teamScore, Boolean isWin) { - tu.getTeam().updateScore(teamScore, isWin); - } - - private TeamUser findTeamId(Long teamId, List teamUsers) { - for (TeamUser tu : - teamUsers) { - if (tu.getTeam().getId().equals(teamId)) { - return tu; - } - } - throw new TeamIdNotMatchException(); - } - - private Boolean updateScore(Game game, RankResultReqDto scoreDto, Long userId) { - List teams = teamUserRepository.findAllByGameId(game.getId()); - TeamUser myTeam = findTeamId(scoreDto.getMyTeamId(), teams); - TeamUser enemyTeam = findTeamId(scoreDto.getEnemyTeamId(), teams); - if (!myTeam.getUser().getId().equals(userId)) { - throw new InvalidParameterException("team user 정보 불일치.", ErrorCode.VALID_FAILED); - } else { - if (myTeam.getTeam().getScore().equals(-1) && enemyTeam.getTeam().getScore().equals(-1)){ - setTeamScore(myTeam, scoreDto.getMyTeamScore(), scoreDto.getMyTeamScore() > scoreDto.getEnemyTeamScore()); - setTeamScore(enemyTeam, scoreDto.getEnemyTeamScore(), scoreDto.getMyTeamScore() < scoreDto.getEnemyTeamScore()); - expUpdates(game, teams); - rankRedisService.updateRankRedis(myTeam, enemyTeam, game); - } else { - // score 가 이미 입력됨 - return false; - } - return true; - } - } +package com.gg.server.domain.game.service; + +import com.gg.server.domain.game.data.Game; +import com.gg.server.domain.game.data.GameRepository; +import com.gg.server.domain.game.dto.*; +import com.gg.server.domain.game.dto.req.NormalResultReqDto; +import com.gg.server.domain.game.dto.req.RankResultReqDto; +import com.gg.server.domain.game.exception.GameNotExistException; +import com.gg.server.domain.pchange.data.PChange; +import com.gg.server.domain.pchange.data.PChangeRepository; +import com.gg.server.domain.pchange.exception.PChangeNotExistException; +import com.gg.server.domain.pchange.service.PChangeService; +import com.gg.server.domain.rank.redis.RankRedisService; +import com.gg.server.domain.game.type.StatusType; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.team.data.TeamUser; +import com.gg.server.domain.team.data.TeamUserRepository; +import com.gg.server.domain.team.exception.TeamIdNotMatchException; +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.InvalidParameterException; +import com.gg.server.global.utils.ExpLevelCalculator; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Caching; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.*; + +@Service +@RequiredArgsConstructor +@Slf4j +public class GameService { + private final GameRepository gameRepository; + private final TeamUserRepository teamUserRepository; + private final RankRedisService rankRedisService; + private final PChangeService pChangeService; + private final PChangeRepository pChangeRepository; + + private final GameFindService gameFindService; + + @Transactional(readOnly = true) + public GameTeamInfo getUserGameInfo(Long gameId, Long userId) { + List infos = gameRepository.findTeamGameUser(gameId); + if (infos.size() == 0) { + throw new GameNotExistException(); + } + return new GameTeamInfo(infos, userId); + } + + @Transactional + @Caching(evict = { + @CacheEvict(value = "rankGameListByIntra", allEntries = true), + @CacheEvict(value = "rankGameList", allEntries = true), + @CacheEvict(value = "allGameList", allEntries = true), + @CacheEvict(value = "allGameListByUser", allEntries = true) + }) + public synchronized Boolean createRankResult(RankResultReqDto scoreDto, Long userId) { + // 현재 게임 id + Game game = gameFindService.findByGameId(scoreDto.getGameId()); + if (game.getStatus() != StatusType.WAIT && game.getStatus() != StatusType.LIVE) { + return false; + } + return updateScore(game, scoreDto, userId); + } + + @Transactional + @Caching(evict = { + @CacheEvict(value = "normalGameListByIntra", allEntries = true), + @CacheEvict(value = "normalGameList", allEntries = true), + @CacheEvict(value = "allGameList", allEntries = true), + @CacheEvict(value = "allGameListByUser", allEntries = true) + }) + public synchronized Boolean normalExpResult(NormalResultReqDto normalResultReqDto, Long loginUserId) { + Game game = gameFindService.findByGameId(normalResultReqDto.getGameId()); + List teamUsers = teamUserRepository.findAllByGameId(game.getId()); + if (teamUsers.size() == 2 && + (game.getStatus() == StatusType.WAIT || game.getStatus() == StatusType.LIVE)) { + expUpdates(game, teamUsers); + savePChange(game, teamUsers, loginUserId); + return true; + } else if (teamUsers.size() == 2 && game.getStatus() == StatusType.END) { + updatePchangeIsChecked(game, loginUserId); + return true; + } else if (teamUsers.size() != 2) { + throw new InvalidParameterException("team 이 잘못되었습니다.", ErrorCode.VALID_FAILED); + } + return false; + } + + private void updatePchangeIsChecked(Game game, Long loginUserId) { + pChangeRepository.findPChangeByUserIdAndGameId(loginUserId, game.getId()) + .ifPresentOrElse(pChange -> { + pChange.userCheckResult(); + pChangeRepository.save(pChange); + }, () -> { + throw new PChangeNotExistException(); + }); + } + + private void savePChange(Game game, List teamUsers, Long loginUserId) { + Long team1UserId = teamUsers.get(0).getUser().getId(); + Long team2UserId = teamUsers.get(1).getUser().getId(); + pChangeService.addPChange(game, teamUsers.get(0).getUser(), + rankRedisService.getUserPpp(team1UserId, game.getSeason().getId()), team1UserId.equals(loginUserId)); + pChangeService.addPChange(game, teamUsers.get(1).getUser(), + rankRedisService.getUserPpp(team2UserId, game.getSeason().getId()), team2UserId.equals(loginUserId)); + } + + @Transactional(readOnly = true) + public ExpChangeResultResDto expChangeResult(Long gameId, Long userId) { + List pChanges = pChangeService.findExpChangeHistory(gameId, userId); + if (pChanges.size() == 1) { + return new ExpChangeResultResDto(0, pChanges.get(0).getExp()); + } else { + log.info("before:", pChanges.get(1).getExp(), ", after: ", pChanges.get(0).getExp()); + return new ExpChangeResultResDto(pChanges.get(1).getExp(), pChanges.get(0).getExp()); + } + } + + @Transactional(readOnly = true) + public PPPChangeResultResDto pppChangeResult(Long gameId, Long userId) throws PChangeNotExistException { + Season season = gameFindService.findByGameId(gameId).getSeason(); + List pppHistory = pChangeService.findPPPChangeHistory(gameId, userId, season.getId()); + List expHistory = pChangeService.findExpChangeHistory(gameId, userId); + return new PPPChangeResultResDto(expHistory.size() <= 1 ? 0 : expHistory.get(1).getExp(), + pppHistory.get(0).getExp(), + pppHistory.size() <= 1 ? season.getStartPpp() : pppHistory.get(1).getPppResult(), + pppHistory.get(0).getPppResult()); + } + + public void expUpdates(Game game, List teamUsers) { + LocalDateTime time = getToday(game.getStartTime()); + for (TeamUser tu : + teamUsers) { + expUpdate(tu, time); + } + if (game.getStatus() == StatusType.LIVE) { + game.updateStatus(); + } + game.updateStatus(); + } + + private void expUpdate(TeamUser teamUser, LocalDateTime time) { + Integer gamePerDay = teamUserRepository.findByDateAndUser(time, teamUser.getUser().getId()); + teamUser.getUser().addExp(ExpLevelCalculator.getExpPerGame() + (ExpLevelCalculator.getExpBonus() * gamePerDay)); + } + + private static LocalDateTime getToday(LocalDateTime gameTime) { + return LocalDateTime.of(gameTime.getYear(), gameTime.getMonthValue(), gameTime.getDayOfMonth(), 0, 0); + } + + private void setTeamScore(TeamUser tu, int teamScore, Boolean isWin) { + tu.getTeam().updateScore(teamScore, isWin); + } + + private TeamUser findTeamId(Long teamId, List teamUsers) { + for (TeamUser tu : + teamUsers) { + if (tu.getTeam().getId().equals(teamId)) { + return tu; + } + } + throw new TeamIdNotMatchException(); + } + + private Boolean updateScore(Game game, RankResultReqDto scoreDto, Long userId) { + List teams = teamUserRepository.findAllByGameId(game.getId()); + TeamUser myTeam = findTeamId(scoreDto.getMyTeamId(), teams); + TeamUser enemyTeam = findTeamId(scoreDto.getEnemyTeamId(), teams); + if (!myTeam.getUser().getId().equals(userId)) { + throw new InvalidParameterException("team user 정보 불일치.", ErrorCode.VALID_FAILED); + } else { + if (myTeam.getTeam().getScore().equals(-1) && enemyTeam.getTeam().getScore().equals(-1)){ + setTeamScore(myTeam, scoreDto.getMyTeamScore(), scoreDto.getMyTeamScore() > scoreDto.getEnemyTeamScore()); + setTeamScore(enemyTeam, scoreDto.getEnemyTeamScore(), scoreDto.getMyTeamScore() < scoreDto.getEnemyTeamScore()); + expUpdates(game, teams); + rankRedisService.updateRankRedis(myTeam, enemyTeam, game); + } else { + // score 가 이미 입력됨 + return false; + } + return true; + } + } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/item/data/Item.java b/src/main/java/com/gg/server/domain/item/data/Item.java index ecbc94484..af29b98be 100644 --- a/src/main/java/com/gg/server/domain/item/data/Item.java +++ b/src/main/java/com/gg/server/domain/item/data/Item.java @@ -1,52 +1,52 @@ -package com.gg.server.domain.item.data; - -import lombok.Getter; -import lombok.NoArgsConstructor; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; - -@Entity -@Getter -@NoArgsConstructor -public class Item { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "name", length = 30) - private String name; - - @Column(name = "content", length = 255) - private String content; - - @Column(name = "image_uri", length = 255) - private String imageUri; - - @NotNull - @Column(name = "price") - private Integer price; - - @NotNull - @Column(name = "is_visible") - private Boolean isVisible; - - @Column(name = "discount") - private Integer discount; - - @NotNull - @Column(name = "created_at") - private LocalDateTime createdAt; - - public Item(String name, String content, String imageUri, Integer price, - Boolean isVisible, Integer discount, LocalDateTime createdAt) { - this.name = name; - this.content = content; - this.imageUri = imageUri; - this.price = price; - this.isVisible = isVisible; - this.discount = discount; - this.createdAt = createdAt; - } +package com.gg.server.domain.item.data; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Entity +@Getter +@NoArgsConstructor +public class Item { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "name", length = 30) + private String name; + + @Column(name = "content", length = 255) + private String content; + + @Column(name = "image_uri", length = 255) + private String imageUri; + + @NotNull + @Column(name = "price") + private Integer price; + + @NotNull + @Column(name = "is_visible") + private Boolean isVisible; + + @Column(name = "discount") + private Integer discount; + + @NotNull + @Column(name = "created_at") + private LocalDateTime createdAt; + + public Item(String name, String content, String imageUri, Integer price, + Boolean isVisible, Integer discount, LocalDateTime createdAt) { + this.name = name; + this.content = content; + this.imageUri = imageUri; + this.price = price; + this.isVisible = isVisible; + this.discount = discount; + this.createdAt = createdAt; + } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/match/dto/MatchStatusDto.java b/src/main/java/com/gg/server/domain/match/dto/MatchStatusDto.java index c16e52569..0deaadf91 100644 --- a/src/main/java/com/gg/server/domain/match/dto/MatchStatusDto.java +++ b/src/main/java/com/gg/server/domain/match/dto/MatchStatusDto.java @@ -1,57 +1,57 @@ -package com.gg.server.domain.match.dto; - -import com.fasterxml.jackson.annotation.JsonFormat; -import com.gg.server.domain.game.data.Game; -import com.gg.server.domain.match.data.RedisMatchTime; -import com.gg.server.domain.slotmanagement.SlotManagement; - -import java.time.LocalDateTime; -import java.util.List; - -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class MatchStatusDto { - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm", timezone = "Asia/Seoul") - private LocalDateTime startTime; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm", timezone = "Asia/Seoul") - private LocalDateTime endTime; - private Boolean isMatched; - private Boolean isImminent; - private List myTeam; - private List enemyTeam; - - public MatchStatusDto(Game game, String userIntraId, String enemyIntraId, SlotManagement slotManagement) { - this.startTime = game.getStartTime(); - this.endTime = game.getEndTime(); - this.isMatched = true; - this.isImminent = game.getStartTime().minusMinutes(slotManagement.getOpenMinute()) - .isBefore(LocalDateTime.now()); - this.myTeam = List.of(userIntraId); - this.enemyTeam = List.of(enemyIntraId); - - } - - public MatchStatusDto(RedisMatchTime redisMatchTime, Integer interval) { - this.startTime = redisMatchTime.getStartTime(); - this.endTime = redisMatchTime.getStartTime().plusMinutes(interval); - this.isMatched = false; - this.isImminent = false; - this.myTeam = List.of(); - this.enemyTeam = List.of(); - } - - @Override - public String toString() { - return "CurrentMatchResponseDto{" + - "startTime=" + startTime + - "endTIme=" + endTime + - ", myTeam=" + myTeam + - ", enemyTeam=" + enemyTeam + - ", isMatched=" + isMatched + - '}'; - } -} +package com.gg.server.domain.match.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.gg.server.domain.game.data.Game; +import com.gg.server.domain.match.data.RedisMatchTime; +import com.gg.server.domain.slotmanagement.SlotManagement; + +import java.time.LocalDateTime; +import java.util.List; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class MatchStatusDto { + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm", timezone = "Asia/Seoul") + private LocalDateTime startTime; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm", timezone = "Asia/Seoul") + private LocalDateTime endTime; + private Boolean isMatched; + private Boolean isImminent; + private List myTeam; + private List enemyTeam; + + public MatchStatusDto(Game game, String userIntraId, String enemyIntraId, SlotManagement slotManagement) { + this.startTime = game.getStartTime(); + this.endTime = game.getEndTime(); + this.isMatched = true; + this.isImminent = game.getStartTime().minusMinutes(slotManagement.getOpenMinute()) + .isBefore(LocalDateTime.now()); + this.myTeam = List.of(userIntraId); + this.enemyTeam = List.of(enemyIntraId); + + } + + public MatchStatusDto(RedisMatchTime redisMatchTime, Integer interval) { + this.startTime = redisMatchTime.getStartTime(); + this.endTime = redisMatchTime.getStartTime().plusMinutes(interval); + this.isMatched = false; + this.isImminent = false; + this.myTeam = List.of(); + this.enemyTeam = List.of(); + } + + @Override + public String toString() { + return "CurrentMatchResponseDto{" + + "startTime=" + startTime + + "endTIme=" + endTime + + ", myTeam=" + myTeam + + ", enemyTeam=" + enemyTeam + + ", isMatched=" + isMatched + + '}'; + } +} diff --git a/src/main/java/com/gg/server/domain/match/service/GameUpdateService.java b/src/main/java/com/gg/server/domain/match/service/GameUpdateService.java index 75b906f02..e64ab102d 100644 --- a/src/main/java/com/gg/server/domain/match/service/GameUpdateService.java +++ b/src/main/java/com/gg/server/domain/match/service/GameUpdateService.java @@ -1,71 +1,71 @@ -package com.gg.server.domain.match.service; - -import com.gg.server.domain.game.data.Game; -import com.gg.server.domain.game.data.GameRepository; -import com.gg.server.domain.match.dto.GameAddDto; -import com.gg.server.domain.match.exception.SlotNotFoundException; -import com.gg.server.domain.noti.data.Noti; -import com.gg.server.domain.noti.service.NotiService; -import com.gg.server.domain.noti.service.SnsNotiService; -import com.gg.server.domain.slotmanagement.SlotManagement; -import com.gg.server.domain.slotmanagement.data.SlotManagementRepository; -import com.gg.server.domain.team.data.Team; -import com.gg.server.domain.team.data.TeamRepository; -import com.gg.server.domain.team.data.TeamUser; -import com.gg.server.domain.team.data.TeamUserRepository; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.domain.user.dto.UserDto; -import com.gg.server.domain.user.exception.UserNotFoundException; -import java.time.LocalDateTime; -import java.util.List; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class GameUpdateService { - private final GameRepository gameRepository; - private final TeamRepository teamRepository; - private final UserRepository userRepository; - private final TeamUserRepository teamUserRepository; - private final SlotManagementRepository slotManagementRepository; - private final NotiService notiService; - private final SnsNotiService snsNotiService; - - public void make(GameAddDto addDto) { - SlotManagement slotManagement = slotManagementRepository.findCurrent(LocalDateTime.now()) - .orElseThrow(SlotNotFoundException::new); - Game game = new Game(addDto, slotManagement.getGameInterval()); - gameRepository.save(game); - Team enemyTeam = new Team(game, -1, false); - Team myTeam = new Team(game, -1, false); - List matchPair = List.of(enemyTeam, myTeam); - teamRepository.saveAll(matchPair); - User playerUser = userRepository.findById(addDto.getPlayerId()).orElseThrow(UserNotFoundException::new); - User enemyUser = userRepository.findById(addDto.getEnemyId()).orElseThrow(UserNotFoundException::new); - TeamUser myTeamUser = new TeamUser(myTeam, playerUser); - TeamUser enemyTeamUser = new TeamUser(enemyTeam, enemyUser); - List matchTeamUser = List.of(enemyTeamUser, myTeamUser); - teamUserRepository.saveAll(matchTeamUser); - Noti playerNoti = notiService.createMatched(playerUser, addDto.getStartTime()); - snsNotiService.sendSnsNotification(playerNoti, UserDto.from(playerUser)); - Noti enemyNoti = notiService.createMatched(enemyUser, addDto.getStartTime()); - snsNotiService.sendSnsNotification(enemyNoti, UserDto.from(enemyUser)); - } - - /** - * game 매칭된 user 이외에 다른 user가 취소할 경우, 에러 발생 - */ - public void delete(Game game, UserDto userDto) { - List enemyTeam = userRepository.findEnemyByGameAndUser(game.getId(), userDto.getId()); - if (enemyTeam.size() > 1) { - throw new SlotNotFoundException(); - } - enemyTeam.forEach(enemy -> { - Noti noti = notiService.createMatchCancel(enemy, game.getStartTime()); - snsNotiService.sendSnsNotification(noti, UserDto.from(enemy)); - }); - gameRepository.delete(game); - } -} +package com.gg.server.domain.match.service; + +import com.gg.server.domain.game.data.Game; +import com.gg.server.domain.game.data.GameRepository; +import com.gg.server.domain.match.dto.GameAddDto; +import com.gg.server.domain.match.exception.SlotNotFoundException; +import com.gg.server.domain.noti.data.Noti; +import com.gg.server.domain.noti.service.NotiService; +import com.gg.server.domain.noti.service.SnsNotiService; +import com.gg.server.domain.slotmanagement.SlotManagement; +import com.gg.server.domain.slotmanagement.data.SlotManagementRepository; +import com.gg.server.domain.team.data.Team; +import com.gg.server.domain.team.data.TeamRepository; +import com.gg.server.domain.team.data.TeamUser; +import com.gg.server.domain.team.data.TeamUserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.domain.user.exception.UserNotFoundException; +import java.time.LocalDateTime; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class GameUpdateService { + private final GameRepository gameRepository; + private final TeamRepository teamRepository; + private final UserRepository userRepository; + private final TeamUserRepository teamUserRepository; + private final SlotManagementRepository slotManagementRepository; + private final NotiService notiService; + private final SnsNotiService snsNotiService; + + public void make(GameAddDto addDto) { + SlotManagement slotManagement = slotManagementRepository.findCurrent(LocalDateTime.now()) + .orElseThrow(SlotNotFoundException::new); + Game game = new Game(addDto, slotManagement.getGameInterval()); + gameRepository.save(game); + Team enemyTeam = new Team(game, -1, false); + Team myTeam = new Team(game, -1, false); + List matchPair = List.of(enemyTeam, myTeam); + teamRepository.saveAll(matchPair); + User playerUser = userRepository.findById(addDto.getPlayerId()).orElseThrow(UserNotFoundException::new); + User enemyUser = userRepository.findById(addDto.getEnemyId()).orElseThrow(UserNotFoundException::new); + TeamUser myTeamUser = new TeamUser(myTeam, playerUser); + TeamUser enemyTeamUser = new TeamUser(enemyTeam, enemyUser); + List matchTeamUser = List.of(enemyTeamUser, myTeamUser); + teamUserRepository.saveAll(matchTeamUser); + Noti playerNoti = notiService.createMatched(playerUser, addDto.getStartTime()); + snsNotiService.sendSnsNotification(playerNoti, UserDto.from(playerUser)); + Noti enemyNoti = notiService.createMatched(enemyUser, addDto.getStartTime()); + snsNotiService.sendSnsNotification(enemyNoti, UserDto.from(enemyUser)); + } + + /** + * game 매칭된 user 이외에 다른 user가 취소할 경우, 에러 발생 + */ + public void delete(Game game, UserDto userDto) { + List enemyTeam = userRepository.findEnemyByGameAndUser(game.getId(), userDto.getId()); + if (enemyTeam.size() > 1) { + throw new SlotNotFoundException(); + } + enemyTeam.forEach(enemy -> { + Noti noti = notiService.createMatchCancel(enemy, game.getStartTime()); + snsNotiService.sendSnsNotification(noti, UserDto.from(enemy)); + }); + gameRepository.delete(game); + } +} diff --git a/src/main/java/com/gg/server/domain/match/service/MatchFindService.java b/src/main/java/com/gg/server/domain/match/service/MatchFindService.java index 1d15ccbfb..5062c3144 100644 --- a/src/main/java/com/gg/server/domain/match/service/MatchFindService.java +++ b/src/main/java/com/gg/server/domain/match/service/MatchFindService.java @@ -1,119 +1,119 @@ -package com.gg.server.domain.match.service; - -import com.gg.server.domain.game.data.Game; -import com.gg.server.domain.game.data.GameRepository; -import com.gg.server.domain.game.type.StatusType; -import com.gg.server.domain.match.data.RedisMatchTime; -import com.gg.server.domain.match.data.RedisMatchTimeRepository; -import com.gg.server.domain.match.data.RedisMatchUser; -import com.gg.server.domain.match.data.RedisMatchUserRepository; -import com.gg.server.domain.match.dto.MatchStatusDto; -import com.gg.server.domain.match.dto.MatchStatusResponseListDto; -import com.gg.server.domain.match.dto.SlotStatusResponseListDto; -import com.gg.server.domain.match.exception.SlotNotFoundException; -import com.gg.server.domain.match.type.Option; -import com.gg.server.domain.match.utils.SlotGenerator; -import com.gg.server.domain.rank.redis.RankRedis; -import com.gg.server.domain.rank.redis.RankRedisRepository; -import com.gg.server.domain.rank.redis.RedisKeyManager; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.season.service.SeasonFindService; -import com.gg.server.domain.slotmanagement.SlotManagement; -import com.gg.server.domain.slotmanagement.data.SlotManagementRepository; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.domain.user.dto.UserDto; -import com.gg.server.domain.user.type.RoleType; -import java.time.LocalDateTime; -import java.util.Comparator; -import java.util.List; -import java.util.Optional; -import java.util.Set; -import java.util.stream.Collectors; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@RequiredArgsConstructor -public class MatchFindService { - private final SlotManagementRepository slotManagementRepository; - private final GameRepository gameRepository; - private final UserRepository userRepository; - private final RedisMatchUserRepository redisMatchUserRepository; - private final SeasonFindService seasonFindService; - private final RankRedisRepository rankRedisRepository; - private final RedisMatchTimeRepository redisMatchTimeRepository; - - - @Transactional(readOnly = true) - public MatchStatusResponseListDto getCurrentMatch(UserDto userDto) { - SlotManagement slotManagement = slotManagementRepository.findCurrent(LocalDateTime.now()) - .orElseThrow(SlotNotFoundException::new); - Optional myGame = gameRepository.findByStatusTypeAndUserId(StatusType.BEFORE, userDto.getId()); - if (myGame.isPresent()) { - List enemyTeam = userRepository.findEnemyByGameAndUser(myGame.get().getId(), userDto.getId()); - return new MatchStatusResponseListDto(List.of(new MatchStatusDto( - myGame.get(), userDto.getIntraId(), enemyTeam.get(0).getIntraId(), slotManagement - ))); - } - Set enrolledSlots = redisMatchUserRepository.getAllMatchTime(userDto.getId()); - List dtos = enrolledSlots.stream() - .map(e -> new MatchStatusDto(e, slotManagement.getGameInterval())) - .sorted(Comparator.comparing(MatchStatusDto::getStartTime)) - .collect(Collectors.toList()); - return new MatchStatusResponseListDto(dtos); - } - - @Transactional(readOnly = true) - public SlotStatusResponseListDto getAllMatchStatus(UserDto userDto, Option option) { - SlotManagement slotManagement = slotManagementRepository.findCurrent(LocalDateTime.now()) - .orElseThrow(SlotNotFoundException::new); - Season season = seasonFindService.findCurrentSeason(LocalDateTime.now()); - RankRedis user; - if (userDto.getRoleType().equals(RoleType.GUEST)) { - user = RankRedis.from(userDto, season.getStartPpp()); - } else { - user = rankRedisRepository. - findRankByUserId(RedisKeyManager.getHashKey(season.getId()), userDto.getId()); - } - SlotGenerator slotGenerator = new SlotGenerator(user, slotManagement, season, option); - List games = gameRepository.findAllBetween(slotGenerator.getNow(), slotGenerator.getMaxTime()); - slotGenerator.addPastSlots(); - slotGenerator.addMatchedSlots(games); - Optional myGame = gameRepository.findByStatusTypeAndUserId(StatusType.BEFORE, userDto.getId()); - if (myGame.isPresent()) { - groupEnrolledSlots(slotGenerator, myGame.get()); - } else { - groupEnrolledSlots(slotGenerator); - } - return slotGenerator.getResponseListDto(); - } - - private void groupEnrolledSlots(SlotGenerator slotGenerator, Game myGame) { - Set enrolledTimes = redisMatchTimeRepository.getAllEnrolledStartTimes(); - slotGenerator.addMySlots(myGame); - Set notMyEnrolledTimes = enrolledTimes.stream().filter(e -> !e.equals(myGame.getStartTime())) - .collect(Collectors.toSet()); - notMyEnrolledTimes.stream().forEach(time -> { - List allMatchUsers = redisMatchTimeRepository.getAllMatchUsers(time); - slotGenerator.groupEnrolledSlot(time, allMatchUsers); - } - ); - } - private void groupEnrolledSlots(SlotGenerator slotGenerator) { - Set enrolledTimes = redisMatchTimeRepository.getAllEnrolledStartTimes(); - Set allMatchTime = redisMatchUserRepository.getAllMatchTime(slotGenerator.getMatchUser().getUserId()); - slotGenerator.addMySlots(allMatchTime); - Set times = allMatchTime.stream().map(RedisMatchTime::getStartTime) - .collect(Collectors.toSet()); - Set notMyEnrolledTimes = enrolledTimes.stream().filter(e -> !times.contains(e)) - .collect(Collectors.toSet()); - notMyEnrolledTimes.stream().forEach( - time -> { - List allMatchUsers = redisMatchTimeRepository.getAllMatchUsers(time); - slotGenerator.groupEnrolledSlot(time, allMatchUsers); - } - ); - } -} +package com.gg.server.domain.match.service; + +import com.gg.server.domain.game.data.Game; +import com.gg.server.domain.game.data.GameRepository; +import com.gg.server.domain.game.type.StatusType; +import com.gg.server.domain.match.data.RedisMatchTime; +import com.gg.server.domain.match.data.RedisMatchTimeRepository; +import com.gg.server.domain.match.data.RedisMatchUser; +import com.gg.server.domain.match.data.RedisMatchUserRepository; +import com.gg.server.domain.match.dto.MatchStatusDto; +import com.gg.server.domain.match.dto.MatchStatusResponseListDto; +import com.gg.server.domain.match.dto.SlotStatusResponseListDto; +import com.gg.server.domain.match.exception.SlotNotFoundException; +import com.gg.server.domain.match.type.Option; +import com.gg.server.domain.match.utils.SlotGenerator; +import com.gg.server.domain.rank.redis.RankRedis; +import com.gg.server.domain.rank.redis.RankRedisRepository; +import com.gg.server.domain.rank.redis.RedisKeyManager; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.season.service.SeasonFindService; +import com.gg.server.domain.slotmanagement.SlotManagement; +import com.gg.server.domain.slotmanagement.data.SlotManagementRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.domain.user.type.RoleType; +import java.time.LocalDateTime; +import java.util.Comparator; +import java.util.List; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class MatchFindService { + private final SlotManagementRepository slotManagementRepository; + private final GameRepository gameRepository; + private final UserRepository userRepository; + private final RedisMatchUserRepository redisMatchUserRepository; + private final SeasonFindService seasonFindService; + private final RankRedisRepository rankRedisRepository; + private final RedisMatchTimeRepository redisMatchTimeRepository; + + + @Transactional(readOnly = true) + public MatchStatusResponseListDto getCurrentMatch(UserDto userDto) { + SlotManagement slotManagement = slotManagementRepository.findCurrent(LocalDateTime.now()) + .orElseThrow(SlotNotFoundException::new); + Optional myGame = gameRepository.findByStatusTypeAndUserId(StatusType.BEFORE, userDto.getId()); + if (myGame.isPresent()) { + List enemyTeam = userRepository.findEnemyByGameAndUser(myGame.get().getId(), userDto.getId()); + return new MatchStatusResponseListDto(List.of(new MatchStatusDto( + myGame.get(), userDto.getIntraId(), enemyTeam.get(0).getIntraId(), slotManagement + ))); + } + Set enrolledSlots = redisMatchUserRepository.getAllMatchTime(userDto.getId()); + List dtos = enrolledSlots.stream() + .map(e -> new MatchStatusDto(e, slotManagement.getGameInterval())) + .sorted(Comparator.comparing(MatchStatusDto::getStartTime)) + .collect(Collectors.toList()); + return new MatchStatusResponseListDto(dtos); + } + + @Transactional(readOnly = true) + public SlotStatusResponseListDto getAllMatchStatus(UserDto userDto, Option option) { + SlotManagement slotManagement = slotManagementRepository.findCurrent(LocalDateTime.now()) + .orElseThrow(SlotNotFoundException::new); + Season season = seasonFindService.findCurrentSeason(LocalDateTime.now()); + RankRedis user; + if (userDto.getRoleType().equals(RoleType.GUEST)) { + user = RankRedis.from(userDto, season.getStartPpp()); + } else { + user = rankRedisRepository. + findRankByUserId(RedisKeyManager.getHashKey(season.getId()), userDto.getId()); + } + SlotGenerator slotGenerator = new SlotGenerator(user, slotManagement, season, option); + List games = gameRepository.findAllBetween(slotGenerator.getNow(), slotGenerator.getMaxTime()); + slotGenerator.addPastSlots(); + slotGenerator.addMatchedSlots(games); + Optional myGame = gameRepository.findByStatusTypeAndUserId(StatusType.BEFORE, userDto.getId()); + if (myGame.isPresent()) { + groupEnrolledSlots(slotGenerator, myGame.get()); + } else { + groupEnrolledSlots(slotGenerator); + } + return slotGenerator.getResponseListDto(); + } + + private void groupEnrolledSlots(SlotGenerator slotGenerator, Game myGame) { + Set enrolledTimes = redisMatchTimeRepository.getAllEnrolledStartTimes(); + slotGenerator.addMySlots(myGame); + Set notMyEnrolledTimes = enrolledTimes.stream().filter(e -> !e.equals(myGame.getStartTime())) + .collect(Collectors.toSet()); + notMyEnrolledTimes.stream().forEach(time -> { + List allMatchUsers = redisMatchTimeRepository.getAllMatchUsers(time); + slotGenerator.groupEnrolledSlot(time, allMatchUsers); + } + ); + } + private void groupEnrolledSlots(SlotGenerator slotGenerator) { + Set enrolledTimes = redisMatchTimeRepository.getAllEnrolledStartTimes(); + Set allMatchTime = redisMatchUserRepository.getAllMatchTime(slotGenerator.getMatchUser().getUserId()); + slotGenerator.addMySlots(allMatchTime); + Set times = allMatchTime.stream().map(RedisMatchTime::getStartTime) + .collect(Collectors.toSet()); + Set notMyEnrolledTimes = enrolledTimes.stream().filter(e -> !times.contains(e)) + .collect(Collectors.toSet()); + notMyEnrolledTimes.stream().forEach( + time -> { + List allMatchUsers = redisMatchTimeRepository.getAllMatchUsers(time); + slotGenerator.groupEnrolledSlot(time, allMatchUsers); + } + ); + } +} diff --git a/src/main/java/com/gg/server/domain/megaphone/data/Megaphone.java b/src/main/java/com/gg/server/domain/megaphone/data/Megaphone.java index d35b41759..43f8f1aab 100644 --- a/src/main/java/com/gg/server/domain/megaphone/data/Megaphone.java +++ b/src/main/java/com/gg/server/domain/megaphone/data/Megaphone.java @@ -1,44 +1,44 @@ -package com.gg.server.domain.megaphone.data; - -import com.gg.server.domain.user.data.User; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; -import java.time.LocalDate; - -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Entity -public class Megaphone { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private User user; - - /* @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "receipt_id") - private Receipt receipt;*/ - - @Column(name = "content", length = 30) - private String content; - - @NotNull - @Column(name = "used_at") - private LocalDate usedAt; - - //public Megaphone(User user, Receipt receipt, String content, LocalDate usedAt) { - public Megaphone(User user, String content, LocalDate usedAt) { - this.user = user; - //this.receipt = receipt; - this.content = content; - this.usedAt = usedAt; - } -} +package com.gg.server.domain.megaphone.data; + +import com.gg.server.domain.user.data.User; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.time.LocalDate; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity +public class Megaphone { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + /* @NotNull + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "receipt_id") + private Receipt receipt;*/ + + @Column(name = "content", length = 30) + private String content; + + @NotNull + @Column(name = "used_at") + private LocalDate usedAt; + + //public Megaphone(User user, Receipt receipt, String content, LocalDate usedAt) { + public Megaphone(User user, String content, LocalDate usedAt) { + this.user = user; + //this.receipt = receipt; + this.content = content; + this.usedAt = usedAt; + } +} diff --git a/src/main/java/com/gg/server/domain/noti/data/Noti.java b/src/main/java/com/gg/server/domain/noti/data/Noti.java index 63c49672b..404d00d3b 100644 --- a/src/main/java/com/gg/server/domain/noti/data/Noti.java +++ b/src/main/java/com/gg/server/domain/noti/data/Noti.java @@ -1,53 +1,53 @@ -package com.gg.server.domain.noti.data; - -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.noti.type.NotiType; -import com.gg.server.global.utils.BaseTimeEntity; -import lombok.*; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; - -@NoArgsConstructor -@AllArgsConstructor -@Getter -@Entity -public class Noti extends BaseTimeEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private User user; - - @NotNull - @Column(name = "noti_type", length = 15) - @Enumerated(EnumType.STRING) - private NotiType type; - - @Column(name = "message", length = 255) - private String message; - - @NotNull - @Column(name = "is_checked") - private Boolean isChecked; - - public Noti(User user, NotiType type, String message, Boolean isChecked) { - this.user = user; - this.type = type; - this.message = message; - this.isChecked = isChecked; - } - - public void update(User user, NotiType type, String message, Boolean isChecked) { - this.user = user; - this.type = type; - this.message = message; - this.isChecked = isChecked; - } - - public void modifyIsChecked(Boolean isChecked) { - this.isChecked = isChecked; - } -} +package com.gg.server.domain.noti.data; + +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.noti.type.NotiType; +import com.gg.server.global.utils.BaseTimeEntity; +import lombok.*; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Entity +public class Noti extends BaseTimeEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + @NotNull + @Column(name = "noti_type", length = 15) + @Enumerated(EnumType.STRING) + private NotiType type; + + @Column(name = "message", length = 255) + private String message; + + @NotNull + @Column(name = "is_checked") + private Boolean isChecked; + + public Noti(User user, NotiType type, String message, Boolean isChecked) { + this.user = user; + this.type = type; + this.message = message; + this.isChecked = isChecked; + } + + public void update(User user, NotiType type, String message, Boolean isChecked) { + this.user = user; + this.type = type; + this.message = message; + this.isChecked = isChecked; + } + + public void modifyIsChecked(Boolean isChecked) { + this.isChecked = isChecked; + } +} diff --git a/src/main/java/com/gg/server/domain/noti/data/NotiRepository.java b/src/main/java/com/gg/server/domain/noti/data/NotiRepository.java index 7c924cb78..fb291af76 100644 --- a/src/main/java/com/gg/server/domain/noti/data/NotiRepository.java +++ b/src/main/java/com/gg/server/domain/noti/data/NotiRepository.java @@ -1,14 +1,14 @@ -package com.gg.server.domain.noti.data; - -import com.gg.server.domain.user.data.User; -import org.springframework.data.jpa.repository.JpaRepository; -import java.util.List; -import java.util.Optional; - -public interface NotiRepository extends JpaRepository, NotiRepositoryCustom { - List findByUser(User user); - Optional findByIdAndUser(Long notiId, User user); - List findAllByUser(User user); - List findAllByUserOrderByIdDesc(User user); - void deleteAllByUser(User user); -} +package com.gg.server.domain.noti.data; + +import com.gg.server.domain.user.data.User; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; +import java.util.Optional; + +public interface NotiRepository extends JpaRepository, NotiRepositoryCustom { + List findByUser(User user); + Optional findByIdAndUser(Long notiId, User user); + List findAllByUser(User user); + List findAllByUserOrderByIdDesc(User user); + void deleteAllByUser(User user); +} diff --git a/src/main/java/com/gg/server/domain/noti/service/NotiService.java b/src/main/java/com/gg/server/domain/noti/service/NotiService.java index c61b36843..5147380bd 100644 --- a/src/main/java/com/gg/server/domain/noti/service/NotiService.java +++ b/src/main/java/com/gg/server/domain/noti/service/NotiService.java @@ -1,98 +1,98 @@ -package com.gg.server.domain.noti.service; - -import com.gg.server.domain.noti.data.Noti; -import com.gg.server.domain.noti.data.NotiRepository; -import com.gg.server.domain.noti.dto.NotiDto; -import com.gg.server.domain.noti.dto.NotiResponseDto; -import com.gg.server.domain.noti.type.NotiType; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.domain.user.dto.UserDto; -import com.gg.server.global.exception.ErrorCode; -import com.gg.server.global.exception.custom.NotExistException; -import lombok.AllArgsConstructor; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.List; -import java.util.stream.Collectors; - -@Service -@AllArgsConstructor -public class NotiService { - private final NotiRepository notiRepository; - private final UserRepository userRepository; - private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm"); - - @Transactional(readOnly = true) - public List findNotiByUser(UserDto userDto) { - User user = userRepository.findById(userDto.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + userDto.getId())); - List notiList = notiRepository.findAllByUserOrderByIdDesc(user); - List notiResponseDtoList = notiList.stream().map(NotiResponseDto::from).collect(Collectors.toList()); - return notiResponseDtoList; - } - - @Transactional - public NotiDto findNotiByIdAndUser(UserDto userDto, Long notiId) { - User user = userRepository.findById(userDto.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + userDto.getId())); - Noti noti = notiRepository.findByIdAndUser(notiId, user).orElseThrow(() -> new NotExistException("요청한 알림을 찾을 수 없습니다.", ErrorCode.NOT_FOUND)); - return NotiDto.from(noti); - } - - @Transactional - public void modifyNotiCheckedByUser(UserDto userDto) { - User user = userRepository.findById(userDto.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + userDto.getId())); - List notis = notiRepository.findAllByUser(user); - notis.forEach(noti -> {noti.modifyIsChecked(true);}); - } - - @Transactional - public void removeNotiById(Long notiId) { - notiRepository.deleteById(notiId); - } - - @Transactional - public void removeAllNotisByUser(UserDto userDto) { - User user = userRepository.findById(userDto.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + userDto.getId())); - notiRepository.deleteAllByUser(user); - } - - @Transactional - public Noti createMatched(User user, LocalDateTime startTime) { - String notiMessage = startTime.format(DateTimeFormatter.ofPattern("HH:mm")) + "에 신청한 매칭이 성사되었습니다."; - Noti noti = new Noti(user, NotiType.MATCHED, notiMessage, false); - notiRepository.save(noti); - return noti; - } - - @Transactional - public Noti createMatchCancel(User user, LocalDateTime startTime) { - String notiMessage = startTime.format(DateTimeFormatter.ofPattern("HH:mm")) + "에 신청한 매칭이 상대에 의해 취소되었습니다."; - Noti noti = new Noti(user, NotiType.CANCELEDBYMAN, notiMessage, false); - notiRepository.save(noti); - return noti; - } - - public Noti createImminentNoti(User user, String enemyIntra, NotiType notiType, Integer gameOpenMinute) { - String msg = "님과 경기 " + gameOpenMinute + "분 전 입니다. 서두르세요!"; - return notiRepository.save(new Noti(user, notiType, msg, false)); - } - - public String getMessage(Noti noti) { - String message; - if (noti.getType() != NotiType.ANNOUNCE) { - message = notiMsg(noti.getType()); - } else { - message = "🧚: \"새로운 알림이 도착했핑.\"\n" + "🧚: \"" + noti.getType().getMessage() + "\"\n\n공지사항: " - + noti.getMessage() + "\n\n 🏓42GG와 함께하는 행복한 탁구생활🏓" + "\n$$지금 즉시 접속$$ ----> https://42gg.kr"; - } - return message; - } - public String notiMsg(NotiType notiType) { - return "🧚: \"새로운 알림이 도착했핑.\"\n" + "🧚: \"" + notiType.getMessage() + "\"\n\n 🏓42GG와 함께하는 행복한 탁구생활🏓" + - "\n$$지금 즉시 접속$$ ----> https://42gg.kr"; - } -} +package com.gg.server.domain.noti.service; + +import com.gg.server.domain.noti.data.Noti; +import com.gg.server.domain.noti.data.NotiRepository; +import com.gg.server.domain.noti.dto.NotiDto; +import com.gg.server.domain.noti.dto.NotiResponseDto; +import com.gg.server.domain.noti.type.NotiType; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.NotExistException; +import lombok.AllArgsConstructor; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@AllArgsConstructor +public class NotiService { + private final NotiRepository notiRepository; + private final UserRepository userRepository; + private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm"); + + @Transactional(readOnly = true) + public List findNotiByUser(UserDto userDto) { + User user = userRepository.findById(userDto.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + userDto.getId())); + List notiList = notiRepository.findAllByUserOrderByIdDesc(user); + List notiResponseDtoList = notiList.stream().map(NotiResponseDto::from).collect(Collectors.toList()); + return notiResponseDtoList; + } + + @Transactional + public NotiDto findNotiByIdAndUser(UserDto userDto, Long notiId) { + User user = userRepository.findById(userDto.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + userDto.getId())); + Noti noti = notiRepository.findByIdAndUser(notiId, user).orElseThrow(() -> new NotExistException("요청한 알림을 찾을 수 없습니다.", ErrorCode.NOT_FOUND)); + return NotiDto.from(noti); + } + + @Transactional + public void modifyNotiCheckedByUser(UserDto userDto) { + User user = userRepository.findById(userDto.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + userDto.getId())); + List notis = notiRepository.findAllByUser(user); + notis.forEach(noti -> {noti.modifyIsChecked(true);}); + } + + @Transactional + public void removeNotiById(Long notiId) { + notiRepository.deleteById(notiId); + } + + @Transactional + public void removeAllNotisByUser(UserDto userDto) { + User user = userRepository.findById(userDto.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + userDto.getId())); + notiRepository.deleteAllByUser(user); + } + + @Transactional + public Noti createMatched(User user, LocalDateTime startTime) { + String notiMessage = startTime.format(DateTimeFormatter.ofPattern("HH:mm")) + "에 신청한 매칭이 성사되었습니다."; + Noti noti = new Noti(user, NotiType.MATCHED, notiMessage, false); + notiRepository.save(noti); + return noti; + } + + @Transactional + public Noti createMatchCancel(User user, LocalDateTime startTime) { + String notiMessage = startTime.format(DateTimeFormatter.ofPattern("HH:mm")) + "에 신청한 매칭이 상대에 의해 취소되었습니다."; + Noti noti = new Noti(user, NotiType.CANCELEDBYMAN, notiMessage, false); + notiRepository.save(noti); + return noti; + } + + public Noti createImminentNoti(User user, String enemyIntra, NotiType notiType, Integer gameOpenMinute) { + String msg = "님과 경기 " + gameOpenMinute + "분 전 입니다. 서두르세요!"; + return notiRepository.save(new Noti(user, notiType, msg, false)); + } + + public String getMessage(Noti noti) { + String message; + if (noti.getType() != NotiType.ANNOUNCE) { + message = notiMsg(noti.getType()); + } else { + message = "🧚: \"새로운 알림이 도착했핑.\"\n" + "🧚: \"" + noti.getType().getMessage() + "\"\n\n공지사항: " + + noti.getMessage() + "\n\n 🏓42GG와 함께하는 행복한 탁구생활🏓" + "\n$$지금 즉시 접속$$ ----> https://42gg.kr"; + } + return message; + } + public String notiMsg(NotiType notiType) { + return "🧚: \"새로운 알림이 도착했핑.\"\n" + "🧚: \"" + notiType.getMessage() + "\"\n\n 🏓42GG와 함께하는 행복한 탁구생활🏓" + + "\n$$지금 즉시 접속$$ ----> https://42gg.kr"; + } +} diff --git a/src/main/java/com/gg/server/domain/pchange/data/PChange.java b/src/main/java/com/gg/server/domain/pchange/data/PChange.java index d513b2173..d75e1644f 100644 --- a/src/main/java/com/gg/server/domain/pchange/data/PChange.java +++ b/src/main/java/com/gg/server/domain/pchange/data/PChange.java @@ -1,72 +1,72 @@ -package com.gg.server.domain.pchange.data; - -import com.gg.server.domain.game.data.Game; -import com.gg.server.domain.user.data.User; -import com.gg.server.global.utils.BaseTimeEntity; -import lombok.*; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; - -@NoArgsConstructor -@AllArgsConstructor -@Entity -@Getter -public class PChange extends BaseTimeEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "game_id") - private Game game; - - @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private User user; - - @NotNull - @Column(name = "ppp_result") - private Integer pppResult; - - @NotNull - @Column(name = "exp") - private Integer exp; - - @NotNull - @Column(name = "is_checked") - private Boolean isChecked; - - public PChange(Game game, User user, Integer pppResult, Boolean isChecked) { - this.game = game; - this.user = user; - this.pppResult = pppResult; - this.exp = user.getTotalExp(); - this.isChecked = isChecked; - } - - public void userCheckResult() { - this.isChecked = true; - } - - public void checkPChange() { - this.isChecked = true; - } - public void updatePPP(Integer ppp) { - this.pppResult = ppp; - } - - @Override - public String toString() { - return "PChange{" + - "id=" + id + - ", game=" + game + - ", user=" + user + - ", pppResult=" + pppResult + - ", exp=" + exp + - ", isChecked=" + isChecked + - '}'; - } -} +package com.gg.server.domain.pchange.data; + +import com.gg.server.domain.game.data.Game; +import com.gg.server.domain.user.data.User; +import com.gg.server.global.utils.BaseTimeEntity; +import lombok.*; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; + +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Getter +public class PChange extends BaseTimeEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "game_id") + private Game game; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + @NotNull + @Column(name = "ppp_result") + private Integer pppResult; + + @NotNull + @Column(name = "exp") + private Integer exp; + + @NotNull + @Column(name = "is_checked") + private Boolean isChecked; + + public PChange(Game game, User user, Integer pppResult, Boolean isChecked) { + this.game = game; + this.user = user; + this.pppResult = pppResult; + this.exp = user.getTotalExp(); + this.isChecked = isChecked; + } + + public void userCheckResult() { + this.isChecked = true; + } + + public void checkPChange() { + this.isChecked = true; + } + public void updatePPP(Integer ppp) { + this.pppResult = ppp; + } + + @Override + public String toString() { + return "PChange{" + + "id=" + id + + ", game=" + game + + ", user=" + user + + ", pppResult=" + pppResult + + ", exp=" + exp + + ", isChecked=" + isChecked + + '}'; + } +} diff --git a/src/main/java/com/gg/server/domain/pchange/service/PChangeService.java b/src/main/java/com/gg/server/domain/pchange/service/PChangeService.java index fd572adb4..9b95778b0 100644 --- a/src/main/java/com/gg/server/domain/pchange/service/PChangeService.java +++ b/src/main/java/com/gg/server/domain/pchange/service/PChangeService.java @@ -1,40 +1,40 @@ -package com.gg.server.domain.pchange.service; - -import com.gg.server.domain.game.data.Game; -import com.gg.server.domain.pchange.data.PChange; -import com.gg.server.domain.pchange.data.PChangeRepository; -import com.gg.server.domain.user.data.User; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import com.gg.server.domain.pchange.exception.PChangeNotExistException; -import java.util.List; - -@Service -@RequiredArgsConstructor -@Slf4j -public class PChangeService { - private final PChangeRepository pChangeRepository; - - @Transactional - public void addPChange(Game game, User user, Integer pppResult, Boolean isChecked) { - pChangeRepository.save(new PChange(game, user, pppResult, isChecked)); - } - - public List findExpChangeHistory(Long gameId, Long userId) { - List pChanges = pChangeRepository.findExpHistory(userId, gameId); - if (pChanges.isEmpty()) { - throw new PChangeNotExistException(); - } - return pChanges; - } - - public List findPPPChangeHistory(Long gameId, Long userId, Long seasonId) { - List pChanges = pChangeRepository.findPPPHistory(userId, gameId, seasonId); - if (pChanges.isEmpty()) { - throw new PChangeNotExistException(); - } - return pChanges; - } -} +package com.gg.server.domain.pchange.service; + +import com.gg.server.domain.game.data.Game; +import com.gg.server.domain.pchange.data.PChange; +import com.gg.server.domain.pchange.data.PChangeRepository; +import com.gg.server.domain.user.data.User; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.gg.server.domain.pchange.exception.PChangeNotExistException; +import java.util.List; + +@Service +@RequiredArgsConstructor +@Slf4j +public class PChangeService { + private final PChangeRepository pChangeRepository; + + @Transactional + public void addPChange(Game game, User user, Integer pppResult, Boolean isChecked) { + pChangeRepository.save(new PChange(game, user, pppResult, isChecked)); + } + + public List findExpChangeHistory(Long gameId, Long userId) { + List pChanges = pChangeRepository.findExpHistory(userId, gameId); + if (pChanges.isEmpty()) { + throw new PChangeNotExistException(); + } + return pChanges; + } + + public List findPPPChangeHistory(Long gameId, Long userId, Long seasonId) { + List pChanges = pChangeRepository.findPPPHistory(userId, gameId, seasonId); + if (pChanges.isEmpty()) { + throw new PChangeNotExistException(); + } + return pChanges; + } +} diff --git a/src/main/java/com/gg/server/domain/penalty/data/Penalty.java b/src/main/java/com/gg/server/domain/penalty/data/Penalty.java index 2281b65b8..f187edfb4 100644 --- a/src/main/java/com/gg/server/domain/penalty/data/Penalty.java +++ b/src/main/java/com/gg/server/domain/penalty/data/Penalty.java @@ -1,54 +1,54 @@ -package com.gg.server.domain.penalty.data; - -import com.gg.server.domain.penalty.type.PenaltyType; -import com.gg.server.domain.user.data.User; -import com.gg.server.global.utils.BaseTimeEntity; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; - -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Entity -public class Penalty extends BaseTimeEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private User user; - - @NotNull - @Column(name = "penalty_type", length = 20) - @Enumerated(EnumType.STRING) - private PenaltyType type; - - @Column(name = "message", length = 100) - private String message; - - @NotNull - @Column(name = "start_time") - private LocalDateTime startTime; - - @NotNull - @Column(name = "penalty_time") - private Integer penaltyTime; - - public Penalty(User user, PenaltyType type, String message, LocalDateTime startTime, Integer penaltyTime) { - this.user = user; - this.type = type; - this.message = message; - this.startTime = startTime; - this.penaltyTime = penaltyTime; - } - - public void updateStartTime(LocalDateTime startTime) { - this.startTime = startTime; - } -} +package com.gg.server.domain.penalty.data; + +import com.gg.server.domain.penalty.type.PenaltyType; +import com.gg.server.domain.user.data.User; +import com.gg.server.global.utils.BaseTimeEntity; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity +public class Penalty extends BaseTimeEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + @NotNull + @Column(name = "penalty_type", length = 20) + @Enumerated(EnumType.STRING) + private PenaltyType type; + + @Column(name = "message", length = 100) + private String message; + + @NotNull + @Column(name = "start_time") + private LocalDateTime startTime; + + @NotNull + @Column(name = "penalty_time") + private Integer penaltyTime; + + public Penalty(User user, PenaltyType type, String message, LocalDateTime startTime, Integer penaltyTime) { + this.user = user; + this.type = type; + this.message = message; + this.startTime = startTime; + this.penaltyTime = penaltyTime; + } + + public void updateStartTime(LocalDateTime startTime) { + this.startTime = startTime; + } +} diff --git a/src/main/java/com/gg/server/domain/penalty/service/PenaltyService.java b/src/main/java/com/gg/server/domain/penalty/service/PenaltyService.java index 9880f726d..ed680721d 100644 --- a/src/main/java/com/gg/server/domain/penalty/service/PenaltyService.java +++ b/src/main/java/com/gg/server/domain/penalty/service/PenaltyService.java @@ -1,53 +1,53 @@ -package com.gg.server.domain.penalty.service; - -import com.gg.server.domain.penalty.data.Penalty; -import com.gg.server.domain.penalty.data.PenaltyRepository; -import com.gg.server.domain.penalty.redis.PenaltyUserRedisRepository; -import com.gg.server.domain.penalty.redis.RedisPenaltyUser; -import com.gg.server.domain.penalty.type.PenaltyType; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.dto.UserDto; -import com.gg.server.domain.user.service.UserFindService; - -import java.time.LocalDateTime; -import java.util.Optional; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class PenaltyService { - private final PenaltyRepository penaltyRepository; - private final PenaltyUserRedisRepository penaltyUserRedisRepository; - private final UserFindService userFindService; - - /** - * penalty 1분 부여 - * **/ - public void givePenalty(UserDto userDto, Integer penaltyMinutes) { - - User user = userFindService.findUserById(userDto.getId()); - Optional redisPenaltyUser = penaltyUserRedisRepository - .findByIntraId(userDto.getIntraId()); - LocalDateTime releaseTime; - RedisPenaltyUser penaltyUser; - Penalty penalty; - LocalDateTime now = LocalDateTime.now(); - if (redisPenaltyUser.isPresent()) { - releaseTime = redisPenaltyUser.get().getReleaseTime().plusMinutes(penaltyMinutes); - penaltyUser = new RedisPenaltyUser(userDto.getIntraId(), redisPenaltyUser.get().getPenaltyTime() + penaltyMinutes, - releaseTime, redisPenaltyUser.get().getStartTime(), "[AUTO] 매칭 취소"); - penalty = new Penalty(user, PenaltyType.CANCEL, "[AUTO] 매칭 취소", redisPenaltyUser.get().getReleaseTime(), penaltyMinutes); - } else { - releaseTime = now.plusMinutes(penaltyMinutes); - penaltyUser = new RedisPenaltyUser(user.getIntraId(), penaltyMinutes, releaseTime, now, "[AUTO] 매칭 취소"); - penalty = new Penalty(user, PenaltyType.CANCEL, "[AUTO] 매칭 취소", now, penaltyMinutes); - } - penaltyRepository.save(penalty); - penaltyUserRedisRepository.addPenaltyUser(penaltyUser, releaseTime); - } - - public Boolean isPenaltyUser(String intraId) { - return penaltyUserRedisRepository.findByIntraId(intraId).isPresent(); - } -} +package com.gg.server.domain.penalty.service; + +import com.gg.server.domain.penalty.data.Penalty; +import com.gg.server.domain.penalty.data.PenaltyRepository; +import com.gg.server.domain.penalty.redis.PenaltyUserRedisRepository; +import com.gg.server.domain.penalty.redis.RedisPenaltyUser; +import com.gg.server.domain.penalty.type.PenaltyType; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.domain.user.service.UserFindService; + +import java.time.LocalDateTime; +import java.util.Optional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class PenaltyService { + private final PenaltyRepository penaltyRepository; + private final PenaltyUserRedisRepository penaltyUserRedisRepository; + private final UserFindService userFindService; + + /** + * penalty 1분 부여 + * **/ + public void givePenalty(UserDto userDto, Integer penaltyMinutes) { + + User user = userFindService.findUserById(userDto.getId()); + Optional redisPenaltyUser = penaltyUserRedisRepository + .findByIntraId(userDto.getIntraId()); + LocalDateTime releaseTime; + RedisPenaltyUser penaltyUser; + Penalty penalty; + LocalDateTime now = LocalDateTime.now(); + if (redisPenaltyUser.isPresent()) { + releaseTime = redisPenaltyUser.get().getReleaseTime().plusMinutes(penaltyMinutes); + penaltyUser = new RedisPenaltyUser(userDto.getIntraId(), redisPenaltyUser.get().getPenaltyTime() + penaltyMinutes, + releaseTime, redisPenaltyUser.get().getStartTime(), "[AUTO] 매칭 취소"); + penalty = new Penalty(user, PenaltyType.CANCEL, "[AUTO] 매칭 취소", redisPenaltyUser.get().getReleaseTime(), penaltyMinutes); + } else { + releaseTime = now.plusMinutes(penaltyMinutes); + penaltyUser = new RedisPenaltyUser(user.getIntraId(), penaltyMinutes, releaseTime, now, "[AUTO] 매칭 취소"); + penalty = new Penalty(user, PenaltyType.CANCEL, "[AUTO] 매칭 취소", now, penaltyMinutes); + } + penaltyRepository.save(penalty); + penaltyUserRedisRepository.addPenaltyUser(penaltyUser, releaseTime); + } + + public Boolean isPenaltyUser(String intraId) { + return penaltyUserRedisRepository.findByIntraId(intraId).isPresent(); + } +} diff --git a/src/main/java/com/gg/server/domain/rank/data/Rank.java b/src/main/java/com/gg/server/domain/rank/data/Rank.java index fe30e94b5..aaf069519 100644 --- a/src/main/java/com/gg/server/domain/rank/data/Rank.java +++ b/src/main/java/com/gg/server/domain/rank/data/Rank.java @@ -1,94 +1,94 @@ -package com.gg.server.domain.rank.data; - -import com.gg.server.admin.user.dto.UserUpdateAdminRequestDto; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.tier.data.Tier; -import com.gg.server.domain.user.data.User; -import com.gg.server.global.utils.BaseTimeEntity; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; -import java.io.Serializable; - -@Entity -@Getter -@Builder -@NoArgsConstructor -@AllArgsConstructor -@Table(name="ranks") -public class Rank extends BaseTimeEntity implements Serializable { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private User user; - - @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "season_id") - private Season season; - - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "tier_id") - private Tier tier; - - @NotNull - @Column(name = "ppp") - private Integer ppp; - - @NotNull - @Column(name = "wins") - private Integer wins; - - @NotNull - @Column(name = "losses") - private Integer losses; - - @Column(name = "status_message", length = 30) - private String statusMessage; - - - public static Rank from (User user, Season season, Integer ppp) { - return Rank.builder() - .user(user) - .ppp(ppp) - .season(season) - .wins(0) - .losses(0) - .statusMessage("") - .build(); - } - - @Builder - public Rank(User user, Season season, Integer ppp, Integer wins, - Integer losses, String statusMessage) { - this.user = user; - this.season = season; - this.ppp = ppp; - this.wins = wins; - this.losses = losses; - this.statusMessage = statusMessage; - } - - public void setStatusMessage(String statusMessage) { - this.statusMessage = statusMessage; - } - - public void modifyUserRank(UserUpdateAdminRequestDto userUpdateAdminRequestDto) { - this.ppp = userUpdateAdminRequestDto.getPpp(); - this.wins = userUpdateAdminRequestDto.getWins(); - this.losses = userUpdateAdminRequestDto.getLosses(); - } - - public void modifyUserRank(Integer ppp, int wins, int losses) { - this.ppp = ppp; - this.wins = wins; - this.losses = losses; - } -} +package com.gg.server.domain.rank.data; + +import com.gg.server.admin.user.dto.UserUpdateAdminRequestDto; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.tier.data.Tier; +import com.gg.server.domain.user.data.User; +import com.gg.server.global.utils.BaseTimeEntity; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Entity +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Table(name="ranks") +public class Rank extends BaseTimeEntity implements Serializable { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "season_id") + private Season season; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "tier_id") + private Tier tier; + + @NotNull + @Column(name = "ppp") + private Integer ppp; + + @NotNull + @Column(name = "wins") + private Integer wins; + + @NotNull + @Column(name = "losses") + private Integer losses; + + @Column(name = "status_message", length = 30) + private String statusMessage; + + + public static Rank from (User user, Season season, Integer ppp) { + return Rank.builder() + .user(user) + .ppp(ppp) + .season(season) + .wins(0) + .losses(0) + .statusMessage("") + .build(); + } + + @Builder + public Rank(User user, Season season, Integer ppp, Integer wins, + Integer losses, String statusMessage) { + this.user = user; + this.season = season; + this.ppp = ppp; + this.wins = wins; + this.losses = losses; + this.statusMessage = statusMessage; + } + + public void setStatusMessage(String statusMessage) { + this.statusMessage = statusMessage; + } + + public void modifyUserRank(UserUpdateAdminRequestDto userUpdateAdminRequestDto) { + this.ppp = userUpdateAdminRequestDto.getPpp(); + this.wins = userUpdateAdminRequestDto.getWins(); + this.losses = userUpdateAdminRequestDto.getLosses(); + } + + public void modifyUserRank(Integer ppp, int wins, int losses) { + this.ppp = ppp; + this.wins = wins; + this.losses = losses; + } +} diff --git a/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java b/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java index 3786ceeea..ff854ffb8 100644 --- a/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java +++ b/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java @@ -1,29 +1,29 @@ -package com.gg.server.domain.rank.dto; - -import com.gg.server.domain.user.data.User; -import com.gg.server.global.utils.ExpLevelCalculator; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class ExpRankDto { - private String intraId; - private Integer rank; - private String statusMessage; - private Integer level; - private Integer exp; - private String userImageUri; - - public static ExpRankDto from (User user, Integer rank, String statusMessage){ - ExpRankDto dto = ExpRankDto.builder() - .intraId(user.getIntraId()) - .rank(user.getTotalExp() == 0 ? -1 : rank) - .statusMessage(statusMessage) - .level(ExpLevelCalculator.getLevel(user.getTotalExp())) - .exp(user.getTotalExp()) - .userImageUri(user.getImageUri()) - .build(); - return dto; - } -} +package com.gg.server.domain.rank.dto; + +import com.gg.server.domain.user.data.User; +import com.gg.server.global.utils.ExpLevelCalculator; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class ExpRankDto { + private String intraId; + private Integer rank; + private String statusMessage; + private Integer level; + private Integer exp; + private String userImageUri; + + public static ExpRankDto from (User user, Integer rank, String statusMessage){ + ExpRankDto dto = ExpRankDto.builder() + .intraId(user.getIntraId()) + .rank(user.getTotalExp() == 0 ? -1 : rank) + .statusMessage(statusMessage) + .level(ExpLevelCalculator.getLevel(user.getTotalExp())) + .exp(user.getTotalExp()) + .userImageUri(user.getImageUri()) + .build(); + return dto; + } +} diff --git a/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java b/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java index a1fafb25c..6a5c28c42 100644 --- a/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java +++ b/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java @@ -1,76 +1,76 @@ -package com.gg.server.domain.rank.redis; - -import com.gg.server.domain.rank.data.Rank; -import com.gg.server.domain.user.dto.UserDto; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import org.springframework.data.redis.core.RedisHash; - -import java.io.Serializable; - -@RedisHash("rank") -@Getter -@Builder -@AllArgsConstructor -public class RankRedis implements Serializable { - - private Long userId; - private String intraId; - private int ppp; - private int wins; - private int losses; - private String statusMessage; - - public void updateRank(int changePpp, int wins, int losses) { - this.ppp += changePpp; - this.wins = wins; - this.losses = losses; - } - - public void changedRank(int ppp, int wins, int losses) { - this.ppp = ppp; - this.wins = wins; - this.losses = losses; - } - - public void setStatusMessage(String msg) { - this.statusMessage = msg; - } - - public static RankRedis from(UserDto user, Integer ppp) { - RankRedis rankRedis = RankRedis.builder() - .userId(user.getId()) - .intraId(user.getIntraId()) - .ppp(ppp) - .wins(0) - .losses(0) - .statusMessage("") - .build(); - return rankRedis; - } - - public static RankRedis from(Rank rank){ - RankRedis rankRedis = RankRedis.builder() - .userId(rank.getUser().getId()) - .intraId(rank.getUser().getIntraId()) - .ppp(rank.getPpp()) - .wins(rank.getWins()) - .losses(rank.getLosses()) - .statusMessage(rank.getStatusMessage()) - .build(); - return rankRedis; - } - - @Override - public String toString() { - return "RankRedis{" + - "userId=" + userId + - ", intraId='" + intraId + '\'' + - ", ppp=" + ppp + - ", wins=" + wins + - ", losses=" + losses + - ", statusMessage='" + statusMessage + '\'' + - '}'; - } -} +package com.gg.server.domain.rank.redis; + +import com.gg.server.domain.rank.data.Rank; +import com.gg.server.domain.user.dto.UserDto; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import org.springframework.data.redis.core.RedisHash; + +import java.io.Serializable; + +@RedisHash("rank") +@Getter +@Builder +@AllArgsConstructor +public class RankRedis implements Serializable { + + private Long userId; + private String intraId; + private int ppp; + private int wins; + private int losses; + private String statusMessage; + + public void updateRank(int changePpp, int wins, int losses) { + this.ppp += changePpp; + this.wins = wins; + this.losses = losses; + } + + public void changedRank(int ppp, int wins, int losses) { + this.ppp = ppp; + this.wins = wins; + this.losses = losses; + } + + public void setStatusMessage(String msg) { + this.statusMessage = msg; + } + + public static RankRedis from(UserDto user, Integer ppp) { + RankRedis rankRedis = RankRedis.builder() + .userId(user.getId()) + .intraId(user.getIntraId()) + .ppp(ppp) + .wins(0) + .losses(0) + .statusMessage("") + .build(); + return rankRedis; + } + + public static RankRedis from(Rank rank){ + RankRedis rankRedis = RankRedis.builder() + .userId(rank.getUser().getId()) + .intraId(rank.getUser().getIntraId()) + .ppp(rank.getPpp()) + .wins(rank.getWins()) + .losses(rank.getLosses()) + .statusMessage(rank.getStatusMessage()) + .build(); + return rankRedis; + } + + @Override + public String toString() { + return "RankRedis{" + + "userId=" + userId + + ", intraId='" + intraId + '\'' + + ", ppp=" + ppp + + ", wins=" + wins + + ", losses=" + losses + + ", statusMessage='" + statusMessage + '\'' + + '}'; + } +} diff --git a/src/main/java/com/gg/server/domain/rank/service/RankService.java b/src/main/java/com/gg/server/domain/rank/service/RankService.java index 4268c5f8c..a1bec3b06 100644 --- a/src/main/java/com/gg/server/domain/rank/service/RankService.java +++ b/src/main/java/com/gg/server/domain/rank/service/RankService.java @@ -1,121 +1,121 @@ -package com.gg.server.domain.rank.service; - -import com.gg.server.domain.rank.dto.ExpRankDto; -import com.gg.server.domain.rank.dto.ExpRankPageResponseDto; -import com.gg.server.domain.rank.dto.RankDto; -import com.gg.server.domain.rank.dto.RankPageResponseDto; -import com.gg.server.domain.rank.exception.RedisDataNotFoundException; -import com.gg.server.domain.rank.redis.RankRedis; -import com.gg.server.domain.rank.redis.RankRedisRepository; -import com.gg.server.domain.rank.redis.RedisKeyManager; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.season.service.SeasonFindService; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.domain.user.dto.UserDto; -import com.gg.server.global.exception.ErrorCode; -import com.gg.server.global.exception.custom.PageNotFoundException; -import lombok.RequiredArgsConstructor; -import org.springframework.context.annotation.Configuration; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -@Service -@Configuration -@RequiredArgsConstructor -public class RankService { - private final UserRepository userRepository; - private final RankRedisRepository redisRepository; - private final SeasonFindService seasonFindService; - - @Transactional(readOnly = true) - public ExpRankPageResponseDto getExpRankPage(PageRequest pageRequest, UserDto curUser) { - - Long myRank = curUser.getTotalExp() == 0 ? -1 : userRepository.findExpRankingByIntraId(curUser.getIntraId()); - Page users = userRepository.findAllByTotalExpGreaterThan(pageRequest, 0); - if(pageRequest.getPageNumber() + 1 > users.getTotalPages()) - throw new PageNotFoundException("페이지가 존재하지 않습니다.", ErrorCode.PAGE_NOT_FOUND); - - List userIds = users.getContent().stream().map(user -> user.getId()).collect(Collectors.toList()); - Season curSeason = seasonFindService.findCurrentSeason(LocalDateTime.now()); - - String hashKey = RedisKeyManager.getHashKey(curSeason.getId()); - List ranks = redisRepository.findRanksByUserIds(hashKey, userIds); - - Integer startRank = pageRequest.getPageSize() * pageRequest.getPageNumber() + 1; - List expRankDtos = new ArrayList<>(); - for(int i = 0; i < ranks.size(); i++) { - RankRedis rank = ranks.get(i); - User user = users.getContent().get(i); - expRankDtos.add(ExpRankDto.from(user, startRank + i, rank.getStatusMessage())); - } - - return new ExpRankPageResponseDto(myRank.intValue(), pageRequest.getPageNumber() + 1, users.getTotalPages(), expRankDtos); - } - - @Transactional(readOnly = true) - public RankPageResponseDto getRankPage(PageRequest pageRequest, UserDto curUser, Long seasonId) { - Season season; - if (seasonId == null || seasonId == 0) { - season = seasonFindService.findCurrentSeason(LocalDateTime.now()); - } else { - season = seasonFindService.findSeasonById(seasonId); - } - int totalPage = calcTotalPage(season, pageRequest.getPageSize()); - if (totalPage == 0) - return returnEmptyRankPage(); - if (pageRequest.getPageNumber() + 1 > totalPage) - throw new PageNotFoundException("페이지가 존재하지 않습니다.", ErrorCode.PAGE_NOT_FOUND); - - int myRank = findMyRank(curUser, season); - int startRank = pageRequest.getPageNumber() * pageRequest.getPageSize(); - int endRank = startRank + pageRequest.getPageSize() - 1; - List rankList = createRankList(startRank, endRank, season); - return new RankPageResponseDto(myRank, pageRequest.getPageNumber() + 1, totalPage, rankList); - } - - private RankPageResponseDto returnEmptyRankPage() { - return new RankPageResponseDto(-1, 1, 1, new ArrayList<>()); - } - - private int findMyRank(UserDto curUser, Season season) { - String zSetKey = RedisKeyManager.getZSetKey(season.getId()); - try { - Long myRank = redisRepository.getRankInZSet(zSetKey, curUser.getId()); - return myRank.intValue() + 1; - } catch (RedisDataNotFoundException e) { - return -1; - } - } - - private int calcTotalPage(Season season, int pageSize) { - String zSetKey = RedisKeyManager.getZSetKey(season.getId()); - try{ - Long totalUserCount = redisRepository.countTotalRank(zSetKey); - return (int) Math.ceil((double) totalUserCount / pageSize); - } catch (RedisDataNotFoundException e) { - return 0; - } - } - - private List createRankList(int startRank, int endRank, Season season) { - String zSetKey = RedisKeyManager.getZSetKey(season.getId()); - String hashKey = RedisKeyManager.getHashKey(season.getId()); - - List userIds = redisRepository.getUserIdsByRangeFromZSet(zSetKey, startRank, endRank); - List userRanks = redisRepository.findRanksByUserIds(hashKey, userIds); - List rankList = new ArrayList<>(); - - for (int i = 0; i < userRanks.size(); i++) { - rankList.add(RankDto.from(userRanks.get(i), ++startRank)); - } - return rankList; - } -} +package com.gg.server.domain.rank.service; + +import com.gg.server.domain.rank.dto.ExpRankDto; +import com.gg.server.domain.rank.dto.ExpRankPageResponseDto; +import com.gg.server.domain.rank.dto.RankDto; +import com.gg.server.domain.rank.dto.RankPageResponseDto; +import com.gg.server.domain.rank.exception.RedisDataNotFoundException; +import com.gg.server.domain.rank.redis.RankRedis; +import com.gg.server.domain.rank.redis.RankRedisRepository; +import com.gg.server.domain.rank.redis.RedisKeyManager; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.season.service.SeasonFindService; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.PageNotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@Configuration +@RequiredArgsConstructor +public class RankService { + private final UserRepository userRepository; + private final RankRedisRepository redisRepository; + private final SeasonFindService seasonFindService; + + @Transactional(readOnly = true) + public ExpRankPageResponseDto getExpRankPage(PageRequest pageRequest, UserDto curUser) { + + Long myRank = curUser.getTotalExp() == 0 ? -1 : userRepository.findExpRankingByIntraId(curUser.getIntraId()); + Page users = userRepository.findAllByTotalExpGreaterThan(pageRequest, 0); + if(pageRequest.getPageNumber() + 1 > users.getTotalPages()) + throw new PageNotFoundException("페이지가 존재하지 않습니다.", ErrorCode.PAGE_NOT_FOUND); + + List userIds = users.getContent().stream().map(user -> user.getId()).collect(Collectors.toList()); + Season curSeason = seasonFindService.findCurrentSeason(LocalDateTime.now()); + + String hashKey = RedisKeyManager.getHashKey(curSeason.getId()); + List ranks = redisRepository.findRanksByUserIds(hashKey, userIds); + + Integer startRank = pageRequest.getPageSize() * pageRequest.getPageNumber() + 1; + List expRankDtos = new ArrayList<>(); + for(int i = 0; i < ranks.size(); i++) { + RankRedis rank = ranks.get(i); + User user = users.getContent().get(i); + expRankDtos.add(ExpRankDto.from(user, startRank + i, rank.getStatusMessage())); + } + + return new ExpRankPageResponseDto(myRank.intValue(), pageRequest.getPageNumber() + 1, users.getTotalPages(), expRankDtos); + } + + @Transactional(readOnly = true) + public RankPageResponseDto getRankPage(PageRequest pageRequest, UserDto curUser, Long seasonId) { + Season season; + if (seasonId == null || seasonId == 0) { + season = seasonFindService.findCurrentSeason(LocalDateTime.now()); + } else { + season = seasonFindService.findSeasonById(seasonId); + } + int totalPage = calcTotalPage(season, pageRequest.getPageSize()); + if (totalPage == 0) + return returnEmptyRankPage(); + if (pageRequest.getPageNumber() + 1 > totalPage) + throw new PageNotFoundException("페이지가 존재하지 않습니다.", ErrorCode.PAGE_NOT_FOUND); + + int myRank = findMyRank(curUser, season); + int startRank = pageRequest.getPageNumber() * pageRequest.getPageSize(); + int endRank = startRank + pageRequest.getPageSize() - 1; + List rankList = createRankList(startRank, endRank, season); + return new RankPageResponseDto(myRank, pageRequest.getPageNumber() + 1, totalPage, rankList); + } + + private RankPageResponseDto returnEmptyRankPage() { + return new RankPageResponseDto(-1, 1, 1, new ArrayList<>()); + } + + private int findMyRank(UserDto curUser, Season season) { + String zSetKey = RedisKeyManager.getZSetKey(season.getId()); + try { + Long myRank = redisRepository.getRankInZSet(zSetKey, curUser.getId()); + return myRank.intValue() + 1; + } catch (RedisDataNotFoundException e) { + return -1; + } + } + + private int calcTotalPage(Season season, int pageSize) { + String zSetKey = RedisKeyManager.getZSetKey(season.getId()); + try{ + Long totalUserCount = redisRepository.countTotalRank(zSetKey); + return (int) Math.ceil((double) totalUserCount / pageSize); + } catch (RedisDataNotFoundException e) { + return 0; + } + } + + private List createRankList(int startRank, int endRank, Season season) { + String zSetKey = RedisKeyManager.getZSetKey(season.getId()); + String hashKey = RedisKeyManager.getHashKey(season.getId()); + + List userIds = redisRepository.getUserIdsByRangeFromZSet(zSetKey, startRank, endRank); + List userRanks = redisRepository.findRanksByUserIds(hashKey, userIds); + List rankList = new ArrayList<>(); + + for (int i = 0; i < userRanks.size(); i++) { + rankList.add(RankDto.from(userRanks.get(i), ++startRank)); + } + return rankList; + } +} diff --git a/src/main/java/com/gg/server/domain/receipt/data/Receipt.java b/src/main/java/com/gg/server/domain/receipt/data/Receipt.java index f79ce2b7e..8a4047628 100644 --- a/src/main/java/com/gg/server/domain/receipt/data/Receipt.java +++ b/src/main/java/com/gg/server/domain/receipt/data/Receipt.java @@ -1,71 +1,71 @@ -package com.gg.server.domain.receipt.data; - -import com.gg.server.domain.item.data.Item; -import com.gg.server.domain.receipt.type.ItemStatus; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; - -@Getter -@NoArgsConstructor -@AllArgsConstructor -@Entity -public class Receipt { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "item_id") - private Item item; - - @NotNull - @Column(name = "purchaser_intra_id") - private String purchaserIntraId; - - @NotNull - @Column(name = "owner_intra_id") - private String ownerIntraId; - - @NotNull - @Enumerated(EnumType.STRING) - private ItemStatus status; - - @NotNull - @Column(name = "created_At") - private LocalDateTime purchasedAt; - - public Receipt(Item item, String purchaserIntraId, String ownerIntraId, - ItemStatus status, LocalDateTime purchasedAt){ - this.item = item; - this.purchaserIntraId = purchaserIntraId; - this.ownerIntraId = ownerIntraId; - this.status = status; - this.purchasedAt = purchasedAt; - } - - @Override - public String toString() { - return "Receipt{" + - "id=" + id + - ", item=" + item + - ", purchaserIntraId='" + purchaserIntraId + '\'' + - ", ownerIntraId='" + ownerIntraId + '\'' + - ", status=" + status + - ", purchasedAt=" + purchasedAt + - '}'; - } - - public void updateStatus() { - if (status == ItemStatus.BEFORE) { - this.status = ItemStatus.USING; - } else { - this.status = ItemStatus.USED; - } - } +package com.gg.server.domain.receipt.data; + +import com.gg.server.domain.item.data.Item; +import com.gg.server.domain.receipt.type.ItemStatus; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Entity +public class Receipt { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "item_id") + private Item item; + + @NotNull + @Column(name = "purchaser_intra_id") + private String purchaserIntraId; + + @NotNull + @Column(name = "owner_intra_id") + private String ownerIntraId; + + @NotNull + @Enumerated(EnumType.STRING) + private ItemStatus status; + + @NotNull + @Column(name = "created_At") + private LocalDateTime purchasedAt; + + public Receipt(Item item, String purchaserIntraId, String ownerIntraId, + ItemStatus status, LocalDateTime purchasedAt){ + this.item = item; + this.purchaserIntraId = purchaserIntraId; + this.ownerIntraId = ownerIntraId; + this.status = status; + this.purchasedAt = purchasedAt; + } + + @Override + public String toString() { + return "Receipt{" + + "id=" + id + + ", item=" + item + + ", purchaserIntraId='" + purchaserIntraId + '\'' + + ", ownerIntraId='" + ownerIntraId + '\'' + + ", status=" + status + + ", purchasedAt=" + purchasedAt + + '}'; + } + + public void updateStatus() { + if (status == ItemStatus.BEFORE) { + this.status = ItemStatus.USING; + } else { + this.status = ItemStatus.USED; + } + } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/receipt/type/ItemStatus.java b/src/main/java/com/gg/server/domain/receipt/type/ItemStatus.java index 0b0622d80..dfec05b5e 100644 --- a/src/main/java/com/gg/server/domain/receipt/type/ItemStatus.java +++ b/src/main/java/com/gg/server/domain/receipt/type/ItemStatus.java @@ -1,14 +1,14 @@ -package com.gg.server.domain.receipt.type; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@RequiredArgsConstructor -public enum ItemStatus { - BEFORE("before", "사용 전"), USING("using", "사용 중"), - USED("used", "사용 완료"); - - private final String code; - private final String desc; +package com.gg.server.domain.receipt.type; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum ItemStatus { + BEFORE("before", "사용 전"), USING("using", "사용 중"), + USED("used", "사용 완료"); + + private final String code; + private final String desc; } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/team/data/TeamUser.java b/src/main/java/com/gg/server/domain/team/data/TeamUser.java index 0d22085bb..e59b40ff2 100644 --- a/src/main/java/com/gg/server/domain/team/data/TeamUser.java +++ b/src/main/java/com/gg/server/domain/team/data/TeamUser.java @@ -1,33 +1,33 @@ -package com.gg.server.domain.team.data; - -import com.gg.server.domain.user.data.User; -import lombok.*; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; - -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor -@Entity -@Getter -@ToString -public class TeamUser { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "team_id") - private Team team; - - @NotNull - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "user_id") - private User user; - - public TeamUser(Team team, User user) { - this.team = team; - this.user = user; - } +package com.gg.server.domain.team.data; + +import com.gg.server.domain.user.data.User; +import lombok.*; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; + +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Entity +@Getter +@ToString +public class TeamUser { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "team_id") + private Team team; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + public TeamUser(Team team, User user) { + this.team = team; + this.user = user; + } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/team/data/TeamUserRepository.java b/src/main/java/com/gg/server/domain/team/data/TeamUserRepository.java index a595a79a1..251f92d18 100644 --- a/src/main/java/com/gg/server/domain/team/data/TeamUserRepository.java +++ b/src/main/java/com/gg/server/domain/team/data/TeamUserRepository.java @@ -1,19 +1,19 @@ -package com.gg.server.domain.team.data; - -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; - -import java.time.LocalDateTime; -import java.util.List; - -public interface TeamUserRepository extends JpaRepository { - @Query(value = "select team_user.id, team_user.team_id, team_user.user_id from team, team_user " + - "where team.game_id =:gid and team.id = team_user.team_id", nativeQuery = true) - List findAllByGameId(Long gid); - - @Query(value = "select count(*) from game, team, team_user " + - "where game.start_time >= :today and team_user.team_id = team.id and team_user.user_id = :userId " + - "and team.game_id = game.id and game.status = 'END'", nativeQuery = true) - Integer findByDateAndUser(LocalDateTime today, Long userId); - -} +package com.gg.server.domain.team.data; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; + +import java.time.LocalDateTime; +import java.util.List; + +public interface TeamUserRepository extends JpaRepository { + @Query(value = "select team_user.id, team_user.team_id, team_user.user_id from team, team_user " + + "where team.game_id =:gid and team.id = team_user.team_id", nativeQuery = true) + List findAllByGameId(Long gid); + + @Query(value = "select count(*) from game, team, team_user " + + "where game.start_time >= :today and team_user.team_id = team.id and team_user.user_id = :userId " + + "and team.game_id = game.id and game.status = 'END'", nativeQuery = true) + Integer findByDateAndUser(LocalDateTime today, Long userId); + +} diff --git a/src/main/java/com/gg/server/domain/tier/data/Tier.java b/src/main/java/com/gg/server/domain/tier/data/Tier.java index 3ff5cc673..79c344b28 100644 --- a/src/main/java/com/gg/server/domain/tier/data/Tier.java +++ b/src/main/java/com/gg/server/domain/tier/data/Tier.java @@ -1,25 +1,25 @@ -package com.gg.server.domain.tier.data; - -import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; - -import javax.persistence.*; - -@Entity -@NoArgsConstructor -@AllArgsConstructor -public class Tier { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(name = "image_uri") - private String imageUri; - - @Column(name = "name") - private String name; - - public Tier(String imageUri) { - this.imageUri = imageUri; - } +package com.gg.server.domain.tier.data; + +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Entity +@NoArgsConstructor +@AllArgsConstructor +public class Tier { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "image_uri") + private String imageUri; + + @Column(name = "name") + private String name; + + public Tier(String imageUri) { + this.imageUri = imageUri; + } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index 96f600d0a..aec467afc 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -1,25 +1,25 @@ package com.gg.server.domain.user.controller; import com.gg.server.domain.game.type.Mode; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.*; import com.gg.server.domain.user.exception.KakaoOauth2AlreadyExistException; -import com.gg.server.domain.user.exception.KakaoOauth2NotFoundException; +import com.gg.server.domain.user.exception.UserNotFoundException; +import com.gg.server.domain.user.exception.UserTextColorException; import com.gg.server.domain.user.service.UserAuthenticationService; import com.gg.server.domain.user.service.UserService; +import com.gg.server.domain.user.service.UserTextColorCheckService; import com.gg.server.domain.user.type.OauthType; import com.gg.server.domain.user.type.RoleType; import com.gg.server.global.security.config.properties.AppProperties; import com.gg.server.global.security.cookie.CookieUtil; -import com.gg.server.global.security.jwt.utils.AuthTokenProvider; import com.gg.server.global.security.jwt.utils.TokenHeaders; -import com.gg.server.global.utils.ApplicationYmlRead; -import com.gg.server.global.utils.HeaderUtil; import com.gg.server.global.utils.argumentresolver.Login; import io.swagger.v3.oas.annotations.Parameter; -import java.io.IOException; -import javax.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.http.HttpStatus; @@ -33,8 +33,10 @@ @RestController @RequiredArgsConstructor @RequestMapping("/pingpong/users") + public class UserController { private final UserService userService; + private final UserTextColorCheckService userTextColorCheck; private final UserAuthenticationService userAuthenticationService; private final AppProperties appProperties; private final CookieUtil cookieUtil; @@ -120,4 +122,15 @@ public UserImageResponseDto getUserImage(@RequestParam(required = false) Long se return userService.getRankedUserImagesByExp(pageRequest); } } + + @PatchMapping ("/text-color") + public void updateTextColor(@RequestBody UserTextColorDto TextColor, @Parameter(hidden = true) @Login UserDto user) { + String textColor = TextColor.getTextColor(); + if (userTextColorCheck.check(textColor)){ + userService.updateTextColor(user.getId() ,textColor); + } + else { + throw new UserTextColorException(); + } + } } diff --git a/src/main/java/com/gg/server/domain/user/data/User.java b/src/main/java/com/gg/server/domain/user/data/User.java index 7151f051a..1b9c2b888 100644 --- a/src/main/java/com/gg/server/domain/user/data/User.java +++ b/src/main/java/com/gg/server/domain/user/data/User.java @@ -1,102 +1,110 @@ -package com.gg.server.domain.user.data; - -import com.gg.server.admin.user.dto.UserUpdateAdminRequestDto; -import com.gg.server.domain.user.type.*; -import com.gg.server.global.utils.BaseTimeEntity; -import lombok.*; - -import javax.persistence.*; -import javax.validation.constraints.NotNull; -import java.io.Serializable; - -@Entity -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class User extends BaseTimeEntity implements Serializable { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @NotNull - @Column(name = "intra_id", length = 30) - private String intraId; - - @Column(name = "e_mail", length = 60) - private String eMail; - - @Column(name = "image_uri") - private String imageUri; - - @Enumerated(EnumType.STRING) - @Column(name = "racket_type", length = 10) - private RacketType racketType; - - @NotNull - @Enumerated(EnumType.STRING) - @Column(name = "role_type", length = 10) - private RoleType roleType; - - @Column(name = "total_exp") - private Integer totalExp; - - @Column(name = "sns_noti_opt", length = 10) - @Enumerated(EnumType.STRING) - private SnsType snsNotiOpt; - - @Column(name = "kakao_id") - private Long kakaoId; - - @Column(name = "gg_coin") - private Integer ggCoin; - - @Column(name = "background") - @Enumerated(EnumType.STRING) - private BackgroundType background; - - @Column(name = "text_color", length = 10) - private String textColor; - - @Column(name = "edge") - @Enumerated(EnumType.STRING) - private EdgeType edge; - - @Builder - public User(String intraId, String eMail, String imageUri, RacketType racketType, - RoleType roleType, Integer totalExp, SnsType snsNotiOpt, Long kakaoId) { - this.intraId = intraId; - this.eMail = eMail; - this.imageUri = imageUri; - this.racketType = racketType; - this.roleType = roleType; - this.totalExp = totalExp; - this.snsNotiOpt = snsNotiOpt; - this.kakaoId = kakaoId; - } - - public void modifyUserDetail(UserUpdateAdminRequestDto updateReq) { - this.eMail = updateReq.getEmail(); - this.racketType = updateReq.getRacketType(); - this.roleType = RoleType.of(updateReq.getRoleType()); - } - - public void imageUpdate(String imageUri) { - this.imageUri = imageUri; - } - - public void updateTypes(RacketType racketType, SnsType snsType) { - this.racketType = racketType; - this.snsNotiOpt = snsType; - } - - public void addExp(int plus) { - this.totalExp += plus; - } - - public void updateExp(int beforeExp) { - this.totalExp = beforeExp; - } - - public void updateKakaoId(Long kakaoId) { - this.kakaoId = kakaoId; - } +package com.gg.server.domain.user.data; + +import com.gg.server.admin.user.dto.UserUpdateAdminRequestDto; +import com.gg.server.domain.user.type.*; +import com.gg.server.global.utils.BaseTimeEntity; +import lombok.*; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class User extends BaseTimeEntity implements Serializable { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @Column(name = "intra_id", length = 30) + private String intraId; + + @Column(name = "e_mail", length = 60) + private String eMail; + + @Column(name = "image_uri") + private String imageUri; + + @Enumerated(EnumType.STRING) + @Column(name = "racket_type", length = 10) + private RacketType racketType; + + @NotNull + @Enumerated(EnumType.STRING) + @Column(name = "role_type", length = 10) + private RoleType roleType; + + @Column(name = "total_exp") + private Integer totalExp; + + @Column(name = "sns_noti_opt", length = 10) + @Enumerated(EnumType.STRING) + private SnsType snsNotiOpt; + + @Column(name = "kakao_id") + private Long kakaoId; + + @Column(name = "gg_coin") + private Integer ggCoin; + + @Column(name = "background") + @Enumerated(EnumType.STRING) + private BackgroundType background; + + @Column(name = "text_color", length = 10) + private String textColor; + + @Column(name = "edge") + @Enumerated(EnumType.STRING) + private EdgeType edge; + + @Builder + public User(String intraId, String eMail, String imageUri, RacketType racketType, + RoleType roleType, Integer totalExp, SnsType snsNotiOpt, Long kakaoId) { + this.intraId = intraId; + this.eMail = eMail; + this.imageUri = imageUri; + this.racketType = racketType; + this.roleType = roleType; + this.totalExp = totalExp; + this.snsNotiOpt = snsNotiOpt; + this.kakaoId = kakaoId; + this.background = BackgroundType.BASIC; + this.textColor = "#000000"; + this.edge = EdgeType.BASIC; + this.ggCoin = 0; + } + + public void modifyUserDetail(UserUpdateAdminRequestDto updateReq) { + this.eMail = updateReq.getEmail(); + this.racketType = updateReq.getRacketType(); + this.roleType = RoleType.of(updateReq.getRoleType()); + } + + public void imageUpdate(String imageUri) { + this.imageUri = imageUri; + } + + public void updateTypes(RacketType racketType, SnsType snsType) { + this.racketType = racketType; + this.snsNotiOpt = snsType; + } + + public void addExp(int plus) { + this.totalExp += plus; + } + + public void updateExp(int beforeExp) { + this.totalExp = beforeExp; + } + + public void updateKakaoId(Long kakaoId) { + this.kakaoId = kakaoId; + } + + public void updateTextColor(String textColor) { + this.textColor = textColor; + } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/user/data/UserImage.java b/src/main/java/com/gg/server/domain/user/data/UserImage.java index d7cfa431c..0af2a37d9 100644 --- a/src/main/java/com/gg/server/domain/user/data/UserImage.java +++ b/src/main/java/com/gg/server/domain/user/data/UserImage.java @@ -1,43 +1,43 @@ -package com.gg.server.domain.userImage; - -import com.gg.server.global.utils.BaseTimeEntity; -import com.sun.istack.NotNull; - -import javax.persistence.*; -import java.io.Serializable; - -public class UserImage extends BaseTimeEntity implements Serializable { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @NotNull - @ManyToOne - @Column(name = "user_id", length = 30) - private String userId; - - @NotNull - @Column(name = "image_url") - private String imageUrl; - - public UserImage(String userId, String imageUrl) { - this.userId = userId; - this.imageUrl = imageUrl; - } - - public String getImageId() { - return imageUrl; - } - - public String getuserId() { - return userId; - } - - public String getUserImageUrl() { - return imageUrl; - } - - public void imageUpdate(String imageUrl) { - this.imageUrl = imageUrl; - } +package com.gg.server.domain.user.data; + +import com.gg.server.global.utils.BaseTimeEntity; +import com.sun.istack.NotNull; + +import javax.persistence.*; +import java.io.Serializable; + +public class UserImage extends BaseTimeEntity implements Serializable { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @ManyToOne + @Column(name = "user_id", length = 30) + private String userId; + + @NotNull + @Column(name = "image_url") + private String imageUrl; + + public UserImage(String userId, String imageUrl) { + this.userId = userId; + this.imageUrl = imageUrl; + } + + public String getImageId() { + return imageUrl; + } + + public String getuserId() { + return userId; + } + + public String getUserImageUrl() { + return imageUrl; + } + + public void imageUpdate(String imageUrl) { + this.imageUrl = imageUrl; + } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/user/data/UserRepository.java b/src/main/java/com/gg/server/domain/user/data/UserRepository.java index 59154e228..225dc8d02 100644 --- a/src/main/java/com/gg/server/domain/user/data/UserRepository.java +++ b/src/main/java/com/gg/server/domain/user/data/UserRepository.java @@ -1,36 +1,36 @@ -package com.gg.server.domain.user.data; - -import java.util.List; - -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.util.Optional; - -public interface UserRepository extends JpaRepository { - Optional findByIntraId(String intraId); - - User getUserByIntraId(String IntraId); - - Page findByIntraIdContains(Pageable pageable, String intraId); - - Page findAllByTotalExpGreaterThan(Pageable pageable, Integer exp); - - Optional findByKakaoId(Long kakaoId); - - @Query(nativeQuery = true, value = "select ranking from " + - "(select intra_id, row_number() over (order by total_exp desc, intra_id asc) as ranking from user) ranked where intra_id=:intraId") - Long findExpRankingByIntraId(@Param("intraId") String intraId); - - Page findAll(Pageable pageable); - - @Query("select tu.user from User u, TeamUser tu, Team t, Game g" + - " where g.id=:gameId and t.game.id =g.id and tu.team.id = t.id " - + "and u.id = tu.user.id and u.id !=:userId") - List findEnemyByGameAndUser(@Param("gameId") Long gameId, @Param("userId") Long userId); - - List findUsersByIdIn(List userIds); -} +package com.gg.server.domain.user.data; + +import java.util.List; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.Optional; + +public interface UserRepository extends JpaRepository { + Optional findByIntraId(String intraId); + + User getUserByIntraId(String IntraId); + + Page findByIntraIdContains(Pageable pageable, String intraId); + + Page findAllByTotalExpGreaterThan(Pageable pageable, Integer exp); + + Optional findByKakaoId(Long kakaoId); + + @Query(nativeQuery = true, value = "select ranking from " + + "(select intra_id, row_number() over (order by total_exp desc, intra_id asc) as ranking from user) ranked where intra_id=:intraId") + Long findExpRankingByIntraId(@Param("intraId") String intraId); + + Page findAll(Pageable pageable); + + @Query("select tu.user from User u, TeamUser tu, Team t, Game g" + + " where g.id=:gameId and t.game.id =g.id and tu.team.id = t.id " + + "and u.id = tu.user.id and u.id !=:userId") + List findEnemyByGameAndUser(@Param("gameId") Long gameId, @Param("userId") Long userId); + + List findUsersByIdIn(List userIds); +} diff --git a/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java b/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java index 1202711e1..254cf93fb 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java @@ -1,37 +1,37 @@ -package com.gg.server.domain.user.dto; - -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.type.SnsType; -import com.gg.server.global.utils.ExpLevelCalculator; -import lombok.*; - -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class UserDetailResponseDto { - private String intraId; - private String userImageUri; - private String racketType; - private String statusMessage; - private Integer level; - private Integer currentExp; - private Integer maxExp; - private Double expRate; - private SnsType snsNotiOpt; - - public UserDetailResponseDto(User user, String statusMessage) { - this.intraId = user.getIntraId(); - this.userImageUri = user.getImageUri(); - this.racketType = user.getRacketType().getCode(); - this.statusMessage = statusMessage; - this.snsNotiOpt = user.getSnsNotiOpt(); - calculateExpAndLevel(user); - } - - private void calculateExpAndLevel(User user) { - this.currentExp = ExpLevelCalculator.getCurrentLevelMyExp(user.getTotalExp()); - this.maxExp = ExpLevelCalculator.getLevelMaxExp(ExpLevelCalculator.getLevel(user.getTotalExp())); - this.level = ExpLevelCalculator.getLevel(user.getTotalExp()); - this.expRate = (double)(currentExp * 10000 / maxExp) / 100; - } - -} +package com.gg.server.domain.user.dto; + +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.type.SnsType; +import com.gg.server.global.utils.ExpLevelCalculator; +import lombok.*; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class UserDetailResponseDto { + private String intraId; + private String userImageUri; + private String racketType; + private String statusMessage; + private Integer level; + private Integer currentExp; + private Integer maxExp; + private Double expRate; + private SnsType snsNotiOpt; + + public UserDetailResponseDto(User user, String statusMessage) { + this.intraId = user.getIntraId(); + this.userImageUri = user.getImageUri(); + this.racketType = user.getRacketType().getCode(); + this.statusMessage = statusMessage; + this.snsNotiOpt = user.getSnsNotiOpt(); + calculateExpAndLevel(user); + } + + private void calculateExpAndLevel(User user) { + this.currentExp = ExpLevelCalculator.getCurrentLevelMyExp(user.getTotalExp()); + this.maxExp = ExpLevelCalculator.getLevelMaxExp(ExpLevelCalculator.getLevel(user.getTotalExp())); + this.level = ExpLevelCalculator.getLevel(user.getTotalExp()); + this.expRate = (double)(currentExp * 10000 / maxExp) / 100; + } + +} diff --git a/src/main/java/com/gg/server/domain/user/dto/UserDto.java b/src/main/java/com/gg/server/domain/user/dto/UserDto.java index dc6242384..37e71d3fe 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserDto.java @@ -1,57 +1,58 @@ -package com.gg.server.domain.user.dto; - -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.type.RacketType; -import com.gg.server.domain.user.type.RoleType; -import com.gg.server.domain.user.type.SnsType; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class UserDto { - private Long id; - private String intraId; - private String eMail; - private String imageUri; - private RacketType racketType; - private RoleType roleType; - private Integer totalExp; - private SnsType snsNotiOpt; - private Long kakaoId; - - static public UserDto from (User user) { - UserDto userDto; - if (user == null) { - userDto = null; - } else { - userDto = UserDto.builder() - .id(user.getId()) - .intraId(user.getIntraId()) - .eMail(user.getEMail()) - .imageUri(user.getImageUri()) - .racketType(user.getRacketType()) - .roleType(user.getRoleType()) - .totalExp(user.getTotalExp()) - .snsNotiOpt(user.getSnsNotiOpt()) - .kakaoId(user.getKakaoId()) - .build(); - } - return userDto; - } - - @Override - public String toString() { - return "UserDto{" + - "id=" + id + - ", intraId='" + intraId + '\'' + - ", eMail='" + eMail + '\'' + - ", imageUri='" + imageUri + '\'' + - ", racketType=" + racketType + - ", roleType=" + roleType + - ", totalExp=" + totalExp + - ", snsNotiOpt=" + snsNotiOpt + - ", kakaoId=" + kakaoId + - '}'; - } -} +package com.gg.server.domain.user.dto; + +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.type.RacketType; +import com.gg.server.domain.user.type.RoleType; +import com.gg.server.domain.user.type.SnsType; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class UserDto { + private Long id; + private String intraId; + private String eMail; + private String imageUri; + private RacketType racketType; + private RoleType roleType; + private Integer totalExp; + private SnsType snsNotiOpt; + private Long kakaoId; + private String textColor; + + static public UserDto from (User user) { + UserDto userDto; + if (user == null) { + userDto = null; + } else { + userDto = UserDto.builder() + .id(user.getId()) + .intraId(user.getIntraId()) + .eMail(user.getEMail()) + .imageUri(user.getImageUri()) + .racketType(user.getRacketType()) + .roleType(user.getRoleType()) + .totalExp(user.getTotalExp()) + .snsNotiOpt(user.getSnsNotiOpt()) + .kakaoId(user.getKakaoId()) + .build(); + } + return userDto; + } + + @Override + public String toString() { + return "UserDto{" + + "id=" + id + + ", intraId='" + intraId + '\'' + + ", eMail='" + eMail + '\'' + + ", imageUri='" + imageUri + '\'' + + ", racketType=" + racketType + + ", roleType=" + roleType + + ", totalExp=" + totalExp + + ", snsNotiOpt=" + snsNotiOpt + + ", kakaoId=" + kakaoId + + '}'; + } +} diff --git a/src/main/java/com/gg/server/domain/user/dto/UserTextColorDto.java b/src/main/java/com/gg/server/domain/user/dto/UserTextColorDto.java new file mode 100644 index 000000000..fd30c9938 --- /dev/null +++ b/src/main/java/com/gg/server/domain/user/dto/UserTextColorDto.java @@ -0,0 +1,12 @@ +package com.gg.server.domain.user.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class UserTextColorDto { + private String textColor; +} diff --git a/src/main/java/com/gg/server/domain/user/exception/UserTextColorException.java b/src/main/java/com/gg/server/domain/user/exception/UserTextColorException.java new file mode 100644 index 000000000..c1c40abea --- /dev/null +++ b/src/main/java/com/gg/server/domain/user/exception/UserTextColorException.java @@ -0,0 +1,10 @@ +package com.gg.server.domain.user.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.CustomRuntimeException; + +public class UserTextColorException extends CustomRuntimeException { + public UserTextColorException() { + super("user text color code is not valid", ErrorCode.USER_TEXT_COLOR_WRONG_TYPE); + } +} diff --git a/src/main/java/com/gg/server/domain/user/service/UserFindService.java b/src/main/java/com/gg/server/domain/user/service/UserFindService.java index c0c682930..304bc9d72 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserFindService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserFindService.java @@ -1,46 +1,46 @@ -package com.gg.server.domain.user.service; - -import com.gg.server.domain.rank.exception.RedisDataNotFoundException; -import com.gg.server.domain.rank.redis.RankRedis; -import com.gg.server.domain.rank.redis.RankRedisRepository; -import com.gg.server.domain.rank.redis.RedisKeyManager; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.season.service.SeasonFindService; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.domain.user.exception.UserNotFoundException; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; - -@Service -@RequiredArgsConstructor -public class UserFindService { - private final UserRepository userRepository; - private final SeasonFindService seasonFindService; - private final RankRedisRepository rankRedisRepository; - - @Transactional(readOnly = true) - public User findUserById(Long userId) { - return userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException()); - } - - @Transactional(readOnly = true) - public User findByIntraId(String intraId){ - return userRepository.findByIntraId(intraId).orElseThrow(() -> new UserNotFoundException()); - } - - @Transactional(readOnly = true) - public String getUserStatusMessage(User targetUser) { - Season currentSeason = seasonFindService.findCurrentSeason(LocalDateTime.now()); - String hashKey = RedisKeyManager.getHashKey(currentSeason.getId()); - try{ - RankRedis userRank = rankRedisRepository.findRankByUserId(hashKey, targetUser.getId()); - return userRank.getStatusMessage(); - }catch (RedisDataNotFoundException e){ - return ""; - } - } -} +package com.gg.server.domain.user.service; + +import com.gg.server.domain.rank.exception.RedisDataNotFoundException; +import com.gg.server.domain.rank.redis.RankRedis; +import com.gg.server.domain.rank.redis.RankRedisRepository; +import com.gg.server.domain.rank.redis.RedisKeyManager; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.season.service.SeasonFindService; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.exception.UserNotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; + +@Service +@RequiredArgsConstructor +public class UserFindService { + private final UserRepository userRepository; + private final SeasonFindService seasonFindService; + private final RankRedisRepository rankRedisRepository; + + @Transactional(readOnly = true) + public User findUserById(Long userId) { + return userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException()); + } + + @Transactional(readOnly = true) + public User findByIntraId(String intraId){ + return userRepository.findByIntraId(intraId).orElseThrow(() -> new UserNotFoundException()); + } + + @Transactional(readOnly = true) + public String getUserStatusMessage(User targetUser) { + Season currentSeason = seasonFindService.findCurrentSeason(LocalDateTime.now()); + String hashKey = RedisKeyManager.getHashKey(currentSeason.getId()); + try{ + RankRedis userRank = rankRedisRepository.findRankByUserId(hashKey, targetUser.getId()); + return userRank.getStatusMessage(); + }catch (RedisDataNotFoundException e){ + return ""; + } + } +} diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index bf0553ca0..7c5e823cf 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -1,236 +1,242 @@ -package com.gg.server.domain.user.service; - -import com.gg.server.domain.game.data.Game; -import com.gg.server.domain.game.data.GameRepository; -import com.gg.server.domain.game.type.StatusType; -import com.gg.server.domain.match.data.RedisMatchUserRepository; -import com.gg.server.domain.noti.data.NotiRepository; -import com.gg.server.domain.pchange.data.PChange; -import com.gg.server.domain.pchange.data.PChangeRepository; -import com.gg.server.domain.pchange.exception.PChangeNotExistException; -import com.gg.server.domain.rank.data.Rank; -import com.gg.server.domain.rank.exception.RedisDataNotFoundException; -import com.gg.server.domain.rank.redis.RankRedis; -import com.gg.server.domain.rank.redis.RankRedisRepository; -import com.gg.server.domain.rank.redis.RedisKeyManager; -import com.gg.server.domain.rank.service.RankFindService; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.season.service.SeasonFindService; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.domain.user.dto.*; -import com.gg.server.domain.user.exception.UserNotFoundException; -import com.gg.server.domain.user.type.RacketType; -import com.gg.server.domain.user.type.SnsType; -import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -@Service -@RequiredArgsConstructor -public class UserService { - - private final UserFindService userFindService; - private final UserRepository userRepository; - private final NotiRepository notiRepository; - private final GameRepository gameRepository; - private final RankRedisRepository rankRedisRepository; - private final SeasonFindService seasonFindService; - private final PChangeRepository pChangeRepository; - private final RankFindService rankFindService; - private final RedisMatchUserRepository redisMatchUserRepository; - - - - /** - * @param intraId - * @return intraId가 포함된 유저들의 intraId를 페이징 관계없이 최대 5개까지 검색하여 List로 return - */ - @Transactional(readOnly = true) - public List findByPartOfIntraId(String intraId) { - Pageable pageable = PageRequest.of(0, 5, Sort.by("intraId").ascending()); - Page pageUsers = userRepository.findByIntraIdContains(pageable, intraId); - return pageUsers.getContent().stream().map(user -> user.getIntraId()) - .collect(Collectors.toList()); - } - - /** - * - * @param user - * - event: - * - null → 로그인 유저가 잡힌 매칭이 하나도 없을 때 - * - match → 매칭은 되었으나 게임시작 전일 때 or 매칭중인 경우 - * - game → 유저가 게임이 잡혔고 현재 게임중인 경우 - * - * - currentMatchMode - * - normal - * - rank - * - null -> 매칭이 안잡혔을 때 or 게임 전 - */ - @Transactional() - public UserLiveResponseDto getUserLiveDetail(UserDto user) { - int notiCnt = notiRepository.countNotCheckedNotiByUser(user.getId()); - Optional optionalGame = gameRepository.getLatestGameByUser(user.getId()); - int userMatchCnt = redisMatchUserRepository.countMatchTime(user.getId()); - if (optionalGame.isPresent()) { - Game game = optionalGame.get(); - if (game.getStatus() == StatusType.LIVE || game.getStatus() == StatusType.WAIT) - return new UserLiveResponseDto(notiCnt, "game", game.getMode(), game.getId()); - else if (game.getStatus() == StatusType.END) { - PChange userPChange = pChangeRepository.findPChangeByUserIdAndGameId(user.getId(), game.getId()).orElseThrow(() -> new PChangeNotExistException()); - if (userPChange.getIsChecked() == false) { - userPChange.checkPChange(); - return new UserLiveResponseDto(notiCnt, "game", game.getMode(), game.getId()); - } - } - - if (game.getStatus() == StatusType.BEFORE) - return new UserLiveResponseDto(notiCnt, "match", null, null); - } - if (userMatchCnt > 0){ - return new UserLiveResponseDto(notiCnt, "match", null, null); - } - return new UserLiveResponseDto(notiCnt, null, null, null); - } - - @Transactional(readOnly = true) - public UserDetailResponseDto getUserDetail(String targetUserIntraId) { - User targetUser = userFindService.findByIntraId(targetUserIntraId); - String statusMessage = userFindService.getUserStatusMessage(targetUser); - return new UserDetailResponseDto(targetUser, statusMessage); - } - - @Transactional - public void updateUser(RacketType racketType, String statusMessage, SnsType snsNotiOpt, String intraId) { - User user = userFindService.findByIntraId(intraId); - Season currentSeason = seasonFindService.findCurrentSeason(LocalDateTime.now()); - updateRedisRankStatusMessage(statusMessage, user, currentSeason); - updateRankTableStatusMessage(user.getId(), statusMessage, currentSeason.getId()); - user.updateTypes(racketType, snsNotiOpt); - } - - private void updateRankTableStatusMessage(Long userId, String statusMessage, Long seasonId) { - Rank rank = rankFindService.findByUserIdAndSeasonId(userId, seasonId); - rank.setStatusMessage(statusMessage); - } - - private void updateRedisRankStatusMessage(String statusMessage, User user, Season currentSeason) { - String hashKey = RedisKeyManager.getHashKey(currentSeason.getId()); - - RankRedis userRank = rankRedisRepository.findRankByUserId(hashKey, user.getId()); - userRank.setStatusMessage(statusMessage); - rankRedisRepository.updateRankData(hashKey, user.getId(), userRank); - } - - /** - * - * @param intraId - * @param seasonId - * seasonId == 0 -> current season, else -> 해당 Id를 가진 season의 데이터 - * - * 기존 쿼리 - * @Query(nativeQuery = true, value = "SELECT * FROM pchange " + - * "where game_id in (SELECT id FROM game where season = :season and mode = :mode ) " + - * "AND user_id = :intraId ORDER BY id Desc limit :limit") - * -> Limit에는 10이 기본으로 들어감 - * - * @return 유저의 최근 10개의 랭크 경기 기록 - */ - @Transactional(readOnly = true) - public UserHistoryResponseDto getUserHistory(String intraId, Long seasonId) { - Season season; - if (seasonId == 0){ - season = seasonFindService.findCurrentSeason(LocalDateTime.now()); - }else{ - season = seasonFindService.findSeasonById(seasonId); - } - List pChanges = pChangeRepository.findPChangesHistory(intraId, season.getId()); - List historyData = pChanges.stream().map(UserHistoryData::new).collect(Collectors.toList()); - Collections.reverse(historyData); - return new UserHistoryResponseDto(historyData); - } - - /** - * - * @param targetUserIntraId - * @param seasonId - * seasonId == 0 -> current season, else -> 해당 Id를 가진 season의 데이터 - * @return - */ - @Transactional(readOnly = true) - public UserRankResponseDto getUserRankDetail(String targetUserIntraId, Long seasonId) { - Season season; - if (seasonId == 0){ - season = seasonFindService.findCurrentSeason(LocalDateTime.now()); - }else{ - season = seasonFindService.findSeasonById(seasonId); - } - String ZSetKey = RedisKeyManager.getZSetKey(season.getId()); - String hashKey = RedisKeyManager.getHashKey(season.getId()); - User user = userFindService.findByIntraId(targetUserIntraId); - try { - Long userRanking = rankRedisRepository.getRankInZSet(ZSetKey, user.getId()); - userRanking += 1; - RankRedis userRank = rankRedisRepository.findRankByUserId(hashKey, user.getId()); - double winRate = (double)(userRank.getWins() * 10000 / (userRank.getWins() + userRank.getLosses())) / 100; - return new UserRankResponseDto(userRanking.intValue(), userRank.getPpp(), userRank.getWins(), userRank.getLosses(), winRate); - } catch (RedisDataNotFoundException ex){ - return new UserRankResponseDto(-1, season.getStartPpp(), 0, 0, 0); - } catch (ArithmeticException ex2){ - return new UserRankResponseDto(-1, season.getStartPpp(), 0, 0, 0); - } - } - - public User getUser(Long userId) { - return userRepository.findById(userId).orElseThrow(() -> new UsernameNotFoundException("User" + userId)); - } - - @Transactional - public void deleteKakaoId(Long userId) { - User user = userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException()); - user.updateKakaoId(null); - } - - @Transactional(readOnly = true) - public UserImageResponseDto getRankedUserImagesByPPP(Long seasonId) { - Season targetSeason; - if (seasonId == 0) - targetSeason = seasonFindService.findCurrentSeason(LocalDateTime.now()); - else - targetSeason = seasonFindService.findSeasonById(seasonId); - try { - String zSetKey = RedisKeyManager.getZSetKey(targetSeason.getId()); - List userIds = rankRedisRepository.getUserIdsByRangeFromZSet(zSetKey, 0, 2); - List users = userRepository.findUsersByIdIn(userIds); - List userImages = new ArrayList<>(); - userIds.forEach(userId -> { - User user = users.stream().filter(u -> u.getId().equals(userId)).findFirst().orElseThrow(UserNotFoundException::new); - userImages.add(new UserImageDto(user.getIntraId(), user.getImageUri())); - }); - return new UserImageResponseDto(userImages); - } catch (RedisDataNotFoundException ex){ - return new UserImageResponseDto(new ArrayList<>()); - } - } - - public UserImageResponseDto getRankedUserImagesByExp(PageRequest pageRequest) { - List users = userRepository.findAll(pageRequest).getContent(); - List userImages = new ArrayList<>(); - for (User user : users) { - userImages.add(new UserImageDto(user.getIntraId(), user.getImageUri())); - } - return new UserImageResponseDto(userImages); - } -} +package com.gg.server.domain.user.service; + +import com.gg.server.domain.game.data.Game; +import com.gg.server.domain.game.data.GameRepository; +import com.gg.server.domain.game.type.StatusType; +import com.gg.server.domain.match.data.RedisMatchUserRepository; +import com.gg.server.domain.noti.data.NotiRepository; +import com.gg.server.domain.pchange.data.PChange; +import com.gg.server.domain.pchange.data.PChangeRepository; +import com.gg.server.domain.pchange.exception.PChangeNotExistException; +import com.gg.server.domain.rank.data.Rank; +import com.gg.server.domain.rank.exception.RedisDataNotFoundException; +import com.gg.server.domain.rank.redis.RankRedis; +import com.gg.server.domain.rank.redis.RankRedisRepository; +import com.gg.server.domain.rank.redis.RedisKeyManager; +import com.gg.server.domain.rank.service.RankFindService; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.season.service.SeasonFindService; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.dto.*; +import com.gg.server.domain.user.exception.UserNotFoundException; +import com.gg.server.domain.user.type.RacketType; +import com.gg.server.domain.user.type.SnsType; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class UserService { + + private final UserFindService userFindService; + private final UserRepository userRepository; + private final NotiRepository notiRepository; + private final GameRepository gameRepository; + private final RankRedisRepository rankRedisRepository; + private final SeasonFindService seasonFindService; + private final PChangeRepository pChangeRepository; + private final RankFindService rankFindService; + private final RedisMatchUserRepository redisMatchUserRepository; + + + + /** + * @param intraId + * @return intraId가 포함된 유저들의 intraId를 페이징 관계없이 최대 5개까지 검색하여 List로 return + */ + @Transactional(readOnly = true) + public List findByPartOfIntraId(String intraId) { + Pageable pageable = PageRequest.of(0, 5, Sort.by("intraId").ascending()); + Page pageUsers = userRepository.findByIntraIdContains(pageable, intraId); + return pageUsers.getContent().stream().map(user -> user.getIntraId()) + .collect(Collectors.toList()); + } + + /** + * + * @param user + * - event: + * - null → 로그인 유저가 잡힌 매칭이 하나도 없을 때 + * - match → 매칭은 되었으나 게임시작 전일 때 or 매칭중인 경우 + * - game → 유저가 게임이 잡혔고 현재 게임중인 경우 + * + * - currentMatchMode + * - normal + * - rank + * - null -> 매칭이 안잡혔을 때 or 게임 전 + */ + @Transactional() + public UserLiveResponseDto getUserLiveDetail(UserDto user) { + int notiCnt = notiRepository.countNotCheckedNotiByUser(user.getId()); + Optional optionalGame = gameRepository.getLatestGameByUser(user.getId()); + int userMatchCnt = redisMatchUserRepository.countMatchTime(user.getId()); + if (optionalGame.isPresent()) { + Game game = optionalGame.get(); + if (game.getStatus() == StatusType.LIVE || game.getStatus() == StatusType.WAIT) + return new UserLiveResponseDto(notiCnt, "game", game.getMode(), game.getId()); + else if (game.getStatus() == StatusType.END) { + PChange userPChange = pChangeRepository.findPChangeByUserIdAndGameId(user.getId(), game.getId()).orElseThrow(() -> new PChangeNotExistException()); + if (userPChange.getIsChecked() == false) { + userPChange.checkPChange(); + return new UserLiveResponseDto(notiCnt, "game", game.getMode(), game.getId()); + } + } + + if (game.getStatus() == StatusType.BEFORE) + return new UserLiveResponseDto(notiCnt, "match", null, null); + } + if (userMatchCnt > 0){ + return new UserLiveResponseDto(notiCnt, "match", null, null); + } + return new UserLiveResponseDto(notiCnt, null, null, null); + } + + @Transactional(readOnly = true) + public UserDetailResponseDto getUserDetail(String targetUserIntraId) { + User targetUser = userFindService.findByIntraId(targetUserIntraId); + String statusMessage = userFindService.getUserStatusMessage(targetUser); + return new UserDetailResponseDto(targetUser, statusMessage); + } + + @Transactional + public void updateUser(RacketType racketType, String statusMessage, SnsType snsNotiOpt, String intraId) { + User user = userFindService.findByIntraId(intraId); + Season currentSeason = seasonFindService.findCurrentSeason(LocalDateTime.now()); + updateRedisRankStatusMessage(statusMessage, user, currentSeason); + updateRankTableStatusMessage(user.getId(), statusMessage, currentSeason.getId()); + user.updateTypes(racketType, snsNotiOpt); + } + + private void updateRankTableStatusMessage(Long userId, String statusMessage, Long seasonId) { + Rank rank = rankFindService.findByUserIdAndSeasonId(userId, seasonId); + rank.setStatusMessage(statusMessage); + } + + private void updateRedisRankStatusMessage(String statusMessage, User user, Season currentSeason) { + String hashKey = RedisKeyManager.getHashKey(currentSeason.getId()); + + RankRedis userRank = rankRedisRepository.findRankByUserId(hashKey, user.getId()); + userRank.setStatusMessage(statusMessage); + rankRedisRepository.updateRankData(hashKey, user.getId(), userRank); + } + + /** + * + * @param intraId + * @param seasonId + * seasonId == 0 -> current season, else -> 해당 Id를 가진 season의 데이터 + * + * 기존 쿼리 + * @Query(nativeQuery = true, value = "SELECT * FROM pchange " + + * "where game_id in (SELECT id FROM game where season = :season and mode = :mode ) " + + * "AND user_id = :intraId ORDER BY id Desc limit :limit") + * -> Limit에는 10이 기본으로 들어감 + * + * @return 유저의 최근 10개의 랭크 경기 기록 + */ + @Transactional(readOnly = true) + public UserHistoryResponseDto getUserHistory(String intraId, Long seasonId) { + Season season; + if (seasonId == 0){ + season = seasonFindService.findCurrentSeason(LocalDateTime.now()); + }else{ + season = seasonFindService.findSeasonById(seasonId); + } + List pChanges = pChangeRepository.findPChangesHistory(intraId, season.getId()); + List historyData = pChanges.stream().map(UserHistoryData::new).collect(Collectors.toList()); + Collections.reverse(historyData); + return new UserHistoryResponseDto(historyData); + } + + /** + * + * @param targetUserIntraId + * @param seasonId + * seasonId == 0 -> current season, else -> 해당 Id를 가진 season의 데이터 + * @return + */ + @Transactional(readOnly = true) + public UserRankResponseDto getUserRankDetail(String targetUserIntraId, Long seasonId) { + Season season; + if (seasonId == 0){ + season = seasonFindService.findCurrentSeason(LocalDateTime.now()); + }else{ + season = seasonFindService.findSeasonById(seasonId); + } + String ZSetKey = RedisKeyManager.getZSetKey(season.getId()); + String hashKey = RedisKeyManager.getHashKey(season.getId()); + User user = userFindService.findByIntraId(targetUserIntraId); + try { + Long userRanking = rankRedisRepository.getRankInZSet(ZSetKey, user.getId()); + userRanking += 1; + RankRedis userRank = rankRedisRepository.findRankByUserId(hashKey, user.getId()); + double winRate = (double)(userRank.getWins() * 10000 / (userRank.getWins() + userRank.getLosses())) / 100; + return new UserRankResponseDto(userRanking.intValue(), userRank.getPpp(), userRank.getWins(), userRank.getLosses(), winRate); + } catch (RedisDataNotFoundException ex){ + return new UserRankResponseDto(-1, season.getStartPpp(), 0, 0, 0); + } catch (ArithmeticException ex2){ + return new UserRankResponseDto(-1, season.getStartPpp(), 0, 0, 0); + } + } + + public User getUser(Long userId) { + return userRepository.findById(userId).orElseThrow(() -> new UsernameNotFoundException("User" + userId)); + } + + @Transactional + public void deleteKakaoId(Long userId) { + User user = userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException()); + user.updateKakaoId(null); + } + + @Transactional(readOnly = true) + public UserImageResponseDto getRankedUserImagesByPPP(Long seasonId) { + Season targetSeason; + if (seasonId == 0) + targetSeason = seasonFindService.findCurrentSeason(LocalDateTime.now()); + else + targetSeason = seasonFindService.findSeasonById(seasonId); + try { + String zSetKey = RedisKeyManager.getZSetKey(targetSeason.getId()); + List userIds = rankRedisRepository.getUserIdsByRangeFromZSet(zSetKey, 0, 2); + List users = userRepository.findUsersByIdIn(userIds); + List userImages = new ArrayList<>(); + userIds.forEach(userId -> { + User user = users.stream().filter(u -> u.getId().equals(userId)).findFirst().orElseThrow(UserNotFoundException::new); + userImages.add(new UserImageDto(user.getIntraId(), user.getImageUri())); + }); + return new UserImageResponseDto(userImages); + } catch (RedisDataNotFoundException ex){ + return new UserImageResponseDto(new ArrayList<>()); + } + } + + public UserImageResponseDto getRankedUserImagesByExp(PageRequest pageRequest) { + List users = userRepository.findAll(pageRequest).getContent(); + List userImages = new ArrayList<>(); + for (User user : users) { + userImages.add(new UserImageDto(user.getIntraId(), user.getImageUri())); + } + return new UserImageResponseDto(userImages); + } + + @Transactional() + public void updateTextColor(Long userId, String textColor) { + User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new); + user.updateTextColor(textColor); + } +} diff --git a/src/main/java/com/gg/server/domain/user/service/UserTextColorCheckService.java b/src/main/java/com/gg/server/domain/user/service/UserTextColorCheckService.java new file mode 100644 index 000000000..278cc6e5f --- /dev/null +++ b/src/main/java/com/gg/server/domain/user/service/UserTextColorCheckService.java @@ -0,0 +1,23 @@ +package com.gg.server.domain.user.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class UserTextColorCheckService { + public static boolean check(String textColor) { + if (textColor == null) + return false; + if (textColor.length() != 7) + return false; + if (textColor.charAt(0) != '#') + return false; + for (int i = 1; i < 7; i++) { + char c = textColor.charAt(i); + if (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'))) + return false; + } + return true; + } +} diff --git a/src/main/java/com/gg/server/domain/user/type/BackgroundType.java b/src/main/java/com/gg/server/domain/user/type/BackgroundType.java index a1010daa3..d42e9742c 100644 --- a/src/main/java/com/gg/server/domain/user/type/BackgroundType.java +++ b/src/main/java/com/gg/server/domain/user/type/BackgroundType.java @@ -1,17 +1,17 @@ -package com.gg.server.domain.user.type; - -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -public enum BackgroundType { - COLOR1(0, "color1"), - COLOR2(1, "color2"), - COLOR3(2, "color3"); - - private final Integer value; - private final String code; - - public static BackgroundType of(String code) { - return BackgroundType.valueOf(code); - } +package com.gg.server.domain.user.type; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public enum BackgroundType { + BASIC(0, "basic"), + COLOR2(1, "color2"), + COLOR3(2, "color3"); + + private final Integer value; + private final String code; + + public static BackgroundType of(String code) { + return BackgroundType.valueOf(code); + } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/user/type/EdgeType.java b/src/main/java/com/gg/server/domain/user/type/EdgeType.java index 8bc218d84..6aedc737f 100644 --- a/src/main/java/com/gg/server/domain/user/type/EdgeType.java +++ b/src/main/java/com/gg/server/domain/user/type/EdgeType.java @@ -1,17 +1,17 @@ -package com.gg.server.domain.user.type; - -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -public enum EdgeType { - COLOR1(0, "color1"), - COLOR2(1, "color2"), - COLOR3(2, "color3"); - - private final Integer value; - private final String code; - - public static EdgeType of(String code) { - return EdgeType.valueOf(code); - } -} +package com.gg.server.domain.user.type; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public enum EdgeType { + BASIC(0, "basic"), + COLOR2(1, "color2"), + COLOR3(2, "color3"); + + private final Integer value; + private final String code; + + public static EdgeType of(String code) { + return EdgeType.valueOf(code); + } +} diff --git a/src/main/java/com/gg/server/global/config/WebConfig.java b/src/main/java/com/gg/server/global/config/WebConfig.java index 20708d21d..f7573f428 100644 --- a/src/main/java/com/gg/server/global/config/WebConfig.java +++ b/src/main/java/com/gg/server/global/config/WebConfig.java @@ -1,31 +1,31 @@ -package com.gg.server.global.config; - -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.global.security.jwt.utils.AuthTokenProvider; -import com.gg.server.global.utils.argumentresolver.LoginMemberArgumentResolver; -import com.gg.server.global.utils.querytracker.LoggingInterceptor; -import lombok.RequiredArgsConstructor; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.method.support.HandlerMethodArgumentResolver; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -import java.util.List; - -@Configuration -@RequiredArgsConstructor -public class WebConfig implements WebMvcConfigurer { - private final UserRepository userRepository; - private final AuthTokenProvider tokenProvider; - private final LoggingInterceptor loggingInterceptor; - - @Override - public void addArgumentResolvers(List resolvers) { - resolvers.add(new LoginMemberArgumentResolver(userRepository, tokenProvider)); - } - - @Override - public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(loggingInterceptor); - } -} +package com.gg.server.global.config; + +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.global.utils.argumentresolver.LoginMemberArgumentResolver; +import com.gg.server.global.utils.querytracker.LoggingInterceptor; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.List; + +@Configuration +@RequiredArgsConstructor +public class WebConfig implements WebMvcConfigurer { + private final UserRepository userRepository; + private final AuthTokenProvider tokenProvider; + private final LoggingInterceptor loggingInterceptor; + + @Override + public void addArgumentResolvers(List resolvers) { + resolvers.add(new LoginMemberArgumentResolver(userRepository, tokenProvider)); + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(loggingInterceptor); + } +} diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index 84b8b1b92..acac54912 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -13,7 +13,7 @@ public enum ErrorCode { USER_IMAGE_WRONG_TYPE(415, "UR402", "USER IMAGE TYPE IS WRONG"), KAKAO_OAUTH2_NOT_FOUND(404, "UR101", "KAKAO OAUTH2 NOT FOUND"), KAKAO_OAUTH2_DUPLICATE(409, "UR300", "KAKAO OAUTH2 ALREADY EXIST"), - + USER_TEXT_COLOR_WRONG_TYPE(401, "UR403", "USER TEXT COLOR CODE IS WRONG"), //announcement ANNOUNCE_NOT_FOUND(404, "AN100", "ANNOUNCEMENT NOT FOUND"), diff --git a/src/main/java/com/gg/server/global/security/UserPrincipal.java b/src/main/java/com/gg/server/global/security/UserPrincipal.java index 7dd850db1..f4e1a03a6 100644 --- a/src/main/java/com/gg/server/global/security/UserPrincipal.java +++ b/src/main/java/com/gg/server/global/security/UserPrincipal.java @@ -1,83 +1,83 @@ -package com.gg.server.global.security; - -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.type.RoleType; -import lombok.Getter; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.oauth2.core.user.OAuth2User; - -import java.util.*; - -@Getter -public class UserPrincipal implements OAuth2User, UserDetails { - private final Long id; - private final String nickname; - private final String profileImg; - private final Collection authorities; - private Map attributes; - - public UserPrincipal(Long id, String nickname, String profileImg, Collection authorities) { - this.id = id; - this.nickname = nickname; - this.profileImg = profileImg; - this.authorities = authorities; - } - - public static UserPrincipal create(User user) { - List authorities = new ArrayList<>(); - if (user.getRoleType().getKey().equals("ROLE_USER")) { - authorities.add(new SimpleGrantedAuthority(RoleType.USER.getKey())); - } else if (user.getRoleType().getKey().equals("ROLE_ADMIN")) { - authorities.add(new SimpleGrantedAuthority(RoleType.USER.getKey())); - authorities.add(new SimpleGrantedAuthority(RoleType.ADMIN.getKey())); - } - return new UserPrincipal(user.getId(), user.getIntraId(), user.getImageUri(), authorities); - } - - public static UserPrincipal create(User user, Map attributes) { - UserPrincipal userPrincipal = UserPrincipal.create(user); - userPrincipal.setAttributes(attributes); - return userPrincipal; - } - - public void setAttributes(Map attributes) { - this.attributes = attributes; - } - - @Override - public String getPassword() { - return null; - } - - @Override - public String getUsername() { - return nickname; - } - - @Override - public boolean isAccountNonExpired() { - return true; - } - - @Override - public boolean isAccountNonLocked() { - return true; - } - - @Override - public boolean isCredentialsNonExpired() { - return true; - } - - @Override - public boolean isEnabled() { - return true; - } - - @Override - public String getName() { - return String.valueOf(id); - } +package com.gg.server.global.security; + +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.type.RoleType; +import lombok.Getter; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.oauth2.core.user.OAuth2User; + +import java.util.*; + +@Getter +public class UserPrincipal implements OAuth2User, UserDetails { + private final Long id; + private final String nickname; + private final String profileImg; + private final Collection authorities; + private Map attributes; + + public UserPrincipal(Long id, String nickname, String profileImg, Collection authorities) { + this.id = id; + this.nickname = nickname; + this.profileImg = profileImg; + this.authorities = authorities; + } + + public static UserPrincipal create(User user) { + List authorities = new ArrayList<>(); + if (user.getRoleType().getKey().equals("ROLE_USER")) { + authorities.add(new SimpleGrantedAuthority(RoleType.USER.getKey())); + } else if (user.getRoleType().getKey().equals("ROLE_ADMIN")) { + authorities.add(new SimpleGrantedAuthority(RoleType.USER.getKey())); + authorities.add(new SimpleGrantedAuthority(RoleType.ADMIN.getKey())); + } + return new UserPrincipal(user.getId(), user.getIntraId(), user.getImageUri(), authorities); + } + + public static UserPrincipal create(User user, Map attributes) { + UserPrincipal userPrincipal = UserPrincipal.create(user); + userPrincipal.setAttributes(attributes); + return userPrincipal; + } + + public void setAttributes(Map attributes) { + this.attributes = attributes; + } + + @Override + public String getPassword() { + return null; + } + + @Override + public String getUsername() { + return nickname; + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return true; + } + + @Override + public String getName() { + return String.valueOf(id); + } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/global/security/handler/OAuthAuthenticationSuccessHandler.java b/src/main/java/com/gg/server/global/security/handler/OAuthAuthenticationSuccessHandler.java index 439842e19..f9aa95d24 100644 --- a/src/main/java/com/gg/server/global/security/handler/OAuthAuthenticationSuccessHandler.java +++ b/src/main/java/com/gg/server/global/security/handler/OAuthAuthenticationSuccessHandler.java @@ -1,135 +1,135 @@ -package com.gg.server.global.security.handler; - -import com.gg.server.domain.rank.redis.RedisKeyManager; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.domain.user.exception.UserNotFoundException; -import com.gg.server.domain.user.type.RoleType; -import com.gg.server.global.security.UserPrincipal; -import com.gg.server.global.security.cookie.CookieUtil; -import com.gg.server.global.security.config.properties.AppProperties; -import com.gg.server.global.security.jwt.repository.JwtRedisRepository; -import com.gg.server.global.security.jwt.utils.TokenHeaders; -import com.gg.server.global.security.jwt.utils.AuthTokenProvider; -import com.gg.server.global.utils.ApplicationYmlRead; -import javax.servlet.http.Cookie; -import lombok.RequiredArgsConstructor; -import org.springframework.security.core.Authentication; -import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.util.UriComponentsBuilder; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -@Component -@RequiredArgsConstructor -public class OAuthAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { - private final JwtRedisRepository jwtRedisRepository; - private final UserRepository userRepository; - private final AuthTokenProvider tokenProvider; - private final AppProperties appProperties; - private final ApplicationYmlRead applicationYmlRead; - private final CookieUtil cookieUtil; - - @Transactional - @Override - public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, - Authentication authentication) throws IOException { - String targetUrl = determineTargetUrl(request, response, authentication); - - if (response.isCommitted()) { - logger.debug("Response has already been committed. Unable to redirect to " + targetUrl); - return; - } - clearAuthenticationAttributes(request, response); - getRedirectStrategy().sendRedirect(request, response, targetUrl); - } - - @Override - protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { - - UserPrincipal principal = (UserPrincipal) authentication.getPrincipal(); - Cookie[] cookies = request.getCookies(); - for (Cookie cookie :cookies) { - if (cookie.getName().equals(TokenHeaders.REFRESH_TOKEN) ) { - Long existUserId = tokenProvider.getUserIdFormRefreshToken(cookie.getValue()); - if (existUserId != null && !existUserId.equals(principal.getId())) { - return deleteKakaoUser(existUserId, response, authentication); - } - } - } - - // 쿠키 시간 설정 - long refreshTokenExpiry = appProperties.getAuth().getRefreshTokenExpiry(); - - // token 설정 - String accessToken = tokenProvider.createToken(principal.getId()); - String refreshToken = tokenProvider.refreshToken(principal.getId()); - - cookieUtil.addCookie(response, TokenHeaders.REFRESH_TOKEN, refreshToken, - (int)(refreshTokenExpiry / 1000)); - - String refTokenKey = RedisKeyManager.getRefKey(principal.getId()); - jwtRedisRepository.deleteRefToken(refTokenKey); - jwtRedisRepository.addRefToken(refTokenKey, refreshToken, refreshTokenExpiry); - return UriComponentsBuilder.fromUriString(applicationYmlRead.getFrontUrl()) - .queryParam("token", accessToken) - .build().toUriString(); - } - - private String deleteKakaoUser(Long existUserId, HttpServletResponse response, Authentication authentication) { - UserPrincipal principal = (UserPrincipal) authentication.getPrincipal(); - User existUser = userRepository.findById(existUserId).orElseThrow(UserNotFoundException::new); - User newUser = userRepository.findById(principal.getId()).orElseThrow(UserNotFoundException::new); - //kakao 계정 사용자가 42 인증 - if (existUser.getRoleType().equals(RoleType.GUEST)) { - return UriComponentsBuilder.fromUriString(applicationYmlRead.getFrontUrl() + "/users/detail") - .queryParam("intraId", newUser.getIntraId()) - .queryParam("token", saveAndGetUserAccessToken(response, newUser, existUser)) - .build().toUriString(); - } - //기존 user 사용자가 카카오 인증 - if (newUser.getRoleType().equals(RoleType.GUEST)) { - return UriComponentsBuilder.fromUriString(applicationYmlRead.getFrontUrl() + "/users/detail") - .queryParam("intraId", existUser.getIntraId()) - .queryParam("token", saveAndGetUserAccessToken(response, existUser, newUser)) - .build().toUriString(); - } - throw new UserNotFoundException(); - } - - - private String saveAndGetUserAccessToken(HttpServletResponse response, - User remainedUser, User deletedUser) { - remainedUser.updateKakaoId(deletedUser.getKakaoId()); - // 쿠키 시간 설정 - long refreshTokenExpiry = appProperties.getAuth().getRefreshTokenExpiry(); - - String remainTokenKey = RedisKeyManager.getRefKey(remainedUser.getId()); - String deleteTokenKey = RedisKeyManager.getRefKey(deletedUser.getId()); - jwtRedisRepository.deleteRefToken(deleteTokenKey); - jwtRedisRepository.deleteRefToken(remainTokenKey); - - userRepository.delete(deletedUser); - - // token 설정 - String accessToken = tokenProvider.createToken(remainedUser.getId()); - String refreshToken = tokenProvider.refreshToken(remainedUser.getId()); - jwtRedisRepository.addRefToken(remainTokenKey, refreshToken, refreshTokenExpiry); - - cookieUtil.addCookie(response, TokenHeaders.REFRESH_TOKEN, refreshToken, - (int)(refreshTokenExpiry / 1000)); - return accessToken; - } - - private void clearAuthenticationAttributes(HttpServletRequest request, HttpServletResponse response) { - super.clearAuthenticationAttributes(request); - } - - -} - - +package com.gg.server.global.security.handler; + +import com.gg.server.domain.rank.redis.RedisKeyManager; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.exception.UserNotFoundException; +import com.gg.server.domain.user.type.RoleType; +import com.gg.server.global.security.UserPrincipal; +import com.gg.server.global.security.cookie.CookieUtil; +import com.gg.server.global.security.config.properties.AppProperties; +import com.gg.server.global.security.jwt.repository.JwtRedisRepository; +import com.gg.server.global.security.jwt.utils.TokenHeaders; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.global.utils.ApplicationYmlRead; +import javax.servlet.http.Cookie; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.util.UriComponentsBuilder; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@Component +@RequiredArgsConstructor +public class OAuthAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler { + private final JwtRedisRepository jwtRedisRepository; + private final UserRepository userRepository; + private final AuthTokenProvider tokenProvider; + private final AppProperties appProperties; + private final ApplicationYmlRead applicationYmlRead; + private final CookieUtil cookieUtil; + + @Transactional + @Override + public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, + Authentication authentication) throws IOException { + String targetUrl = determineTargetUrl(request, response, authentication); + + if (response.isCommitted()) { + logger.debug("Response has already been committed. Unable to redirect to " + targetUrl); + return; + } + clearAuthenticationAttributes(request, response); + getRedirectStrategy().sendRedirect(request, response, targetUrl); + } + + @Override + protected String determineTargetUrl(HttpServletRequest request, HttpServletResponse response, Authentication authentication) { + + UserPrincipal principal = (UserPrincipal) authentication.getPrincipal(); + Cookie[] cookies = request.getCookies(); + for (Cookie cookie :cookies) { + if (cookie.getName().equals(TokenHeaders.REFRESH_TOKEN) ) { + Long existUserId = tokenProvider.getUserIdFormRefreshToken(cookie.getValue()); + if (existUserId != null && !existUserId.equals(principal.getId())) { + return deleteKakaoUser(existUserId, response, authentication); + } + } + } + + // 쿠키 시간 설정 + long refreshTokenExpiry = appProperties.getAuth().getRefreshTokenExpiry(); + + // token 설정 + String accessToken = tokenProvider.createToken(principal.getId()); + String refreshToken = tokenProvider.refreshToken(principal.getId()); + + cookieUtil.addCookie(response, TokenHeaders.REFRESH_TOKEN, refreshToken, + (int)(refreshTokenExpiry / 1000)); + + String refTokenKey = RedisKeyManager.getRefKey(principal.getId()); + jwtRedisRepository.deleteRefToken(refTokenKey); + jwtRedisRepository.addRefToken(refTokenKey, refreshToken, refreshTokenExpiry); + return UriComponentsBuilder.fromUriString(applicationYmlRead.getFrontUrl()) + .queryParam("token", accessToken) + .build().toUriString(); + } + + private String deleteKakaoUser(Long existUserId, HttpServletResponse response, Authentication authentication) { + UserPrincipal principal = (UserPrincipal) authentication.getPrincipal(); + User existUser = userRepository.findById(existUserId).orElseThrow(UserNotFoundException::new); + User newUser = userRepository.findById(principal.getId()).orElseThrow(UserNotFoundException::new); + //kakao 계정 사용자가 42 인증 + if (existUser.getRoleType().equals(RoleType.GUEST)) { + return UriComponentsBuilder.fromUriString(applicationYmlRead.getFrontUrl() + "/users/detail") + .queryParam("intraId", newUser.getIntraId()) + .queryParam("token", saveAndGetUserAccessToken(response, newUser, existUser)) + .build().toUriString(); + } + //기존 user 사용자가 카카오 인증 + if (newUser.getRoleType().equals(RoleType.GUEST)) { + return UriComponentsBuilder.fromUriString(applicationYmlRead.getFrontUrl() + "/users/detail") + .queryParam("intraId", existUser.getIntraId()) + .queryParam("token", saveAndGetUserAccessToken(response, existUser, newUser)) + .build().toUriString(); + } + throw new UserNotFoundException(); + } + + + private String saveAndGetUserAccessToken(HttpServletResponse response, + User remainedUser, User deletedUser) { + remainedUser.updateKakaoId(deletedUser.getKakaoId()); + // 쿠키 시간 설정 + long refreshTokenExpiry = appProperties.getAuth().getRefreshTokenExpiry(); + + String remainTokenKey = RedisKeyManager.getRefKey(remainedUser.getId()); + String deleteTokenKey = RedisKeyManager.getRefKey(deletedUser.getId()); + jwtRedisRepository.deleteRefToken(deleteTokenKey); + jwtRedisRepository.deleteRefToken(remainTokenKey); + + userRepository.delete(deletedUser); + + // token 설정 + String accessToken = tokenProvider.createToken(remainedUser.getId()); + String refreshToken = tokenProvider.refreshToken(remainedUser.getId()); + jwtRedisRepository.addRefToken(remainTokenKey, refreshToken, refreshTokenExpiry); + + cookieUtil.addCookie(response, TokenHeaders.REFRESH_TOKEN, refreshToken, + (int)(refreshTokenExpiry / 1000)); + return accessToken; + } + + private void clearAuthenticationAttributes(HttpServletRequest request, HttpServletResponse response) { + super.clearAuthenticationAttributes(request); + } + + +} + + diff --git a/src/main/java/com/gg/server/global/security/service/CustomOAuth2UserService.java b/src/main/java/com/gg/server/global/security/service/CustomOAuth2UserService.java index efaeecfe6..1fdd80a79 100644 --- a/src/main/java/com/gg/server/global/security/service/CustomOAuth2UserService.java +++ b/src/main/java/com/gg/server/global/security/service/CustomOAuth2UserService.java @@ -1,106 +1,106 @@ -package com.gg.server.global.security.service; - -import com.gg.server.domain.rank.data.Rank; -import com.gg.server.domain.rank.data.RankRepository; -import com.gg.server.domain.rank.redis.RankRedis; -import com.gg.server.domain.rank.redis.RankRedisRepository; -import com.gg.server.domain.rank.redis.RedisKeyManager; -import com.gg.server.domain.season.data.SeasonRepository; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.domain.user.dto.UserDto; -import com.gg.server.global.security.UserPrincipal; -import com.gg.server.global.security.info.OAuthUserInfo; -import com.gg.server.global.security.info.OAuthUserInfoFactory; -import com.gg.server.global.security.info.ProviderType; -import com.gg.server.domain.user.type.RacketType; -import com.gg.server.domain.user.type.SnsType; -import com.gg.server.global.utils.aws.AsyncNewUserImageUploader; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.authentication.InternalAuthenticationServiceException; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService; -import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest; -import org.springframework.security.oauth2.core.OAuth2AuthenticationException; -import org.springframework.security.oauth2.core.user.OAuth2User; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; - -@Service -@RequiredArgsConstructor -@Transactional -public class CustomOAuth2UserService extends DefaultOAuth2UserService { - private final UserRepository userRepository; - private final AsyncNewUserImageUploader asyncNewUserImageUploader; - private final RankRepository rankRepository; - private final SeasonRepository seasonRepository; - private final RankRedisRepository rankRedisRepository; - - @Value("${info.image.defaultUrl}") - private String defaultImageUrl; - - @Override - public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { - OAuth2User user = super.loadUser(userRequest); - - try { - return this.process(userRequest, user); - } catch (AuthenticationException ex) { - throw ex; - } catch (Exception ex) { - ex.printStackTrace(); - throw new InternalAuthenticationServiceException(ex.getMessage(), ex.getCause()); - } - } - - private OAuth2User process(OAuth2UserRequest userRequest, OAuth2User user) { - ProviderType providerType = ProviderType.keyOf(userRequest.getClientRegistration().getRegistrationId().toUpperCase()); - User savedUser; - OAuthUserInfo userInfo = OAuthUserInfoFactory.getOAuth2UserInfo(providerType, user.getAttributes()); - if (providerType.equals(ProviderType.FORTYTWO)) { - savedUser = userRepository.findByIntraId(userInfo.getIntraId()) - .orElse(null); - } else { - savedUser = userRepository.findByKakaoId(userInfo.getKakaoId()) - .orElse(null); - } - if (savedUser == null) { - savedUser = createUser(userInfo); - if (providerType.equals(ProviderType.FORTYTWO)) - createUserRank(savedUser); - if (userInfo.getImageUrl().startsWith("https://cdn.intra.42.fr/")) { - asyncNewUserImageUploader.upload(userInfo.getIntraId(), userInfo.getImageUrl()); - } - } - return UserPrincipal.create(savedUser, user.getAttributes()); - } - - private void createUserRank(User savedUser) { - seasonRepository.findCurrentAndNewSeason(LocalDateTime.now()).forEach( - season -> { - Rank userRank = Rank.from(savedUser, season, season.getStartPpp()); - rankRepository.save(userRank); - RankRedis rankRedis = RankRedis.from(UserDto.from(savedUser), season.getStartPpp()); - String hashKey = RedisKeyManager.getHashKey(season.getId()); - rankRedisRepository.addRankData(hashKey, savedUser.getId(), rankRedis); - } - ); - } - - private User createUser(OAuthUserInfo userInfo) { - User user = User.builder() - .intraId(userInfo.getIntraId()) - .roleType(userInfo.getRoleType()) - .imageUri(userInfo.getImageUrl()) - .kakaoId(userInfo.getKakaoId()) - .snsNotiOpt(SnsType.EMAIL) - .racketType(RacketType.NONE) - .totalExp(0) - .eMail(userInfo.getEmail()) - .build(); - return userRepository.saveAndFlush(user); - } -} +package com.gg.server.global.security.service; + +import com.gg.server.domain.rank.data.Rank; +import com.gg.server.domain.rank.data.RankRepository; +import com.gg.server.domain.rank.redis.RankRedis; +import com.gg.server.domain.rank.redis.RankRedisRepository; +import com.gg.server.domain.rank.redis.RedisKeyManager; +import com.gg.server.domain.season.data.SeasonRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.global.security.UserPrincipal; +import com.gg.server.global.security.info.OAuthUserInfo; +import com.gg.server.global.security.info.OAuthUserInfoFactory; +import com.gg.server.global.security.info.ProviderType; +import com.gg.server.domain.user.type.RacketType; +import com.gg.server.domain.user.type.SnsType; +import com.gg.server.global.utils.aws.AsyncNewUserImageUploader; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.authentication.InternalAuthenticationServiceException; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService; +import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest; +import org.springframework.security.oauth2.core.OAuth2AuthenticationException; +import org.springframework.security.oauth2.core.user.OAuth2User; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; + +@Service +@RequiredArgsConstructor +@Transactional +public class CustomOAuth2UserService extends DefaultOAuth2UserService { + private final UserRepository userRepository; + private final AsyncNewUserImageUploader asyncNewUserImageUploader; + private final RankRepository rankRepository; + private final SeasonRepository seasonRepository; + private final RankRedisRepository rankRedisRepository; + + @Value("${info.image.defaultUrl}") + private String defaultImageUrl; + + @Override + public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException { + OAuth2User user = super.loadUser(userRequest); + + try { + return this.process(userRequest, user); + } catch (AuthenticationException ex) { + throw ex; + } catch (Exception ex) { + ex.printStackTrace(); + throw new InternalAuthenticationServiceException(ex.getMessage(), ex.getCause()); + } + } + + private OAuth2User process(OAuth2UserRequest userRequest, OAuth2User user) { + ProviderType providerType = ProviderType.keyOf(userRequest.getClientRegistration().getRegistrationId().toUpperCase()); + User savedUser; + OAuthUserInfo userInfo = OAuthUserInfoFactory.getOAuth2UserInfo(providerType, user.getAttributes()); + if (providerType.equals(ProviderType.FORTYTWO)) { + savedUser = userRepository.findByIntraId(userInfo.getIntraId()) + .orElse(null); + } else { + savedUser = userRepository.findByKakaoId(userInfo.getKakaoId()) + .orElse(null); + } + if (savedUser == null) { + savedUser = createUser(userInfo); + if (providerType.equals(ProviderType.FORTYTWO)) + createUserRank(savedUser); + if (userInfo.getImageUrl().startsWith("https://cdn.intra.42.fr/")) { + asyncNewUserImageUploader.upload(userInfo.getIntraId(), userInfo.getImageUrl()); + } + } + return UserPrincipal.create(savedUser, user.getAttributes()); + } + + private void createUserRank(User savedUser) { + seasonRepository.findCurrentAndNewSeason(LocalDateTime.now()).forEach( + season -> { + Rank userRank = Rank.from(savedUser, season, season.getStartPpp()); + rankRepository.save(userRank); + RankRedis rankRedis = RankRedis.from(UserDto.from(savedUser), season.getStartPpp()); + String hashKey = RedisKeyManager.getHashKey(season.getId()); + rankRedisRepository.addRankData(hashKey, savedUser.getId(), rankRedis); + } + ); + } + + private User createUser(OAuthUserInfo userInfo) { + User user = User.builder() + .intraId(userInfo.getIntraId()) + .roleType(userInfo.getRoleType()) + .imageUri(userInfo.getImageUrl()) + .kakaoId(userInfo.getKakaoId()) + .snsNotiOpt(SnsType.EMAIL) + .racketType(RacketType.NONE) + .totalExp(0) + .eMail(userInfo.getEmail()) + .build(); + return userRepository.saveAndFlush(user); + } +} diff --git a/src/main/java/com/gg/server/global/security/service/CustomUserDetailsService.java b/src/main/java/com/gg/server/global/security/service/CustomUserDetailsService.java index d2345d079..7facdf841 100644 --- a/src/main/java/com/gg/server/global/security/service/CustomUserDetailsService.java +++ b/src/main/java/com/gg/server/global/security/service/CustomUserDetailsService.java @@ -1,29 +1,29 @@ -package com.gg.server.global.security.service; - -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.service.UserFindService; -import com.gg.server.global.security.UserPrincipal; -import lombok.RequiredArgsConstructor; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@RequiredArgsConstructor -@Transactional -public class CustomUserDetailsService implements UserDetailsService { - - private final UserFindService userFindService; - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - User user = userFindService.findByIntraId(username); - return UserPrincipal.create(user); - } - - public UserDetails loadUserById(Long id) { - User user = userFindService.findUserById(id); - return UserPrincipal.create(user); - } -} +package com.gg.server.global.security.service; + +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.service.UserFindService; +import com.gg.server.global.security.UserPrincipal; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional +public class CustomUserDetailsService implements UserDetailsService { + + private final UserFindService userFindService; + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + User user = userFindService.findByIntraId(username); + return UserPrincipal.create(user); + } + + public UserDetails loadUserById(Long id) { + User user = userFindService.findUserById(id); + return UserPrincipal.create(user); + } +} diff --git a/src/main/java/com/gg/server/global/utils/UserImageHandler.java b/src/main/java/com/gg/server/global/utils/UserImageHandler.java index 4ebc65848..b4cf25754 100644 --- a/src/main/java/com/gg/server/global/utils/UserImageHandler.java +++ b/src/main/java/com/gg/server/global/utils/UserImageHandler.java @@ -1,76 +1,76 @@ -package com.gg.server.global.utils; - -import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.model.CannedAccessControlList; -import com.amazonaws.services.s3.model.DeleteObjectRequest; -import com.amazonaws.services.s3.model.ObjectMetadata; -import com.amazonaws.services.s3.model.PutObjectRequest; -import com.gg.server.domain.user.data.User; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.io.InputStream; -import java.util.UUID; - -@Component -public class UserImageHandler { - private final AmazonS3 amazonS3; - private final FileDownloader fileDownloader; - - public UserImageHandler(AmazonS3 amazonS3, FileDownloader fileDownloader) { - this.amazonS3 = amazonS3; - this.fileDownloader = fileDownloader; - } - - @Value("${cloud.aws.s3.bucket}") - private String bucketName; - - @Value("${cloud.aws.s3.dir}") - private String dir; - - @Value("${info.image.defaultUrl}") - private String defaultImageUrl; - - public String uploadAndGetS3ImageUri(String intraId, String imageUrl) { - if (!isStringValid(intraId) || !isStringValid(imageUrl)) { - return defaultImageUrl; - } - byte[] downloadedImageBytes = fileDownloader.downloadFromUrl(imageUrl); - try { - byte[] resizedImageBytes = ImageResizingUtil.resizeImageBytes(downloadedImageBytes, 0.5); - MultipartFile multipartFile = new JpegMultipartFile(resizedImageBytes, intraId); - return uploadToS3(multipartFile, multipartFile.getOriginalFilename()); - } catch (IOException e) { - return defaultImageUrl; - } - } - - public String updateAndGetS3ImageUri(MultipartFile multipartFile, User user) throws IOException - { - String imageUrl = user.getImageUri(); - String userFileName = imageUrl.split("/")[imageUrl.split("/").length - 1]; - String updateFileName = user.getIntraId() + "-" + UUID.randomUUID().toString() + ".jpeg"; - if (updateFileName.equals("small_default.jpeg")) - return defaultImageUrl; - else { - String s3ImageUrl = uploadToS3(multipartFile, updateFileName);; - if (!imageUrl.equals(defaultImageUrl)) - amazonS3.deleteObject(new DeleteObjectRequest(bucketName, dir + userFileName)); - return s3ImageUrl; - } - } - private Boolean isStringValid(String intraId) { - return intraId != null && intraId.length() != 0; - } - - public String uploadToS3(MultipartFile multipartFile, String fileName) throws IOException{ - String s3FileName = dir + fileName; - InputStream inputStream = multipartFile.getInputStream(); - ObjectMetadata objMeta = new ObjectMetadata(); - objMeta.setContentLength(multipartFile.getSize()); - amazonS3.putObject(new PutObjectRequest(bucketName, s3FileName, inputStream, objMeta).withCannedAcl(CannedAccessControlList.PublicRead)); - return amazonS3.getUrl(bucketName, s3FileName).toString(); - } -} +package com.gg.server.global.utils; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.CannedAccessControlList; +import com.amazonaws.services.s3.model.DeleteObjectRequest; +import com.amazonaws.services.s3.model.ObjectMetadata; +import com.amazonaws.services.s3.model.PutObjectRequest; +import com.gg.server.domain.user.data.User; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.io.InputStream; +import java.util.UUID; + +@Component +public class UserImageHandler { + private final AmazonS3 amazonS3; + private final FileDownloader fileDownloader; + + public UserImageHandler(AmazonS3 amazonS3, FileDownloader fileDownloader) { + this.amazonS3 = amazonS3; + this.fileDownloader = fileDownloader; + } + + @Value("${cloud.aws.s3.bucket}") + private String bucketName; + + @Value("${cloud.aws.s3.dir}") + private String dir; + + @Value("${info.image.defaultUrl}") + private String defaultImageUrl; + + public String uploadAndGetS3ImageUri(String intraId, String imageUrl) { + if (!isStringValid(intraId) || !isStringValid(imageUrl)) { + return defaultImageUrl; + } + byte[] downloadedImageBytes = fileDownloader.downloadFromUrl(imageUrl); + try { + byte[] resizedImageBytes = ImageResizingUtil.resizeImageBytes(downloadedImageBytes, 0.5); + MultipartFile multipartFile = new JpegMultipartFile(resizedImageBytes, intraId); + return uploadToS3(multipartFile, multipartFile.getOriginalFilename()); + } catch (IOException e) { + return defaultImageUrl; + } + } + + public String updateAndGetS3ImageUri(MultipartFile multipartFile, User user) throws IOException + { + String imageUrl = user.getImageUri(); + String userFileName = imageUrl.split("/")[imageUrl.split("/").length - 1]; + String updateFileName = user.getIntraId() + "-" + UUID.randomUUID().toString() + ".jpeg"; + if (updateFileName.equals("small_default.jpeg")) + return defaultImageUrl; + else { + String s3ImageUrl = uploadToS3(multipartFile, updateFileName);; + if (!imageUrl.equals(defaultImageUrl)) + amazonS3.deleteObject(new DeleteObjectRequest(bucketName, dir + userFileName)); + return s3ImageUrl; + } + } + private Boolean isStringValid(String intraId) { + return intraId != null && intraId.length() != 0; + } + + public String uploadToS3(MultipartFile multipartFile, String fileName) throws IOException{ + String s3FileName = dir + fileName; + InputStream inputStream = multipartFile.getInputStream(); + ObjectMetadata objMeta = new ObjectMetadata(); + objMeta.setContentLength(multipartFile.getSize()); + amazonS3.putObject(new PutObjectRequest(bucketName, s3FileName, inputStream, objMeta).withCannedAcl(CannedAccessControlList.PublicRead)); + return amazonS3.getUrl(bucketName, s3FileName).toString(); + } +} diff --git a/src/main/java/com/gg/server/global/utils/argumentresolver/LoginMemberArgumentResolver.java b/src/main/java/com/gg/server/global/utils/argumentresolver/LoginMemberArgumentResolver.java index df32529e4..36fabe80f 100644 --- a/src/main/java/com/gg/server/global/utils/argumentresolver/LoginMemberArgumentResolver.java +++ b/src/main/java/com/gg/server/global/utils/argumentresolver/LoginMemberArgumentResolver.java @@ -1,39 +1,39 @@ -package com.gg.server.global.utils.argumentresolver; - -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.domain.user.dto.UserDto; -import com.gg.server.global.security.jwt.utils.AuthTokenProvider; -import com.gg.server.global.utils.HeaderUtil; -import lombok.RequiredArgsConstructor; -import org.springframework.core.MethodParameter; -import org.springframework.web.bind.support.WebDataBinderFactory; -import org.springframework.web.context.request.NativeWebRequest; -import org.springframework.web.method.support.HandlerMethodArgumentResolver; -import org.springframework.web.method.support.ModelAndViewContainer; - -import javax.servlet.http.HttpServletRequest; - -@RequiredArgsConstructor -public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver { - private final UserRepository userRepository; - private final AuthTokenProvider tokenProvider; - - @Override - public boolean supportsParameter(MethodParameter parameter) { - boolean hasLoginAnnotation = parameter.hasParameterAnnotation(Login.class); - boolean hasUserType = UserDto.class.isAssignableFrom(parameter.getParameterType()); - return hasLoginAnnotation && hasUserType; - } - - @Override - public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, - NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { - HttpServletRequest request = (HttpServletRequest)webRequest.getNativeRequest(); - String accessToken = HeaderUtil.getAccessToken(request); - Long loginUserId = tokenProvider.getUserIdFromAccessToken(accessToken); - User user = userRepository.findById(loginUserId).orElseThrow(); - UserDto userDto = UserDto.from(user); - return userDto; - } -} +package com.gg.server.global.utils.argumentresolver; + +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.global.utils.HeaderUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.core.MethodParameter; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; + +import javax.servlet.http.HttpServletRequest; + +@RequiredArgsConstructor +public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver { + private final UserRepository userRepository; + private final AuthTokenProvider tokenProvider; + + @Override + public boolean supportsParameter(MethodParameter parameter) { + boolean hasLoginAnnotation = parameter.hasParameterAnnotation(Login.class); + boolean hasUserType = UserDto.class.isAssignableFrom(parameter.getParameterType()); + return hasLoginAnnotation && hasUserType; + } + + @Override + public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, + NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { + HttpServletRequest request = (HttpServletRequest)webRequest.getNativeRequest(); + String accessToken = HeaderUtil.getAccessToken(request); + Long loginUserId = tokenProvider.getUserIdFromAccessToken(accessToken); + User user = userRepository.findById(loginUserId).orElseThrow(); + UserDto userDto = UserDto.from(user); + return userDto; + } +} diff --git a/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java b/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java index 16e328c9b..de1126c40 100644 --- a/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java +++ b/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java @@ -1,57 +1,57 @@ -package com.gg.server.global.utils.aws; - -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.global.utils.UserImageHandler; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.multipart.MultipartFile; - -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import java.io.IOException; - -@Component -public class AsyncNewUserImageUploader { - private final UserImageHandler userImageHandler; - private final UserRepository userRepository; - @PersistenceContext - private EntityManager entityManager; - - @Value("${info.image.defaultUrl}") - private String defaultImageUrl; - - public AsyncNewUserImageUploader(UserImageHandler userImageHandler, UserRepository userRepository) { - this.userImageHandler = userImageHandler; - this.userRepository = userRepository; - } - - @Async("asyncExecutor") - public void upload(String intraId, String imageUrl) { - String s3ImageUrl = userImageHandler.uploadAndGetS3ImageUri(intraId, imageUrl); - if (defaultImageUrl.equals(s3ImageUrl)) { - return ; - } - userRepository.findByIntraId(intraId).ifPresent(user -> { - if (s3ImageUrl == null) { - user.imageUpdate(defaultImageUrl); - } else { - user.imageUpdate(s3ImageUrl); - } - userRepository.save(user); - }); - } - - @Transactional - public void update(String intraId, MultipartFile multipartFile) throws IOException { - User user = userRepository.getUserByIntraId(intraId); - String s3ImageUrl = userImageHandler.updateAndGetS3ImageUri(multipartFile, user); - if (s3ImageUrl == null) { - user.imageUpdate(defaultImageUrl); - } else { - user.imageUpdate(s3ImageUrl); - } - } -} +package com.gg.server.global.utils.aws; + +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.global.utils.UserImageHandler; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import java.io.IOException; + +@Component +public class AsyncNewUserImageUploader { + private final UserImageHandler userImageHandler; + private final UserRepository userRepository; + @PersistenceContext + private EntityManager entityManager; + + @Value("${info.image.defaultUrl}") + private String defaultImageUrl; + + public AsyncNewUserImageUploader(UserImageHandler userImageHandler, UserRepository userRepository) { + this.userImageHandler = userImageHandler; + this.userRepository = userRepository; + } + + @Async("asyncExecutor") + public void upload(String intraId, String imageUrl) { + String s3ImageUrl = userImageHandler.uploadAndGetS3ImageUri(intraId, imageUrl); + if (defaultImageUrl.equals(s3ImageUrl)) { + return ; + } + userRepository.findByIntraId(intraId).ifPresent(user -> { + if (s3ImageUrl == null) { + user.imageUpdate(defaultImageUrl); + } else { + user.imageUpdate(s3ImageUrl); + } + userRepository.save(user); + }); + } + + @Transactional + public void update(String intraId, MultipartFile multipartFile) throws IOException { + User user = userRepository.getUserByIntraId(intraId); + String s3ImageUrl = userImageHandler.updateAndGetS3ImageUri(multipartFile, user); + if (s3ImageUrl == null) { + user.imageUpdate(defaultImageUrl); + } else { + user.imageUpdate(s3ImageUrl); + } + } +} diff --git a/src/main/resources/db/migration/V2__migration_42gg_4th.sql b/src/main/resources/db/migration/V2__migration_42gg_4th.sql index 2f01fdb53..93d39fe6d 100644 --- a/src/main/resources/db/migration/V2__migration_42gg_4th.sql +++ b/src/main/resources/db/migration/V2__migration_42gg_4th.sql @@ -1,102 +1,102 @@ -create table coin_history -( - id bigint not null auto_increment, - amount integer, - created_at datetime(6) not null, - history varchar(30), - user_id bigint, - primary key (id) -); - -create table coin_policy -( - id bigint not null auto_increment, - user_id bigint, - attendance bigint, - created_at datetime(6) not null, - normal bigint, - rank_lose bigint, - rank_win bigint, - primary key (id) -); - -create table item -( - id bigint not null auto_increment, - content varchar(255), - created_at datetime(6) not null, - discount integer, - image_uri varchar(255), - is_visible bit not null, - name varchar(30), - price integer not null, - primary key (id) -); - -create table megaphone -( - id bigint not null auto_increment, - content varchar(30), - used_at date not null, - user_id bigint not null, - primary key (id) -); - -alter table ranks - add column tier_id bigint; - -create table receipt -( - id bigint not null auto_increment, - owner_intra_id varchar(255) not null, - created_at datetime(6) not null, - purchaser_intra_id varchar(255) not null, - status varchar(255) not null, - item_id bigint not null, - primary key (id) -); - -create table tier -( - id bigint not null auto_increment, - image_uri varchar(255), - name varchar(255), - primary key (id) -); - -alter table user - add column background varchar(255) default "basic"; - -alter table user - add column edge varchar(255) default "basic"; - -alter table user - add column gg_coin integer default 0; - -alter table user - add column text_color varchar(10); - -alter table coin_history - add constraint fk_coin_history_user_user_id - foreign key (user_id) - references user (id); - -alter table coin_policy - add constraint fk_coin_policy_user_user_id - foreign key (user_id) - references user (id); - -alter table megaphone - add constraint fk_megaphone_user_user_id - foreign key (user_id) - references user (id); - -alter table ranks - add constraint fk_ranks_tier_tier_id - foreign key (tier_id) - references tier (id); - -alter table receipt - add constraint fk_receipt_item_item_id - foreign key (item_id) +create table coin_history +( + id bigint not null auto_increment, + amount integer, + created_at datetime(6) not null, + history varchar(30), + user_id bigint, + primary key (id) +); + +create table coin_policy +( + id bigint not null auto_increment, + user_id bigint, + attendance integer, + created_at datetime(6) not null, + normal integer, + rank_lose integer, + rank_win integer, + primary key (id) +); + +create table item +( + id bigint not null auto_increment, + content varchar(255), + created_at datetime(6) not null, + discount integer, + image_uri varchar(255), + is_visible bit not null, + name varchar(30), + price integer not null, + primary key (id) +); + +create table megaphone +( + id bigint not null auto_increment, + content varchar(30), + used_at date not null, + user_id bigint not null, + primary key (id) +); + +alter table ranks + add column tier_id bigint; + +create table receipt +( + id bigint not null auto_increment, + owner_intra_id varchar(255) not null, + created_at datetime(6) not null, + purchaser_intra_id varchar(255) not null, + status varchar(255) not null, + item_id bigint not null, + primary key (id) +); + +create table tier +( + id bigint not null auto_increment, + image_uri varchar(255), + name varchar(255), + primary key (id) +); + +alter table user + add column background varchar(255) default "BASIC"; + +alter table user + add column edge varchar(255) default "BASIC"; + +alter table user + add column gg_coin integer default 0; + +alter table user + add column text_color varchar(10); + +alter table coin_history + add constraint fk_coin_history_user_user_id + foreign key (user_id) + references user (id); + +alter table coin_policy + add constraint fk_coin_policy_user_user_id + foreign key (user_id) + references user (id); + +alter table megaphone + add constraint fk_megaphone_user_user_id + foreign key (user_id) + references user (id); + +alter table ranks + add constraint fk_ranks_tier_tier_id + foreign key (tier_id) + references tier (id); + +alter table receipt + add constraint fk_receipt_item_item_id + foreign key (item_id) references item (id); \ No newline at end of file diff --git a/src/test/java/com/gg/server/admin/feedback/controller/FeedbackAdminControllerTest.java b/src/test/java/com/gg/server/admin/feedback/controller/FeedbackAdminControllerTest.java index e056c7921..da6b005ef 100644 --- a/src/test/java/com/gg/server/admin/feedback/controller/FeedbackAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/feedback/controller/FeedbackAdminControllerTest.java @@ -1,128 +1,128 @@ -package com.gg.server.admin.feedback.controller; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.gg.server.admin.feedback.data.FeedbackAdminRepository; -import com.gg.server.admin.feedback.dto.FeedbackListAdminResponseDto; -import com.gg.server.domain.feedback.data.Feedback; -import com.gg.server.domain.feedback.type.FeedbackType; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.global.security.jwt.utils.AuthTokenProvider; -import com.gg.server.utils.TestDataUtils; -import lombok.RequiredArgsConstructor; -import org.apache.http.HttpHeaders; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.transaction.annotation.Transactional; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@RequiredArgsConstructor -@SpringBootTest -@AutoConfigureMockMvc -@Transactional -class FeedbackAdminControllerTest { - @Autowired - TestDataUtils testDataUtils; - - @Autowired - private MockMvc mockMvc; - - @Autowired - ObjectMapper objectMapper; - - @Autowired - AuthTokenProvider tokenProvider; - - @Autowired - FeedbackAdminRepository feedbackAdminRepository; - @Autowired - UserRepository userRepository; - - @Test - @DisplayName("[Get]/pingpong/admin/feedback") - void getFeedback() throws Exception { - String accessToken = testDataUtils.getAdminLoginAccessToken(); - Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); - - Integer currentPage = 1; - Integer pageSize = 5;//페이지 사이즈 크기가 실제 디비 정보보다 큰지 확인할 것 - - String url = "/pingpong/admin/feedback?page=" + currentPage + "&size=" + pageSize; - - String contentAsString = mockMvc.perform(get(url) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - - - FeedbackListAdminResponseDto result = objectMapper.readValue(contentAsString, FeedbackListAdminResponseDto.class); - assertThat(result.getFeedbackList().size()).isEqualTo(5); - System.out.println(result.getFeedbackList().get(0).getId()); - System.out.println(result.getFeedbackList().get(0).getContent()); - - } - - @Test - @DisplayName("[Patch]pingpong/admin/feedback/{id}") - void patchFeedback() throws Exception { - String accessToken = testDataUtils.getAdminLoginAccessToken(); - Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); - - Feedback feedback = Feedback.builder() - .category(FeedbackType.ETC) - .content("test1234") - .user(userRepository.findById(userId).get()) - .build(); - feedbackAdminRepository.save(feedback); - - String url = "/pingpong/admin/feedback/" + feedback.getId().toString(); - Boolean status = feedback.getIsSolved(); - - String contentAsString = mockMvc.perform(patch(url) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isNoContent()) - .andReturn().getResponse().getContentAsString(); - - - } - - @Test - @DisplayName("[get]pingpong/admin/feedback?intraId=${intraId}&page=${pageNumber}&size={size}") - void findFeedbackByIntraId() throws Exception { - String accessToken = testDataUtils.getAdminLoginAccessToken(); - Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); - - User user = userRepository.findById(userId).get(); - - Feedback feedback = Feedback.builder() - .category(FeedbackType.ETC) - .content("test1234") - .user(user) - .build(); - feedbackAdminRepository.save(feedback); - - Integer currentPage = 1; - Integer pageSize = 5;//페이지 사이즈 크기가 실제 디비 정보보다 큰지 확인할 것 - - String url = "/pingpong/admin/feedback?intraId=" + user.getIntraId() + "&page=" + currentPage + "&size=" + pageSize; - Boolean status = feedback.getIsSolved(); - - String contentAsString = mockMvc.perform(get(url) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - - FeedbackListAdminResponseDto result = objectMapper.readValue(contentAsString, FeedbackListAdminResponseDto.class); - assertThat(result.getFeedbackList().size()).isBetween(0, 5); - assertThat(result.getFeedbackList().get(0).getIntraId()).isEqualTo(user.getIntraId()); - assertThat(result.getFeedbackList().get(0).getContent()).isEqualTo("test1234"); - assertThat(result.getFeedbackList().get(0).getIntraId()).isEqualTo(user.getIntraId()); - } +package com.gg.server.admin.feedback.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.admin.feedback.data.FeedbackAdminRepository; +import com.gg.server.admin.feedback.dto.FeedbackListAdminResponseDto; +import com.gg.server.domain.feedback.data.Feedback; +import com.gg.server.domain.feedback.type.FeedbackType; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import lombok.RequiredArgsConstructor; +import org.apache.http.HttpHeaders; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RequiredArgsConstructor +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +class FeedbackAdminControllerTest { + @Autowired + TestDataUtils testDataUtils; + + @Autowired + private MockMvc mockMvc; + + @Autowired + ObjectMapper objectMapper; + + @Autowired + AuthTokenProvider tokenProvider; + + @Autowired + FeedbackAdminRepository feedbackAdminRepository; + @Autowired + UserRepository userRepository; + + @Test + @DisplayName("[Get]/pingpong/admin/feedback") + void getFeedback() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + + Integer currentPage = 1; + Integer pageSize = 5;//페이지 사이즈 크기가 실제 디비 정보보다 큰지 확인할 것 + + String url = "/pingpong/admin/feedback?page=" + currentPage + "&size=" + pageSize; + + String contentAsString = mockMvc.perform(get(url) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + + + FeedbackListAdminResponseDto result = objectMapper.readValue(contentAsString, FeedbackListAdminResponseDto.class); + assertThat(result.getFeedbackList().size()).isEqualTo(5); + System.out.println(result.getFeedbackList().get(0).getId()); + System.out.println(result.getFeedbackList().get(0).getContent()); + + } + + @Test + @DisplayName("[Patch]pingpong/admin/feedback/{id}") + void patchFeedback() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + + Feedback feedback = Feedback.builder() + .category(FeedbackType.ETC) + .content("test1234") + .user(userRepository.findById(userId).get()) + .build(); + feedbackAdminRepository.save(feedback); + + String url = "/pingpong/admin/feedback/" + feedback.getId().toString(); + Boolean status = feedback.getIsSolved(); + + String contentAsString = mockMvc.perform(patch(url) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isNoContent()) + .andReturn().getResponse().getContentAsString(); + + + } + + @Test + @DisplayName("[get]pingpong/admin/feedback?intraId=${intraId}&page=${pageNumber}&size={size}") + void findFeedbackByIntraId() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + + User user = userRepository.findById(userId).get(); + + Feedback feedback = Feedback.builder() + .category(FeedbackType.ETC) + .content("test1234") + .user(user) + .build(); + feedbackAdminRepository.save(feedback); + + Integer currentPage = 1; + Integer pageSize = 5;//페이지 사이즈 크기가 실제 디비 정보보다 큰지 확인할 것 + + String url = "/pingpong/admin/feedback?intraId=" + user.getIntraId() + "&page=" + currentPage + "&size=" + pageSize; + Boolean status = feedback.getIsSolved(); + + String contentAsString = mockMvc.perform(get(url) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + + FeedbackListAdminResponseDto result = objectMapper.readValue(contentAsString, FeedbackListAdminResponseDto.class); + assertThat(result.getFeedbackList().size()).isBetween(0, 5); + assertThat(result.getFeedbackList().get(0).getIntraId()).isEqualTo(user.getIntraId()); + assertThat(result.getFeedbackList().get(0).getContent()).isEqualTo("test1234"); + assertThat(result.getFeedbackList().get(0).getIntraId()).isEqualTo(user.getIntraId()); + } } \ No newline at end of file diff --git a/src/test/java/com/gg/server/admin/game/controller/GameAdminControllerTest.java b/src/test/java/com/gg/server/admin/game/controller/GameAdminControllerTest.java index 9f600cb7a..f0c23b2a1 100644 --- a/src/test/java/com/gg/server/admin/game/controller/GameAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/game/controller/GameAdminControllerTest.java @@ -1,177 +1,177 @@ -package com.gg.server.admin.game.controller; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.gg.server.admin.game.dto.GameLogListAdminResponseDto; -import com.gg.server.admin.game.dto.RankGamePPPModifyReqDto; -import com.gg.server.domain.game.data.GameRepository; -import com.gg.server.domain.game.dto.GameTeamUser; -import com.gg.server.domain.game.dto.req.RankResultReqDto; -import com.gg.server.domain.game.service.GameService; -import com.gg.server.domain.game.type.Mode; -import com.gg.server.domain.match.service.GameUpdateService; -import com.gg.server.domain.rank.data.Rank; -import com.gg.server.domain.rank.data.RankRepository; -import com.gg.server.domain.rank.redis.RankRedisRepository; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.domain.user.controller.dto.GameInfoDto; -import com.gg.server.global.security.jwt.utils.AuthTokenProvider; -import com.gg.server.utils.TestDataUtils; -import lombok.RequiredArgsConstructor; -import org.apache.http.HttpHeaders; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@RequiredArgsConstructor -@SpringBootTest -@AutoConfigureMockMvc -@Transactional -class GameAdminControllerTest { - @Autowired - TestDataUtils testDataUtils; - - @Autowired - private MockMvc mockMvc; - - @Autowired - ObjectMapper objectMapper; - - @Autowired - AuthTokenProvider tokenProvider; - - @Autowired - GameRepository gameRepository; - - @Autowired - UserRepository userRepository; - - @Autowired - GameUpdateService gameUpdateService; - - @Autowired - GameService gameService; - - @Autowired - RankRepository rankRepository; - - @Autowired - RankRedisRepository rankRedisRepository; - - - @Test - @DisplayName("[Get]/pingpong/admin/games/users?intraId=${intraId}&page=${pageNumber}&size={sizeNum}") - void getUserGameList() throws Exception { - String accessToken = testDataUtils.getAdminLoginAccessToken(); - Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); - - Integer currentPage = 2; - Integer pageSize = 5;//페이지 사이즈 크기가 실제 디비 정보보다 큰지 확인할 것 - - String url = "/pingpong/admin/games/users?intraId=" - + "nheo" + "&page=" + currentPage + "&size=" + pageSize; - - String contentAsString = mockMvc.perform(get(url) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - - GameLogListAdminResponseDto result = objectMapper.readValue(contentAsString, GameLogListAdminResponseDto.class); - assertThat(result.getGameLogList().size()).isEqualTo(pageSize); - System.out.println(result.getGameLogList().get(0).getGameId()); - System.out.println(result.getGameLogList().get(0).getStartAt()); - System.out.println(result.getGameLogList().get(0).getMode()); - - } - - @Test - @DisplayName("[PUT] /pingpong/admin/games") - @Transactional - public void 관리자게임전적수정테스트() throws Exception { - String url = "/pingpong/admin/games"; - Mode currentMatchMode = Mode.RANK; - Season season = testDataUtils.createSeason(); - String accessToken = testDataUtils.getAdminLoginAccessToken(); - Long adminUserId = tokenProvider.getUserIdFromAccessToken(accessToken); - User adminUser = userRepository.findById(adminUserId).get(); - GameInfoDto game1Info = testDataUtils.createGame(adminUser, LocalDateTime.now().minusMinutes(5), LocalDateTime.now().plusMinutes(5), season, currentMatchMode); - - User enemyUser1 = userRepository.findById(game1Info.getEnemyUserId()).get(); - testDataUtils.createUserRank(adminUser, "adminUserMessage", season); - testDataUtils.createUserRank(enemyUser1, "enemy111UserMessage", season); - - RankResultReqDto rankResultReqDto = new RankResultReqDto(game1Info.getGameId(), - game1Info.getMyTeamId(), - 2, - game1Info.getEnemyTeamId(), - 1); - gameService.createRankResult(rankResultReqDto, adminUserId); - - Rank adminUserRank = rankRepository.findByUserIdAndSeasonId(adminUserId, season.getId()).get(); - Rank enemyUser1Rank = rankRepository.findByUserIdAndSeasonId(enemyUser1.getId(), season.getId()).get(); - System.out.println("MANGO ADMIN1 before DB PPP : " + adminUserRank.getPpp()); - System.out.println("MANGO ENEMY1 before DB PPP : " + enemyUser1Rank.getPpp()); - - - RankGamePPPModifyReqDto modifyReqDto = new RankGamePPPModifyReqDto(game1Info.getMyTeamId(), 1, game1Info.getEnemyTeamId(), 0); - mockMvc.perform(put("/pingpong/admin/games/" + game1Info.getGameId()) - .content(objectMapper.writeValueAsString(modifyReqDto)) - .contentType(MediaType.APPLICATION_JSON) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().is2xxSuccessful()) - .andReturn().getResponse().getContentAsString(); - GameTeamUser historyGame1 = gameRepository.findTeamsByGameIsIn(List.of(game1Info.getGameId())).get(0); - - adminUserRank = rankRepository.findByUserIdAndSeasonId(adminUserId, season.getId()).get(); - enemyUser1Rank = rankRepository.findByUserIdAndSeasonId(enemyUser1.getId(), season.getId()).get(); - System.out.println("MANGO ADMIN1 after DB PPP : " + adminUserRank.getPpp()); - System.out.println("MANGO ENEMY1 after DB PPP : " + enemyUser1Rank.getPpp()); - - ////////////////////////////// - Thread.sleep(1000); - ////////////////////////////// - GameInfoDto game2Info = testDataUtils.createGame(adminUser, LocalDateTime.now().minusMinutes(4), LocalDateTime.now().plusMinutes(6), season, currentMatchMode); - User enemyUser2 = userRepository.findById(game2Info.getEnemyUserId()).get(); - testDataUtils.createUserRank(adminUser, "adminUserMessage", season); - testDataUtils.createUserRank(enemyUser2, "enemy222UserMessage", season); - - rankResultReqDto = new RankResultReqDto(game2Info.getGameId(), - game2Info.getMyTeamId(), - 1, - game2Info.getEnemyTeamId(), - 2); - gameService.createRankResult(rankResultReqDto, adminUserId); - - adminUserRank = rankRepository.findByUserIdAndSeasonId(adminUserId, season.getId()).get(); - Rank enemyUser2Rank = rankRepository.findByUserIdAndSeasonId(enemyUser2.getId(), season.getId()).get(); - System.out.println("MANGO ADMIN2 before DB PPP : " + adminUserRank.getPpp()); - System.out.println("MANGO ENEMY2 before DB PPP : " + enemyUser2Rank.getPpp()); - - - modifyReqDto = new RankGamePPPModifyReqDto(game2Info.getMyTeamId(), 0, game2Info.getEnemyTeamId(), 1); - mockMvc.perform(put("/pingpong/admin/games/" + game2Info.getGameId()) - .content(objectMapper.writeValueAsString(modifyReqDto)) - .contentType(MediaType.APPLICATION_JSON) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().is2xxSuccessful()) - .andReturn().getResponse().getContentAsString(); - - adminUserRank = rankRepository.findByUserIdAndSeasonId(adminUserId, season.getId()).get(); - enemyUser2Rank = rankRepository.findByUserIdAndSeasonId(enemyUser2.getId(), season.getId()).get(); - System.out.println("MANGO ADMIN2 after DB PPP : " + adminUserRank.getPpp()); - System.out.println("MANGO ENEMY2 after DB PPP : " + enemyUser2Rank.getPpp()); - } +package com.gg.server.admin.game.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.admin.game.dto.GameLogListAdminResponseDto; +import com.gg.server.admin.game.dto.RankGamePPPModifyReqDto; +import com.gg.server.domain.game.data.GameRepository; +import com.gg.server.domain.game.dto.GameTeamUser; +import com.gg.server.domain.game.dto.req.RankResultReqDto; +import com.gg.server.domain.game.service.GameService; +import com.gg.server.domain.game.type.Mode; +import com.gg.server.domain.match.service.GameUpdateService; +import com.gg.server.domain.rank.data.Rank; +import com.gg.server.domain.rank.data.RankRepository; +import com.gg.server.domain.rank.redis.RankRedisRepository; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.controller.dto.GameInfoDto; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import lombok.RequiredArgsConstructor; +import org.apache.http.HttpHeaders; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RequiredArgsConstructor +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +class GameAdminControllerTest { + @Autowired + TestDataUtils testDataUtils; + + @Autowired + private MockMvc mockMvc; + + @Autowired + ObjectMapper objectMapper; + + @Autowired + AuthTokenProvider tokenProvider; + + @Autowired + GameRepository gameRepository; + + @Autowired + UserRepository userRepository; + + @Autowired + GameUpdateService gameUpdateService; + + @Autowired + GameService gameService; + + @Autowired + RankRepository rankRepository; + + @Autowired + RankRedisRepository rankRedisRepository; + + + @Test + @DisplayName("[Get]/pingpong/admin/games/users?intraId=${intraId}&page=${pageNumber}&size={sizeNum}") + void getUserGameList() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + + Integer currentPage = 2; + Integer pageSize = 5;//페이지 사이즈 크기가 실제 디비 정보보다 큰지 확인할 것 + + String url = "/pingpong/admin/games/users?intraId=" + + "nheo" + "&page=" + currentPage + "&size=" + pageSize; + + String contentAsString = mockMvc.perform(get(url) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + + GameLogListAdminResponseDto result = objectMapper.readValue(contentAsString, GameLogListAdminResponseDto.class); + assertThat(result.getGameLogList().size()).isEqualTo(pageSize); + System.out.println(result.getGameLogList().get(0).getGameId()); + System.out.println(result.getGameLogList().get(0).getStartAt()); + System.out.println(result.getGameLogList().get(0).getMode()); + + } + + @Test + @DisplayName("[PUT] /pingpong/admin/games") + @Transactional + public void 관리자게임전적수정테스트() throws Exception { + String url = "/pingpong/admin/games"; + Mode currentMatchMode = Mode.RANK; + Season season = testDataUtils.createSeason(); + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Long adminUserId = tokenProvider.getUserIdFromAccessToken(accessToken); + User adminUser = userRepository.findById(adminUserId).get(); + GameInfoDto game1Info = testDataUtils.createGame(adminUser, LocalDateTime.now().minusMinutes(5), LocalDateTime.now().plusMinutes(5), season, currentMatchMode); + + User enemyUser1 = userRepository.findById(game1Info.getEnemyUserId()).get(); + testDataUtils.createUserRank(adminUser, "adminUserMessage", season); + testDataUtils.createUserRank(enemyUser1, "enemy111UserMessage", season); + + RankResultReqDto rankResultReqDto = new RankResultReqDto(game1Info.getGameId(), + game1Info.getMyTeamId(), + 2, + game1Info.getEnemyTeamId(), + 1); + gameService.createRankResult(rankResultReqDto, adminUserId); + + Rank adminUserRank = rankRepository.findByUserIdAndSeasonId(adminUserId, season.getId()).get(); + Rank enemyUser1Rank = rankRepository.findByUserIdAndSeasonId(enemyUser1.getId(), season.getId()).get(); + System.out.println("MANGO ADMIN1 before DB PPP : " + adminUserRank.getPpp()); + System.out.println("MANGO ENEMY1 before DB PPP : " + enemyUser1Rank.getPpp()); + + + RankGamePPPModifyReqDto modifyReqDto = new RankGamePPPModifyReqDto(game1Info.getMyTeamId(), 1, game1Info.getEnemyTeamId(), 0); + mockMvc.perform(put("/pingpong/admin/games/" + game1Info.getGameId()) + .content(objectMapper.writeValueAsString(modifyReqDto)) + .contentType(MediaType.APPLICATION_JSON) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().is2xxSuccessful()) + .andReturn().getResponse().getContentAsString(); + GameTeamUser historyGame1 = gameRepository.findTeamsByGameIsIn(List.of(game1Info.getGameId())).get(0); + + adminUserRank = rankRepository.findByUserIdAndSeasonId(adminUserId, season.getId()).get(); + enemyUser1Rank = rankRepository.findByUserIdAndSeasonId(enemyUser1.getId(), season.getId()).get(); + System.out.println("MANGO ADMIN1 after DB PPP : " + adminUserRank.getPpp()); + System.out.println("MANGO ENEMY1 after DB PPP : " + enemyUser1Rank.getPpp()); + + ////////////////////////////// + Thread.sleep(1000); + ////////////////////////////// + GameInfoDto game2Info = testDataUtils.createGame(adminUser, LocalDateTime.now().minusMinutes(4), LocalDateTime.now().plusMinutes(6), season, currentMatchMode); + User enemyUser2 = userRepository.findById(game2Info.getEnemyUserId()).get(); + testDataUtils.createUserRank(adminUser, "adminUserMessage", season); + testDataUtils.createUserRank(enemyUser2, "enemy222UserMessage", season); + + rankResultReqDto = new RankResultReqDto(game2Info.getGameId(), + game2Info.getMyTeamId(), + 1, + game2Info.getEnemyTeamId(), + 2); + gameService.createRankResult(rankResultReqDto, adminUserId); + + adminUserRank = rankRepository.findByUserIdAndSeasonId(adminUserId, season.getId()).get(); + Rank enemyUser2Rank = rankRepository.findByUserIdAndSeasonId(enemyUser2.getId(), season.getId()).get(); + System.out.println("MANGO ADMIN2 before DB PPP : " + adminUserRank.getPpp()); + System.out.println("MANGO ENEMY2 before DB PPP : " + enemyUser2Rank.getPpp()); + + + modifyReqDto = new RankGamePPPModifyReqDto(game2Info.getMyTeamId(), 0, game2Info.getEnemyTeamId(), 1); + mockMvc.perform(put("/pingpong/admin/games/" + game2Info.getGameId()) + .content(objectMapper.writeValueAsString(modifyReqDto)) + .contentType(MediaType.APPLICATION_JSON) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().is2xxSuccessful()) + .andReturn().getResponse().getContentAsString(); + + adminUserRank = rankRepository.findByUserIdAndSeasonId(adminUserId, season.getId()).get(); + enemyUser2Rank = rankRepository.findByUserIdAndSeasonId(enemyUser2.getId(), season.getId()).get(); + System.out.println("MANGO ADMIN2 after DB PPP : " + adminUserRank.getPpp()); + System.out.println("MANGO ENEMY2 after DB PPP : " + enemyUser2Rank.getPpp()); + } } \ No newline at end of file diff --git a/src/test/java/com/gg/server/admin/noti/controller/NotiAdminControllerTest.java b/src/test/java/com/gg/server/admin/noti/controller/NotiAdminControllerTest.java index 88a7807f5..2daaec8bf 100644 --- a/src/test/java/com/gg/server/admin/noti/controller/NotiAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/noti/controller/NotiAdminControllerTest.java @@ -1,142 +1,142 @@ -package com.gg.server.admin.noti.controller; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.gg.server.admin.noti.data.NotiAdminRepository; -import com.gg.server.admin.noti.dto.NotiAdminDto; -import com.gg.server.admin.noti.dto.NotiListAdminResponseDto; -import com.gg.server.admin.noti.dto.SendNotiAdminRequestDto; -import com.gg.server.admin.noti.service.NotiAdminService; -import com.gg.server.domain.noti.data.Noti; -import com.gg.server.domain.noti.data.NotiRepository; -import com.gg.server.domain.noti.type.NotiType; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.global.security.jwt.utils.AuthTokenProvider; -import com.gg.server.utils.TestDataUtils; -import lombok.RequiredArgsConstructor; -import org.apache.http.HttpHeaders; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; - -import javax.transaction.Transactional; - -import java.util.List; -import java.util.UUID; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@RequiredArgsConstructor -@SpringBootTest -@AutoConfigureMockMvc -class NotiAdminControllerTest { - @Autowired - TestDataUtils testDataUtils; - @Autowired - AuthTokenProvider tokenProvider; - @Autowired - UserRepository userRepository; - @Autowired - NotiAdminService notiAdminService; - @Autowired - NotiAdminRepository notiAdminRepository; - @Autowired - NotiRepository notiRepository; - @Autowired - MockMvc mockMvc; - @Autowired - ObjectMapper objectMapper; - - @Test - @DisplayName("GET /pingpong/admin/notifications") - @Transactional - public void getAllNotiTest() throws Exception { - //given - String accessToken = testDataUtils.getAdminLoginAccessToken(); - Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); - User user = userRepository.findById(userId).get(); - String testMessage = "Test notification"; - notiAdminService.sendAnnounceNotiToUser(new SendNotiAdminRequestDto(user.getIntraId(), testMessage)); - String url = "/pingpong/admin/notifications?page=1&size=20"; - String url2 = "/pingpong/admin/notifications?page=1&q=\"" + user.getIntraId() + "\""; - - //when - //200 성공(전체조회) - String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - NotiListAdminResponseDto actureResponse1 = objectMapper.readValue(contentAsString, NotiListAdminResponseDto.class); - //200 성공(검색조회) - String contentAsString2 = mockMvc.perform(get(url2).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - NotiListAdminResponseDto actureResponse2 = objectMapper.readValue(contentAsString, NotiListAdminResponseDto.class); - Pageable pageable = PageRequest.of(0, 20); - Sort.by("createdAt").descending().and(Sort.by("user.intraId").ascending()); - - //then - List notiList1 = notiAdminRepository.findAll(pageable).getContent(); - List expectedNotiAdminDtoList = actureResponse1.getNotiList(); - for (int i = 0; i < notiList1.size(); i++) { - Assertions.assertThat(expectedNotiAdminDtoList.get(i).getIntraId()).isEqualTo(expectedNotiAdminDtoList.get(i).getIntraId()); - Assertions.assertThat(expectedNotiAdminDtoList.get(i).getMessage()).isEqualTo(expectedNotiAdminDtoList.get(i).getMessage()); - Assertions.assertThat(expectedNotiAdminDtoList.get(i).getIsChecked()).isEqualTo(expectedNotiAdminDtoList.get(i).getIsChecked()); - Assertions.assertThat(expectedNotiAdminDtoList.get(i).getType()).isEqualTo(expectedNotiAdminDtoList.get(i).getType()); - } - - List notiList2 = notiRepository.findByUser(user); - Assertions.assertThat(notiList2.size()).isEqualTo(1); - Noti expectedNoti2 = notiList2.get(0); - NotiAdminDto actureNotiResponseDto2 = actureResponse2.getNotiList().get(0); - Assertions.assertThat(expectedNoti2.getUser().getIntraId()).isEqualTo(actureNotiResponseDto2.getIntraId()); - Assertions.assertThat(expectedNoti2.getMessage()).isEqualTo(testMessage); - Assertions.assertThat(expectedNoti2.getIsChecked()).isFalse(); - Assertions.assertThat(expectedNoti2.getType()).isEqualTo(NotiType.ANNOUNCE); - } - - @Test - @DisplayName("POST /pingpong/admin/notifications") - @Transactional - public void sendNotiToUserTest() throws Exception { - //given - String accessToken = testDataUtils.getAdminLoginAccessToken(); - Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); - User user = userRepository.findById(userId).get(); - String url = "/pingpong/admin/notifications"; - String wrongIntraId = UUID.randomUUID().toString().substring(0, 30); - String expectedMessage = "test 알림 message "; - - //when - //201 성공 - mockMvc.perform(post(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new SendNotiAdminRequestDto(user.getIntraId(), expectedMessage)))) - .andExpect(status().isCreated()); - - //404 존재하지 않는 intraId - mockMvc.perform(post(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new SendNotiAdminRequestDto(wrongIntraId, expectedMessage)))) - .andExpect(status().isNotFound()); - - //then - List notiList = notiRepository.findByUser(user); - Assertions.assertThat(notiList.size()).isEqualTo(1); - Noti actureNoti = notiList.get(0); - Assertions.assertThat(actureNoti.getUser()).isEqualTo(user); - Assertions.assertThat(actureNoti.getMessage()).isEqualTo(expectedMessage); - Assertions.assertThat(actureNoti.getIsChecked()).isFalse(); - Assertions.assertThat(actureNoti.getType()).isEqualTo(NotiType.ANNOUNCE); - } -} +package com.gg.server.admin.noti.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.admin.noti.data.NotiAdminRepository; +import com.gg.server.admin.noti.dto.NotiAdminDto; +import com.gg.server.admin.noti.dto.NotiListAdminResponseDto; +import com.gg.server.admin.noti.dto.SendNotiAdminRequestDto; +import com.gg.server.admin.noti.service.NotiAdminService; +import com.gg.server.domain.noti.data.Noti; +import com.gg.server.domain.noti.data.NotiRepository; +import com.gg.server.domain.noti.type.NotiType; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import lombok.RequiredArgsConstructor; +import org.apache.http.HttpHeaders; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; + +import javax.transaction.Transactional; + +import java.util.List; +import java.util.UUID; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RequiredArgsConstructor +@SpringBootTest +@AutoConfigureMockMvc +class NotiAdminControllerTest { + @Autowired + TestDataUtils testDataUtils; + @Autowired + AuthTokenProvider tokenProvider; + @Autowired + UserRepository userRepository; + @Autowired + NotiAdminService notiAdminService; + @Autowired + NotiAdminRepository notiAdminRepository; + @Autowired + NotiRepository notiRepository; + @Autowired + MockMvc mockMvc; + @Autowired + ObjectMapper objectMapper; + + @Test + @DisplayName("GET /pingpong/admin/notifications") + @Transactional + public void getAllNotiTest() throws Exception { + //given + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + User user = userRepository.findById(userId).get(); + String testMessage = "Test notification"; + notiAdminService.sendAnnounceNotiToUser(new SendNotiAdminRequestDto(user.getIntraId(), testMessage)); + String url = "/pingpong/admin/notifications?page=1&size=20"; + String url2 = "/pingpong/admin/notifications?page=1&q=\"" + user.getIntraId() + "\""; + + //when + //200 성공(전체조회) + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + NotiListAdminResponseDto actureResponse1 = objectMapper.readValue(contentAsString, NotiListAdminResponseDto.class); + //200 성공(검색조회) + String contentAsString2 = mockMvc.perform(get(url2).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + NotiListAdminResponseDto actureResponse2 = objectMapper.readValue(contentAsString, NotiListAdminResponseDto.class); + Pageable pageable = PageRequest.of(0, 20); + Sort.by("createdAt").descending().and(Sort.by("user.intraId").ascending()); + + //then + List notiList1 = notiAdminRepository.findAll(pageable).getContent(); + List expectedNotiAdminDtoList = actureResponse1.getNotiList(); + for (int i = 0; i < notiList1.size(); i++) { + Assertions.assertThat(expectedNotiAdminDtoList.get(i).getIntraId()).isEqualTo(expectedNotiAdminDtoList.get(i).getIntraId()); + Assertions.assertThat(expectedNotiAdminDtoList.get(i).getMessage()).isEqualTo(expectedNotiAdminDtoList.get(i).getMessage()); + Assertions.assertThat(expectedNotiAdminDtoList.get(i).getIsChecked()).isEqualTo(expectedNotiAdminDtoList.get(i).getIsChecked()); + Assertions.assertThat(expectedNotiAdminDtoList.get(i).getType()).isEqualTo(expectedNotiAdminDtoList.get(i).getType()); + } + + List notiList2 = notiRepository.findByUser(user); + Assertions.assertThat(notiList2.size()).isEqualTo(1); + Noti expectedNoti2 = notiList2.get(0); + NotiAdminDto actureNotiResponseDto2 = actureResponse2.getNotiList().get(0); + Assertions.assertThat(expectedNoti2.getUser().getIntraId()).isEqualTo(actureNotiResponseDto2.getIntraId()); + Assertions.assertThat(expectedNoti2.getMessage()).isEqualTo(testMessage); + Assertions.assertThat(expectedNoti2.getIsChecked()).isFalse(); + Assertions.assertThat(expectedNoti2.getType()).isEqualTo(NotiType.ANNOUNCE); + } + + @Test + @DisplayName("POST /pingpong/admin/notifications") + @Transactional + public void sendNotiToUserTest() throws Exception { + //given + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + User user = userRepository.findById(userId).get(); + String url = "/pingpong/admin/notifications"; + String wrongIntraId = UUID.randomUUID().toString().substring(0, 30); + String expectedMessage = "test 알림 message "; + + //when + //201 성공 + mockMvc.perform(post(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(new SendNotiAdminRequestDto(user.getIntraId(), expectedMessage)))) + .andExpect(status().isCreated()); + + //404 존재하지 않는 intraId + mockMvc.perform(post(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(new SendNotiAdminRequestDto(wrongIntraId, expectedMessage)))) + .andExpect(status().isNotFound()); + + //then + List notiList = notiRepository.findByUser(user); + Assertions.assertThat(notiList.size()).isEqualTo(1); + Noti actureNoti = notiList.get(0); + Assertions.assertThat(actureNoti.getUser()).isEqualTo(user); + Assertions.assertThat(actureNoti.getMessage()).isEqualTo(expectedMessage); + Assertions.assertThat(actureNoti.getIsChecked()).isFalse(); + Assertions.assertThat(actureNoti.getType()).isEqualTo(NotiType.ANNOUNCE); + } +} diff --git a/src/test/java/com/gg/server/admin/penalty/controller/PenaltyAdminControllerTest.java b/src/test/java/com/gg/server/admin/penalty/controller/PenaltyAdminControllerTest.java index c0bfb8213..5404fe23f 100644 --- a/src/test/java/com/gg/server/admin/penalty/controller/PenaltyAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/penalty/controller/PenaltyAdminControllerTest.java @@ -1,355 +1,355 @@ -package com.gg.server.admin.penalty.controller; - -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.put; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.gg.server.admin.penalty.data.PenaltyAdminRepository; -import com.gg.server.domain.penalty.data.Penalty; -import com.gg.server.domain.penalty.redis.RedisPenaltyUser; -import com.gg.server.admin.penalty.data.PenaltyUserAdminRedisRepository; -import com.gg.server.admin.penalty.dto.PenaltyListResponseDto; -import com.gg.server.admin.penalty.dto.PenaltyRequestDto; -import com.gg.server.admin.penalty.service.PenaltyAdminService; -import com.gg.server.domain.penalty.type.PenaltyType; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.domain.user.type.RacketType; -import com.gg.server.domain.user.type.RoleType; -import com.gg.server.domain.user.type.SnsType; -import com.gg.server.global.security.jwt.utils.AuthTokenProvider; -import com.gg.server.utils.TestDataUtils; -import java.time.Duration; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.UUID; -import java.util.stream.Collectors; -import org.apache.http.HttpHeaders; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.redis.connection.RedisConnection; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.http.MediaType; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.transaction.annotation.Transactional; - -@SpringBootTest -@AutoConfigureMockMvc -@ActiveProfiles("local") -@Transactional -class PenaltyAdminControllerTest { - @Autowired - TestDataUtils testDataUtils; - @Autowired - MockMvc mockMvc; - @Autowired - ObjectMapper objectMapper; - @Autowired - UserRepository userRepository; - @Autowired - PenaltyUserAdminRedisRepository penaltyUserAdminRedisRepository; - @Autowired - PenaltyAdminRepository penaltyAdminRepository; - @Autowired - AuthTokenProvider tokenProvider; - @Autowired - RedisConnectionFactory redisConnectionFactory; - @Autowired - PenaltyAdminService penaltyAdminService; - - private final String headUrl = "/pingpong/admin/"; - - @AfterEach - void clear() { - RedisConnection connection = redisConnectionFactory.getConnection(); - connection.flushDb(); - connection.close(); - } - - @Test - @DisplayName("POST : penalty를 부여받지 않은 유효한 intraId에 penalty 부여") - public void giveUserPenaltyforFirstTimeWithValidIntraId() throws Exception { - String accessToken = testDataUtils.getAdminLoginAccessToken(); - tokenProvider.getUserIdFromAccessToken(accessToken); - User newUser = testDataUtils.createNewUser(); - String intraId = newUser.getIntraId(); - String url = "/pingpong/admin/penalty"; - mockMvc.perform(post(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new PenaltyRequestDto(intraId, 3, "test1")))) - .andExpect(status().isCreated()); - Optional penaltyUser = penaltyUserAdminRedisRepository.findByIntraId(intraId); - //redis - Assertions.assertThat(penaltyUser).isPresent(); - Assertions.assertThat(penaltyUser.get().getPenaltyTime()).isEqualTo(3 * 60); - Assertions.assertThat( - Duration.between(penaltyUser.get().getStartTime(), - penaltyUser.get().getReleaseTime()).getSeconds()).isEqualTo(3 * 60 * 60); - Assertions.assertThat(penaltyUser.get().getReason()); - //mySQL - List penalties = penaltyAdminRepository.findAll(); - Assertions.assertThat(penalties.stream().anyMatch(ele -> ele.getUser().getIntraId().equals(intraId) - && ele.getPenaltyTime().equals(3 * 60))).isEqualTo(true); - } - - @Test - @DisplayName("POST : penalty를 부여받은 유효한 intraId에 penalty 부여") - public void giveUserPenaltyRepeatablyWithValidIntraId() throws Exception { - String accessToken = testDataUtils.getAdminLoginAccessToken(); - tokenProvider.getUserIdFromAccessToken(accessToken); - User newUser = testDataUtils.createNewUser(); - String intraId = newUser.getIntraId(); - String url = "/pingpong/admin/penalty"; - //패널티 두번 부여 - mockMvc.perform(post(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new PenaltyRequestDto(intraId, 3, "test1")))) - .andExpect(status().isCreated()); - mockMvc.perform(post(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new PenaltyRequestDto(intraId, 2, "test2")))) - .andExpect(status().isCreated()); - Optional penaltyUser = penaltyUserAdminRedisRepository.findByIntraId(intraId); - //redis 확인 - Assertions.assertThat(penaltyUser).isPresent(); - Assertions.assertThat(penaltyUser.get().getPenaltyTime()).isEqualTo(5 * 60); - Assertions.assertThat( - Duration.between(penaltyUser.get().getStartTime(), - penaltyUser.get().getReleaseTime()).getSeconds()).isEqualTo(5 * 60 * 60); - Assertions.assertThat(penaltyUser.get().getReason()); - //mySQL 확인 - List penalties = penaltyAdminRepository.findAll(); - List userPenalties = penalties.stream().filter(ele -> ele.getUser().getIntraId().equals(intraId)) - .collect(Collectors.toList()); - Assertions.assertThat(userPenalties.size()).isEqualTo(2); - Duration duration = Duration.between(userPenalties.get(0).getStartTime(), userPenalties.get(1).getStartTime()); - Assertions.assertThat(duration.getSeconds()).isEqualTo(3 * 60 * 60); - } - - - @Test - @DisplayName("POST 유효하지 않은 intraId에 penalty 부여") - public void giveUserPenaltyWithInvalidIntraId() throws Exception { - String accessToken = testDataUtils.getAdminLoginAccessToken(); - tokenProvider.getUserIdFromAccessToken(accessToken); - String intraId = "invalid!"; - String url = "/pingpong/admin/penalty"; - mockMvc.perform(post(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new PenaltyRequestDto(intraId, 3, "test1")))) - .andExpect(status().is4xxClientError()); - } - - @Test - @DisplayName("GET pagination 유효성 검사") - public void checkPagination() throws Exception { - List users = new ArrayList(); - String accessToken = testDataUtils.getAdminLoginAccessToken(); - tokenProvider.getUserIdFromAccessToken(accessToken); - //penalty user 20명 넣고 테스트 - for (int i = 0; i < 20; i++) { - User newUser = testDataUtils.createNewUser(); - users.add(newUser); - penaltyAdminService.givePenalty(newUser.getIntraId(), 3, "test" + String.valueOf(i)); - } - List sizeCounts = new ArrayList(); - Integer totalPages = -1; - for (int i = 1; i <= 3; i++) { - String url = "/pingpong/admin/penalty?page=" + String.valueOf(i)+"&size=10¤t=true"; - String contentAsString = mockMvc.perform( - get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); - PenaltyListResponseDto penaltyListResponseDto = objectMapper.readValue(contentAsString, - PenaltyListResponseDto.class); - sizeCounts.add(penaltyListResponseDto.getPenaltyList().size()); - totalPages = penaltyListResponseDto.getTotalPage(); - } - Assertions.assertThat(sizeCounts).isEqualTo(List.of(10, 10, 0)); - Assertions.assertThat(totalPages).isEqualTo(2); - } - - @Test - @DisplayName("GET parameter 유효성 검사") - public void checkInputException() throws Exception { - String accessToken = testDataUtils.getAdminLoginAccessToken(); - tokenProvider.getUserIdFromAccessToken(accessToken); - String url = "/pingpong/admin/penalty?page=-1&size=10¤t=false"; - String contentAsString = mockMvc.perform( - get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isBadRequest()).andReturn().getResponse().getContentAsString(); - String url2 = "/pingpong/admin/penalty?page=2&size=0¤t=false"; - String contentAsString2 = mockMvc.perform( - get(url2).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isBadRequest()).andReturn().getResponse().getContentAsString(); - } - - @Test - @DisplayName("GET pagination keyword 유효성 검사") - public void checkPaginationWithKeyword() throws Exception { - List users = new ArrayList(); - String accessToken = testDataUtils.getAdminLoginAccessToken(); - tokenProvider.getUserIdFromAccessToken(accessToken); - //penalty user 40명 넣고 테스트 - //그중 20명만 intraId에 test포함 - for (int i = 0; i < 20; i++) { - String intraId = UUID.randomUUID().toString().substring(0, 4) + "test" + UUID.randomUUID().toString() - .substring(0, 4); - User newUser = testDataUtils.createNewUser(intraId, "test", "test", RacketType.NONE, SnsType.EMAIL, - RoleType.USER); - users.add(newUser); - penaltyAdminService.givePenalty(newUser.getIntraId(), 3, "test" + String.valueOf(i)); - } - for (int i = 0; i < 20; i++) { - String intraId = "dummy" + String.valueOf(i); - User newUser = testDataUtils.createNewUser(intraId, "test", "test", RacketType.NONE, SnsType.EMAIL, - RoleType.USER); - users.add(newUser); - penaltyAdminService.givePenalty(newUser.getIntraId(), 3, "test" + String.valueOf(i)); - } - List sizeCounts = new ArrayList(); - Integer totalPages = -1; - for (int i = 1; i <= 3; i++) { - String url = "/pingpong/admin/penalty?page=" + String.valueOf(i)+"&size=10¤t=true&intraId=test"; - String contentAsString = mockMvc.perform( - get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); - PenaltyListResponseDto penaltyListResponseDto = objectMapper.readValue(contentAsString, - PenaltyListResponseDto.class); - sizeCounts.add(penaltyListResponseDto.getPenaltyList().size()); - totalPages = penaltyListResponseDto.getTotalPage(); - } - Assertions.assertThat(sizeCounts).isEqualTo(List.of(10, 10, 0)); - Assertions.assertThat(totalPages).isEqualTo(2); - } - - @Test - @DisplayName("DELETE 패널티 삭제 - 유저 패널티가 1번만 부과된 경우") - public void deleteExistPenaltyUser() throws Exception { - String accessToken = testDataUtils.getAdminLoginAccessToken(); - tokenProvider.getUserIdFromAccessToken(accessToken); - User newUser = testDataUtils.createNewUser(); - String intraId = newUser.getIntraId(); - penaltyAdminService.givePenalty(intraId, 3, "test!"); - List penalties = penaltyAdminRepository.findAll(); - List userPenalties = penalties.stream().filter(ele -> ele.getUser().getIntraId().equals(intraId)) - .collect(Collectors.toList()); - Long penaltyId = userPenalties.get(0).getId(); - String url = "/pingpong/admin/penalty/" + penaltyId.toString(); - mockMvc.perform( - delete(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isNoContent()); - //Redis에 penaltyUser 없는지 확인 - Optional penaltyUser = penaltyUserAdminRedisRepository.findByIntraId(intraId); - Assertions.assertThat(penaltyUser).isEmpty(); - //MySQL에 penalty 없는지 확인 - List afterPenalties = penaltyAdminRepository.findAll(); - boolean isPresent = afterPenalties.stream().anyMatch(ele -> ele.getId().equals(penaltyId)); - Assertions.assertThat(isPresent).isEqualTo(false); - } - - @Test - @DisplayName("DELETE 패널티 삭제 - 유저 패널티가 2번 부과된 경우") - public void deleteExistPenaltyUserOfTwicePenalty() throws Exception { - String accessToken = testDataUtils.getAdminLoginAccessToken(); - tokenProvider.getUserIdFromAccessToken(accessToken); - User newUser = testDataUtils.createNewUser(); - String intraId = newUser.getIntraId(); - penaltyAdminService.givePenalty(intraId, 3, "test!"); - penaltyAdminService.givePenalty(intraId, 2, "test2"); - List penalties = penaltyAdminRepository.findAll(); - List userPenalties = penalties.stream().filter(ele -> ele.getUser().getIntraId().equals(intraId)) - .collect(Collectors.toList()); - Long penaltyId = userPenalties.get(0).getId(); - String url = "/pingpong/admin/penalty/" + penaltyId.toString(); - mockMvc.perform( - delete(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isNoContent()); - //Redis에 penaltyUser 있는지 확인 - Optional penaltyUser = penaltyUserAdminRedisRepository.findByIntraId(intraId); - Assertions.assertThat(penaltyUser.get().getPenaltyTime()).isEqualTo(2 * 60); - - //MySQL에 penalty 없는지 확인 - List afterPenalties = penaltyAdminRepository.findAll(); - boolean isPresent = afterPenalties.stream().anyMatch(ele -> ele.getId().equals(penaltyId)); - Assertions.assertThat(isPresent).isEqualTo(false); - } - - @Test - @DisplayName("DELETE 존재하지 않는 패널티 유저 삭제") - public void deleteInvalidPenaltyUser() throws Exception { - String accessToken = testDataUtils.getAdminLoginAccessToken(); - tokenProvider.getUserIdFromAccessToken(accessToken); - //user에 패널티는 부여하지 않는다. - User newUser = testDataUtils.createNewUser(); - String intraId = newUser.getIntraId(); - String url = "/pingpong/admin/penalty/users/" + intraId; - mockMvc.perform( - delete(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isNotFound()); - } - - @Test - @DisplayName("DELETE 존재하지 않는 패널티 유저 삭제") - public void deleteInvalidIntraId() throws Exception { - String accessToken = testDataUtils.getAdminLoginAccessToken(); - tokenProvider.getUserIdFromAccessToken(accessToken); - //30자 이상 - String intraId = UUID.randomUUID().toString(); - String url = "/pingpong/admin/penalty/users/" + intraId; - mockMvc.perform( - delete(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isNotFound()); - } - - @Test - @DisplayName("get pingpong/admin/penalty?page={page}&size={pageSize}¤t=true") - public void getCurrentPenalties() throws Exception { - List users = new ArrayList(); - String accessToken = testDataUtils.getAdminLoginAccessToken(); - tokenProvider.getUserIdFromAccessToken(accessToken); - //penalty user 20명 넣고 테스트 - for (int i = 0; i < 20; i++) { - User newUser = testDataUtils.createNewUser(); - users.add(newUser); - } - - //과거 penalty들 db에 저장 - for (int i = 0; i < 20; i++) { - Penalty penalty = new Penalty(users.get(i), PenaltyType.NOSHOW, "test", LocalDateTime.now().minusHours(3), 120); - penaltyAdminRepository.save(penalty); - } - - //현재 패널티 부여 - for (int i = 0; i < 20; i++) { - penaltyAdminService.givePenalty(users.get(i).getIntraId(), 3, "test" + String.valueOf(i)); - } - - - - List sizeCounts = new ArrayList(); - Integer totalPages = -1; - for (int i = 1; i <= 3; i++) { - String url = "/pingpong/admin/penalty?page=" + String.valueOf(i)+"&size=10¤t=true"; - String contentAsString = mockMvc.perform( - get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); - PenaltyListResponseDto penaltyListResponseDto = objectMapper.readValue(contentAsString, - PenaltyListResponseDto.class); - sizeCounts.add(penaltyListResponseDto.getPenaltyList().size()); - totalPages = penaltyListResponseDto.getTotalPage(); - } - Assertions.assertThat(sizeCounts).isEqualTo(List.of(10, 10, 0)); - Assertions.assertThat(totalPages).isEqualTo(2); - } -} +package com.gg.server.admin.penalty.controller; + +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.put; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.admin.penalty.data.PenaltyAdminRepository; +import com.gg.server.domain.penalty.data.Penalty; +import com.gg.server.domain.penalty.redis.RedisPenaltyUser; +import com.gg.server.admin.penalty.data.PenaltyUserAdminRedisRepository; +import com.gg.server.admin.penalty.dto.PenaltyListResponseDto; +import com.gg.server.admin.penalty.dto.PenaltyRequestDto; +import com.gg.server.admin.penalty.service.PenaltyAdminService; +import com.gg.server.domain.penalty.type.PenaltyType; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.type.RacketType; +import com.gg.server.domain.user.type.RoleType; +import com.gg.server.domain.user.type.SnsType; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import java.time.Duration; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; +import org.apache.http.HttpHeaders; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.http.MediaType; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +@SpringBootTest +@AutoConfigureMockMvc +@ActiveProfiles("local") +@Transactional +class PenaltyAdminControllerTest { + @Autowired + TestDataUtils testDataUtils; + @Autowired + MockMvc mockMvc; + @Autowired + ObjectMapper objectMapper; + @Autowired + UserRepository userRepository; + @Autowired + PenaltyUserAdminRedisRepository penaltyUserAdminRedisRepository; + @Autowired + PenaltyAdminRepository penaltyAdminRepository; + @Autowired + AuthTokenProvider tokenProvider; + @Autowired + RedisConnectionFactory redisConnectionFactory; + @Autowired + PenaltyAdminService penaltyAdminService; + + private final String headUrl = "/pingpong/admin/"; + + @AfterEach + void clear() { + RedisConnection connection = redisConnectionFactory.getConnection(); + connection.flushDb(); + connection.close(); + } + + @Test + @DisplayName("POST : penalty를 부여받지 않은 유효한 intraId에 penalty 부여") + public void giveUserPenaltyforFirstTimeWithValidIntraId() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + tokenProvider.getUserIdFromAccessToken(accessToken); + User newUser = testDataUtils.createNewUser(); + String intraId = newUser.getIntraId(); + String url = "/pingpong/admin/penalty"; + mockMvc.perform(post(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(new PenaltyRequestDto(intraId, 3, "test1")))) + .andExpect(status().isCreated()); + Optional penaltyUser = penaltyUserAdminRedisRepository.findByIntraId(intraId); + //redis + Assertions.assertThat(penaltyUser).isPresent(); + Assertions.assertThat(penaltyUser.get().getPenaltyTime()).isEqualTo(3 * 60); + Assertions.assertThat( + Duration.between(penaltyUser.get().getStartTime(), + penaltyUser.get().getReleaseTime()).getSeconds()).isEqualTo(3 * 60 * 60); + Assertions.assertThat(penaltyUser.get().getReason()); + //mySQL + List penalties = penaltyAdminRepository.findAll(); + Assertions.assertThat(penalties.stream().anyMatch(ele -> ele.getUser().getIntraId().equals(intraId) + && ele.getPenaltyTime().equals(3 * 60))).isEqualTo(true); + } + + @Test + @DisplayName("POST : penalty를 부여받은 유효한 intraId에 penalty 부여") + public void giveUserPenaltyRepeatablyWithValidIntraId() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + tokenProvider.getUserIdFromAccessToken(accessToken); + User newUser = testDataUtils.createNewUser(); + String intraId = newUser.getIntraId(); + String url = "/pingpong/admin/penalty"; + //패널티 두번 부여 + mockMvc.perform(post(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(new PenaltyRequestDto(intraId, 3, "test1")))) + .andExpect(status().isCreated()); + mockMvc.perform(post(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(new PenaltyRequestDto(intraId, 2, "test2")))) + .andExpect(status().isCreated()); + Optional penaltyUser = penaltyUserAdminRedisRepository.findByIntraId(intraId); + //redis 확인 + Assertions.assertThat(penaltyUser).isPresent(); + Assertions.assertThat(penaltyUser.get().getPenaltyTime()).isEqualTo(5 * 60); + Assertions.assertThat( + Duration.between(penaltyUser.get().getStartTime(), + penaltyUser.get().getReleaseTime()).getSeconds()).isEqualTo(5 * 60 * 60); + Assertions.assertThat(penaltyUser.get().getReason()); + //mySQL 확인 + List penalties = penaltyAdminRepository.findAll(); + List userPenalties = penalties.stream().filter(ele -> ele.getUser().getIntraId().equals(intraId)) + .collect(Collectors.toList()); + Assertions.assertThat(userPenalties.size()).isEqualTo(2); + Duration duration = Duration.between(userPenalties.get(0).getStartTime(), userPenalties.get(1).getStartTime()); + Assertions.assertThat(duration.getSeconds()).isEqualTo(3 * 60 * 60); + } + + + @Test + @DisplayName("POST 유효하지 않은 intraId에 penalty 부여") + public void giveUserPenaltyWithInvalidIntraId() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + tokenProvider.getUserIdFromAccessToken(accessToken); + String intraId = "invalid!"; + String url = "/pingpong/admin/penalty"; + mockMvc.perform(post(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(new PenaltyRequestDto(intraId, 3, "test1")))) + .andExpect(status().is4xxClientError()); + } + + @Test + @DisplayName("GET pagination 유효성 검사") + public void checkPagination() throws Exception { + List users = new ArrayList(); + String accessToken = testDataUtils.getAdminLoginAccessToken(); + tokenProvider.getUserIdFromAccessToken(accessToken); + //penalty user 20명 넣고 테스트 + for (int i = 0; i < 20; i++) { + User newUser = testDataUtils.createNewUser(); + users.add(newUser); + penaltyAdminService.givePenalty(newUser.getIntraId(), 3, "test" + String.valueOf(i)); + } + List sizeCounts = new ArrayList(); + Integer totalPages = -1; + for (int i = 1; i <= 3; i++) { + String url = "/pingpong/admin/penalty?page=" + String.valueOf(i)+"&size=10¤t=true"; + String contentAsString = mockMvc.perform( + get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); + PenaltyListResponseDto penaltyListResponseDto = objectMapper.readValue(contentAsString, + PenaltyListResponseDto.class); + sizeCounts.add(penaltyListResponseDto.getPenaltyList().size()); + totalPages = penaltyListResponseDto.getTotalPage(); + } + Assertions.assertThat(sizeCounts).isEqualTo(List.of(10, 10, 0)); + Assertions.assertThat(totalPages).isEqualTo(2); + } + + @Test + @DisplayName("GET parameter 유효성 검사") + public void checkInputException() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + tokenProvider.getUserIdFromAccessToken(accessToken); + String url = "/pingpong/admin/penalty?page=-1&size=10¤t=false"; + String contentAsString = mockMvc.perform( + get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isBadRequest()).andReturn().getResponse().getContentAsString(); + String url2 = "/pingpong/admin/penalty?page=2&size=0¤t=false"; + String contentAsString2 = mockMvc.perform( + get(url2).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isBadRequest()).andReturn().getResponse().getContentAsString(); + } + + @Test + @DisplayName("GET pagination keyword 유효성 검사") + public void checkPaginationWithKeyword() throws Exception { + List users = new ArrayList(); + String accessToken = testDataUtils.getAdminLoginAccessToken(); + tokenProvider.getUserIdFromAccessToken(accessToken); + //penalty user 40명 넣고 테스트 + //그중 20명만 intraId에 test포함 + for (int i = 0; i < 20; i++) { + String intraId = UUID.randomUUID().toString().substring(0, 4) + "test" + UUID.randomUUID().toString() + .substring(0, 4); + User newUser = testDataUtils.createNewUser(intraId, "test", "test", RacketType.NONE, SnsType.EMAIL, + RoleType.USER); + users.add(newUser); + penaltyAdminService.givePenalty(newUser.getIntraId(), 3, "test" + String.valueOf(i)); + } + for (int i = 0; i < 20; i++) { + String intraId = "dummy" + String.valueOf(i); + User newUser = testDataUtils.createNewUser(intraId, "test", "test", RacketType.NONE, SnsType.EMAIL, + RoleType.USER); + users.add(newUser); + penaltyAdminService.givePenalty(newUser.getIntraId(), 3, "test" + String.valueOf(i)); + } + List sizeCounts = new ArrayList(); + Integer totalPages = -1; + for (int i = 1; i <= 3; i++) { + String url = "/pingpong/admin/penalty?page=" + String.valueOf(i)+"&size=10¤t=true&intraId=test"; + String contentAsString = mockMvc.perform( + get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); + PenaltyListResponseDto penaltyListResponseDto = objectMapper.readValue(contentAsString, + PenaltyListResponseDto.class); + sizeCounts.add(penaltyListResponseDto.getPenaltyList().size()); + totalPages = penaltyListResponseDto.getTotalPage(); + } + Assertions.assertThat(sizeCounts).isEqualTo(List.of(10, 10, 0)); + Assertions.assertThat(totalPages).isEqualTo(2); + } + + @Test + @DisplayName("DELETE 패널티 삭제 - 유저 패널티가 1번만 부과된 경우") + public void deleteExistPenaltyUser() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + tokenProvider.getUserIdFromAccessToken(accessToken); + User newUser = testDataUtils.createNewUser(); + String intraId = newUser.getIntraId(); + penaltyAdminService.givePenalty(intraId, 3, "test!"); + List penalties = penaltyAdminRepository.findAll(); + List userPenalties = penalties.stream().filter(ele -> ele.getUser().getIntraId().equals(intraId)) + .collect(Collectors.toList()); + Long penaltyId = userPenalties.get(0).getId(); + String url = "/pingpong/admin/penalty/" + penaltyId.toString(); + mockMvc.perform( + delete(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isNoContent()); + //Redis에 penaltyUser 없는지 확인 + Optional penaltyUser = penaltyUserAdminRedisRepository.findByIntraId(intraId); + Assertions.assertThat(penaltyUser).isEmpty(); + //MySQL에 penalty 없는지 확인 + List afterPenalties = penaltyAdminRepository.findAll(); + boolean isPresent = afterPenalties.stream().anyMatch(ele -> ele.getId().equals(penaltyId)); + Assertions.assertThat(isPresent).isEqualTo(false); + } + + @Test + @DisplayName("DELETE 패널티 삭제 - 유저 패널티가 2번 부과된 경우") + public void deleteExistPenaltyUserOfTwicePenalty() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + tokenProvider.getUserIdFromAccessToken(accessToken); + User newUser = testDataUtils.createNewUser(); + String intraId = newUser.getIntraId(); + penaltyAdminService.givePenalty(intraId, 3, "test!"); + penaltyAdminService.givePenalty(intraId, 2, "test2"); + List penalties = penaltyAdminRepository.findAll(); + List userPenalties = penalties.stream().filter(ele -> ele.getUser().getIntraId().equals(intraId)) + .collect(Collectors.toList()); + Long penaltyId = userPenalties.get(0).getId(); + String url = "/pingpong/admin/penalty/" + penaltyId.toString(); + mockMvc.perform( + delete(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isNoContent()); + //Redis에 penaltyUser 있는지 확인 + Optional penaltyUser = penaltyUserAdminRedisRepository.findByIntraId(intraId); + Assertions.assertThat(penaltyUser.get().getPenaltyTime()).isEqualTo(2 * 60); + + //MySQL에 penalty 없는지 확인 + List afterPenalties = penaltyAdminRepository.findAll(); + boolean isPresent = afterPenalties.stream().anyMatch(ele -> ele.getId().equals(penaltyId)); + Assertions.assertThat(isPresent).isEqualTo(false); + } + + @Test + @DisplayName("DELETE 존재하지 않는 패널티 유저 삭제") + public void deleteInvalidPenaltyUser() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + tokenProvider.getUserIdFromAccessToken(accessToken); + //user에 패널티는 부여하지 않는다. + User newUser = testDataUtils.createNewUser(); + String intraId = newUser.getIntraId(); + String url = "/pingpong/admin/penalty/users/" + intraId; + mockMvc.perform( + delete(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isNotFound()); + } + + @Test + @DisplayName("DELETE 존재하지 않는 패널티 유저 삭제") + public void deleteInvalidIntraId() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + tokenProvider.getUserIdFromAccessToken(accessToken); + //30자 이상 + String intraId = UUID.randomUUID().toString(); + String url = "/pingpong/admin/penalty/users/" + intraId; + mockMvc.perform( + delete(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isNotFound()); + } + + @Test + @DisplayName("get pingpong/admin/penalty?page={page}&size={pageSize}¤t=true") + public void getCurrentPenalties() throws Exception { + List users = new ArrayList(); + String accessToken = testDataUtils.getAdminLoginAccessToken(); + tokenProvider.getUserIdFromAccessToken(accessToken); + //penalty user 20명 넣고 테스트 + for (int i = 0; i < 20; i++) { + User newUser = testDataUtils.createNewUser(); + users.add(newUser); + } + + //과거 penalty들 db에 저장 + for (int i = 0; i < 20; i++) { + Penalty penalty = new Penalty(users.get(i), PenaltyType.NOSHOW, "test", LocalDateTime.now().minusHours(3), 120); + penaltyAdminRepository.save(penalty); + } + + //현재 패널티 부여 + for (int i = 0; i < 20; i++) { + penaltyAdminService.givePenalty(users.get(i).getIntraId(), 3, "test" + String.valueOf(i)); + } + + + + List sizeCounts = new ArrayList(); + Integer totalPages = -1; + for (int i = 1; i <= 3; i++) { + String url = "/pingpong/admin/penalty?page=" + String.valueOf(i)+"&size=10¤t=true"; + String contentAsString = mockMvc.perform( + get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); + PenaltyListResponseDto penaltyListResponseDto = objectMapper.readValue(contentAsString, + PenaltyListResponseDto.class); + sizeCounts.add(penaltyListResponseDto.getPenaltyList().size()); + totalPages = penaltyListResponseDto.getTotalPage(); + } + Assertions.assertThat(sizeCounts).isEqualTo(List.of(10, 10, 0)); + Assertions.assertThat(totalPages).isEqualTo(2); + } +} diff --git a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java index 31654f054..e48a3d562 100644 --- a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java @@ -1,147 +1,147 @@ -package com.gg.server.admin.user.controller; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.gg.server.admin.user.data.UserAdminRepository; -import com.gg.server.admin.user.dto.UserDetailAdminResponseDto; -import com.gg.server.admin.user.dto.UserSearchAdminDto; -import com.gg.server.admin.user.dto.UserSearchAdminResponseDto; -import com.gg.server.admin.user.service.UserAdminService; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.global.security.jwt.utils.AuthTokenProvider; -import com.gg.server.utils.TestDataUtils; -import lombok.RequiredArgsConstructor; -import org.apache.http.HttpHeaders; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; -import org.springframework.test.web.servlet.MockMvc; - -import javax.transaction.Transactional; - -import java.util.List; - -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@RequiredArgsConstructor -@SpringBootTest -@AutoConfigureMockMvc -class UserAdminControllerTest { - - @Autowired - UserAdminService userAdminService; - @Autowired - TestDataUtils testDataUtils; - @Autowired - AuthTokenProvider tokenProvider; - @Autowired - UserRepository userRepository; - @Autowired - UserAdminRepository userAdminRepository; - @Autowired - MockMvc mockMvc; - @Autowired - ObjectMapper objectMapper; - - @Test - @DisplayName("GET /pingpong/admin/users") - @Transactional - public void userSearchAllTest() throws Exception{ - //given - String accessToken = testDataUtils.getAdminLoginAccessToken(); - Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); - User user = userRepository.findById(userId).get(); - int page = 1; - int size = 20; - Pageable pageable = PageRequest.of(page - 1, size, Sort.by("intraId").ascending()); - String url = "/pingpong/admin/users?page=1"; - String url2 = "/pingpong/admin/users?page=1&intraId=" + user.getIntraId(); - //when - //200 성공 - String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - UserSearchAdminResponseDto actureResponse1 = objectMapper.readValue(contentAsString, UserSearchAdminResponseDto.class); - //200 성공 - contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - UserSearchAdminResponseDto actureResponse2 = objectMapper.readValue(contentAsString, UserSearchAdminResponseDto.class); - - //then - List userList1 = userAdminRepository.findAll(pageable).getContent(); - List actureUserList1 = actureResponse1.getUserSearchAdminDtos(); - for (int i = 0; i < userList1.size(); i++) { - Assertions.assertThat(userList1.get(i).getIntraId()).isEqualTo(actureUserList1.get(i).getIntraId()); - } - - List userList2 = userAdminRepository.findAll(pageable).getContent(); - List actureUserList2 = actureResponse2.getUserSearchAdminDtos(); - for (int i = 0; i < userList1.size(); i++) { - Assertions.assertThat(userList2.get(i).getIntraId()).isEqualTo(actureUserList2.get(i).getIntraId()); - } - } - - @Test - @DisplayName("유저 필터링 조회 테스트") - @Transactional - public void 유저필터링조회테스트() throws Exception { - //given - String accessToken = testDataUtils.getAdminLoginAccessToken(); - Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); - User user = userRepository.findById(userId).get(); - int page = 1; - int size = 20; - Pageable pageable = PageRequest.of(page - 1, size, Sort.by("intraId").ascending()); - String url = "/pingpong/admin/users?page=1&userFilter=\"" + user.getIntraId() + "\""; - - //when - String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - UserSearchAdminResponseDto actureResponse = objectMapper.readValue(contentAsString, UserSearchAdminResponseDto.class); - - List actureUserList = actureResponse.getUserSearchAdminDtos(); - for (UserSearchAdminDto userDto : actureUserList) - Assertions.assertThat(userDto.getIntraId()).isEqualTo(user.getIntraId()); - } - - @Test - @DisplayName("GET /pingpong/admin/users/{intraId}") - @Transactional - public void userGetDetailTest() throws Exception{ - //given - String accessToken = testDataUtils.getAdminLoginAccessToken(); - Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); - User user = userRepository.findByIntraId("nheo").get(); - String url = "/pingpong/admin/users/" + user.getIntraId(); - UserDetailAdminResponseDto expectedResponse = userAdminService.getUserDetailByIntraId(user.getIntraId()); - - //when - //200 성공 - String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - UserDetailAdminResponseDto actureResponse = objectMapper.readValue(contentAsString, UserDetailAdminResponseDto.class); - - //then - Assertions.assertThat(actureResponse.getUserId()).isEqualTo(expectedResponse.getUserId()); - Assertions.assertThat(actureResponse.getIntraId()).isEqualTo(expectedResponse.getIntraId()); - Assertions.assertThat(actureResponse.getUserImageUri()).isEqualTo(expectedResponse.getUserImageUri()); - Assertions.assertThat(actureResponse.getRacketType()).isEqualTo(expectedResponse.getRacketType()); -// Assertions.assertThat(actureResponse.getStatusMessage()).isEqualTo(expecxtedResponse.getStatusMessage()); - Assertions.assertThat(actureResponse.getWins()).isEqualTo(expectedResponse.getWins()); - Assertions.assertThat(actureResponse.getLosses()).isEqualTo(expectedResponse.getLosses()); - Assertions.assertThat(actureResponse.getPpp()).isEqualTo(expectedResponse.getPpp()); - Assertions.assertThat(actureResponse.getEmail()).isEqualTo(expectedResponse.getEmail()); - Assertions.assertThat(actureResponse.getRoleType()).isEqualTo(expectedResponse.getRoleType()); - Assertions.assertThat(actureResponse.getExp()).isEqualTo(expectedResponse.getExp()); - } +package com.gg.server.admin.user.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.admin.user.data.UserAdminRepository; +import com.gg.server.admin.user.dto.UserDetailAdminResponseDto; +import com.gg.server.admin.user.dto.UserSearchAdminDto; +import com.gg.server.admin.user.dto.UserSearchAdminResponseDto; +import com.gg.server.admin.user.service.UserAdminService; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import lombok.RequiredArgsConstructor; +import org.apache.http.HttpHeaders; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.test.web.servlet.MockMvc; + +import javax.transaction.Transactional; + +import java.util.List; + +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RequiredArgsConstructor +@SpringBootTest +@AutoConfigureMockMvc +class UserAdminControllerTest { + + @Autowired + UserAdminService userAdminService; + @Autowired + TestDataUtils testDataUtils; + @Autowired + AuthTokenProvider tokenProvider; + @Autowired + UserRepository userRepository; + @Autowired + UserAdminRepository userAdminRepository; + @Autowired + MockMvc mockMvc; + @Autowired + ObjectMapper objectMapper; + + @Test + @DisplayName("GET /pingpong/admin/users") + @Transactional + public void userSearchAllTest() throws Exception{ + //given + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + User user = userRepository.findById(userId).get(); + int page = 1; + int size = 20; + Pageable pageable = PageRequest.of(page - 1, size, Sort.by("intraId").ascending()); + String url = "/pingpong/admin/users?page=1"; + String url2 = "/pingpong/admin/users?page=1&intraId=" + user.getIntraId(); + //when + //200 성공 + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + UserSearchAdminResponseDto actureResponse1 = objectMapper.readValue(contentAsString, UserSearchAdminResponseDto.class); + //200 성공 + contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + UserSearchAdminResponseDto actureResponse2 = objectMapper.readValue(contentAsString, UserSearchAdminResponseDto.class); + + //then + List userList1 = userAdminRepository.findAll(pageable).getContent(); + List actureUserList1 = actureResponse1.getUserSearchAdminDtos(); + for (int i = 0; i < userList1.size(); i++) { + Assertions.assertThat(userList1.get(i).getIntraId()).isEqualTo(actureUserList1.get(i).getIntraId()); + } + + List userList2 = userAdminRepository.findAll(pageable).getContent(); + List actureUserList2 = actureResponse2.getUserSearchAdminDtos(); + for (int i = 0; i < userList1.size(); i++) { + Assertions.assertThat(userList2.get(i).getIntraId()).isEqualTo(actureUserList2.get(i).getIntraId()); + } + } + + @Test + @DisplayName("유저 필터링 조회 테스트") + @Transactional + public void 유저필터링조회테스트() throws Exception { + //given + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + User user = userRepository.findById(userId).get(); + int page = 1; + int size = 20; + Pageable pageable = PageRequest.of(page - 1, size, Sort.by("intraId").ascending()); + String url = "/pingpong/admin/users?page=1&userFilter=\"" + user.getIntraId() + "\""; + + //when + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + UserSearchAdminResponseDto actureResponse = objectMapper.readValue(contentAsString, UserSearchAdminResponseDto.class); + + List actureUserList = actureResponse.getUserSearchAdminDtos(); + for (UserSearchAdminDto userDto : actureUserList) + Assertions.assertThat(userDto.getIntraId()).isEqualTo(user.getIntraId()); + } + + @Test + @DisplayName("GET /pingpong/admin/users/{intraId}") + @Transactional + public void userGetDetailTest() throws Exception{ + //given + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + User user = userRepository.findByIntraId("nheo").get(); + String url = "/pingpong/admin/users/" + user.getIntraId(); + UserDetailAdminResponseDto expectedResponse = userAdminService.getUserDetailByIntraId(user.getIntraId()); + + //when + //200 성공 + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + UserDetailAdminResponseDto actureResponse = objectMapper.readValue(contentAsString, UserDetailAdminResponseDto.class); + + //then + Assertions.assertThat(actureResponse.getUserId()).isEqualTo(expectedResponse.getUserId()); + Assertions.assertThat(actureResponse.getIntraId()).isEqualTo(expectedResponse.getIntraId()); + Assertions.assertThat(actureResponse.getUserImageUri()).isEqualTo(expectedResponse.getUserImageUri()); + Assertions.assertThat(actureResponse.getRacketType()).isEqualTo(expectedResponse.getRacketType()); +// Assertions.assertThat(actureResponse.getStatusMessage()).isEqualTo(expecxtedResponse.getStatusMessage()); + Assertions.assertThat(actureResponse.getWins()).isEqualTo(expectedResponse.getWins()); + Assertions.assertThat(actureResponse.getLosses()).isEqualTo(expectedResponse.getLosses()); + Assertions.assertThat(actureResponse.getPpp()).isEqualTo(expectedResponse.getPpp()); + Assertions.assertThat(actureResponse.getEmail()).isEqualTo(expectedResponse.getEmail()); + Assertions.assertThat(actureResponse.getRoleType()).isEqualTo(expectedResponse.getRoleType()); + Assertions.assertThat(actureResponse.getExp()).isEqualTo(expectedResponse.getExp()); + } } \ No newline at end of file diff --git a/src/test/java/com/gg/server/domain/match/service/MatchBothServiceTest.java b/src/test/java/com/gg/server/domain/match/service/MatchBothServiceTest.java index 6bc818980..f0a17efa4 100644 --- a/src/test/java/com/gg/server/domain/match/service/MatchBothServiceTest.java +++ b/src/test/java/com/gg/server/domain/match/service/MatchBothServiceTest.java @@ -1,136 +1,136 @@ -package com.gg.server.domain.match.service; - -import com.gg.server.admin.penalty.data.PenaltyAdminRepository; -import com.gg.server.admin.penalty.type.PenaltyKey; -import com.gg.server.domain.game.data.Game; -import com.gg.server.domain.game.data.GameRepository; -import com.gg.server.domain.match.data.RedisMatchTimeRepository; -import com.gg.server.domain.match.data.RedisMatchUserRepository; -import com.gg.server.domain.match.exception.SlotNotFoundException; -import com.gg.server.domain.match.type.Option; -import com.gg.server.domain.noti.data.NotiRepository; -import com.gg.server.domain.penalty.redis.PenaltyUserRedisRepository; -import com.gg.server.domain.rank.redis.RankRedisRepository; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.slotmanagement.SlotManagement; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.dto.UserDto; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.Random; -import lombok.RequiredArgsConstructor; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.redis.connection.RedisConnection; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.transaction.annotation.Transactional; - -@SpringBootTest -@Transactional -@AutoConfigureMockMvc -@ActiveProfiles("local") -@RequiredArgsConstructor -class MatchBothServiceTest { - @Autowired - MatchFindService matchFindService; - @Autowired - MatchService matchService; - @Autowired - RedisMatchTimeRepository redisMatchTimeRepository; - @Autowired - RedisMatchUserRepository redisMatchUserRepository; - @Autowired - RedisConnectionFactory redisConnectionFactory; - @Autowired - RedisTemplate redisTemplate; - @Autowired - MatchTestUtils matchTestSetting; - @Autowired - GameRepository gameRepository; - @Autowired - RankRedisRepository rankRedisRepository; - @Autowired - NotiRepository notiRepository; - @Autowired - PenaltyAdminRepository penaltyAdminRepository; - @Autowired - PenaltyUserRedisRepository penaltyUserRedisRepository; - List users; - List slotTimes; - - Season testSeason; - - - @BeforeEach - void init() { - Random random = new Random(); - Integer userCount = random.nextInt(10) + 5; - Integer pppGap = random.nextInt(100) + 50; - Season season = matchTestSetting.makeTestSeason(pppGap); - this.testSeason = season; - List users = new ArrayList(); - for(int i = 0; i < userCount; i++) { - User user = matchTestSetting.createUser(); - users.add(user); - } - this.users = users; - users.stream().forEach(user -> - matchTestSetting.addUsertoRankRedis(user.getId(), 1000, season.getId())); - SlotManagement slotManagement = matchTestSetting.makeTestSlotManagement(15); - List slotTimes = matchTestSetting.getTestSlotTimes(slotManagement.getGameInterval()); - this.slotTimes = slotTimes; - } - @AfterEach - void clear() { - RedisConnection connection = redisConnectionFactory.getConnection(); - connection.flushDb(); - connection.close(); - } - - @DisplayName("both 매칭 시뮬레이션") - @Test - void makeGameWithNormalAndBoth() { - System.out.println("this.users = " + this.users); - // 유저 0 slot 2, 3, 0 등록 유저 1 slot 2 - matchService.makeMatch(UserDto.from(users.get(0)), Option.BOTH, this.slotTimes.get(2)); - matchService.makeMatch(UserDto.from(users.get(0)), Option.BOTH, this.slotTimes.get(3)); - matchService.makeMatch(UserDto.from(users.get(0)), Option.BOTH, this.slotTimes.get(0)); - matchService.makeMatch(UserDto.from(users.get(1)), Option.BOTH, this.slotTimes.get(2)); - - System.out.println("matchFindService.getAllMatchStatus(users.get(0).getId(), Option.BOTH) = " - + matchFindService.getAllMatchStatus(UserDto.from(users.get(0)), Option.BOTH).getMatchBoards().get(0)); - System.out.println("matchFindService = " + matchFindService.getCurrentMatch(UserDto.from(users.get(0)))); - System.out.println("matchFindService.getCurrentMatch(UserDto.from(users.get(1))) = " + matchFindService.getCurrentMatch(UserDto.from(users.get(1)))); - System.out.println("matchFindService.getAllMatchStatus(users.get(1).getId(), Option.BOTH) = " + matchFindService.getAllMatchStatus(UserDto.from(users.get(1)), Option.BOTH)); - Optional game1 = gameRepository.findByStartTime(slotTimes.get(2)); - Assertions.assertThat(game1).isPresent(); - matchService.cancelMatch(UserDto.from(users.get(0)), slotTimes.get(2)); - System.out.println("matchFindService.getCurrentMatch(UserDto.from(users.get(1))) = " + matchFindService.getCurrentMatch(UserDto.from(users.get(1)))); - redisTemplate.delete(PenaltyKey.USER_ADMIN + users.get(0).getIntraId()); - matchService.makeMatch(UserDto.from(users.get(0)), Option.BOTH, slotTimes.get(2)); - System.out.println("matchFindService = " + matchFindService.getCurrentMatch(UserDto.from(users.get(0)))); - } - - @DisplayName("매칭 경기 상대가 아닌 다른 유저의 매칭 경기 취소") - @Test - void cancelByNotMatchedUser() { - System.out.println("this.users = " + this.users); - // 유저 0 slot 2, 3, 0 등록 유저 1 slot 2 - matchService.makeMatch(UserDto.from(users.get(0)), Option.BOTH, this.slotTimes.get(2)); - matchService.makeMatch(UserDto.from(users.get(1)), Option.BOTH, this.slotTimes.get(2)); - org.junit.jupiter.api.Assertions.assertThrows(SlotNotFoundException.class, () -> { - matchService.cancelMatch(UserDto.from(users.get(2)), this.slotTimes.get(2)); - }); - } - -} +package com.gg.server.domain.match.service; + +import com.gg.server.admin.penalty.data.PenaltyAdminRepository; +import com.gg.server.admin.penalty.type.PenaltyKey; +import com.gg.server.domain.game.data.Game; +import com.gg.server.domain.game.data.GameRepository; +import com.gg.server.domain.match.data.RedisMatchTimeRepository; +import com.gg.server.domain.match.data.RedisMatchUserRepository; +import com.gg.server.domain.match.exception.SlotNotFoundException; +import com.gg.server.domain.match.type.Option; +import com.gg.server.domain.noti.data.NotiRepository; +import com.gg.server.domain.penalty.redis.PenaltyUserRedisRepository; +import com.gg.server.domain.rank.redis.RankRedisRepository; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.slotmanagement.SlotManagement; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.dto.UserDto; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.Random; +import lombok.RequiredArgsConstructor; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Transactional; + +@SpringBootTest +@Transactional +@AutoConfigureMockMvc +@ActiveProfiles("local") +@RequiredArgsConstructor +class MatchBothServiceTest { + @Autowired + MatchFindService matchFindService; + @Autowired + MatchService matchService; + @Autowired + RedisMatchTimeRepository redisMatchTimeRepository; + @Autowired + RedisMatchUserRepository redisMatchUserRepository; + @Autowired + RedisConnectionFactory redisConnectionFactory; + @Autowired + RedisTemplate redisTemplate; + @Autowired + MatchTestUtils matchTestSetting; + @Autowired + GameRepository gameRepository; + @Autowired + RankRedisRepository rankRedisRepository; + @Autowired + NotiRepository notiRepository; + @Autowired + PenaltyAdminRepository penaltyAdminRepository; + @Autowired + PenaltyUserRedisRepository penaltyUserRedisRepository; + List users; + List slotTimes; + + Season testSeason; + + + @BeforeEach + void init() { + Random random = new Random(); + Integer userCount = random.nextInt(10) + 5; + Integer pppGap = random.nextInt(100) + 50; + Season season = matchTestSetting.makeTestSeason(pppGap); + this.testSeason = season; + List users = new ArrayList(); + for(int i = 0; i < userCount; i++) { + User user = matchTestSetting.createUser(); + users.add(user); + } + this.users = users; + users.stream().forEach(user -> + matchTestSetting.addUsertoRankRedis(user.getId(), 1000, season.getId())); + SlotManagement slotManagement = matchTestSetting.makeTestSlotManagement(15); + List slotTimes = matchTestSetting.getTestSlotTimes(slotManagement.getGameInterval()); + this.slotTimes = slotTimes; + } + @AfterEach + void clear() { + RedisConnection connection = redisConnectionFactory.getConnection(); + connection.flushDb(); + connection.close(); + } + + @DisplayName("both 매칭 시뮬레이션") + @Test + void makeGameWithNormalAndBoth() { + System.out.println("this.users = " + this.users); + // 유저 0 slot 2, 3, 0 등록 유저 1 slot 2 + matchService.makeMatch(UserDto.from(users.get(0)), Option.BOTH, this.slotTimes.get(2)); + matchService.makeMatch(UserDto.from(users.get(0)), Option.BOTH, this.slotTimes.get(3)); + matchService.makeMatch(UserDto.from(users.get(0)), Option.BOTH, this.slotTimes.get(0)); + matchService.makeMatch(UserDto.from(users.get(1)), Option.BOTH, this.slotTimes.get(2)); + + System.out.println("matchFindService.getAllMatchStatus(users.get(0).getId(), Option.BOTH) = " + + matchFindService.getAllMatchStatus(UserDto.from(users.get(0)), Option.BOTH).getMatchBoards().get(0)); + System.out.println("matchFindService = " + matchFindService.getCurrentMatch(UserDto.from(users.get(0)))); + System.out.println("matchFindService.getCurrentMatch(UserDto.from(users.get(1))) = " + matchFindService.getCurrentMatch(UserDto.from(users.get(1)))); + System.out.println("matchFindService.getAllMatchStatus(users.get(1).getId(), Option.BOTH) = " + matchFindService.getAllMatchStatus(UserDto.from(users.get(1)), Option.BOTH)); + Optional game1 = gameRepository.findByStartTime(slotTimes.get(2)); + Assertions.assertThat(game1).isPresent(); + matchService.cancelMatch(UserDto.from(users.get(0)), slotTimes.get(2)); + System.out.println("matchFindService.getCurrentMatch(UserDto.from(users.get(1))) = " + matchFindService.getCurrentMatch(UserDto.from(users.get(1)))); + redisTemplate.delete(PenaltyKey.USER_ADMIN + users.get(0).getIntraId()); + matchService.makeMatch(UserDto.from(users.get(0)), Option.BOTH, slotTimes.get(2)); + System.out.println("matchFindService = " + matchFindService.getCurrentMatch(UserDto.from(users.get(0)))); + } + + @DisplayName("매칭 경기 상대가 아닌 다른 유저의 매칭 경기 취소") + @Test + void cancelByNotMatchedUser() { + System.out.println("this.users = " + this.users); + // 유저 0 slot 2, 3, 0 등록 유저 1 slot 2 + matchService.makeMatch(UserDto.from(users.get(0)), Option.BOTH, this.slotTimes.get(2)); + matchService.makeMatch(UserDto.from(users.get(1)), Option.BOTH, this.slotTimes.get(2)); + org.junit.jupiter.api.Assertions.assertThrows(SlotNotFoundException.class, () -> { + matchService.cancelMatch(UserDto.from(users.get(2)), this.slotTimes.get(2)); + }); + } + +} diff --git a/src/test/java/com/gg/server/domain/match/service/MatchServiceTest.java b/src/test/java/com/gg/server/domain/match/service/MatchServiceTest.java index 9cdf756b7..9ea65d7a4 100644 --- a/src/test/java/com/gg/server/domain/match/service/MatchServiceTest.java +++ b/src/test/java/com/gg/server/domain/match/service/MatchServiceTest.java @@ -1,370 +1,370 @@ -package com.gg.server.domain.match.service; - -import com.gg.server.admin.penalty.data.PenaltyAdminRepository; -import com.gg.server.domain.game.data.Game; -import com.gg.server.domain.game.data.GameRepository; -import com.gg.server.domain.game.type.Mode; -import com.gg.server.domain.match.data.RedisMatchTimeRepository; -import com.gg.server.domain.match.data.RedisMatchUser; -import com.gg.server.domain.match.data.RedisMatchUserRepository; -import com.gg.server.domain.match.dto.MatchStatusDto; -import com.gg.server.domain.match.dto.MatchStatusResponseListDto; -import com.gg.server.domain.match.dto.SlotStatusDto; -import com.gg.server.domain.match.dto.SlotStatusResponseListDto; -import com.gg.server.domain.match.exception.EnrolledSlotException; -import com.gg.server.domain.match.exception.PenaltyUserSlotException; -import com.gg.server.domain.match.type.MatchKey; -import com.gg.server.domain.match.type.Option; -import com.gg.server.domain.match.type.SlotStatus; -import com.gg.server.domain.noti.data.Noti; -import com.gg.server.domain.noti.data.NotiRepository; -import com.gg.server.domain.noti.type.NotiType; -import com.gg.server.domain.penalty.redis.PenaltyUserRedisRepository; -import com.gg.server.domain.penalty.redis.RedisPenaltyUser; -import com.gg.server.domain.rank.redis.RankRedis; -import com.gg.server.domain.rank.redis.RankRedisRepository; -import com.gg.server.domain.rank.redis.RedisKeyManager; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.slotmanagement.SlotManagement; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.dto.UserDto; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.Random; -import lombok.RequiredArgsConstructor; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.redis.connection.RedisConnection; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.transaction.annotation.Transactional; - -@SpringBootTest -@Transactional -@AutoConfigureMockMvc -@ActiveProfiles("local") -@RequiredArgsConstructor -class MatchServiceTest { - @Autowired - MatchFindService matchFindService; - @Autowired - MatchService matchService; - @Autowired - RedisMatchTimeRepository redisMatchTimeRepository; - @Autowired - RedisMatchUserRepository redisMatchUserRepository; - @Autowired - RedisConnectionFactory redisConnectionFactory; - @Autowired - RedisTemplate redisTemplate; - @Autowired - MatchTestUtils matchTestSetting; - @Autowired - GameRepository gameRepository; - @Autowired - RankRedisRepository rankRedisRepository; - @Autowired - NotiRepository notiRepository; - @Autowired - PenaltyAdminRepository penaltyRepository; - @Autowired - PenaltyUserRedisRepository penaltyUserRedisRepository; - List users; - List slotTimes; - - Season testSeason; - - - @BeforeEach - void init() { - Random random = new Random(); - Integer userCount = random.nextInt(10) + 5; - Integer pppGap = random.nextInt(100) + 50; - Season season = matchTestSetting.makeTestSeason(pppGap); - this.testSeason = season; - List users = new ArrayList(); - for(int i = 0; i < userCount; i++) { - User user = matchTestSetting.createUser(); - users.add(user); - } - this.users = users; - users.stream().forEach(user -> - matchTestSetting.addUsertoRankRedis(user.getId(), random.nextInt(season.getPppGap()), season.getId())); - SlotManagement slotManagement = matchTestSetting.makeTestSlotManagement(15); - List slotTimes = matchTestSetting.getTestSlotTimes(slotManagement.getGameInterval()); - this.slotTimes = slotTimes; - } - @AfterEach - void clear() { - RedisConnection connection = redisConnectionFactory.getConnection(); - connection.flushDb(); - connection.close(); - } - - @DisplayName("매칭 가능 상대가 없는 경우 큐에 들어감") - @Test - void addMatchDifferentOption() { - System.out.println("this.users = " + this.users); - matchService.makeMatch(UserDto.from(users.get(0)), Option.NORMAL, this.slotTimes.get(0)); - matchService.makeMatch(UserDto.from(users.get(1)), Option.RANK, this.slotTimes.get(0)); - Long size = redisTemplate.opsForList().size(MatchKey.getTime(slotTimes.get(0))); - Assertions.assertThat(size).isEqualTo(2L); - } - - @DisplayName("normal both 매칭 시 게임 생성") - @Test - void makeGameWithNormalAndBoth() { - System.out.println("this.users = " + this.users); - matchService.makeMatch(UserDto.from(users.get(0)), Option.NORMAL, this.slotTimes.get(0)); - matchService.makeMatch(UserDto.from(users.get(1)), Option.BOTH, this.slotTimes.get(0)); - matchService.makeMatch(UserDto.from(users.get(2)), Option.BOTH, this.slotTimes.get(1)); - matchService.makeMatch(UserDto.from(users.get(3)), Option.NORMAL, this.slotTimes.get(1)); - Optional game1 = gameRepository.findByStartTime(slotTimes.get(0)); - Optional game2 = gameRepository.findByStartTime(slotTimes.get(1)); - Assertions.assertThat(game1).isPresent(); - Assertions.assertThat(game2).isPresent(); - System.out.println("normal user + matchService = " + matchFindService.getAllMatchStatus(UserDto.from(users.get(0)), Option.NORMAL)); - System.out.println(); - System.out.println("normal user both + matchService = " + matchFindService.getAllMatchStatus(UserDto.from(users.get(0)), Option.BOTH)); - System.out.println("both user + matchService = " + matchFindService.getAllMatchStatus(UserDto.from(users.get(1)), - Option.BOTH)); - System.out.println("both user normal matchService = " + matchFindService.getAllMatchStatus(UserDto.from(users.get(1)), - Option.NORMAL)); - } - - @DisplayName("Queue에 매칭 가능한 normal 상대가 있을 경우 게임 생성") - @Test - void addMatchSameNormalOption() { - matchService.makeMatch(UserDto.from(users.get(0)), Option.NORMAL, this.slotTimes.get(0)); - matchService.makeMatch(UserDto.from(users.get(1)), Option.NORMAL, this.slotTimes.get(0)); - Optional game = gameRepository.findByStartTime(slotTimes.get(0)); - Assertions.assertThat(game.isEmpty()).isEqualTo(false); - } - - @DisplayName("Queue에 user가 선택한 random option으로 매칭 가능한 상대가 없을 경우") - @Test - void addMatchRankOptionAndPppGapBiggerThanSeasonPppGap() { - User user1 = matchTestSetting.createUser(); - matchTestSetting.addUsertoRankRedis(user1.getId(), - this.testSeason.getStartPpp() + this.testSeason.getPppGap() + 1, this.testSeason.getId());//pppGap차이가 충분히 큰 경우 - matchService.makeMatch(UserDto.from(user1), Option.RANK, this.slotTimes.get(0)); - matchService.makeMatch(UserDto.from(users.get(0)), Option.NORMAL, this.slotTimes.get(0)); - matchService.makeMatch(UserDto.from(users.get(1)), Option.RANK, this.slotTimes.get(0)); - Long size = redisTemplate.opsForList().size(MatchKey.getTime(slotTimes.get(0))); - Assertions.assertThat(size).isEqualTo(3L); - Optional game = gameRepository.findByStartTime(slotTimes.get(0)); - Assertions.assertThat(game.isEmpty()).isEqualTo(true); - - } - - @DisplayName("Queue에 user가 선택한 random option으로 매칭 가능한 상대가 있는 경우") - @Test - void addMatchRankOptionAndPppGapSamllerThanOrEqualToSeasonPppGap() { - RankRedis userRank = rankRedisRepository.findRankByUserId(RedisKeyManager - .getHashKey(this.testSeason.getId()), users.get(0).getId()); - User user1 = matchTestSetting.createUser(); - matchTestSetting.addUsertoRankRedis(user1.getId(),userRank.getPpp() + this.testSeason.getPppGap() - , this.testSeason.getId());//pppGap차이가 pppGap만큼 - matchService.makeMatch(UserDto.from(user1), Option.RANK, this.slotTimes.get(0)); - matchService.makeMatch(UserDto.from(users.get(0)), Option.RANK, this.slotTimes.get(0)); - Long size = redisTemplate.opsForList().size(MatchKey.getTime(slotTimes.get(0))); - Assertions.assertThat(size).isEqualTo(0L); - Optional game = gameRepository.findByStartTime(slotTimes.get(0)); - Assertions.assertThat(game.isEmpty()).isEqualTo(false); - } - - @DisplayName("Queue에 user가 선택한 both option으로 매칭 가능한 상대가 있는 경우") - @Test - void addMatchBothOptionAndPppGapSmallerThanOrEqualToSeasonPppGap() { - RankRedis userRank = rankRedisRepository.findRankByUserId(RedisKeyManager - .getHashKey(this.testSeason.getId()), users.get(0).getId()); - User user1 = matchTestSetting.createUser(); - matchTestSetting.addUsertoRankRedis(user1.getId(),userRank.getPpp() + this.testSeason.getPppGap() - , this.testSeason.getId());//pppGap차이가 pppGap만큼 - matchService.makeMatch(UserDto.from(user1), Option.BOTH, this.slotTimes.get(0)); - matchService.makeMatch(UserDto.from(users.get(0)), Option.BOTH, this.slotTimes.get(0)); - Long size = redisTemplate.opsForList().size(MatchKey.getTime(slotTimes.get(0))); - Assertions.assertThat(size).isEqualTo(0L); - Optional game = gameRepository.findByStartTime(slotTimes.get(0)); - Assertions.assertThat(game.isEmpty()).isEqualTo(false); - Assertions.assertThat(game.get().getMode()).isEqualTo(Mode.RANK); - } - - - @DisplayName("게임 생성되었을 때 경기 취소") - @Test - void cancelMatchAfterMakingGameEntity() { - //normal 게임 생성 - matchService.makeMatch(UserDto.from(users.get(0)), Option.NORMAL, this.slotTimes.get(3)); - matchService.makeMatch(UserDto.from(users.get(1)), Option.NORMAL, this.slotTimes.get(3)); - //user2 다른 슬롯 등록 - //첫번째 유저 경기 취소 - org.junit.jupiter.api.Assertions.assertThrows( - EnrolledSlotException.class, - () -> matchService.makeMatch(UserDto.from(users.get(0)), Option.NORMAL, this.slotTimes.get(0)) - ); - matchService.cancelMatch(UserDto.from(users.get(0)), slotTimes.get(3)); - Optional game = gameRepository.findByStartTime(slotTimes.get(3)); - Assertions.assertThat(game.isEmpty()).isEqualTo(true); - Assertions.assertThat(redisMatchUserRepository.countMatchTime(users.get(1).getId())).isEqualTo(0L); - - //알람 확인 - List notifications = notiRepository.findAllByUser(users.get(1)); - System.out.println("users.get(0).getIntraId() = " + users.get(0).getIntraId()); - for (Noti noti : notifications) { - System.out.println("noti.getMessage() = " + noti.getMessage()); - } - Assertions.assertThat(notifications.size()).isEqualTo(2); - Assertions.assertThat(notifications.get(0).getType()).isEqualTo(NotiType.MATCHED); - Assertions.assertThat(notifications.get(1).getType()).isEqualTo(NotiType.CANCELEDBYMAN); - - //패널티 확인 - Optional penaltyUser = penaltyUserRedisRepository.findByIntraId(users.get(0).getIntraId()); - Assertions.assertThat(penaltyUser).isPresent(); - Assertions.assertThat(penaltyUser.get().getPenaltyTime()).isEqualTo(1); - org.junit.jupiter.api.Assertions.assertThrows(PenaltyUserSlotException.class, () -> { - matchService.makeMatch(UserDto.from(users.get(0)), Option.BOTH, slotTimes.get(10)); - } - ); - } - - - @DisplayName("게임 생성 전 경기 취소") - @Test - void cancelBeforeMakingGameEntity() { - RankRedis userRank = rankRedisRepository.findRankByUserId(RedisKeyManager - .getHashKey(this.testSeason.getId()), users.get(0).getId()); - User user1 = matchTestSetting.createUser(); - matchTestSetting.addUsertoRankRedis(user1.getId(),userRank.getPpp() + this.testSeason.getPppGap() + 100 - , this.testSeason.getId()); - //매칭이 이루어질 수 없는 유저 3명을 큐에 등록 - matchService.makeMatch(UserDto.from(users.get(0)), Option.RANK, slotTimes.get(0)); - matchService.makeMatch(UserDto.from(users.get(1)), Option.NORMAL, slotTimes.get(0)); - matchService.makeMatch(UserDto.from(user1), Option.RANK, slotTimes.get(0)); - //user1의 취소 - matchService.cancelMatch(UserDto.from(users.get(1)), slotTimes.get(0)); - List allMatchUsers = redisMatchTimeRepository.getAllMatchUsers(slotTimes.get(0)); - Assertions.assertThat(allMatchUsers.size()).isEqualTo(2L); - - } - - @DisplayName("슬롯 조회 : 게임 생성한 후 내 테이블로 인식") - @Test - void readMyTableAfterMakingGame() { - //normal 게임 생성 - matchService.makeMatch(UserDto.from(users.get(0)), Option.NORMAL, slotTimes.get(0)); - matchService.makeMatch(UserDto.from(users.get(0)), Option.RANK, slotTimes.get(4)); - matchService.makeMatch(UserDto.from(users.get(1)), Option.RANK, slotTimes.get(1)); - matchService.makeMatch(UserDto.from(users.get(2)), Option.NORMAL, slotTimes.get(2)); - SlotStatusResponseListDto slotStatusList = matchFindService.getAllMatchStatus(UserDto.from(users.get(0)), - Option.NORMAL); - for (int i = 0; i < 3; i++) { - System.out.println("slotTimes = " + String.valueOf(i) + slotTimes.get(i)); - } - for (List dtos : slotStatusList.getMatchBoards()) { - for (SlotStatusDto dto: dtos) { - System.out.println("dto = " + dto); - if (dto.getStartTime().equals(slotTimes.get(0))) { - Assertions.assertThat(dto.getStatus()).isEqualTo(SlotStatus.MYTABLE.getCode()); - } - if (dto.getStartTime().equals(slotTimes.get(1))) { - Assertions.assertThat(dto.getStatus()).isEqualTo(SlotStatus.OPEN.getCode()); - } - if (dto.getStartTime().equals(slotTimes.get(2))) { - Assertions.assertThat(dto.getStatus()).isEqualTo(SlotStatus.MATCH.getCode()); - } - if (dto.getStartTime().equals(slotTimes.get(4))) { - Assertions.assertThat(dto.getStatus()).isEqualTo(SlotStatus.CLOSE.getCode()); - } - } - } - - } - - @DisplayName("슬롯 조회 : 게임 생성 전 내 테이블로 인식") - @Test - void readMyTableBeforeMakingGame() { - for (int i = 0; i < 3; i++) { - matchService.makeMatch(UserDto.from(users.get(0)), Option.NORMAL, slotTimes.get(i)); - } - matchService.makeMatch(UserDto.from(users.get(1)), Option.NORMAL, slotTimes.get(3)); - matchService.makeMatch(UserDto.from(users.get(2)), Option.NORMAL, slotTimes.get(3)); - SlotStatusResponseListDto slotStatusList = matchFindService.getAllMatchStatus(UserDto.from(users.get(0)), - Option.NORMAL); - for (List dtos : slotStatusList.getMatchBoards()) { - for (SlotStatusDto dto: dtos) { - if (dto.getStartTime().equals(slotTimes.get(0))) { - Assertions.assertThat(dto.getStatus()).isEqualTo(SlotStatus.MYTABLE.getCode()); - } - if (dto.getStartTime().equals(slotTimes.get(1))) { - Assertions.assertThat(dto.getStatus()).isEqualTo(SlotStatus.MYTABLE.getCode()); - } - if (dto.getStartTime().equals(slotTimes.get(2))) { - Assertions.assertThat(dto.getStatus()).isEqualTo(SlotStatus.MYTABLE.getCode()); - } - if (dto.getStartTime().equals(slotTimes.get(3))) { - Assertions.assertThat(dto.getStatus()).isEqualTo(SlotStatus.CLOSE.getCode()); - } - } - } - - } - @DisplayName("current Match 조회 : user가 등록한 슬롯이 매칭되었을 때") - @Test - void readCurrentMatchAfterMakingGameEntity() { - //게임생성 - matchService.makeMatch(UserDto.from(users.get(1)), Option.NORMAL, slotTimes.get(3)); - matchService.makeMatch(UserDto.from(users.get(2)), Option.NORMAL, slotTimes.get(3)); - UserDto userDto = UserDto.from(users.get(1)); - MatchStatusResponseListDto currentMatch = matchFindService.getCurrentMatch(userDto); - //user의 current match 확인 - List match = currentMatch.getMatch(); - Assertions.assertThat(match.size()).isEqualTo(1); - Assertions.assertThat(match.get(0).getMyTeam().get(0)).isEqualTo(users.get(1).getIntraId()); - Assertions.assertThat(match.get(0).getEnemyTeam().get(0)).isEqualTo(users.get(2).getIntraId()); - Assertions.assertThat(match.get(0).getStartTime()).isEqualTo(slotTimes.get(3)); - Assertions.assertThat(match.get(0).getIsMatched()).isEqualTo(true); - } - - @DisplayName("current Match 조회 : user가 등록한 슬롯이 매칭되지 않았을 때") - @Test - void readCurrentMatchBeforeMakingGameEntity() { - //유저 슬롯 3개 등록 시도 - for (int i = 0; i < 3; i++) { - System.out.println("slotTimes = " + slotTimes.get(i)); - matchService.makeMatch(UserDto.from(users.get(1)), Option.NORMAL, slotTimes.get(i)); - } - UserDto userDto = UserDto.from(users.get(1)); - MatchStatusResponseListDto currentMatch = matchFindService.getCurrentMatch(userDto); - List match = currentMatch.getMatch(); - //user current match 확인 - Assertions.assertThat(match.size()).isEqualTo(3); - for (int i = 0; i < 3; i++) { - System.out.println("match = " + match.get(i).getStartTime()); - Assertions.assertThat(match.get(i).getMyTeam().size()).isEqualTo(0); - Assertions.assertThat(match.get(i).getEnemyTeam().size()).isEqualTo(0); - Assertions.assertThat(match.get(i).getStartTime()).isEqualTo(slotTimes.get(i)); - Assertions.assertThat(match.get(i).getIsMatched()).isEqualTo(false); - } - } - - @DisplayName("Guest User slot 조회") - @Test - void readAllSlotsAndCurrentMatchForGuset() { - User guestUser = matchTestSetting.createGuestUser(); - MatchStatusResponseListDto currentMatch = matchFindService.getCurrentMatch(UserDto.from(guestUser)); - SlotStatusResponseListDto allMatchStatus = matchFindService.getAllMatchStatus(UserDto.from(guestUser), - Option.NORMAL); - Assertions.assertThat(currentMatch.getMatch().size()).isEqualTo(0); - System.out.println("allMatchStatus = " + allMatchStatus); - } -} +package com.gg.server.domain.match.service; + +import com.gg.server.admin.penalty.data.PenaltyAdminRepository; +import com.gg.server.domain.game.data.Game; +import com.gg.server.domain.game.data.GameRepository; +import com.gg.server.domain.game.type.Mode; +import com.gg.server.domain.match.data.RedisMatchTimeRepository; +import com.gg.server.domain.match.data.RedisMatchUser; +import com.gg.server.domain.match.data.RedisMatchUserRepository; +import com.gg.server.domain.match.dto.MatchStatusDto; +import com.gg.server.domain.match.dto.MatchStatusResponseListDto; +import com.gg.server.domain.match.dto.SlotStatusDto; +import com.gg.server.domain.match.dto.SlotStatusResponseListDto; +import com.gg.server.domain.match.exception.EnrolledSlotException; +import com.gg.server.domain.match.exception.PenaltyUserSlotException; +import com.gg.server.domain.match.type.MatchKey; +import com.gg.server.domain.match.type.Option; +import com.gg.server.domain.match.type.SlotStatus; +import com.gg.server.domain.noti.data.Noti; +import com.gg.server.domain.noti.data.NotiRepository; +import com.gg.server.domain.noti.type.NotiType; +import com.gg.server.domain.penalty.redis.PenaltyUserRedisRepository; +import com.gg.server.domain.penalty.redis.RedisPenaltyUser; +import com.gg.server.domain.rank.redis.RankRedis; +import com.gg.server.domain.rank.redis.RankRedisRepository; +import com.gg.server.domain.rank.redis.RedisKeyManager; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.slotmanagement.SlotManagement; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.dto.UserDto; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.Random; +import lombok.RequiredArgsConstructor; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.redis.connection.RedisConnection; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Transactional; + +@SpringBootTest +@Transactional +@AutoConfigureMockMvc +@ActiveProfiles("local") +@RequiredArgsConstructor +class MatchServiceTest { + @Autowired + MatchFindService matchFindService; + @Autowired + MatchService matchService; + @Autowired + RedisMatchTimeRepository redisMatchTimeRepository; + @Autowired + RedisMatchUserRepository redisMatchUserRepository; + @Autowired + RedisConnectionFactory redisConnectionFactory; + @Autowired + RedisTemplate redisTemplate; + @Autowired + MatchTestUtils matchTestSetting; + @Autowired + GameRepository gameRepository; + @Autowired + RankRedisRepository rankRedisRepository; + @Autowired + NotiRepository notiRepository; + @Autowired + PenaltyAdminRepository penaltyRepository; + @Autowired + PenaltyUserRedisRepository penaltyUserRedisRepository; + List users; + List slotTimes; + + Season testSeason; + + + @BeforeEach + void init() { + Random random = new Random(); + Integer userCount = random.nextInt(10) + 5; + Integer pppGap = random.nextInt(100) + 50; + Season season = matchTestSetting.makeTestSeason(pppGap); + this.testSeason = season; + List users = new ArrayList(); + for(int i = 0; i < userCount; i++) { + User user = matchTestSetting.createUser(); + users.add(user); + } + this.users = users; + users.stream().forEach(user -> + matchTestSetting.addUsertoRankRedis(user.getId(), random.nextInt(season.getPppGap()), season.getId())); + SlotManagement slotManagement = matchTestSetting.makeTestSlotManagement(15); + List slotTimes = matchTestSetting.getTestSlotTimes(slotManagement.getGameInterval()); + this.slotTimes = slotTimes; + } + @AfterEach + void clear() { + RedisConnection connection = redisConnectionFactory.getConnection(); + connection.flushDb(); + connection.close(); + } + + @DisplayName("매칭 가능 상대가 없는 경우 큐에 들어감") + @Test + void addMatchDifferentOption() { + System.out.println("this.users = " + this.users); + matchService.makeMatch(UserDto.from(users.get(0)), Option.NORMAL, this.slotTimes.get(0)); + matchService.makeMatch(UserDto.from(users.get(1)), Option.RANK, this.slotTimes.get(0)); + Long size = redisTemplate.opsForList().size(MatchKey.getTime(slotTimes.get(0))); + Assertions.assertThat(size).isEqualTo(2L); + } + + @DisplayName("normal both 매칭 시 게임 생성") + @Test + void makeGameWithNormalAndBoth() { + System.out.println("this.users = " + this.users); + matchService.makeMatch(UserDto.from(users.get(0)), Option.NORMAL, this.slotTimes.get(0)); + matchService.makeMatch(UserDto.from(users.get(1)), Option.BOTH, this.slotTimes.get(0)); + matchService.makeMatch(UserDto.from(users.get(2)), Option.BOTH, this.slotTimes.get(1)); + matchService.makeMatch(UserDto.from(users.get(3)), Option.NORMAL, this.slotTimes.get(1)); + Optional game1 = gameRepository.findByStartTime(slotTimes.get(0)); + Optional game2 = gameRepository.findByStartTime(slotTimes.get(1)); + Assertions.assertThat(game1).isPresent(); + Assertions.assertThat(game2).isPresent(); + System.out.println("normal user + matchService = " + matchFindService.getAllMatchStatus(UserDto.from(users.get(0)), Option.NORMAL)); + System.out.println(); + System.out.println("normal user both + matchService = " + matchFindService.getAllMatchStatus(UserDto.from(users.get(0)), Option.BOTH)); + System.out.println("both user + matchService = " + matchFindService.getAllMatchStatus(UserDto.from(users.get(1)), + Option.BOTH)); + System.out.println("both user normal matchService = " + matchFindService.getAllMatchStatus(UserDto.from(users.get(1)), + Option.NORMAL)); + } + + @DisplayName("Queue에 매칭 가능한 normal 상대가 있을 경우 게임 생성") + @Test + void addMatchSameNormalOption() { + matchService.makeMatch(UserDto.from(users.get(0)), Option.NORMAL, this.slotTimes.get(0)); + matchService.makeMatch(UserDto.from(users.get(1)), Option.NORMAL, this.slotTimes.get(0)); + Optional game = gameRepository.findByStartTime(slotTimes.get(0)); + Assertions.assertThat(game.isEmpty()).isEqualTo(false); + } + + @DisplayName("Queue에 user가 선택한 random option으로 매칭 가능한 상대가 없을 경우") + @Test + void addMatchRankOptionAndPppGapBiggerThanSeasonPppGap() { + User user1 = matchTestSetting.createUser(); + matchTestSetting.addUsertoRankRedis(user1.getId(), + this.testSeason.getStartPpp() + this.testSeason.getPppGap() + 1, this.testSeason.getId());//pppGap차이가 충분히 큰 경우 + matchService.makeMatch(UserDto.from(user1), Option.RANK, this.slotTimes.get(0)); + matchService.makeMatch(UserDto.from(users.get(0)), Option.NORMAL, this.slotTimes.get(0)); + matchService.makeMatch(UserDto.from(users.get(1)), Option.RANK, this.slotTimes.get(0)); + Long size = redisTemplate.opsForList().size(MatchKey.getTime(slotTimes.get(0))); + Assertions.assertThat(size).isEqualTo(3L); + Optional game = gameRepository.findByStartTime(slotTimes.get(0)); + Assertions.assertThat(game.isEmpty()).isEqualTo(true); + + } + + @DisplayName("Queue에 user가 선택한 random option으로 매칭 가능한 상대가 있는 경우") + @Test + void addMatchRankOptionAndPppGapSamllerThanOrEqualToSeasonPppGap() { + RankRedis userRank = rankRedisRepository.findRankByUserId(RedisKeyManager + .getHashKey(this.testSeason.getId()), users.get(0).getId()); + User user1 = matchTestSetting.createUser(); + matchTestSetting.addUsertoRankRedis(user1.getId(),userRank.getPpp() + this.testSeason.getPppGap() + , this.testSeason.getId());//pppGap차이가 pppGap만큼 + matchService.makeMatch(UserDto.from(user1), Option.RANK, this.slotTimes.get(0)); + matchService.makeMatch(UserDto.from(users.get(0)), Option.RANK, this.slotTimes.get(0)); + Long size = redisTemplate.opsForList().size(MatchKey.getTime(slotTimes.get(0))); + Assertions.assertThat(size).isEqualTo(0L); + Optional game = gameRepository.findByStartTime(slotTimes.get(0)); + Assertions.assertThat(game.isEmpty()).isEqualTo(false); + } + + @DisplayName("Queue에 user가 선택한 both option으로 매칭 가능한 상대가 있는 경우") + @Test + void addMatchBothOptionAndPppGapSmallerThanOrEqualToSeasonPppGap() { + RankRedis userRank = rankRedisRepository.findRankByUserId(RedisKeyManager + .getHashKey(this.testSeason.getId()), users.get(0).getId()); + User user1 = matchTestSetting.createUser(); + matchTestSetting.addUsertoRankRedis(user1.getId(),userRank.getPpp() + this.testSeason.getPppGap() + , this.testSeason.getId());//pppGap차이가 pppGap만큼 + matchService.makeMatch(UserDto.from(user1), Option.BOTH, this.slotTimes.get(0)); + matchService.makeMatch(UserDto.from(users.get(0)), Option.BOTH, this.slotTimes.get(0)); + Long size = redisTemplate.opsForList().size(MatchKey.getTime(slotTimes.get(0))); + Assertions.assertThat(size).isEqualTo(0L); + Optional game = gameRepository.findByStartTime(slotTimes.get(0)); + Assertions.assertThat(game.isEmpty()).isEqualTo(false); + Assertions.assertThat(game.get().getMode()).isEqualTo(Mode.RANK); + } + + + @DisplayName("게임 생성되었을 때 경기 취소") + @Test + void cancelMatchAfterMakingGameEntity() { + //normal 게임 생성 + matchService.makeMatch(UserDto.from(users.get(0)), Option.NORMAL, this.slotTimes.get(3)); + matchService.makeMatch(UserDto.from(users.get(1)), Option.NORMAL, this.slotTimes.get(3)); + //user2 다른 슬롯 등록 + //첫번째 유저 경기 취소 + org.junit.jupiter.api.Assertions.assertThrows( + EnrolledSlotException.class, + () -> matchService.makeMatch(UserDto.from(users.get(0)), Option.NORMAL, this.slotTimes.get(0)) + ); + matchService.cancelMatch(UserDto.from(users.get(0)), slotTimes.get(3)); + Optional game = gameRepository.findByStartTime(slotTimes.get(3)); + Assertions.assertThat(game.isEmpty()).isEqualTo(true); + Assertions.assertThat(redisMatchUserRepository.countMatchTime(users.get(1).getId())).isEqualTo(0L); + + //알람 확인 + List notifications = notiRepository.findAllByUser(users.get(1)); + System.out.println("users.get(0).getIntraId() = " + users.get(0).getIntraId()); + for (Noti noti : notifications) { + System.out.println("noti.getMessage() = " + noti.getMessage()); + } + Assertions.assertThat(notifications.size()).isEqualTo(2); + Assertions.assertThat(notifications.get(0).getType()).isEqualTo(NotiType.MATCHED); + Assertions.assertThat(notifications.get(1).getType()).isEqualTo(NotiType.CANCELEDBYMAN); + + //패널티 확인 + Optional penaltyUser = penaltyUserRedisRepository.findByIntraId(users.get(0).getIntraId()); + Assertions.assertThat(penaltyUser).isPresent(); + Assertions.assertThat(penaltyUser.get().getPenaltyTime()).isEqualTo(1); + org.junit.jupiter.api.Assertions.assertThrows(PenaltyUserSlotException.class, () -> { + matchService.makeMatch(UserDto.from(users.get(0)), Option.BOTH, slotTimes.get(10)); + } + ); + } + + + @DisplayName("게임 생성 전 경기 취소") + @Test + void cancelBeforeMakingGameEntity() { + RankRedis userRank = rankRedisRepository.findRankByUserId(RedisKeyManager + .getHashKey(this.testSeason.getId()), users.get(0).getId()); + User user1 = matchTestSetting.createUser(); + matchTestSetting.addUsertoRankRedis(user1.getId(),userRank.getPpp() + this.testSeason.getPppGap() + 100 + , this.testSeason.getId()); + //매칭이 이루어질 수 없는 유저 3명을 큐에 등록 + matchService.makeMatch(UserDto.from(users.get(0)), Option.RANK, slotTimes.get(0)); + matchService.makeMatch(UserDto.from(users.get(1)), Option.NORMAL, slotTimes.get(0)); + matchService.makeMatch(UserDto.from(user1), Option.RANK, slotTimes.get(0)); + //user1의 취소 + matchService.cancelMatch(UserDto.from(users.get(1)), slotTimes.get(0)); + List allMatchUsers = redisMatchTimeRepository.getAllMatchUsers(slotTimes.get(0)); + Assertions.assertThat(allMatchUsers.size()).isEqualTo(2L); + + } + + @DisplayName("슬롯 조회 : 게임 생성한 후 내 테이블로 인식") + @Test + void readMyTableAfterMakingGame() { + //normal 게임 생성 + matchService.makeMatch(UserDto.from(users.get(0)), Option.NORMAL, slotTimes.get(0)); + matchService.makeMatch(UserDto.from(users.get(0)), Option.RANK, slotTimes.get(4)); + matchService.makeMatch(UserDto.from(users.get(1)), Option.RANK, slotTimes.get(1)); + matchService.makeMatch(UserDto.from(users.get(2)), Option.NORMAL, slotTimes.get(2)); + SlotStatusResponseListDto slotStatusList = matchFindService.getAllMatchStatus(UserDto.from(users.get(0)), + Option.NORMAL); + for (int i = 0; i < 3; i++) { + System.out.println("slotTimes = " + String.valueOf(i) + slotTimes.get(i)); + } + for (List dtos : slotStatusList.getMatchBoards()) { + for (SlotStatusDto dto: dtos) { + System.out.println("dto = " + dto); + if (dto.getStartTime().equals(slotTimes.get(0))) { + Assertions.assertThat(dto.getStatus()).isEqualTo(SlotStatus.MYTABLE.getCode()); + } + if (dto.getStartTime().equals(slotTimes.get(1))) { + Assertions.assertThat(dto.getStatus()).isEqualTo(SlotStatus.OPEN.getCode()); + } + if (dto.getStartTime().equals(slotTimes.get(2))) { + Assertions.assertThat(dto.getStatus()).isEqualTo(SlotStatus.MATCH.getCode()); + } + if (dto.getStartTime().equals(slotTimes.get(4))) { + Assertions.assertThat(dto.getStatus()).isEqualTo(SlotStatus.CLOSE.getCode()); + } + } + } + + } + + @DisplayName("슬롯 조회 : 게임 생성 전 내 테이블로 인식") + @Test + void readMyTableBeforeMakingGame() { + for (int i = 0; i < 3; i++) { + matchService.makeMatch(UserDto.from(users.get(0)), Option.NORMAL, slotTimes.get(i)); + } + matchService.makeMatch(UserDto.from(users.get(1)), Option.NORMAL, slotTimes.get(3)); + matchService.makeMatch(UserDto.from(users.get(2)), Option.NORMAL, slotTimes.get(3)); + SlotStatusResponseListDto slotStatusList = matchFindService.getAllMatchStatus(UserDto.from(users.get(0)), + Option.NORMAL); + for (List dtos : slotStatusList.getMatchBoards()) { + for (SlotStatusDto dto: dtos) { + if (dto.getStartTime().equals(slotTimes.get(0))) { + Assertions.assertThat(dto.getStatus()).isEqualTo(SlotStatus.MYTABLE.getCode()); + } + if (dto.getStartTime().equals(slotTimes.get(1))) { + Assertions.assertThat(dto.getStatus()).isEqualTo(SlotStatus.MYTABLE.getCode()); + } + if (dto.getStartTime().equals(slotTimes.get(2))) { + Assertions.assertThat(dto.getStatus()).isEqualTo(SlotStatus.MYTABLE.getCode()); + } + if (dto.getStartTime().equals(slotTimes.get(3))) { + Assertions.assertThat(dto.getStatus()).isEqualTo(SlotStatus.CLOSE.getCode()); + } + } + } + + } + @DisplayName("current Match 조회 : user가 등록한 슬롯이 매칭되었을 때") + @Test + void readCurrentMatchAfterMakingGameEntity() { + //게임생성 + matchService.makeMatch(UserDto.from(users.get(1)), Option.NORMAL, slotTimes.get(3)); + matchService.makeMatch(UserDto.from(users.get(2)), Option.NORMAL, slotTimes.get(3)); + UserDto userDto = UserDto.from(users.get(1)); + MatchStatusResponseListDto currentMatch = matchFindService.getCurrentMatch(userDto); + //user의 current match 확인 + List match = currentMatch.getMatch(); + Assertions.assertThat(match.size()).isEqualTo(1); + Assertions.assertThat(match.get(0).getMyTeam().get(0)).isEqualTo(users.get(1).getIntraId()); + Assertions.assertThat(match.get(0).getEnemyTeam().get(0)).isEqualTo(users.get(2).getIntraId()); + Assertions.assertThat(match.get(0).getStartTime()).isEqualTo(slotTimes.get(3)); + Assertions.assertThat(match.get(0).getIsMatched()).isEqualTo(true); + } + + @DisplayName("current Match 조회 : user가 등록한 슬롯이 매칭되지 않았을 때") + @Test + void readCurrentMatchBeforeMakingGameEntity() { + //유저 슬롯 3개 등록 시도 + for (int i = 0; i < 3; i++) { + System.out.println("slotTimes = " + slotTimes.get(i)); + matchService.makeMatch(UserDto.from(users.get(1)), Option.NORMAL, slotTimes.get(i)); + } + UserDto userDto = UserDto.from(users.get(1)); + MatchStatusResponseListDto currentMatch = matchFindService.getCurrentMatch(userDto); + List match = currentMatch.getMatch(); + //user current match 확인 + Assertions.assertThat(match.size()).isEqualTo(3); + for (int i = 0; i < 3; i++) { + System.out.println("match = " + match.get(i).getStartTime()); + Assertions.assertThat(match.get(i).getMyTeam().size()).isEqualTo(0); + Assertions.assertThat(match.get(i).getEnemyTeam().size()).isEqualTo(0); + Assertions.assertThat(match.get(i).getStartTime()).isEqualTo(slotTimes.get(i)); + Assertions.assertThat(match.get(i).getIsMatched()).isEqualTo(false); + } + } + + @DisplayName("Guest User slot 조회") + @Test + void readAllSlotsAndCurrentMatchForGuset() { + User guestUser = matchTestSetting.createGuestUser(); + MatchStatusResponseListDto currentMatch = matchFindService.getCurrentMatch(UserDto.from(guestUser)); + SlotStatusResponseListDto allMatchStatus = matchFindService.getAllMatchStatus(UserDto.from(guestUser), + Option.NORMAL); + Assertions.assertThat(currentMatch.getMatch().size()).isEqualTo(0); + System.out.println("allMatchStatus = " + allMatchStatus); + } +} diff --git a/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java b/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java index c7720eb3e..27c5abe65 100644 --- a/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java +++ b/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java @@ -1,114 +1,114 @@ -package com.gg.server.domain.match.service; - -import com.gg.server.domain.match.exception.SlotNotFoundException; -import com.gg.server.domain.rank.redis.RankRedis; -import com.gg.server.domain.rank.redis.RankRedisRepository; -import com.gg.server.domain.rank.redis.RedisKeyManager; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.season.data.SeasonRepository; -import com.gg.server.domain.slotmanagement.SlotManagement; -import com.gg.server.domain.slotmanagement.data.SlotManagementRepository; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.domain.user.type.RacketType; -import com.gg.server.domain.user.type.RoleType; -import com.gg.server.domain.user.type.SnsType; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.UUID; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -public class MatchTestUtils { - private final UserRepository userRepository; - private final SeasonRepository seasonRepository; - private final RankRedisRepository rankRedisRepository; - private final SlotManagementRepository slotManagementRepository; - - public User createUser() { - String randomId = UUID.randomUUID().toString().substring(0, 30); - User user = User.builder() - .eMail("email") - .intraId(randomId) - .imageUri("image") - .racketType(RacketType.PENHOLDER) - .snsNotiOpt(SnsType.NONE) - .roleType(RoleType.USER) - .totalExp(1000) - .build(); - userRepository.save(user); - return user; - } - - public User createGuestUser() { - String randomId = UUID.randomUUID().toString().substring(0, 30); - User user = User.builder() - .eMail("email") - .intraId(randomId) - .imageUri("image") - .racketType(RacketType.PENHOLDER) - .snsNotiOpt(SnsType.NONE) - .roleType(RoleType.GUEST) - .totalExp(1000) - .build(); - userRepository.save(user); - return user; - } - - public RankRedis addUsertoRankRedis(Long userId, Integer ppp, Long seasonId) { - String randomId = UUID.randomUUID().toString(); - RankRedis rankRedis = new RankRedis(userId, randomId, ppp, 0, 0,"test"); - rankRedisRepository.addRankData(RedisKeyManager.getHashKey(seasonId), userId, rankRedis); - rankRedisRepository.addToZSet(RedisKeyManager.getZSetKey(seasonId), userId, ppp); - return rankRedis; - } - - public List getTestSlotTimes(Integer interval) { - LocalDateTime now = LocalDateTime.now(); - LocalDateTime standard = LocalDateTime.of(now.getYear(), now.getMonth(), now.getDayOfMonth() - , now.getHour(), 0); - List sampleSlots = new ArrayList(); - for (int i = 0; i < 15; i++) { - if (standard.plusMinutes(interval * i).isAfter(now)) { - sampleSlots.add(standard.plusMinutes(interval * i)); - } - } - return sampleSlots; - } - public Season makeTestSeason(Integer pppGap) { - Optional currentSeason = seasonRepository.findCurrentSeason(LocalDateTime.now()); - if (currentSeason.isPresent()) { - return currentSeason.get(); - } - Season season = new Season( - "test", - LocalDateTime.now().minusDays(1), - LocalDateTime.of(9999, 12, 31, 23, 59, 59), - 1000, - pppGap - ); - seasonRepository.save(season); - return season; - } - - public SlotManagement makeTestSlotManagement(Integer interval) { - SlotManagement slotManagement1 = slotManagementRepository.findCurrent(LocalDateTime.now()) - .orElseThrow(SlotNotFoundException::new); - if (slotManagement1 != null) { - return slotManagement1; - } - SlotManagement slotManagement = SlotManagement.builder() - .futureSlotTime(10) - .pastSlotTime(0) - .gameInterval(interval) - .openMinute(5) - .startTime(LocalDateTime.now().minusHours(2)) - .build(); - slotManagementRepository.save(slotManagement); - return slotManagement; - } -} +package com.gg.server.domain.match.service; + +import com.gg.server.domain.match.exception.SlotNotFoundException; +import com.gg.server.domain.rank.redis.RankRedis; +import com.gg.server.domain.rank.redis.RankRedisRepository; +import com.gg.server.domain.rank.redis.RedisKeyManager; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.season.data.SeasonRepository; +import com.gg.server.domain.slotmanagement.SlotManagement; +import com.gg.server.domain.slotmanagement.data.SlotManagementRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.type.RacketType; +import com.gg.server.domain.user.type.RoleType; +import com.gg.server.domain.user.type.SnsType; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class MatchTestUtils { + private final UserRepository userRepository; + private final SeasonRepository seasonRepository; + private final RankRedisRepository rankRedisRepository; + private final SlotManagementRepository slotManagementRepository; + + public User createUser() { + String randomId = UUID.randomUUID().toString().substring(0, 30); + User user = User.builder() + .eMail("email") + .intraId(randomId) + .imageUri("image") + .racketType(RacketType.PENHOLDER) + .snsNotiOpt(SnsType.NONE) + .roleType(RoleType.USER) + .totalExp(1000) + .build(); + userRepository.save(user); + return user; + } + + public User createGuestUser() { + String randomId = UUID.randomUUID().toString().substring(0, 30); + User user = User.builder() + .eMail("email") + .intraId(randomId) + .imageUri("image") + .racketType(RacketType.PENHOLDER) + .snsNotiOpt(SnsType.NONE) + .roleType(RoleType.GUEST) + .totalExp(1000) + .build(); + userRepository.save(user); + return user; + } + + public RankRedis addUsertoRankRedis(Long userId, Integer ppp, Long seasonId) { + String randomId = UUID.randomUUID().toString(); + RankRedis rankRedis = new RankRedis(userId, randomId, ppp, 0, 0,"test"); + rankRedisRepository.addRankData(RedisKeyManager.getHashKey(seasonId), userId, rankRedis); + rankRedisRepository.addToZSet(RedisKeyManager.getZSetKey(seasonId), userId, ppp); + return rankRedis; + } + + public List getTestSlotTimes(Integer interval) { + LocalDateTime now = LocalDateTime.now(); + LocalDateTime standard = LocalDateTime.of(now.getYear(), now.getMonth(), now.getDayOfMonth() + , now.getHour(), 0); + List sampleSlots = new ArrayList(); + for (int i = 0; i < 15; i++) { + if (standard.plusMinutes(interval * i).isAfter(now)) { + sampleSlots.add(standard.plusMinutes(interval * i)); + } + } + return sampleSlots; + } + public Season makeTestSeason(Integer pppGap) { + Optional currentSeason = seasonRepository.findCurrentSeason(LocalDateTime.now()); + if (currentSeason.isPresent()) { + return currentSeason.get(); + } + Season season = new Season( + "test", + LocalDateTime.now().minusDays(1), + LocalDateTime.of(9999, 12, 31, 23, 59, 59), + 1000, + pppGap + ); + seasonRepository.save(season); + return season; + } + + public SlotManagement makeTestSlotManagement(Integer interval) { + SlotManagement slotManagement1 = slotManagementRepository.findCurrent(LocalDateTime.now()) + .orElseThrow(SlotNotFoundException::new); + if (slotManagement1 != null) { + return slotManagement1; + } + SlotManagement slotManagement = SlotManagement.builder() + .futureSlotTime(10) + .pastSlotTime(0) + .gameInterval(interval) + .openMinute(5) + .startTime(LocalDateTime.now().minusHours(2)) + .build(); + slotManagementRepository.save(slotManagement); + return slotManagement; + } +} diff --git a/src/test/java/com/gg/server/domain/noti/controller/NotiControllerTest.java b/src/test/java/com/gg/server/domain/noti/controller/NotiControllerTest.java index 995c46d25..512a34f76 100644 --- a/src/test/java/com/gg/server/domain/noti/controller/NotiControllerTest.java +++ b/src/test/java/com/gg/server/domain/noti/controller/NotiControllerTest.java @@ -1,124 +1,124 @@ -package com.gg.server.domain.noti.controller; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.gg.server.domain.noti.data.Noti; -import com.gg.server.domain.noti.data.NotiRepository; -import com.gg.server.domain.noti.dto.NotiListResponseDto; -import com.gg.server.domain.noti.service.NotiService; -import com.gg.server.domain.noti.type.NotiType; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.domain.user.dto.UserDto; -import com.gg.server.global.security.jwt.utils.AuthTokenProvider; -import com.gg.server.utils.TestDataUtils; -import lombok.RequiredArgsConstructor; -import org.apache.http.HttpHeaders; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.web.servlet.MockMvc; - -import javax.transaction.Transactional; - -import java.util.List; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@RequiredArgsConstructor -@SpringBootTest -@AutoConfigureMockMvc -class NotiControllerTest { - - @Autowired - TestDataUtils testDataUtils; - @Autowired - AuthTokenProvider tokenProvider; - @Autowired - UserRepository userRepository; - @Autowired - NotiRepository notiRepository; - @Autowired - private NotiService notiService; - @Autowired - private MockMvc mockMvc; - @Autowired - private ObjectMapper objectMapper; - - @Test - @DisplayName("GET /pingpong/notifications") - @Transactional - public void NotiFindByUserTest() throws Exception { - //given - String accessToken = testDataUtils.getLoginAccessToken(); - Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); - String url = "/pingpong/notifications"; - - UserDto userDto = UserDto.from(userRepository.getById(userId)); - NotiListResponseDto expectedResponse = new NotiListResponseDto(notiService.findNotiByUser(userDto)); - //when - String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - NotiListResponseDto actureResponse= objectMapper.readValue(contentAsString, NotiListResponseDto.class); - - //then - assertThat(actureResponse).isEqualTo(expectedResponse); - } - - @Test - @DisplayName("PUT /pingpong/notifications/check") - @Transactional - public void checkNotiByUserTest() throws Exception{ - //given - String accessToken = testDataUtils.getLoginAccessToken(); - Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); - String url = "/pingpong/notifications/check"; - User user = userRepository.findById(userId).get(); - - notiRepository.save(new Noti(user, NotiType.ANNOUNCE, "announce", false)); - notiRepository.save(new Noti(user, NotiType.MATCHED, "matched", false)); - notiRepository.save(new Noti(user, NotiType.IMMINENT, "imminent", true)); - notiRepository.save(new Noti(user, NotiType.CANCELEDBYMAN, "canceledbyman", false)); - notiRepository.save(new Noti(user, NotiType.CANCELEDBYTIME, "canceledbytime", false)); - //when - String contentAsString = mockMvc.perform(put(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().is2xxSuccessful()) - .andReturn().getResponse().getContentAsString(); - - //then - List notiList = notiRepository.findByUser(user); - for (Noti noti : notiList) { - assertThat(noti.getIsChecked()).isTrue(); - } - } - - @Test - @DisplayName("DELETE /notifications") - @Transactional - public void notiRemoveAll() throws Exception { - //given - String accessToken = testDataUtils.getLoginAccessToken(); - Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); - String url = "/pingpong/notifications"; - User user = userRepository.findById(userId).get(); - - notiRepository.save(new Noti(user, NotiType.ANNOUNCE, "announce", false)); - notiRepository.save(new Noti(user, NotiType.MATCHED, "matched", false)); - notiRepository.save(new Noti(user, NotiType.IMMINENT, "imminent", true)); - notiRepository.save(new Noti(user, NotiType.CANCELEDBYMAN, "canceledbyman", false)); - notiRepository.save(new Noti(user, NotiType.CANCELEDBYTIME, "canceledbytime", false)); - - //when - String contentAsString = mockMvc.perform(delete(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().is2xxSuccessful()) - .andReturn().getResponse().getContentAsString(); - - //then - List notiList = notiRepository.findByUser(user); - assertThat(notiList.size()).isEqualTo(0); - } +package com.gg.server.domain.noti.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.domain.noti.data.Noti; +import com.gg.server.domain.noti.data.NotiRepository; +import com.gg.server.domain.noti.dto.NotiListResponseDto; +import com.gg.server.domain.noti.service.NotiService; +import com.gg.server.domain.noti.type.NotiType; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import lombok.RequiredArgsConstructor; +import org.apache.http.HttpHeaders; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.web.servlet.MockMvc; + +import javax.transaction.Transactional; + +import java.util.List; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RequiredArgsConstructor +@SpringBootTest +@AutoConfigureMockMvc +class NotiControllerTest { + + @Autowired + TestDataUtils testDataUtils; + @Autowired + AuthTokenProvider tokenProvider; + @Autowired + UserRepository userRepository; + @Autowired + NotiRepository notiRepository; + @Autowired + private NotiService notiService; + @Autowired + private MockMvc mockMvc; + @Autowired + private ObjectMapper objectMapper; + + @Test + @DisplayName("GET /pingpong/notifications") + @Transactional + public void NotiFindByUserTest() throws Exception { + //given + String accessToken = testDataUtils.getLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + String url = "/pingpong/notifications"; + + UserDto userDto = UserDto.from(userRepository.getById(userId)); + NotiListResponseDto expectedResponse = new NotiListResponseDto(notiService.findNotiByUser(userDto)); + //when + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + NotiListResponseDto actureResponse= objectMapper.readValue(contentAsString, NotiListResponseDto.class); + + //then + assertThat(actureResponse).isEqualTo(expectedResponse); + } + + @Test + @DisplayName("PUT /pingpong/notifications/check") + @Transactional + public void checkNotiByUserTest() throws Exception{ + //given + String accessToken = testDataUtils.getLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + String url = "/pingpong/notifications/check"; + User user = userRepository.findById(userId).get(); + + notiRepository.save(new Noti(user, NotiType.ANNOUNCE, "announce", false)); + notiRepository.save(new Noti(user, NotiType.MATCHED, "matched", false)); + notiRepository.save(new Noti(user, NotiType.IMMINENT, "imminent", true)); + notiRepository.save(new Noti(user, NotiType.CANCELEDBYMAN, "canceledbyman", false)); + notiRepository.save(new Noti(user, NotiType.CANCELEDBYTIME, "canceledbytime", false)); + //when + String contentAsString = mockMvc.perform(put(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().is2xxSuccessful()) + .andReturn().getResponse().getContentAsString(); + + //then + List notiList = notiRepository.findByUser(user); + for (Noti noti : notiList) { + assertThat(noti.getIsChecked()).isTrue(); + } + } + + @Test + @DisplayName("DELETE /notifications") + @Transactional + public void notiRemoveAll() throws Exception { + //given + String accessToken = testDataUtils.getLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + String url = "/pingpong/notifications"; + User user = userRepository.findById(userId).get(); + + notiRepository.save(new Noti(user, NotiType.ANNOUNCE, "announce", false)); + notiRepository.save(new Noti(user, NotiType.MATCHED, "matched", false)); + notiRepository.save(new Noti(user, NotiType.IMMINENT, "imminent", true)); + notiRepository.save(new Noti(user, NotiType.CANCELEDBYMAN, "canceledbyman", false)); + notiRepository.save(new Noti(user, NotiType.CANCELEDBYTIME, "canceledbytime", false)); + + //when + String contentAsString = mockMvc.perform(delete(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().is2xxSuccessful()) + .andReturn().getResponse().getContentAsString(); + + //then + List notiList = notiRepository.findByUser(user); + assertThat(notiList.size()).isEqualTo(0); + } } \ No newline at end of file diff --git a/src/test/java/com/gg/server/domain/noti/service/NotiServiceTest.java b/src/test/java/com/gg/server/domain/noti/service/NotiServiceTest.java index dbed48d53..b7c29fdf2 100644 --- a/src/test/java/com/gg/server/domain/noti/service/NotiServiceTest.java +++ b/src/test/java/com/gg/server/domain/noti/service/NotiServiceTest.java @@ -1,73 +1,73 @@ -package com.gg.server.domain.noti.service; - -import com.gg.server.domain.noti.data.Noti; -import com.gg.server.domain.noti.data.NotiRepository; -import com.gg.server.domain.noti.type.NotiType; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.domain.user.dto.UserDto; -import com.gg.server.global.security.jwt.utils.AuthTokenProvider; -import com.gg.server.utils.TestDataUtils; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import javax.transaction.Transactional; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.List; - -@RequiredArgsConstructor -@SpringBootTest -@Slf4j -class NotiServiceTest { - - @Autowired - TestDataUtils testDataUtils; - @Autowired - AuthTokenProvider tokenProvider; - @Autowired - NotiService notiService; - @Autowired - NotiRepository notiRepository; - @Autowired - UserRepository userRepository; - - @Test - @DisplayName("NotiService 유저매칭알림 전송 테스트") - @Transactional - public void 유저매칭알림전송테스트() throws Exception { - //given - String accessToken = testDataUtils.getLoginAccessToken(); - Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); - User user = userRepository.getById(userId); - UserDto userDto = UserDto.from(user); - LocalDateTime now = LocalDateTime.now(); - String expectedMatchedNotiMessage = now.format(DateTimeFormatter.ofPattern("HH:mm")) + "에 신청한 매칭이 성사되었습니다."; - String expectedMatchCancelNotiMessage = now.format(DateTimeFormatter.ofPattern("HH:mm")) + "에 신청한 매칭이 상대에 의해 취소되었습니다."; - - //when - notiService.createMatched(user, now); - notiService.createMatchCancel(user, now); - List actureNotiList = notiRepository.findAllByUser(user); - - //then - Assertions.assertThat(actureNotiList.size()).isEqualTo(2); - for (Noti noti: actureNotiList) { - if (noti.getType() == NotiType.MATCHED) { - Assertions.assertThat(noti.getMessage()).isEqualTo(expectedMatchedNotiMessage); - log.info("Matched Message : " + noti.getMessage()); - } - else if (noti.getType() == NotiType.CANCELEDBYMAN) { - Assertions.assertThat(noti.getMessage()).isEqualTo(expectedMatchCancelNotiMessage); - log.info("MatchCancel Message : " + noti.getMessage()); - } - Assertions.assertThat(noti.getIsChecked()).isFalse(); - } - } -} +package com.gg.server.domain.noti.service; + +import com.gg.server.domain.noti.data.Noti; +import com.gg.server.domain.noti.data.NotiRepository; +import com.gg.server.domain.noti.type.NotiType; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import javax.transaction.Transactional; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; + +@RequiredArgsConstructor +@SpringBootTest +@Slf4j +class NotiServiceTest { + + @Autowired + TestDataUtils testDataUtils; + @Autowired + AuthTokenProvider tokenProvider; + @Autowired + NotiService notiService; + @Autowired + NotiRepository notiRepository; + @Autowired + UserRepository userRepository; + + @Test + @DisplayName("NotiService 유저매칭알림 전송 테스트") + @Transactional + public void 유저매칭알림전송테스트() throws Exception { + //given + String accessToken = testDataUtils.getLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + User user = userRepository.getById(userId); + UserDto userDto = UserDto.from(user); + LocalDateTime now = LocalDateTime.now(); + String expectedMatchedNotiMessage = now.format(DateTimeFormatter.ofPattern("HH:mm")) + "에 신청한 매칭이 성사되었습니다."; + String expectedMatchCancelNotiMessage = now.format(DateTimeFormatter.ofPattern("HH:mm")) + "에 신청한 매칭이 상대에 의해 취소되었습니다."; + + //when + notiService.createMatched(user, now); + notiService.createMatchCancel(user, now); + List actureNotiList = notiRepository.findAllByUser(user); + + //then + Assertions.assertThat(actureNotiList.size()).isEqualTo(2); + for (Noti noti: actureNotiList) { + if (noti.getType() == NotiType.MATCHED) { + Assertions.assertThat(noti.getMessage()).isEqualTo(expectedMatchedNotiMessage); + log.info("Matched Message : " + noti.getMessage()); + } + else if (noti.getType() == NotiType.CANCELEDBYMAN) { + Assertions.assertThat(noti.getMessage()).isEqualTo(expectedMatchCancelNotiMessage); + log.info("MatchCancel Message : " + noti.getMessage()); + } + Assertions.assertThat(noti.getIsChecked()).isFalse(); + } + } +} diff --git a/src/test/java/com/gg/server/domain/rank/controller/RankControllerTest.java b/src/test/java/com/gg/server/domain/rank/controller/RankControllerTest.java index 059b2158e..ef67079cd 100644 --- a/src/test/java/com/gg/server/domain/rank/controller/RankControllerTest.java +++ b/src/test/java/com/gg/server/domain/rank/controller/RankControllerTest.java @@ -1,167 +1,167 @@ -package com.gg.server.domain.rank.controller; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.gg.server.domain.rank.dto.ExpRankPageResponseDto; -import com.gg.server.domain.rank.dto.RankDto; -import com.gg.server.domain.rank.dto.RankPageResponseDto; -import com.gg.server.domain.rank.redis.RankRedisRepository; -import com.gg.server.domain.rank.service.RedisUploadService; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.season.data.SeasonRepository; -import com.gg.server.domain.user.data.User; -import com.gg.server.global.security.jwt.utils.AuthTokenProvider; -import com.gg.server.utils.TestDataUtils; -import org.apache.http.HttpHeaders; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.transaction.annotation.Transactional; - -import java.util.Comparator; -import java.util.List; - - -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - - -@SpringBootTest -@Transactional -@AutoConfigureMockMvc -class RankControllerTest { - - @Autowired - TestDataUtils testDataUtils; - - @Autowired - MockMvc mockMvc; - @Autowired - ObjectMapper objectMapper; - - @Autowired - AuthTokenProvider tokenProvider; - - @Autowired - SeasonRepository seasonRepository; - - @Autowired - RankRedisRepository redisRepository; - - @Autowired - RedisUploadService redisUploadService; - - @BeforeEach - public void flushRedis(){ - redisRepository.deleteAll(); - } - - @AfterEach - public void flushRedisAfter(){ - redisRepository.deleteAll(); - redisUploadService.uploadRedis(); - } - - @Test - @DisplayName("/exp") - void getExpRankPage() throws Exception { - - // given - Season season = testDataUtils.createSeason(); - int myTotalExp = 1000; - User myUser = testDataUtils.createNewUser(myTotalExp); - testDataUtils.createUserRank(myUser, "1", season); - - int otherTotalExp = 2000; - User user1 = testDataUtils.createNewUser(otherTotalExp); - testDataUtils.createUserRank(user1, "2", season); - int otherTotalExp2 = 3000; - User user2 = testDataUtils.createNewUser(otherTotalExp2); - testDataUtils.createUserRank(user2, "3", season); - int otherTotalExp3 = 4000; - User user3 = testDataUtils.createNewUser(otherTotalExp3); - testDataUtils.createUserRank(user3, "4", season); - - int page = 1; - int size = 3; - String url = "/pingpong/exp?page=" + page + "&size=" + size; - String accessToken = tokenProvider.createToken(myUser.getId()); - - //when - String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - - ExpRankPageResponseDto response = objectMapper.readValue(contentAsString, ExpRankPageResponseDto.class); - - //then - Assertions.assertThat(response.getMyRank()).isEqualTo(4); - Assertions.assertThat(response.getCurrentPage()).isEqualTo(page); - Assertions.assertThat(response.getTotalPage()).isEqualTo(2); - Assertions.assertThat(response.getRankList().size()).isEqualTo(3); - } - - @Test - @DisplayName("/pingpong/ranks/{gameType}") - public void getRankPage () throws Exception - { - //given - Season season = testDataUtils.createSeason(); - User myUser = testDataUtils.createNewUser(); - testDataUtils.createUserRank(myUser, "1", season, 1000); - - User user2 = testDataUtils.createNewUser(); - testDataUtils.createUserRank(user2, "2", season, 1500); - - User user3 = testDataUtils.createNewUser(); - testDataUtils.createUserRank(user3, "3", season, 2000); - - User user4 = testDataUtils.createNewUser(); - testDataUtils.createUserRank(user4, "4", season, 2500); - - User user5 = testDataUtils.createNewUser(); - testDataUtils.createUserRank(user5, "5", season, 3000); - - User user6 = testDataUtils.createNewUser(); - testDataUtils.createUserRank(user6, "6", season, 3500); - - User user7 = testDataUtils.createNewUser(); - testDataUtils.createUserRank(user7, "7", season, 4000); - - User user8 = testDataUtils.createNewUser(); - testDataUtils.createUserRank(user8, "8", season, 4500); - - User user9 = testDataUtils.createNewUser(); - testDataUtils.createUserRank(user9, "9", season, 5000); - - User user10 = testDataUtils.createNewUser(); - testDataUtils.createUserRank(user10, "10", season, 5500); - - String accessToken = tokenProvider.createToken(myUser.getId()); - - int page = 4; - int size = 3; - String url = "/pingpong/ranks/single?page=" + page + "&size=" + size; - - //when - String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - RankPageResponseDto resp = objectMapper.readValue(contentAsString, RankPageResponseDto.class); - - //then - List rankList = resp.getRankList(); - Assertions.assertThat(resp.getCurrentPage()).isEqualTo(4); - Assertions.assertThat(resp.getTotalPage()).isEqualTo(4); - Assertions.assertThat(resp.getMyRank()).isEqualTo(10); - Assertions.assertThat(rankList.size()).isEqualTo(1); - Assertions.assertThat(rankList).isSortedAccordingTo(Comparator.comparing(RankDto::getPpp).reversed()); - } - - +package com.gg.server.domain.rank.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.domain.rank.dto.ExpRankPageResponseDto; +import com.gg.server.domain.rank.dto.RankDto; +import com.gg.server.domain.rank.dto.RankPageResponseDto; +import com.gg.server.domain.rank.redis.RankRedisRepository; +import com.gg.server.domain.rank.service.RedisUploadService; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.season.data.SeasonRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import org.apache.http.HttpHeaders; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Comparator; +import java.util.List; + + +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + + +@SpringBootTest +@Transactional +@AutoConfigureMockMvc +class RankControllerTest { + + @Autowired + TestDataUtils testDataUtils; + + @Autowired + MockMvc mockMvc; + @Autowired + ObjectMapper objectMapper; + + @Autowired + AuthTokenProvider tokenProvider; + + @Autowired + SeasonRepository seasonRepository; + + @Autowired + RankRedisRepository redisRepository; + + @Autowired + RedisUploadService redisUploadService; + + @BeforeEach + public void flushRedis(){ + redisRepository.deleteAll(); + } + + @AfterEach + public void flushRedisAfter(){ + redisRepository.deleteAll(); + redisUploadService.uploadRedis(); + } + + @Test + @DisplayName("/exp") + void getExpRankPage() throws Exception { + + // given + Season season = testDataUtils.createSeason(); + int myTotalExp = 1000; + User myUser = testDataUtils.createNewUser(myTotalExp); + testDataUtils.createUserRank(myUser, "1", season); + + int otherTotalExp = 2000; + User user1 = testDataUtils.createNewUser(otherTotalExp); + testDataUtils.createUserRank(user1, "2", season); + int otherTotalExp2 = 3000; + User user2 = testDataUtils.createNewUser(otherTotalExp2); + testDataUtils.createUserRank(user2, "3", season); + int otherTotalExp3 = 4000; + User user3 = testDataUtils.createNewUser(otherTotalExp3); + testDataUtils.createUserRank(user3, "4", season); + + int page = 1; + int size = 3; + String url = "/pingpong/exp?page=" + page + "&size=" + size; + String accessToken = tokenProvider.createToken(myUser.getId()); + + //when + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + + ExpRankPageResponseDto response = objectMapper.readValue(contentAsString, ExpRankPageResponseDto.class); + + //then + Assertions.assertThat(response.getMyRank()).isEqualTo(4); + Assertions.assertThat(response.getCurrentPage()).isEqualTo(page); + Assertions.assertThat(response.getTotalPage()).isEqualTo(2); + Assertions.assertThat(response.getRankList().size()).isEqualTo(3); + } + + @Test + @DisplayName("/pingpong/ranks/{gameType}") + public void getRankPage () throws Exception + { + //given + Season season = testDataUtils.createSeason(); + User myUser = testDataUtils.createNewUser(); + testDataUtils.createUserRank(myUser, "1", season, 1000); + + User user2 = testDataUtils.createNewUser(); + testDataUtils.createUserRank(user2, "2", season, 1500); + + User user3 = testDataUtils.createNewUser(); + testDataUtils.createUserRank(user3, "3", season, 2000); + + User user4 = testDataUtils.createNewUser(); + testDataUtils.createUserRank(user4, "4", season, 2500); + + User user5 = testDataUtils.createNewUser(); + testDataUtils.createUserRank(user5, "5", season, 3000); + + User user6 = testDataUtils.createNewUser(); + testDataUtils.createUserRank(user6, "6", season, 3500); + + User user7 = testDataUtils.createNewUser(); + testDataUtils.createUserRank(user7, "7", season, 4000); + + User user8 = testDataUtils.createNewUser(); + testDataUtils.createUserRank(user8, "8", season, 4500); + + User user9 = testDataUtils.createNewUser(); + testDataUtils.createUserRank(user9, "9", season, 5000); + + User user10 = testDataUtils.createNewUser(); + testDataUtils.createUserRank(user10, "10", season, 5500); + + String accessToken = tokenProvider.createToken(myUser.getId()); + + int page = 4; + int size = 3; + String url = "/pingpong/ranks/single?page=" + page + "&size=" + size; + + //when + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + RankPageResponseDto resp = objectMapper.readValue(contentAsString, RankPageResponseDto.class); + + //then + List rankList = resp.getRankList(); + Assertions.assertThat(resp.getCurrentPage()).isEqualTo(4); + Assertions.assertThat(resp.getTotalPage()).isEqualTo(4); + Assertions.assertThat(resp.getMyRank()).isEqualTo(10); + Assertions.assertThat(rankList.size()).isEqualTo(1); + Assertions.assertThat(rankList).isSortedAccordingTo(Comparator.comparing(RankDto::getPpp).reversed()); + } + + } \ No newline at end of file diff --git a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java index 3f429d47d..e2b4426f6 100644 --- a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java +++ b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java @@ -1,318 +1,318 @@ -package com.gg.server.domain.user.controller; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.gg.server.domain.game.data.Game; -import com.gg.server.domain.game.data.GameRepository; -import com.gg.server.domain.game.dto.req.RankResultReqDto; -import com.gg.server.domain.game.service.GameService; -import com.gg.server.domain.game.type.Mode; -import com.gg.server.domain.game.type.StatusType; -import com.gg.server.domain.rank.data.RankRepository; -import com.gg.server.domain.rank.redis.RankRedis; -import com.gg.server.domain.rank.redis.RankRedisRepository; -import com.gg.server.domain.rank.redis.RedisKeyManager; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.season.data.SeasonRepository; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.domain.user.controller.dto.GameInfoDto; -import com.gg.server.domain.user.dto.*; -import com.gg.server.domain.user.type.RacketType; -import com.gg.server.domain.user.type.RoleType; -import com.gg.server.domain.user.type.SnsType; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.AfterEach; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import com.gg.server.global.security.jwt.utils.AuthTokenProvider; -import com.gg.server.utils.TestDataUtils; -import org.apache.http.HttpHeaders; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.Comparator; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@SpringBootTest -@AutoConfigureMockMvc -@Transactional -class UserControllerTest { - - @Autowired - TestDataUtils testDataUtils; - - @Autowired - private MockMvc mockMvc; - - @Autowired - ObjectMapper objectMapper; - - @Autowired - AuthTokenProvider tokenProvider; - - @Autowired - UserRepository userRepository; - - @Autowired - RankRedisRepository redisRepository; - - @Autowired - RankRepository rankRepository; - - @Autowired - SeasonRepository seasonRepository; - - @Autowired - GameRepository gameRepository; - - @Autowired - GameService gameService; - - @AfterEach - public void flushRedis() { - redisRepository.deleteAll(); - } - - @Test - @DisplayName("live") - public void userLiveTest() throws Exception { - String accessToken = testDataUtils.getLoginAccessToken(); - Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); - String liveUrl = "/pingpong/users/live"; - String event = "game"; - int notiCnt = 2; - Mode currentMatchMode = Mode.RANK; - GameInfoDto gameInfo = testDataUtils.addMockDataUserLiveApi(event, notiCnt, currentMatchMode.getCode(), userId); - Game testGame = gameRepository.getById(gameInfo.getGameId()); - - // Rank Live 게임 테스트 - String contentAsString1 = mockMvc.perform(get(liveUrl).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - UserLiveResponseDto userLiveResponseDto1 = objectMapper.readValue(contentAsString1, UserLiveResponseDto.class); - assertThat(userLiveResponseDto1.getEvent()).isEqualTo(event); - assertThat(userLiveResponseDto1.getNotiCount()).isEqualTo(notiCnt); - assertThat(userLiveResponseDto1.getCurrentMatchMode()).isEqualTo(currentMatchMode); - assertThat(userLiveResponseDto1.getGameId()).isEqualTo(gameInfo.getGameId()); - - // Rank 점수 입력 테스트 - RankResultReqDto rankResultReqDto = new RankResultReqDto(gameInfo.getGameId(), - gameInfo.getEnemyTeamId(), 1, - gameInfo.getMyTeamId(), 2); - assertThat(testGame.getStatus()).isEqualTo(StatusType.LIVE); - gameService.createRankResult(rankResultReqDto, gameInfo.getEnemyUserId()); - assertThat(testGame.getStatus()).isEqualTo(StatusType.END); - - String contentAsString2 = mockMvc.perform(get(liveUrl).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - UserLiveResponseDto userLiveResponseDto2 = objectMapper.readValue(contentAsString2, UserLiveResponseDto.class); - assertThat(userLiveResponseDto2.getEvent()).isEqualTo(event); - assertThat(userLiveResponseDto2.getNotiCount()).isEqualTo(notiCnt); - assertThat(userLiveResponseDto2.getCurrentMatchMode()).isEqualTo(currentMatchMode); - assertThat(userLiveResponseDto2.getGameId()).isEqualTo(gameInfo.getGameId()); - - // Rank PChange is_checked 테스트 - String contentAsString3 = mockMvc.perform(get(liveUrl).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - UserLiveResponseDto userLiveResponseDto3 = objectMapper.readValue(contentAsString3, UserLiveResponseDto.class); - assertThat(userLiveResponseDto3.getEvent()).isEqualTo(null); - assertThat(userLiveResponseDto3.getNotiCount()).isEqualTo(notiCnt); - assertThat(userLiveResponseDto3.getCurrentMatchMode()).isEqualTo(null); - assertThat(userLiveResponseDto3.getGameId()).isEqualTo(null); - } - - @Test - @DisplayName("/") - public void userNormalDetail () throws Exception { - //given - String url = "/pingpong/users"; - String intraId = "intra"; - String email = "email"; - String imageUrl = "imageUrl"; - User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, - SnsType.BOTH, RoleType.ADMIN); - String accessToken = tokenProvider.createToken(newUser.getId()); - - //when - String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - UserNormalDetailResponseDto responseDto = objectMapper.readValue(contentAsString, UserNormalDetailResponseDto.class); - - //then - assertThat(responseDto.getIntraId()).isEqualTo(intraId); - assertThat(responseDto.getUserImageUri()).isEqualTo(imageUrl); - assertThat(responseDto.getIsAdmin()).isTrue(); - } - - @Test - @DisplayName("searches?intraId=${IntraId}") - public void searchUser() throws Exception - { - //given - String intraId[] = {"intraId", "2intra2", "2intra", "aaaa", "bbbb"}; - String email = "email"; - String imageUrl = "imageUrl"; - User user = null; - for (String intra : intraId) { - user = testDataUtils.createNewUser(intra, email, imageUrl, RacketType.PENHOLDER, - SnsType.BOTH, RoleType.ADMIN); - } - String accessToken = tokenProvider.createToken(user.getId()); - String keyWord = "intra"; - String url = "/pingpong/users/searches?intraId=" + keyWord; - - //when - String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - UserSearchResponseDto userSearchResponseDto = objectMapper.readValue(contentAsString, UserSearchResponseDto.class); - - //then - assertThat(userSearchResponseDto.getUsers().size()).isEqualTo(3); - } - - @Test - @DisplayName("[GET] {targetId}") - public void getUserDetail () throws Exception - { - //given - Season season = testDataUtils.createSeason(); - String intraId = "intraId"; - String email = "email"; - String imageUrl = "imageUrl"; - String statusMessage = "statusMessage"; - User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, - SnsType.BOTH, RoleType.ADMIN); - String accessToken = tokenProvider.createToken(newUser.getId()); - testDataUtils.createUserRank(newUser, statusMessage, season); - String url = "/pingpong/users/" + newUser.getIntraId(); - - //when - String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); - UserDetailResponseDto responseDto = objectMapper.readValue(contentAsString, UserDetailResponseDto.class); - - //then - Assertions.assertThat(responseDto.getIntraId()).isEqualTo(intraId); - Assertions.assertThat(responseDto.getUserImageUri()).isEqualTo(imageUrl); - Assertions.assertThat(responseDto.getStatusMessage()).isEqualTo(statusMessage); - Assertions.assertThat(responseDto.getLevel()).isEqualTo(1); - Assertions.assertThat(responseDto.getCurrentExp()).isEqualTo(0); - System.out.println(responseDto); - } - - @Test - @DisplayName("/{intraId}/rank?season={seasonId}") - public void userRankDetail () throws Exception - { - //given - Season season = testDataUtils.createSeason(); - User newUser = testDataUtils.createNewUser(); - String accessToken = tokenProvider.createToken(newUser.getId()); - testDataUtils.createUserRank(newUser, "statusMessage", season); - - //when - String url = "/pingpong/users/" + newUser.getIntraId() + "/rank?season=" + season.getId(); - String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); - UserRankResponseDto responseDto = objectMapper.readValue(contentAsString, UserRankResponseDto.class); - - //then - Assertions.assertThat(responseDto.getRank()).isEqualTo(-1); - Assertions.assertThat(responseDto.getWins()).isEqualTo(0); - Assertions.assertThat(responseDto.getLosses()).isEqualTo(0); - Assertions.assertThat(responseDto.getPpp()).isEqualTo(season.getStartPpp()); - System.out.println(responseDto); - } - - @Test - @DisplayName("/{intraId}/historics?season={seasonId}") - public void getUserHistory () throws Exception - { - //given - Season season = testDataUtils.createSeason(); - User newUser = testDataUtils.createNewUser(); - String accessToken = tokenProvider.createToken(newUser.getId()); - - LocalDateTime startTime = LocalDateTime.now().minusDays(1); - LocalDateTime endTime = startTime.plusMinutes(15); - testDataUtils.createMockMatch(newUser, season, startTime, endTime); - - LocalDateTime startTime1 = LocalDateTime.now().minusDays(2); - LocalDateTime endTime1 = startTime1.plusMinutes(15); - testDataUtils.createMockMatch(newUser, season, startTime1, endTime1); - - LocalDateTime startTime2 = LocalDateTime.now().minusDays(3); - LocalDateTime endTime2 = startTime2.plusMinutes(15); - testDataUtils.createMockMatch(newUser, season, startTime2, endTime2); - - String url = "/pingpong/users/" + newUser.getIntraId() + "/historics?season=" + season.getId(); - - //when - String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); - UserHistoryResponseDto responseDto = objectMapper.readValue(contentAsString, UserHistoryResponseDto.class); - - - //then - List historics = responseDto.getHistorics(); - Assertions.assertThat(responseDto.getHistorics().size()).isEqualTo(3); - Assertions.assertThat(historics) - .isSortedAccordingTo(Comparator.comparing(UserHistoryData::getDate)); - - } - - @Test - @DisplayName("[put] {intraId}") - public void updateUser() throws Exception - { - //given - Season season = testDataUtils.createSeason(); - String intraId = "intraId"; - String email = "email"; - String imageUrl = "imageUrl"; - User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, - SnsType.BOTH, RoleType.ADMIN); - String statusMessage = "statusMessage"; - testDataUtils.createUserRank(newUser, statusMessage, season); - String accessToken = tokenProvider.createToken(newUser.getId()); - String url = "/pingpong/users/" + newUser.getIntraId(); - - String newStatusMessage = "newStatusMessage"; - RacketType newRacketType = RacketType.SHAKEHAND; - SnsType newSnsType = SnsType.SLACK; - - //when - mockMvc.perform(put(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new UserModifyRequestDto(newRacketType, newStatusMessage, newSnsType)))) - .andExpect(status().isOk()); - //then - String hashKey = RedisKeyManager.getHashKey(season.getId()); - RankRedis rank = redisRepository.findRankByUserId(hashKey, newUser.getId()); - rankRepository.findByUserIdAndSeasonId(newUser.getId(), season.getId()).ifPresentOrElse(rank1 -> { - Assertions.assertThat(rank1.getStatusMessage()).isEqualTo(newStatusMessage); - }, () -> { - Assertions.fail("랭크 업데이트 실패"); - }); - userRepository.findById(newUser.getId()).ifPresentOrElse(user -> { - Assertions.assertThat(user.getRacketType()).isEqualTo((newRacketType)); - Assertions.assertThat(user.getSnsNotiOpt()).isEqualTo(newSnsType); - Assertions.assertThat(rank.getStatusMessage()).isEqualTo(newStatusMessage); - }, () -> { - Assertions.fail("유저 업데이트 실패"); - }); - } +package com.gg.server.domain.user.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.domain.game.data.Game; +import com.gg.server.domain.game.data.GameRepository; +import com.gg.server.domain.game.dto.req.RankResultReqDto; +import com.gg.server.domain.game.service.GameService; +import com.gg.server.domain.game.type.Mode; +import com.gg.server.domain.game.type.StatusType; +import com.gg.server.domain.rank.data.RankRepository; +import com.gg.server.domain.rank.redis.RankRedis; +import com.gg.server.domain.rank.redis.RankRedisRepository; +import com.gg.server.domain.rank.redis.RedisKeyManager; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.season.data.SeasonRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.controller.dto.GameInfoDto; +import com.gg.server.domain.user.dto.*; +import com.gg.server.domain.user.type.RacketType; +import com.gg.server.domain.user.type.RoleType; +import com.gg.server.domain.user.type.SnsType; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.AfterEach; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import org.apache.http.HttpHeaders; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.Comparator; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +class UserControllerTest { + + @Autowired + TestDataUtils testDataUtils; + + @Autowired + private MockMvc mockMvc; + + @Autowired + ObjectMapper objectMapper; + + @Autowired + AuthTokenProvider tokenProvider; + + @Autowired + UserRepository userRepository; + + @Autowired + RankRedisRepository redisRepository; + + @Autowired + RankRepository rankRepository; + + @Autowired + SeasonRepository seasonRepository; + + @Autowired + GameRepository gameRepository; + + @Autowired + GameService gameService; + + @AfterEach + public void flushRedis() { + redisRepository.deleteAll(); + } + + @Test + @DisplayName("live") + public void userLiveTest() throws Exception { + String accessToken = testDataUtils.getLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + String liveUrl = "/pingpong/users/live"; + String event = "game"; + int notiCnt = 2; + Mode currentMatchMode = Mode.RANK; + GameInfoDto gameInfo = testDataUtils.addMockDataUserLiveApi(event, notiCnt, currentMatchMode.getCode(), userId); + Game testGame = gameRepository.getById(gameInfo.getGameId()); + + // Rank Live 게임 테스트 + String contentAsString1 = mockMvc.perform(get(liveUrl).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + UserLiveResponseDto userLiveResponseDto1 = objectMapper.readValue(contentAsString1, UserLiveResponseDto.class); + assertThat(userLiveResponseDto1.getEvent()).isEqualTo(event); + assertThat(userLiveResponseDto1.getNotiCount()).isEqualTo(notiCnt); + assertThat(userLiveResponseDto1.getCurrentMatchMode()).isEqualTo(currentMatchMode); + assertThat(userLiveResponseDto1.getGameId()).isEqualTo(gameInfo.getGameId()); + + // Rank 점수 입력 테스트 + RankResultReqDto rankResultReqDto = new RankResultReqDto(gameInfo.getGameId(), + gameInfo.getEnemyTeamId(), 1, + gameInfo.getMyTeamId(), 2); + assertThat(testGame.getStatus()).isEqualTo(StatusType.LIVE); + gameService.createRankResult(rankResultReqDto, gameInfo.getEnemyUserId()); + assertThat(testGame.getStatus()).isEqualTo(StatusType.END); + + String contentAsString2 = mockMvc.perform(get(liveUrl).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + UserLiveResponseDto userLiveResponseDto2 = objectMapper.readValue(contentAsString2, UserLiveResponseDto.class); + assertThat(userLiveResponseDto2.getEvent()).isEqualTo(event); + assertThat(userLiveResponseDto2.getNotiCount()).isEqualTo(notiCnt); + assertThat(userLiveResponseDto2.getCurrentMatchMode()).isEqualTo(currentMatchMode); + assertThat(userLiveResponseDto2.getGameId()).isEqualTo(gameInfo.getGameId()); + + // Rank PChange is_checked 테스트 + String contentAsString3 = mockMvc.perform(get(liveUrl).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + UserLiveResponseDto userLiveResponseDto3 = objectMapper.readValue(contentAsString3, UserLiveResponseDto.class); + assertThat(userLiveResponseDto3.getEvent()).isEqualTo(null); + assertThat(userLiveResponseDto3.getNotiCount()).isEqualTo(notiCnt); + assertThat(userLiveResponseDto3.getCurrentMatchMode()).isEqualTo(null); + assertThat(userLiveResponseDto3.getGameId()).isEqualTo(null); + } + + @Test + @DisplayName("/") + public void userNormalDetail () throws Exception { + //given + String url = "/pingpong/users"; + String intraId = "intra"; + String email = "email"; + String imageUrl = "imageUrl"; + User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, + SnsType.BOTH, RoleType.ADMIN); + String accessToken = tokenProvider.createToken(newUser.getId()); + + //when + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + UserNormalDetailResponseDto responseDto = objectMapper.readValue(contentAsString, UserNormalDetailResponseDto.class); + + //then + assertThat(responseDto.getIntraId()).isEqualTo(intraId); + assertThat(responseDto.getUserImageUri()).isEqualTo(imageUrl); + assertThat(responseDto.getIsAdmin()).isTrue(); + } + + @Test + @DisplayName("searches?intraId=${IntraId}") + public void searchUser() throws Exception + { + //given + String intraId[] = {"intraId", "2intra2", "2intra", "aaaa", "bbbb"}; + String email = "email"; + String imageUrl = "imageUrl"; + User user = null; + for (String intra : intraId) { + user = testDataUtils.createNewUser(intra, email, imageUrl, RacketType.PENHOLDER, + SnsType.BOTH, RoleType.ADMIN); + } + String accessToken = tokenProvider.createToken(user.getId()); + String keyWord = "intra"; + String url = "/pingpong/users/searches?intraId=" + keyWord; + + //when + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + UserSearchResponseDto userSearchResponseDto = objectMapper.readValue(contentAsString, UserSearchResponseDto.class); + + //then + assertThat(userSearchResponseDto.getUsers().size()).isEqualTo(3); + } + + @Test + @DisplayName("[GET] {targetId}") + public void getUserDetail () throws Exception + { + //given + Season season = testDataUtils.createSeason(); + String intraId = "intraId"; + String email = "email"; + String imageUrl = "imageUrl"; + String statusMessage = "statusMessage"; + User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, + SnsType.BOTH, RoleType.ADMIN); + String accessToken = tokenProvider.createToken(newUser.getId()); + testDataUtils.createUserRank(newUser, statusMessage, season); + String url = "/pingpong/users/" + newUser.getIntraId(); + + //when + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); + UserDetailResponseDto responseDto = objectMapper.readValue(contentAsString, UserDetailResponseDto.class); + + //then + Assertions.assertThat(responseDto.getIntraId()).isEqualTo(intraId); + Assertions.assertThat(responseDto.getUserImageUri()).isEqualTo(imageUrl); + Assertions.assertThat(responseDto.getStatusMessage()).isEqualTo(statusMessage); + Assertions.assertThat(responseDto.getLevel()).isEqualTo(1); + Assertions.assertThat(responseDto.getCurrentExp()).isEqualTo(0); + System.out.println(responseDto); + } + + @Test + @DisplayName("/{intraId}/rank?season={seasonId}") + public void userRankDetail () throws Exception + { + //given + Season season = testDataUtils.createSeason(); + User newUser = testDataUtils.createNewUser(); + String accessToken = tokenProvider.createToken(newUser.getId()); + testDataUtils.createUserRank(newUser, "statusMessage", season); + + //when + String url = "/pingpong/users/" + newUser.getIntraId() + "/rank?season=" + season.getId(); + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); + UserRankResponseDto responseDto = objectMapper.readValue(contentAsString, UserRankResponseDto.class); + + //then + Assertions.assertThat(responseDto.getRank()).isEqualTo(-1); + Assertions.assertThat(responseDto.getWins()).isEqualTo(0); + Assertions.assertThat(responseDto.getLosses()).isEqualTo(0); + Assertions.assertThat(responseDto.getPpp()).isEqualTo(season.getStartPpp()); + System.out.println(responseDto); + } + + @Test + @DisplayName("/{intraId}/historics?season={seasonId}") + public void getUserHistory () throws Exception + { + //given + Season season = testDataUtils.createSeason(); + User newUser = testDataUtils.createNewUser(); + String accessToken = tokenProvider.createToken(newUser.getId()); + + LocalDateTime startTime = LocalDateTime.now().minusDays(1); + LocalDateTime endTime = startTime.plusMinutes(15); + testDataUtils.createMockMatch(newUser, season, startTime, endTime); + + LocalDateTime startTime1 = LocalDateTime.now().minusDays(2); + LocalDateTime endTime1 = startTime1.plusMinutes(15); + testDataUtils.createMockMatch(newUser, season, startTime1, endTime1); + + LocalDateTime startTime2 = LocalDateTime.now().minusDays(3); + LocalDateTime endTime2 = startTime2.plusMinutes(15); + testDataUtils.createMockMatch(newUser, season, startTime2, endTime2); + + String url = "/pingpong/users/" + newUser.getIntraId() + "/historics?season=" + season.getId(); + + //when + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); + UserHistoryResponseDto responseDto = objectMapper.readValue(contentAsString, UserHistoryResponseDto.class); + + + //then + List historics = responseDto.getHistorics(); + Assertions.assertThat(responseDto.getHistorics().size()).isEqualTo(3); + Assertions.assertThat(historics) + .isSortedAccordingTo(Comparator.comparing(UserHistoryData::getDate)); + + } + + @Test + @DisplayName("[put] {intraId}") + public void updateUser() throws Exception + { + //given + Season season = testDataUtils.createSeason(); + String intraId = "intraId"; + String email = "email"; + String imageUrl = "imageUrl"; + User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, + SnsType.BOTH, RoleType.ADMIN); + String statusMessage = "statusMessage"; + testDataUtils.createUserRank(newUser, statusMessage, season); + String accessToken = tokenProvider.createToken(newUser.getId()); + String url = "/pingpong/users/" + newUser.getIntraId(); + + String newStatusMessage = "newStatusMessage"; + RacketType newRacketType = RacketType.SHAKEHAND; + SnsType newSnsType = SnsType.SLACK; + + //when + mockMvc.perform(put(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(new UserModifyRequestDto(newRacketType, newStatusMessage, newSnsType)))) + .andExpect(status().isOk()); + //then + String hashKey = RedisKeyManager.getHashKey(season.getId()); + RankRedis rank = redisRepository.findRankByUserId(hashKey, newUser.getId()); + rankRepository.findByUserIdAndSeasonId(newUser.getId(), season.getId()).ifPresentOrElse(rank1 -> { + Assertions.assertThat(rank1.getStatusMessage()).isEqualTo(newStatusMessage); + }, () -> { + Assertions.fail("랭크 업데이트 실패"); + }); + userRepository.findById(newUser.getId()).ifPresentOrElse(user -> { + Assertions.assertThat(user.getRacketType()).isEqualTo((newRacketType)); + Assertions.assertThat(user.getSnsNotiOpt()).isEqualTo(newSnsType); + Assertions.assertThat(rank.getStatusMessage()).isEqualTo(newStatusMessage); + }, () -> { + Assertions.fail("유저 업데이트 실패"); + }); + } } \ No newline at end of file diff --git a/src/test/java/com/gg/server/game/GameControllerTest.java b/src/test/java/com/gg/server/game/GameControllerTest.java index 688813ead..54309ab77 100644 --- a/src/test/java/com/gg/server/game/GameControllerTest.java +++ b/src/test/java/com/gg/server/game/GameControllerTest.java @@ -1,370 +1,370 @@ -package com.gg.server.game; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.gg.server.domain.game.service.GameFindService; -import com.gg.server.domain.game.service.GameService; -import com.gg.server.domain.game.data.Game; -import com.gg.server.domain.game.data.GameRepository; -import com.gg.server.domain.game.dto.GameListResDto; -import com.gg.server.domain.game.dto.GameTeamInfo; -import com.gg.server.domain.game.dto.req.RankResultReqDto; -import com.gg.server.domain.game.type.Mode; -import com.gg.server.domain.game.type.StatusType; -import com.gg.server.domain.pchange.data.PChange; -import com.gg.server.domain.pchange.data.PChangeRepository; -import com.gg.server.domain.rank.data.Rank; -import com.gg.server.domain.rank.data.RankRepository; -import com.gg.server.domain.rank.redis.RankRedis; -import com.gg.server.domain.rank.redis.RankRedisRepository; -import com.gg.server.domain.rank.redis.RankRedisService; -import com.gg.server.domain.rank.redis.RedisKeyManager; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.season.data.SeasonRepository; -import com.gg.server.domain.team.data.Team; -import com.gg.server.domain.team.data.TeamRepository; -import com.gg.server.domain.team.data.TeamUser; -import com.gg.server.domain.team.data.TeamUserRepository; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.dto.UserDto; -import com.gg.server.domain.user.type.RacketType; -import com.gg.server.domain.user.type.RoleType; -import com.gg.server.domain.user.type.SnsType; -import com.gg.server.global.security.jwt.utils.AuthTokenProvider; -import com.gg.server.utils.TestDataUtils; -import lombok.RequiredArgsConstructor; -import org.apache.http.HttpHeaders; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@SpringBootTest -@AutoConfigureMockMvc -@RequiredArgsConstructor -public class GameControllerTest { - @Autowired - GameRepository gameRepository; - @Autowired - SeasonRepository seasonRepository; - @Autowired - TeamRepository teamRepository; - @Autowired - TeamUserRepository teamUserRepository; - @Autowired - RankRedisRepository rankRedisRepository; - @Autowired - PChangeRepository pChangeRepository; - @Autowired - RankRedisService rankRedisService; - @Autowired - RankRepository rankRepository; - @Autowired - TestDataUtils testDataUtils; - @Autowired - GameService gameService; - @Autowired - GameFindService gameFindService; - @Autowired - private MockMvc mockMvc; - @Autowired - ObjectMapper objectMapper; - @Autowired - AuthTokenProvider tokenProvider; - private String accessToken; - private Season season; - private User user1; - private User user2; - private Game game1; - private Game game2; - - @BeforeEach - void init() { - season = seasonRepository.save(new Season("test season", LocalDateTime.of(2023, 5, 14, 0, 0), LocalDateTime.of(2999, 12, 31, 23, 59), - 1000, 100)); - user1 = testDataUtils.createNewUser("test1", "test1@email", "null1", RacketType.NONE, SnsType.EMAIL, RoleType.USER); - accessToken = tokenProvider.createToken(user1.getId()); - user2 = testDataUtils.createNewUser("test2", "test2@email", "null1", RacketType.NONE, SnsType.EMAIL, RoleType.USER); - rankRepository.save(Rank.from(user1, season, season.getStartPpp())); - rankRepository.save(Rank.from(user2, season, season.getStartPpp())); - RankRedis userRank = RankRedis.from(UserDto.from(user1), season.getStartPpp()); - String redisHashKey = RedisKeyManager.getHashKey(season.getId()); - rankRedisRepository.addRankData(redisHashKey, user1.getId(), userRank); - userRank = RankRedis.from(UserDto.from(user2), season.getStartPpp()); - rankRedisRepository.addRankData(redisHashKey, user2.getId(), userRank); - for (int i = 0; i < 10; i++) { - Game game = gameRepository.save(new Game(season, StatusType.WAIT, Mode.RANK, LocalDateTime.now().minusMinutes(15), LocalDateTime.now())); - Team team1 = teamRepository.save(new Team(game, 1, false)); - Team team2 = teamRepository.save(new Team(game, 2, true)); - List teams = new ArrayList<>(); - teams.add(teamUserRepository.save(new TeamUser(team1, user1))); - teams.add(teamUserRepository.save(new TeamUser(team2, user2))); - gameService.expUpdates(game, teams); - rankRedisService.updateRankRedis(teams.get(0), teams.get(1), game); - game = gameRepository.save(new Game(season, StatusType.WAIT, Mode.NORMAL, LocalDateTime.now().minusMinutes(15), LocalDateTime.now())); - team1 = teamRepository.save(new Team(game, 0, false)); - team2 = teamRepository.save(new Team(game, 0, false)); - teamUserRepository.save(new TeamUser(team1, user1)); - teamUserRepository.save(new TeamUser(team2, user2)); - teams.clear(); - teams.add(teamUserRepository.save(new TeamUser(team1, user1))); - teams.add(teamUserRepository.save(new TeamUser(team2, user2))); - game.updateStatus(); - gameService.expUpdates(game, teams); - pChangeRepository.save(new PChange(game, user1, 0, true)); - pChangeRepository.save(new PChange(game, user2, 0, true)); - } - game1 = gameRepository.save(new Game(season, StatusType.WAIT, Mode.RANK, LocalDateTime.now().minusMinutes(15), LocalDateTime.now())); - Team team1 = teamRepository.save(new Team(game1, 1, false)); - Team team2 = teamRepository.save(new Team(game1, 2, true)); - teamUserRepository.save(new TeamUser(team1, user1)); - teamUserRepository.save(new TeamUser(team2, user2)); - game2 = gameRepository.save(new Game(season, StatusType.WAIT, Mode.RANK, LocalDateTime.now().minusMinutes(15), LocalDateTime.now())); - team1 = teamRepository.save(new Team(game1, 1, false)); - team2 = teamRepository.save(new Team(game1, 2, true)); - List teams = new ArrayList<>(); - teams.add(teamUserRepository.save(new TeamUser(team1, user1))); - teams.add(teamUserRepository.save(new TeamUser(team2, user2))); - gameService.expUpdates(game2, teams); - rankRedisService.updateRankRedis(teams.get(0), teams.get(1), game2); - } - - @AfterEach - public void flushRedis() { - rankRedisRepository.deleteAll(); - } - - @Test - @Transactional - void 유저게임정보조회테스트() throws Exception { - //given - String url = "/pingpong/games/" + game1.getId().toString(); - GameTeamInfo expect = gameService.getUserGameInfo(game1.getId(), user1.getId()); - // when - String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - GameTeamInfo result = objectMapper.readValue(contentAsString, GameTeamInfo.class); - System.out.println("expect: " + expect); - System.out.println("result: " + result); - assertThat(result.getGameId()).isEqualTo(expect.getGameId()); - assertThat(result.getStartTime()).isEqualTo(expect.getStartTime()); - assertThat(result.getMatchTeamsInfo().getMyTeam().getTeamId()).isEqualTo(expect.getMatchTeamsInfo().getMyTeam().getTeamId()); - assertThat(result.getMatchTeamsInfo().getEnemyTeam().getTeamId()).isEqualTo(expect.getMatchTeamsInfo().getEnemyTeam().getTeamId()); - } - - @Test - @Transactional - public void 일반게임목록조회() throws Exception { - //given - String url = "/pingpong/games/normal?page=1&size=10"; - Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "startTime")); - GameListResDto expect = gameFindService.getNormalGameList(pageable); - //when - String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - System.out.println(contentAsString); - GameListResDto result = objectMapper.readValue(contentAsString, GameListResDto.class); - //then - System.out.println(result.getGames().size() +", " + result.getIsLast()); - System.out.println(expect.getGames()); - assertThat(result.getGames().size()).isEqualTo(expect.getGames().size()); - assertThat(result.getGames().get(0).getGameId().equals(expect.getGames().get(0).getGameId())); - assertThat(result.getIsLast()).isEqualTo(expect.getIsLast()); - } - - @Test - @Transactional - public void user일반게임목록조회() throws Exception { - //given - String url = "/pingpong/games/normal?page=1&size=10&intraId=test1"; - Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "startTime")); - GameListResDto expect = gameFindService.normalGameListByIntra(pageable, "test1"); - //when - String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - System.out.println(contentAsString); - GameListResDto result = objectMapper.readValue(contentAsString, GameListResDto.class); - //then - System.out.println(result.getGames().size() +", " + result.getIsLast()); - System.out.println(expect.getGames()); - assertThat(result.getGames().size()).isEqualTo(expect.getGames().size()); - assertThat(result.getGames().get(0).getGameId().equals(expect.getGames().get(0).getGameId())); - assertThat(result.getIsLast()).isEqualTo(expect.getIsLast()); - } - - @Test - @Transactional - public void 랭크게임목록조회() throws Exception { - //given - String url = "/pingpong/games/rank?page=1&size=10&seasonId=" + season.getId(); - Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "startTime")); - GameListResDto expect = gameFindService.rankGameList(pageable, season.getId()); - //when - String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - System.out.println(contentAsString); - GameListResDto result = objectMapper.readValue(contentAsString, GameListResDto.class); - //then - System.out.println(result.getGames().size() +", " + result.getIsLast()); - System.out.println(expect.getGames().size() + ", " + expect.getIsLast()); - assertThat(result.getGames().size()).isEqualTo(expect.getGames().size()); - assertThat(result.getGames().get(0).getGameId().equals(expect.getGames().get(0).getGameId())); - assertThat(result.getIsLast()).isEqualTo(expect.getIsLast()); - } - - @Test - @Transactional - public void user랭크게임목록조회() throws Exception { - //given - String url = "/pingpong/games/rank?page=1&size=10&seasonId=" + season.getId() + "&nickname=" + "test1"; - Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "startTime")); - GameListResDto expect = gameFindService.rankGameListByIntra(pageable, season.getId(), "test1"); - //when - String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - System.out.println(contentAsString); - GameListResDto result = objectMapper.readValue(contentAsString, GameListResDto.class); - //then - System.out.println(result.getGames().size() +", " + result.getIsLast()); - System.out.println(expect.getGames().size() + ", " + expect.getIsLast()); - assertThat(result.getGames().size()).isEqualTo(expect.getGames().size()); - assertThat(result.getGames().get(0).getGameId().equals(expect.getGames().get(0).getGameId())); - assertThat(result.getIsLast()).isEqualTo(expect.getIsLast()); - } - - @Test - @Transactional - public void 랭크게임목록error조회() throws Exception { - //given - String url = "/pingpong/games/rank?page=1&size=0"; - //then - mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().is4xxClientError()) - .andReturn().getResponse().getContentAsString(); - } - @Test - @Transactional - public void 전체게임목록조회() throws Exception { - //given - String url = "/pingpong/games?page=1&size=10"; - Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "startTime")); - GameListResDto expect = gameFindService.allGameList(pageable, null); - //when - String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - System.out.println(contentAsString); - GameListResDto result = objectMapper.readValue(contentAsString, GameListResDto.class); - //then - System.out.println(result.getGames().size() +", " + result.getIsLast()); - System.out.println(expect.getGames().size() + ", " + expect.getIsLast()); - assertThat(result.getGames().size()).isEqualTo(expect.getGames().size()); - assertThat(result.getGames().get(result.getGames().size() - 1).getGameId().equals(expect.getGames().get(expect.getGames().size() - 1).getGameId())); - assertThat(result.getIsLast()).isEqualTo(expect.getIsLast()); - } - - @Test - @Transactional - public void user전체게임목록조회() throws Exception { - //given - String url = "/pingpong/games?page=1&size=10&nickname=test1"; - Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "startTime")); - GameListResDto expect = gameFindService.allGameListUser(pageable, "test1", null); - //when - String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - System.out.println(contentAsString); - GameListResDto result = objectMapper.readValue(contentAsString, GameListResDto.class); - //then - System.out.println(result.getGames().size() +", " + result.getIsLast()); - System.out.println(expect.getGames().size() + ", " + expect.getIsLast()); - assertThat(result.getGames().size()).isEqualTo(expect.getGames().size()); - assertThat(result.getGames().get(result.getGames().size() - 1).getGameId()).isEqualTo(expect.getGames().get(expect.getGames().size() - 1).getGameId()); - assertThat(result.getIsLast()).isEqualTo(expect.getIsLast()); - } - - @Test - @Transactional - void 게임목록조회에러테스트() throws Exception { - String url = "/pingpong/games?pageNum=1&pageSize=10&status=live"; - mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isBadRequest()) - .andReturn().getResponse().getContentAsString(); - } - @Test - @Transactional - void 게임목록조회에러테스트2() throws Exception { - String url = "/pingpong/games?page=1&size=10&status=2"; - mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) - .andExpect(status().isBadRequest()) - .andReturn().getResponse().getContentAsString(); - } - - @Test - @Transactional - void 랭크게임결과입력테스트() throws Exception { - String url = "/pingpong/games/rank"; - Game game = gameRepository.save(new Game(season, StatusType.WAIT, Mode.RANK, LocalDateTime.now().minusMinutes(15), LocalDateTime.now())); - Team team1 = teamRepository.save(new Team(game, -1, false)); - Team team2 = teamRepository.save(new Team(game, -1, false)); - String ac1 = tokenProvider.createToken(user1.getId()); - String ac2 = tokenProvider.createToken(user2.getId()); - teamUserRepository.save(new TeamUser(team1, user1)); - teamUserRepository.save(new TeamUser(team2, user2)); - teamUserRepository.flush(); - gameRepository.flush(); - teamRepository.flush(); - String content = objectMapper.writeValueAsString(new RankResultReqDto(game.getId(), team1.getId(), 1, team2.getId(), 2)); - System.out.println(user1.getTotalExp()); - System.out.println(user2.getTotalExp()); - // then - System.out.println("======================="); - mockMvc.perform(post(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + ac1) - .contentType(MediaType.APPLICATION_JSON) - .content(content)) - .andExpect(status().isCreated()) - .andReturn().getResponse(); - System.out.println("======================="); - content = objectMapper.writeValueAsString(new RankResultReqDto(game.getId(), team2.getId(), 2, team1.getId(), 1)); - mockMvc.perform(post(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + ac2) - .contentType(MediaType.APPLICATION_JSON) - .content(content)) - .andExpect(status().isConflict()) - .andReturn().getResponse(); - System.out.println(user1.getTotalExp()); - System.out.println(user2.getTotalExp()); - } - - @Test - @Transactional - void 랭크게임결과조회() throws Exception { - String url = "/pingpong/games/" + game2.getId() + "/result/rank"; - String content = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - System.out.println("result: " + content); - } -} +package com.gg.server.game; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.domain.game.service.GameFindService; +import com.gg.server.domain.game.service.GameService; +import com.gg.server.domain.game.data.Game; +import com.gg.server.domain.game.data.GameRepository; +import com.gg.server.domain.game.dto.GameListResDto; +import com.gg.server.domain.game.dto.GameTeamInfo; +import com.gg.server.domain.game.dto.req.RankResultReqDto; +import com.gg.server.domain.game.type.Mode; +import com.gg.server.domain.game.type.StatusType; +import com.gg.server.domain.pchange.data.PChange; +import com.gg.server.domain.pchange.data.PChangeRepository; +import com.gg.server.domain.rank.data.Rank; +import com.gg.server.domain.rank.data.RankRepository; +import com.gg.server.domain.rank.redis.RankRedis; +import com.gg.server.domain.rank.redis.RankRedisRepository; +import com.gg.server.domain.rank.redis.RankRedisService; +import com.gg.server.domain.rank.redis.RedisKeyManager; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.season.data.SeasonRepository; +import com.gg.server.domain.team.data.Team; +import com.gg.server.domain.team.data.TeamRepository; +import com.gg.server.domain.team.data.TeamUser; +import com.gg.server.domain.team.data.TeamUserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.domain.user.type.RacketType; +import com.gg.server.domain.user.type.RoleType; +import com.gg.server.domain.user.type.SnsType; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import lombok.RequiredArgsConstructor; +import org.apache.http.HttpHeaders; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest +@AutoConfigureMockMvc +@RequiredArgsConstructor +public class GameControllerTest { + @Autowired + GameRepository gameRepository; + @Autowired + SeasonRepository seasonRepository; + @Autowired + TeamRepository teamRepository; + @Autowired + TeamUserRepository teamUserRepository; + @Autowired + RankRedisRepository rankRedisRepository; + @Autowired + PChangeRepository pChangeRepository; + @Autowired + RankRedisService rankRedisService; + @Autowired + RankRepository rankRepository; + @Autowired + TestDataUtils testDataUtils; + @Autowired + GameService gameService; + @Autowired + GameFindService gameFindService; + @Autowired + private MockMvc mockMvc; + @Autowired + ObjectMapper objectMapper; + @Autowired + AuthTokenProvider tokenProvider; + private String accessToken; + private Season season; + private User user1; + private User user2; + private Game game1; + private Game game2; + + @BeforeEach + void init() { + season = seasonRepository.save(new Season("test season", LocalDateTime.of(2023, 5, 14, 0, 0), LocalDateTime.of(2999, 12, 31, 23, 59), + 1000, 100)); + user1 = testDataUtils.createNewUser("test1", "test1@email", "null1", RacketType.NONE, SnsType.EMAIL, RoleType.USER); + accessToken = tokenProvider.createToken(user1.getId()); + user2 = testDataUtils.createNewUser("test2", "test2@email", "null1", RacketType.NONE, SnsType.EMAIL, RoleType.USER); + rankRepository.save(Rank.from(user1, season, season.getStartPpp())); + rankRepository.save(Rank.from(user2, season, season.getStartPpp())); + RankRedis userRank = RankRedis.from(UserDto.from(user1), season.getStartPpp()); + String redisHashKey = RedisKeyManager.getHashKey(season.getId()); + rankRedisRepository.addRankData(redisHashKey, user1.getId(), userRank); + userRank = RankRedis.from(UserDto.from(user2), season.getStartPpp()); + rankRedisRepository.addRankData(redisHashKey, user2.getId(), userRank); + for (int i = 0; i < 10; i++) { + Game game = gameRepository.save(new Game(season, StatusType.WAIT, Mode.RANK, LocalDateTime.now().minusMinutes(15), LocalDateTime.now())); + Team team1 = teamRepository.save(new Team(game, 1, false)); + Team team2 = teamRepository.save(new Team(game, 2, true)); + List teams = new ArrayList<>(); + teams.add(teamUserRepository.save(new TeamUser(team1, user1))); + teams.add(teamUserRepository.save(new TeamUser(team2, user2))); + gameService.expUpdates(game, teams); + rankRedisService.updateRankRedis(teams.get(0), teams.get(1), game); + game = gameRepository.save(new Game(season, StatusType.WAIT, Mode.NORMAL, LocalDateTime.now().minusMinutes(15), LocalDateTime.now())); + team1 = teamRepository.save(new Team(game, 0, false)); + team2 = teamRepository.save(new Team(game, 0, false)); + teamUserRepository.save(new TeamUser(team1, user1)); + teamUserRepository.save(new TeamUser(team2, user2)); + teams.clear(); + teams.add(teamUserRepository.save(new TeamUser(team1, user1))); + teams.add(teamUserRepository.save(new TeamUser(team2, user2))); + game.updateStatus(); + gameService.expUpdates(game, teams); + pChangeRepository.save(new PChange(game, user1, 0, true)); + pChangeRepository.save(new PChange(game, user2, 0, true)); + } + game1 = gameRepository.save(new Game(season, StatusType.WAIT, Mode.RANK, LocalDateTime.now().minusMinutes(15), LocalDateTime.now())); + Team team1 = teamRepository.save(new Team(game1, 1, false)); + Team team2 = teamRepository.save(new Team(game1, 2, true)); + teamUserRepository.save(new TeamUser(team1, user1)); + teamUserRepository.save(new TeamUser(team2, user2)); + game2 = gameRepository.save(new Game(season, StatusType.WAIT, Mode.RANK, LocalDateTime.now().minusMinutes(15), LocalDateTime.now())); + team1 = teamRepository.save(new Team(game1, 1, false)); + team2 = teamRepository.save(new Team(game1, 2, true)); + List teams = new ArrayList<>(); + teams.add(teamUserRepository.save(new TeamUser(team1, user1))); + teams.add(teamUserRepository.save(new TeamUser(team2, user2))); + gameService.expUpdates(game2, teams); + rankRedisService.updateRankRedis(teams.get(0), teams.get(1), game2); + } + + @AfterEach + public void flushRedis() { + rankRedisRepository.deleteAll(); + } + + @Test + @Transactional + void 유저게임정보조회테스트() throws Exception { + //given + String url = "/pingpong/games/" + game1.getId().toString(); + GameTeamInfo expect = gameService.getUserGameInfo(game1.getId(), user1.getId()); + // when + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + GameTeamInfo result = objectMapper.readValue(contentAsString, GameTeamInfo.class); + System.out.println("expect: " + expect); + System.out.println("result: " + result); + assertThat(result.getGameId()).isEqualTo(expect.getGameId()); + assertThat(result.getStartTime()).isEqualTo(expect.getStartTime()); + assertThat(result.getMatchTeamsInfo().getMyTeam().getTeamId()).isEqualTo(expect.getMatchTeamsInfo().getMyTeam().getTeamId()); + assertThat(result.getMatchTeamsInfo().getEnemyTeam().getTeamId()).isEqualTo(expect.getMatchTeamsInfo().getEnemyTeam().getTeamId()); + } + + @Test + @Transactional + public void 일반게임목록조회() throws Exception { + //given + String url = "/pingpong/games/normal?page=1&size=10"; + Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "startTime")); + GameListResDto expect = gameFindService.getNormalGameList(pageable); + //when + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + System.out.println(contentAsString); + GameListResDto result = objectMapper.readValue(contentAsString, GameListResDto.class); + //then + System.out.println(result.getGames().size() +", " + result.getIsLast()); + System.out.println(expect.getGames()); + assertThat(result.getGames().size()).isEqualTo(expect.getGames().size()); + assertThat(result.getGames().get(0).getGameId().equals(expect.getGames().get(0).getGameId())); + assertThat(result.getIsLast()).isEqualTo(expect.getIsLast()); + } + + @Test + @Transactional + public void user일반게임목록조회() throws Exception { + //given + String url = "/pingpong/games/normal?page=1&size=10&intraId=test1"; + Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "startTime")); + GameListResDto expect = gameFindService.normalGameListByIntra(pageable, "test1"); + //when + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + System.out.println(contentAsString); + GameListResDto result = objectMapper.readValue(contentAsString, GameListResDto.class); + //then + System.out.println(result.getGames().size() +", " + result.getIsLast()); + System.out.println(expect.getGames()); + assertThat(result.getGames().size()).isEqualTo(expect.getGames().size()); + assertThat(result.getGames().get(0).getGameId().equals(expect.getGames().get(0).getGameId())); + assertThat(result.getIsLast()).isEqualTo(expect.getIsLast()); + } + + @Test + @Transactional + public void 랭크게임목록조회() throws Exception { + //given + String url = "/pingpong/games/rank?page=1&size=10&seasonId=" + season.getId(); + Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "startTime")); + GameListResDto expect = gameFindService.rankGameList(pageable, season.getId()); + //when + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + System.out.println(contentAsString); + GameListResDto result = objectMapper.readValue(contentAsString, GameListResDto.class); + //then + System.out.println(result.getGames().size() +", " + result.getIsLast()); + System.out.println(expect.getGames().size() + ", " + expect.getIsLast()); + assertThat(result.getGames().size()).isEqualTo(expect.getGames().size()); + assertThat(result.getGames().get(0).getGameId().equals(expect.getGames().get(0).getGameId())); + assertThat(result.getIsLast()).isEqualTo(expect.getIsLast()); + } + + @Test + @Transactional + public void user랭크게임목록조회() throws Exception { + //given + String url = "/pingpong/games/rank?page=1&size=10&seasonId=" + season.getId() + "&nickname=" + "test1"; + Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "startTime")); + GameListResDto expect = gameFindService.rankGameListByIntra(pageable, season.getId(), "test1"); + //when + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + System.out.println(contentAsString); + GameListResDto result = objectMapper.readValue(contentAsString, GameListResDto.class); + //then + System.out.println(result.getGames().size() +", " + result.getIsLast()); + System.out.println(expect.getGames().size() + ", " + expect.getIsLast()); + assertThat(result.getGames().size()).isEqualTo(expect.getGames().size()); + assertThat(result.getGames().get(0).getGameId().equals(expect.getGames().get(0).getGameId())); + assertThat(result.getIsLast()).isEqualTo(expect.getIsLast()); + } + + @Test + @Transactional + public void 랭크게임목록error조회() throws Exception { + //given + String url = "/pingpong/games/rank?page=1&size=0"; + //then + mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().is4xxClientError()) + .andReturn().getResponse().getContentAsString(); + } + @Test + @Transactional + public void 전체게임목록조회() throws Exception { + //given + String url = "/pingpong/games?page=1&size=10"; + Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "startTime")); + GameListResDto expect = gameFindService.allGameList(pageable, null); + //when + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + System.out.println(contentAsString); + GameListResDto result = objectMapper.readValue(contentAsString, GameListResDto.class); + //then + System.out.println(result.getGames().size() +", " + result.getIsLast()); + System.out.println(expect.getGames().size() + ", " + expect.getIsLast()); + assertThat(result.getGames().size()).isEqualTo(expect.getGames().size()); + assertThat(result.getGames().get(result.getGames().size() - 1).getGameId().equals(expect.getGames().get(expect.getGames().size() - 1).getGameId())); + assertThat(result.getIsLast()).isEqualTo(expect.getIsLast()); + } + + @Test + @Transactional + public void user전체게임목록조회() throws Exception { + //given + String url = "/pingpong/games?page=1&size=10&nickname=test1"; + Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "startTime")); + GameListResDto expect = gameFindService.allGameListUser(pageable, "test1", null); + //when + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + System.out.println(contentAsString); + GameListResDto result = objectMapper.readValue(contentAsString, GameListResDto.class); + //then + System.out.println(result.getGames().size() +", " + result.getIsLast()); + System.out.println(expect.getGames().size() + ", " + expect.getIsLast()); + assertThat(result.getGames().size()).isEqualTo(expect.getGames().size()); + assertThat(result.getGames().get(result.getGames().size() - 1).getGameId()).isEqualTo(expect.getGames().get(expect.getGames().size() - 1).getGameId()); + assertThat(result.getIsLast()).isEqualTo(expect.getIsLast()); + } + + @Test + @Transactional + void 게임목록조회에러테스트() throws Exception { + String url = "/pingpong/games?pageNum=1&pageSize=10&status=live"; + mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isBadRequest()) + .andReturn().getResponse().getContentAsString(); + } + @Test + @Transactional + void 게임목록조회에러테스트2() throws Exception { + String url = "/pingpong/games?page=1&size=10&status=2"; + mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isBadRequest()) + .andReturn().getResponse().getContentAsString(); + } + + @Test + @Transactional + void 랭크게임결과입력테스트() throws Exception { + String url = "/pingpong/games/rank"; + Game game = gameRepository.save(new Game(season, StatusType.WAIT, Mode.RANK, LocalDateTime.now().minusMinutes(15), LocalDateTime.now())); + Team team1 = teamRepository.save(new Team(game, -1, false)); + Team team2 = teamRepository.save(new Team(game, -1, false)); + String ac1 = tokenProvider.createToken(user1.getId()); + String ac2 = tokenProvider.createToken(user2.getId()); + teamUserRepository.save(new TeamUser(team1, user1)); + teamUserRepository.save(new TeamUser(team2, user2)); + teamUserRepository.flush(); + gameRepository.flush(); + teamRepository.flush(); + String content = objectMapper.writeValueAsString(new RankResultReqDto(game.getId(), team1.getId(), 1, team2.getId(), 2)); + System.out.println(user1.getTotalExp()); + System.out.println(user2.getTotalExp()); + // then + System.out.println("======================="); + mockMvc.perform(post(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + ac1) + .contentType(MediaType.APPLICATION_JSON) + .content(content)) + .andExpect(status().isCreated()) + .andReturn().getResponse(); + System.out.println("======================="); + content = objectMapper.writeValueAsString(new RankResultReqDto(game.getId(), team2.getId(), 2, team1.getId(), 1)); + mockMvc.perform(post(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + ac2) + .contentType(MediaType.APPLICATION_JSON) + .content(content)) + .andExpect(status().isConflict()) + .andReturn().getResponse(); + System.out.println(user1.getTotalExp()); + System.out.println(user2.getTotalExp()); + } + + @Test + @Transactional + void 랭크게임결과조회() throws Exception { + String url = "/pingpong/games/" + game2.getId() + "/result/rank"; + String content = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + System.out.println("result: " + content); + } +} diff --git a/src/test/java/com/gg/server/game/service/GameFindServiceTest.java b/src/test/java/com/gg/server/game/service/GameFindServiceTest.java index 4d167053f..853417967 100644 --- a/src/test/java/com/gg/server/game/service/GameFindServiceTest.java +++ b/src/test/java/com/gg/server/game/service/GameFindServiceTest.java @@ -1,96 +1,96 @@ -package com.gg.server.game.service; - -import com.gg.server.domain.game.data.Game; -import com.gg.server.domain.game.data.GameRepository; -import com.gg.server.domain.game.dto.GameListResDto; -import com.gg.server.domain.game.dto.GameResultResDto; -import com.gg.server.domain.game.dto.GameTeamUser; -import com.gg.server.domain.game.service.GameFindService; -import com.gg.server.domain.game.type.Mode; -import com.gg.server.domain.game.type.StatusType; -import com.gg.server.domain.rank.redis.RankRedis; -import com.gg.server.domain.rank.redis.RankRedisRepository; -import com.gg.server.domain.rank.redis.RedisKeyManager; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.dto.UserDto; -import com.gg.server.global.security.jwt.utils.AuthTokenProvider; -import com.gg.server.utils.TestDataUtils; -import lombok.RequiredArgsConstructor; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Slice; -import org.springframework.data.domain.Sort; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.stream.Collectors; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - -@SpringBootTest -@RequiredArgsConstructor -@Transactional -public class GameFindServiceTest { - - @Autowired - GameFindService gameFindService; - @Autowired - TestDataUtils testDataUtils; - @Autowired - AuthTokenProvider tokenProvider; - @Autowired - RankRedisRepository rankRedisRepository; - @Autowired - GameRepository gameRepository; - - @BeforeEach - void init() { - Season season = testDataUtils.createSeason(); - User newUser = testDataUtils.createNewUser(); - String accessToken = tokenProvider.createToken(newUser.getId()); - String statusMsg = "status message test1"; - - LocalDateTime startTime = LocalDateTime.now().minusDays(1); - LocalDateTime endTime = startTime.plusMinutes(15); - testDataUtils.createMockMatch(newUser, season, startTime, endTime); - - LocalDateTime startTime1 = LocalDateTime.now().minusDays(2); - LocalDateTime endTime1 = startTime1.plusMinutes(15); - testDataUtils.createMockMatch(newUser, season, startTime1, endTime1); - - LocalDateTime startTime2 = LocalDateTime.now().minusDays(3); - LocalDateTime endTime2 = startTime2.plusMinutes(15); - testDataUtils.createMockMatch(newUser, season, startTime2, endTime2); - - testDataUtils.createUserRank(newUser, statusMsg, season); - RankRedis userRank = RankRedis.from(UserDto.from(newUser), season.getStartPpp()); - String redisHashKey = RedisKeyManager.getHashKey(season.getId()); - rankRedisRepository.addRankData(redisHashKey, newUser.getId(), userRank); - } - - @AfterEach - public void flushRedis() { - rankRedisRepository.deleteAll(); - } - @Test - void 일반game목록조회() { - Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "startTime")); - GameListResDto response = gameFindService.getNormalGameList(pageable); - Slice games = gameRepository.findAllByModeAndStatus(Mode.NORMAL, StatusType.END, pageable); - GameListResDto expect = new GameListResDto(getGameResultList(games.getContent().stream().map(Game::getId).collect(Collectors.toList())), games.isLast()); - assertThat(response).isEqualTo(expect); - } - private List getGameResultList(List games) { - List teamViews = gameRepository.findTeamsByGameIsIn(games); - return teamViews.stream().map(GameResultResDto::new).collect(Collectors.toList()); - } - - -} +package com.gg.server.game.service; + +import com.gg.server.domain.game.data.Game; +import com.gg.server.domain.game.data.GameRepository; +import com.gg.server.domain.game.dto.GameListResDto; +import com.gg.server.domain.game.dto.GameResultResDto; +import com.gg.server.domain.game.dto.GameTeamUser; +import com.gg.server.domain.game.service.GameFindService; +import com.gg.server.domain.game.type.Mode; +import com.gg.server.domain.game.type.StatusType; +import com.gg.server.domain.rank.redis.RankRedis; +import com.gg.server.domain.rank.redis.RankRedisRepository; +import com.gg.server.domain.rank.redis.RedisKeyManager; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.data.domain.Sort; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +@SpringBootTest +@RequiredArgsConstructor +@Transactional +public class GameFindServiceTest { + + @Autowired + GameFindService gameFindService; + @Autowired + TestDataUtils testDataUtils; + @Autowired + AuthTokenProvider tokenProvider; + @Autowired + RankRedisRepository rankRedisRepository; + @Autowired + GameRepository gameRepository; + + @BeforeEach + void init() { + Season season = testDataUtils.createSeason(); + User newUser = testDataUtils.createNewUser(); + String accessToken = tokenProvider.createToken(newUser.getId()); + String statusMsg = "status message test1"; + + LocalDateTime startTime = LocalDateTime.now().minusDays(1); + LocalDateTime endTime = startTime.plusMinutes(15); + testDataUtils.createMockMatch(newUser, season, startTime, endTime); + + LocalDateTime startTime1 = LocalDateTime.now().minusDays(2); + LocalDateTime endTime1 = startTime1.plusMinutes(15); + testDataUtils.createMockMatch(newUser, season, startTime1, endTime1); + + LocalDateTime startTime2 = LocalDateTime.now().minusDays(3); + LocalDateTime endTime2 = startTime2.plusMinutes(15); + testDataUtils.createMockMatch(newUser, season, startTime2, endTime2); + + testDataUtils.createUserRank(newUser, statusMsg, season); + RankRedis userRank = RankRedis.from(UserDto.from(newUser), season.getStartPpp()); + String redisHashKey = RedisKeyManager.getHashKey(season.getId()); + rankRedisRepository.addRankData(redisHashKey, newUser.getId(), userRank); + } + + @AfterEach + public void flushRedis() { + rankRedisRepository.deleteAll(); + } + @Test + void 일반game목록조회() { + Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "startTime")); + GameListResDto response = gameFindService.getNormalGameList(pageable); + Slice games = gameRepository.findAllByModeAndStatus(Mode.NORMAL, StatusType.END, pageable); + GameListResDto expect = new GameListResDto(getGameResultList(games.getContent().stream().map(Game::getId).collect(Collectors.toList())), games.isLast()); + assertThat(response).isEqualTo(expect); + } + private List getGameResultList(List games) { + List teamViews = gameRepository.findTeamsByGameIsIn(games); + return teamViews.stream().map(GameResultResDto::new).collect(Collectors.toList()); + } + + +} diff --git a/src/test/java/com/gg/server/game/service/GameServiceTest.java b/src/test/java/com/gg/server/game/service/GameServiceTest.java index dbafd50d4..7de4b0945 100644 --- a/src/test/java/com/gg/server/game/service/GameServiceTest.java +++ b/src/test/java/com/gg/server/game/service/GameServiceTest.java @@ -1,111 +1,111 @@ -package com.gg.server.game.service; - -import com.gg.server.domain.game.data.Game; -import com.gg.server.domain.game.data.GameRepository; -import com.gg.server.domain.game.dto.req.RankResultReqDto; -import com.gg.server.domain.game.service.GameService; -import com.gg.server.domain.game.type.Mode; -import com.gg.server.domain.game.type.StatusType; -import com.gg.server.domain.rank.data.Rank; -import com.gg.server.domain.rank.data.RankRepository; -import com.gg.server.domain.rank.exception.RankNotFoundException; -import com.gg.server.domain.rank.redis.RankRedis; -import com.gg.server.domain.rank.redis.RankRedisRepository; -import com.gg.server.domain.rank.redis.RedisKeyManager; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.team.data.Team; -import com.gg.server.domain.team.data.TeamRepository; -import com.gg.server.domain.team.data.TeamUser; -import com.gg.server.domain.team.data.TeamUserRepository; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.dto.UserDto; -import com.gg.server.global.security.jwt.utils.AuthTokenProvider; -import com.gg.server.utils.TestDataUtils; -import lombok.RequiredArgsConstructor; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - -@SpringBootTest -@RequiredArgsConstructor -@Transactional -public class GameServiceTest { - - @Autowired - RankRedisRepository rankRedisRepository; - - @Autowired - GameRepository gameRepository; - @Autowired - TeamRepository teamRepository; - - @Autowired - TeamUserRepository teamUserRepository; - - @Autowired - RankRepository rankRepository; - - @Autowired - GameService gameService; - - User user1; - User user2; - Game game1; - Team team1, team2; - @Autowired - TestDataUtils testDataUtils; - @Autowired - AuthTokenProvider tokenProvider; - - @BeforeEach - void init() { - Season season = testDataUtils.createSeason(); - user1 = testDataUtils.createNewUser(); - user2 = testDataUtils.createNewUser(); - LocalDateTime now = LocalDateTime.now(); - LocalDateTime startTime = LocalDateTime.of(now.getYear(), now.getMonthValue(), now.getDayOfMonth(), now.getHour(), now.getMinute()); - game1 = gameRepository.save(new Game(season, StatusType.LIVE, Mode.RANK, startTime, startTime.plusMinutes(15))); - team1 = teamRepository.save(new Team(game1, -1, false)); - team2 = teamRepository.save(new Team(game1, -1, true)); - teamUserRepository.save(new TeamUser(team1, user1)); - teamUserRepository.save(new TeamUser(team2, user2)); - String statusMsg = "status message test1"; - - testDataUtils.createUserRank(user1, statusMsg, season); - RankRedis userRank = RankRedis.from(UserDto.from(user1), season.getStartPpp()); - String redisHashKey = RedisKeyManager.getHashKey(season.getId()); - rankRedisRepository.addRankData(redisHashKey, user1.getId(), userRank); - statusMsg = "status message test2"; - testDataUtils.createUserRank(user2, statusMsg, season); - RankRedis userRank2 = RankRedis.from(UserDto.from(user2), season.getStartPpp()); - rankRedisRepository.addRankData(redisHashKey, user2.getId(), userRank2); - } - @AfterEach - public void flushRedis() { - rankRedisRepository.deleteAll(); - } - - @Test - void ppp변화량_조회_test() throws Exception { - String key = RedisKeyManager.getHashKey(game1.getSeason().getId()); - Integer user1BeforePpp = rankRedisRepository.findRankByUserId(key, user1.getId()) - .getPpp(); - System.out.println("Before ppp: " + user1BeforePpp); - assertThat(gameService.createRankResult(new RankResultReqDto(game1.getId(), team1.getId(), - 1, team2.getId(), 2), user1.getId())).isEqualTo(true); - Integer user1AfterPpp = rankRedisRepository.findRankByUserId(key, user1.getId()).getPpp(); - System.out.println("After ppp: " + rankRedisRepository.findRankByUserId(key, user1.getId()) - .getPpp()); - Rank rank = rankRepository.findByUserIdAndSeasonId(user1.getId(), game1.getSeason().getId()) - .orElseThrow(RankNotFoundException::new); - assertThat(rank.getPpp()).isEqualTo(user1AfterPpp); - assertThat(user1BeforePpp).isGreaterThan(user1AfterPpp); - } -} +package com.gg.server.game.service; + +import com.gg.server.domain.game.data.Game; +import com.gg.server.domain.game.data.GameRepository; +import com.gg.server.domain.game.dto.req.RankResultReqDto; +import com.gg.server.domain.game.service.GameService; +import com.gg.server.domain.game.type.Mode; +import com.gg.server.domain.game.type.StatusType; +import com.gg.server.domain.rank.data.Rank; +import com.gg.server.domain.rank.data.RankRepository; +import com.gg.server.domain.rank.exception.RankNotFoundException; +import com.gg.server.domain.rank.redis.RankRedis; +import com.gg.server.domain.rank.redis.RankRedisRepository; +import com.gg.server.domain.rank.redis.RedisKeyManager; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.team.data.Team; +import com.gg.server.domain.team.data.TeamRepository; +import com.gg.server.domain.team.data.TeamUser; +import com.gg.server.domain.team.data.TeamUserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +@SpringBootTest +@RequiredArgsConstructor +@Transactional +public class GameServiceTest { + + @Autowired + RankRedisRepository rankRedisRepository; + + @Autowired + GameRepository gameRepository; + @Autowired + TeamRepository teamRepository; + + @Autowired + TeamUserRepository teamUserRepository; + + @Autowired + RankRepository rankRepository; + + @Autowired + GameService gameService; + + User user1; + User user2; + Game game1; + Team team1, team2; + @Autowired + TestDataUtils testDataUtils; + @Autowired + AuthTokenProvider tokenProvider; + + @BeforeEach + void init() { + Season season = testDataUtils.createSeason(); + user1 = testDataUtils.createNewUser(); + user2 = testDataUtils.createNewUser(); + LocalDateTime now = LocalDateTime.now(); + LocalDateTime startTime = LocalDateTime.of(now.getYear(), now.getMonthValue(), now.getDayOfMonth(), now.getHour(), now.getMinute()); + game1 = gameRepository.save(new Game(season, StatusType.LIVE, Mode.RANK, startTime, startTime.plusMinutes(15))); + team1 = teamRepository.save(new Team(game1, -1, false)); + team2 = teamRepository.save(new Team(game1, -1, true)); + teamUserRepository.save(new TeamUser(team1, user1)); + teamUserRepository.save(new TeamUser(team2, user2)); + String statusMsg = "status message test1"; + + testDataUtils.createUserRank(user1, statusMsg, season); + RankRedis userRank = RankRedis.from(UserDto.from(user1), season.getStartPpp()); + String redisHashKey = RedisKeyManager.getHashKey(season.getId()); + rankRedisRepository.addRankData(redisHashKey, user1.getId(), userRank); + statusMsg = "status message test2"; + testDataUtils.createUserRank(user2, statusMsg, season); + RankRedis userRank2 = RankRedis.from(UserDto.from(user2), season.getStartPpp()); + rankRedisRepository.addRankData(redisHashKey, user2.getId(), userRank2); + } + @AfterEach + public void flushRedis() { + rankRedisRepository.deleteAll(); + } + + @Test + void ppp변화량_조회_test() throws Exception { + String key = RedisKeyManager.getHashKey(game1.getSeason().getId()); + Integer user1BeforePpp = rankRedisRepository.findRankByUserId(key, user1.getId()) + .getPpp(); + System.out.println("Before ppp: " + user1BeforePpp); + assertThat(gameService.createRankResult(new RankResultReqDto(game1.getId(), team1.getId(), + 1, team2.getId(), 2), user1.getId())).isEqualTo(true); + Integer user1AfterPpp = rankRedisRepository.findRankByUserId(key, user1.getId()).getPpp(); + System.out.println("After ppp: " + rankRedisRepository.findRankByUserId(key, user1.getId()) + .getPpp()); + Rank rank = rankRepository.findByUserIdAndSeasonId(user1.getId(), game1.getSeason().getId()) + .orElseThrow(RankNotFoundException::new); + assertThat(rank.getPpp()).isEqualTo(user1AfterPpp); + assertThat(user1BeforePpp).isGreaterThan(user1AfterPpp); + } +} diff --git a/src/test/java/com/gg/server/game/service/GameStatusServiceTest.java b/src/test/java/com/gg/server/game/service/GameStatusServiceTest.java index 82e4208e2..39fe6f1ee 100644 --- a/src/test/java/com/gg/server/game/service/GameStatusServiceTest.java +++ b/src/test/java/com/gg/server/game/service/GameStatusServiceTest.java @@ -1,104 +1,104 @@ -package com.gg.server.game.service; - -import com.gg.server.domain.game.data.Game; -import com.gg.server.domain.game.data.GameRepository; -import com.gg.server.domain.game.service.GameStatusService; -import com.gg.server.domain.game.type.Mode; -import com.gg.server.domain.game.type.StatusType; -import com.gg.server.domain.rank.redis.RankRedisRepository; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.season.data.SeasonRepository; -import com.gg.server.domain.team.data.Team; -import com.gg.server.domain.team.data.TeamRepository; -import com.gg.server.domain.team.data.TeamUser; -import com.gg.server.domain.team.data.TeamUserRepository; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.type.RacketType; -import com.gg.server.domain.user.type.RoleType; -import com.gg.server.domain.user.type.SnsType; -import com.gg.server.utils.TestDataUtils; -import lombok.RequiredArgsConstructor; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; - -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - -@SpringBootTest -@RequiredArgsConstructor -@Transactional -public class GameStatusServiceTest { - @Autowired - private GameRepository gameRepository; - @Autowired private SeasonRepository seasonRepository; - @Autowired - private GameStatusService gameStatusService; - @Autowired - private RankRedisRepository rankRedisRepository; - @Autowired - TestDataUtils testDataUtils; - @Autowired - private TeamRepository teamRepository; - @Autowired - private TeamUserRepository teamUserRepository; - private Season season; - User user1; - User user2; - Game game1; - Game liveGame; - - @BeforeEach - void init() { - season = seasonRepository.save(new Season("test season", LocalDateTime.of(2023, 5, 14, 0, 0), LocalDateTime.of(2999, 12, 31, 23, 59), - 1000, 100)); - user1 = testDataUtils.createNewUser("test2", "test2@naver.com", "null1", RacketType.NONE, SnsType.EMAIL, RoleType.USER); - user2 = testDataUtils.createNewUser("test3", "test3@naver.com", "null1", RacketType.NONE, SnsType.EMAIL, RoleType.USER); - LocalDateTime now = LocalDateTime.now(); - LocalDateTime startTime = LocalDateTime.of(now.getYear(), now.getMonthValue(), now.getDayOfMonth(), now.getHour(), now.getMinute()); - game1 = gameRepository.save(new Game(season, StatusType.BEFORE, Mode.RANK, startTime, startTime.plusMinutes(15))); - Team team1 = teamRepository.save(new Team(game1, 1, false)); - Team team2 = teamRepository.save(new Team(game1, 2, true)); - teamUserRepository.save(new TeamUser(team1, user1)); - teamUserRepository.save(new TeamUser(team2, user2)); - liveGame = gameRepository.save(new Game(season, StatusType.LIVE, Mode.RANK, startTime.minusMinutes(15), startTime)); - } - @AfterEach - public void flushRedis() { - rankRedisRepository.deleteAll(); - } - @Test - void gameBefore상태변경테스트() throws Exception{ - System.out.println("g1.startTime: " + game1.getStartTime()); - System.out.println(game1.getStatus()); - gameStatusService.updateBeforeToLiveStatus(); - assertThat(game1.getStatus()).isEqualTo(StatusType.LIVE); - } - - @Test - void gameLIVE상태변경테스트() throws Exception{ - gameStatusService.updateLiveToWaitStatus(); - assertThat(liveGame.getStatus()).isEqualTo(StatusType.WAIT); - } - - @Test - void game5분전알림테스트() throws Exception{ - LocalDateTime now = LocalDateTime.now(); - LocalDateTime startTime = LocalDateTime.of(now.getYear(), now.getMonthValue(), now.getDayOfMonth(), now.getHour(), now.getMinute()); - System.out.println(startTime.plusMinutes(5)); - Game game = gameRepository.save(new Game(season, StatusType.BEFORE, Mode.RANK, startTime.plusMinutes(5), startTime.plusMinutes(20))); - Team team1 = teamRepository.save(new Team(game, 0, false)); - Team team2 = teamRepository.save(new Team(game, 0, true)); - teamUserRepository.save(new TeamUser(team1, user1)); - teamUserRepository.save(new TeamUser(team2, user2)); - gameRepository.flush(); - teamRepository.flush(); - teamUserRepository.flush(); - System.out.println("=============="); - gameStatusService.imminentGame(); - } -} +package com.gg.server.game.service; + +import com.gg.server.domain.game.data.Game; +import com.gg.server.domain.game.data.GameRepository; +import com.gg.server.domain.game.service.GameStatusService; +import com.gg.server.domain.game.type.Mode; +import com.gg.server.domain.game.type.StatusType; +import com.gg.server.domain.rank.redis.RankRedisRepository; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.season.data.SeasonRepository; +import com.gg.server.domain.team.data.Team; +import com.gg.server.domain.team.data.TeamRepository; +import com.gg.server.domain.team.data.TeamUser; +import com.gg.server.domain.team.data.TeamUserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.type.RacketType; +import com.gg.server.domain.user.type.RoleType; +import com.gg.server.domain.user.type.SnsType; +import com.gg.server.utils.TestDataUtils; +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +@SpringBootTest +@RequiredArgsConstructor +@Transactional +public class GameStatusServiceTest { + @Autowired + private GameRepository gameRepository; + @Autowired private SeasonRepository seasonRepository; + @Autowired + private GameStatusService gameStatusService; + @Autowired + private RankRedisRepository rankRedisRepository; + @Autowired + TestDataUtils testDataUtils; + @Autowired + private TeamRepository teamRepository; + @Autowired + private TeamUserRepository teamUserRepository; + private Season season; + User user1; + User user2; + Game game1; + Game liveGame; + + @BeforeEach + void init() { + season = seasonRepository.save(new Season("test season", LocalDateTime.of(2023, 5, 14, 0, 0), LocalDateTime.of(2999, 12, 31, 23, 59), + 1000, 100)); + user1 = testDataUtils.createNewUser("test2", "test2@naver.com", "null1", RacketType.NONE, SnsType.EMAIL, RoleType.USER); + user2 = testDataUtils.createNewUser("test3", "test3@naver.com", "null1", RacketType.NONE, SnsType.EMAIL, RoleType.USER); + LocalDateTime now = LocalDateTime.now(); + LocalDateTime startTime = LocalDateTime.of(now.getYear(), now.getMonthValue(), now.getDayOfMonth(), now.getHour(), now.getMinute()); + game1 = gameRepository.save(new Game(season, StatusType.BEFORE, Mode.RANK, startTime, startTime.plusMinutes(15))); + Team team1 = teamRepository.save(new Team(game1, 1, false)); + Team team2 = teamRepository.save(new Team(game1, 2, true)); + teamUserRepository.save(new TeamUser(team1, user1)); + teamUserRepository.save(new TeamUser(team2, user2)); + liveGame = gameRepository.save(new Game(season, StatusType.LIVE, Mode.RANK, startTime.minusMinutes(15), startTime)); + } + @AfterEach + public void flushRedis() { + rankRedisRepository.deleteAll(); + } + @Test + void gameBefore상태변경테스트() throws Exception{ + System.out.println("g1.startTime: " + game1.getStartTime()); + System.out.println(game1.getStatus()); + gameStatusService.updateBeforeToLiveStatus(); + assertThat(game1.getStatus()).isEqualTo(StatusType.LIVE); + } + + @Test + void gameLIVE상태변경테스트() throws Exception{ + gameStatusService.updateLiveToWaitStatus(); + assertThat(liveGame.getStatus()).isEqualTo(StatusType.WAIT); + } + + @Test + void game5분전알림테스트() throws Exception{ + LocalDateTime now = LocalDateTime.now(); + LocalDateTime startTime = LocalDateTime.of(now.getYear(), now.getMonthValue(), now.getDayOfMonth(), now.getHour(), now.getMinute()); + System.out.println(startTime.plusMinutes(5)); + Game game = gameRepository.save(new Game(season, StatusType.BEFORE, Mode.RANK, startTime.plusMinutes(5), startTime.plusMinutes(20))); + Team team1 = teamRepository.save(new Team(game, 0, false)); + Team team2 = teamRepository.save(new Team(game, 0, true)); + teamUserRepository.save(new TeamUser(team1, user1)); + teamUserRepository.save(new TeamUser(team2, user2)); + gameRepository.flush(); + teamRepository.flush(); + teamUserRepository.flush(); + System.out.println("=============="); + gameStatusService.imminentGame(); + } +} diff --git a/src/test/java/com/gg/server/utils/TestDataUtils.java b/src/test/java/com/gg/server/utils/TestDataUtils.java index 9db387adb..11f043fd4 100644 --- a/src/test/java/com/gg/server/utils/TestDataUtils.java +++ b/src/test/java/com/gg/server/utils/TestDataUtils.java @@ -1,238 +1,238 @@ -package com.gg.server.utils; - -import com.gg.server.domain.game.data.Game; -import com.gg.server.domain.game.data.GameRepository; -import com.gg.server.domain.noti.data.Noti; -import com.gg.server.domain.noti.data.NotiRepository; -import com.gg.server.domain.noti.type.NotiType; -import com.gg.server.domain.pchange.data.PChange; -import com.gg.server.domain.pchange.data.PChangeRepository; -import com.gg.server.domain.rank.data.Rank; -import com.gg.server.domain.rank.data.RankRepository; -import com.gg.server.domain.rank.redis.RankRedis; -import com.gg.server.domain.rank.redis.RankRedisRepository; -import com.gg.server.domain.rank.redis.RedisKeyManager; -import com.gg.server.domain.season.data.Season; -import com.gg.server.domain.season.data.SeasonRepository; -import com.gg.server.domain.team.data.Team; -import com.gg.server.domain.team.data.TeamRepository; -import com.gg.server.domain.team.data.TeamUser; -import com.gg.server.domain.team.data.TeamUserRepository; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; -import com.gg.server.domain.user.controller.dto.GameInfoDto; -import com.gg.server.domain.user.type.RacketType; -import com.gg.server.domain.user.type.RoleType; -import com.gg.server.domain.user.type.SnsType; -import com.gg.server.global.security.jwt.utils.AuthTokenProvider; -import com.gg.server.domain.game.type.Mode; -import com.gg.server.domain.game.type.StatusType; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -import java.time.LocalDateTime; -import java.util.UUID; - -@Component -@RequiredArgsConstructor -public class TestDataUtils { - private final UserRepository userRepository; - private final AuthTokenProvider tokenProvider; - private final NotiRepository notiRepository; - private final SeasonRepository seasonRepository; - private final GameRepository gameRepository; - private final TeamUserRepository teamUserRepository; - private final TeamRepository teamRepository; - private final RankRedisRepository redisRepository; - private final PChangeRepository pChangeRepository; - private final RankRepository rankRepository; - - public String getLoginAccessToken() { - User user = User.builder() - .eMail("email") - .intraId("intraId") - .imageUri("image") - .racketType(RacketType.PENHOLDER) - .snsNotiOpt(SnsType.NONE) - .roleType(RoleType.USER) - .totalExp(1000) - .build(); - userRepository.save(user); - return tokenProvider.createToken(user.getId()); - } - - public String getAdminLoginAccessToken() { - User user = User.builder() - .eMail("email") - .intraId("intraId") - .imageUri("image") - .racketType(RacketType.PENHOLDER) - .snsNotiOpt(SnsType.NONE) - .roleType(RoleType.ADMIN) - .totalExp(1000) - .build(); - userRepository.save(user); - return tokenProvider.createToken(user.getId()); - } - - public User createNewUser(){ - String randomId = UUID.randomUUID().toString().substring(0, 30); - User user = User.builder() - .eMail("email") - .intraId(randomId) - .imageUri("image") - .racketType(RacketType.PENHOLDER) - .snsNotiOpt(SnsType.NONE) - .roleType(RoleType.USER) - .totalExp(1000) - .build(); - userRepository.save(user); - return user; - } - - public User createNewUser(String intraId, String email, String imageUrl, RacketType racketType, - SnsType snsType, RoleType roleType){ - User user = User.builder() - .eMail(email) - .intraId(intraId) - .imageUri(imageUrl) - .racketType(racketType) - .snsNotiOpt(snsType) - .roleType(roleType) - .totalExp(0) - .build(); - userRepository.save(user); - return user; - } - - public User createNewUser(int totalExp){ - String randomId = UUID.randomUUID().toString().substring(0, 30); - User user = User.builder() - .eMail("email") - .intraId(randomId) - .imageUri("image") - .racketType(RacketType.PENHOLDER) - .snsNotiOpt(SnsType.NONE) - .roleType(RoleType.USER) - .totalExp(totalExp) - .build(); - userRepository.save(user); - return user; - } - - public GameInfoDto addMockDataUserLiveApi(String event, int notiCnt, String currentMatchMode, Long userId) { - User curUser = userRepository.findById(userId).get(); - for (int i = 0; i < notiCnt; i++) { - Noti noti = new Noti(curUser, NotiType.ANNOUNCE, String.valueOf(i), false); - notiRepository.save(noti); - } - LocalDateTime startTime, endTime; - Season season = createSeason(); - createUserRank(curUser, "testUserMessage", season); - Mode mode = (currentMatchMode == "RANK")? Mode.RANK : Mode.NORMAL; - createGame(curUser, LocalDateTime.now().minusMinutes(100), LocalDateTime.now().minusMinutes(85), season, mode); - createGame(curUser, LocalDateTime.now().minusMinutes(50), LocalDateTime.now().minusMinutes(35), season, mode); - LocalDateTime now = LocalDateTime.now(); - if (event.equals("match")){ - startTime = now.plusMinutes(10); - endTime = startTime.plusMinutes(15); - return createGame(curUser, startTime, endTime, season, mode); - }else if (event.equals("game")){ - startTime = now.minusMinutes(5); - endTime = startTime.plusMinutes(15); - return createGame(curUser, startTime, endTime, season, mode); - } - return null; - } - - public GameInfoDto createGame(User curUser, LocalDateTime startTime, LocalDateTime endTime, Season season, Mode mode) { - LocalDateTime now = LocalDateTime.now(); - Game game; - if (now.isBefore(startTime)) - game = new Game(season, StatusType.BEFORE, mode, startTime, endTime); - else if (now.isAfter(startTime) && now.isBefore(endTime)) - game = new Game(season, StatusType.LIVE, mode, startTime, endTime); - else - game = new Game(season, StatusType.END, mode, startTime, endTime); - gameRepository.save(game); - Team myTeam = new Team(game, -1, false); - TeamUser teamUser = new TeamUser(myTeam, curUser); - Team enemyTeam = new Team(game, -1, false); - User enemyUser = createNewUser(); - createUserRank(curUser, "statusMessage", season); - createUserRank(enemyUser, "enemyUserMeassage", season); - TeamUser enemyTeamUser = new TeamUser(enemyTeam, enemyUser); - teamRepository.save(myTeam); - teamRepository.save(enemyTeam); - teamUserRepository.save(teamUser); - teamUserRepository.save(enemyTeamUser); - - return new GameInfoDto(game.getId(), myTeam.getId(), curUser.getId(), enemyTeam.getId(), enemyUser.getId()); - } - - - public Season createSeason(){ - LocalDateTime startTime = LocalDateTime.now(); - LocalDateTime endTime = startTime.plusMonths(1); - Season season = seasonRepository.findCurrentSeason(LocalDateTime.now()).orElse(null); - if (season == null) - season = new Season("name", startTime, endTime, 1000, 300); - seasonRepository.save(season); - return season; - } - - public void createUserRank(User newUser, String statusMessage, Season season) { - if (rankRepository.findByUserIdAndSeasonId(newUser.getId(), season.getId()).isPresent()) - return ; - String zSetKey = RedisKeyManager.getZSetKey(season.getId()); - String hashKey = RedisKeyManager.getHashKey(season.getId()); - redisRepository.addRankData(hashKey, newUser.getId(), - new RankRedis(newUser.getId(), "aa", season.getStartPpp(), 0, 0, statusMessage)); - Rank userRank = Rank.builder() - .user(newUser) - .season(season) - .ppp(season.getStartPpp()) - .wins(0) - .losses(0) - .statusMessage(statusMessage) - .build(); - rankRepository.save(userRank); - } - - public void createUserRank(User newUser, String statusMessage, Season season, int ppp) { - String zSetKey = RedisKeyManager.getZSetKey(season.getId()); - String hashKey = RedisKeyManager.getHashKey(season.getId()); - redisRepository.addToZSet(zSetKey, newUser.getId(), ppp); - redisRepository.addRankData(hashKey, newUser.getId(), - new RankRedis(newUser.getId(), "aa", ppp, 1, 0, statusMessage)); - Rank userRank = Rank.builder() - .user(newUser) - .season(season) - .ppp(ppp) - .wins(1) - .losses(0) - .statusMessage(statusMessage) - .build(); - rankRepository.save(userRank); - } - - public void createMockMatch(User newUser, Season season, LocalDateTime startTime, LocalDateTime endTime) { - Game game = new Game(season, StatusType.END, Mode.RANK, startTime, endTime); - gameRepository.save(game); - Team myTeam = new Team(game, 0, false); - TeamUser teamUser = new TeamUser(myTeam, newUser); - Team enemyTeam = new Team(game, 0, false); - User enemyUser = createNewUser(); - TeamUser enemyTeamUser = new TeamUser(enemyTeam, enemyUser); - teamRepository.save(myTeam); - teamRepository.save(enemyTeam); - teamUserRepository.save(teamUser); - teamUserRepository.save(enemyTeamUser); - - PChange pChange1 = new PChange(game, newUser, 1100, true); - PChange pChange2 = new PChange(game, enemyUser, 900, true); - - pChangeRepository.save(pChange1); - pChangeRepository.save(pChange2); - } -} +package com.gg.server.utils; + +import com.gg.server.domain.game.data.Game; +import com.gg.server.domain.game.data.GameRepository; +import com.gg.server.domain.noti.data.Noti; +import com.gg.server.domain.noti.data.NotiRepository; +import com.gg.server.domain.noti.type.NotiType; +import com.gg.server.domain.pchange.data.PChange; +import com.gg.server.domain.pchange.data.PChangeRepository; +import com.gg.server.domain.rank.data.Rank; +import com.gg.server.domain.rank.data.RankRepository; +import com.gg.server.domain.rank.redis.RankRedis; +import com.gg.server.domain.rank.redis.RankRedisRepository; +import com.gg.server.domain.rank.redis.RedisKeyManager; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.season.data.SeasonRepository; +import com.gg.server.domain.team.data.Team; +import com.gg.server.domain.team.data.TeamRepository; +import com.gg.server.domain.team.data.TeamUser; +import com.gg.server.domain.team.data.TeamUserRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.controller.dto.GameInfoDto; +import com.gg.server.domain.user.type.RacketType; +import com.gg.server.domain.user.type.RoleType; +import com.gg.server.domain.user.type.SnsType; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.domain.game.type.Mode; +import com.gg.server.domain.game.type.StatusType; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Component +@RequiredArgsConstructor +public class TestDataUtils { + private final UserRepository userRepository; + private final AuthTokenProvider tokenProvider; + private final NotiRepository notiRepository; + private final SeasonRepository seasonRepository; + private final GameRepository gameRepository; + private final TeamUserRepository teamUserRepository; + private final TeamRepository teamRepository; + private final RankRedisRepository redisRepository; + private final PChangeRepository pChangeRepository; + private final RankRepository rankRepository; + + public String getLoginAccessToken() { + User user = User.builder() + .eMail("email") + .intraId("intraId") + .imageUri("image") + .racketType(RacketType.PENHOLDER) + .snsNotiOpt(SnsType.NONE) + .roleType(RoleType.USER) + .totalExp(1000) + .build(); + userRepository.save(user); + return tokenProvider.createToken(user.getId()); + } + + public String getAdminLoginAccessToken() { + User user = User.builder() + .eMail("email") + .intraId("intraId") + .imageUri("image") + .racketType(RacketType.PENHOLDER) + .snsNotiOpt(SnsType.NONE) + .roleType(RoleType.ADMIN) + .totalExp(1000) + .build(); + userRepository.save(user); + return tokenProvider.createToken(user.getId()); + } + + public User createNewUser(){ + String randomId = UUID.randomUUID().toString().substring(0, 30); + User user = User.builder() + .eMail("email") + .intraId(randomId) + .imageUri("image") + .racketType(RacketType.PENHOLDER) + .snsNotiOpt(SnsType.NONE) + .roleType(RoleType.USER) + .totalExp(1000) + .build(); + userRepository.save(user); + return user; + } + + public User createNewUser(String intraId, String email, String imageUrl, RacketType racketType, + SnsType snsType, RoleType roleType){ + User user = User.builder() + .eMail(email) + .intraId(intraId) + .imageUri(imageUrl) + .racketType(racketType) + .snsNotiOpt(snsType) + .roleType(roleType) + .totalExp(0) + .build(); + userRepository.save(user); + return user; + } + + public User createNewUser(int totalExp){ + String randomId = UUID.randomUUID().toString().substring(0, 30); + User user = User.builder() + .eMail("email") + .intraId(randomId) + .imageUri("image") + .racketType(RacketType.PENHOLDER) + .snsNotiOpt(SnsType.NONE) + .roleType(RoleType.USER) + .totalExp(totalExp) + .build(); + userRepository.save(user); + return user; + } + + public GameInfoDto addMockDataUserLiveApi(String event, int notiCnt, String currentMatchMode, Long userId) { + User curUser = userRepository.findById(userId).get(); + for (int i = 0; i < notiCnt; i++) { + Noti noti = new Noti(curUser, NotiType.ANNOUNCE, String.valueOf(i), false); + notiRepository.save(noti); + } + LocalDateTime startTime, endTime; + Season season = createSeason(); + createUserRank(curUser, "testUserMessage", season); + Mode mode = (currentMatchMode == "RANK")? Mode.RANK : Mode.NORMAL; + createGame(curUser, LocalDateTime.now().minusMinutes(100), LocalDateTime.now().minusMinutes(85), season, mode); + createGame(curUser, LocalDateTime.now().minusMinutes(50), LocalDateTime.now().minusMinutes(35), season, mode); + LocalDateTime now = LocalDateTime.now(); + if (event.equals("match")){ + startTime = now.plusMinutes(10); + endTime = startTime.plusMinutes(15); + return createGame(curUser, startTime, endTime, season, mode); + }else if (event.equals("game")){ + startTime = now.minusMinutes(5); + endTime = startTime.plusMinutes(15); + return createGame(curUser, startTime, endTime, season, mode); + } + return null; + } + + public GameInfoDto createGame(User curUser, LocalDateTime startTime, LocalDateTime endTime, Season season, Mode mode) { + LocalDateTime now = LocalDateTime.now(); + Game game; + if (now.isBefore(startTime)) + game = new Game(season, StatusType.BEFORE, mode, startTime, endTime); + else if (now.isAfter(startTime) && now.isBefore(endTime)) + game = new Game(season, StatusType.LIVE, mode, startTime, endTime); + else + game = new Game(season, StatusType.END, mode, startTime, endTime); + gameRepository.save(game); + Team myTeam = new Team(game, -1, false); + TeamUser teamUser = new TeamUser(myTeam, curUser); + Team enemyTeam = new Team(game, -1, false); + User enemyUser = createNewUser(); + createUserRank(curUser, "statusMessage", season); + createUserRank(enemyUser, "enemyUserMeassage", season); + TeamUser enemyTeamUser = new TeamUser(enemyTeam, enemyUser); + teamRepository.save(myTeam); + teamRepository.save(enemyTeam); + teamUserRepository.save(teamUser); + teamUserRepository.save(enemyTeamUser); + + return new GameInfoDto(game.getId(), myTeam.getId(), curUser.getId(), enemyTeam.getId(), enemyUser.getId()); + } + + + public Season createSeason(){ + LocalDateTime startTime = LocalDateTime.now(); + LocalDateTime endTime = startTime.plusMonths(1); + Season season = seasonRepository.findCurrentSeason(LocalDateTime.now()).orElse(null); + if (season == null) + season = new Season("name", startTime, endTime, 1000, 300); + seasonRepository.save(season); + return season; + } + + public void createUserRank(User newUser, String statusMessage, Season season) { + if (rankRepository.findByUserIdAndSeasonId(newUser.getId(), season.getId()).isPresent()) + return ; + String zSetKey = RedisKeyManager.getZSetKey(season.getId()); + String hashKey = RedisKeyManager.getHashKey(season.getId()); + redisRepository.addRankData(hashKey, newUser.getId(), + new RankRedis(newUser.getId(), "aa", season.getStartPpp(), 0, 0, statusMessage)); + Rank userRank = Rank.builder() + .user(newUser) + .season(season) + .ppp(season.getStartPpp()) + .wins(0) + .losses(0) + .statusMessage(statusMessage) + .build(); + rankRepository.save(userRank); + } + + public void createUserRank(User newUser, String statusMessage, Season season, int ppp) { + String zSetKey = RedisKeyManager.getZSetKey(season.getId()); + String hashKey = RedisKeyManager.getHashKey(season.getId()); + redisRepository.addToZSet(zSetKey, newUser.getId(), ppp); + redisRepository.addRankData(hashKey, newUser.getId(), + new RankRedis(newUser.getId(), "aa", ppp, 1, 0, statusMessage)); + Rank userRank = Rank.builder() + .user(newUser) + .season(season) + .ppp(ppp) + .wins(1) + .losses(0) + .statusMessage(statusMessage) + .build(); + rankRepository.save(userRank); + } + + public void createMockMatch(User newUser, Season season, LocalDateTime startTime, LocalDateTime endTime) { + Game game = new Game(season, StatusType.END, Mode.RANK, startTime, endTime); + gameRepository.save(game); + Team myTeam = new Team(game, 0, false); + TeamUser teamUser = new TeamUser(myTeam, newUser); + Team enemyTeam = new Team(game, 0, false); + User enemyUser = createNewUser(); + TeamUser enemyTeamUser = new TeamUser(enemyTeam, enemyUser); + teamRepository.save(myTeam); + teamRepository.save(enemyTeam); + teamUserRepository.save(teamUser); + teamUserRepository.save(enemyTeamUser); + + PChange pChange1 = new PChange(game, newUser, 1100, true); + PChange pChange2 = new PChange(game, enemyUser, 900, true); + + pChangeRepository.save(pChange1); + pChangeRepository.save(pChange2); + } +} From 68d6f655dc55b79ff4a1c28ffe85652c58188d87 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Wed, 2 Aug 2023 18:02:06 +0900 Subject: [PATCH 016/273] [TEST] GGBE-28 User TextColor API --- .../user/controller/UserControllerTest.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java index e2b4426f6..827c5a5e5 100644 --- a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java +++ b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java @@ -17,6 +17,7 @@ import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.controller.dto.GameInfoDto; import com.gg.server.domain.user.dto.*; +import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.type.RacketType; import com.gg.server.domain.user.type.RoleType; import com.gg.server.domain.user.type.SnsType; @@ -315,4 +316,37 @@ public void updateUser() throws Exception Assertions.fail("유저 업데이트 실패"); }); } + + @Test + @DisplayName("[patch] text-color") + public void updateTextColorTest() throws Exception { + //given + Season season = testDataUtils.createSeason(); + String intraId = "intraId"; + String email = "email"; + String imageUrl = "imageUrl"; + User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, + SnsType.BOTH, RoleType.ADMIN); + String statusMessage = "statusMessage"; + testDataUtils.createUserRank(newUser, statusMessage, season); + String accessToken = tokenProvider.createToken(newUser.getId()); + String url = "/pingpong/users/text-color"; + + String newStatusMessage = "newStatusMessage"; + RacketType newRacketType = RacketType.SHAKEHAND; + SnsType newSnsType = SnsType.SLACK; + String newTextColor = "#FFFFFF"; + + //when + mockMvc.perform(patch(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(new UserTextColorDto(newTextColor)))) + .andExpect(status().isOk()); + //then + userRepository.findById(newUser.getId()).ifPresentOrElse(user -> { + Assertions.assertThat(user.getTextColor()).isEqualTo(newTextColor); + }, () -> { + Assertions.fail("유저 업데이트 실패"); + }); + } } \ No newline at end of file From 5d19ffd8f35d84e1262a190501a842b1b3615e83 Mon Sep 17 00:00:00 2001 From: sion99 Date: Thu, 3 Aug 2023 10:43:17 +0900 Subject: [PATCH 017/273] =?UTF-8?q?[REFACTOR]=20GGBE-35=20=EB=B6=88?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=9C=20toString()=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/item/dto/ItemHistoryResponseDto.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/main/java/com/gg/server/admin/item/dto/ItemHistoryResponseDto.java b/src/main/java/com/gg/server/admin/item/dto/ItemHistoryResponseDto.java index 8f3afb7d0..434fb27fe 100644 --- a/src/main/java/com/gg/server/admin/item/dto/ItemHistoryResponseDto.java +++ b/src/main/java/com/gg/server/admin/item/dto/ItemHistoryResponseDto.java @@ -28,17 +28,4 @@ public ItemHistoryResponseDto(Item item) { this.discount = item.getDiscount(); this.createdAt = item.getCreatedAt(); } - - @Override - public String toString() { - return "ItemHistoryResponseDto{" + - "itemId=" + itemId + - ", name='" + name + '\'' + - ", content='" + content + '\'' + - ", imageUri='" + imageUri + '\'' + - ", price=" + price + - ", discount=" + discount + - ", createdAt=" + createdAt + - '}'; - } } From 5216dc3a9dfc9fae6bc51d454569c468e3099841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Thu, 3 Aug 2023 10:49:22 +0900 Subject: [PATCH 018/273] =?UTF-8?q?[TEST]=20GGBE-21=20Transactional=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gg/server/domain/user/service/UserService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 4251717f6..73039f7bb 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -231,6 +231,7 @@ public UserImageResponseDto getRankedUserImagesByExp(PageRequest pageRequest) { return new UserImageResponseDto(userImages); } + @Transactional public UserAttendanceResponseDto attendUser(Long userId) { User user = userRepository.findById(userId).orElseThrow(() -> new UsernameNotFoundException("User" + userId)); LocalDateTime startOfDay = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0); From ee495668f3d747ad0a737e6afd8a9a113edd2b5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Thu, 3 Aug 2023 12:04:53 +0900 Subject: [PATCH 019/273] =?UTF-8?q?[REFACTOR]=20GGBE-20=20=EC=9C=A0?= =?UTF-8?q?=EC=A0=80=20=EA=B8=B0=EB=B3=B8=EC=A0=95=EB=B3=B4=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EC=9D=91=EB=8B=B5=EA=B0=92=EC=97=90=20=EC=B6=9C?= =?UTF-8?q?=EC=84=9D=20=EC=97=AC=EB=B6=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/controller/UserController.java | 3 +-- .../user/dto/UserNormalDetailResponseDto.java | 1 + .../server/domain/user/service/UserService.java | 16 ++++++++++++++-- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index 5e178f4b3..92f0c94dc 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -43,8 +43,7 @@ public ResponseEntity generateAccessToken(@RequestParam Stri @GetMapping UserNormalDetailResponseDto getUserNormalDetail(@Parameter(hidden = true) @Login UserDto user){ - Boolean isAdmin = user.getRoleType() == RoleType.ADMIN; - return new UserNormalDetailResponseDto(user.getIntraId(), user.getImageUri(), isAdmin); + return userService.getUserNormalDetail(user); } @GetMapping("/live") diff --git a/src/main/java/com/gg/server/domain/user/dto/UserNormalDetailResponseDto.java b/src/main/java/com/gg/server/domain/user/dto/UserNormalDetailResponseDto.java index 709aad937..97f2467a6 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserNormalDetailResponseDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserNormalDetailResponseDto.java @@ -9,4 +9,5 @@ public class UserNormalDetailResponseDto { private String intraId; private String userImageUri; private Boolean isAdmin; + private Boolean isAttended; } diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 73039f7bb..bfd5c44b4 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -25,6 +25,7 @@ import com.gg.server.domain.user.exception.UserAlreadyAttendanceException; import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.type.RacketType; +import com.gg.server.domain.user.type.RoleType; import com.gg.server.domain.user.type.SnsType; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; @@ -58,6 +59,8 @@ public class UserService { private final CoinHistoryRepository coinHistoryRepository; private final CoinPolicyRepository coinPolicyRepository; + private final String ATTENDANCE = "ATTENDANCE"; + /** * @param intraId * @return intraId가 포함된 유저들의 intraId를 페이징 관계없이 최대 5개까지 검색하여 List로 return @@ -236,13 +239,22 @@ public UserAttendanceResponseDto attendUser(Long userId) { User user = userRepository.findById(userId).orElseThrow(() -> new UsernameNotFoundException("User" + userId)); LocalDateTime startOfDay = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0); LocalDateTime endOfDay = LocalDateTime.now().withHour(23).withMinute(59).withSecond(59); - if (coinHistoryRepository.existsCoinHistoryByUserAndHistoryAndCreatedAtToday(user, "ATTENDANCE", startOfDay, endOfDay)) + if (coinHistoryRepository.existsCoinHistoryByUserAndHistoryAndCreatedAtToday(user, ATTENDANCE, startOfDay, endOfDay)) throw new UserAlreadyAttendanceException(); int plus = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getAttendance(); - CoinHistory coinHistory = new CoinHistory(user, "ATTENDANCE", plus); + CoinHistory coinHistory = new CoinHistory(user, ATTENDANCE, plus); coinHistoryRepository.save(coinHistory); int beforeCoin = user.getGgCoin(); user.addGgCoin(plus); return new UserAttendanceResponseDto(beforeCoin, user.getGgCoin(), plus); } + + public UserNormalDetailResponseDto getUserNormalDetail(UserDto user) { + User loginUser = userRepository.findById(user.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + user.getId())); + Boolean isAdmin = user.getRoleType() == RoleType.ADMIN; + LocalDateTime startOfDay = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0); + LocalDateTime endOfDay = LocalDateTime.now().withHour(23).withMinute(59).withSecond(59); + Boolean isAttended = coinHistoryRepository.existsCoinHistoryByUserAndHistoryAndCreatedAtToday(loginUser, ATTENDANCE, startOfDay, endOfDay); + return new UserNormalDetailResponseDto(user.getIntraId(), user.getImageUri(), isAdmin, isAttended); + } } From 1bf08ed221025d7741c25a49e946fab3294e99d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Thu, 3 Aug 2023 14:11:12 +0900 Subject: [PATCH 020/273] =?UTF-8?q?[TEST]=20GGBE-20=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/user/dto/UserNormalDetailResponseDto.java | 4 +++- .../gg/server/domain/user/controller/UserControllerTest.java | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/user/dto/UserNormalDetailResponseDto.java b/src/main/java/com/gg/server/domain/user/dto/UserNormalDetailResponseDto.java index 97f2467a6..c7d078596 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserNormalDetailResponseDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserNormalDetailResponseDto.java @@ -2,9 +2,11 @@ import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; -@AllArgsConstructor @Getter +@AllArgsConstructor +@NoArgsConstructor public class UserNormalDetailResponseDto { private String intraId; private String userImageUri; diff --git a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java index a3255aaad..c09fc015e 100644 --- a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java +++ b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java @@ -163,6 +163,7 @@ public void userNormalDetail() throws Exception { assertThat(responseDto.getIntraId()).isEqualTo(intraId); assertThat(responseDto.getUserImageUri()).isEqualTo(imageUrl); assertThat(responseDto.getIsAdmin()).isTrue(); + assertThat(responseDto.getIsAttended()); } @Test From b31cd83fe14f998c143724dc02b8d08583ff8b1d Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Thu, 3 Aug 2023 15:46:04 +0900 Subject: [PATCH 021/273] [REFACTOR] GGBE-28 User TextColor API --- .../server/domain/user/controller/UserController.java | 10 ++-------- .../gg/server/domain/user/dto/UserTextColorDto.java | 2 ++ .../com/gg/server/domain/user/service/UserService.java | 6 +++++- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index 66f5680ee..1e80033a9 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -123,14 +123,8 @@ public UserImageResponseDto getUserImage(@RequestParam(required = false) Long se } @PatchMapping ("/text-color") - public void updateTextColor(@RequestBody UserTextColorDto TextColor, @Parameter(hidden = true) @Login UserDto user) { - String textColor = TextColor.getTextColor(); - if (userTextColorCheck.check(textColor)){ - userService.updateTextColor(user.getId() ,textColor); - } - else { - throw new UserTextColorException(); - } + public void updateTextColor(@RequestBody @Valid UserTextColorDto textColorDto, @Parameter(hidden = true) @Login UserDto user) { + userService.updateTextColor(user.getId() ,textColorDto); } @PostMapping("/attendance") public UserAttendanceResponseDto attendUser(@Parameter(hidden = true) @Login UserDto user) { diff --git a/src/main/java/com/gg/server/domain/user/dto/UserTextColorDto.java b/src/main/java/com/gg/server/domain/user/dto/UserTextColorDto.java index fd30c9938..7e06a7277 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserTextColorDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserTextColorDto.java @@ -1,5 +1,6 @@ package com.gg.server.domain.user.dto; +import com.sun.istack.NotNull; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -8,5 +9,6 @@ @NoArgsConstructor @AllArgsConstructor public class UserTextColorDto { + @NotNull private String textColor; } diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 60bef76e3..fb9799b56 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -24,6 +24,7 @@ import com.gg.server.domain.user.dto.*; import com.gg.server.domain.user.exception.UserAlreadyAttendanceException; import com.gg.server.domain.user.exception.UserNotFoundException; +import com.gg.server.domain.user.exception.UserTextColorException; import com.gg.server.domain.user.type.RacketType; import com.gg.server.domain.user.type.RoleType; import com.gg.server.domain.user.type.SnsType; @@ -259,7 +260,10 @@ public UserNormalDetailResponseDto getUserNormalDetail(UserDto user) { } @Transactional() - public void updateTextColor(Long userId, String textColor) { + public void updateTextColor(Long userId, UserTextColorDto textColorDto) { + String textColor = textColorDto.getTextColor(); + if (UserTextColorCheckService.check(textColor) == false) + throw new UserTextColorException(); User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new); user.updateTextColor(textColor); } From 80bc9066cea29e0b786cafaf473cbbbde1b7124b Mon Sep 17 00:00:00 2001 From: sion99 Date: Thu, 3 Aug 2023 16:34:09 +0900 Subject: [PATCH 022/273] =?UTF-8?q?[FEAT]=20GGBE-32=20=EC=83=81=ED=92=88?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/controller/ItemAdminController.java | 11 +++++ .../server/admin/item/dto/ItemAdminDto.java | 47 +++++++++++++++++++ .../item/dto/ItemHistoryResponseDto.java | 16 +++++++ .../server/admin/item/dto/ItemRequestDto.java | 38 +++++++++++++++ .../item/exception/ItemNotFoundException.java | 10 ++++ .../admin/item/service/ItemAdminService.java | 18 ++++++- .../com/gg/server/domain/item/data/Item.java | 30 ++++++++++++ .../gg/server/global/exception/ErrorCode.java | 3 ++ .../controller/ItemAdminControllerTest.java | 6 ++- 9 files changed, 175 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/gg/server/admin/item/dto/ItemAdminDto.java create mode 100644 src/main/java/com/gg/server/admin/item/dto/ItemRequestDto.java create mode 100644 src/main/java/com/gg/server/admin/item/exception/ItemNotFoundException.java diff --git a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java index 203a31ccb..f82688e0f 100644 --- a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java +++ b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java @@ -1,12 +1,16 @@ package com.gg.server.admin.item.controller; +import com.gg.server.admin.item.dto.ItemHistoryResponseDto; import com.gg.server.admin.item.dto.ItemListResponseDto; +import com.gg.server.admin.item.dto.ItemRequestDto; import com.gg.server.admin.item.service.ItemAdminService; import com.gg.server.global.dto.PageRequestDto; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -23,4 +27,11 @@ public ItemListResponseDto getItemHistory(@ModelAttribute @Valid PageRequestDto Sort.by("createdAt").descending()); return itemAdminService.getAllItemHistory(pageable); } + + @PutMapping("/{itemId}") + public ResponseEntity updateItem(@PathVariable("itemId") Long itemId, @RequestBody ItemRequestDto itemRequestDto) { + itemAdminService.updateItem(itemId, itemRequestDto); + + return new ResponseEntity(HttpStatus.NO_CONTENT); + } } diff --git a/src/main/java/com/gg/server/admin/item/dto/ItemAdminDto.java b/src/main/java/com/gg/server/admin/item/dto/ItemAdminDto.java new file mode 100644 index 000000000..8c80d66e6 --- /dev/null +++ b/src/main/java/com/gg/server/admin/item/dto/ItemAdminDto.java @@ -0,0 +1,47 @@ +package com.gg.server.admin.item.dto; + +import com.gg.server.domain.item.data.Item; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ItemAdminDto { + private Long itemId; + private String name; + private String content; + private String imageUri; + private Integer price; + private Integer discount; + private boolean isVisible; + private LocalDateTime createdAt; + + public ItemAdminDto(Item item) { + this.itemId = item.getId(); + this.name = item.getName(); + this.content = item.getContent(); + this.imageUri = item.getImageUri(); + this.price = item.getPrice(); + this.discount = item.getDiscount(); + this.isVisible = item.getIsVisible(); + this.createdAt = item.getCreatedAt(); + } + + @Override + public String toString() { + return "ItemAdminDto{" + + "itemId=" + itemId + + ", name='" + name + '\'' + + ", content='" + content + '\'' + + ", imageUri='" + imageUri + '\'' + + ", price=" + price + + ", discount=" + discount + + ", isVisible=" + isVisible + + ", createdAt=" + createdAt + + '}'; + } +} diff --git a/src/main/java/com/gg/server/admin/item/dto/ItemHistoryResponseDto.java b/src/main/java/com/gg/server/admin/item/dto/ItemHistoryResponseDto.java index 434fb27fe..e82881ef0 100644 --- a/src/main/java/com/gg/server/admin/item/dto/ItemHistoryResponseDto.java +++ b/src/main/java/com/gg/server/admin/item/dto/ItemHistoryResponseDto.java @@ -17,6 +17,7 @@ public class ItemHistoryResponseDto { private String imageUri; private Integer price; private Integer discount; + private boolean isVisible; private LocalDateTime createdAt; public ItemHistoryResponseDto(Item item) { @@ -26,6 +27,21 @@ public ItemHistoryResponseDto(Item item) { this.imageUri = item.getImageUri(); this.price = item.getPrice(); this.discount = item.getDiscount(); + this.isVisible = item.getIsVisible(); this.createdAt = item.getCreatedAt(); } + + @Override + public String toString() { + return "ItemHistoryResponseDto{" + + "itemId=" + itemId + + ", name='" + name + '\'' + + ", content='" + content + '\'' + + ", imageUri='" + imageUri + '\'' + + ", price=" + price + + ", discount=" + discount + + ", isVisible=" + isVisible + + ", createdAt=" + createdAt + + '}'; + } } diff --git a/src/main/java/com/gg/server/admin/item/dto/ItemRequestDto.java b/src/main/java/com/gg/server/admin/item/dto/ItemRequestDto.java new file mode 100644 index 000000000..a1e9668f7 --- /dev/null +++ b/src/main/java/com/gg/server/admin/item/dto/ItemRequestDto.java @@ -0,0 +1,38 @@ +package com.gg.server.admin.item.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ItemRequestDto { + @NotNull(message = "plz. itemName") + private String name; + + @NotNull(message = "plz. content") + private String content; + + @NotNull(message = "plz. imageUri") + private String imageUri; + + @NotNull(message = "plz. price") + private Integer price; + + @NotNull(message = "plz. discount") + private Integer discount; + + @Override + public String toString() { + return "ItemRequestDto{" + + "name='" + name + '\'' + + ", content='" + content + '\'' + + ", imageUri='" + imageUri + '\'' + + ", price=" + price + + ", discount=" + discount + + '}'; + } +} diff --git a/src/main/java/com/gg/server/admin/item/exception/ItemNotFoundException.java b/src/main/java/com/gg/server/admin/item/exception/ItemNotFoundException.java new file mode 100644 index 000000000..1334c1909 --- /dev/null +++ b/src/main/java/com/gg/server/admin/item/exception/ItemNotFoundException.java @@ -0,0 +1,10 @@ +package com.gg.server.admin.item.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.NotExistException; + +public class ItemNotFoundException extends NotExistException { + public ItemNotFoundException() { + super("아이템이 없습니다.", ErrorCode.ITEM_NOT_FOUND); + } +} diff --git a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java index 5fd4720b4..181b0492e 100644 --- a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java +++ b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java @@ -1,8 +1,12 @@ package com.gg.server.admin.item.service; import com.gg.server.admin.item.data.ItemAdminRepository; +import com.gg.server.admin.item.dto.ItemAdminDto; import com.gg.server.admin.item.dto.ItemHistoryResponseDto; import com.gg.server.admin.item.dto.ItemListResponseDto; +import com.gg.server.admin.item.dto.ItemRequestDto; +import com.gg.server.admin.item.exception.ItemNotFoundException; +import com.gg.server.domain.item.data.Item; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -13,10 +17,20 @@ @Service @RequiredArgsConstructor public class ItemAdminService { - private final ItemAdminRepository itemRepository; + private final ItemAdminRepository itemAdminRepository; @Transactional(readOnly = true) public ItemListResponseDto getAllItemHistory(Pageable pageable) { - Page responseDtos = itemRepository.findAll(pageable).map(ItemHistoryResponseDto::new); + Page responseDtos = itemAdminRepository.findAll(pageable).map(ItemHistoryResponseDto::new); return new ItemListResponseDto(responseDtos.getContent(), responseDtos.getTotalPages()); } + + @Transactional + public void updateItem(Long itemId, ItemRequestDto createDto) { + Item item = itemAdminRepository.findById(itemId).orElseThrow(()-> new ItemNotFoundException()); + item.setIsVisible(false); + + Item newItem = new Item(createDto); + System.out.println(newItem); + itemAdminRepository.save(newItem); + } } diff --git a/src/main/java/com/gg/server/domain/item/data/Item.java b/src/main/java/com/gg/server/domain/item/data/Item.java index ecbc94484..06d9aedbb 100644 --- a/src/main/java/com/gg/server/domain/item/data/Item.java +++ b/src/main/java/com/gg/server/domain/item/data/Item.java @@ -1,7 +1,10 @@ package com.gg.server.domain.item.data; +import com.gg.server.admin.item.dto.ItemRequestDto; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import javax.persistence.*; import javax.validation.constraints.NotNull; @@ -30,6 +33,7 @@ public class Item { @NotNull @Column(name = "is_visible") + @Setter private Boolean isVisible; @Column(name = "discount") @@ -39,6 +43,7 @@ public class Item { @Column(name = "created_at") private LocalDateTime createdAt; + @Builder public Item(String name, String content, String imageUri, Integer price, Boolean isVisible, Integer discount, LocalDateTime createdAt) { this.name = name; @@ -49,4 +54,29 @@ public Item(String name, String content, String imageUri, Integer price, this.discount = discount; this.createdAt = createdAt; } + + @Builder + public Item(ItemRequestDto createDto) { + this.name = createDto.getName(); + this.content = createDto.getContent(); + this.imageUri = createDto.getImageUri(); + this.price = createDto.getPrice(); + this.discount = createDto.getDiscount(); + this.isVisible = true; + this.createdAt = LocalDateTime.now(); + } + + @Override + public String toString() { + return "Item{" + + "id=" + id + + ", name='" + name + '\'' + + ", content='" + content + '\'' + + ", imageUri='" + imageUri + '\'' + + ", price=" + price + + ", isVisible=" + isVisible + + ", discount=" + discount + + ", createdAt=" + createdAt + + '}'; + } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index e57941e1d..b8c3a4cda 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -36,6 +36,9 @@ public enum ErrorCode { REDIS_RANK_NOT_FOUND(404, "RK101", "REDIS RANK NOT FOUND"), RANK_UPDATE_FAIL(400, "RK200", "RANK UPDATE FAIL"), + //item + ITEM_NOT_FOUND(404, "IT100", "ITEM NOT FOUND"), + /** Penalty **/ PENALTY_NOT_FOUND(404, "PE100", "PENALTY NOT FOUND"), REDIS_PENALTY_USER_NOT_FOUND(404, "PE101", "REDIS PENALTY USER NOT FOUND"), diff --git a/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java b/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java index f1ba2bec4..f67aac0c5 100644 --- a/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.gg.server.admin.item.data.ItemAdminRepository; +import com.gg.server.admin.item.dto.ItemHistoryResponseDto; import com.gg.server.admin.item.dto.ItemListResponseDto; import com.gg.server.admin.item.service.ItemAdminService; import com.gg.server.domain.user.data.UserRepository; @@ -60,9 +61,10 @@ public void getAllItemHistoryTest() throws Exception { System.out.println(contentAsString); ItemListResponseDto expect = itemAdminService.getAllItemHistory(pageable); - ItemListResponseDto result = objectMapper.readValue(contentAsString, ItemListResponseDto.class); System.out.println(expect.getHistoryList()); - System.out.println(result.getHistoryList()); + ItemListResponseDto result = objectMapper.readValue(contentAsString, ItemListResponseDto.class); + System.out.println(expect.getHistoryList().get(0)); + System.out.println(result.getHistoryList().get(0)); assertThat(result.getHistoryList().get(0).getItemId()); assertThat(result.getHistoryList().get(0).getName()); assertThat(result.getHistoryList().get(0).getContent()); From 80ec8916f66cbabda271f59aa09566e0799e6a26 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Thu, 3 Aug 2023 18:39:52 +0900 Subject: [PATCH 023/273] [feat] GGBE-22 get coinpolicy api --- .../controller/CoinPolicyAdminController.java | 18 ++++++++--- .../dto/CoinPolicyAdminListResponseDto.java | 16 ++++++++++ .../coin/dto/CoinPolicyAdminResponseDto.java | 31 +++++++++++++++++++ .../coin/service/CoinPolicyAdminService.java | 17 ++++++++++ 4 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminListResponseDto.java create mode 100644 src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminResponseDto.java diff --git a/src/main/java/com/gg/server/admin/coin/controller/CoinPolicyAdminController.java b/src/main/java/com/gg/server/admin/coin/controller/CoinPolicyAdminController.java index 03824a39d..f8f66dee5 100644 --- a/src/main/java/com/gg/server/admin/coin/controller/CoinPolicyAdminController.java +++ b/src/main/java/com/gg/server/admin/coin/controller/CoinPolicyAdminController.java @@ -1,18 +1,20 @@ package com.gg.server.admin.coin.controller; import com.gg.server.admin.coin.dto.CoinPolicyAdminAddDto; +import com.gg.server.admin.coin.dto.CoinPolicyAdminListResponseDto; import com.gg.server.admin.coin.service.CoinPolicyAdminService; import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.global.dto.PageRequestDto; import com.gg.server.global.utils.argumentresolver.Login; import io.swagger.v3.oas.annotations.Parameter; import lombok.AllArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -23,6 +25,14 @@ public class CoinPolicyAdminController { private final CoinPolicyAdminService coinPolicyAdminService; + @GetMapping("/coinpolicy") + public ResponseEntity getCoinPolicyList(@ModelAttribute @Valid PageRequestDto coReq){ + Pageable pageable = PageRequest.of(coReq.getPage() - 1, coReq.getSize(), Sort.by("createdAt").descending()); + + return ResponseEntity.ok() + .body(coinPolicyAdminService.findAllCoinPolicy(pageable)); + } + @PostMapping("/coinpolicy") public ResponseEntity addCoinPolicy(@Parameter(hidden = true) @Login UserDto userDto, @Valid @RequestBody CoinPolicyAdminAddDto addDto){ diff --git a/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminListResponseDto.java b/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminListResponseDto.java new file mode 100644 index 000000000..b5014b54e --- /dev/null +++ b/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminListResponseDto.java @@ -0,0 +1,16 @@ +package com.gg.server.admin.coin.dto; + +import com.gg.server.admin.announcement.dto.AnnouncementAdminResponseDto; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +public class CoinPolicyAdminListResponseDto { + private List coinPolicyList; + private int totalPage; +} diff --git a/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminResponseDto.java b/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminResponseDto.java new file mode 100644 index 000000000..08110e751 --- /dev/null +++ b/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminResponseDto.java @@ -0,0 +1,31 @@ +package com.gg.server.admin.coin.dto; + +import com.gg.server.domain.announcement.data.Announcement; +import com.gg.server.domain.coin.data.CoinPolicy; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Getter +@NoArgsConstructor +public class CoinPolicyAdminResponseDto { + private Long coinPolicyId; + private String createUserId; + private int attendance; + private int normal; + private int rankWin; + private int rankLose; + private LocalDateTime createdAt; + + public CoinPolicyAdminResponseDto(CoinPolicy coinPolicyAdmin) + { + this.coinPolicyId = coinPolicyAdmin.getId(); + this.createUserId = coinPolicyAdmin.getUser().getIntraId(); + this.attendance = coinPolicyAdmin.getAttendance(); + this.normal = coinPolicyAdmin.getNormal(); + this.rankWin = coinPolicyAdmin.getRankWin(); + this.rankLose = coinPolicyAdmin.getRankLose(); + this.createdAt = coinPolicyAdmin.getCreatedAt(); + } +} diff --git a/src/main/java/com/gg/server/admin/coin/service/CoinPolicyAdminService.java b/src/main/java/com/gg/server/admin/coin/service/CoinPolicyAdminService.java index 6a2ffad75..b82aed7a6 100644 --- a/src/main/java/com/gg/server/admin/coin/service/CoinPolicyAdminService.java +++ b/src/main/java/com/gg/server/admin/coin/service/CoinPolicyAdminService.java @@ -1,13 +1,20 @@ package com.gg.server.admin.coin.service; +import com.gg.server.admin.announcement.dto.AnnouncementAdminListResponseDto; +import com.gg.server.admin.announcement.dto.AnnouncementAdminResponseDto; import com.gg.server.admin.coin.data.CoinPolicyAdminRepository; import com.gg.server.admin.coin.dto.CoinPolicyAdminAddDto; +import com.gg.server.admin.coin.dto.CoinPolicyAdminListResponseDto; +import com.gg.server.admin.coin.dto.CoinPolicyAdminResponseDto; import com.gg.server.admin.user.data.UserAdminRepository; +import com.gg.server.domain.announcement.data.Announcement; import com.gg.server.domain.coin.data.CoinPolicy; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.domain.user.exception.UserNotFoundException; import lombok.AllArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -16,6 +23,16 @@ public class CoinPolicyAdminService { private final CoinPolicyAdminRepository coinPolicyAdminRepository; private final UserAdminRepository userAdminRepository; + + @Transactional(readOnly = true) + public CoinPolicyAdminListResponseDto findAllCoinPolicy(Pageable pageable) { + Page allCoinPolicy = coinPolicyAdminRepository.findAll(pageable); + Page responseDtos = allCoinPolicy.map(CoinPolicyAdminResponseDto::new); + + return new CoinPolicyAdminListResponseDto(responseDtos.getContent(), + responseDtos.getTotalPages()); + } + @Transactional public void addCoinPolicy(UserDto userDto, CoinPolicyAdminAddDto addDto){ User user = userAdminRepository.findByIntraId(userDto.getIntraId()).orElseThrow(() -> new UserNotFoundException()); From 820bd3ad051d25b5a3e18541b4ba1c827cadd289 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Thu, 3 Aug 2023 18:41:06 +0900 Subject: [PATCH 024/273] [test] GGBE-22 get coinpolicy testcode --- .../CoinPolicyAdminControllerTest.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerTest.java b/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerTest.java index 69ee4f72a..483615738 100644 --- a/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerTest.java @@ -1,8 +1,10 @@ package com.gg.server.admin.coin.controller; import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.admin.announcement.dto.AnnouncementAdminListResponseDto; import com.gg.server.admin.coin.data.CoinPolicyAdminRepository; import com.gg.server.admin.coin.dto.CoinPolicyAdminAddDto; +import com.gg.server.admin.coin.dto.CoinPolicyAdminListResponseDto; import com.gg.server.domain.coin.data.CoinPolicy; import com.gg.server.domain.coin.exception.CoinPolicyNotFoundException; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; @@ -20,6 +22,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -43,6 +46,32 @@ class CoinPolicyAdminControllerTest { @Autowired CoinPolicyAdminRepository coinPolicyAdminRepository; + @Test + @DisplayName("[Get]/pingpong/admin/coinpolicy") + void getAnnouncement() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + + Integer currentPage = 1; + Integer pageSize = 5;//페이지 사이즈 크기가 실제 디비 정보보다 큰지 확인할 것 + + String url = "/pingpong/admin/coinpolicy?page=" + currentPage + "&size=" + pageSize; + String contentAsString = mockMvc.perform(get(url) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + + CoinPolicyAdminListResponseDto result = objectMapper.readValue(contentAsString, CoinPolicyAdminListResponseDto.class); + assertThat(result.getCoinPolicyList().size()).isEqualTo(3); + System.out.println(result.getCoinPolicyList().get(0).getCoinPolicyId()); + System.out.println(result.getCoinPolicyList().get(0).getCreateUserId()); + System.out.println(result.getCoinPolicyList().get(0).getAttendance()); + System.out.println(result.getCoinPolicyList().get(0).getNormal()); + System.out.println(result.getCoinPolicyList().get(0).getRankWin()); + System.out.println(result.getCoinPolicyList().get(0).getRankLose()); + + } + @Test @DisplayName("[Post]/pingpong/admin/coinpolicy") void addAnnouncement() throws Exception { From 83923e735d0aa0b89a7eb31b241ece5bc85dbd46 Mon Sep 17 00:00:00 2001 From: sion99 Date: Fri, 4 Aug 2023 11:20:47 +0900 Subject: [PATCH 025/273] =?UTF-8?q?[TEST]=20GGBE-32=20=EC=83=81=ED=92=88?= =?UTF-8?q?=20=EC=88=98=EC=A0=95=20api=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ItemAdminControllerTest.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java b/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java index f67aac0c5..db9558e01 100644 --- a/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java @@ -4,6 +4,7 @@ import com.gg.server.admin.item.data.ItemAdminRepository; import com.gg.server.admin.item.dto.ItemHistoryResponseDto; import com.gg.server.admin.item.dto.ItemListResponseDto; +import com.gg.server.admin.item.dto.ItemRequestDto; import com.gg.server.admin.item.service.ItemAdminService; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; @@ -17,7 +18,10 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; +import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; + import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; @@ -70,4 +74,18 @@ public void getAllItemHistoryTest() throws Exception { assertThat(result.getHistoryList().get(0).getContent()); assertThat(result.getHistoryList().get(0).getPrice()); } + + @Test + @DisplayName("PUT /pingpong/admin/items/history/{itemId}") + public void updateItemTest() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + String requestJson = "{\"name\" : \"확성기\", \"content\" : \"testing\", \"imageUri\" : \"https://kakao.com\", \"price\" : 42, \"discount\" : 50}"; + String contentAsString = mockMvc.perform(put("/pingpong/admin/items/{itemId}", 1) + .contentType(MediaType.APPLICATION_JSON) + .content(requestJson) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isNoContent()) + .andReturn().getResponse().getContentAsString(); + System.out.println(contentAsString); + } } \ No newline at end of file From 9ca7c51ac6954fdce758c622b7adc818b881ffb6 Mon Sep 17 00:00:00 2001 From: sion99 Date: Fri, 4 Aug 2023 11:21:52 +0900 Subject: [PATCH 026/273] =?UTF-8?q?[STYLE]=20GGBE-32=20unused=20import=20s?= =?UTF-8?q?tatement=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/admin/item/controller/ItemAdminControllerTest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java b/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java index db9558e01..8b41ad21e 100644 --- a/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java @@ -2,9 +2,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.gg.server.admin.item.data.ItemAdminRepository; -import com.gg.server.admin.item.dto.ItemHistoryResponseDto; import com.gg.server.admin.item.dto.ItemListResponseDto; -import com.gg.server.admin.item.dto.ItemRequestDto; import com.gg.server.admin.item.service.ItemAdminService; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; @@ -20,7 +18,6 @@ import org.springframework.data.domain.Sort; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.result.MockMvcResultMatchers; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; From c4f700e2328b912047942b1d1ea427b6360d3e7e Mon Sep 17 00:00:00 2001 From: sion99 Date: Fri, 4 Aug 2023 14:28:18 +0900 Subject: [PATCH 027/273] =?UTF-8?q?[REFACTOR]=20GGBE-32=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20Dto=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/admin/item/dto/ItemAdminDto.java | 47 ------------------- 1 file changed, 47 deletions(-) delete mode 100644 src/main/java/com/gg/server/admin/item/dto/ItemAdminDto.java diff --git a/src/main/java/com/gg/server/admin/item/dto/ItemAdminDto.java b/src/main/java/com/gg/server/admin/item/dto/ItemAdminDto.java deleted file mode 100644 index 8c80d66e6..000000000 --- a/src/main/java/com/gg/server/admin/item/dto/ItemAdminDto.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.gg.server.admin.item.dto; - -import com.gg.server.domain.item.data.Item; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.time.LocalDateTime; - -@Getter -@NoArgsConstructor -@AllArgsConstructor -public class ItemAdminDto { - private Long itemId; - private String name; - private String content; - private String imageUri; - private Integer price; - private Integer discount; - private boolean isVisible; - private LocalDateTime createdAt; - - public ItemAdminDto(Item item) { - this.itemId = item.getId(); - this.name = item.getName(); - this.content = item.getContent(); - this.imageUri = item.getImageUri(); - this.price = item.getPrice(); - this.discount = item.getDiscount(); - this.isVisible = item.getIsVisible(); - this.createdAt = item.getCreatedAt(); - } - - @Override - public String toString() { - return "ItemAdminDto{" + - "itemId=" + itemId + - ", name='" + name + '\'' + - ", content='" + content + '\'' + - ", imageUri='" + imageUri + '\'' + - ", price=" + price + - ", discount=" + discount + - ", isVisible=" + isVisible + - ", createdAt=" + createdAt + - '}'; - } -} From 33ab18187abec38320a3e7eae9b05b7a87b2dbbb Mon Sep 17 00:00:00 2001 From: sion99 Date: Fri, 4 Aug 2023 14:34:56 +0900 Subject: [PATCH 028/273] =?UTF-8?q?[REFACTOR]=20GGBE-32=20Valid=20?= =?UTF-8?q?=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/admin/item/controller/ItemAdminController.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java index f82688e0f..e5b838cec 100644 --- a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java +++ b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java @@ -1,6 +1,5 @@ package com.gg.server.admin.item.controller; -import com.gg.server.admin.item.dto.ItemHistoryResponseDto; import com.gg.server.admin.item.dto.ItemListResponseDto; import com.gg.server.admin.item.dto.ItemRequestDto; import com.gg.server.admin.item.service.ItemAdminService; @@ -29,7 +28,7 @@ public ItemListResponseDto getItemHistory(@ModelAttribute @Valid PageRequestDto } @PutMapping("/{itemId}") - public ResponseEntity updateItem(@PathVariable("itemId") Long itemId, @RequestBody ItemRequestDto itemRequestDto) { + public ResponseEntity updateItem(@PathVariable("itemId") Long itemId, @RequestBody @Valid ItemRequestDto itemRequestDto) { itemAdminService.updateItem(itemId, itemRequestDto); return new ResponseEntity(HttpStatus.NO_CONTENT); From 4c0edb2cb49a387c36664369017eb6806f713167 Mon Sep 17 00:00:00 2001 From: sion99 Date: Fri, 4 Aug 2023 14:38:04 +0900 Subject: [PATCH 029/273] =?UTF-8?q?[REFACTOR]=20GGBE-32=20print=EB=AC=B8?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gg/server/admin/item/service/ItemAdminService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java index 181b0492e..0b323d92c 100644 --- a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java +++ b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java @@ -1,7 +1,6 @@ package com.gg.server.admin.item.service; import com.gg.server.admin.item.data.ItemAdminRepository; -import com.gg.server.admin.item.dto.ItemAdminDto; import com.gg.server.admin.item.dto.ItemHistoryResponseDto; import com.gg.server.admin.item.dto.ItemListResponseDto; import com.gg.server.admin.item.dto.ItemRequestDto; @@ -30,7 +29,6 @@ public void updateItem(Long itemId, ItemRequestDto createDto) { item.setIsVisible(false); Item newItem = new Item(createDto); - System.out.println(newItem); itemAdminRepository.save(newItem); } } From 488592ed4e453336538d859ce5d0e4e1df2910ca Mon Sep 17 00:00:00 2001 From: sion99 Date: Fri, 4 Aug 2023 15:17:25 +0900 Subject: [PATCH 030/273] =?UTF-8?q?[FEAT]=20GGBE-32=20=EC=83=81=ED=92=88?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/admin/item/controller/ItemAdminController.java | 6 ++++++ .../com/gg/server/admin/item/service/ItemAdminService.java | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java index e5b838cec..55264f672 100644 --- a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java +++ b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java @@ -33,4 +33,10 @@ public ResponseEntity updateItem(@PathVariable("itemId") Long itemId, @RequestBo return new ResponseEntity(HttpStatus.NO_CONTENT); } + + @DeleteMapping("/{itemId}") + public ResponseEntity deleteItem(@PathVariable("itemId") Long itemId) { + itemAdminService.deleteItem(itemId); + return new ResponseEntity(HttpStatus.NO_CONTENT); + } } diff --git a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java index 0b323d92c..d54cb280b 100644 --- a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java +++ b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java @@ -31,4 +31,10 @@ public void updateItem(Long itemId, ItemRequestDto createDto) { Item newItem = new Item(createDto); itemAdminRepository.save(newItem); } + + @Transactional + public void deleteItem(Long itemId) { + Item item = itemAdminRepository.findById(itemId).orElseThrow(()-> new ItemNotFoundException()); + item.setIsVisible(false); + } } From 83c4bd40e596b3cb54e3139ff100cb31f7282ad5 Mon Sep 17 00:00:00 2001 From: sion99 Date: Fri, 4 Aug 2023 15:17:31 +0900 Subject: [PATCH 031/273] =?UTF-8?q?[TEST]=20GGBE-32=20=EC=83=81=ED=92=88?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/controller/ItemAdminControllerTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java b/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java index 8b41ad21e..16f909165 100644 --- a/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java @@ -85,4 +85,15 @@ public void updateItemTest() throws Exception { .andReturn().getResponse().getContentAsString(); System.out.println(contentAsString); } + + @Test + @DisplayName("DELETE /pingpong/admin/items/{itemId}") + public void deleteItemTest() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + String contentAsString = mockMvc.perform(delete("/pingpong/admin/items/{itemId}", 1) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isNoContent()) + .andReturn().getResponse().getContentAsString(); + System.out.println(contentAsString); + } } \ No newline at end of file From d79c6a0b63a8e6084efbe8b60700e896f56fa6c0 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Sat, 5 Aug 2023 04:23:03 +0900 Subject: [PATCH 032/273] first commit --- .../item/controller/ItemController.java | 21 ++ .../domain/item/data/ItemRepository.java | 9 + .../item/dto/ItemStoreListResponseDto.java | 16 + .../domain/item/dto/ItemStoreResponseDto.java | 29 ++ .../domain/item/service/ItemService.java | 23 ++ .../domain/user/type/BackgroundType.java | 2 +- .../gg/server/domain/user/type/EdgeType.java | 2 +- .../db/migration/V2__migration_42gg_4th.sql | 12 +- .../ItemStoreListControllerTest.java | 308 ++++++++++++++++++ 9 files changed, 414 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/gg/server/domain/item/controller/ItemController.java create mode 100644 src/main/java/com/gg/server/domain/item/data/ItemRepository.java create mode 100644 src/main/java/com/gg/server/domain/item/dto/ItemStoreListResponseDto.java create mode 100644 src/main/java/com/gg/server/domain/item/dto/ItemStoreResponseDto.java create mode 100644 src/main/java/com/gg/server/domain/item/service/ItemService.java create mode 100644 src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java diff --git a/src/main/java/com/gg/server/domain/item/controller/ItemController.java b/src/main/java/com/gg/server/domain/item/controller/ItemController.java new file mode 100644 index 000000000..6a9b881ae --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/controller/ItemController.java @@ -0,0 +1,21 @@ +package com.gg.server.domain.item.controller; + +import com.gg.server.domain.item.dto.ItemStoreListResponseDto; +import com.gg.server.domain.item.service.ItemService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/pingpong/items") +public class ItemController { + + private final ItemService itemService; + + @GetMapping("/store") + public ItemStoreListResponseDto getAllItems() { + return itemService.getAllItems(); + } +} diff --git a/src/main/java/com/gg/server/domain/item/data/ItemRepository.java b/src/main/java/com/gg/server/domain/item/data/ItemRepository.java new file mode 100644 index 000000000..8c5d28ef3 --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/data/ItemRepository.java @@ -0,0 +1,9 @@ +package com.gg.server.domain.item.data; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ItemRepository extends JpaRepository { + List findAllByIsVisible(boolean isVisible); +} \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/item/dto/ItemStoreListResponseDto.java b/src/main/java/com/gg/server/domain/item/dto/ItemStoreListResponseDto.java new file mode 100644 index 000000000..702ac6950 --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/dto/ItemStoreListResponseDto.java @@ -0,0 +1,16 @@ +package com.gg.server.domain.item.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@NoArgsConstructor +@Getter +public class ItemStoreListResponseDto { + private List itemList; + + public ItemStoreListResponseDto(List itemList){ + this.itemList = itemList; + } +} diff --git a/src/main/java/com/gg/server/domain/item/dto/ItemStoreResponseDto.java b/src/main/java/com/gg/server/domain/item/dto/ItemStoreResponseDto.java new file mode 100644 index 000000000..fd395b641 --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/dto/ItemStoreResponseDto.java @@ -0,0 +1,29 @@ +package com.gg.server.domain.item.dto; + +import com.gg.server.domain.item.data.Item; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class ItemStoreResponseDto { + private Long itemId; + private String itemName; + private String content; + private String imageUrl; + private Integer originalPrice; + private Integer discount; + private Integer salePrice; + + public ItemStoreResponseDto(Item item) { + this.itemId = item.getId(); + this.itemName = item.getName(); + this.content = item.getContent(); + this.imageUrl = item.getImageUri(); + this.originalPrice = item.getPrice(); + this.discount = item.getDiscount(); + this.salePrice = this.originalPrice - (this.originalPrice * this.discount / 100); + } +} diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java new file mode 100644 index 000000000..bfc5cfe78 --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -0,0 +1,23 @@ +package com.gg.server.domain.item.service; + +import com.gg.server.domain.item.data.ItemRepository; +import com.gg.server.domain.item.dto.ItemStoreListResponseDto; +import com.gg.server.domain.item.dto.ItemStoreResponseDto; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class ItemService { + + private final ItemRepository itemRepository; + + public ItemStoreListResponseDto getAllItems() { + List itemStoreListResponseDto = itemRepository.findAllByIsVisible(true) + .stream().map(ItemStoreResponseDto::new).collect(Collectors.toList()); + return new ItemStoreListResponseDto(itemStoreListResponseDto); + } +} diff --git a/src/main/java/com/gg/server/domain/user/type/BackgroundType.java b/src/main/java/com/gg/server/domain/user/type/BackgroundType.java index a1010daa3..c2fcc8aaa 100644 --- a/src/main/java/com/gg/server/domain/user/type/BackgroundType.java +++ b/src/main/java/com/gg/server/domain/user/type/BackgroundType.java @@ -4,7 +4,7 @@ @RequiredArgsConstructor public enum BackgroundType { - COLOR1(0, "color1"), + BASIC(0, "basic"), COLOR2(1, "color2"), COLOR3(2, "color3"); diff --git a/src/main/java/com/gg/server/domain/user/type/EdgeType.java b/src/main/java/com/gg/server/domain/user/type/EdgeType.java index 8bc218d84..0da8878d3 100644 --- a/src/main/java/com/gg/server/domain/user/type/EdgeType.java +++ b/src/main/java/com/gg/server/domain/user/type/EdgeType.java @@ -4,7 +4,7 @@ @RequiredArgsConstructor public enum EdgeType { - COLOR1(0, "color1"), + BASIC(0, "basic"), COLOR2(1, "color2"), COLOR3(2, "color3"); diff --git a/src/main/resources/db/migration/V2__migration_42gg_4th.sql b/src/main/resources/db/migration/V2__migration_42gg_4th.sql index 2f01fdb53..04c56121c 100644 --- a/src/main/resources/db/migration/V2__migration_42gg_4th.sql +++ b/src/main/resources/db/migration/V2__migration_42gg_4th.sql @@ -12,11 +12,11 @@ create table coin_policy ( id bigint not null auto_increment, user_id bigint, - attendance bigint, + attendance integer, created_at datetime(6) not null, - normal bigint, - rank_lose bigint, - rank_win bigint, + normal integer, + rank_lose integer, + rank_win integer, primary key (id) ); @@ -65,10 +65,10 @@ create table tier ); alter table user - add column background varchar(255) default "basic"; + add column background varchar(255) default "BASIC"; alter table user - add column edge varchar(255) default "basic"; + add column edge varchar(255) default "BASIC"; alter table user add column gg_coin integer default 0; diff --git a/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java b/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java new file mode 100644 index 000000000..b635a8edb --- /dev/null +++ b/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java @@ -0,0 +1,308 @@ +//package com.gg.server.domain.item.controller; +// +//import org.springframework.boot.test.context.SpringBootTest; +// +////import javax.transaction.Transactional; +//// +////@SpringBootTest +////@Transactional +////public class ItemStoreListControllerTest { +////} +// +// +//import com.gg.server.domain.item.dto.ItemStoreListReponseDto; +//import com.gg.server.domain.item.service.ItemService; +//import com.fasterxml.jackson.databind.ObjectMapper; +//import org.junit.jupiter.api.Test; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +//import org.springframework.boot.test.context.SpringBootTest; +//import org.springframework.test.web.servlet.MockMvc; +//import org.springframework.boot.test.mock.mockito.MockBean; +//import static org.assertj.core.api.Assertions.*; +//import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +// +//import java.util.Arrays; +//import java.util.List; +// +//import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +//import static org.mockito.BDDMockito.*; +// +//@SpringBootTest +//@AutoConfigureMockMvc +//public class ItemStoreControllerTest { +// +// @Autowired +// private MockMvc mockMvc; +// +// @MockBean +// private ItemService itemService; +// +// @Test +// public void getAllItemsTest() throws Exception { +// // given +// ItemStoreListReponseDto itemDto = new ItemStoreListReponseDto(1L, "testItem", "testContent", "testImageUri", 100, 10, 90); +// List items = Arrays.asList(itemDto); +// given(itemService.getAllItems()).willReturn(items); +// +// // when +// String result = this.mockMvc.perform(get("/pingpong/items/store")) +// .andDo(print()) +// .andReturn() +// .getResponse() +// .getContentAsString(); +// +// // then +// assertThat(result).isEqualTo("[{\"itemId\":1,\"itemName\":\"testItem\",\"content\":\"testContent\",\"imageUrl\":\"testImageUri\",\"originalPrice\":100,\"discount\":10,\"salePrice\":90}]"); +// } +//} +// +// +// +// +/////////////////////////////////////////////////////////////////////// +//// +//// import com.fasterxml.jackson.databind.ObjectMapper; +//// import com.gg.server.admin.item.data.ItemAdminRepository; +//// import com.gg.server.admin.item.dto.ItemListResponseDto; +//// import com.gg.server.admin.item.service.ItemAdminService; +//// import com.gg.server.domain.user.data.UserRepository; +//// import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +//// import com.gg.server.utils.TestDataUtils; +//// import org.apache.http.HttpHeaders; +//// import org.junit.jupiter.api.DisplayName; +//// import org.junit.jupiter.api.Test; +//// import org.springframework.beans.factory.annotation.Autowired; +//// import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +//// import org.springframework.boot.test.context.SpringBootTest; +//// import org.springframework.data.domain.PageRequest; +//// import org.springframework.data.domain.Pageable; +//// import org.springframework.data.domain.Sort; +//// import org.springframework.test.web.servlet.MockMvc; +//// import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; +//// +//// +//// import javax.transaction.Transactional; +//// +//// import static org.assertj.core.api.Assertions.assertThat; +//// import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +//// +////@SpringBootTest +////@AutoConfigureMockMvc +////@Transactional +////class ItemAdminControllerTest { +//// @Autowired +//// ItemAdminService itemAdminService; +//// @Autowired +//// UserRepository userRepository; +//// @Autowired +//// TestDataUtils testDataUtils; +//// @Autowired +//// ObjectMapper objectMapper; +//// @Autowired +//// AuthTokenProvider tokenProvider; +//// @Autowired +//// ItemAdminRepository itemAdminRepository; +//// @Autowired +//// MockMvc mockMvc; +//// +//// @Test +//// @DisplayName("GET /pingpong/admin/items/history") +//// public void getAllItemHistoryTest() throws Exception { +//// String accessToken = testDataUtils.getAdminLoginAccessToken(); +//// Integer page = 1; +//// Integer size = 20; +//// String url = "/pingpong/admin/items/history?page=" + page + "&size=" + size; +//// Pageable pageable = PageRequest.of(page - 1, size, Sort.by("createdAt").descending()); +//// +//// String contentAsString = mockMvc.perform(get(url) +//// .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) +//// .andExpect(status().isOk()) +//// .andReturn().getResponse().getContentAsString(); +//// +//// System.out.println(contentAsString); +//// ItemListResponseDto expect = itemAdminService.getAllItemHistory(pageable); +//// ItemListResponseDto result = objectMapper.readValue(contentAsString, ItemListResponseDto.class); +//// System.out.println(expect.getHistoryList()); +//// System.out.println(result.getHistoryList()); +//// assertThat(result.getHistoryList().get(0).getItemId()); +//// assertThat(result.getHistoryList().get(0).getName()); +//// assertThat(result.getHistoryList().get(0).getContent()); +//// assertThat(result.getHistoryList().get(0).getPrice()); +//// } +////} +package com.gg.server.domain.item.controller; + +import com.gg.server.domain.item.data.ItemRepository; +import com.gg.server.domain.item.dto.ItemStoreListResponseDto; +import com.gg.server.domain.item.dto.ItemStoreResponseDto; +import com.gg.server.domain.item.service.ItemService; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import lombok.RequiredArgsConstructor; +import org.apache.http.HttpHeaders; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +//import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.boot.test.mock.mockito.MockBean; +//import org.springframework.web.bind.annotation.GetMapping; +import static org.assertj.core.api.Assertions.assertThat; +import javax.transaction.Transactional; + +//import static org.assertj.core.api.Assertions.*; + +import java.util.Arrays; +import java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.mockito.Mockito.when; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +//import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; +//import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; + +//import java.util.Arrays; +//import java.util.List; + +//import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +//import static org.mockito.BDDMockito.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RequiredArgsConstructor +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +class ItemStoreListControllerTest { + + @Autowired + TestDataUtils testDataUtils; + + @Autowired + AuthTokenProvider tokenProvider; + + @Autowired + ObjectMapper objectMapper; + + @Autowired + private MockMvc mockMvc; + + @Autowired + ItemRepository itemRepository; + + @MockBean + private ItemService itemService; + + @Test + @DisplayName("[Get]/pingpong/items/store") + public void getAllItemsTest() throws Exception { + + String accessToken = testDataUtils.getLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + System.out.println(userId); + + + List testItems = Arrays.asList( + new ItemStoreResponseDto(1L, "Expected Name 1", "Expected Content 1", "Expected ImageUrl 1", 1000, 10, 900), + new ItemStoreResponseDto(2L, "Expected Name 2", "Expected Content 2", "Expected ImageUrl 2", 2000, 20, 1800), + new ItemStoreResponseDto(3L, "Expected Name 3", "Expected Content 3", "Expected ImageUrl 3", 3000, 30, 2700) + ); + + ItemStoreListResponseDto testResponse = new ItemStoreListResponseDto(testItems); + when(itemService.getAllItems()).thenReturn(testResponse); + + String url = "/pingpong/items/store"; + String contentAsString = mockMvc.perform(get(url) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + + ItemStoreListResponseDto result = objectMapper.readValue(contentAsString, ItemStoreListResponseDto.class); + //List result = objectMapper.readValue(contentAsString, new TypeReference>() { + // } + // ItemStoreListReponseDto result = objectMapper.readValue(contentAsString, ItemStoreListReponseDto); + +// for (ItemStoreResponseDto item : result.getItemStoreReponseDtos()) { +// System.out.println(item); +// } + + + assertThat(result.getItems()).isNotNull(); + +// for (ItemStoreResponseDto item : result.getItems()) { // 수정된 부분 +// System.out.println(item); +// } + + + assertThat(result.getItems()).hasSize(testItems.size()); + for (int i = 0; i < result.getItems().size(); i++) { + ItemStoreResponseDto actual = result.getItems().get(i); + ItemStoreResponseDto expected = testItems.get(i); + + assertThat(actual.getItemId()).isEqualTo(expected.getItemId()); + assertThat(actual.getItemName()).isEqualTo(expected.getItemName()); + assertThat(actual.getContent()).isEqualTo(expected.getContent()); +// assertThat(actual.getImageUrl()).isEqualTo(expected.getImageUrl()); + assertThat(actual.getOriginalPrice()).isEqualTo(expected.getOriginalPrice()); + assertThat(actual.getDiscount()).isEqualTo(expected.getDiscount()); + assertThat(actual.getSalePrice()).isEqualTo(expected.getSalePrice()); + } + + System.out.println(objectMapper.writeValueAsString(result)); + } +} + +// assertThat(result.size()).isBetween(0, 5); +// +// ItemStoreListReponseDto first = result.get(0); +// assertThat(first.getItemId()).isEqualTo(expectedItemId); +// assertThat(first.getItemName()).isEqualTo(expectedItemName); +// assertThat(first.getContent()).isEqualTo(expectedContent); +// assertThat(first.getImageUrl()).isEqualTo(expectedImageUrl); +// assertThat(first.getOriginalPrice()).isEqualTo(expectedOriginalPrice); +// assertThat(first.getDiscount()).isEqualTo(expectedDiscount); +// assertThat(first.getSalePrice()).isEqualTo(expectedSalePrice); +// +// +// for (ItemStoreListReponseDto item : result) { +// assertThat(item.getItemId()).isNotNull(); +// assertThat(item.getItemName()).isNotEmpty(); +// assertThat(item.getContent()).isNotEmpty(); +// assertThat(item.getImageUrl()).isNotEmpty(); +// assertThat(item.getOriginalPrice()).isGreaterThan(0); +// assertThat(item.getDiscount()).isBetween(0, 100); +// assertThat(item.getSalePrice()).isLessThanOrEqualTo(item.getOriginalPrice()); +// } + +// JavaType = List; +// List result = objectMapper.readValue(contentAsString, JavaType); +// for (ItemStoreListReponseDto item : result) { +// System.out.println(item); +// } +// List studentList +// = objectMapper.readValue(jsonArrStr, new TypeReference>() {}) +// assertThat(result.size()).isEqualTo(1); +// assertThat(result.get(0).getItemId()).isEqualTo(itemDto.getItemId()); +// assertThat(result.get(0).getItemName()).isEqualTo(itemDto.getItemName()); + + //ItemStoreListReponseDto +// } +// // given +// ItemStoreListReponseDto itemDto = new ItemStoreListReponseDto(1L, "testItem", "testContent", "testImageUri", 100, 10, 90); +// List items = Arrays.asList(itemDto); +// given(itemService.getAllItems()).willReturn(items); +// +// // when +// String result = this.mockMvc.perform(get("/pingpong/items/store")) +// .andDo(print()) +// .andReturn() +// .getResponse() +// .getContentAsString(); +// +// // then +// assertThat(result).isEqualTo("[{\"itemId\":1,\"itemName\":\"testItem\",\"content\":\"testContent\",\"imageUrl\":\"testImageUri\",\"originalPrice\":100,\"discount\":10,\"salePrice\":90}]"); +// } + From a81642292fb590d4417ed09ccf4051efe8996b38 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Sun, 6 Aug 2023 04:33:23 +0900 Subject: [PATCH 033/273] =?UTF-8?q?[FEAT]:=20item=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84,=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ItemStoreListControllerTest.java | 247 ++---------------- 1 file changed, 18 insertions(+), 229 deletions(-) diff --git a/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java b/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java index b635a8edb..72d9b5610 100644 --- a/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java +++ b/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java @@ -1,136 +1,3 @@ -//package com.gg.server.domain.item.controller; -// -//import org.springframework.boot.test.context.SpringBootTest; -// -////import javax.transaction.Transactional; -//// -////@SpringBootTest -////@Transactional -////public class ItemStoreListControllerTest { -////} -// -// -//import com.gg.server.domain.item.dto.ItemStoreListReponseDto; -//import com.gg.server.domain.item.service.ItemService; -//import com.fasterxml.jackson.databind.ObjectMapper; -//import org.junit.jupiter.api.Test; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -//import org.springframework.boot.test.context.SpringBootTest; -//import org.springframework.test.web.servlet.MockMvc; -//import org.springframework.boot.test.mock.mockito.MockBean; -//import static org.assertj.core.api.Assertions.*; -//import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -// -//import java.util.Arrays; -//import java.util.List; -// -//import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -//import static org.mockito.BDDMockito.*; -// -//@SpringBootTest -//@AutoConfigureMockMvc -//public class ItemStoreControllerTest { -// -// @Autowired -// private MockMvc mockMvc; -// -// @MockBean -// private ItemService itemService; -// -// @Test -// public void getAllItemsTest() throws Exception { -// // given -// ItemStoreListReponseDto itemDto = new ItemStoreListReponseDto(1L, "testItem", "testContent", "testImageUri", 100, 10, 90); -// List items = Arrays.asList(itemDto); -// given(itemService.getAllItems()).willReturn(items); -// -// // when -// String result = this.mockMvc.perform(get("/pingpong/items/store")) -// .andDo(print()) -// .andReturn() -// .getResponse() -// .getContentAsString(); -// -// // then -// assertThat(result).isEqualTo("[{\"itemId\":1,\"itemName\":\"testItem\",\"content\":\"testContent\",\"imageUrl\":\"testImageUri\",\"originalPrice\":100,\"discount\":10,\"salePrice\":90}]"); -// } -//} -// -// -// -// -/////////////////////////////////////////////////////////////////////// -//// -//// import com.fasterxml.jackson.databind.ObjectMapper; -//// import com.gg.server.admin.item.data.ItemAdminRepository; -//// import com.gg.server.admin.item.dto.ItemListResponseDto; -//// import com.gg.server.admin.item.service.ItemAdminService; -//// import com.gg.server.domain.user.data.UserRepository; -//// import com.gg.server.global.security.jwt.utils.AuthTokenProvider; -//// import com.gg.server.utils.TestDataUtils; -//// import org.apache.http.HttpHeaders; -//// import org.junit.jupiter.api.DisplayName; -//// import org.junit.jupiter.api.Test; -//// import org.springframework.beans.factory.annotation.Autowired; -//// import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -//// import org.springframework.boot.test.context.SpringBootTest; -//// import org.springframework.data.domain.PageRequest; -//// import org.springframework.data.domain.Pageable; -//// import org.springframework.data.domain.Sort; -//// import org.springframework.test.web.servlet.MockMvc; -//// import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; -//// -//// -//// import javax.transaction.Transactional; -//// -//// import static org.assertj.core.api.Assertions.assertThat; -//// import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -//// -////@SpringBootTest -////@AutoConfigureMockMvc -////@Transactional -////class ItemAdminControllerTest { -//// @Autowired -//// ItemAdminService itemAdminService; -//// @Autowired -//// UserRepository userRepository; -//// @Autowired -//// TestDataUtils testDataUtils; -//// @Autowired -//// ObjectMapper objectMapper; -//// @Autowired -//// AuthTokenProvider tokenProvider; -//// @Autowired -//// ItemAdminRepository itemAdminRepository; -//// @Autowired -//// MockMvc mockMvc; -//// -//// @Test -//// @DisplayName("GET /pingpong/admin/items/history") -//// public void getAllItemHistoryTest() throws Exception { -//// String accessToken = testDataUtils.getAdminLoginAccessToken(); -//// Integer page = 1; -//// Integer size = 20; -//// String url = "/pingpong/admin/items/history?page=" + page + "&size=" + size; -//// Pageable pageable = PageRequest.of(page - 1, size, Sort.by("createdAt").descending()); -//// -//// String contentAsString = mockMvc.perform(get(url) -//// .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) -//// .andExpect(status().isOk()) -//// .andReturn().getResponse().getContentAsString(); -//// -//// System.out.println(contentAsString); -//// ItemListResponseDto expect = itemAdminService.getAllItemHistory(pageable); -//// ItemListResponseDto result = objectMapper.readValue(contentAsString, ItemListResponseDto.class); -//// System.out.println(expect.getHistoryList()); -//// System.out.println(result.getHistoryList()); -//// assertThat(result.getHistoryList().get(0).getItemId()); -//// assertThat(result.getHistoryList().get(0).getName()); -//// assertThat(result.getHistoryList().get(0).getContent()); -//// assertThat(result.getHistoryList().get(0).getPrice()); -//// } -////} package com.gg.server.domain.item.controller; import com.gg.server.domain.item.data.ItemRepository; @@ -147,29 +14,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -//import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import org.springframework.boot.test.mock.mockito.MockBean; -//import org.springframework.web.bind.annotation.GetMapping; import static org.assertj.core.api.Assertions.assertThat; import javax.transaction.Transactional; - -//import static org.assertj.core.api.Assertions.*; - import java.util.Arrays; import java.util.List; - -import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.when; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; -//import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; -//import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; - -//import java.util.Arrays; -//import java.util.List; - -//import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -//import static org.mockito.BDDMockito.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @RequiredArgsConstructor @@ -200,109 +52,46 @@ class ItemStoreListControllerTest { @DisplayName("[Get]/pingpong/items/store") public void getAllItemsTest() throws Exception { - String accessToken = testDataUtils.getLoginAccessToken(); - Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); - System.out.println(userId); - - + //given List testItems = Arrays.asList( - new ItemStoreResponseDto(1L, "Expected Name 1", "Expected Content 1", "Expected ImageUrl 1", 1000, 10, 900), - new ItemStoreResponseDto(2L, "Expected Name 2", "Expected Content 2", "Expected ImageUrl 2", 2000, 20, 1800), - new ItemStoreResponseDto(3L, "Expected Name 3", "Expected Content 3", "Expected ImageUrl 3", 3000, 30, 2700) + new ItemStoreResponseDto(1L, "itemName 1", "Content 1", "ImageUrl 1", 1000, 10, 900), + new ItemStoreResponseDto(2L, "itemName 2", "Content 2", "ImageUrl 2", 2000, 20, 1800), + new ItemStoreResponseDto(3L, "itemName 3", "Content 3", "ImageUrl 3", 3000, 30, 2700) ); - ItemStoreListResponseDto testResponse = new ItemStoreListResponseDto(testItems); when(itemService.getAllItems()).thenReturn(testResponse); + String accessToken = testDataUtils.getLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + System.out.println(userId); String url = "/pingpong/items/store"; + + //when String contentAsString = mockMvc.perform(get(url) .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) .andExpect(status().isOk()) .andReturn().getResponse().getContentAsString(); + //then ItemStoreListResponseDto result = objectMapper.readValue(contentAsString, ItemStoreListResponseDto.class); - //List result = objectMapper.readValue(contentAsString, new TypeReference>() { - // } - // ItemStoreListReponseDto result = objectMapper.readValue(contentAsString, ItemStoreListReponseDto); - -// for (ItemStoreResponseDto item : result.getItemStoreReponseDtos()) { -// System.out.println(item); -// } - - - assertThat(result.getItems()).isNotNull(); + assertThat(result.getItemList()).isNotNull(); + assertThat(result.getItemList()).isNotEmpty(); + assertThat(result.getItemList()).hasSize(testItems.size()); -// for (ItemStoreResponseDto item : result.getItems()) { // 수정된 부분 -// System.out.println(item); -// } - - - assertThat(result.getItems()).hasSize(testItems.size()); - for (int i = 0; i < result.getItems().size(); i++) { - ItemStoreResponseDto actual = result.getItems().get(i); + for (int i = 0; i < result.getItemList().size(); i++) { + ItemStoreResponseDto actual = result.getItemList().get(i); ItemStoreResponseDto expected = testItems.get(i); assertThat(actual.getItemId()).isEqualTo(expected.getItemId()); assertThat(actual.getItemName()).isEqualTo(expected.getItemName()); assertThat(actual.getContent()).isEqualTo(expected.getContent()); -// assertThat(actual.getImageUrl()).isEqualTo(expected.getImageUrl()); + assertThat(actual.getImageUrl()).isEqualTo(expected.getImageUrl()); assertThat(actual.getOriginalPrice()).isEqualTo(expected.getOriginalPrice()); assertThat(actual.getDiscount()).isEqualTo(expected.getDiscount()); assertThat(actual.getSalePrice()).isEqualTo(expected.getSalePrice()); } - System.out.println(objectMapper.writeValueAsString(result)); +// System.out.println(objectMapper.writeValueAsString(result)); + System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(result)); } } - -// assertThat(result.size()).isBetween(0, 5); -// -// ItemStoreListReponseDto first = result.get(0); -// assertThat(first.getItemId()).isEqualTo(expectedItemId); -// assertThat(first.getItemName()).isEqualTo(expectedItemName); -// assertThat(first.getContent()).isEqualTo(expectedContent); -// assertThat(first.getImageUrl()).isEqualTo(expectedImageUrl); -// assertThat(first.getOriginalPrice()).isEqualTo(expectedOriginalPrice); -// assertThat(first.getDiscount()).isEqualTo(expectedDiscount); -// assertThat(first.getSalePrice()).isEqualTo(expectedSalePrice); -// -// -// for (ItemStoreListReponseDto item : result) { -// assertThat(item.getItemId()).isNotNull(); -// assertThat(item.getItemName()).isNotEmpty(); -// assertThat(item.getContent()).isNotEmpty(); -// assertThat(item.getImageUrl()).isNotEmpty(); -// assertThat(item.getOriginalPrice()).isGreaterThan(0); -// assertThat(item.getDiscount()).isBetween(0, 100); -// assertThat(item.getSalePrice()).isLessThanOrEqualTo(item.getOriginalPrice()); -// } - -// JavaType = List; -// List result = objectMapper.readValue(contentAsString, JavaType); -// for (ItemStoreListReponseDto item : result) { -// System.out.println(item); -// } -// List studentList -// = objectMapper.readValue(jsonArrStr, new TypeReference>() {}) -// assertThat(result.size()).isEqualTo(1); -// assertThat(result.get(0).getItemId()).isEqualTo(itemDto.getItemId()); -// assertThat(result.get(0).getItemName()).isEqualTo(itemDto.getItemName()); - - //ItemStoreListReponseDto -// } -// // given -// ItemStoreListReponseDto itemDto = new ItemStoreListReponseDto(1L, "testItem", "testContent", "testImageUri", 100, 10, 90); -// List items = Arrays.asList(itemDto); -// given(itemService.getAllItems()).willReturn(items); -// -// // when -// String result = this.mockMvc.perform(get("/pingpong/items/store")) -// .andDo(print()) -// .andReturn() -// .getResponse() -// .getContentAsString(); -// -// // then -// assertThat(result).isEqualTo("[{\"itemId\":1,\"itemName\":\"testItem\",\"content\":\"testContent\",\"imageUrl\":\"testImageUri\",\"originalPrice\":100,\"discount\":10,\"salePrice\":90}]"); -// } - From 41b55ee996286d3f388745e41adfdae4f41d9e26 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Sun, 6 Aug 2023 04:44:48 +0900 Subject: [PATCH 034/273] =?UTF-8?q?[FEAT]=20GGBE-29=20=EC=83=81=EC=A0=90?= =?UTF-8?q?=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/item/controller/ItemStoreListControllerTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java b/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java index 72d9b5610..5858dfc9b 100644 --- a/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java +++ b/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java @@ -91,7 +91,6 @@ public void getAllItemsTest() throws Exception { assertThat(actual.getSalePrice()).isEqualTo(expected.getSalePrice()); } -// System.out.println(objectMapper.writeValueAsString(result)); System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(result)); } } From 99a4f97b07981be51866deea22a0320cd39e5350 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Mon, 7 Aug 2023 11:06:52 +0900 Subject: [PATCH 035/273] =?UTF-8?q?[feat]=20GGBE4-45=20=EC=9E=AC=ED=99=94?= =?UTF-8?q?=EC=9D=B4=EB=A0=A5=20=EB=93=B1=EB=A1=9D=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=B4=88=EC=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coin/service/CoinHistoryService.java | 45 +++++++++++++++++++ .../server/domain/coin/type/HistoryType.java | 16 +++++++ .../coin/service/CoinHistoryServiceTest.java | 24 ++++++++++ 3 files changed, 85 insertions(+) create mode 100644 src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java create mode 100644 src/main/java/com/gg/server/domain/coin/type/HistoryType.java create mode 100644 src/test/java/com/gg/server/domain/coin/service/CoinHistoryServiceTest.java diff --git a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java new file mode 100644 index 000000000..ca0ed1594 --- /dev/null +++ b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java @@ -0,0 +1,45 @@ +package com.gg.server.domain.coin.service; + +import com.gg.server.domain.coin.data.CoinHistory; +import com.gg.server.domain.coin.data.CoinHistoryRepository; +import com.gg.server.domain.coin.data.CoinPolicyRepository; +import com.gg.server.domain.coin.type.HistoryType; +import com.gg.server.domain.user.data.User; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class CoinHistoryService { + private final CoinHistoryRepository coinHistoryRepository; + private final CoinPolicyRepository coinPolicyRepository; + + @Transactional + public void addAttendanceCoinHistory(User user) { + int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getAttendance(); + addCoinHistory(new CoinHistory(user, HistoryType.ATTENDANCECOIN.getHistory(), amount)); + } + + @Transactional + public void addNormalCoin(User user){ + int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getNormal(); + addCoinHistory(new CoinHistory(user, HistoryType.NORMAL.getHistory(), amount)); + } + + @Transactional + public void addRankWinCoin(User user){ + int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getNormal(); + addCoinHistory(new CoinHistory(user, HistoryType.RANKWIN.getHistory(), amount)); + } + + @Transactional + public void addRankLoseCoin(User user){ + int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getNormal(); + addCoinHistory(new CoinHistory(user, HistoryType.RANKLOSE.getHistory(), amount)); + } + + private void addCoinHistory(CoinHistory coinHistory){ + coinHistoryRepository.save(coinHistory); + } +} diff --git a/src/main/java/com/gg/server/domain/coin/type/HistoryType.java b/src/main/java/com/gg/server/domain/coin/type/HistoryType.java new file mode 100644 index 000000000..7b391b26b --- /dev/null +++ b/src/main/java/com/gg/server/domain/coin/type/HistoryType.java @@ -0,0 +1,16 @@ +package com.gg.server.domain.coin.type; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum HistoryType { + + ATTENDANCECOIN("출석 입니다."), + NORMAL("일반전 코인 획득"), + RANKWIN("랭크전 승리 코인 획득"), + RANKLOSE("랭크전 패배 코인 획득"); + + private final String history; +} diff --git a/src/test/java/com/gg/server/domain/coin/service/CoinHistoryServiceTest.java b/src/test/java/com/gg/server/domain/coin/service/CoinHistoryServiceTest.java new file mode 100644 index 000000000..0a5dcf825 --- /dev/null +++ b/src/test/java/com/gg/server/domain/coin/service/CoinHistoryServiceTest.java @@ -0,0 +1,24 @@ +package com.gg.server.domain.coin.service; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class CoinHistoryServiceTest { + + @Test + void addAttendanceCoinHistory() { + } + + @Test + void addNormalCoin() { + } + + @Test + void addRankWinCoin() { + } + + @Test + void addRankLoseCoin() { + } +} \ No newline at end of file From c7dbae5b0e133fc79d0014a3763665cd0df03d78 Mon Sep 17 00:00:00 2001 From: sion99 Date: Mon, 7 Aug 2023 15:17:39 +0900 Subject: [PATCH 036/273] =?UTF-8?q?[FEAT]=20GGBE-32=20flyway=20=EB=B2=84?= =?UTF-8?q?=EC=A0=84=20=EB=B3=80=EA=B2=BD=20v2.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/db/migration/V2.1__add_item_creator.sql | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/main/resources/db/migration/V2.1__add_item_creator.sql diff --git a/src/main/resources/db/migration/V2.1__add_item_creator.sql b/src/main/resources/db/migration/V2.1__add_item_creator.sql new file mode 100644 index 000000000..0d0c75c10 --- /dev/null +++ b/src/main/resources/db/migration/V2.1__add_item_creator.sql @@ -0,0 +1,5 @@ +alter table item + add column creator_intra_id varchar(10) NOT NULL; + +alter table item + add column deleter_intra_id varchar(10); From c21b56899c769d13c59721da226950b1d917c7f2 Mon Sep 17 00:00:00 2001 From: sion99 Date: Mon, 7 Aug 2023 15:19:07 +0900 Subject: [PATCH 037/273] =?UTF-8?q?[FEAT]=20Item=20Update,=20Delete=20API?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/controller/ItemAdminController.java | 9 ++++--- .../admin/item/dto/ItemDeleteRequestDto.java | 22 ++++++++++++++++ .../item/dto/ItemHistoryResponseDto.java | 6 +++++ ...uestDto.java => ItemUpdateRequestDto.java} | 6 ++++- .../admin/item/service/ItemAdminService.java | 12 +++++---- .../com/gg/server/domain/item/data/Item.java | 25 +++++++++++++------ .../controller/ItemAdminControllerTest.java | 5 +++- 7 files changed, 67 insertions(+), 18 deletions(-) create mode 100644 src/main/java/com/gg/server/admin/item/dto/ItemDeleteRequestDto.java rename src/main/java/com/gg/server/admin/item/dto/{ItemRequestDto.java => ItemUpdateRequestDto.java} (83%) diff --git a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java index 55264f672..fee93a6ea 100644 --- a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java +++ b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java @@ -1,7 +1,8 @@ package com.gg.server.admin.item.controller; +import com.gg.server.admin.item.dto.ItemDeleteRequestDto; import com.gg.server.admin.item.dto.ItemListResponseDto; -import com.gg.server.admin.item.dto.ItemRequestDto; +import com.gg.server.admin.item.dto.ItemUpdateRequestDto; import com.gg.server.admin.item.service.ItemAdminService; import com.gg.server.global.dto.PageRequestDto; import lombok.RequiredArgsConstructor; @@ -28,15 +29,15 @@ public ItemListResponseDto getItemHistory(@ModelAttribute @Valid PageRequestDto } @PutMapping("/{itemId}") - public ResponseEntity updateItem(@PathVariable("itemId") Long itemId, @RequestBody @Valid ItemRequestDto itemRequestDto) { + public ResponseEntity updateItem(@PathVariable("itemId") Long itemId, @RequestBody @Valid ItemUpdateRequestDto itemRequestDto) { itemAdminService.updateItem(itemId, itemRequestDto); return new ResponseEntity(HttpStatus.NO_CONTENT); } @DeleteMapping("/{itemId}") - public ResponseEntity deleteItem(@PathVariable("itemId") Long itemId) { - itemAdminService.deleteItem(itemId); + public ResponseEntity deleteItem(@PathVariable("itemId") Long itemId, @RequestBody @Valid ItemDeleteRequestDto itemDeleteRequestDto) { + itemAdminService.deleteItem(itemId, itemDeleteRequestDto); return new ResponseEntity(HttpStatus.NO_CONTENT); } } diff --git a/src/main/java/com/gg/server/admin/item/dto/ItemDeleteRequestDto.java b/src/main/java/com/gg/server/admin/item/dto/ItemDeleteRequestDto.java new file mode 100644 index 000000000..ed88004ea --- /dev/null +++ b/src/main/java/com/gg/server/admin/item/dto/ItemDeleteRequestDto.java @@ -0,0 +1,22 @@ +package com.gg.server.admin.item.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ItemDeleteRequestDto { + @NotNull(message = "plz. deleterIntraId") + private String deleterIntraId; + + @Override + public String toString() { + return "ItemDeleteRequestDto{" + + "name='" + deleterIntraId + '\'' + + '}'; + } +} diff --git a/src/main/java/com/gg/server/admin/item/dto/ItemHistoryResponseDto.java b/src/main/java/com/gg/server/admin/item/dto/ItemHistoryResponseDto.java index e82881ef0..cf04e5f46 100644 --- a/src/main/java/com/gg/server/admin/item/dto/ItemHistoryResponseDto.java +++ b/src/main/java/com/gg/server/admin/item/dto/ItemHistoryResponseDto.java @@ -19,6 +19,8 @@ public class ItemHistoryResponseDto { private Integer discount; private boolean isVisible; private LocalDateTime createdAt; + private String creatorIntraId; + private String deleterIntraId; public ItemHistoryResponseDto(Item item) { this.itemId = item.getId(); @@ -29,6 +31,8 @@ public ItemHistoryResponseDto(Item item) { this.discount = item.getDiscount(); this.isVisible = item.getIsVisible(); this.createdAt = item.getCreatedAt(); + this.creatorIntraId = item.getCreatorIntraId(); + this.deleterIntraId = item.getDeleterIntraId(); } @Override @@ -42,6 +46,8 @@ public String toString() { ", discount=" + discount + ", isVisible=" + isVisible + ", createdAt=" + createdAt + + ", creatorIntraId='" + creatorIntraId + '\'' + + ", deleterIntraId='" + deleterIntraId + '\'' + '}'; } } diff --git a/src/main/java/com/gg/server/admin/item/dto/ItemRequestDto.java b/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java similarity index 83% rename from src/main/java/com/gg/server/admin/item/dto/ItemRequestDto.java rename to src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java index a1e9668f7..156219979 100644 --- a/src/main/java/com/gg/server/admin/item/dto/ItemRequestDto.java +++ b/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java @@ -9,7 +9,7 @@ @Getter @NoArgsConstructor @AllArgsConstructor -public class ItemRequestDto { +public class ItemUpdateRequestDto { @NotNull(message = "plz. itemName") private String name; @@ -25,6 +25,9 @@ public class ItemRequestDto { @NotNull(message = "plz. discount") private Integer discount; + @NotNull(message = "plz. creatorIntraId") + private String creatorIntraId; + @Override public String toString() { return "ItemRequestDto{" + @@ -33,6 +36,7 @@ public String toString() { ", imageUri='" + imageUri + '\'' + ", price=" + price + ", discount=" + discount + + ", creator='" + creatorIntraId + '\'' + '}'; } } diff --git a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java index d54cb280b..68dbdab87 100644 --- a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java +++ b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java @@ -1,9 +1,10 @@ package com.gg.server.admin.item.service; import com.gg.server.admin.item.data.ItemAdminRepository; +import com.gg.server.admin.item.dto.ItemDeleteRequestDto; import com.gg.server.admin.item.dto.ItemHistoryResponseDto; import com.gg.server.admin.item.dto.ItemListResponseDto; -import com.gg.server.admin.item.dto.ItemRequestDto; +import com.gg.server.admin.item.dto.ItemUpdateRequestDto; import com.gg.server.admin.item.exception.ItemNotFoundException; import com.gg.server.domain.item.data.Item; import lombok.RequiredArgsConstructor; @@ -24,17 +25,18 @@ public ItemListResponseDto getAllItemHistory(Pageable pageable) { } @Transactional - public void updateItem(Long itemId, ItemRequestDto createDto) { + public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto) { Item item = itemAdminRepository.findById(itemId).orElseThrow(()-> new ItemNotFoundException()); item.setIsVisible(false); - - Item newItem = new Item(createDto); + item.setDeleterIntraId(itemUpdateRequestDto.getCreatorIntraId()); + Item newItem = new Item(itemUpdateRequestDto); itemAdminRepository.save(newItem); } @Transactional - public void deleteItem(Long itemId) { + public void deleteItem(Long itemId, ItemDeleteRequestDto itemDeleteRequestDto) { Item item = itemAdminRepository.findById(itemId).orElseThrow(()-> new ItemNotFoundException()); item.setIsVisible(false); + item.setDeleterIntraId(itemDeleteRequestDto.getDeleterIntraId()); } } diff --git a/src/main/java/com/gg/server/domain/item/data/Item.java b/src/main/java/com/gg/server/domain/item/data/Item.java index d6b717064..9dd2f5253 100644 --- a/src/main/java/com/gg/server/domain/item/data/Item.java +++ b/src/main/java/com/gg/server/domain/item/data/Item.java @@ -1,6 +1,6 @@ package com.gg.server.domain.item.data; -import com.gg.server.admin.item.dto.ItemRequestDto; +import com.gg.server.admin.item.dto.ItemUpdateRequestDto; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -43,6 +43,14 @@ public class Item { @Column(name = "created_at") private LocalDateTime createdAt; + @NotNull + @Column(name = "creator_intra_id", length = 10) + private String creatorIntraId; + + @Column(name = "deleter_intra_id", length = 10) + @Setter + private String deleterIntraId; + public Item(String name, String content, String imageUri, Integer price, Boolean isVisible, Integer discount, LocalDateTime createdAt) { this.name = name; @@ -55,13 +63,14 @@ public Item(String name, String content, String imageUri, Integer price, } @Builder - public Item(ItemRequestDto createDto) { - this.name = createDto.getName(); - this.content = createDto.getContent(); - this.imageUri = createDto.getImageUri(); - this.price = createDto.getPrice(); - this.discount = createDto.getDiscount(); + public Item(ItemUpdateRequestDto updateRequestDto) { + this.name = updateRequestDto.getName(); + this.content = updateRequestDto.getContent(); + this.imageUri = updateRequestDto.getImageUri(); + this.price = updateRequestDto.getPrice(); + this.discount = updateRequestDto.getDiscount(); this.isVisible = true; + this.creatorIntraId = updateRequestDto.getCreatorIntraId(); this.createdAt = LocalDateTime.now(); } @@ -76,6 +85,8 @@ public String toString() { ", isVisible=" + isVisible + ", discount=" + discount + ", createdAt=" + createdAt + + ", creatorIntraId='" + creatorIntraId + '\'' + + ", deleterIntraId='" + deleterIntraId + '\'' + '}'; } } \ No newline at end of file diff --git a/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java b/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java index 16f909165..15579f94e 100644 --- a/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java @@ -76,7 +76,7 @@ public void getAllItemHistoryTest() throws Exception { @DisplayName("PUT /pingpong/admin/items/history/{itemId}") public void updateItemTest() throws Exception { String accessToken = testDataUtils.getAdminLoginAccessToken(); - String requestJson = "{\"name\" : \"확성기\", \"content\" : \"testing\", \"imageUri\" : \"https://kakao.com\", \"price\" : 42, \"discount\" : 50}"; + String requestJson = "{\"name\" : \"확성기\", \"content\" : \"testing\", \"imageUri\" : \"https://kakao.com\", \"price\" : 42, \"discount\" : 50, \"creatorIntraId\" : \"cheolee\"}"; String contentAsString = mockMvc.perform(put("/pingpong/admin/items/{itemId}", 1) .contentType(MediaType.APPLICATION_JSON) .content(requestJson) @@ -90,7 +90,10 @@ public void updateItemTest() throws Exception { @DisplayName("DELETE /pingpong/admin/items/{itemId}") public void deleteItemTest() throws Exception { String accessToken = testDataUtils.getAdminLoginAccessToken(); + String requestJson = "{\"deleterIntraId\" : \"sishin\"}"; String contentAsString = mockMvc.perform(delete("/pingpong/admin/items/{itemId}", 1) + .contentType(MediaType.APPLICATION_JSON) + .content(requestJson) .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) .andExpect(status().isNoContent()) .andReturn().getResponse().getContentAsString(); From 279b0d5f913c6b0e1551a8d8927105e24bf788f7 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Mon, 7 Aug 2023 16:13:53 +0900 Subject: [PATCH 038/273] =?UTF-8?q?[test]=20GGBE4=20=EC=9E=AC=ED=99=94?= =?UTF-8?q?=EC=9D=B4=EB=A0=A5=20=EB=93=B1=EB=A1=9D=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=EC=B4=88=EC=95=88=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=99=84=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coin/data/CoinHistoryRepository.java | 3 + .../coin/service/CoinHistoryService.java | 2 +- .../coin/service/CoinHistoryServiceTest.java | 114 ++++++++++++++++++ 3 files changed, 118 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java b/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java index 47b78280a..e474fcd4d 100644 --- a/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java +++ b/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java @@ -6,10 +6,13 @@ import org.springframework.data.repository.query.Param; import java.time.LocalDateTime; +import java.util.List; public interface CoinHistoryRepository extends JpaRepository { @Query("SELECT CASE WHEN COUNT(ch) > 0 THEN true ELSE false END FROM CoinHistory ch WHERE ch.user = :user AND ch.history = :history AND ch.createdAt >= :startOfDay AND ch.createdAt <= :endOfDay") boolean existsCoinHistoryByUserAndHistoryAndCreatedAtToday(@Param("user") User user, @Param("history") String history, @Param("startOfDay") LocalDateTime startOfDay, @Param("endOfDay") LocalDateTime endOfDay); CoinHistory findFirstByOrderByIdDesc(); + + List findAllByUserOrderByIdDesc(User user); } diff --git a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java index ca0ed1594..e7c02b37b 100644 --- a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java +++ b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java @@ -17,7 +17,7 @@ public class CoinHistoryService { @Transactional public void addAttendanceCoinHistory(User user) { - int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getAttendance(); + int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getAttendance(); addCoinHistory(new CoinHistory(user, HistoryType.ATTENDANCECOIN.getHistory(), amount)); } diff --git a/src/test/java/com/gg/server/domain/coin/service/CoinHistoryServiceTest.java b/src/test/java/com/gg/server/domain/coin/service/CoinHistoryServiceTest.java index 0a5dcf825..a12549b07 100644 --- a/src/test/java/com/gg/server/domain/coin/service/CoinHistoryServiceTest.java +++ b/src/test/java/com/gg/server/domain/coin/service/CoinHistoryServiceTest.java @@ -1,24 +1,138 @@ package com.gg.server.domain.coin.service; +import com.gg.server.domain.coin.data.CoinHistory; +import com.gg.server.domain.coin.data.CoinHistoryRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; +@SpringBootTest +@RequiredArgsConstructor +@Transactional class CoinHistoryServiceTest { + @Autowired + TestDataUtils testDataUtils; + + @Autowired + AuthTokenProvider tokenProvider; + + @Autowired + CoinHistoryService coinHistoryService; + + @Autowired + CoinHistoryRepository coinHistoryRepository; + + @Autowired + UserRepository userRepository; @Test + @DisplayName("출석 재화이력 등록") void addAttendanceCoinHistory() { + String accessToken = testDataUtils.getLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + User user = userRepository.getById(userId); + + int beforeCoinHistoryCount = coinHistoryRepository.findAllByUserOrderByIdDesc(user).size(); + + coinHistoryService.addAttendanceCoinHistory(user); + + List afterCoinHistory = coinHistoryRepository.findAllByUserOrderByIdDesc(user); + + assertThat(beforeCoinHistoryCount).isEqualTo(afterCoinHistory.size() - 1); + + System.out.println(beforeCoinHistoryCount + " < " + afterCoinHistory.size()); + for(CoinHistory ch : afterCoinHistory){ + System.out.println("이력 : " + ch.getHistory()); + System.out.println("사용값 : " + ch.getAmount()); + System.out.println("사용자 : " + ch.getUser().getIntraId()); + System.out.println("생성날짜 : " + ch.getCreatedAt()); + } } @Test + @DisplayName("일반게임 재화이력 등록") void addNormalCoin() { + String accessToken = testDataUtils.getLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + User user = userRepository.getById(userId); + + int beforeCoinHistoryCount = coinHistoryRepository.findAllByUserOrderByIdDesc(user).size(); + + coinHistoryService.addNormalCoin(user); + + List afterCoinHistory = coinHistoryRepository.findAllByUserOrderByIdDesc(user); + + assertThat(beforeCoinHistoryCount).isEqualTo(afterCoinHistory.size() - 1); + + System.out.println(beforeCoinHistoryCount + " < " + afterCoinHistory.size()); + for(CoinHistory ch : afterCoinHistory){ + System.out.println("이력 : " + ch.getHistory()); + System.out.println("사용값 : " + ch.getAmount()); + System.out.println("사용자 : " + ch.getUser().getIntraId()); + System.out.println("생성날짜 : " + ch.getCreatedAt()); + } + + } @Test + @DisplayName("랭크게임 win 재화이력 등록") void addRankWinCoin() { + String accessToken = testDataUtils.getLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + User user = userRepository.getById(userId); + + int beforeCoinHistoryCount = coinHistoryRepository.findAllByUserOrderByIdDesc(user).size(); + + coinHistoryService.addRankWinCoin(user); + + List afterCoinHistory = coinHistoryRepository.findAllByUserOrderByIdDesc(user); + + assertThat(beforeCoinHistoryCount).isEqualTo(afterCoinHistory.size() - 1); + + System.out.println(beforeCoinHistoryCount + " < " + afterCoinHistory.size()); + for(CoinHistory ch : afterCoinHistory){ + System.out.println("이력 : " + ch.getHistory()); + System.out.println("사용값 : " + ch.getAmount()); + System.out.println("사용자 : " + ch.getUser().getIntraId()); + System.out.println("생성날짜 : " + ch.getCreatedAt()); + } } @Test + @DisplayName("랭크게임 lose 재화이력 등록") void addRankLoseCoin() { + String accessToken = testDataUtils.getLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + User user = userRepository.getById(userId); + + int beforeCoinHistoryCount = coinHistoryRepository.findAllByUserOrderByIdDesc(user).size(); + + coinHistoryService.addRankLoseCoin(user); + coinHistoryService.addRankLoseCoin(user); + + List afterCoinHistory = coinHistoryRepository.findAllByUserOrderByIdDesc(user); + + assertThat(beforeCoinHistoryCount).isEqualTo(afterCoinHistory.size() - 2); + + System.out.println(beforeCoinHistoryCount + " < " + afterCoinHistory.size()); + for(CoinHistory ch : afterCoinHistory){ + System.out.println("이력 : " + ch.getHistory()); + System.out.println("사용값 : " + ch.getAmount()); + System.out.println("사용자 : " + ch.getUser().getIntraId()); + System.out.println("생성날짜 : " + ch.getCreatedAt()); + } } } \ No newline at end of file From 5307b9fff0110ee2d1371b8483aa9d69f74798a6 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Tue, 8 Aug 2023 11:04:35 +0900 Subject: [PATCH 039/273] =?UTF-8?q?[fix]=20GGBE4=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=ED=98=B8=EC=B6=9C=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/coin/service/CoinHistoryService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java index e7c02b37b..94df6ad92 100644 --- a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java +++ b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java @@ -29,13 +29,13 @@ public void addNormalCoin(User user){ @Transactional public void addRankWinCoin(User user){ - int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getNormal(); + int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getRankWin(); addCoinHistory(new CoinHistory(user, HistoryType.RANKWIN.getHistory(), amount)); } @Transactional public void addRankLoseCoin(User user){ - int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getNormal(); + int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getRankLose(); addCoinHistory(new CoinHistory(user, HistoryType.RANKLOSE.getHistory(), amount)); } From 600ae6bdbe164f9960e6cd15cccce3ce7275c35f Mon Sep 17 00:00:00 2001 From: sion99 Date: Tue, 8 Aug 2023 15:08:07 +0900 Subject: [PATCH 040/273] =?UTF-8?q?[FEAT]=20Receipt=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=EC=9E=90=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ReceiptAdminController.java | 29 ++++++++++++++++ .../receipt/data/ReceiptAdminRepository.java | 10 ++++++ .../receipt/dto/ReceiptListResponseDto.java | 15 +++++++++ .../admin/receipt/dto/ReceiptResponseDto.java | 33 +++++++++++++++++++ .../receipt/service/ReceiptAdminService.java | 22 +++++++++++++ 5 files changed, 109 insertions(+) create mode 100644 src/main/java/com/gg/server/admin/receipt/controller/ReceiptAdminController.java create mode 100644 src/main/java/com/gg/server/admin/receipt/data/ReceiptAdminRepository.java create mode 100644 src/main/java/com/gg/server/admin/receipt/dto/ReceiptListResponseDto.java create mode 100644 src/main/java/com/gg/server/admin/receipt/dto/ReceiptResponseDto.java create mode 100644 src/main/java/com/gg/server/admin/receipt/service/ReceiptAdminService.java diff --git a/src/main/java/com/gg/server/admin/receipt/controller/ReceiptAdminController.java b/src/main/java/com/gg/server/admin/receipt/controller/ReceiptAdminController.java new file mode 100644 index 000000000..00de9eb49 --- /dev/null +++ b/src/main/java/com/gg/server/admin/receipt/controller/ReceiptAdminController.java @@ -0,0 +1,29 @@ +package com.gg.server.admin.receipt.controller; + +import com.gg.server.admin.receipt.dto.ReceiptListResponseDto; +import com.gg.server.admin.receipt.service.ReceiptAdminService; +import com.gg.server.global.dto.PageRequestDto; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/pingpong/admin/receipt") +public class ReceiptAdminController { + private final ReceiptAdminService receiptAdminService; + + @GetMapping("/list") + public ReceiptListResponseDto getReceiptList(@ModelAttribute @Valid PageRequestDto pageRequestDto) { + Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, pageRequestDto.getSize(), + Sort.by("purchasedAt").descending()); + return receiptAdminService.getAllReceipt(pageable); + } +} \ No newline at end of file diff --git a/src/main/java/com/gg/server/admin/receipt/data/ReceiptAdminRepository.java b/src/main/java/com/gg/server/admin/receipt/data/ReceiptAdminRepository.java new file mode 100644 index 000000000..7cb76480c --- /dev/null +++ b/src/main/java/com/gg/server/admin/receipt/data/ReceiptAdminRepository.java @@ -0,0 +1,10 @@ +package com.gg.server.admin.receipt.data; + +import com.gg.server.domain.receipt.data.Receipt; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ReceiptAdminRepository extends JpaRepository { + Page findAll(Pageable pageable); +} diff --git a/src/main/java/com/gg/server/admin/receipt/dto/ReceiptListResponseDto.java b/src/main/java/com/gg/server/admin/receipt/dto/ReceiptListResponseDto.java new file mode 100644 index 000000000..0127f3be3 --- /dev/null +++ b/src/main/java/com/gg/server/admin/receipt/dto/ReceiptListResponseDto.java @@ -0,0 +1,15 @@ +package com.gg.server.admin.receipt.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ReceiptListResponseDto { + List receiptList; + Integer totalPage; +} diff --git a/src/main/java/com/gg/server/admin/receipt/dto/ReceiptResponseDto.java b/src/main/java/com/gg/server/admin/receipt/dto/ReceiptResponseDto.java new file mode 100644 index 000000000..587820d45 --- /dev/null +++ b/src/main/java/com/gg/server/admin/receipt/dto/ReceiptResponseDto.java @@ -0,0 +1,33 @@ +package com.gg.server.admin.receipt.dto; + +import com.gg.server.domain.item.data.Item; +import com.gg.server.domain.receipt.data.Receipt; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ReceiptResponseDto { + private Long receiptId; + private LocalDateTime createdAt; + private String itemName; + private Integer itemPrice; + private String purchaserIntraId; + private String ownerIntraId; + private Enum itemStatusType; + + public ReceiptResponseDto(Receipt receipt) { + Item item = receipt.getItem(); + this.itemName = item.getName(); + this.itemPrice = item.getPrice() - (item.getPrice() * item.getDiscount() / 100); + this.receiptId = receipt.getId(); + this.createdAt = receipt.getPurchasedAt(); + this.purchaserIntraId = receipt.getPurchaserIntraId(); + this.ownerIntraId = receipt.getOwnerIntraId(); + this.itemStatusType = receipt.getStatus(); + } +} diff --git a/src/main/java/com/gg/server/admin/receipt/service/ReceiptAdminService.java b/src/main/java/com/gg/server/admin/receipt/service/ReceiptAdminService.java new file mode 100644 index 000000000..d261e9b9e --- /dev/null +++ b/src/main/java/com/gg/server/admin/receipt/service/ReceiptAdminService.java @@ -0,0 +1,22 @@ +package com.gg.server.admin.receipt.service; + +import com.gg.server.admin.receipt.data.ReceiptAdminRepository; +import com.gg.server.admin.receipt.dto.ReceiptListResponseDto; +import com.gg.server.admin.receipt.dto.ReceiptResponseDto; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class ReceiptAdminService { + private final ReceiptAdminRepository receiptAdminRepository; + + @Transactional(readOnly = true) + public ReceiptListResponseDto getAllReceipt(Pageable pageable) { + Page responseDtos = receiptAdminRepository.findAll(pageable).map(ReceiptResponseDto::new); + return new ReceiptListResponseDto(responseDtos.getContent(), responseDtos.getTotalPages()); + } +} From fe335bab3a6b0202e9b861ab04e5547c23c9dcb7 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Tue, 8 Aug 2023 15:10:03 +0900 Subject: [PATCH 041/273] [feat]GGBE4-14 getUserCoin Api --- .../user/controller/UserController.java | 7 +++++++ .../domain/user/dto/UserCoinResponseDto.java | 14 +++++++++++++ .../domain/user/service/UserCoinService.java | 20 +++++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 src/main/java/com/gg/server/domain/user/dto/UserCoinResponseDto.java create mode 100644 src/main/java/com/gg/server/domain/user/service/UserCoinService.java diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index 1e80033a9..2eda0edc6 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -8,6 +8,7 @@ import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.exception.UserTextColorException; import com.gg.server.domain.user.service.UserAuthenticationService; +import com.gg.server.domain.user.service.UserCoinService; import com.gg.server.domain.user.service.UserService; import com.gg.server.domain.user.service.UserTextColorCheckService; import com.gg.server.domain.user.type.OauthType; @@ -40,6 +41,7 @@ public class UserController { private final UserAuthenticationService userAuthenticationService; private final AppProperties appProperties; private final CookieUtil cookieUtil; + private final UserCoinService userCoinService; @PostMapping("/accesstoken") public ResponseEntity generateAccessToken(@RequestParam String refreshToken, HttpServletResponse response) { @@ -130,4 +132,9 @@ public void updateTextColor(@RequestBody @Valid UserTextColorDto textColorDto, @ public UserAttendanceResponseDto attendUser(@Parameter(hidden = true) @Login UserDto user) { return userService.attendUser(user.getId()); } + + @GetMapping("/coin") + public UserCoinResponseDto getUserCoin(@Parameter(hidden = true) @Login UserDto user) { + return userCoinService.getUserCoin(user.getIntraId()); + } } diff --git a/src/main/java/com/gg/server/domain/user/dto/UserCoinResponseDto.java b/src/main/java/com/gg/server/domain/user/dto/UserCoinResponseDto.java new file mode 100644 index 000000000..fa5e130ad --- /dev/null +++ b/src/main/java/com/gg/server/domain/user/dto/UserCoinResponseDto.java @@ -0,0 +1,14 @@ +package com.gg.server.domain.user.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@Getter +public class UserCoinResponseDto { + private int coin; + + public UserCoinResponseDto(int userCoin) { + this.coin = userCoin; + } +} diff --git a/src/main/java/com/gg/server/domain/user/service/UserCoinService.java b/src/main/java/com/gg/server/domain/user/service/UserCoinService.java new file mode 100644 index 000000000..687f678a8 --- /dev/null +++ b/src/main/java/com/gg/server/domain/user/service/UserCoinService.java @@ -0,0 +1,20 @@ +package com.gg.server.domain.user.service; + +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.dto.UserCoinResponseDto; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.domain.user.exception.UserNotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class UserCoinService { + private final UserRepository userRepository; + + public UserCoinResponseDto getUserCoin(String intraId) { + int userCoin = userRepository.findByIntraId(intraId).orElseThrow(() -> new UserNotFoundException()).getGgCoin(); + + return new UserCoinResponseDto(userCoin); + } +} From 196f25028c62ccc64fa01eddc34fe311233df349 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Tue, 8 Aug 2023 15:16:01 +0900 Subject: [PATCH 042/273] =?UTF-8?q?[REFACTOR]=20GGBE4-29=20=EC=83=81?= =?UTF-8?q?=EC=A0=90=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20API=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=ED=83=80=EC=9E=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/controller/ItemController.java | 2 ++ .../com/gg/server/domain/item/data/Item.java | 9 ++++++- .../domain/item/dto/ItemStoreResponseDto.java | 2 ++ .../gg/server/domain/item/type/ItemType.java | 27 +++++++++++++++++++ .../db/migration/V2.2__add_item_type.sql | 2 ++ .../ItemStoreListControllerTest.java | 7 ++--- 6 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/gg/server/domain/item/type/ItemType.java create mode 100644 src/main/resources/db/migration/V2.2__add_item_type.sql diff --git a/src/main/java/com/gg/server/domain/item/controller/ItemController.java b/src/main/java/com/gg/server/domain/item/controller/ItemController.java index 6a9b881ae..1bbeee96a 100644 --- a/src/main/java/com/gg/server/domain/item/controller/ItemController.java +++ b/src/main/java/com/gg/server/domain/item/controller/ItemController.java @@ -4,6 +4,7 @@ import com.gg.server.domain.item.service.ItemService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -18,4 +19,5 @@ public class ItemController { public ItemStoreListResponseDto getAllItems() { return itemService.getAllItems(); } + } diff --git a/src/main/java/com/gg/server/domain/item/data/Item.java b/src/main/java/com/gg/server/domain/item/data/Item.java index 9dd2f5253..430fb3049 100644 --- a/src/main/java/com/gg/server/domain/item/data/Item.java +++ b/src/main/java/com/gg/server/domain/item/data/Item.java @@ -1,6 +1,7 @@ package com.gg.server.domain.item.data; import com.gg.server.admin.item.dto.ItemUpdateRequestDto; +import com.gg.server.domain.item.type.ItemType; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -39,6 +40,11 @@ public class Item { @Column(name = "discount") private Integer discount; + @NotNull + @Enumerated(EnumType.STRING) + @Column(name = "type") + private ItemType type; + @NotNull @Column(name = "created_at") private LocalDateTime createdAt; @@ -52,13 +58,14 @@ public class Item { private String deleterIntraId; public Item(String name, String content, String imageUri, Integer price, - Boolean isVisible, Integer discount, LocalDateTime createdAt) { + Boolean isVisible, Integer discount, ItemType type, LocalDateTime createdAt) { this.name = name; this.content = content; this.imageUri = imageUri; this.price = price; this.isVisible = isVisible; this.discount = discount; + this.type = type; this.createdAt = createdAt; } diff --git a/src/main/java/com/gg/server/domain/item/dto/ItemStoreResponseDto.java b/src/main/java/com/gg/server/domain/item/dto/ItemStoreResponseDto.java index fd395b641..a2d119a15 100644 --- a/src/main/java/com/gg/server/domain/item/dto/ItemStoreResponseDto.java +++ b/src/main/java/com/gg/server/domain/item/dto/ItemStoreResponseDto.java @@ -12,6 +12,7 @@ public class ItemStoreResponseDto { private Long itemId; private String itemName; private String content; + private String itemType; private String imageUrl; private Integer originalPrice; private Integer discount; @@ -21,6 +22,7 @@ public ItemStoreResponseDto(Item item) { this.itemId = item.getId(); this.itemName = item.getName(); this.content = item.getContent(); + this.itemType = item.getType().getCode(); this.imageUrl = item.getImageUri(); this.originalPrice = item.getPrice(); this.discount = item.getDiscount(); diff --git a/src/main/java/com/gg/server/domain/item/type/ItemType.java b/src/main/java/com/gg/server/domain/item/type/ItemType.java new file mode 100644 index 000000000..15c793457 --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/type/ItemType.java @@ -0,0 +1,27 @@ +package com.gg.server.domain.item.type; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public enum ItemType { + MEGAPHONE(0, "megaphone"), + PROFILE_BACKGROUND(1, "profile_background"), + PROFILE_BAND(2, "profile_band"), + TEXT_COLOR(3, "text_color"), + PROFILE_IMAGE(4, "profile_image"); + + private final Integer value; + private final String code; + + public static ItemType of(String code) { + return ItemType.valueOf(code.toUpperCase()); + } + + public Integer getValue() { + return value; + } + + public String getCode() { + return code; + } +} diff --git a/src/main/resources/db/migration/V2.2__add_item_type.sql b/src/main/resources/db/migration/V2.2__add_item_type.sql new file mode 100644 index 000000000..d1a0ed5ca --- /dev/null +++ b/src/main/resources/db/migration/V2.2__add_item_type.sql @@ -0,0 +1,2 @@ +alter table item + add column type varchar(255) NOT NULL; \ No newline at end of file diff --git a/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java b/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java index 5858dfc9b..5dd39abe8 100644 --- a/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java +++ b/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java @@ -54,9 +54,9 @@ public void getAllItemsTest() throws Exception { //given List testItems = Arrays.asList( - new ItemStoreResponseDto(1L, "itemName 1", "Content 1", "ImageUrl 1", 1000, 10, 900), - new ItemStoreResponseDto(2L, "itemName 2", "Content 2", "ImageUrl 2", 2000, 20, 1800), - new ItemStoreResponseDto(3L, "itemName 3", "Content 3", "ImageUrl 3", 3000, 30, 2700) + new ItemStoreResponseDto(1L, "itemName 1", "Content 1", "MEGAPHONE", "ImageUrl 1", 1000, 10, 900), + new ItemStoreResponseDto(2L, "itemName 2", "Content 2", "PROFILE_IMAGE", "ImageUrl 2", 2000, 20, 1800), + new ItemStoreResponseDto(3L, "itemName 3", "Content 3", "TEXT_COLOR", "ImageUrl 3", 3000, 30, 2700) ); ItemStoreListResponseDto testResponse = new ItemStoreListResponseDto(testItems); when(itemService.getAllItems()).thenReturn(testResponse); @@ -85,6 +85,7 @@ public void getAllItemsTest() throws Exception { assertThat(actual.getItemId()).isEqualTo(expected.getItemId()); assertThat(actual.getItemName()).isEqualTo(expected.getItemName()); assertThat(actual.getContent()).isEqualTo(expected.getContent()); + assertThat(actual.getItemType()).isEqualTo(expected.getItemType()); assertThat(actual.getImageUrl()).isEqualTo(expected.getImageUrl()); assertThat(actual.getOriginalPrice()).isEqualTo(expected.getOriginalPrice()); assertThat(actual.getDiscount()).isEqualTo(expected.getDiscount()); From 24abca5ddc5bcd6764c6bb20ff7c2daa0aff6db1 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Tue, 8 Aug 2023 15:22:39 +0900 Subject: [PATCH 043/273] [test]GGBE4-14 getUserCoin api test --- .../user/controller/UserControllerTest.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java index e517e4fe7..2fa638ec2 100644 --- a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java +++ b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java @@ -1,6 +1,9 @@ package com.gg.server.domain.user.controller; import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.admin.feedback.dto.FeedbackListAdminResponseDto; +import com.gg.server.domain.announcement.data.Announcement; +import com.gg.server.domain.announcement.exception.AnnounceNotFoundException; import com.gg.server.domain.coin.data.CoinHistoryRepository; import com.gg.server.domain.coin.data.CoinPolicyRepository; import com.gg.server.domain.game.data.Game; @@ -19,6 +22,7 @@ import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.controller.dto.GameInfoDto; import com.gg.server.domain.user.dto.*; +import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.type.RacketType; import com.gg.server.domain.user.type.RoleType; import com.gg.server.domain.user.type.SnsType; @@ -371,4 +375,23 @@ public void updateTextColorTest() throws Exception { Assertions.fail("유저 업데이트 실패"); }); } + + @Test + @DisplayName("[get]/pingpong/users/coin") + public void getUserCoin() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + + String url = "/pingpong/users/coin"; + + String contentAsString = mockMvc.perform(get(url) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + + UserCoinResponseDto result = objectMapper.readValue(contentAsString, UserCoinResponseDto.class); + int userCoin = userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException()).getGgCoin(); + assertThat(result.getCoin()).isEqualTo(userCoin); + System.out.println(userCoin); + } } \ No newline at end of file From cd6e31563e266bcd53eb6efb4139d235cb9ea9e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Tue, 8 Aug 2023 16:17:48 +0900 Subject: [PATCH 044/273] =?UTF-8?q?[FEAT]=20GGBE4-10=20=EB=94=94=EB=B9=84?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/megaphone/data/Megaphone.java | 10 +++++----- .../db/migration/V2.2__add_megaphone_receiptId.sql | 7 +++++++ 2 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/db/migration/V2.2__add_megaphone_receiptId.sql diff --git a/src/main/java/com/gg/server/domain/megaphone/data/Megaphone.java b/src/main/java/com/gg/server/domain/megaphone/data/Megaphone.java index 43f8f1aab..a5715c44d 100644 --- a/src/main/java/com/gg/server/domain/megaphone/data/Megaphone.java +++ b/src/main/java/com/gg/server/domain/megaphone/data/Megaphone.java @@ -1,5 +1,6 @@ package com.gg.server.domain.megaphone.data; +import com.gg.server.domain.receipt.data.Receipt; import com.gg.server.domain.user.data.User; import lombok.AccessLevel; import lombok.Getter; @@ -22,10 +23,10 @@ public class Megaphone { @JoinColumn(name = "user_id") private User user; - /* @NotNull + @NotNull @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "receipt_id") - private Receipt receipt;*/ + private Receipt receipt; @Column(name = "content", length = 30) private String content; @@ -34,10 +35,9 @@ public class Megaphone { @Column(name = "used_at") private LocalDate usedAt; - //public Megaphone(User user, Receipt receipt, String content, LocalDate usedAt) { - public Megaphone(User user, String content, LocalDate usedAt) { + public Megaphone(User user, Receipt receipt, String content, LocalDate usedAt) { this.user = user; - //this.receipt = receipt; + this.receipt = receipt; this.content = content; this.usedAt = usedAt; } diff --git a/src/main/resources/db/migration/V2.2__add_megaphone_receiptId.sql b/src/main/resources/db/migration/V2.2__add_megaphone_receiptId.sql new file mode 100644 index 000000000..e740d7362 --- /dev/null +++ b/src/main/resources/db/migration/V2.2__add_megaphone_receiptId.sql @@ -0,0 +1,7 @@ +alter table megaphone + add column receipt_id bigint; + +alter table megaphone + add constraint fk_megaphone_receipt_receipt_id + foreign key (receipt_id) + references receipt (id); \ No newline at end of file From a2a99bc1955786e984be7497d4bf9e141fb34f03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Tue, 8 Aug 2023 16:20:11 +0900 Subject: [PATCH 045/273] =?UTF-8?q?[FEAT]=20GGBE4-10=20=ED=99=95=EC=84=B1?= =?UTF-8?q?=EA=B8=B0=20=EC=82=AC=EC=9A=A9=20api=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MegaphoneController.java | 27 ++++++++ .../megaphone/data/MegaphoneRepository.java | 10 +++ .../megaphone/dto/MegaphoneUseRequestDto.java | 14 ++++ .../exception/MegaphoneTimeException.java | 10 +++ .../megaphone/service/MegaphoneService.java | 65 +++++++++++++++++++ .../server/domain/receipt/data/Receipt.java | 10 +-- .../receipt/data/ReceiptRepository.java | 6 ++ .../exception/ItemStatusException.java | 8 +++ .../exception/ReceiptNotFoundException.java | 8 +++ .../exception/ReceiptNotOwnerException.java | 8 +++ .../domain/receipt/type/ItemStatus.java | 4 +- .../gg/server/global/exception/ErrorCode.java | 8 +++ 12 files changed, 170 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java create mode 100644 src/main/java/com/gg/server/domain/megaphone/data/MegaphoneRepository.java create mode 100644 src/main/java/com/gg/server/domain/megaphone/dto/MegaphoneUseRequestDto.java create mode 100644 src/main/java/com/gg/server/domain/megaphone/exception/MegaphoneTimeException.java create mode 100644 src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java create mode 100644 src/main/java/com/gg/server/domain/receipt/data/ReceiptRepository.java create mode 100644 src/main/java/com/gg/server/domain/receipt/exception/ItemStatusException.java create mode 100644 src/main/java/com/gg/server/domain/receipt/exception/ReceiptNotFoundException.java create mode 100644 src/main/java/com/gg/server/domain/receipt/exception/ReceiptNotOwnerException.java diff --git a/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java b/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java new file mode 100644 index 000000000..77731eac3 --- /dev/null +++ b/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java @@ -0,0 +1,27 @@ +package com.gg.server.domain.megaphone.controller; + +import com.gg.server.domain.megaphone.dto.MegaphoneUseRequestDto; +import com.gg.server.domain.megaphone.service.MegaphoneService; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.global.utils.argumentresolver.Login; +import io.swagger.v3.oas.annotations.Parameter; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/pingpong/megaphones") +public class MegaphoneController { + private final MegaphoneService megaphoneService; + + @PostMapping() + public ResponseEntity useMegaphone(@RequestBody @Valid MegaphoneUseRequestDto megaphoneUseRequestDto, + @Parameter(hidden = true) @Login UserDto user) { + megaphoneService.useMegaphone(megaphoneUseRequestDto, user); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + } +} diff --git a/src/main/java/com/gg/server/domain/megaphone/data/MegaphoneRepository.java b/src/main/java/com/gg/server/domain/megaphone/data/MegaphoneRepository.java new file mode 100644 index 000000000..07994db7e --- /dev/null +++ b/src/main/java/com/gg/server/domain/megaphone/data/MegaphoneRepository.java @@ -0,0 +1,10 @@ +package com.gg.server.domain.megaphone.data; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.time.LocalDate; +import java.util.List; + +public interface MegaphoneRepository extends JpaRepository { + List findAllByUsedAt(LocalDate date); +} diff --git a/src/main/java/com/gg/server/domain/megaphone/dto/MegaphoneUseRequestDto.java b/src/main/java/com/gg/server/domain/megaphone/dto/MegaphoneUseRequestDto.java new file mode 100644 index 000000000..d76510d71 --- /dev/null +++ b/src/main/java/com/gg/server/domain/megaphone/dto/MegaphoneUseRequestDto.java @@ -0,0 +1,14 @@ +package com.gg.server.domain.megaphone.dto; + +import lombok.Getter; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + +@Getter +public class MegaphoneUseRequestDto { + @NotNull + private Long receiptId; + @NotNull @Size(max = 30) + private String content; +} diff --git a/src/main/java/com/gg/server/domain/megaphone/exception/MegaphoneTimeException.java b/src/main/java/com/gg/server/domain/megaphone/exception/MegaphoneTimeException.java new file mode 100644 index 000000000..f11bd29f3 --- /dev/null +++ b/src/main/java/com/gg/server/domain/megaphone/exception/MegaphoneTimeException.java @@ -0,0 +1,10 @@ +package com.gg.server.domain.megaphone.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.BusinessException; + +public class MegaphoneTimeException extends BusinessException { + public MegaphoneTimeException() { + super("확성기 사용이 불가능한 시간입니다.", ErrorCode.MEGAPHONE_TIME); + } +} diff --git a/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java b/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java new file mode 100644 index 000000000..16730264b --- /dev/null +++ b/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java @@ -0,0 +1,65 @@ +package com.gg.server.domain.megaphone.service; + +import com.gg.server.domain.megaphone.data.Megaphone; +import com.gg.server.domain.megaphone.data.MegaphoneRepository; +import com.gg.server.domain.megaphone.dto.MegaphoneUseRequestDto; +import com.gg.server.domain.megaphone.exception.MegaphoneTimeException; +import com.gg.server.domain.megaphone.redis.MegaphoneRedis; +import com.gg.server.domain.megaphone.redis.MegaphoneRedisRepository; +import com.gg.server.domain.receipt.data.Receipt; +import com.gg.server.domain.receipt.data.ReceiptRepository; +import com.gg.server.domain.receipt.exception.ItemStatusException; +import com.gg.server.domain.receipt.exception.ReceiptNotFoundException; +import com.gg.server.domain.receipt.exception.ReceiptNotOwnerException; +import com.gg.server.domain.receipt.type.ItemStatus; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.dto.UserDto; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class MegaphoneService { + private final UserRepository userRepository; + private final ReceiptRepository receiptRepository; + private final MegaphoneRepository megaphoneRepository; + private final MegaphoneRedisRepository megaphoneRedisRepository; + + @Transactional + public void useMegaphone(MegaphoneUseRequestDto megaphoneUseRequestDto, UserDto user) { + User loginUser = userRepository.findById(user.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + user.getId())); + if (LocalTime.now().isAfter(LocalTime.of(23, 55)) || LocalTime.now().isBefore(LocalTime.of(0, 5))) { + throw new MegaphoneTimeException(); + } + Receipt receipt = receiptRepository.findById(megaphoneUseRequestDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); + if (!receipt.getOwnerIntraId().equals(user.getIntraId())) { + throw new ReceiptNotOwnerException(); + } + if (!receipt.getStatus().equals(ItemStatus.BEFORE)) { + throw new ItemStatusException(); + } + receipt.updateStatus(ItemStatus.WAITING); + Megaphone megaphone = new Megaphone(loginUser, receipt, megaphoneUseRequestDto.getContent(), LocalDate.now().plusDays(1)); + megaphoneRepository.save(megaphone); + } + + @Transactional + public void setMegaphoneList(LocalDate today) { + megaphoneRepository.findAllByUsedAt(today).forEach(megaphone -> megaphone.getReceipt().updateStatus(ItemStatus.USED)); + megaphoneRedisRepository.deleteAllMegaphone(); + List megaphones = megaphoneRepository.findAllByUsedAt(today.plusDays(1)); + for (Megaphone megaphone : megaphones) { + megaphone.getReceipt().updateStatus(ItemStatus.USING); + megaphoneRedisRepository.addMegaphone(new MegaphoneRedis(megaphone.getId(), megaphone.getUser().getIntraId(), megaphone.getContent(), + LocalDateTime.of(megaphone.getUsedAt(), LocalTime.of(0, 0)))); + } + } +} diff --git a/src/main/java/com/gg/server/domain/receipt/data/Receipt.java b/src/main/java/com/gg/server/domain/receipt/data/Receipt.java index 8a4047628..913fdbea0 100644 --- a/src/main/java/com/gg/server/domain/receipt/data/Receipt.java +++ b/src/main/java/com/gg/server/domain/receipt/data/Receipt.java @@ -41,7 +41,7 @@ public class Receipt { private LocalDateTime purchasedAt; public Receipt(Item item, String purchaserIntraId, String ownerIntraId, - ItemStatus status, LocalDateTime purchasedAt){ + ItemStatus status, LocalDateTime purchasedAt) { this.item = item; this.purchaserIntraId = purchaserIntraId; this.ownerIntraId = ownerIntraId; @@ -61,11 +61,7 @@ public String toString() { '}'; } - public void updateStatus() { - if (status == ItemStatus.BEFORE) { - this.status = ItemStatus.USING; - } else { - this.status = ItemStatus.USED; - } + public void updateStatus(ItemStatus status) { + this.status = status; } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/receipt/data/ReceiptRepository.java b/src/main/java/com/gg/server/domain/receipt/data/ReceiptRepository.java new file mode 100644 index 000000000..22463618d --- /dev/null +++ b/src/main/java/com/gg/server/domain/receipt/data/ReceiptRepository.java @@ -0,0 +1,6 @@ +package com.gg.server.domain.receipt.data; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ReceiptRepository extends JpaRepository { +} diff --git a/src/main/java/com/gg/server/domain/receipt/exception/ItemStatusException.java b/src/main/java/com/gg/server/domain/receipt/exception/ItemStatusException.java new file mode 100644 index 000000000..102c8f46f --- /dev/null +++ b/src/main/java/com/gg/server/domain/receipt/exception/ItemStatusException.java @@ -0,0 +1,8 @@ +package com.gg.server.domain.receipt.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.BusinessException; + +public class ItemStatusException extends BusinessException { + public ItemStatusException() {super("아이템 상태 오류입니다.", ErrorCode.RECEIPT_STATUS_NOT_MATCHED);} +} diff --git a/src/main/java/com/gg/server/domain/receipt/exception/ReceiptNotFoundException.java b/src/main/java/com/gg/server/domain/receipt/exception/ReceiptNotFoundException.java new file mode 100644 index 000000000..711812ea4 --- /dev/null +++ b/src/main/java/com/gg/server/domain/receipt/exception/ReceiptNotFoundException.java @@ -0,0 +1,8 @@ +package com.gg.server.domain.receipt.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.NotExistException; + +public class ReceiptNotFoundException extends NotExistException { + public ReceiptNotFoundException() {super("해당 거래내역이 없습니다.", ErrorCode.RECEIPT_NOT_FOUND);} +} diff --git a/src/main/java/com/gg/server/domain/receipt/exception/ReceiptNotOwnerException.java b/src/main/java/com/gg/server/domain/receipt/exception/ReceiptNotOwnerException.java new file mode 100644 index 000000000..6441cd4ef --- /dev/null +++ b/src/main/java/com/gg/server/domain/receipt/exception/ReceiptNotOwnerException.java @@ -0,0 +1,8 @@ +package com.gg.server.domain.receipt.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.ForbiddenException; + +public class ReceiptNotOwnerException extends ForbiddenException { + public ReceiptNotOwnerException() {super("아이템의 소유자가 아닙니다.", ErrorCode.RECEIPT_NOT_OWNER);} +} diff --git a/src/main/java/com/gg/server/domain/receipt/type/ItemStatus.java b/src/main/java/com/gg/server/domain/receipt/type/ItemStatus.java index dfec05b5e..e6ec3ef47 100644 --- a/src/main/java/com/gg/server/domain/receipt/type/ItemStatus.java +++ b/src/main/java/com/gg/server/domain/receipt/type/ItemStatus.java @@ -6,7 +6,9 @@ @Getter @RequiredArgsConstructor public enum ItemStatus { - BEFORE("before", "사용 전"), USING("using", "사용 중"), + BEFORE("before", "사용 전"), + WAITING("waiting", "사용 대기"), + USING("using", "사용 중"), USED("used", "사용 완료"); private final String code; diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index 470007e6a..c114ddf61 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -40,6 +40,14 @@ public enum ErrorCode { //item ITEM_NOT_FOUND(404, "IT100", "ITEM NOT FOUND"), + //receipt + RECEIPT_NOT_FOUND(404, "RC100", "RECEIPT NOT FOUND"), + RECEIPT_NOT_OWNER(403, "RC500", "RECEIPT NOT OWNER"), + RECEIPT_STATUS_NOT_MATCHED(400, "RC200", "RECEIPT STATUS NOT MATCHED"), + + //megaphone + MEGAPHONE_TIME(400, "ME100", "MEGAPHONE TIME"), + /** Penalty **/ PENALTY_NOT_FOUND(404, "PE100", "PENALTY NOT FOUND"), REDIS_PENALTY_USER_NOT_FOUND(404, "PE101", "REDIS PENALTY USER NOT FOUND"), From be789d426ad1bcaf0fa32afc3e273f9c4da529d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Tue, 8 Aug 2023 16:20:36 +0900 Subject: [PATCH 046/273] =?UTF-8?q?[FEAT]=20GGBE4-10=20=ED=99=95=EC=84=B1?= =?UTF-8?q?=EA=B8=B0=20redis=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../megaphone/redis/MegaphoneRedis.java | 28 +++++++++++++++++++ .../redis/MegaphoneRedisRepository.java | 28 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/main/java/com/gg/server/domain/megaphone/redis/MegaphoneRedis.java create mode 100644 src/main/java/com/gg/server/domain/megaphone/redis/MegaphoneRedisRepository.java diff --git a/src/main/java/com/gg/server/domain/megaphone/redis/MegaphoneRedis.java b/src/main/java/com/gg/server/domain/megaphone/redis/MegaphoneRedis.java new file mode 100644 index 000000000..2a7d72fd6 --- /dev/null +++ b/src/main/java/com/gg/server/domain/megaphone/redis/MegaphoneRedis.java @@ -0,0 +1,28 @@ +package com.gg.server.domain.megaphone.redis; + +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import org.springframework.data.redis.core.RedisHash; + +import javax.persistence.Id; +import java.time.LocalDateTime; + +@RedisHash("megaphone") +@Getter +@Builder +@AllArgsConstructor +public class MegaphoneRedis{ + @Id + private Long id; + private String intraId; + private String content; + + @JsonSerialize(using = LocalDateTimeSerializer.class) + @JsonDeserialize(using = LocalDateTimeDeserializer.class) + private LocalDateTime usedAt; +} diff --git a/src/main/java/com/gg/server/domain/megaphone/redis/MegaphoneRedisRepository.java b/src/main/java/com/gg/server/domain/megaphone/redis/MegaphoneRedisRepository.java new file mode 100644 index 000000000..ba44b798f --- /dev/null +++ b/src/main/java/com/gg/server/domain/megaphone/redis/MegaphoneRedisRepository.java @@ -0,0 +1,28 @@ +package com.gg.server.domain.megaphone.redis; + +import lombok.RequiredArgsConstructor; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Repository; + +import java.time.Duration; +import java.util.List; + + +@Repository +@RequiredArgsConstructor +public class MegaphoneRedisRepository { + private final RedisTemplate redisTemplate; + + public void addMegaphone(MegaphoneRedis megaphoneRedis) { + Duration duration = Duration.between(megaphoneRedis.getUsedAt(), megaphoneRedis.getUsedAt()); + redisTemplate.opsForValue().set("megaphone" + megaphoneRedis.getId(), megaphoneRedis, duration); + } + + public List getAllMegaphone() { + return redisTemplate.opsForValue().multiGet(redisTemplate.keys("megaphone*")); + } + + public void deleteAllMegaphone() { + redisTemplate.delete(redisTemplate.keys("megaphone*")); + } +} From cb06ce5008058a10587c26df57906bf14e70d553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Tue, 8 Aug 2023 16:20:47 +0900 Subject: [PATCH 047/273] =?UTF-8?q?[FEAT]=20GGBE4-10=20=ED=99=95=EC=84=B1?= =?UTF-8?q?=EA=B8=B0=20=EC=8A=A4=EC=BC=80=EC=A4=84=EB=9F=AC=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/scheduler/MegaphoneScheduler.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/com/gg/server/global/scheduler/MegaphoneScheduler.java diff --git a/src/main/java/com/gg/server/global/scheduler/MegaphoneScheduler.java b/src/main/java/com/gg/server/global/scheduler/MegaphoneScheduler.java new file mode 100644 index 000000000..e814d0981 --- /dev/null +++ b/src/main/java/com/gg/server/global/scheduler/MegaphoneScheduler.java @@ -0,0 +1,26 @@ +package com.gg.server.global.scheduler; + +import com.gg.server.domain.megaphone.service.MegaphoneService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.time.LocalDate; + +@Component +@Slf4j +public class MegaphoneScheduler extends AbstractScheduler { + private final MegaphoneService megaphoneService; + + public MegaphoneScheduler(MegaphoneService megaphoneService) { + this.megaphoneService = megaphoneService; + this.setCron("0 59 23 * * *"); + } + + @Override + public Runnable runnable() { + return () -> { + log.info("Set Megaphone List "); + megaphoneService.setMegaphoneList(LocalDate.now()); + }; + } +} From f7c51d36a196a8b8a3fc801831fe7af156dbf137 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Wed, 9 Aug 2023 09:41:14 +0900 Subject: [PATCH 048/273] =?UTF-8?q?[TEST]=20GGBE4-10=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/item/data/Item.java | 6 +- .../megaphone/data/MegaphoneRepository.java | 3 + .../megaphone/dto/MegaphoneUseRequestDto.java | 4 + .../controller/MegaphoneControllerTest.java | 78 +++++++++++++++++++ 4 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java diff --git a/src/main/java/com/gg/server/domain/item/data/Item.java b/src/main/java/com/gg/server/domain/item/data/Item.java index 9dd2f5253..d2463d9a1 100644 --- a/src/main/java/com/gg/server/domain/item/data/Item.java +++ b/src/main/java/com/gg/server/domain/item/data/Item.java @@ -1,10 +1,7 @@ package com.gg.server.domain.item.data; import com.gg.server.admin.item.dto.ItemUpdateRequestDto; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import lombok.*; import javax.persistence.*; import javax.validation.constraints.NotNull; @@ -13,6 +10,7 @@ @Entity @Getter @NoArgsConstructor +@AllArgsConstructor public class Item { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/gg/server/domain/megaphone/data/MegaphoneRepository.java b/src/main/java/com/gg/server/domain/megaphone/data/MegaphoneRepository.java index 07994db7e..70469bf41 100644 --- a/src/main/java/com/gg/server/domain/megaphone/data/MegaphoneRepository.java +++ b/src/main/java/com/gg/server/domain/megaphone/data/MegaphoneRepository.java @@ -7,4 +7,7 @@ public interface MegaphoneRepository extends JpaRepository { List findAllByUsedAt(LocalDate date); + + Megaphone findFirstByOrderByIdDesc(); + } diff --git a/src/main/java/com/gg/server/domain/megaphone/dto/MegaphoneUseRequestDto.java b/src/main/java/com/gg/server/domain/megaphone/dto/MegaphoneUseRequestDto.java index d76510d71..e090a27a9 100644 --- a/src/main/java/com/gg/server/domain/megaphone/dto/MegaphoneUseRequestDto.java +++ b/src/main/java/com/gg/server/domain/megaphone/dto/MegaphoneUseRequestDto.java @@ -1,11 +1,15 @@ package com.gg.server.domain.megaphone.dto; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; @Getter +@NoArgsConstructor +@AllArgsConstructor public class MegaphoneUseRequestDto { @NotNull private Long receiptId; diff --git a/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java b/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java new file mode 100644 index 000000000..3e3a3527e --- /dev/null +++ b/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java @@ -0,0 +1,78 @@ +package com.gg.server.domain.megaphone.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.domain.megaphone.data.Megaphone; +import com.gg.server.domain.megaphone.data.MegaphoneRepository; +import com.gg.server.domain.megaphone.dto.MegaphoneUseRequestDto; +import com.gg.server.domain.receipt.data.Receipt; +import com.gg.server.domain.receipt.data.ReceiptRepository; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.type.RacketType; +import com.gg.server.domain.user.type.RoleType; +import com.gg.server.domain.user.type.SnsType; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import lombok.RequiredArgsConstructor; +import org.apache.http.HttpHeaders; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RequiredArgsConstructor +@SpringBootTest +@AutoConfigureMockMvc +class MegaphoneControllerTest { + @Autowired + TestDataUtils testDataUtils; + + @Autowired + private MockMvc mockMvc; + + @Autowired + ObjectMapper objectMapper; + + @Autowired + AuthTokenProvider tokenProvider; + + @Autowired + MegaphoneRepository megaphoneRepository; + + @Autowired + ReceiptRepository receiptRepository; + + @Test + @Transactional + @DisplayName("[Post]/pingpong/megaphones") + void getAnnouncementList() throws Exception { + String intraId = "intra"; + String email = "email"; + String imageUrl = "imageUrl"; + User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, + SnsType.BOTH, RoleType.ADMIN); + String accessToken = tokenProvider.createToken(newUser.getId()); + // db에 저장해두고 테스트 + Receipt receipt = receiptRepository.findById(1L).get(); + MegaphoneUseRequestDto megaphoneUseRequestDto = new MegaphoneUseRequestDto(receipt.getId(), "test"); + String content = objectMapper.writeValueAsString(megaphoneUseRequestDto); + String url = "/pingpong/megaphones"; + + mockMvc.perform(post(url) + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().is2xxSuccessful()) + .andReturn().getResponse().getContentAsString(); + + Megaphone result = megaphoneRepository.findFirstByOrderByIdDesc(); + assertThat(result.getContent()).isEqualTo(megaphoneUseRequestDto.getContent()); + } +} \ No newline at end of file From 35c4fa1fdcef3f302e2f3dc6183af27b0e95c275 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Wed, 9 Aug 2023 09:54:07 +0900 Subject: [PATCH 049/273] =?UTF-8?q?[FIX]=20GGBE4-10=20flyway=20=EB=B2=84?= =?UTF-8?q?=EC=A0=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ..._megaphone_receiptId.sql => V2.3__add_megaphone_receiptId.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/db/migration/{V2.2__add_megaphone_receiptId.sql => V2.3__add_megaphone_receiptId.sql} (100%) diff --git a/src/main/resources/db/migration/V2.2__add_megaphone_receiptId.sql b/src/main/resources/db/migration/V2.3__add_megaphone_receiptId.sql similarity index 100% rename from src/main/resources/db/migration/V2.2__add_megaphone_receiptId.sql rename to src/main/resources/db/migration/V2.3__add_megaphone_receiptId.sql From 2621ca0afb89e168e2f1ad0b46cb702172871156 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Wed, 9 Aug 2023 11:40:59 +0900 Subject: [PATCH 050/273] =?UTF-8?q?[REFACTOR]=20GGBE4-29=20=EC=83=81?= =?UTF-8?q?=EC=A0=90=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20API=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20Type=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/controller/ItemController.java | 6 ++---- .../domain/item/dto/ItemStoreResponseDto.java | 6 +++--- .../domain/item/service/ItemService.java | 2 +- .../gg/server/domain/item/type/ItemType.java | 20 +------------------ .../ItemStoreListControllerTest.java | 2 +- 5 files changed, 8 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/gg/server/domain/item/controller/ItemController.java b/src/main/java/com/gg/server/domain/item/controller/ItemController.java index 1bbeee96a..9df41603e 100644 --- a/src/main/java/com/gg/server/domain/item/controller/ItemController.java +++ b/src/main/java/com/gg/server/domain/item/controller/ItemController.java @@ -3,10 +3,7 @@ import com.gg.server.domain.item.dto.ItemStoreListResponseDto; import com.gg.server.domain.item.service.ItemService; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @RequiredArgsConstructor @@ -21,3 +18,4 @@ public ItemStoreListResponseDto getAllItems() { } } + diff --git a/src/main/java/com/gg/server/domain/item/dto/ItemStoreResponseDto.java b/src/main/java/com/gg/server/domain/item/dto/ItemStoreResponseDto.java index a2d119a15..db64f9ab8 100644 --- a/src/main/java/com/gg/server/domain/item/dto/ItemStoreResponseDto.java +++ b/src/main/java/com/gg/server/domain/item/dto/ItemStoreResponseDto.java @@ -13,7 +13,7 @@ public class ItemStoreResponseDto { private String itemName; private String content; private String itemType; - private String imageUrl; + private String imageUri; private Integer originalPrice; private Integer discount; private Integer salePrice; @@ -22,8 +22,8 @@ public ItemStoreResponseDto(Item item) { this.itemId = item.getId(); this.itemName = item.getName(); this.content = item.getContent(); - this.itemType = item.getType().getCode(); - this.imageUrl = item.getImageUri(); + this.itemType = item.getType().toString(); + this.imageUri = item.getImageUri(); this.originalPrice = item.getPrice(); this.discount = item.getDiscount(); this.salePrice = this.originalPrice - (this.originalPrice * this.discount / 100); diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index bfc5cfe78..5bc7c1c95 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -20,4 +20,4 @@ public ItemStoreListResponseDto getAllItems() { .stream().map(ItemStoreResponseDto::new).collect(Collectors.toList()); return new ItemStoreListResponseDto(itemStoreListResponseDto); } -} +} \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/item/type/ItemType.java b/src/main/java/com/gg/server/domain/item/type/ItemType.java index 15c793457..939e70ba5 100644 --- a/src/main/java/com/gg/server/domain/item/type/ItemType.java +++ b/src/main/java/com/gg/server/domain/item/type/ItemType.java @@ -4,24 +4,6 @@ @RequiredArgsConstructor public enum ItemType { - MEGAPHONE(0, "megaphone"), - PROFILE_BACKGROUND(1, "profile_background"), - PROFILE_BAND(2, "profile_band"), - TEXT_COLOR(3, "text_color"), - PROFILE_IMAGE(4, "profile_image"); + MEGAPHONE, PROFILE_BACKGROUND, PROFILE_BAND, TEXT_COLOR, PROFILE_IMAGE; - private final Integer value; - private final String code; - - public static ItemType of(String code) { - return ItemType.valueOf(code.toUpperCase()); - } - - public Integer getValue() { - return value; - } - - public String getCode() { - return code; - } } diff --git a/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java b/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java index 5dd39abe8..1cc8012c2 100644 --- a/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java +++ b/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java @@ -86,7 +86,7 @@ public void getAllItemsTest() throws Exception { assertThat(actual.getItemName()).isEqualTo(expected.getItemName()); assertThat(actual.getContent()).isEqualTo(expected.getContent()); assertThat(actual.getItemType()).isEqualTo(expected.getItemType()); - assertThat(actual.getImageUrl()).isEqualTo(expected.getImageUrl()); + assertThat(actual.getImageUri()).isEqualTo(expected.getImageUri()); assertThat(actual.getOriginalPrice()).isEqualTo(expected.getOriginalPrice()); assertThat(actual.getDiscount()).isEqualTo(expected.getDiscount()); assertThat(actual.getSalePrice()).isEqualTo(expected.getSalePrice()); From 0b089c2b30abca33e1a2fcedca1347e3dacda62b Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Wed, 9 Aug 2023 11:42:06 +0900 Subject: [PATCH 051/273] =?UTF-8?q?[STYLE]=20GGBE4-29=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=84=B8=EB=AF=B8=EC=BD=9C=EB=A1=A0=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gg/server/domain/item/type/ItemType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/item/type/ItemType.java b/src/main/java/com/gg/server/domain/item/type/ItemType.java index 939e70ba5..250ec1273 100644 --- a/src/main/java/com/gg/server/domain/item/type/ItemType.java +++ b/src/main/java/com/gg/server/domain/item/type/ItemType.java @@ -4,6 +4,6 @@ @RequiredArgsConstructor public enum ItemType { - MEGAPHONE, PROFILE_BACKGROUND, PROFILE_BAND, TEXT_COLOR, PROFILE_IMAGE; + MEGAPHONE, PROFILE_BACKGROUND, PROFILE_BAND, TEXT_COLOR, PROFILE_IMAGE } From 399abc43a25345e860fafe91b52a96d6daaf8cc7 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Wed, 9 Aug 2023 11:40:48 +0900 Subject: [PATCH 052/273] =?UTF-8?q?[FEAT]=20GGBE-24=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=ED=85=8C=EB=91=90=EB=A6=AC=EB=9D=A0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/controller/UserController.java | 15 +++++-- .../com/gg/server/domain/user/data/User.java | 4 ++ .../server/domain/user/dto/UserEdgeDto.java | 13 ++++++ .../user/exception/UserEdgeTypeNotFound.java | 11 +++++ .../domain/user/service/UserService.java | 12 +++++- .../gg/server/domain/user/type/EdgeType.java | 21 ++++++---- .../gg/server/global/exception/ErrorCode.java | 2 +- .../user/controller/UserControllerTest.java | 40 +++++++++++++++++-- 8 files changed, 102 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/gg/server/domain/user/dto/UserEdgeDto.java create mode 100644 src/main/java/com/gg/server/domain/user/exception/UserEdgeTypeNotFound.java diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index 1e80033a9..a116de19e 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -5,11 +5,13 @@ import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.*; import com.gg.server.domain.user.exception.KakaoOauth2AlreadyExistException; +import com.gg.server.domain.user.exception.UserEdgeTypeNotFound; import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.exception.UserTextColorException; import com.gg.server.domain.user.service.UserAuthenticationService; import com.gg.server.domain.user.service.UserService; import com.gg.server.domain.user.service.UserTextColorCheckService; +import com.gg.server.domain.user.type.EdgeType; import com.gg.server.domain.user.type.OauthType; import com.gg.server.domain.user.type.RoleType; import com.gg.server.global.security.config.properties.AppProperties; @@ -33,7 +35,6 @@ @RestController @RequiredArgsConstructor @RequestMapping("/pingpong/users") - public class UserController { private final UserService userService; private final UserTextColorCheckService userTextColorCheck; @@ -122,12 +123,20 @@ public UserImageResponseDto getUserImage(@RequestParam(required = false) Long se } } - @PatchMapping ("/text-color") - public void updateTextColor(@RequestBody @Valid UserTextColorDto textColorDto, @Parameter(hidden = true) @Login UserDto user) { + @PatchMapping("/text-color") + public ResponseEntity updateTextColor(@RequestBody @Valid UserTextColorDto textColorDto, @Parameter(hidden = true) @Login UserDto user) { userService.updateTextColor(user.getId() ,textColorDto); + return new ResponseEntity(HttpStatus.NO_CONTENT); } + @PostMapping("/attendance") public UserAttendanceResponseDto attendUser(@Parameter(hidden = true) @Login UserDto user) { return userService.attendUser(user.getId()); } + + @PatchMapping("/edge") + public ResponseEntity updateEdge(@RequestBody @Valid UserEdgeDto userEdgeDto, @Parameter(hidden = true) @Login UserDto user) { + userService.updateEdge(user.getId(), userEdgeDto); + return new ResponseEntity(HttpStatus.NO_CONTENT); + } } diff --git a/src/main/java/com/gg/server/domain/user/data/User.java b/src/main/java/com/gg/server/domain/user/data/User.java index 1c81d808b..98fa71ddc 100644 --- a/src/main/java/com/gg/server/domain/user/data/User.java +++ b/src/main/java/com/gg/server/domain/user/data/User.java @@ -108,6 +108,10 @@ public void updateTextColor(String textColor) { this.textColor = textColor; } + public void updateEdge(EdgeType edge) { + this.edge = edge; + } + public int addGgCoin(int plus) { this.ggCoin += plus; return this.ggCoin; diff --git a/src/main/java/com/gg/server/domain/user/dto/UserEdgeDto.java b/src/main/java/com/gg/server/domain/user/dto/UserEdgeDto.java new file mode 100644 index 000000000..6ce1be72f --- /dev/null +++ b/src/main/java/com/gg/server/domain/user/dto/UserEdgeDto.java @@ -0,0 +1,13 @@ +package com.gg.server.domain.user.dto; + +import com.gg.server.domain.user.type.EdgeType; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class UserEdgeDto { + private EdgeType edgeType; +} diff --git a/src/main/java/com/gg/server/domain/user/exception/UserEdgeTypeNotFound.java b/src/main/java/com/gg/server/domain/user/exception/UserEdgeTypeNotFound.java new file mode 100644 index 000000000..8f53fc121 --- /dev/null +++ b/src/main/java/com/gg/server/domain/user/exception/UserEdgeTypeNotFound.java @@ -0,0 +1,11 @@ +package com.gg.server.domain.user.exception; + +import com.gg.server.global.exception.ErrorCode; + +import com.gg.server.global.exception.custom.NotExistException; + +public class UserEdgeTypeNotFound extends NotExistException { + public UserEdgeTypeNotFound() { + super("user edge type is not valid", ErrorCode.USER_EDGE_TYPE_NOT_FOUND); + } +} diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index fb9799b56..091122c0b 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -23,8 +23,10 @@ import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.*; import com.gg.server.domain.user.exception.UserAlreadyAttendanceException; +import com.gg.server.domain.user.exception.UserEdgeTypeNotFound; import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.exception.UserTextColorException; +import com.gg.server.domain.user.type.EdgeType; import com.gg.server.domain.user.type.RacketType; import com.gg.server.domain.user.type.RoleType; import com.gg.server.domain.user.type.SnsType; @@ -262,9 +264,17 @@ public UserNormalDetailResponseDto getUserNormalDetail(UserDto user) { @Transactional() public void updateTextColor(Long userId, UserTextColorDto textColorDto) { String textColor = textColorDto.getTextColor(); - if (UserTextColorCheckService.check(textColor) == false) + if (!UserTextColorCheckService.check(textColor)) throw new UserTextColorException(); User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new); user.updateTextColor(textColor); } + + @Transactional + public void updateEdge(Long userId, UserEdgeDto userEdgeDto) { + User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new); + EdgeType edgeType = userEdgeDto.getEdgeType(); + if (edgeType.equals(EdgeType.WRONG)) throw new UserEdgeTypeNotFound(); + user.updateEdge(edgeType); + } } diff --git a/src/main/java/com/gg/server/domain/user/type/EdgeType.java b/src/main/java/com/gg/server/domain/user/type/EdgeType.java index de9af55ef..49c0ab9bf 100644 --- a/src/main/java/com/gg/server/domain/user/type/EdgeType.java +++ b/src/main/java/com/gg/server/domain/user/type/EdgeType.java @@ -1,17 +1,24 @@ package com.gg.server.domain.user.type; +import com.fasterxml.jackson.annotation.JsonCreator; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public enum EdgeType { - BASIC(0, "basic"), - COLOR2(1, "color2"), - COLOR3(2, "color3"); + WRONG("wrong"), + BASIC("basic"), + COLOR2("color2"), + COLOR3("color3"); - private final Integer value; - private final String code; + private final String url; - public static EdgeType of(String code) { - return EdgeType.valueOf(code); + @JsonCreator + public static EdgeType getEnumFromValue(String edgeDto) { + for (EdgeType e : EdgeType.values()) { + if (e.toString().equals(edgeDto)) { + return e; + } + } + return WRONG; } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index 470007e6a..6b947ea0f 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -15,7 +15,7 @@ public enum ErrorCode { KAKAO_OAUTH2_DUPLICATE(409, "UR300", "KAKAO OAUTH2 ALREADY EXIST"), USER_TEXT_COLOR_WRONG_TYPE(401, "UR403", "USER TEXT COLOR CODE IS WRONG"), USER_ALREADY_ATTENDANCE(409, "UR301", "USER ALREADY ATTENDANCE"), - + USER_EDGE_TYPE_NOT_FOUND(404, "UR102", "USER EDGE TYPE NOT FOUND"), //announcement ANNOUNCE_NOT_FOUND(404, "AN100", "ANNOUNCEMENT NOT FOUND"), ANNOUNCE_DUPLICATE(409, "AN300", "ANNOUNCEMENT DUPLICATION"), diff --git a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java index e517e4fe7..85a9d7b1a 100644 --- a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java +++ b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java @@ -19,9 +19,11 @@ import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.controller.dto.GameInfoDto; import com.gg.server.domain.user.dto.*; +import com.gg.server.domain.user.type.EdgeType; import com.gg.server.domain.user.type.RacketType; import com.gg.server.domain.user.type.RoleType; import com.gg.server.domain.user.type.SnsType; +import lombok.extern.slf4j.Slf4j; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.AfterEach; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; @@ -47,6 +49,7 @@ @SpringBootTest @AutoConfigureMockMvc @Transactional +@Slf4j class UserControllerTest { @Autowired @@ -354,16 +357,13 @@ public void updateTextColorTest() throws Exception { String accessToken = tokenProvider.createToken(newUser.getId()); String url = "/pingpong/users/text-color"; - String newStatusMessage = "newStatusMessage"; - RacketType newRacketType = RacketType.SHAKEHAND; - SnsType newSnsType = SnsType.SLACK; String newTextColor = "#FFFFFF"; //when mockMvc.perform(patch(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(new UserTextColorDto(newTextColor)))) - .andExpect(status().isOk()); + .andExpect(status().is2xxSuccessful()); //then userRepository.findById(newUser.getId()).ifPresentOrElse(user -> { Assertions.assertThat(user.getTextColor()).isEqualTo(newTextColor); @@ -371,4 +371,36 @@ public void updateTextColorTest() throws Exception { Assertions.fail("유저 업데이트 실패"); }); } + + @Test + @DisplayName("[patch] edge") + public void updateEdgeTest() throws Exception { + //given + Season season = testDataUtils.createSeason(); + String intraId = "intraId"; + String email = "email"; + String imageUrl = "imageUrl"; + User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, + SnsType.BOTH, RoleType.ADMIN); + String statusMessage = "statusMessage"; + testDataUtils.createUserRank(newUser, statusMessage, season); + String accessToken = tokenProvider.createToken(newUser.getId()); + String url = "/pingpong/users/edge"; + + EdgeType newEdge = EdgeType.BASIC; + + //when + mockMvc.perform(patch(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(new UserEdgeDto(newEdge)))) + .andExpect(status().is2xxSuccessful()); + //then + log.info("newEdge : {}", newEdge); + log.info("user.getEdge() : {}", newUser.getEdge()); + userRepository.findById(newUser.getId()).ifPresentOrElse(user -> { + Assertions.assertThat(user.getEdge()).isEqualTo(newEdge); + }, () -> { + Assertions.fail("유저 업데이트 실패"); + }); + } } \ No newline at end of file From 278bb34eb3a36d6fefd193d3feb7f32f9021fa65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Wed, 9 Aug 2023 13:01:50 +0900 Subject: [PATCH 053/273] =?UTF-8?q?[FIX]=20GGBE4-10=20=EC=9D=91=EB=8B=B5?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/megaphone/controller/MegaphoneController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java b/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java index 77731eac3..bf855562d 100644 --- a/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java +++ b/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java @@ -22,6 +22,6 @@ public class MegaphoneController { public ResponseEntity useMegaphone(@RequestBody @Valid MegaphoneUseRequestDto megaphoneUseRequestDto, @Parameter(hidden = true) @Login UserDto user) { megaphoneService.useMegaphone(megaphoneUseRequestDto, user); - return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + return ResponseEntity.status(HttpStatus.CREATED).build(); } } From a195c0bbb8c1b4ca756cd10c9219647623018689 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Wed, 9 Aug 2023 13:09:08 +0900 Subject: [PATCH 054/273] =?UTF-8?q?[STYLE]=20GGBE4-10=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/megaphone/controller/MegaphoneControllerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java b/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java index 3e3a3527e..31cf44cff 100644 --- a/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java +++ b/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java @@ -52,7 +52,7 @@ class MegaphoneControllerTest { @Test @Transactional @DisplayName("[Post]/pingpong/megaphones") - void getAnnouncementList() throws Exception { + void useMegaphoneTest() throws Exception { String intraId = "intra"; String email = "email"; String imageUrl = "imageUrl"; From a49afe34054486ae0b7a1b60cdfe53e5bec4c8ac Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Wed, 9 Aug 2023 13:15:45 +0900 Subject: [PATCH 055/273] =?UTF-8?q?[FIX]=20=EC=A4=91=EA=B4=84=ED=98=B8=20?= =?UTF-8?q?=EC=95=88=EB=8B=AB=ED=9E=8C=EA=B1=B0=20=EA=B3=A0=EC=B9=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/domain/user/controller/UserController.java | 1 + .../domain/user/controller/UserControllerTest.java | 9 ++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index 40a6c23da..3cda74a0f 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -140,6 +140,7 @@ public UserAttendanceResponseDto attendUser(@Parameter(hidden = true) @Login Use public ResponseEntity updateEdge(@RequestBody @Valid UserEdgeDto userEdgeDto, @Parameter(hidden = true) @Login UserDto user) { userService.updateEdge(user.getId(), userEdgeDto); return new ResponseEntity(HttpStatus.NO_CONTENT); + } @GetMapping("/coin") public UserCoinResponseDto getUserCoin(@Parameter(hidden = true) @Login UserDto user) { diff --git a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java index 51be11362..bf987fd39 100644 --- a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java +++ b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java @@ -1,9 +1,6 @@ package com.gg.server.domain.user.controller; import com.fasterxml.jackson.databind.ObjectMapper; -import com.gg.server.admin.feedback.dto.FeedbackListAdminResponseDto; -import com.gg.server.domain.announcement.data.Announcement; -import com.gg.server.domain.announcement.exception.AnnounceNotFoundException; import com.gg.server.domain.coin.data.CoinHistoryRepository; import com.gg.server.domain.coin.data.CoinPolicyRepository; import com.gg.server.domain.game.data.Game; @@ -22,6 +19,7 @@ import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.controller.dto.GameInfoDto; import com.gg.server.domain.user.dto.*; +import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.type.EdgeType; import com.gg.server.domain.user.type.RacketType; import com.gg.server.domain.user.type.RoleType; @@ -344,7 +342,7 @@ public void attendUserTest() throws Exception { System.out.println(result.getAfterCoin()); Assertions.assertThat(result.getAfterCoin() - result.getBeforeCoin()).isEqualTo(result.getCoinIncrement()); } - + @Test @DisplayName("[patch] text-color") public void updateTextColorTest() throws Exception { @@ -405,6 +403,7 @@ public void updateEdgeTest() throws Exception { }, () -> { Assertions.fail("유저 업데이트 실패"); }); + } @Test @DisplayName("[get]/pingpong/users/coin") @@ -424,4 +423,4 @@ public void getUserCoin() throws Exception { assertThat(result.getCoin()).isEqualTo(userCoin); System.out.println(userCoin); } -} \ No newline at end of file +} From d1c4329b9f761af22343997bf719e08aa653ae3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Wed, 9 Aug 2023 13:26:19 +0900 Subject: [PATCH 056/273] =?UTF-8?q?[FEAT]=20GGBE4-13=20=ED=99=95=EC=84=B1?= =?UTF-8?q?=EA=B8=B0=20=EC=82=AD=EC=A0=9C=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MegaphoneController.java | 9 ++++++ .../megaphone/data/MegaphoneRepository.java | 3 ++ .../exception/MegaphoneNotFoundException.java | 8 +++++ .../redis/MegaphoneRedisRepository.java | 5 ++++ .../megaphone/service/MegaphoneService.java | 29 +++++++++++++++++-- .../domain/receipt/type/ItemStatus.java | 3 +- .../gg/server/global/exception/ErrorCode.java | 3 +- 7 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/gg/server/domain/megaphone/exception/MegaphoneNotFoundException.java diff --git a/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java b/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java index 77731eac3..7cb9a0f3b 100644 --- a/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java +++ b/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java @@ -24,4 +24,13 @@ public ResponseEntity useMegaphone(@RequestBody @Valid MegaphoneUseRequestDto me megaphoneService.useMegaphone(megaphoneUseRequestDto, user); return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } + + @DeleteMapping("/receipt/{receiptId}") + public ResponseEntity deleteMegaphone(@PathVariable Long receiptId, + @Parameter(hidden = true) @Login UserDto user) { + megaphoneService.deleteMegaphone(receiptId, user); + return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + } + + } diff --git a/src/main/java/com/gg/server/domain/megaphone/data/MegaphoneRepository.java b/src/main/java/com/gg/server/domain/megaphone/data/MegaphoneRepository.java index 70469bf41..64da1fd71 100644 --- a/src/main/java/com/gg/server/domain/megaphone/data/MegaphoneRepository.java +++ b/src/main/java/com/gg/server/domain/megaphone/data/MegaphoneRepository.java @@ -1,13 +1,16 @@ package com.gg.server.domain.megaphone.data; +import com.gg.server.domain.receipt.data.Receipt; import org.springframework.data.jpa.repository.JpaRepository; import java.time.LocalDate; import java.util.List; +import java.util.Optional; public interface MegaphoneRepository extends JpaRepository { List findAllByUsedAt(LocalDate date); Megaphone findFirstByOrderByIdDesc(); + Optional findByReceipt(Receipt receipt); } diff --git a/src/main/java/com/gg/server/domain/megaphone/exception/MegaphoneNotFoundException.java b/src/main/java/com/gg/server/domain/megaphone/exception/MegaphoneNotFoundException.java new file mode 100644 index 000000000..accd2759d --- /dev/null +++ b/src/main/java/com/gg/server/domain/megaphone/exception/MegaphoneNotFoundException.java @@ -0,0 +1,8 @@ +package com.gg.server.domain.megaphone.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.NotExistException; + +public class MegaphoneNotFoundException extends NotExistException { + public MegaphoneNotFoundException() {super("확성기를 찾을 수 없습니다.", ErrorCode.MEGAPHONE_TIME);} +} diff --git a/src/main/java/com/gg/server/domain/megaphone/redis/MegaphoneRedisRepository.java b/src/main/java/com/gg/server/domain/megaphone/redis/MegaphoneRedisRepository.java index ba44b798f..9b6378d94 100644 --- a/src/main/java/com/gg/server/domain/megaphone/redis/MegaphoneRedisRepository.java +++ b/src/main/java/com/gg/server/domain/megaphone/redis/MegaphoneRedisRepository.java @@ -25,4 +25,9 @@ public List getAllMegaphone() { public void deleteAllMegaphone() { redisTemplate.delete(redisTemplate.keys("megaphone*")); } + + public void deleteMegaphoneById(Long id) { + redisTemplate.delete("megaphone" + id); + } + } diff --git a/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java b/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java index 16730264b..e03f4a2cd 100644 --- a/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java +++ b/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java @@ -3,6 +3,7 @@ import com.gg.server.domain.megaphone.data.Megaphone; import com.gg.server.domain.megaphone.data.MegaphoneRepository; import com.gg.server.domain.megaphone.dto.MegaphoneUseRequestDto; +import com.gg.server.domain.megaphone.exception.MegaphoneNotFoundException; import com.gg.server.domain.megaphone.exception.MegaphoneTimeException; import com.gg.server.domain.megaphone.redis.MegaphoneRedis; import com.gg.server.domain.megaphone.redis.MegaphoneRedisRepository; @@ -15,6 +16,7 @@ import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.domain.user.type.RoleType; import lombok.RequiredArgsConstructor; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; @@ -40,9 +42,7 @@ public void useMegaphone(MegaphoneUseRequestDto megaphoneUseRequestDto, UserDto throw new MegaphoneTimeException(); } Receipt receipt = receiptRepository.findById(megaphoneUseRequestDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); - if (!receipt.getOwnerIntraId().equals(user.getIntraId())) { - throw new ReceiptNotOwnerException(); - } + checkOwner(loginUser, receipt); if (!receipt.getStatus().equals(ItemStatus.BEFORE)) { throw new ItemStatusException(); } @@ -62,4 +62,27 @@ public void setMegaphoneList(LocalDate today) { LocalDateTime.of(megaphone.getUsedAt(), LocalTime.of(0, 0)))); } } + + @Transactional + public void deleteMegaphone(Long receiptId, UserDto user) { + User loginUser = userRepository.findById(user.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + user.getId())); + Receipt receipt = receiptRepository.findById(receiptId).orElseThrow(ReceiptNotFoundException::new); + if (!user.getRoleType().equals(RoleType.ADMIN)) { + checkOwner(loginUser, receipt); + } + if (!(receipt.getStatus().equals(ItemStatus.WAITING) || receipt.getStatus().equals(ItemStatus.USING))) { + throw new ItemStatusException(); + } + //TODO 확성기 타입 체크 + Megaphone megaphone = megaphoneRepository.findByReceipt(receipt).orElseThrow(MegaphoneNotFoundException::new); + if (receipt.getStatus().equals(ItemStatus.USING)) { + megaphoneRedisRepository.deleteMegaphoneById(megaphone.getId()); + } + receipt.updateStatus(ItemStatus.DELETED); + } + + private void checkOwner(User loginUser, Receipt receipt) { + if (!receipt.getOwnerIntraId().equals(loginUser.getIntraId())) + throw new ReceiptNotOwnerException(); + } } diff --git a/src/main/java/com/gg/server/domain/receipt/type/ItemStatus.java b/src/main/java/com/gg/server/domain/receipt/type/ItemStatus.java index e6ec3ef47..a9ecc3c4b 100644 --- a/src/main/java/com/gg/server/domain/receipt/type/ItemStatus.java +++ b/src/main/java/com/gg/server/domain/receipt/type/ItemStatus.java @@ -9,7 +9,8 @@ public enum ItemStatus { BEFORE("before", "사용 전"), WAITING("waiting", "사용 대기"), USING("using", "사용 중"), - USED("used", "사용 완료"); + USED("used", "사용 완료"), + DELETED("deleted", "삭제"); private final String code; private final String desc; diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index c114ddf61..67bc4f0ea 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -46,7 +46,8 @@ public enum ErrorCode { RECEIPT_STATUS_NOT_MATCHED(400, "RC200", "RECEIPT STATUS NOT MATCHED"), //megaphone - MEGAPHONE_TIME(400, "ME100", "MEGAPHONE TIME"), + MEGAPHONE_NOT_FOUND(404, "ME100", "MEGAPHONE NOT FOUND"), + MEGAPHONE_TIME(400, "ME200", "MEGAPHONE TIME"), /** Penalty **/ PENALTY_NOT_FOUND(404, "PE100", "PENALTY NOT FOUND"), From 843b4a17d6d3e9ecfdafb5a9b7c832e6d2d4d1a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Wed, 9 Aug 2023 13:26:56 +0900 Subject: [PATCH 057/273] =?UTF-8?q?[TEST]=20GGBE4-13=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MegaphoneControllerTest.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java b/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java index 3e3a3527e..dc0c0b924 100644 --- a/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java +++ b/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java @@ -6,6 +6,7 @@ import com.gg.server.domain.megaphone.dto.MegaphoneUseRequestDto; import com.gg.server.domain.receipt.data.Receipt; import com.gg.server.domain.receipt.data.ReceiptRepository; +import com.gg.server.domain.receipt.type.ItemStatus; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.type.RacketType; import com.gg.server.domain.user.type.RoleType; @@ -14,6 +15,7 @@ import com.gg.server.utils.TestDataUtils; import lombok.RequiredArgsConstructor; import org.apache.http.HttpHeaders; +import org.assertj.core.api.AssertionsForClassTypes; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -24,6 +26,7 @@ import org.springframework.transaction.annotation.Transactional; import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.delete; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -51,7 +54,7 @@ class MegaphoneControllerTest { @Test @Transactional - @DisplayName("[Post]/pingpong/megaphones") + @DisplayName("[Post] /pingpong/megaphones") void getAnnouncementList() throws Exception { String intraId = "intra"; String email = "email"; @@ -75,4 +78,27 @@ void getAnnouncementList() throws Exception { Megaphone result = megaphoneRepository.findFirstByOrderByIdDesc(); assertThat(result.getContent()).isEqualTo(megaphoneUseRequestDto.getContent()); } + + @Test + @Transactional + @DisplayName("DELETE /pingpong/megaphones/receipt/{receiptId}") + public void deleteMegaphoneTest() throws Exception { + //given + String intraId = "intra"; + String email = "email"; + String imageUrl = "imageUrl"; + User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, + SnsType.BOTH, RoleType.ADMIN); + String accessToken = tokenProvider.createToken(newUser.getId()); + Receipt receipt = receiptRepository.findById(2L).get(); + String url = "/pingpong/megaphones/receipt/2"; + + //when + mockMvc.perform(delete(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().is2xxSuccessful()) + .andReturn().getResponse(); + + //then + AssertionsForClassTypes.assertThat(receipt.getStatus()).isEqualTo(ItemStatus.DELETED); + } } \ No newline at end of file From e7d4b82e321cf1600d80c3c4f2d49b5fb9e3e3a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Wed, 9 Aug 2023 15:07:56 +0900 Subject: [PATCH 058/273] =?UTF-8?q?[FEAT]=20GGBE4-16=20=ED=99=95=EC=84=B1?= =?UTF-8?q?=EA=B8=B0=20=EC=83=81=EC=84=B8=20=EB=82=B4=EC=9A=A9=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20api=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/exception/ItemTypeException.java | 8 +++++ .../controller/MegaphoneController.java | 12 ++++--- .../dto/MegaphoneDetailResponseDto.java | 19 ++++++++++ .../megaphone/service/MegaphoneService.java | 35 +++++++++++++++---- .../gg/server/global/exception/ErrorCode.java | 1 + 5 files changed, 64 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/gg/server/domain/item/exception/ItemTypeException.java create mode 100644 src/main/java/com/gg/server/domain/megaphone/dto/MegaphoneDetailResponseDto.java diff --git a/src/main/java/com/gg/server/domain/item/exception/ItemTypeException.java b/src/main/java/com/gg/server/domain/item/exception/ItemTypeException.java new file mode 100644 index 000000000..4e39acfe5 --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/exception/ItemTypeException.java @@ -0,0 +1,8 @@ +package com.gg.server.domain.item.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.BusinessException; + +public class ItemTypeException extends BusinessException { + public ItemTypeException() {super("아이템 타입 오류입니다.", ErrorCode.ITEM_TYPE_NOT_MATCHED);} +} diff --git a/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java b/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java index f5fbad014..e31c03fc9 100644 --- a/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java +++ b/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java @@ -1,5 +1,6 @@ package com.gg.server.domain.megaphone.controller; +import com.gg.server.domain.megaphone.dto.MegaphoneDetailResponseDto; import com.gg.server.domain.megaphone.dto.MegaphoneUseRequestDto; import com.gg.server.domain.megaphone.service.MegaphoneService; import com.gg.server.domain.user.dto.UserDto; @@ -25,12 +26,15 @@ public ResponseEntity useMegaphone(@RequestBody @Valid MegaphoneUseRequestDto me return ResponseEntity.status(HttpStatus.CREATED).build(); } - @DeleteMapping("/receipt/{receiptId}") - public ResponseEntity deleteMegaphone(@PathVariable Long receiptId, + @DeleteMapping("/{megaphoneId}") + public ResponseEntity deleteMegaphone(@PathVariable Long megaphoneId, @Parameter(hidden = true) @Login UserDto user) { - megaphoneService.deleteMegaphone(receiptId, user); + megaphoneService.deleteMegaphone(megaphoneId, user); return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } - + @GetMapping("/receipt/{receiptId}") + public ResponseEntity getMegaphoneDetail(@PathVariable Long receiptId, @Parameter(hidden = true) @Login UserDto user) { + return ResponseEntity.ok(megaphoneService.getMegaphoneDetail(receiptId, user)); + } } diff --git a/src/main/java/com/gg/server/domain/megaphone/dto/MegaphoneDetailResponseDto.java b/src/main/java/com/gg/server/domain/megaphone/dto/MegaphoneDetailResponseDto.java new file mode 100644 index 000000000..25237287b --- /dev/null +++ b/src/main/java/com/gg/server/domain/megaphone/dto/MegaphoneDetailResponseDto.java @@ -0,0 +1,19 @@ +package com.gg.server.domain.megaphone.dto; + +import com.gg.server.domain.megaphone.data.Megaphone; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class MegaphoneDetailResponseDto { + private Long megaphoneId; + private String content; + private String usedAt; + + public MegaphoneDetailResponseDto(Megaphone megaphone) { + this.megaphoneId = megaphone.getId(); + this.content = megaphone.getContent(); + this.usedAt = megaphone.getUsedAt().toString(); + } +} diff --git a/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java b/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java index e03f4a2cd..a2e1e2675 100644 --- a/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java +++ b/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java @@ -1,7 +1,10 @@ package com.gg.server.domain.megaphone.service; +import com.gg.server.domain.item.exception.ItemTypeException; +import com.gg.server.domain.item.type.ItemType; import com.gg.server.domain.megaphone.data.Megaphone; import com.gg.server.domain.megaphone.data.MegaphoneRepository; +import com.gg.server.domain.megaphone.dto.MegaphoneDetailResponseDto; import com.gg.server.domain.megaphone.dto.MegaphoneUseRequestDto; import com.gg.server.domain.megaphone.exception.MegaphoneNotFoundException; import com.gg.server.domain.megaphone.exception.MegaphoneTimeException; @@ -43,6 +46,7 @@ public void useMegaphone(MegaphoneUseRequestDto megaphoneUseRequestDto, UserDto } Receipt receipt = receiptRepository.findById(megaphoneUseRequestDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); checkOwner(loginUser, receipt); + checkItemType(receipt); if (!receipt.getStatus().equals(ItemStatus.BEFORE)) { throw new ItemStatusException(); } @@ -64,25 +68,42 @@ public void setMegaphoneList(LocalDate today) { } @Transactional - public void deleteMegaphone(Long receiptId, UserDto user) { + public void deleteMegaphone(Long megaphoneId, UserDto user) { User loginUser = userRepository.findById(user.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + user.getId())); - Receipt receipt = receiptRepository.findById(receiptId).orElseThrow(ReceiptNotFoundException::new); + Megaphone megaphone = megaphoneRepository.findById(megaphoneId).orElseThrow(MegaphoneNotFoundException::new); + Receipt receipt = megaphone.getReceipt(); if (!user.getRoleType().equals(RoleType.ADMIN)) { checkOwner(loginUser, receipt); } - if (!(receipt.getStatus().equals(ItemStatus.WAITING) || receipt.getStatus().equals(ItemStatus.USING))) { - throw new ItemStatusException(); - } - //TODO 확성기 타입 체크 - Megaphone megaphone = megaphoneRepository.findByReceipt(receipt).orElseThrow(MegaphoneNotFoundException::new); + checkUseStatus(receipt); if (receipt.getStatus().equals(ItemStatus.USING)) { megaphoneRedisRepository.deleteMegaphoneById(megaphone.getId()); } receipt.updateStatus(ItemStatus.DELETED); } + public MegaphoneDetailResponseDto getMegaphoneDetail(Long receiptId, UserDto user) { + User loginUser = userRepository.findById(user.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + user.getId())); + Receipt receipt = receiptRepository.findById(receiptId).orElseThrow(ReceiptNotFoundException::new); + checkOwner(loginUser, receipt); + checkItemType(receipt); + checkUseStatus(receipt); + Megaphone megaphone = megaphoneRepository.findByReceipt(receipt).orElseThrow(MegaphoneNotFoundException::new); + return new MegaphoneDetailResponseDto(megaphone); + } + private void checkOwner(User loginUser, Receipt receipt) { if (!receipt.getOwnerIntraId().equals(loginUser.getIntraId())) throw new ReceiptNotOwnerException(); } + + private void checkItemType(Receipt receipt) { + if (!receipt.getItem().getType().equals(ItemType.MEGAPHONE)) + throw new ItemTypeException(); + } + + private void checkUseStatus(Receipt receipt) { + if (!(receipt.getStatus().equals(ItemStatus.WAITING) || receipt.getStatus().equals(ItemStatus.USING))) + throw new ItemStatusException(); + } } diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index 48cdf0971..f602ff7e4 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -39,6 +39,7 @@ public enum ErrorCode { //item ITEM_NOT_FOUND(404, "IT100", "ITEM NOT FOUND"), + ITEM_TYPE_NOT_MATCHED(400, "IT200", "ITEM TYPE NOT MATCHED"), //receipt RECEIPT_NOT_FOUND(404, "RC100", "RECEIPT NOT FOUND"), From e15604f251978517a0fced03ec48e9b3eb91d6ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Wed, 9 Aug 2023 15:08:34 +0900 Subject: [PATCH 059/273] =?UTF-8?q?[TEST]=20GGBE4-16=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MegaphoneControllerTest.java | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java b/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java index dc0c0b924..477227b15 100644 --- a/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java +++ b/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java @@ -26,8 +26,7 @@ import org.springframework.transaction.annotation.Transactional; import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.delete; -import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.post; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @RequiredArgsConstructor @@ -81,7 +80,7 @@ void getAnnouncementList() throws Exception { @Test @Transactional - @DisplayName("DELETE /pingpong/megaphones/receipt/{receiptId}") + @DisplayName("DELETE /pingpong/megaphones/{megaphoneId}") public void deleteMegaphoneTest() throws Exception { //given String intraId = "intra"; @@ -91,7 +90,7 @@ public void deleteMegaphoneTest() throws Exception { SnsType.BOTH, RoleType.ADMIN); String accessToken = tokenProvider.createToken(newUser.getId()); Receipt receipt = receiptRepository.findById(2L).get(); - String url = "/pingpong/megaphones/receipt/2"; + String url = "/pingpong/megaphones/2"; //when mockMvc.perform(delete(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) @@ -101,4 +100,25 @@ public void deleteMegaphoneTest() throws Exception { //then AssertionsForClassTypes.assertThat(receipt.getStatus()).isEqualTo(ItemStatus.DELETED); } + + @Test + @Transactional + @DisplayName("[GET] /pingpong/megaphones/receipt/{receiptId}") + void getMegaphoneDetailTest() throws Exception { + String intraId = "intra"; + String email = "email"; + String imageUrl = "imageUrl"; + User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, + SnsType.BOTH, RoleType.ADMIN); + String accessToken = tokenProvider.createToken(newUser.getId()); + Receipt receipt = receiptRepository.findById(1L).get(); + String url = "/pingpong/megaphones/receipt/"+receipt.getId(); + + String contentAsString = mockMvc.perform(get(url) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + + System.out.println(contentAsString); + } } \ No newline at end of file From 6183bb574e3556f4fe00a739d57b97630b0ecd87 Mon Sep 17 00:00:00 2001 From: sion99 Date: Thu, 10 Aug 2023 13:25:41 +0900 Subject: [PATCH 060/273] =?UTF-8?q?[TEST]=20Receipt=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=EC=9E=90=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReceiptAdminControllerTest.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/test/java/com/gg/server/admin/receipt/controller/ReceiptAdminControllerTest.java diff --git a/src/test/java/com/gg/server/admin/receipt/controller/ReceiptAdminControllerTest.java b/src/test/java/com/gg/server/admin/receipt/controller/ReceiptAdminControllerTest.java new file mode 100644 index 000000000..ecc6ed5c3 --- /dev/null +++ b/src/test/java/com/gg/server/admin/receipt/controller/ReceiptAdminControllerTest.java @@ -0,0 +1,62 @@ +package com.gg.server.admin.receipt.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.admin.receipt.data.ReceiptAdminRepository; +import com.gg.server.admin.receipt.dto.ReceiptListResponseDto; +import com.gg.server.admin.receipt.service.ReceiptAdminService; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import org.apache.http.HttpHeaders; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +class ReceiptAdminControllerTest { + @Autowired + ReceiptAdminService receiptAdminService; + @Autowired + ReceiptAdminRepository receiptAdminRepository; + @Autowired + TestDataUtils testDataUtils; + @Autowired + ObjectMapper objectMapper; + @Autowired + AuthTokenProvider tokenProvider; + @Autowired + MockMvc mockMvc; + + @Test + @DisplayName("GET /pingpong/admin/receipt/list") + public void getAllReceipt() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Integer page = 1; + Integer size = 20; + String url = "/pingpong/admin/receipt/list?page=" + page + "&size=" + size; + Pageable pageable = PageRequest.of(page - 1, size, Sort.by("createdAt").descending()); + String contentAsString = mockMvc.perform(get(url) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + ReceiptListResponseDto expect = receiptAdminService.getAllReceipt(pageable); + ReceiptListResponseDto result = objectMapper.readValue(contentAsString, ReceiptListResponseDto.class); + assertThat(result.getReceiptList().get(0).getReceiptId()).isEqualTo(expect.getReceiptList().get(0).getReceiptId()); + assertThat(result.getReceiptList().get(0).getCreatedAt()).isEqualTo(expect.getReceiptList().get(0).getCreatedAt()); + assertThat(result.getReceiptList().get(0).getItemName()).isEqualTo(expect.getReceiptList().get(0).getItemName()); + assertThat(result.getReceiptList().get(0).getItemPrice()).isEqualTo(expect.getReceiptList().get(0).getItemPrice()); + } +} \ No newline at end of file From 66a9ae3ea6bd321b6bedc5186de883b18a0a3e88 Mon Sep 17 00:00:00 2001 From: sion99 Date: Thu, 10 Aug 2023 13:28:18 +0900 Subject: [PATCH 061/273] =?UTF-8?q?[REFACTOR]=20Receipt=20Entity=20?= =?UTF-8?q?=EC=9A=94=EC=86=8C=20=EC=9D=B4=EB=A6=84=20=EC=A0=81=EC=A0=88?= =?UTF-8?q?=ED=95=98=EA=B2=8C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ReceiptAdminController.java | 2 +- .../admin/receipt/dto/ReceiptResponseDto.java | 18 ++++++++++++++++-- .../gg/server/domain/receipt/data/Receipt.java | 8 ++++---- 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gg/server/admin/receipt/controller/ReceiptAdminController.java b/src/main/java/com/gg/server/admin/receipt/controller/ReceiptAdminController.java index 00de9eb49..d5182d9e7 100644 --- a/src/main/java/com/gg/server/admin/receipt/controller/ReceiptAdminController.java +++ b/src/main/java/com/gg/server/admin/receipt/controller/ReceiptAdminController.java @@ -23,7 +23,7 @@ public class ReceiptAdminController { @GetMapping("/list") public ReceiptListResponseDto getReceiptList(@ModelAttribute @Valid PageRequestDto pageRequestDto) { Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, pageRequestDto.getSize(), - Sort.by("purchasedAt").descending()); + Sort.by("createdAt").descending()); return receiptAdminService.getAllReceipt(pageable); } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/admin/receipt/dto/ReceiptResponseDto.java b/src/main/java/com/gg/server/admin/receipt/dto/ReceiptResponseDto.java index 587820d45..41c9e1b44 100644 --- a/src/main/java/com/gg/server/admin/receipt/dto/ReceiptResponseDto.java +++ b/src/main/java/com/gg/server/admin/receipt/dto/ReceiptResponseDto.java @@ -2,6 +2,7 @@ import com.gg.server.domain.item.data.Item; import com.gg.server.domain.receipt.data.Receipt; +import com.gg.server.domain.receipt.type.ItemStatus; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -18,16 +19,29 @@ public class ReceiptResponseDto { private Integer itemPrice; private String purchaserIntraId; private String ownerIntraId; - private Enum itemStatusType; + private ItemStatus itemStatusType; public ReceiptResponseDto(Receipt receipt) { Item item = receipt.getItem(); this.itemName = item.getName(); this.itemPrice = item.getPrice() - (item.getPrice() * item.getDiscount() / 100); this.receiptId = receipt.getId(); - this.createdAt = receipt.getPurchasedAt(); + this.createdAt = receipt.getCreatedAt(); this.purchaserIntraId = receipt.getPurchaserIntraId(); this.ownerIntraId = receipt.getOwnerIntraId(); this.itemStatusType = receipt.getStatus(); } + + @Override + public String toString() { + return "ReceiptResponseDto{" + + "receiptId=" + receiptId + + ", createdAt=" + createdAt + + ", itemName='" + itemName + '\'' + + ", itemPrice=" + itemPrice + + ", purchaserIntraId='" + purchaserIntraId + '\'' + + ", ownerIntraId='" + ownerIntraId + '\'' + + ", itemStatusType=" + itemStatusType + + '}'; + } } diff --git a/src/main/java/com/gg/server/domain/receipt/data/Receipt.java b/src/main/java/com/gg/server/domain/receipt/data/Receipt.java index 8a4047628..c4185d319 100644 --- a/src/main/java/com/gg/server/domain/receipt/data/Receipt.java +++ b/src/main/java/com/gg/server/domain/receipt/data/Receipt.java @@ -37,8 +37,8 @@ public class Receipt { private ItemStatus status; @NotNull - @Column(name = "created_At") - private LocalDateTime purchasedAt; + @Column(name = "created_at") + private LocalDateTime createdAt; public Receipt(Item item, String purchaserIntraId, String ownerIntraId, ItemStatus status, LocalDateTime purchasedAt){ @@ -46,7 +46,7 @@ public Receipt(Item item, String purchaserIntraId, String ownerIntraId, this.purchaserIntraId = purchaserIntraId; this.ownerIntraId = ownerIntraId; this.status = status; - this.purchasedAt = purchasedAt; + this.createdAt = purchasedAt; } @Override @@ -57,7 +57,7 @@ public String toString() { ", purchaserIntraId='" + purchaserIntraId + '\'' + ", ownerIntraId='" + ownerIntraId + '\'' + ", status=" + status + - ", purchasedAt=" + purchasedAt + + ", purchasedAt=" + createdAt + '}'; } From 25aaf12c4168681912cf46bb31ed712b59030684 Mon Sep 17 00:00:00 2001 From: sion99 Date: Fri, 11 Aug 2023 11:55:21 +0900 Subject: [PATCH 062/273] =?UTF-8?q?[FEAT]=20Receipt=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=EB=B3=84=20=EA=B2=80=EC=83=89=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../receipt/controller/ReceiptAdminController.java | 14 ++++++++++---- .../admin/receipt/data/ReceiptAdminRepository.java | 2 +- .../receipt/data/ReceiptAdminRepositorySearch.java | 12 ++++++++++++ .../receipt/dto/ReceiptAdminPageRequestDto.java | 14 ++++++++++++++ .../admin/receipt/service/ReceiptAdminService.java | 8 ++++++++ 5 files changed, 45 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/gg/server/admin/receipt/data/ReceiptAdminRepositorySearch.java create mode 100644 src/main/java/com/gg/server/admin/receipt/dto/ReceiptAdminPageRequestDto.java diff --git a/src/main/java/com/gg/server/admin/receipt/controller/ReceiptAdminController.java b/src/main/java/com/gg/server/admin/receipt/controller/ReceiptAdminController.java index d5182d9e7..a63686023 100644 --- a/src/main/java/com/gg/server/admin/receipt/controller/ReceiptAdminController.java +++ b/src/main/java/com/gg/server/admin/receipt/controller/ReceiptAdminController.java @@ -1,8 +1,8 @@ package com.gg.server.admin.receipt.controller; +import com.gg.server.admin.receipt.dto.ReceiptAdminPageRequestDto; import com.gg.server.admin.receipt.dto.ReceiptListResponseDto; import com.gg.server.admin.receipt.service.ReceiptAdminService; -import com.gg.server.global.dto.PageRequestDto; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -21,9 +21,15 @@ public class ReceiptAdminController { private final ReceiptAdminService receiptAdminService; @GetMapping("/list") - public ReceiptListResponseDto getReceiptList(@ModelAttribute @Valid PageRequestDto pageRequestDto) { - Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, pageRequestDto.getSize(), + public ReceiptListResponseDto getReceiptList(@ModelAttribute @Valid ReceiptAdminPageRequestDto req) { + + if (req.getIntraId() == null) { + Pageable pageable = PageRequest.of(req.getPage() - 1, req.getSize(), + Sort.by("createdAt").descending()); + return receiptAdminService.getAllReceipt(pageable); + } + Pageable pageable = PageRequest.of(req.getPage() - 1, req.getSize(), Sort.by("createdAt").descending()); - return receiptAdminService.getAllReceipt(pageable); + return receiptAdminService.findByIntraId(req.getIntraId(), pageable); } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/admin/receipt/data/ReceiptAdminRepository.java b/src/main/java/com/gg/server/admin/receipt/data/ReceiptAdminRepository.java index 7cb76480c..69f387d11 100644 --- a/src/main/java/com/gg/server/admin/receipt/data/ReceiptAdminRepository.java +++ b/src/main/java/com/gg/server/admin/receipt/data/ReceiptAdminRepository.java @@ -5,6 +5,6 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; -public interface ReceiptAdminRepository extends JpaRepository { +public interface ReceiptAdminRepository extends JpaRepository, ReceiptAdminRepositorySearch{ Page findAll(Pageable pageable); } diff --git a/src/main/java/com/gg/server/admin/receipt/data/ReceiptAdminRepositorySearch.java b/src/main/java/com/gg/server/admin/receipt/data/ReceiptAdminRepositorySearch.java new file mode 100644 index 000000000..4065857a5 --- /dev/null +++ b/src/main/java/com/gg/server/admin/receipt/data/ReceiptAdminRepositorySearch.java @@ -0,0 +1,12 @@ +package com.gg.server.admin.receipt.data; + +import com.gg.server.domain.receipt.data.Receipt; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +public interface ReceiptAdminRepositorySearch { + @Query(value = "select re from Receipt re where re.purchaserIntraId = :intraId or re.ownerIntraId = :intraId") + Page findReceiptByIntraId(@Param("intraId") String intraId, Pageable pageable); +} diff --git a/src/main/java/com/gg/server/admin/receipt/dto/ReceiptAdminPageRequestDto.java b/src/main/java/com/gg/server/admin/receipt/dto/ReceiptAdminPageRequestDto.java new file mode 100644 index 000000000..f7fa203bb --- /dev/null +++ b/src/main/java/com/gg/server/admin/receipt/dto/ReceiptAdminPageRequestDto.java @@ -0,0 +1,14 @@ +package com.gg.server.admin.receipt.dto; + +import com.gg.server.global.dto.PageRequestDto; +import lombok.Getter; + +@Getter +public class ReceiptAdminPageRequestDto extends PageRequestDto { + String intraId; + + public ReceiptAdminPageRequestDto(String intraId, Integer page, Integer size) { + super(page, size); + this.intraId = intraId; + } +} diff --git a/src/main/java/com/gg/server/admin/receipt/service/ReceiptAdminService.java b/src/main/java/com/gg/server/admin/receipt/service/ReceiptAdminService.java index d261e9b9e..9462acbbf 100644 --- a/src/main/java/com/gg/server/admin/receipt/service/ReceiptAdminService.java +++ b/src/main/java/com/gg/server/admin/receipt/service/ReceiptAdminService.java @@ -3,6 +3,7 @@ import com.gg.server.admin.receipt.data.ReceiptAdminRepository; import com.gg.server.admin.receipt.dto.ReceiptListResponseDto; import com.gg.server.admin.receipt.dto.ReceiptResponseDto; +import com.gg.server.domain.receipt.data.Receipt; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -19,4 +20,11 @@ public ReceiptListResponseDto getAllReceipt(Pageable pageable) { Page responseDtos = receiptAdminRepository.findAll(pageable).map(ReceiptResponseDto::new); return new ReceiptListResponseDto(responseDtos.getContent(), responseDtos.getTotalPages()); } + + @Transactional(readOnly = true) + public ReceiptListResponseDto findByIntraId(String intraId, Pageable pageable) { + Page receipts = receiptAdminRepository.findReceiptByIntraId(intraId, pageable); + Page responseDtos = receipts.map(ReceiptResponseDto::new); + return new ReceiptListResponseDto(responseDtos.getContent(), responseDtos.getTotalPages()); + } } From d6dd3eede516bd6a98f981231a0921c1ea54ea1b Mon Sep 17 00:00:00 2001 From: sion99 Date: Fri, 11 Aug 2023 12:35:13 +0900 Subject: [PATCH 063/273] =?UTF-8?q?[REFACTOR]=20Query=EB=AC=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/admin/receipt/data/ReceiptAdminRepositorySearch.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/admin/receipt/data/ReceiptAdminRepositorySearch.java b/src/main/java/com/gg/server/admin/receipt/data/ReceiptAdminRepositorySearch.java index 4065857a5..8fe9ef358 100644 --- a/src/main/java/com/gg/server/admin/receipt/data/ReceiptAdminRepositorySearch.java +++ b/src/main/java/com/gg/server/admin/receipt/data/ReceiptAdminRepositorySearch.java @@ -7,6 +7,6 @@ import org.springframework.data.repository.query.Param; public interface ReceiptAdminRepositorySearch { - @Query(value = "select re from Receipt re where re.purchaserIntraId = :intraId or re.ownerIntraId = :intraId") + @Query(value = "select re from Receipt re where re.purchaserIntraId = :intraId or re.ownerIntraId = :intraId order by re.createdAt desc") Page findReceiptByIntraId(@Param("intraId") String intraId, Pageable pageable); } From 5cbb57207a0e7bf01bf1fc29021475676580e966 Mon Sep 17 00:00:00 2001 From: sion99 Date: Fri, 11 Aug 2023 12:36:10 +0900 Subject: [PATCH 064/273] =?UTF-8?q?[TEST]=20Receipt=20=EC=A0=84=EC=B2=B4?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C,=20=EC=9C=A0=EC=A0=80=EB=B3=84=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20TEST?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReceiptAdminControllerTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/test/java/com/gg/server/admin/receipt/controller/ReceiptAdminControllerTest.java b/src/test/java/com/gg/server/admin/receipt/controller/ReceiptAdminControllerTest.java index ecc6ed5c3..e61870fa9 100644 --- a/src/test/java/com/gg/server/admin/receipt/controller/ReceiptAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/receipt/controller/ReceiptAdminControllerTest.java @@ -59,4 +59,25 @@ public void getAllReceipt() throws Exception { assertThat(result.getReceiptList().get(0).getItemName()).isEqualTo(expect.getReceiptList().get(0).getItemName()); assertThat(result.getReceiptList().get(0).getItemPrice()).isEqualTo(expect.getReceiptList().get(0).getItemPrice()); } + + @Test + @DisplayName("GET /pingpong/admin/receipt/list") + public void findByIntraId() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Integer page = 1; + Integer size = 20; + String intraId = "sishin"; + String url = "/pingpong/admin/receipt/list?page=" + page + "&size=" + size + "&intraId=" + intraId; + Pageable pageable = PageRequest.of(page - 1, size, Sort.by("createdAt").descending()); + String contentAsString = mockMvc.perform(get(url) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + ReceiptListResponseDto expect = receiptAdminService.findByIntraId(intraId, pageable); + ReceiptListResponseDto result = objectMapper.readValue(contentAsString, ReceiptListResponseDto.class); + assertThat(result.getReceiptList().get(0).getReceiptId()).isEqualTo(expect.getReceiptList().get(0).getReceiptId()); + assertThat(result.getReceiptList().get(0).getCreatedAt()).isEqualTo(expect.getReceiptList().get(0).getCreatedAt()); + assertThat(result.getReceiptList().get(0).getItemName()).isEqualTo(expect.getReceiptList().get(0).getItemName()); + assertThat(result.getReceiptList().get(0).getItemPrice()).isEqualTo(expect.getReceiptList().get(0).getItemPrice()); + } } \ No newline at end of file From 1bf3da5a6dcadaf3931f895d8fe4b6c7bf640ff1 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Fri, 11 Aug 2023 15:51:11 +0900 Subject: [PATCH 065/273] =?UTF-8?q?[feat]=20GGBE4-19=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=EC=BD=94=EC=9D=B8=20=EC=82=AC=EC=9A=A9=EB=82=B4=EC=97=AD=20get?= =?UTF-8?q?=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coin/data/CoinHistoryRepository.java | 5 ++++ .../user/controller/UserController.java | 10 ++++++++ .../user/dto/CoinHistoryResponseDto.java | 22 ++++++++++++++++ .../dto/UserCoinHistoryListResponseDto.java | 17 +++++++++++++ .../domain/user/service/UserCoinService.java | 25 +++++++++++++++++++ 5 files changed, 79 insertions(+) create mode 100644 src/main/java/com/gg/server/domain/user/dto/CoinHistoryResponseDto.java create mode 100644 src/main/java/com/gg/server/domain/user/dto/UserCoinHistoryListResponseDto.java diff --git a/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java b/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java index e474fcd4d..cb75f9483 100644 --- a/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java +++ b/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java @@ -1,6 +1,9 @@ package com.gg.server.domain.coin.data; +import com.gg.server.domain.feedback.data.Feedback; import com.gg.server.domain.user.data.User; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -15,4 +18,6 @@ public interface CoinHistoryRepository extends JpaRepository CoinHistory findFirstByOrderByIdDesc(); List findAllByUserOrderByIdDesc(User user); + + Page findAllByUserOrderByIdDesc(User user, Pageable pageable); } diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index 3cda74a0f..40cb485b2 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -15,6 +15,7 @@ import com.gg.server.domain.user.type.EdgeType; import com.gg.server.domain.user.type.OauthType; import com.gg.server.domain.user.type.RoleType; +import com.gg.server.global.dto.PageRequestDto; import com.gg.server.global.security.config.properties.AppProperties; import com.gg.server.global.security.cookie.CookieUtil; import com.gg.server.global.security.jwt.utils.TokenHeaders; @@ -24,6 +25,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -146,4 +148,12 @@ public ResponseEntity updateEdge(@RequestBody @Valid UserEdgeDto userEdgeDto, @P public UserCoinResponseDto getUserCoin(@Parameter(hidden = true) @Login UserDto user) { return userCoinService.getUserCoin(user.getIntraId()); } + + @GetMapping("/coins") + public ResponseEntity getUserCoinHistory(@ModelAttribute @Valid PageRequestDto coReq, @Parameter(hidden = true) @Login UserDto user) { + Pageable pageable = PageRequest.of(coReq.getPage() - 1, coReq.getSize(), Sort.by("createdAt").descending()); + + return ResponseEntity.ok() + .body(userCoinService.getUserCoinHistory(pageable ,user.getIntraId())); + } } diff --git a/src/main/java/com/gg/server/domain/user/dto/CoinHistoryResponseDto.java b/src/main/java/com/gg/server/domain/user/dto/CoinHistoryResponseDto.java new file mode 100644 index 000000000..74066fb9f --- /dev/null +++ b/src/main/java/com/gg/server/domain/user/dto/CoinHistoryResponseDto.java @@ -0,0 +1,22 @@ +package com.gg.server.domain.user.dto; + +import com.gg.server.domain.coin.data.CoinHistory; +import com.gg.server.domain.coin.data.CoinHistoryRepository; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Getter +@NoArgsConstructor +public class CoinHistoryResponseDto { + private String history; + private int amount; + private LocalDateTime createdAt; + + public CoinHistoryResponseDto(CoinHistory coinHistory) { + this.history = coinHistory.getHistory(); + this.amount = coinHistory.getAmount(); + this.createdAt = coinHistory.getCreatedAt(); + } +} diff --git a/src/main/java/com/gg/server/domain/user/dto/UserCoinHistoryListResponseDto.java b/src/main/java/com/gg/server/domain/user/dto/UserCoinHistoryListResponseDto.java new file mode 100644 index 000000000..b00f3c702 --- /dev/null +++ b/src/main/java/com/gg/server/domain/user/dto/UserCoinHistoryListResponseDto.java @@ -0,0 +1,17 @@ +package com.gg.server.domain.user.dto; + +import com.gg.server.admin.coin.dto.CoinPolicyAdminResponseDto; +import com.gg.server.domain.coin.data.CoinHistory; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@AllArgsConstructor +@NoArgsConstructor +@Getter +public class UserCoinHistoryListResponseDto { + private List coinPolicyList; + private int totalPage; +} diff --git a/src/main/java/com/gg/server/domain/user/service/UserCoinService.java b/src/main/java/com/gg/server/domain/user/service/UserCoinService.java index 687f678a8..b458da43d 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserCoinService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserCoinService.java @@ -1,20 +1,45 @@ package com.gg.server.domain.user.service; +import com.gg.server.admin.feedback.dto.FeedbackAdminResponseDto; +import com.gg.server.admin.feedback.dto.FeedbackListAdminResponseDto; +import com.gg.server.domain.coin.data.CoinHistory; +import com.gg.server.domain.coin.data.CoinHistoryRepository; +import com.gg.server.domain.feedback.data.Feedback; +import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.dto.CoinHistoryResponseDto; +import com.gg.server.domain.user.dto.UserCoinHistoryListResponseDto; import com.gg.server.domain.user.dto.UserCoinResponseDto; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.domain.user.exception.UserNotFoundException; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @RequiredArgsConstructor @Service public class UserCoinService { private final UserRepository userRepository; + private final CoinHistoryRepository coinHistoryRepository; + @Transactional(readOnly = true) public UserCoinResponseDto getUserCoin(String intraId) { int userCoin = userRepository.findByIntraId(intraId).orElseThrow(() -> new UserNotFoundException()).getGgCoin(); return new UserCoinResponseDto(userCoin); } + + @Transactional(readOnly = true) + public UserCoinHistoryListResponseDto getUserCoinHistory(Pageable pageable, String intraId) { + User user = userRepository.findByIntraId(intraId).orElseThrow(() -> new UserNotFoundException()); + + Page coinHistories = coinHistoryRepository.findAllByUserOrderByIdDesc(user, pageable); + Page coinHistoryResponseDtos = coinHistories.map(CoinHistoryResponseDto::new); + UserCoinHistoryListResponseDto responseDto = new UserCoinHistoryListResponseDto(coinHistoryResponseDtos.getContent(), + coinHistoryResponseDtos.getTotalPages()); + + return responseDto; + } } From 4274055475227134d16e60983fbc933bfb2d2b55 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Fri, 11 Aug 2023 16:07:47 +0900 Subject: [PATCH 066/273] [test] GGBE4-19 get user coinHistory api --- .../user/controller/UserControllerTest.java | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java index bf987fd39..27d617bcd 100644 --- a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java +++ b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.gg.server.domain.coin.data.CoinHistoryRepository; import com.gg.server.domain.coin.data.CoinPolicyRepository; +import com.gg.server.domain.coin.service.CoinHistoryService; import com.gg.server.domain.game.data.Game; import com.gg.server.domain.game.data.GameRepository; import com.gg.server.domain.game.dto.req.RankResultReqDto; @@ -89,6 +90,9 @@ class UserControllerTest { @Autowired CoinHistoryRepository coinHistoryRepository; + @Autowired + CoinHistoryService coinHistoryService; + @AfterEach public void flushRedis() { @@ -423,4 +427,30 @@ public void getUserCoin() throws Exception { assertThat(result.getCoin()).isEqualTo(userCoin); System.out.println(userCoin); } + + @Test + @DisplayName("[get]/pingpong/users/coins") + public void getUserCoinHistory() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + User user = userRepository.getById(userId); + + coinHistoryService.addNormalCoin(user); + coinHistoryService.addRankWinCoin(user); + coinHistoryService.addNormalCoin(user); + String url = "/pingpong/users/coins?page=1&size=5"; + + String contentAsString = mockMvc.perform(get(url) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + + UserCoinHistoryListResponseDto result = objectMapper.readValue(contentAsString, UserCoinHistoryListResponseDto.class); + + System.out.println(result.getTotalPage()); + for(CoinHistoryResponseDto temp : result.getCoinPolicyList()){ + System.out.println(temp.getHistory() + " " + temp.getAmount() + " " + temp.getCreatedAt()); + } + + } } From a268a545c2783003e9d9a6b1390d0dc3d3eafc72 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sat, 12 Aug 2023 11:06:14 +0900 Subject: [PATCH 067/273] [FEAT] add background change api (random) --- .../user/controller/UserController.java | 6 +++ .../com/gg/server/domain/user/data/User.java | 4 ++ .../domain/user/service/UserService.java | 12 ++++-- .../domain/user/type/BackgroundType.java | 42 ++++++++++++++++--- 4 files changed, 55 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index 3cda74a0f..ca3aebb84 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -146,4 +146,10 @@ public ResponseEntity updateEdge(@RequestBody @Valid UserEdgeDto userEdgeDto, @P public UserCoinResponseDto getUserCoin(@Parameter(hidden = true) @Login UserDto user) { return userCoinService.getUserCoin(user.getIntraId()); } + + @PatchMapping("/background") + public ResponseEntity updateBackground(@Parameter(hidden = true) @Login UserDto user) { + userService.updateBackground(user.getId()); + return new ResponseEntity(HttpStatus.NO_CONTENT); + } } diff --git a/src/main/java/com/gg/server/domain/user/data/User.java b/src/main/java/com/gg/server/domain/user/data/User.java index 98fa71ddc..d1e54592d 100644 --- a/src/main/java/com/gg/server/domain/user/data/User.java +++ b/src/main/java/com/gg/server/domain/user/data/User.java @@ -116,4 +116,8 @@ public int addGgCoin(int plus) { this.ggCoin += plus; return this.ggCoin; } + + public void updateBackground(BackgroundType background) { + this.background = background; + } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 091122c0b..4ac5c426e 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -26,10 +26,7 @@ import com.gg.server.domain.user.exception.UserEdgeTypeNotFound; import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.exception.UserTextColorException; -import com.gg.server.domain.user.type.EdgeType; -import com.gg.server.domain.user.type.RacketType; -import com.gg.server.domain.user.type.RoleType; -import com.gg.server.domain.user.type.SnsType; +import com.gg.server.domain.user.type.*; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -277,4 +274,11 @@ public void updateEdge(Long userId, UserEdgeDto userEdgeDto) { if (edgeType.equals(EdgeType.WRONG)) throw new UserEdgeTypeNotFound(); user.updateEdge(edgeType); } + + @Transactional + public void updateBackground(Long userId) { + User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new); + BackgroundType backgroundType = BackgroundType.getRandomBackgroundType(); + user.updateBackground(backgroundType); + } } diff --git a/src/main/java/com/gg/server/domain/user/type/BackgroundType.java b/src/main/java/com/gg/server/domain/user/type/BackgroundType.java index c2fcc8aaa..d8baf4537 100644 --- a/src/main/java/com/gg/server/domain/user/type/BackgroundType.java +++ b/src/main/java/com/gg/server/domain/user/type/BackgroundType.java @@ -2,14 +2,46 @@ import lombok.RequiredArgsConstructor; +import java.util.Random; + @RequiredArgsConstructor public enum BackgroundType { - BASIC(0, "basic"), - COLOR2(1, "color2"), - COLOR3(2, "color3"); + BASIC(0), + COLOR1(1), + COLOR2(2), + COLOR3(3), + COLOR4(4), + COLOR5(5), + COLOR6(6), + COLOR7(7), + COLOR8(8), + COLOR9(9), + COLOR10(10), + COLOR11(11), + COLOR12(12), + COLOR13(13), + COLOR14(14), + COLOR15(15); + + private final Integer code; - private final Integer value; - private final String code; + public static BackgroundType getRandomBackgroundType() { + Random random = new Random(); + int tierInt = random.nextInt(100); + int colorInt; + + if (tierInt < 5) + colorInt = random.nextInt(99) % 3; + else if (tierInt < 15) + colorInt = (random.nextInt(99) % 3) + 3; + else if (tierInt < 30) + colorInt = (random.nextInt(99) % 3) + 6; + else if (tierInt < 50) + colorInt = (random.nextInt(99) % 3) + 9; + else + colorInt = (random.nextInt(99) % 3) + 12; + return BackgroundType.values()[colorInt]; + } public static BackgroundType of(String code) { return BackgroundType.valueOf(code); From 1b4d0b0e2163ea399579a08118b827aaeeecca16 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sat, 12 Aug 2023 12:04:33 +0900 Subject: [PATCH 068/273] [TEST] add background change api test --- .../user/controller/UserControllerTest.java | 36 ++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java index bf987fd39..1c8d6122c 100644 --- a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java +++ b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java @@ -20,10 +20,7 @@ import com.gg.server.domain.user.controller.dto.GameInfoDto; import com.gg.server.domain.user.dto.*; import com.gg.server.domain.user.exception.UserNotFoundException; -import com.gg.server.domain.user.type.EdgeType; -import com.gg.server.domain.user.type.RacketType; -import com.gg.server.domain.user.type.RoleType; -import com.gg.server.domain.user.type.SnsType; +import com.gg.server.domain.user.type.*; import lombok.extern.slf4j.Slf4j; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.AfterEach; @@ -40,6 +37,7 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; +import java.util.Arrays; import java.util.Comparator; import java.util.List; @@ -423,4 +421,34 @@ public void getUserCoin() throws Exception { assertThat(result.getCoin()).isEqualTo(userCoin); System.out.println(userCoin); } + + @Test + @DisplayName("[patch] background") + public void updateBackgroundTest() throws Exception { + //given + Season season = testDataUtils.createSeason(); + String intraId = "intraId"; + String email = "email"; + String imageUrl = "imageUrl"; + User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, + SnsType.BOTH, RoleType.ADMIN); + String statusMessage = "statusMessage"; + testDataUtils.createUserRank(newUser, statusMessage, season); + String accessToken = tokenProvider.createToken(newUser.getId()); + String url = "/pingpong/users/background"; + + //when + mockMvc.perform(patch(url) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().is2xxSuccessful()) + .andReturn().getResponse().getContentAsString(); + + //then + log.info("user.getBacground() : {}", newUser.getBackground()); + userRepository.findById(newUser.getId()).ifPresentOrElse(user -> { + Assertions.assertThat(Arrays.stream(BackgroundType.values()).anyMatch(v -> v.equals(user.getBackground()))).isEqualTo(true); + }, () -> { + Assertions.fail("유저 업데이트 실패"); + }); + } } From ee6312dbb9f2ae2e8cead04e2633dad02d1ed5e8 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sat, 12 Aug 2023 12:13:10 +0900 Subject: [PATCH 069/273] =?UTF-8?q?[FIX]=20edge=20change=20api=20=EB=9E=9C?= =?UTF-8?q?=EB=8D=A4=EB=BD=91=EA=B8=B0=EB=A1=9C=20=EB=B0=94=EA=BF=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/controller/UserController.java | 11 +--- .../user/exception/UserEdgeTypeNotFound.java | 11 ---- .../domain/user/service/UserService.java | 6 +-- .../gg/server/domain/user/type/EdgeType.java | 53 ++++++++++++++----- .../gg/server/global/exception/ErrorCode.java | 2 +- 5 files changed, 44 insertions(+), 39 deletions(-) delete mode 100644 src/main/java/com/gg/server/domain/user/exception/UserEdgeTypeNotFound.java diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index ca3aebb84..833b54d4b 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -1,18 +1,12 @@ package com.gg.server.domain.user.controller; import com.gg.server.domain.game.type.Mode; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.*; import com.gg.server.domain.user.exception.KakaoOauth2AlreadyExistException; -import com.gg.server.domain.user.exception.UserEdgeTypeNotFound; -import com.gg.server.domain.user.exception.UserNotFoundException; -import com.gg.server.domain.user.exception.UserTextColorException; import com.gg.server.domain.user.service.UserAuthenticationService; import com.gg.server.domain.user.service.UserCoinService; import com.gg.server.domain.user.service.UserService; import com.gg.server.domain.user.service.UserTextColorCheckService; -import com.gg.server.domain.user.type.EdgeType; import com.gg.server.domain.user.type.OauthType; import com.gg.server.domain.user.type.RoleType; import com.gg.server.global.security.config.properties.AppProperties; @@ -22,7 +16,6 @@ import io.swagger.v3.oas.annotations.Parameter; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.http.HttpStatus; @@ -137,8 +130,8 @@ public UserAttendanceResponseDto attendUser(@Parameter(hidden = true) @Login Use } @PatchMapping("/edge") - public ResponseEntity updateEdge(@RequestBody @Valid UserEdgeDto userEdgeDto, @Parameter(hidden = true) @Login UserDto user) { - userService.updateEdge(user.getId(), userEdgeDto); + public ResponseEntity updateEdge(@Parameter(hidden = true) @Login UserDto user) { + userService.updateEdge(user.getId()); return new ResponseEntity(HttpStatus.NO_CONTENT); } diff --git a/src/main/java/com/gg/server/domain/user/exception/UserEdgeTypeNotFound.java b/src/main/java/com/gg/server/domain/user/exception/UserEdgeTypeNotFound.java deleted file mode 100644 index 8f53fc121..000000000 --- a/src/main/java/com/gg/server/domain/user/exception/UserEdgeTypeNotFound.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.gg.server.domain.user.exception; - -import com.gg.server.global.exception.ErrorCode; - -import com.gg.server.global.exception.custom.NotExistException; - -public class UserEdgeTypeNotFound extends NotExistException { - public UserEdgeTypeNotFound() { - super("user edge type is not valid", ErrorCode.USER_EDGE_TYPE_NOT_FOUND); - } -} diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 4ac5c426e..37a535bef 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -23,7 +23,6 @@ import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.*; import com.gg.server.domain.user.exception.UserAlreadyAttendanceException; -import com.gg.server.domain.user.exception.UserEdgeTypeNotFound; import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.exception.UserTextColorException; import com.gg.server.domain.user.type.*; @@ -268,10 +267,9 @@ public void updateTextColor(Long userId, UserTextColorDto textColorDto) { } @Transactional - public void updateEdge(Long userId, UserEdgeDto userEdgeDto) { + public void updateEdge(Long userId) { User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new); - EdgeType edgeType = userEdgeDto.getEdgeType(); - if (edgeType.equals(EdgeType.WRONG)) throw new UserEdgeTypeNotFound(); + EdgeType edgeType = EdgeType.getRandomEdgeType(); user.updateEdge(edgeType); } diff --git a/src/main/java/com/gg/server/domain/user/type/EdgeType.java b/src/main/java/com/gg/server/domain/user/type/EdgeType.java index 49c0ab9bf..6c1d34701 100644 --- a/src/main/java/com/gg/server/domain/user/type/EdgeType.java +++ b/src/main/java/com/gg/server/domain/user/type/EdgeType.java @@ -1,24 +1,49 @@ package com.gg.server.domain.user.type; -import com.fasterxml.jackson.annotation.JsonCreator; import lombok.RequiredArgsConstructor; +import java.util.Random; + @RequiredArgsConstructor public enum EdgeType { - WRONG("wrong"), - BASIC("basic"), - COLOR2("color2"), - COLOR3("color3"); + BASIC(0), + COLOR1(1), + COLOR2(2), + COLOR3(3), + COLOR4(4), + COLOR5(5), + COLOR6(6), + COLOR7(7), + COLOR8(8), + COLOR9(9), + COLOR10(10), + COLOR11(11), + COLOR12(12), + COLOR13(13), + COLOR14(14), + COLOR15(15); + + private final Integer code; - private final String url; + public static EdgeType getRandomEdgeType() { + Random random = new Random(); + int tierInt = random.nextInt(100); + int colorInt; + + if (tierInt < 5) + colorInt = random.nextInt(99) % 3; + else if (tierInt < 15) + colorInt = (random.nextInt(99) % 3) + 3; + else if (tierInt < 30) + colorInt = (random.nextInt(99) % 3) + 6; + else if (tierInt < 50) + colorInt = (random.nextInt(99) % 3) + 9; + else + colorInt = (random.nextInt(99) % 3) + 12; + return EdgeType.values()[colorInt]; + } - @JsonCreator - public static EdgeType getEnumFromValue(String edgeDto) { - for (EdgeType e : EdgeType.values()) { - if (e.toString().equals(edgeDto)) { - return e; - } - } - return WRONG; + public static EdgeType of(String code) { + return EdgeType.valueOf(code); } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index f602ff7e4..d0e9a2ae1 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -15,7 +15,7 @@ public enum ErrorCode { KAKAO_OAUTH2_DUPLICATE(409, "UR300", "KAKAO OAUTH2 ALREADY EXIST"), USER_TEXT_COLOR_WRONG_TYPE(401, "UR403", "USER TEXT COLOR CODE IS WRONG"), USER_ALREADY_ATTENDANCE(409, "UR301", "USER ALREADY ATTENDANCE"), - USER_EDGE_TYPE_NOT_FOUND(404, "UR102", "USER EDGE TYPE NOT FOUND"), + //announcement ANNOUNCE_NOT_FOUND(404, "AN100", "ANNOUNCEMENT NOT FOUND"), ANNOUNCE_DUPLICATE(409, "AN300", "ANNOUNCEMENT DUPLICATION"), From 8928927b4b2b160b9d1972373c6b359fc5c6b003 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sat, 12 Aug 2023 12:14:36 +0900 Subject: [PATCH 070/273] =?UTF-8?q?[TEST]=20edge=20change=20api=20?= =?UTF-8?q?=EB=9E=9C=EB=8D=A4=EB=BD=91=EA=B8=B0=EB=A1=9C=20TEST=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/controller/UserControllerTest.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java index 1c8d6122c..962383a8d 100644 --- a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java +++ b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java @@ -386,18 +386,16 @@ public void updateEdgeTest() throws Exception { String accessToken = tokenProvider.createToken(newUser.getId()); String url = "/pingpong/users/edge"; - EdgeType newEdge = EdgeType.BASIC; - //when - mockMvc.perform(patch(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) - .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new UserEdgeDto(newEdge)))) - .andExpect(status().is2xxSuccessful()); + mockMvc.perform(patch(url) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().is2xxSuccessful()) + .andReturn().getResponse().getContentAsString(); + //then - log.info("newEdge : {}", newEdge); log.info("user.getEdge() : {}", newUser.getEdge()); userRepository.findById(newUser.getId()).ifPresentOrElse(user -> { - Assertions.assertThat(user.getEdge()).isEqualTo(newEdge); + Assertions.assertThat(Arrays.stream(EdgeType.values()).anyMatch(v -> v.equals(user.getEdge()))).isEqualTo(true); }, () -> { Assertions.fail("유저 업데이트 실패"); }); From b56d5beb502abc7c74fc163f99faf6fa64a592bb Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sat, 12 Aug 2023 13:37:26 +0900 Subject: [PATCH 071/273] =?UTF-8?q?[FIX]=20=ED=99=95=EB=A5=A0=20=EB=B2=94?= =?UTF-8?q?=EC=9C=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/type/BackgroundType.java | 19 ++++++++++--------- .../gg/server/domain/user/type/EdgeType.java | 19 ++++++++++--------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/gg/server/domain/user/type/BackgroundType.java b/src/main/java/com/gg/server/domain/user/type/BackgroundType.java index d8baf4537..681968381 100644 --- a/src/main/java/com/gg/server/domain/user/type/BackgroundType.java +++ b/src/main/java/com/gg/server/domain/user/type/BackgroundType.java @@ -30,16 +30,17 @@ public static BackgroundType getRandomBackgroundType() { int tierInt = random.nextInt(100); int colorInt; - if (tierInt < 5) - colorInt = random.nextInt(99) % 3; - else if (tierInt < 15) - colorInt = (random.nextInt(99) % 3) + 3; - else if (tierInt < 30) - colorInt = (random.nextInt(99) % 3) + 6; - else if (tierInt < 50) - colorInt = (random.nextInt(99) % 3) + 9; + if (tierInt <= 50) + colorInt = random.nextInt(100) % 4; + else if (tierInt <= 70) + colorInt = (random.nextInt(99) % 3) + 4; + else if (tierInt <= 85) + colorInt = (random.nextInt(99) % 3) + 7; + else if (tierInt <= 95) + colorInt = (random.nextInt(99) % 3) + 10; else - colorInt = (random.nextInt(99) % 3) + 12; + colorInt = (random.nextInt(99) % 3) + 13; + return BackgroundType.values()[colorInt]; } diff --git a/src/main/java/com/gg/server/domain/user/type/EdgeType.java b/src/main/java/com/gg/server/domain/user/type/EdgeType.java index 6c1d34701..5c5a7aab1 100644 --- a/src/main/java/com/gg/server/domain/user/type/EdgeType.java +++ b/src/main/java/com/gg/server/domain/user/type/EdgeType.java @@ -30,16 +30,17 @@ public static EdgeType getRandomEdgeType() { int tierInt = random.nextInt(100); int colorInt; - if (tierInt < 5) - colorInt = random.nextInt(99) % 3; - else if (tierInt < 15) - colorInt = (random.nextInt(99) % 3) + 3; - else if (tierInt < 30) - colorInt = (random.nextInt(99) % 3) + 6; - else if (tierInt < 50) - colorInt = (random.nextInt(99) % 3) + 9; + if (tierInt <= 50) + colorInt = random.nextInt(100) % 4; + else if (tierInt <= 70) + colorInt = (random.nextInt(99) % 3) + 4; + else if (tierInt <= 85) + colorInt = (random.nextInt(99) % 3) + 7; + else if (tierInt <= 95) + colorInt = (random.nextInt(99) % 3) + 10; else - colorInt = (random.nextInt(99) % 3) + 12; + colorInt = (random.nextInt(99) % 3) + 13; + return EdgeType.values()[colorInt]; } From 457c397f1e82d66b259483f09d6b31a278cfe72f Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Sun, 13 Aug 2023 22:41:10 +0900 Subject: [PATCH 072/273] [feat] GGBE4-43 fix normal game result api --- .../coin/dto/UserGameCoinResultDto.java | 18 ++++++++++++ .../coin/service/CoinHistoryService.java | 6 ++-- .../coin/service/UserCoinChangeService.java | 28 +++++++++++++++++++ .../game/dto/ExpChangeResultResDto.java | 9 +++++- .../domain/game/service/GameService.java | 13 +++++---- .../pchange/service/PChangeService.java | 1 - 6 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/gg/server/domain/coin/dto/UserGameCoinResultDto.java create mode 100644 src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java diff --git a/src/main/java/com/gg/server/domain/coin/dto/UserGameCoinResultDto.java b/src/main/java/com/gg/server/domain/coin/dto/UserGameCoinResultDto.java new file mode 100644 index 000000000..4030c370b --- /dev/null +++ b/src/main/java/com/gg/server/domain/coin/dto/UserGameCoinResultDto.java @@ -0,0 +1,18 @@ +package com.gg.server.domain.coin.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class UserGameCoinResultDto { + private int beforeCoin; + private int afterCoin; + private int coinIncrement; + + public UserGameCoinResultDto(int afterCoin, int coinIncrement) { + this.beforeCoin = afterCoin - coinIncrement; + this.afterCoin = afterCoin; + this.coinIncrement = coinIncrement; + } +} diff --git a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java index 94df6ad92..be065fcda 100644 --- a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java +++ b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java @@ -23,19 +23,19 @@ public void addAttendanceCoinHistory(User user) { @Transactional public void addNormalCoin(User user){ - int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getNormal(); + int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getNormal(); addCoinHistory(new CoinHistory(user, HistoryType.NORMAL.getHistory(), amount)); } @Transactional public void addRankWinCoin(User user){ - int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getRankWin(); + int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getRankWin(); addCoinHistory(new CoinHistory(user, HistoryType.RANKWIN.getHistory(), amount)); } @Transactional public void addRankLoseCoin(User user){ - int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getRankLose(); + int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getRankLose(); addCoinHistory(new CoinHistory(user, HistoryType.RANKLOSE.getHistory(), amount)); } diff --git a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java new file mode 100644 index 000000000..f58b2e168 --- /dev/null +++ b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java @@ -0,0 +1,28 @@ +package com.gg.server.domain.coin.service; + +import com.gg.server.domain.coin.data.CoinPolicyRepository; +import com.gg.server.domain.coin.dto.UserGameCoinResultDto; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.exception.UserNotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class UserCoinChangeService { + private final CoinPolicyRepository coinPolicyRepository; + private final CoinHistoryService coinHistoryService; + private final UserRepository userRepository; + + @Transactional + public UserGameCoinResultDto addNormalGameCoin(Long userId) { + User user = userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException()); + int coinIncrement = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getNormal(); + + user.addGgCoin(coinIncrement); + coinHistoryService.addNormalCoin(user); + return new UserGameCoinResultDto(user.getGgCoin(), coinIncrement); + } +} diff --git a/src/main/java/com/gg/server/domain/game/dto/ExpChangeResultResDto.java b/src/main/java/com/gg/server/domain/game/dto/ExpChangeResultResDto.java index 9afe3842e..d8303f3fb 100644 --- a/src/main/java/com/gg/server/domain/game/dto/ExpChangeResultResDto.java +++ b/src/main/java/com/gg/server/domain/game/dto/ExpChangeResultResDto.java @@ -1,5 +1,6 @@ package com.gg.server.domain.game.dto; +import com.gg.server.domain.coin.dto.UserGameCoinResultDto; import com.gg.server.global.utils.ExpLevelCalculator; import lombok.Getter; import lombok.NoArgsConstructor; @@ -13,14 +14,20 @@ public class ExpChangeResultResDto { private Integer increasedExp; private Integer increasedLevel; private Integer afterMaxExp; + private int beforeCoin; + private int afterCoin; + private int coinIncrement; - public ExpChangeResultResDto(Integer beforeExp, Integer currentExp) { + public ExpChangeResultResDto(Integer beforeExp, Integer currentExp, UserGameCoinResultDto userGameCoinResultDto) { this.beforeExp = ExpLevelCalculator.getCurrentLevelMyExp(beforeExp); this.beforeLevel = ExpLevelCalculator.getLevel(beforeExp); this.beforeMaxExp = ExpLevelCalculator.getLevelMaxExp(beforeLevel); this.increasedExp = currentExp - beforeExp; this.increasedLevel = ExpLevelCalculator.getLevel(currentExp) - this.beforeLevel; this.afterMaxExp = ExpLevelCalculator.getLevelMaxExp(this.beforeLevel + this.increasedLevel); + this.beforeCoin = userGameCoinResultDto.getBeforeCoin(); + this.afterCoin = userGameCoinResultDto.getAfterCoin(); + this.coinIncrement = userGameCoinResultDto.getCoinIncrement(); } @Override diff --git a/src/main/java/com/gg/server/domain/game/service/GameService.java b/src/main/java/com/gg/server/domain/game/service/GameService.java index 2f7262815..773290f44 100644 --- a/src/main/java/com/gg/server/domain/game/service/GameService.java +++ b/src/main/java/com/gg/server/domain/game/service/GameService.java @@ -1,5 +1,7 @@ package com.gg.server.domain.game.service; +import com.gg.server.domain.coin.dto.UserGameCoinResultDto; +import com.gg.server.domain.coin.service.UserCoinChangeService; import com.gg.server.domain.game.data.Game; import com.gg.server.domain.game.data.GameRepository; import com.gg.server.domain.game.dto.*; @@ -38,8 +40,8 @@ public class GameService { private final RankRedisService rankRedisService; private final PChangeService pChangeService; private final PChangeRepository pChangeRepository; - private final GameFindService gameFindService; + private final UserCoinChangeService userCoinChangeService; @Transactional(readOnly = true) public GameTeamInfo getUserGameInfo(Long gameId, Long userId) { @@ -109,14 +111,15 @@ private void savePChange(Game game, List teamUsers, Long loginUserId) rankRedisService.getUserPpp(team2UserId, game.getSeason().getId()), team2UserId.equals(loginUserId)); } - @Transactional(readOnly = true) + @Transactional public ExpChangeResultResDto expChangeResult(Long gameId, Long userId) { List pChanges = pChangeService.findExpChangeHistory(gameId, userId); + UserGameCoinResultDto userGameCoinResultDto = userCoinChangeService.addNormalGameCoin(userId); + if (pChanges.size() == 1) { - return new ExpChangeResultResDto(0, pChanges.get(0).getExp()); + return new ExpChangeResultResDto(0, pChanges.get(0).getExp(), userGameCoinResultDto); } else { - log.info("before:", pChanges.get(1).getExp(), ", after: ", pChanges.get(0).getExp()); - return new ExpChangeResultResDto(pChanges.get(1).getExp(), pChanges.get(0).getExp()); + return new ExpChangeResultResDto(pChanges.get(1).getExp(), pChanges.get(0).getExp(), userGameCoinResultDto); } } diff --git a/src/main/java/com/gg/server/domain/pchange/service/PChangeService.java b/src/main/java/com/gg/server/domain/pchange/service/PChangeService.java index 9b95778b0..968f2755a 100644 --- a/src/main/java/com/gg/server/domain/pchange/service/PChangeService.java +++ b/src/main/java/com/gg/server/domain/pchange/service/PChangeService.java @@ -13,7 +13,6 @@ @Service @RequiredArgsConstructor -@Slf4j public class PChangeService { private final PChangeRepository pChangeRepository; From f5ad43fc7d0a77c3ace8a171c21616e33077f569 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Sun, 13 Aug 2023 23:25:16 +0900 Subject: [PATCH 073/273] =?UTF-8?q?[feat]=20GGBE4-34=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=EC=83=81=EC=84=B8=EB=B3=B4=EA=B8=B0=20=EC=BD=94=EC=9D=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/admin/user/dto/UserDetailAdminResponseDto.java | 4 ++++ .../server/admin/user/controller/UserAdminControllerTest.java | 1 + 2 files changed, 5 insertions(+) diff --git a/src/main/java/com/gg/server/admin/user/dto/UserDetailAdminResponseDto.java b/src/main/java/com/gg/server/admin/user/dto/UserDetailAdminResponseDto.java index e5c8ebd7a..819134d75 100644 --- a/src/main/java/com/gg/server/admin/user/dto/UserDetailAdminResponseDto.java +++ b/src/main/java/com/gg/server/admin/user/dto/UserDetailAdminResponseDto.java @@ -21,6 +21,7 @@ public class UserDetailAdminResponseDto { private String email; private String roleType; private Integer exp; + private Integer coin; public UserDetailAdminResponseDto(User user, RankRedis rank) { this.userId = user.getId(); @@ -34,6 +35,7 @@ public UserDetailAdminResponseDto(User user, RankRedis rank) { this.email = user.getEMail(); this.roleType = user.getRoleType().getKey(); this.exp = user.getTotalExp(); + this.coin = user.getGgCoin(); } public UserDetailAdminResponseDto(User user) { @@ -48,6 +50,7 @@ public UserDetailAdminResponseDto(User user) { this.email = user.getEMail() == null ? "" : user.getEMail(); this.roleType = user.getRoleType().getKey(); this.exp = user.getTotalExp(); + this.coin = user.getGgCoin(); } @Override @@ -62,6 +65,7 @@ public String toString() { ", ppp='" + ppp.toString() + '\'' + ", email='" + email + '\'' + ", roleType='" + roleType + '\'' + + ", coin='" + coin + '\'' + '}'; } } diff --git a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java index e48a3d562..3c90cd52b 100644 --- a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java @@ -143,5 +143,6 @@ public void userGetDetailTest() throws Exception{ Assertions.assertThat(actureResponse.getEmail()).isEqualTo(expectedResponse.getEmail()); Assertions.assertThat(actureResponse.getRoleType()).isEqualTo(expectedResponse.getRoleType()); Assertions.assertThat(actureResponse.getExp()).isEqualTo(expectedResponse.getExp()); + Assertions.assertThat(actureResponse.getCoin()).isEqualTo(expectedResponse.getCoin()); } } \ No newline at end of file From 603402e61f9cf18c75b0c0bc79813fdd88afea2f Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Sun, 13 Aug 2023 23:37:55 +0900 Subject: [PATCH 074/273] =?UTF-8?q?[feat]=20GGBE4-37=20=EC=96=B4=EB=93=9C?= =?UTF-8?q?=EB=AF=BC=20=EC=9C=A0=EC=A0=80=20=EC=83=81=EC=84=B8=EB=B3=B4?= =?UTF-8?q?=EA=B8=B0=20=EC=A0=80=EC=9E=A5api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/admin/user/controller/UserAdminController.java | 1 - .../server/admin/user/dto/UserUpdateAdminRequestDto.java | 8 +++++--- src/main/java/com/gg/server/domain/user/data/User.java | 1 + 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java index 76e63da38..15bc936cf 100644 --- a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java +++ b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java @@ -25,7 +25,6 @@ @RestController @AllArgsConstructor @RequestMapping(value = "/pingpong/admin/users") -@Slf4j public class UserAdminController { private final UserAdminService userAdminService; diff --git a/src/main/java/com/gg/server/admin/user/dto/UserUpdateAdminRequestDto.java b/src/main/java/com/gg/server/admin/user/dto/UserUpdateAdminRequestDto.java index c98b55de0..7175be106 100644 --- a/src/main/java/com/gg/server/admin/user/dto/UserUpdateAdminRequestDto.java +++ b/src/main/java/com/gg/server/admin/user/dto/UserUpdateAdminRequestDto.java @@ -15,6 +15,7 @@ public class UserUpdateAdminRequestDto { private Integer ppp; private String email; private String roleType; + private Integer coin; @Override public String toString() { @@ -23,9 +24,10 @@ public String toString() { ", statusMessage='" + statusMessage + '\'' + ", wins='" + wins + '\'' + ", losses'" + losses + '\'' + - ", ppp=" + ppp + '\'' + - ", email=" + email + '\'' + - ", roleType=" + roleType + + ", ppp='" + ppp + '\'' + + ", email='" + email + '\'' + + ", roleType='" + roleType + '\'' + + ", coin='" + coin + '\'' + '}'; } } diff --git a/src/main/java/com/gg/server/domain/user/data/User.java b/src/main/java/com/gg/server/domain/user/data/User.java index 98fa71ddc..0305304be 100644 --- a/src/main/java/com/gg/server/domain/user/data/User.java +++ b/src/main/java/com/gg/server/domain/user/data/User.java @@ -81,6 +81,7 @@ public void modifyUserDetail(UserUpdateAdminRequestDto updateReq) { this.eMail = updateReq.getEmail(); this.racketType = updateReq.getRacketType(); this.roleType = RoleType.of(updateReq.getRoleType()); + this.ggCoin = updateReq.getCoin(); } public void imageUpdate(String imageUri) { From af3a47a4dd1c495552d7bc50e46d9cb03d8ca04f Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Mon, 14 Aug 2023 00:52:18 +0900 Subject: [PATCH 075/273] =?UTF-8?q?[MODIFYING]=20=EC=83=81=EC=A0=90=20?= =?UTF-8?q?=EA=B5=AC=EB=A7=A4=ED=95=98=EA=B8=B0=20api=20=ED=9A=8C=EC=83=9D?= =?UTF-8?q?=20=EA=B8=B0=EB=85=90=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/controller/ItemController.java | 21 +++++++- .../item/dto/PurchaseItemRequestDto.java | 8 ++++ .../domain/item/service/ItemService.java | 48 ++++++++++++++++++- 3 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/gg/server/domain/item/dto/PurchaseItemRequestDto.java diff --git a/src/main/java/com/gg/server/domain/item/controller/ItemController.java b/src/main/java/com/gg/server/domain/item/controller/ItemController.java index 9df41603e..b648b2f77 100644 --- a/src/main/java/com/gg/server/domain/item/controller/ItemController.java +++ b/src/main/java/com/gg/server/domain/item/controller/ItemController.java @@ -1,8 +1,13 @@ package com.gg.server.domain.item.controller; import com.gg.server.domain.item.dto.ItemStoreListResponseDto; +import com.gg.server.domain.item.dto.PurchaseItemRequestDto; import com.gg.server.domain.item.service.ItemService; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.global.utils.argumentresolver.Login; +import io.swagger.v3.oas.annotations.Parameter; import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @RestController @@ -17,5 +22,19 @@ public ItemStoreListResponseDto getAllItems() { return itemService.getAllItems(); } + @PostMapping("/purchases/{itemId}") + public ResponseEntity purchaseItem(@PathVariable Long itemId, + @Parameter(hidden = true) @Login UserDto userDto, + @RequestBody PurchaseItemRequestDto requestDto) { + itemService.purchaseItem(itemId, userDto, requestDto); + return ResponseEntity.ok().build(); + } } - +// @PostMapping("/purchases/{itemId}") +// public ResponseEntity purchaseItem(@PathVariable Long itemId, +// @Parameter(hidden = true) @Login UserDto userDto, +// @RequestBody PurchaseItemRequestDto requestDto) { +// itemService.purchaseItem(itemId, userDto, requestDto); +// return ResponseEntity.ok().build(); +// } +// \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/item/dto/PurchaseItemRequestDto.java b/src/main/java/com/gg/server/domain/item/dto/PurchaseItemRequestDto.java new file mode 100644 index 000000000..ffdd82132 --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/dto/PurchaseItemRequestDto.java @@ -0,0 +1,8 @@ +package com.gg.server.domain.item.dto; + +import lombok.Getter; + +@Getter +public class PurchaseItemRequestDto { + private Long itemId; +} diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index 5bc7c1c95..53454fefb 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -1,11 +1,20 @@ package com.gg.server.domain.item.service; +import com.gg.server.domain.item.data.Item; import com.gg.server.domain.item.data.ItemRepository; import com.gg.server.domain.item.dto.ItemStoreListResponseDto; import com.gg.server.domain.item.dto.ItemStoreResponseDto; +import com.gg.server.domain.item.dto.PurchaseItemRequestDto; +import com.gg.server.domain.receipt.data.Receipt; +import com.gg.server.domain.receipt.data.ReceiptRepository; +import com.gg.server.domain.receipt.type.ItemStatus; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.dto.UserDto; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; @@ -14,10 +23,47 @@ public class ItemService { private final ItemRepository itemRepository; + private final ReceiptRepository receiptRepository; public ItemStoreListResponseDto getAllItems() { List itemStoreListResponseDto = itemRepository.findAllByIsVisible(true) .stream().map(ItemStoreResponseDto::new).collect(Collectors.toList()); return new ItemStoreListResponseDto(itemStoreListResponseDto); } -} \ No newline at end of file + + @Transactional + public void purchaseItem(Long itemId, UserDto userDto, PurchaseItemRequestDto requestDto) { + Item item = itemRepository.findById(itemId) + .orElseThrow( ()-> new IllegalArgumentException("해당 아이템이 없습니다" + itemId) ); + if (!item.getIsVisible()) + { + throw new IllegalArgumentException("지금은 구매할 수 없는 아이템 입니다."); + } + + Receipt receipt = new Receipt(item, userDto.getIntraId(), userDto.getIntraId(), + ItemStatus.BEFORE, LocalDateTime.now()); + receiptRepository.save(receipt); + } +} +// +// private final ItemRepository itemRepository; +// private final ReceiptRepository receiptRepository; +// +// public ItemStoreListResponseDto getAllItems() { +// List itemStoreListResponseDto = itemRepository.findAllByIsVisible(true) +// .stream().map(ItemStoreResponseDto::new).collect(Collectors.toList()); +// return new ItemStoreListResponseDto(itemStoreListResponseDto); +// } +// +// @Transactional +// public void purchaseItem(Long itemId, UserDto userDto, PurchaseItemRequestDto requestDto) { +// Item item = itemRepository.findById(itemId) +// .orElseThrow(() -> new IllegalArgumentException("No item found with id: " + itemId)); +// +// if(!item.getIsVisible()) { +// throw new IllegalArgumentException("Item is not available for purchase"); +// } +// +// Receipt receipt = new Receipt(item, userDto.getIntraId(), userDto.getIntraId(), ItemStatus.BEFORE, LocalDateTime.now()); +// receiptRepository.save(receipt); +// } \ No newline at end of file From f9cc2ee9ad8b5304c7b36121eda03a942d24e8c3 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Mon, 14 Aug 2023 01:38:14 +0900 Subject: [PATCH 076/273] =?UTF-8?q?=20[MODIFYING]=20=EC=83=81=ED=92=88=20?= =?UTF-8?q?=EA=B5=AC=EB=A7=A4=ED=95=98=EA=B8=B0=20=EC=A4=91=20request=20bo?= =?UTF-8?q?dy=20=EC=97=86=EC=9D=B4=20url=20{itemId}=EB=A1=9C=20=EB=B0=9B?= =?UTF-8?q?=EA=B8=B0=20(=EC=88=98=EC=A0=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/item/controller/ItemController.java | 5 ++--- .../java/com/gg/server/domain/item/service/ItemService.java | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gg/server/domain/item/controller/ItemController.java b/src/main/java/com/gg/server/domain/item/controller/ItemController.java index b648b2f77..813055423 100644 --- a/src/main/java/com/gg/server/domain/item/controller/ItemController.java +++ b/src/main/java/com/gg/server/domain/item/controller/ItemController.java @@ -24,9 +24,8 @@ public ItemStoreListResponseDto getAllItems() { @PostMapping("/purchases/{itemId}") public ResponseEntity purchaseItem(@PathVariable Long itemId, - @Parameter(hidden = true) @Login UserDto userDto, - @RequestBody PurchaseItemRequestDto requestDto) { - itemService.purchaseItem(itemId, userDto, requestDto); + @Parameter(hidden = true) @Login UserDto userDto) { + itemService.purchaseItem(itemId, userDto); return ResponseEntity.ok().build(); } } diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index 53454fefb..c230fd0aa 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -32,7 +32,7 @@ public ItemStoreListResponseDto getAllItems() { } @Transactional - public void purchaseItem(Long itemId, UserDto userDto, PurchaseItemRequestDto requestDto) { + public void purchaseItem(Long itemId, UserDto userDto) { Item item = itemRepository.findById(itemId) .orElseThrow( ()-> new IllegalArgumentException("해당 아이템이 없습니다" + itemId) ); if (!item.getIsVisible()) From fce7e128e79056986fff679f2d731c36d2467c5c Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Mon, 14 Aug 2023 02:57:34 +0900 Subject: [PATCH 077/273] =?UTF-8?q?[MODIFYING]=20=EC=83=81=ED=92=88=20?= =?UTF-8?q?=EA=B5=AC=EB=A7=A4=ED=95=98=EA=B8=B0=20api=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EC=B2=98=EB=A6=AC,=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=95=84?= =?UTF-8?q?=EC=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/item/controller/ItemController.java | 4 ++-- .../domain/item/dto/PurchaseItemRequestDto.java | 8 -------- .../item/exception/ItemNotFoundException.java | 10 ++++++++++ .../exception/ItemNotPurchasableException.java | 10 ++++++++++ .../server/domain/item/service/ItemService.java | 15 +++++++++++---- .../com/gg/server/global/exception/ErrorCode.java | 1 + 6 files changed, 34 insertions(+), 14 deletions(-) delete mode 100644 src/main/java/com/gg/server/domain/item/dto/PurchaseItemRequestDto.java create mode 100644 src/main/java/com/gg/server/domain/item/exception/ItemNotFoundException.java create mode 100644 src/main/java/com/gg/server/domain/item/exception/ItemNotPurchasableException.java diff --git a/src/main/java/com/gg/server/domain/item/controller/ItemController.java b/src/main/java/com/gg/server/domain/item/controller/ItemController.java index 813055423..e66b3f410 100644 --- a/src/main/java/com/gg/server/domain/item/controller/ItemController.java +++ b/src/main/java/com/gg/server/domain/item/controller/ItemController.java @@ -1,12 +1,12 @@ package com.gg.server.domain.item.controller; import com.gg.server.domain.item.dto.ItemStoreListResponseDto; -import com.gg.server.domain.item.dto.PurchaseItemRequestDto; import com.gg.server.domain.item.service.ItemService; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.global.utils.argumentresolver.Login; import io.swagger.v3.oas.annotations.Parameter; import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -26,7 +26,7 @@ public ItemStoreListResponseDto getAllItems() { public ResponseEntity purchaseItem(@PathVariable Long itemId, @Parameter(hidden = true) @Login UserDto userDto) { itemService.purchaseItem(itemId, userDto); - return ResponseEntity.ok().build(); + return ResponseEntity.status(HttpStatus.CREATED).build(); } } // @PostMapping("/purchases/{itemId}") diff --git a/src/main/java/com/gg/server/domain/item/dto/PurchaseItemRequestDto.java b/src/main/java/com/gg/server/domain/item/dto/PurchaseItemRequestDto.java deleted file mode 100644 index ffdd82132..000000000 --- a/src/main/java/com/gg/server/domain/item/dto/PurchaseItemRequestDto.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.gg.server.domain.item.dto; - -import lombok.Getter; - -@Getter -public class PurchaseItemRequestDto { - private Long itemId; -} diff --git a/src/main/java/com/gg/server/domain/item/exception/ItemNotFoundException.java b/src/main/java/com/gg/server/domain/item/exception/ItemNotFoundException.java new file mode 100644 index 000000000..88e74d13f --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/exception/ItemNotFoundException.java @@ -0,0 +1,10 @@ +package com.gg.server.domain.item.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.NotExistException; + +public class ItemNotFoundException extends NotExistException { + public ItemNotFoundException() { + super("해당 아이템이 없습니다.", ErrorCode.ITEM_NOT_FOUND); + } +} \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/item/exception/ItemNotPurchasableException.java b/src/main/java/com/gg/server/domain/item/exception/ItemNotPurchasableException.java new file mode 100644 index 000000000..170bfc7b5 --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/exception/ItemNotPurchasableException.java @@ -0,0 +1,10 @@ +package com.gg.server.domain.item.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.BusinessException; + +public class ItemNotPurchasableException extends BusinessException { + public ItemNotPurchasableException() { + super("지금은 구매할 수 없는 아이템 입니다.", ErrorCode.ITEM_NOT_PURCHASABLE); + } +} \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index c230fd0aa..11691ae20 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -4,13 +4,15 @@ import com.gg.server.domain.item.data.ItemRepository; import com.gg.server.domain.item.dto.ItemStoreListResponseDto; import com.gg.server.domain.item.dto.ItemStoreResponseDto; -import com.gg.server.domain.item.dto.PurchaseItemRequestDto; +import com.gg.server.domain.item.exception.ItemNotFoundException; +import com.gg.server.domain.item.exception.ItemNotPurchasableException; import com.gg.server.domain.receipt.data.Receipt; import com.gg.server.domain.receipt.data.ReceiptRepository; import com.gg.server.domain.receipt.type.ItemStatus; -import com.gg.server.domain.user.data.User; +//import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.dto.UserDto; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -19,6 +21,7 @@ import java.util.stream.Collectors; @Service +@Slf4j @RequiredArgsConstructor public class ItemService { @@ -34,10 +37,14 @@ public ItemStoreListResponseDto getAllItems() { @Transactional public void purchaseItem(Long itemId, UserDto userDto) { Item item = itemRepository.findById(itemId) - .orElseThrow( ()-> new IllegalArgumentException("해당 아이템이 없습니다" + itemId) ); + .orElseThrow( ()-> { + log.error("해당 아이템이 없습니다. Item ID: {}, User Intra ID: {}", itemId, userDto.getIntraId()); + throw new ItemNotFoundException(); + }); if (!item.getIsVisible()) { - throw new IllegalArgumentException("지금은 구매할 수 없는 아이템 입니다."); + log.error("지금은 구매할 수 없는 아이템 입니다. Item ID: {}, User Intra ID: {}", itemId, userDto.getIntraId()); + throw new ItemNotPurchasableException(); } Receipt receipt = new Receipt(item, userDto.getIntraId(), userDto.getIntraId(), diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index f602ff7e4..b9ff9d4b9 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -40,6 +40,7 @@ public enum ErrorCode { //item ITEM_NOT_FOUND(404, "IT100", "ITEM NOT FOUND"), ITEM_TYPE_NOT_MATCHED(400, "IT200", "ITEM TYPE NOT MATCHED"), + ITEM_NOT_PURCHASABLE(400, "IT201", "ITEM NOT PURCHASABLE"), //receipt RECEIPT_NOT_FOUND(404, "RC100", "RECEIPT NOT FOUND"), From 877550f178c3e814dbca49a4e1d364db943e2894 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Mon, 14 Aug 2023 05:59:16 +0900 Subject: [PATCH 078/273] =?UTF-8?q?[FEAT]=20=EC=83=81=ED=92=88=20=EA=B5=AC?= =?UTF-8?q?=EB=A7=A4=ED=95=98=EA=B8=B0=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/controller/ItemController.java | 8 --- .../domain/item/service/ItemService.java | 23 ------- .../ItemPurchaseControllerTest.java | 68 +++++++++++++++++++ 3 files changed, 68 insertions(+), 31 deletions(-) create mode 100644 src/test/java/com/gg/server/domain/item/controller/ItemPurchaseControllerTest.java diff --git a/src/main/java/com/gg/server/domain/item/controller/ItemController.java b/src/main/java/com/gg/server/domain/item/controller/ItemController.java index e66b3f410..c8f0e83c7 100644 --- a/src/main/java/com/gg/server/domain/item/controller/ItemController.java +++ b/src/main/java/com/gg/server/domain/item/controller/ItemController.java @@ -29,11 +29,3 @@ public ResponseEntity purchaseItem(@PathVariable Long itemId, return ResponseEntity.status(HttpStatus.CREATED).build(); } } -// @PostMapping("/purchases/{itemId}") -// public ResponseEntity purchaseItem(@PathVariable Long itemId, -// @Parameter(hidden = true) @Login UserDto userDto, -// @RequestBody PurchaseItemRequestDto requestDto) { -// itemService.purchaseItem(itemId, userDto, requestDto); -// return ResponseEntity.ok().build(); -// } -// \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index 11691ae20..5caa5d3f0 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -9,7 +9,6 @@ import com.gg.server.domain.receipt.data.Receipt; import com.gg.server.domain.receipt.data.ReceiptRepository; import com.gg.server.domain.receipt.type.ItemStatus; -//import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.dto.UserDto; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -52,25 +51,3 @@ public void purchaseItem(Long itemId, UserDto userDto) { receiptRepository.save(receipt); } } -// -// private final ItemRepository itemRepository; -// private final ReceiptRepository receiptRepository; -// -// public ItemStoreListResponseDto getAllItems() { -// List itemStoreListResponseDto = itemRepository.findAllByIsVisible(true) -// .stream().map(ItemStoreResponseDto::new).collect(Collectors.toList()); -// return new ItemStoreListResponseDto(itemStoreListResponseDto); -// } -// -// @Transactional -// public void purchaseItem(Long itemId, UserDto userDto, PurchaseItemRequestDto requestDto) { -// Item item = itemRepository.findById(itemId) -// .orElseThrow(() -> new IllegalArgumentException("No item found with id: " + itemId)); -// -// if(!item.getIsVisible()) { -// throw new IllegalArgumentException("Item is not available for purchase"); -// } -// -// Receipt receipt = new Receipt(item, userDto.getIntraId(), userDto.getIntraId(), ItemStatus.BEFORE, LocalDateTime.now()); -// receiptRepository.save(receipt); -// } \ No newline at end of file diff --git a/src/test/java/com/gg/server/domain/item/controller/ItemPurchaseControllerTest.java b/src/test/java/com/gg/server/domain/item/controller/ItemPurchaseControllerTest.java new file mode 100644 index 000000000..e58b2d123 --- /dev/null +++ b/src/test/java/com/gg/server/domain/item/controller/ItemPurchaseControllerTest.java @@ -0,0 +1,68 @@ +package com.gg.server.domain.item.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.domain.item.service.ItemService; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import lombok.RequiredArgsConstructor; +import org.apache.http.HttpHeaders; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.web.servlet.MockMvc; +import javax.transaction.Transactional; +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + + +@RequiredArgsConstructor +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +class ItemPurchaseControllerTest { + + @Autowired + TestDataUtils testDataUtils; + + @Autowired + AuthTokenProvider tokenProvider; + + @Autowired + ObjectMapper objectMapper; + + @Autowired + private MockMvc mockMvc; + + @MockBean + private ItemService itemService; + + @Test + @DisplayName("[Post]/pingpong/items/purchases/{itemId} - success") + public void purchaseItemSuccessTest() throws Exception { + + // given + Long testItemId = 1L; + UserDto testUser = UserDto.builder() + .id(1L) + .intraId("testIntraId") + .build(); + + doNothing().when(itemService).purchaseItem(testItemId, testUser); + + String accessToken = testDataUtils.getLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + System.out.println(userId); + String url = "/pingpong/items/purchases/" + testItemId; + + // when + mockMvc.perform(post(url) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isCreated()); + + } +} From 88f43d292bcf56b9cde7037f5d0228ba3d4a3262 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Mon, 14 Aug 2023 07:41:46 +0900 Subject: [PATCH 079/273] =?UTF-8?q?[REFACTOR]=20=EC=83=81=ED=92=88=20?= =?UTF-8?q?=EA=B5=AC=EB=A7=A4=20=ED=9B=84=20=EC=9C=A0=EC=A0=80=EC=9D=98=20?= =?UTF-8?q?coin=EC=B0=A8=EA=B0=90,=20=EC=84=B8=EC=9D=BC=EA=B0=80=20?= =?UTF-8?q?=EC=A1=B4=EC=9E=AC=20=EC=8B=9C=20=EC=84=B8=EC=9D=BC=EA=B0=80?= =?UTF-8?q?=EB=A1=9C=20=EC=B0=A8=EA=B0=90,=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InsufficientGgcoinException.java | 10 +++++++ .../domain/item/service/ItemService.java | 26 +++++++++++++++++++ .../com/gg/server/domain/user/data/User.java | 8 ++++++ .../gg/server/domain/user/dto/UserDto.java | 2 ++ .../gg/server/global/exception/ErrorCode.java | 1 + 5 files changed, 47 insertions(+) create mode 100644 src/main/java/com/gg/server/domain/item/exception/InsufficientGgcoinException.java diff --git a/src/main/java/com/gg/server/domain/item/exception/InsufficientGgcoinException.java b/src/main/java/com/gg/server/domain/item/exception/InsufficientGgcoinException.java new file mode 100644 index 000000000..aefb4d198 --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/exception/InsufficientGgcoinException.java @@ -0,0 +1,10 @@ +package com.gg.server.domain.item.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.BusinessException; + +public class InsufficientGgcoinException extends BusinessException { + public InsufficientGgcoinException() { + super("GGcoin이 부족합니다.", ErrorCode.INSUFFICIENT_GGCOIN); + } +} diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index 5caa5d3f0..f7eb6bd37 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -4,12 +4,16 @@ import com.gg.server.domain.item.data.ItemRepository; import com.gg.server.domain.item.dto.ItemStoreListResponseDto; import com.gg.server.domain.item.dto.ItemStoreResponseDto; +import com.gg.server.domain.item.exception.InsufficientGgcoinException; import com.gg.server.domain.item.exception.ItemNotFoundException; import com.gg.server.domain.item.exception.ItemNotPurchasableException; import com.gg.server.domain.receipt.data.Receipt; import com.gg.server.domain.receipt.data.ReceiptRepository; import com.gg.server.domain.receipt.type.ItemStatus; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.domain.user.exception.UserNotFoundException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -26,6 +30,7 @@ public class ItemService { private final ItemRepository itemRepository; private final ReceiptRepository receiptRepository; + private final UserRepository userRepository; public ItemStoreListResponseDto getAllItems() { List itemStoreListResponseDto = itemRepository.findAllByIsVisible(true) @@ -46,8 +51,29 @@ public void purchaseItem(Long itemId, UserDto userDto) { throw new ItemNotPurchasableException(); } + //세일가격 존재할때 세일가로 결정 + Integer finalPrice; + if (item.getDiscount() != null && item.getDiscount() > 0) { + finalPrice = item.getPrice() - (item.getPrice() * item.getDiscount() / 100); + } + else { + finalPrice = item.getPrice(); + } + + // 사용자의 GGcoin이 상품 가격보다 낮으면 예외 처리. + if (userDto.getGgCoin() < finalPrice) { + log.error("GGcoin이 부족합니다. 필요한 GGcoin: {}, 사용자의 GGcoin: {}", finalPrice, userDto.getGgCoin()); + throw new InsufficientGgcoinException(); + } + + User payUser = userRepository.findById(userDto.getId()) + .orElseThrow(() -> new UserNotFoundException()); + + payUser.payGgCoin(finalPrice); //상품 구매에 따른 차감 + Receipt receipt = new Receipt(item, userDto.getIntraId(), userDto.getIntraId(), ItemStatus.BEFORE, LocalDateTime.now()); receiptRepository.save(receipt); } + } diff --git a/src/main/java/com/gg/server/domain/user/data/User.java b/src/main/java/com/gg/server/domain/user/data/User.java index 98fa71ddc..566f8a027 100644 --- a/src/main/java/com/gg/server/domain/user/data/User.java +++ b/src/main/java/com/gg/server/domain/user/data/User.java @@ -1,6 +1,7 @@ package com.gg.server.domain.user.data; import com.gg.server.admin.user.dto.UserUpdateAdminRequestDto; +import com.gg.server.domain.item.exception.InsufficientGgcoinException; import com.gg.server.domain.user.type.*; import com.gg.server.global.utils.BaseTimeEntity; import lombok.*; @@ -116,4 +117,11 @@ public int addGgCoin(int plus) { this.ggCoin += plus; return this.ggCoin; } + + public void payGgCoin(int amount) { + if (this.ggCoin < amount) { + throw new InsufficientGgcoinException(); // 사용자의 ggCoin이 필요한 금액보다 적을 경우 예외를 발생 + } + this.ggCoin = this.ggCoin - amount; + } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/user/dto/UserDto.java b/src/main/java/com/gg/server/domain/user/dto/UserDto.java index 37e71d3fe..f6d24c3df 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserDto.java @@ -20,6 +20,7 @@ public class UserDto { private SnsType snsNotiOpt; private Long kakaoId; private String textColor; + private Integer ggCoin; static public UserDto from (User user) { UserDto userDto; @@ -36,6 +37,7 @@ static public UserDto from (User user) { .totalExp(user.getTotalExp()) .snsNotiOpt(user.getSnsNotiOpt()) .kakaoId(user.getKakaoId()) + .ggCoin(user.getGgCoin()) .build(); } return userDto; diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index b9ff9d4b9..00ea3dd9c 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -41,6 +41,7 @@ public enum ErrorCode { ITEM_NOT_FOUND(404, "IT100", "ITEM NOT FOUND"), ITEM_TYPE_NOT_MATCHED(400, "IT200", "ITEM TYPE NOT MATCHED"), ITEM_NOT_PURCHASABLE(400, "IT201", "ITEM NOT PURCHASABLE"), + INSUFFICIENT_GGCOIN(400,"IT202","INSUFFICIENT GGCOIN"), //receipt RECEIPT_NOT_FOUND(404, "RC100", "RECEIPT NOT FOUND"), From 35cf7721ca709398192176d1cf57ba97819cdea3 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Mon, 14 Aug 2023 07:41:46 +0900 Subject: [PATCH 080/273] =?UTF-8?q?[REFACTOR]=20=EC=83=81=ED=92=88=20?= =?UTF-8?q?=EA=B5=AC=EB=A7=A4=20=ED=9B=84=20=EC=9C=A0=EC=A0=80=EC=9D=98=20?= =?UTF-8?q?coin=EC=B0=A8=EA=B0=90,=20=EC=84=B8=EC=9D=BC=EA=B0=80=20?= =?UTF-8?q?=EC=A1=B4=EC=9E=AC=20=EC=8B=9C=20=EC=84=B8=EC=9D=BC=EA=B0=80?= =?UTF-8?q?=EB=A1=9C=20=EC=B0=A8=EA=B0=90,=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InsufficientGgcoinException.java | 10 +++++++ .../domain/item/service/ItemService.java | 26 +++++++++++++++++++ .../com/gg/server/domain/user/data/User.java | 8 ++++++ .../gg/server/domain/user/dto/UserDto.java | 2 ++ .../gg/server/global/exception/ErrorCode.java | 1 + 5 files changed, 47 insertions(+) create mode 100644 src/main/java/com/gg/server/domain/item/exception/InsufficientGgcoinException.java diff --git a/src/main/java/com/gg/server/domain/item/exception/InsufficientGgcoinException.java b/src/main/java/com/gg/server/domain/item/exception/InsufficientGgcoinException.java new file mode 100644 index 000000000..aefb4d198 --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/exception/InsufficientGgcoinException.java @@ -0,0 +1,10 @@ +package com.gg.server.domain.item.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.BusinessException; + +public class InsufficientGgcoinException extends BusinessException { + public InsufficientGgcoinException() { + super("GGcoin이 부족합니다.", ErrorCode.INSUFFICIENT_GGCOIN); + } +} diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index 5caa5d3f0..f7eb6bd37 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -4,12 +4,16 @@ import com.gg.server.domain.item.data.ItemRepository; import com.gg.server.domain.item.dto.ItemStoreListResponseDto; import com.gg.server.domain.item.dto.ItemStoreResponseDto; +import com.gg.server.domain.item.exception.InsufficientGgcoinException; import com.gg.server.domain.item.exception.ItemNotFoundException; import com.gg.server.domain.item.exception.ItemNotPurchasableException; import com.gg.server.domain.receipt.data.Receipt; import com.gg.server.domain.receipt.data.ReceiptRepository; import com.gg.server.domain.receipt.type.ItemStatus; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.domain.user.exception.UserNotFoundException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -26,6 +30,7 @@ public class ItemService { private final ItemRepository itemRepository; private final ReceiptRepository receiptRepository; + private final UserRepository userRepository; public ItemStoreListResponseDto getAllItems() { List itemStoreListResponseDto = itemRepository.findAllByIsVisible(true) @@ -46,8 +51,29 @@ public void purchaseItem(Long itemId, UserDto userDto) { throw new ItemNotPurchasableException(); } + //세일가격 존재할때 세일가로 결정 + Integer finalPrice; + if (item.getDiscount() != null && item.getDiscount() > 0) { + finalPrice = item.getPrice() - (item.getPrice() * item.getDiscount() / 100); + } + else { + finalPrice = item.getPrice(); + } + + // 사용자의 GGcoin이 상품 가격보다 낮으면 예외 처리. + if (userDto.getGgCoin() < finalPrice) { + log.error("GGcoin이 부족합니다. 필요한 GGcoin: {}, 사용자의 GGcoin: {}", finalPrice, userDto.getGgCoin()); + throw new InsufficientGgcoinException(); + } + + User payUser = userRepository.findById(userDto.getId()) + .orElseThrow(() -> new UserNotFoundException()); + + payUser.payGgCoin(finalPrice); //상품 구매에 따른 차감 + Receipt receipt = new Receipt(item, userDto.getIntraId(), userDto.getIntraId(), ItemStatus.BEFORE, LocalDateTime.now()); receiptRepository.save(receipt); } + } diff --git a/src/main/java/com/gg/server/domain/user/data/User.java b/src/main/java/com/gg/server/domain/user/data/User.java index 98fa71ddc..566f8a027 100644 --- a/src/main/java/com/gg/server/domain/user/data/User.java +++ b/src/main/java/com/gg/server/domain/user/data/User.java @@ -1,6 +1,7 @@ package com.gg.server.domain.user.data; import com.gg.server.admin.user.dto.UserUpdateAdminRequestDto; +import com.gg.server.domain.item.exception.InsufficientGgcoinException; import com.gg.server.domain.user.type.*; import com.gg.server.global.utils.BaseTimeEntity; import lombok.*; @@ -116,4 +117,11 @@ public int addGgCoin(int plus) { this.ggCoin += plus; return this.ggCoin; } + + public void payGgCoin(int amount) { + if (this.ggCoin < amount) { + throw new InsufficientGgcoinException(); // 사용자의 ggCoin이 필요한 금액보다 적을 경우 예외를 발생 + } + this.ggCoin = this.ggCoin - amount; + } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/user/dto/UserDto.java b/src/main/java/com/gg/server/domain/user/dto/UserDto.java index 37e71d3fe..f6d24c3df 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserDto.java @@ -20,6 +20,7 @@ public class UserDto { private SnsType snsNotiOpt; private Long kakaoId; private String textColor; + private Integer ggCoin; static public UserDto from (User user) { UserDto userDto; @@ -36,6 +37,7 @@ static public UserDto from (User user) { .totalExp(user.getTotalExp()) .snsNotiOpt(user.getSnsNotiOpt()) .kakaoId(user.getKakaoId()) + .ggCoin(user.getGgCoin()) .build(); } return userDto; diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index b9ff9d4b9..00ea3dd9c 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -41,6 +41,7 @@ public enum ErrorCode { ITEM_NOT_FOUND(404, "IT100", "ITEM NOT FOUND"), ITEM_TYPE_NOT_MATCHED(400, "IT200", "ITEM TYPE NOT MATCHED"), ITEM_NOT_PURCHASABLE(400, "IT201", "ITEM NOT PURCHASABLE"), + INSUFFICIENT_GGCOIN(400,"IT202","INSUFFICIENT GGCOIN"), //receipt RECEIPT_NOT_FOUND(404, "RC100", "RECEIPT NOT FOUND"), From ff0ded3f94c2e00a0cb70e1c8bbf5540287fb45c Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Mon, 14 Aug 2023 08:41:19 +0900 Subject: [PATCH 081/273] =?UTF-8?q?[FEAT]=20=EC=83=81=ED=92=88=20=EC=84=A0?= =?UTF-8?q?=EB=AC=BC=ED=95=98=EA=B8=B0=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/controller/ItemController.java | 9 +++ .../domain/item/dto/ItemGiftRequestDto.java | 12 +++ .../domain/item/service/ItemService.java | 43 +++++++++++ .../controller/ItemGiftControllerTest.java | 75 +++++++++++++++++++ 4 files changed, 139 insertions(+) create mode 100644 src/main/java/com/gg/server/domain/item/dto/ItemGiftRequestDto.java create mode 100644 src/test/java/com/gg/server/domain/item/controller/ItemGiftControllerTest.java diff --git a/src/main/java/com/gg/server/domain/item/controller/ItemController.java b/src/main/java/com/gg/server/domain/item/controller/ItemController.java index c8f0e83c7..def7cc5f3 100644 --- a/src/main/java/com/gg/server/domain/item/controller/ItemController.java +++ b/src/main/java/com/gg/server/domain/item/controller/ItemController.java @@ -1,5 +1,6 @@ package com.gg.server.domain.item.controller; +import com.gg.server.domain.item.dto.ItemGiftRequestDto; import com.gg.server.domain.item.dto.ItemStoreListResponseDto; import com.gg.server.domain.item.service.ItemService; import com.gg.server.domain.user.dto.UserDto; @@ -28,4 +29,12 @@ public ResponseEntity purchaseItem(@PathVariable Long itemId, itemService.purchaseItem(itemId, userDto); return ResponseEntity.status(HttpStatus.CREATED).build(); } + + @PostMapping("/gift/{itemId}") + public ResponseEntity giftItem(@PathVariable Long itemId, + @RequestBody ItemGiftRequestDto recipient, + @Parameter(hidden = true) @Login UserDto userDto) { + itemService.giftItem(itemId, recipient.getOwnerId(), userDto); + return ResponseEntity.status(HttpStatus.CREATED).build(); + } } diff --git a/src/main/java/com/gg/server/domain/item/dto/ItemGiftRequestDto.java b/src/main/java/com/gg/server/domain/item/dto/ItemGiftRequestDto.java new file mode 100644 index 000000000..4085b5eac --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/dto/ItemGiftRequestDto.java @@ -0,0 +1,12 @@ +package com.gg.server.domain.item.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class ItemGiftRequestDto { + private String ownerId; +} \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index f7eb6bd37..0c8033a65 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -33,6 +33,7 @@ public class ItemService { private final UserRepository userRepository; public ItemStoreListResponseDto getAllItems() { + List itemStoreListResponseDto = itemRepository.findAllByIsVisible(true) .stream().map(ItemStoreResponseDto::new).collect(Collectors.toList()); return new ItemStoreListResponseDto(itemStoreListResponseDto); @@ -76,4 +77,46 @@ public void purchaseItem(Long itemId, UserDto userDto) { receiptRepository.save(receipt); } + + @Transactional + public void giftItem(Long itemId, String ownerId, UserDto userDto) { + Item item = itemRepository.findById(itemId) + .orElseThrow( ()-> { + log.error("해당 아이템이 없습니다. Item ID: {}", itemId); + throw new ItemNotFoundException(); + }); + if (!item.getIsVisible()) { + log.error("지금은 선물할 수 없는 아이템 입니다. Item ID: {}", itemId); + throw new ItemNotPurchasableException(); + } + + //세일가격 존재할때 세일가로 결정 + Integer finalPrice; + if (item.getDiscount() != null && item.getDiscount() > 0) { + finalPrice = item.getPrice() - (item.getPrice() * item.getDiscount() / 100); + } + else { + finalPrice = item.getPrice(); + } + + // 사용자의 GGcoin이 상품 가격보다 낮으면 예외 처리. + if (userDto.getGgCoin() < finalPrice) { + log.error("GGcoin이 부족합니다. 필요한 GGcoin: {}, 사용자의 GGcoin: {}", finalPrice, userDto.getGgCoin()); + throw new InsufficientGgcoinException(); + } + + User payUser = userRepository.findById(userDto.getId()) + .orElseThrow(() -> new UserNotFoundException()); + + + User owner = userRepository.findByIntraId(ownerId) + .orElseThrow(() -> new UserNotFoundException()); + + payUser.payGgCoin(finalPrice); //상품 구매에 따른 차감 + + Receipt receipt = new Receipt(item, userDto.getIntraId(), ownerId, + ItemStatus.BEFORE, LocalDateTime.now()); + receiptRepository.save(receipt); + } + } diff --git a/src/test/java/com/gg/server/domain/item/controller/ItemGiftControllerTest.java b/src/test/java/com/gg/server/domain/item/controller/ItemGiftControllerTest.java new file mode 100644 index 000000000..e090cb122 --- /dev/null +++ b/src/test/java/com/gg/server/domain/item/controller/ItemGiftControllerTest.java @@ -0,0 +1,75 @@ +package com.gg.server.domain.item.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.domain.item.dto.ItemGiftRequestDto; +import com.gg.server.domain.item.service.ItemService; +import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import lombok.RequiredArgsConstructor; +import org.apache.http.HttpHeaders; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import javax.transaction.Transactional; + +import static org.mockito.Mockito.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + + +@RequiredArgsConstructor +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +class ItemGiftControllerTest { + + @Autowired + TestDataUtils testDataUtils; + + @Autowired + AuthTokenProvider tokenProvider; + + @Autowired + ObjectMapper objectMapper; + + @Autowired + private MockMvc mockMvc; + + @MockBean + private ItemService itemService; + + @Test + @DisplayName("[Post]/pingpong/items/gift/{itemId} - success") + public void giftItemSuccessTest() throws Exception { + + // given + Long testItemId = 1L; + UserDto testUser = UserDto.builder() + .id(1L) + .intraId("testIntraId") + .build(); + + ItemGiftRequestDto requestDto = new ItemGiftRequestDto("recipientId"); + + doNothing().when(itemService).giftItem(testItemId, requestDto.getOwnerId(), testUser); + + String accessToken = testDataUtils.getLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + System.out.println(userId); + String url = "/pingpong/items/gift/" + testItemId; + + // when + mockMvc.perform(post(url) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(requestDto))) + .andExpect(status().isCreated()); + + } +} From 1b727ccb0d037f5366bc8f31368bb0cd4828345c Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Mon, 14 Aug 2023 15:58:56 +0900 Subject: [PATCH 082/273] =?UTF-8?q?[REFACTOR]=20GGBE4-43=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=8F=8C=EC=95=84=EA=B0=80=EA=B2=8C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- createView.sql | 10 ++++------ .../game/controller/GameAdminController.java | 1 + .../admin/game/service/GameAdminService.java | 6 +++++- .../server/domain/game/data/GameRepository.java | 2 +- .../domain/game/dto/ExpChangeResultResDto.java | 10 ++++++++++ .../domain/team/data/TeamUserRepository.java | 5 +++-- .../com/gg/server/game/GameControllerTest.java | 16 ++++++++++++++++ 7 files changed, 40 insertions(+), 10 deletions(-) diff --git a/createView.sql b/createView.sql index 7e024f5b7..af14bee05 100644 --- a/createView.sql +++ b/createView.sql @@ -3,9 +3,7 @@ create or replace view v_teamuser as from team, team_user tu, user u, game g where team.id=tu.team_id and u.id=tu.user_id and g.id=team.game_id; -create or replace view v_rank_game_detail as -select team.id teamId, team.score, team.win, g.id gameId, g.season_id seasonId, g.start_time startTime, g.status, g.mode, - tu.user_id userId, u.intra_id intraId, u.image_uri image, u.total_exp, - r.wins, r.losses -from team, team_user tu, user u, game g, ranks r -where team.id=tu.team_id and u.id=tu.user_id and g.id=team.game_id and r.user_id = u.id and r.season_id = g.season_id; \ No newline at end of file +create or replace VIEW `v_rank_game_detail` AS +select `team`.`id` AS `teamId`,`team`.`score` AS `score`,`team`.`win` AS `win`,`g`.`id` AS `gameId`,`g`.`season_id` AS `seasonId`,`g`.`start_time` AS `startTime`,`g`.`end_time` AS `endTime`,`g`.`status` AS `status`,`g`.`mode` AS `mode`,`tu`.`user_id` AS `userId`,`u`.`intra_id` AS `intraId`,`u`.`image_uri` AS `image`,`u`.`total_exp` AS `total_exp`,`r`.`wins` AS `wins`,`r`.`losses` AS `losses` +from ((((`team` join `team_user` `tu`) join `user` `u`) join `game` `g`) join `ranks` `r`) +where ((`team`.`id` = `tu`.`team_id`) and (`u`.`id` = `tu`.`user_id`) and (`g`.`id` = `team`.`game_id`) and (`r`.`user_id` = `u`.`id`) and (`r`.`season_id` = `g`.`season_id`)); \ No newline at end of file diff --git a/src/main/java/com/gg/server/admin/game/controller/GameAdminController.java b/src/main/java/com/gg/server/admin/game/controller/GameAdminController.java index 4d0b7349f..6fc107dcd 100644 --- a/src/main/java/com/gg/server/admin/game/controller/GameAdminController.java +++ b/src/main/java/com/gg/server/admin/game/controller/GameAdminController.java @@ -8,6 +8,7 @@ import com.gg.server.global.exception.ErrorCode; import com.gg.server.global.exception.custom.InvalidParameterException; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; diff --git a/src/main/java/com/gg/server/admin/game/service/GameAdminService.java b/src/main/java/com/gg/server/admin/game/service/GameAdminService.java index 227ccd095..c975a32b5 100644 --- a/src/main/java/com/gg/server/admin/game/service/GameAdminService.java +++ b/src/main/java/com/gg/server/admin/game/service/GameAdminService.java @@ -55,7 +55,6 @@ public GameLogListAdminResponseDto findAllGamesByAdmin(Pageable pageable) { return new GameLogListAdminResponseDto(getGameLogList(gamePage.getContent().stream().map(Game::getId).collect(Collectors.toList())), gamePage.getTotalPages()); } - @Transactional(readOnly = true) public GameLogListAdminResponseDto findGamesBySeasonId(Long seasonId, Pageable pageable){ Season season = seasonAdminRepository.findById(seasonId).orElseThrow(()-> new SeasonNotFoundException()); @@ -65,7 +64,12 @@ public GameLogListAdminResponseDto findGamesBySeasonId(Long seasonId, Pageable p @Transactional(readOnly = true) public List getGameLogList(List gameIdList){ + log.info(gameIdList.size() + " : size"); + for (Long id:gameIdList){ + log.info(id+"::"); + } List teamViews = gameAdminRepository.findTeamsByGameIsIn(gameIdList); + log.info(teamViews.size() + "===="); return teamViews.stream().map(GameLogAdminDto::new).collect(Collectors.toList()); } diff --git a/src/main/java/com/gg/server/domain/game/data/GameRepository.java b/src/main/java/com/gg/server/domain/game/data/GameRepository.java index c4fc840d5..dea56d086 100644 --- a/src/main/java/com/gg/server/domain/game/data/GameRepository.java +++ b/src/main/java/com/gg/server/domain/game/data/GameRepository.java @@ -37,7 +37,7 @@ public interface GameRepository extends JpaRepository, GameRepositor @Query(value = "SELECT teamId, gameId, score, startTime, status, mode, userId, intraId, image, total_exp exp" + " FROM v_teamuser where gameId = :gameId", nativeQuery = true) - List findTeamGameUser(Long gameId); + List findTeamGameUser(@Param("gameId") Long gameId); Optional findByStartTime(LocalDateTime startTime); @Query(value = "select g from Game g where g.startTime > :startTime and g.startTime < :endTime") List findAllBetween(@Param("startTime")LocalDateTime startTime, @Param("endTime") LocalDateTime endTime); diff --git a/src/main/java/com/gg/server/domain/game/dto/ExpChangeResultResDto.java b/src/main/java/com/gg/server/domain/game/dto/ExpChangeResultResDto.java index d8303f3fb..715933dd7 100644 --- a/src/main/java/com/gg/server/domain/game/dto/ExpChangeResultResDto.java +++ b/src/main/java/com/gg/server/domain/game/dto/ExpChangeResultResDto.java @@ -30,6 +30,16 @@ public ExpChangeResultResDto(Integer beforeExp, Integer currentExp, UserGameCoin this.coinIncrement = userGameCoinResultDto.getCoinIncrement(); } + //랭크 게임 수정 후 사라질 생성자 + public ExpChangeResultResDto(Integer beforeExp, Integer currentExp) { + this.beforeExp = ExpLevelCalculator.getCurrentLevelMyExp(beforeExp); + this.beforeLevel = ExpLevelCalculator.getLevel(beforeExp); + this.beforeMaxExp = ExpLevelCalculator.getLevelMaxExp(beforeLevel); + this.increasedExp = currentExp - beforeExp; + this.increasedLevel = ExpLevelCalculator.getLevel(currentExp) - this.beforeLevel; + this.afterMaxExp = ExpLevelCalculator.getLevelMaxExp(this.beforeLevel + this.increasedLevel); + } + @Override public boolean equals(Object obj) { if (obj == this) { diff --git a/src/main/java/com/gg/server/domain/team/data/TeamUserRepository.java b/src/main/java/com/gg/server/domain/team/data/TeamUserRepository.java index 251f92d18..e5ef8f7a4 100644 --- a/src/main/java/com/gg/server/domain/team/data/TeamUserRepository.java +++ b/src/main/java/com/gg/server/domain/team/data/TeamUserRepository.java @@ -2,6 +2,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import java.time.LocalDateTime; import java.util.List; @@ -9,11 +10,11 @@ public interface TeamUserRepository extends JpaRepository { @Query(value = "select team_user.id, team_user.team_id, team_user.user_id from team, team_user " + "where team.game_id =:gid and team.id = team_user.team_id", nativeQuery = true) - List findAllByGameId(Long gid); + List findAllByGameId(@Param("gid")Long gid); @Query(value = "select count(*) from game, team, team_user " + "where game.start_time >= :today and team_user.team_id = team.id and team_user.user_id = :userId " + "and team.game_id = game.id and game.status = 'END'", nativeQuery = true) - Integer findByDateAndUser(LocalDateTime today, Long userId); + Integer findByDateAndUser(@Param("today")LocalDateTime today, @Param("userId") Long userId); } diff --git a/src/test/java/com/gg/server/game/GameControllerTest.java b/src/test/java/com/gg/server/game/GameControllerTest.java index 54309ab77..c5a03a825 100644 --- a/src/test/java/com/gg/server/game/GameControllerTest.java +++ b/src/test/java/com/gg/server/game/GameControllerTest.java @@ -290,7 +290,9 @@ public void flushRedis() { //given String url = "/pingpong/games?page=1&size=10&nickname=test1"; Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "startTime")); + System.out.println("================================================"); GameListResDto expect = gameFindService.allGameListUser(pageable, "test1", null); + System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++"); //when String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) .andExpect(status().isOk()) @@ -367,4 +369,18 @@ public void flushRedis() { .andReturn().getResponse().getContentAsString(); System.out.println("result: " + content); } + + @Test + @Transactional + void 일반게임결과조회() throws Exception { + String accessToken2 = testDataUtils.getAdminLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken2); + + String url = "/pingpong/games/" + "2112" + "/result/normal"; + String content = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken2) + .contentType(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + System.out.println("result: " + content); + } } From 94cae3ee96d151d3c70ec0178665d81a4a4b6fe0 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Mon, 14 Aug 2023 16:59:32 +0900 Subject: [PATCH 083/273] =?UTF-8?q?[REFACTOR]=20receiptId=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/controller/UserController.java | 6 ++- .../domain/user/dto/UserReceiptDto.java | 15 +++++++ .../domain/user/service/UserService.java | 39 +++++++++++++++++-- 3 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/gg/server/domain/user/dto/UserReceiptDto.java diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index 833b54d4b..6a24819eb 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -16,6 +16,7 @@ import io.swagger.v3.oas.annotations.Parameter; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.http.HttpStatus; @@ -29,6 +30,7 @@ @RestController @RequiredArgsConstructor @RequestMapping("/pingpong/users") +@Slf4j public class UserController { private final UserService userService; private final UserTextColorCheckService userTextColorCheck; @@ -141,8 +143,8 @@ public UserCoinResponseDto getUserCoin(@Parameter(hidden = true) @Login UserDto } @PatchMapping("/background") - public ResponseEntity updateBackground(@Parameter(hidden = true) @Login UserDto user) { - userService.updateBackground(user.getId()); + public ResponseEntity updateBackground(@RequestBody @Valid UserReceiptDto userReceiptDto, @Parameter(hidden = true) @Login UserDto user) { + userService.updateBackground(user, userReceiptDto); return new ResponseEntity(HttpStatus.NO_CONTENT); } } diff --git a/src/main/java/com/gg/server/domain/user/dto/UserReceiptDto.java b/src/main/java/com/gg/server/domain/user/dto/UserReceiptDto.java new file mode 100644 index 000000000..06a894696 --- /dev/null +++ b/src/main/java/com/gg/server/domain/user/dto/UserReceiptDto.java @@ -0,0 +1,15 @@ +package com.gg.server.domain.user.dto; + +import com.gg.server.domain.receipt.data.Receipt; +import com.sun.istack.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class UserReceiptDto { + @NotNull + private Long receiptId; +} diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 37a535bef..0f72c0ef8 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -6,6 +6,8 @@ import com.gg.server.domain.game.data.Game; import com.gg.server.domain.game.data.GameRepository; import com.gg.server.domain.game.type.StatusType; +import com.gg.server.domain.item.exception.ItemTypeException; +import com.gg.server.domain.item.type.ItemType; import com.gg.server.domain.match.data.RedisMatchUserRepository; import com.gg.server.domain.noti.data.NotiRepository; import com.gg.server.domain.pchange.data.PChange; @@ -17,6 +19,12 @@ import com.gg.server.domain.rank.redis.RankRedisRepository; import com.gg.server.domain.rank.redis.RedisKeyManager; import com.gg.server.domain.rank.service.RankFindService; +import com.gg.server.domain.receipt.data.Receipt; +import com.gg.server.domain.receipt.data.ReceiptRepository; +import com.gg.server.domain.receipt.exception.ItemStatusException; +import com.gg.server.domain.receipt.exception.ReceiptNotFoundException; +import com.gg.server.domain.receipt.exception.ReceiptNotOwnerException; +import com.gg.server.domain.receipt.type.ItemStatus; import com.gg.server.domain.season.data.Season; import com.gg.server.domain.season.service.SeasonFindService; import com.gg.server.domain.user.data.User; @@ -27,6 +35,7 @@ import com.gg.server.domain.user.exception.UserTextColorException; import com.gg.server.domain.user.type.*; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -44,6 +53,7 @@ @Service @RequiredArgsConstructor +@Slf4j public class UserService { private final UserFindService userFindService; @@ -57,6 +67,7 @@ public class UserService { private final RedisMatchUserRepository redisMatchUserRepository; private final CoinHistoryRepository coinHistoryRepository; private final CoinPolicyRepository coinPolicyRepository; + private final ReceiptRepository receiptRepository; private final String ATTENDANCE = "ATTENDANCE"; @@ -274,9 +285,31 @@ public void updateEdge(Long userId) { } @Transactional - public void updateBackground(Long userId) { - User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new); + public void updateBackground(UserDto user, UserReceiptDto userReceiptDto) { + User userId = userRepository.findById(user.getId()).orElseThrow(UserNotFoundException::new); + Receipt receipt = receiptRepository.findById(userReceiptDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); + BackgroundType backgroundType = BackgroundType.getRandomBackgroundType(); - user.updateBackground(backgroundType); + checkOwner(userId, receipt); + checkItemType(receipt); + checkUseStatus(receipt); + + userId.updateBackground(backgroundType); + receipt.updateStatus(ItemStatus.USED); + } + + public void checkOwner(User loginUser, Receipt receipt) { + if (!receipt.getOwnerIntraId().equals(loginUser.getIntraId())) + throw new ReceiptNotOwnerException(); + } + + public void checkItemType(Receipt receipt) { + if (!receipt.getItem().getType().equals(ItemType.PROFILE_BACKGROUND)) + throw new ItemTypeException(); + } + + public void checkUseStatus(Receipt receipt) { + if (!receipt.getStatus().equals(ItemStatus.BEFORE)) + throw new ItemStatusException(); } } From cceb7cc42bc57a18b87d58f79b01f6b315bfa81f Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Mon, 14 Aug 2023 17:18:19 +0900 Subject: [PATCH 084/273] [REFACTOR] add receiptId in Edge --- .../user/controller/UserController.java | 4 ++-- .../domain/user/service/UserService.java | 19 +++++++++++++------ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index 6a24819eb..941d32c97 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -132,8 +132,8 @@ public UserAttendanceResponseDto attendUser(@Parameter(hidden = true) @Login Use } @PatchMapping("/edge") - public ResponseEntity updateEdge(@Parameter(hidden = true) @Login UserDto user) { - userService.updateEdge(user.getId()); + public ResponseEntity updateEdge(@RequestBody @Valid UserReceiptDto userReceiptDto, @Parameter(hidden = true) @Login UserDto user) { + userService.updateEdge(user, userReceiptDto); return new ResponseEntity(HttpStatus.NO_CONTENT); } diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 0f72c0ef8..a72393474 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -278,10 +278,17 @@ public void updateTextColor(Long userId, UserTextColorDto textColorDto) { } @Transactional - public void updateEdge(Long userId) { - User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new); + public void updateEdge(UserDto user, UserReceiptDto userReceiptDto) { + User userId = userRepository.findById(user.getId()).orElseThrow(UserNotFoundException::new); EdgeType edgeType = EdgeType.getRandomEdgeType(); - user.updateEdge(edgeType); + Receipt receipt = receiptRepository.findById(userReceiptDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); + + checkOwner(userId, receipt); + checkItemType(receipt, ItemType.PROFILE_BAND); + checkUseStatus(receipt); + + userId.updateEdge(edgeType); + receipt.updateStatus(ItemStatus.USED); } @Transactional @@ -291,7 +298,7 @@ public void updateBackground(UserDto user, UserReceiptDto userReceiptDto) { BackgroundType backgroundType = BackgroundType.getRandomBackgroundType(); checkOwner(userId, receipt); - checkItemType(receipt); + checkItemType(receipt, ItemType.PROFILE_BACKGROUND); checkUseStatus(receipt); userId.updateBackground(backgroundType); @@ -303,8 +310,8 @@ public void checkOwner(User loginUser, Receipt receipt) { throw new ReceiptNotOwnerException(); } - public void checkItemType(Receipt receipt) { - if (!receipt.getItem().getType().equals(ItemType.PROFILE_BACKGROUND)) + public void checkItemType(Receipt receipt, ItemType itemType) { + if (!receipt.getItem().getType().equals(itemType)) throw new ItemTypeException(); } From bffc45175aeeab9507ac694d30185dae47c13fbc Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Wed, 16 Aug 2023 11:44:17 +0900 Subject: [PATCH 085/273] =?UTF-8?q?[STYLE]=20=EC=95=84=EC=9D=B4=ED=85=9C?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=20=EC=9E=AC=EC=88=98=EC=A0=95(=EB=B0=B0?= =?UTF-8?q?=EA=B2=BD,=20=EC=97=A3=EC=A7=80=EB=A1=9C=20=EC=88=98=EC=A0=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gg/server/domain/item/type/ItemType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/item/type/ItemType.java b/src/main/java/com/gg/server/domain/item/type/ItemType.java index 250ec1273..1bfafaae1 100644 --- a/src/main/java/com/gg/server/domain/item/type/ItemType.java +++ b/src/main/java/com/gg/server/domain/item/type/ItemType.java @@ -4,6 +4,6 @@ @RequiredArgsConstructor public enum ItemType { - MEGAPHONE, PROFILE_BACKGROUND, PROFILE_BAND, TEXT_COLOR, PROFILE_IMAGE + MEGAPHONE, BACKGROUND, EDGE, TEXT_COLOR, PROFILE_IMAGE } From e175bd64c4d84f98d45c8cc8622fcf9ef1bfd619 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Wed, 16 Aug 2023 11:43:18 +0900 Subject: [PATCH 086/273] =?UTF-8?q?[STYLE]=20=EC=95=84=EC=9D=B4=ED=85=9C?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=20=EC=9E=AC=EC=88=98=EC=A0=95(=EB=B0=B0?= =?UTF-8?q?=EA=B2=BD,=20=EC=97=A3=EC=A7=80=EB=A1=9C=20=EC=88=98=EC=A0=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gg/server/domain/item/type/ItemType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/item/type/ItemType.java b/src/main/java/com/gg/server/domain/item/type/ItemType.java index 250ec1273..1bfafaae1 100644 --- a/src/main/java/com/gg/server/domain/item/type/ItemType.java +++ b/src/main/java/com/gg/server/domain/item/type/ItemType.java @@ -4,6 +4,6 @@ @RequiredArgsConstructor public enum ItemType { - MEGAPHONE, PROFILE_BACKGROUND, PROFILE_BAND, TEXT_COLOR, PROFILE_IMAGE + MEGAPHONE, BACKGROUND, EDGE, TEXT_COLOR, PROFILE_IMAGE } From 00fa67818053e69846b2add66fb5514180252ea4 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Wed, 16 Aug 2023 11:49:11 +0900 Subject: [PATCH 087/273] =?UTF-8?q?[STYLE]=20=EC=95=84=EC=9D=B4=ED=85=9C?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=20=EC=9E=AC=EC=88=98=EC=A0=95(=EB=B0=B0?= =?UTF-8?q?=EA=B2=BD,=20=EC=97=A3=EC=A7=80=EB=A1=9C=20=EC=88=98=EC=A0=95)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gg/server/domain/item/type/ItemType.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/item/type/ItemType.java b/src/main/java/com/gg/server/domain/item/type/ItemType.java index 1bfafaae1..8aa9ab411 100644 --- a/src/main/java/com/gg/server/domain/item/type/ItemType.java +++ b/src/main/java/com/gg/server/domain/item/type/ItemType.java @@ -5,5 +5,4 @@ @RequiredArgsConstructor public enum ItemType { MEGAPHONE, BACKGROUND, EDGE, TEXT_COLOR, PROFILE_IMAGE - } From 1103534469cc8feb7b2528f6ef508c5e8f5eb3e8 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Wed, 16 Aug 2023 12:13:23 +0900 Subject: [PATCH 088/273] =?UTF-8?q?[STYLE]=20=EC=95=84=EC=9D=B4=ED=85=9C?= =?UTF-8?q?=20=ED=83=80=EC=9E=85=20=EC=9E=AC=EC=88=98=EC=A0=95(=EB=B0=B0?= =?UTF-8?q?=EA=B2=BD,=20=EC=97=A3=EC=A7=80=EB=A1=9C=20=EC=88=98=EC=A0=95)?= =?UTF-8?q?=20-rebase?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gg/server/domain/item/type/ItemType.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/gg/server/domain/item/type/ItemType.java b/src/main/java/com/gg/server/domain/item/type/ItemType.java index 8aa9ab411..1bfafaae1 100644 --- a/src/main/java/com/gg/server/domain/item/type/ItemType.java +++ b/src/main/java/com/gg/server/domain/item/type/ItemType.java @@ -5,4 +5,5 @@ @RequiredArgsConstructor public enum ItemType { MEGAPHONE, BACKGROUND, EDGE, TEXT_COLOR, PROFILE_IMAGE + } From 47408804b1bb56cd295dc94f767c684b0a7064ba Mon Sep 17 00:00:00 2001 From: sion99 Date: Wed, 16 Aug 2023 15:52:47 +0900 Subject: [PATCH 089/273] =?UTF-8?q?[REFACTOR]=20ITEM=20=EC=88=98=EC=A0=95,?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C=20API=20RequestBody=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/controller/ItemAdminController.java | 13 ++++++----- .../admin/item/dto/ItemDeleteRequestDto.java | 22 ------------------- .../admin/item/dto/ItemUpdateRequestDto.java | 9 ++++---- .../admin/item/service/ItemAdminService.java | 11 +++++----- .../com/gg/server/domain/item/data/Item.java | 5 +++-- 5 files changed, 20 insertions(+), 40 deletions(-) delete mode 100644 src/main/java/com/gg/server/admin/item/dto/ItemDeleteRequestDto.java diff --git a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java index fee93a6ea..1d8f85a83 100644 --- a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java +++ b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java @@ -1,10 +1,12 @@ package com.gg.server.admin.item.controller; -import com.gg.server.admin.item.dto.ItemDeleteRequestDto; import com.gg.server.admin.item.dto.ItemListResponseDto; import com.gg.server.admin.item.dto.ItemUpdateRequestDto; import com.gg.server.admin.item.service.ItemAdminService; +import com.gg.server.domain.user.dto.UserDto; import com.gg.server.global.dto.PageRequestDto; +import com.gg.server.global.utils.argumentresolver.Login; +import io.swagger.v3.oas.annotations.Parameter; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -29,15 +31,14 @@ public ItemListResponseDto getItemHistory(@ModelAttribute @Valid PageRequestDto } @PutMapping("/{itemId}") - public ResponseEntity updateItem(@PathVariable("itemId") Long itemId, @RequestBody @Valid ItemUpdateRequestDto itemRequestDto) { - itemAdminService.updateItem(itemId, itemRequestDto); - + public ResponseEntity updateItem(@PathVariable("itemId") Long itemId, @RequestBody @Valid ItemUpdateRequestDto itemRequestDto, @Parameter(hidden = true) @Login UserDto user) { + itemAdminService.updateItem(itemId, itemRequestDto, user.getIntraId()); return new ResponseEntity(HttpStatus.NO_CONTENT); } @DeleteMapping("/{itemId}") - public ResponseEntity deleteItem(@PathVariable("itemId") Long itemId, @RequestBody @Valid ItemDeleteRequestDto itemDeleteRequestDto) { - itemAdminService.deleteItem(itemId, itemDeleteRequestDto); + public ResponseEntity deleteItem(@PathVariable("itemId") Long itemId, @Parameter(hidden = true) @Login UserDto user) { + itemAdminService.deleteItem(itemId, user.getIntraId()); return new ResponseEntity(HttpStatus.NO_CONTENT); } } diff --git a/src/main/java/com/gg/server/admin/item/dto/ItemDeleteRequestDto.java b/src/main/java/com/gg/server/admin/item/dto/ItemDeleteRequestDto.java deleted file mode 100644 index ed88004ea..000000000 --- a/src/main/java/com/gg/server/admin/item/dto/ItemDeleteRequestDto.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.gg.server.admin.item.dto; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import javax.validation.constraints.NotNull; - -@Getter -@NoArgsConstructor -@AllArgsConstructor -public class ItemDeleteRequestDto { - @NotNull(message = "plz. deleterIntraId") - private String deleterIntraId; - - @Override - public String toString() { - return "ItemDeleteRequestDto{" + - "name='" + deleterIntraId + '\'' + - '}'; - } -} diff --git a/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java b/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java index 156219979..a3ac60591 100644 --- a/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java +++ b/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java @@ -1,5 +1,6 @@ package com.gg.server.admin.item.dto; +import com.gg.server.domain.item.type.ItemType; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -25,18 +26,18 @@ public class ItemUpdateRequestDto { @NotNull(message = "plz. discount") private Integer discount; - @NotNull(message = "plz. creatorIntraId") - private String creatorIntraId; + @NotNull(message = "plz. itemType") + private ItemType itemType; @Override public String toString() { - return "ItemRequestDto{" + + return "ItemUpdateRequestDto{" + "name='" + name + '\'' + ", content='" + content + '\'' + ", imageUri='" + imageUri + '\'' + ", price=" + price + ", discount=" + discount + - ", creator='" + creatorIntraId + '\'' + + ", itemType='" + itemType + '\'' + '}'; } } diff --git a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java index 68dbdab87..49e8d85cb 100644 --- a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java +++ b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java @@ -1,7 +1,6 @@ package com.gg.server.admin.item.service; import com.gg.server.admin.item.data.ItemAdminRepository; -import com.gg.server.admin.item.dto.ItemDeleteRequestDto; import com.gg.server.admin.item.dto.ItemHistoryResponseDto; import com.gg.server.admin.item.dto.ItemListResponseDto; import com.gg.server.admin.item.dto.ItemUpdateRequestDto; @@ -25,18 +24,18 @@ public ItemListResponseDto getAllItemHistory(Pageable pageable) { } @Transactional - public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto) { + public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, String creatorId) { Item item = itemAdminRepository.findById(itemId).orElseThrow(()-> new ItemNotFoundException()); item.setIsVisible(false); - item.setDeleterIntraId(itemUpdateRequestDto.getCreatorIntraId()); - Item newItem = new Item(itemUpdateRequestDto); + item.setDeleterIntraId(creatorId); + Item newItem = new Item(itemUpdateRequestDto, creatorId); itemAdminRepository.save(newItem); } @Transactional - public void deleteItem(Long itemId, ItemDeleteRequestDto itemDeleteRequestDto) { + public void deleteItem(Long itemId, String deleterId) { Item item = itemAdminRepository.findById(itemId).orElseThrow(()-> new ItemNotFoundException()); item.setIsVisible(false); - item.setDeleterIntraId(itemDeleteRequestDto.getDeleterIntraId()); + item.setDeleterIntraId(deleterId); } } diff --git a/src/main/java/com/gg/server/domain/item/data/Item.java b/src/main/java/com/gg/server/domain/item/data/Item.java index a81a954e9..85e3b9933 100644 --- a/src/main/java/com/gg/server/domain/item/data/Item.java +++ b/src/main/java/com/gg/server/domain/item/data/Item.java @@ -68,15 +68,16 @@ public Item(String name, String content, String imageUri, Integer price, } @Builder - public Item(ItemUpdateRequestDto updateRequestDto) { + public Item(ItemUpdateRequestDto updateRequestDto, String creatorIntraId) { this.name = updateRequestDto.getName(); this.content = updateRequestDto.getContent(); this.imageUri = updateRequestDto.getImageUri(); this.price = updateRequestDto.getPrice(); this.discount = updateRequestDto.getDiscount(); this.isVisible = true; - this.creatorIntraId = updateRequestDto.getCreatorIntraId(); + this.creatorIntraId = creatorIntraId; this.createdAt = LocalDateTime.now(); + this.type = updateRequestDto.getItemType(); } @Override From faad68d1841635a9bc98f5e6cdea059a44abc68a Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Wed, 16 Aug 2023 16:17:48 +0900 Subject: [PATCH 090/273] =?UTF-8?q?[feat]=20GGBE4-43=20=EA=B8=B0=EC=A1=B4?= =?UTF-8?q?=EB=85=B8=EB=A7=90=EA=B2=8C=EC=9E=84=EA=B2=B0=EA=B3=BC=EC=97=90?= =?UTF-8?q?=20=EC=BD=94=EC=9D=B8=20=ED=9A=8D=EB=93=9D=EB=9F=89=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/domain/game/GameController.java | 1 + .../domain/game/dto/req/RankResultReqDto.java | 2 + .../service/UserCoinChangeServiceTest.java | 60 +++++++++++++++++++ .../gg/server/game/GameControllerTest.java | 17 +----- 4 files changed, 66 insertions(+), 14 deletions(-) create mode 100644 src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java diff --git a/src/main/java/com/gg/server/domain/game/GameController.java b/src/main/java/com/gg/server/domain/game/GameController.java index 3b12caedb..60084632b 100644 --- a/src/main/java/com/gg/server/domain/game/GameController.java +++ b/src/main/java/com/gg/server/domain/game/GameController.java @@ -14,6 +14,7 @@ import com.gg.server.global.utils.argumentresolver.Login; import io.swagger.v3.oas.annotations.Parameter; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; diff --git a/src/main/java/com/gg/server/domain/game/dto/req/RankResultReqDto.java b/src/main/java/com/gg/server/domain/game/dto/req/RankResultReqDto.java index 8b5aa31d7..779cc7cbc 100644 --- a/src/main/java/com/gg/server/domain/game/dto/req/RankResultReqDto.java +++ b/src/main/java/com/gg/server/domain/game/dto/req/RankResultReqDto.java @@ -2,6 +2,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import javax.validation.constraints.Max; import javax.validation.constraints.NotNull; @@ -9,6 +10,7 @@ import javax.validation.constraints.PositiveOrZero; @Getter +@NoArgsConstructor @AllArgsConstructor public class RankResultReqDto { diff --git a/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java b/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java new file mode 100644 index 000000000..b4899cc27 --- /dev/null +++ b/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java @@ -0,0 +1,60 @@ +package com.gg.server.domain.coin.service; + +import com.gg.server.domain.coin.data.CoinHistoryRepository; +import com.gg.server.domain.coin.data.CoinPolicy; +import com.gg.server.domain.coin.data.CoinPolicyRepository; +import com.gg.server.domain.coin.dto.UserGameCoinResultDto; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +@RequiredArgsConstructor +@Transactional +class UserCoinChangeServiceTest { + @Autowired + TestDataUtils testDataUtils; + + @Autowired + AuthTokenProvider tokenProvider; + + @Autowired + CoinHistoryService coinHistoryService; + + @Autowired + CoinHistoryRepository coinHistoryRepository; + + @Autowired + CoinPolicyRepository coinPolicyRepository; + + @Autowired + UserRepository userRepository; + + @Autowired + UserCoinChangeService userCoinChangeService; + + @Test + @DisplayName("노말 게임 재화 증가 서비스 테스트") + void addNormalGameService() { + String accessToken = testDataUtils.getLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + User user = userRepository.getById(userId); + + + UserGameCoinResultDto userGameCoinResultDto = userCoinChangeService.addNormalGameCoin(userId); + + assertThat(user.getGgCoin()).isEqualTo(userGameCoinResultDto.getAfterCoin()); + assertThat(coinPolicyRepository.findTopByOrderByCreatedAtDesc().getNormal()).isEqualTo(userGameCoinResultDto.getCoinIncrement()); + System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); + } +} \ No newline at end of file diff --git a/src/test/java/com/gg/server/game/GameControllerTest.java b/src/test/java/com/gg/server/game/GameControllerTest.java index c5a03a825..33ae84a7b 100644 --- a/src/test/java/com/gg/server/game/GameControllerTest.java +++ b/src/test/java/com/gg/server/game/GameControllerTest.java @@ -94,9 +94,11 @@ public class GameControllerTest { private Game game1; private Game game2; + private Game game3; + @BeforeEach void init() { - season = seasonRepository.save(new Season("test season", LocalDateTime.of(2023, 5, 14, 0, 0), LocalDateTime.of(2999, 12, 31, 23, 59), + season = seasonRepository.save(new Season("test season", LocalDateTime.of(2023, 7, 14, 0, 0), LocalDateTime.of(2999, 12, 31, 23, 59), 1000, 100)); user1 = testDataUtils.createNewUser("test1", "test1@email", "null1", RacketType.NONE, SnsType.EMAIL, RoleType.USER); accessToken = tokenProvider.createToken(user1.getId()); @@ -370,17 +372,4 @@ public void flushRedis() { System.out.println("result: " + content); } - @Test - @Transactional - void 일반게임결과조회() throws Exception { - String accessToken2 = testDataUtils.getAdminLoginAccessToken(); - Long userId = tokenProvider.getUserIdFromAccessToken(accessToken2); - - String url = "/pingpong/games/" + "2112" + "/result/normal"; - String content = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken2) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); - System.out.println("result: " + content); - } } From fad2c0993b339ac436e7bfe8b1b3efcb31c32ae2 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Wed, 16 Aug 2023 16:37:45 +0900 Subject: [PATCH 091/273] =?UTF-8?q?[STYLE]=20=EC=95=84=EC=9D=B4=ED=85=9C?= =?UTF-8?q?=20=EA=B5=AC=EB=A7=A4=ED=95=98=EA=B8=B0=20,=20return=20+n?= =?UTF-8?q?ew=20~=20-status=20-.build,=20Del=5Fslf4j=20about=20log?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/item/controller/ItemController.java | 4 ++-- .../java/com/gg/server/domain/item/service/ItemService.java | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gg/server/domain/item/controller/ItemController.java b/src/main/java/com/gg/server/domain/item/controller/ItemController.java index c8f0e83c7..202df1528 100644 --- a/src/main/java/com/gg/server/domain/item/controller/ItemController.java +++ b/src/main/java/com/gg/server/domain/item/controller/ItemController.java @@ -23,9 +23,9 @@ public ItemStoreListResponseDto getAllItems() { } @PostMapping("/purchases/{itemId}") - public ResponseEntity purchaseItem(@PathVariable Long itemId, + public ResponseEntity purchaseItem(@PathVariable Long itemId, @Parameter(hidden = true) @Login UserDto userDto) { itemService.purchaseItem(itemId, userDto); - return ResponseEntity.status(HttpStatus.CREATED).build(); + return new ResponseEntity(HttpStatus.CREATED); } } diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index f7eb6bd37..86cb69a88 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -24,7 +24,6 @@ import java.util.stream.Collectors; @Service -@Slf4j @RequiredArgsConstructor public class ItemService { @@ -42,12 +41,10 @@ public ItemStoreListResponseDto getAllItems() { public void purchaseItem(Long itemId, UserDto userDto) { Item item = itemRepository.findById(itemId) .orElseThrow( ()-> { - log.error("해당 아이템이 없습니다. Item ID: {}, User Intra ID: {}", itemId, userDto.getIntraId()); throw new ItemNotFoundException(); }); if (!item.getIsVisible()) { - log.error("지금은 구매할 수 없는 아이템 입니다. Item ID: {}, User Intra ID: {}", itemId, userDto.getIntraId()); throw new ItemNotPurchasableException(); } @@ -62,7 +59,6 @@ public void purchaseItem(Long itemId, UserDto userDto) { // 사용자의 GGcoin이 상품 가격보다 낮으면 예외 처리. if (userDto.getGgCoin() < finalPrice) { - log.error("GGcoin이 부족합니다. 필요한 GGcoin: {}, 사용자의 GGcoin: {}", finalPrice, userDto.getGgCoin()); throw new InsufficientGgcoinException(); } From 0661030ace3b9de5da80a20d54786ac3afdd20e1 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Wed, 16 Aug 2023 16:42:31 +0900 Subject: [PATCH 092/273] =?UTF-8?q?=20[STYLE]=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=EA=B5=AC=EB=A7=A4=ED=95=98=EA=B8=B0=20,=20re?= =?UTF-8?q?turn=20+new=20~=20-status=20-.build,=20Del=5Fslf4j=20about=20lo?= =?UTF-8?q?g?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/domain/item/controller/ItemController.java | 8 ++++---- .../com/gg/server/domain/item/service/ItemService.java | 8 -------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/gg/server/domain/item/controller/ItemController.java b/src/main/java/com/gg/server/domain/item/controller/ItemController.java index def7cc5f3..8603ff197 100644 --- a/src/main/java/com/gg/server/domain/item/controller/ItemController.java +++ b/src/main/java/com/gg/server/domain/item/controller/ItemController.java @@ -24,17 +24,17 @@ public ItemStoreListResponseDto getAllItems() { } @PostMapping("/purchases/{itemId}") - public ResponseEntity purchaseItem(@PathVariable Long itemId, + public ResponseEntity purchaseItem(@PathVariable Long itemId, @Parameter(hidden = true) @Login UserDto userDto) { itemService.purchaseItem(itemId, userDto); - return ResponseEntity.status(HttpStatus.CREATED).build(); + return new ResponseEntity(HttpStatus.CREATED); } @PostMapping("/gift/{itemId}") - public ResponseEntity giftItem(@PathVariable Long itemId, + public ResponseEntity giftItem(@PathVariable Long itemId, @RequestBody ItemGiftRequestDto recipient, @Parameter(hidden = true) @Login UserDto userDto) { itemService.giftItem(itemId, recipient.getOwnerId(), userDto); - return ResponseEntity.status(HttpStatus.CREATED).build(); + return new ResponseEntity(HttpStatus.CREATED); } } diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index 0c8033a65..495526395 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -15,7 +15,6 @@ import com.gg.server.domain.user.dto.UserDto; import com.gg.server.domain.user.exception.UserNotFoundException; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -24,7 +23,6 @@ import java.util.stream.Collectors; @Service -@Slf4j @RequiredArgsConstructor public class ItemService { @@ -43,12 +41,10 @@ public ItemStoreListResponseDto getAllItems() { public void purchaseItem(Long itemId, UserDto userDto) { Item item = itemRepository.findById(itemId) .orElseThrow( ()-> { - log.error("해당 아이템이 없습니다. Item ID: {}, User Intra ID: {}", itemId, userDto.getIntraId()); throw new ItemNotFoundException(); }); if (!item.getIsVisible()) { - log.error("지금은 구매할 수 없는 아이템 입니다. Item ID: {}, User Intra ID: {}", itemId, userDto.getIntraId()); throw new ItemNotPurchasableException(); } @@ -63,7 +59,6 @@ public void purchaseItem(Long itemId, UserDto userDto) { // 사용자의 GGcoin이 상품 가격보다 낮으면 예외 처리. if (userDto.getGgCoin() < finalPrice) { - log.error("GGcoin이 부족합니다. 필요한 GGcoin: {}, 사용자의 GGcoin: {}", finalPrice, userDto.getGgCoin()); throw new InsufficientGgcoinException(); } @@ -82,11 +77,9 @@ public void purchaseItem(Long itemId, UserDto userDto) { public void giftItem(Long itemId, String ownerId, UserDto userDto) { Item item = itemRepository.findById(itemId) .orElseThrow( ()-> { - log.error("해당 아이템이 없습니다. Item ID: {}", itemId); throw new ItemNotFoundException(); }); if (!item.getIsVisible()) { - log.error("지금은 선물할 수 없는 아이템 입니다. Item ID: {}", itemId); throw new ItemNotPurchasableException(); } @@ -101,7 +94,6 @@ public void giftItem(Long itemId, String ownerId, UserDto userDto) { // 사용자의 GGcoin이 상품 가격보다 낮으면 예외 처리. if (userDto.getGgCoin() < finalPrice) { - log.error("GGcoin이 부족합니다. 필요한 GGcoin: {}, 사용자의 GGcoin: {}", finalPrice, userDto.getGgCoin()); throw new InsufficientGgcoinException(); } From 1d596db2d10ffae392dfe2a3092a147d0fd5c51a Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Wed, 16 Aug 2023 16:45:05 +0900 Subject: [PATCH 093/273] =?UTF-8?q?[STYLE]=20@slf4j=20=EC=96=B4=EB=85=B8?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EC=85=98=20import=20=EA=B5=AC=EB=AC=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gg/server/domain/item/service/ItemService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index 86cb69a88..40ccaf43f 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -15,7 +15,6 @@ import com.gg.server.domain.user.dto.UserDto; import com.gg.server.domain.user.exception.UserNotFoundException; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; From e287469ac0f866a943149209d04339f863828c47 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Thu, 17 Aug 2023 00:52:04 +0900 Subject: [PATCH 094/273] [TEST] edit test include receiptId --- .../user/controller/UserController.java | 9 ++--- ...ReceiptDto.java => UserBackgroundDto.java} | 6 +-- .../server/domain/user/dto/UserEdgeDto.java | 6 ++- .../domain/user/dto/UserTextColorDto.java | 2 + .../domain/user/service/UserService.java | 19 ++++++---- .../domain/user/type/BackgroundType.java | 13 ++++--- .../gg/server/domain/user/type/EdgeType.java | 13 ++++--- .../user/controller/UserControllerTest.java | 38 ++++++++++++++----- 8 files changed, 68 insertions(+), 38 deletions(-) rename src/main/java/com/gg/server/domain/user/dto/{UserReceiptDto.java => UserBackgroundDto.java} (63%) diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index 941d32c97..7f2238197 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -30,7 +30,6 @@ @RestController @RequiredArgsConstructor @RequestMapping("/pingpong/users") -@Slf4j public class UserController { private final UserService userService; private final UserTextColorCheckService userTextColorCheck; @@ -132,8 +131,8 @@ public UserAttendanceResponseDto attendUser(@Parameter(hidden = true) @Login Use } @PatchMapping("/edge") - public ResponseEntity updateEdge(@RequestBody @Valid UserReceiptDto userReceiptDto, @Parameter(hidden = true) @Login UserDto user) { - userService.updateEdge(user, userReceiptDto); + public ResponseEntity updateEdge(@RequestBody @Valid UserEdgeDto userEdgeDto, @Parameter(hidden = true) @Login UserDto user) { + userService.updateEdge(user, userEdgeDto); return new ResponseEntity(HttpStatus.NO_CONTENT); } @@ -143,8 +142,8 @@ public UserCoinResponseDto getUserCoin(@Parameter(hidden = true) @Login UserDto } @PatchMapping("/background") - public ResponseEntity updateBackground(@RequestBody @Valid UserReceiptDto userReceiptDto, @Parameter(hidden = true) @Login UserDto user) { - userService.updateBackground(user, userReceiptDto); + public ResponseEntity updateBackground(@RequestBody @Valid UserBackgroundDto userBackgroundDto, @Parameter(hidden = true) @Login UserDto user) { + userService.updateBackground(user, userBackgroundDto); return new ResponseEntity(HttpStatus.NO_CONTENT); } } diff --git a/src/main/java/com/gg/server/domain/user/dto/UserReceiptDto.java b/src/main/java/com/gg/server/domain/user/dto/UserBackgroundDto.java similarity index 63% rename from src/main/java/com/gg/server/domain/user/dto/UserReceiptDto.java rename to src/main/java/com/gg/server/domain/user/dto/UserBackgroundDto.java index 06a894696..38065e6d8 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserReceiptDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserBackgroundDto.java @@ -1,15 +1,15 @@ package com.gg.server.domain.user.dto; -import com.gg.server.domain.receipt.data.Receipt; -import com.sun.istack.NotNull; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import javax.validation.constraints.NotNull; + @Getter @NoArgsConstructor @AllArgsConstructor -public class UserReceiptDto { +public class UserBackgroundDto { @NotNull private Long receiptId; } diff --git a/src/main/java/com/gg/server/domain/user/dto/UserEdgeDto.java b/src/main/java/com/gg/server/domain/user/dto/UserEdgeDto.java index 6ce1be72f..e333aed27 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserEdgeDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserEdgeDto.java @@ -1,13 +1,15 @@ package com.gg.server.domain.user.dto; -import com.gg.server.domain.user.type.EdgeType; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import javax.validation.constraints.NotNull; + @Getter @NoArgsConstructor @AllArgsConstructor public class UserEdgeDto { - private EdgeType edgeType; + @NotNull + private Long receiptId; } diff --git a/src/main/java/com/gg/server/domain/user/dto/UserTextColorDto.java b/src/main/java/com/gg/server/domain/user/dto/UserTextColorDto.java index 7e06a7277..3629792c2 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserTextColorDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserTextColorDto.java @@ -9,6 +9,8 @@ @NoArgsConstructor @AllArgsConstructor public class UserTextColorDto { + @NotNull + private Long receiptId; @NotNull private String textColor; } diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index a72393474..f632c95ec 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -35,7 +35,6 @@ import com.gg.server.domain.user.exception.UserTextColorException; import com.gg.server.domain.user.type.*; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -53,7 +52,6 @@ @Service @RequiredArgsConstructor -@Slf4j public class UserService { private final UserFindService userFindService; @@ -271,17 +269,24 @@ public UserNormalDetailResponseDto getUserNormalDetail(UserDto user) { @Transactional() public void updateTextColor(Long userId, UserTextColorDto textColorDto) { String textColor = textColorDto.getTextColor(); + Receipt receipt = receiptRepository.findById(textColorDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); + User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new); + if (!UserTextColorCheckService.check(textColor)) throw new UserTextColorException(); - User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new); + checkOwner(user, receipt); + checkItemType(receipt, ItemType.TEXT_COLOR); + checkUseStatus(receipt); + user.updateTextColor(textColor); + receipt.updateStatus(ItemStatus.USED); } @Transactional - public void updateEdge(UserDto user, UserReceiptDto userReceiptDto) { + public void updateEdge(UserDto user, UserEdgeDto userEdgeDto) { User userId = userRepository.findById(user.getId()).orElseThrow(UserNotFoundException::new); EdgeType edgeType = EdgeType.getRandomEdgeType(); - Receipt receipt = receiptRepository.findById(userReceiptDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); + Receipt receipt = receiptRepository.findById(userEdgeDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); checkOwner(userId, receipt); checkItemType(receipt, ItemType.PROFILE_BAND); @@ -292,9 +297,9 @@ public void updateEdge(UserDto user, UserReceiptDto userReceiptDto) { } @Transactional - public void updateBackground(UserDto user, UserReceiptDto userReceiptDto) { + public void updateBackground(UserDto user, UserBackgroundDto userBackgroundDto) { User userId = userRepository.findById(user.getId()).orElseThrow(UserNotFoundException::new); - Receipt receipt = receiptRepository.findById(userReceiptDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); + Receipt receipt = receiptRepository.findById(userBackgroundDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); BackgroundType backgroundType = BackgroundType.getRandomBackgroundType(); checkOwner(userId, receipt); diff --git a/src/main/java/com/gg/server/domain/user/type/BackgroundType.java b/src/main/java/com/gg/server/domain/user/type/BackgroundType.java index 681968381..01629e6fc 100644 --- a/src/main/java/com/gg/server/domain/user/type/BackgroundType.java +++ b/src/main/java/com/gg/server/domain/user/type/BackgroundType.java @@ -21,7 +21,8 @@ public enum BackgroundType { COLOR12(12), COLOR13(13), COLOR14(14), - COLOR15(15); + COLOR15(15), + COLOR16(16); private final Integer code; @@ -31,15 +32,15 @@ public static BackgroundType getRandomBackgroundType() { int colorInt; if (tierInt <= 50) - colorInt = random.nextInt(100) % 4; + colorInt = random.nextInt(100) % 4 + 1; else if (tierInt <= 70) - colorInt = (random.nextInt(99) % 3) + 4; + colorInt = (random.nextInt(99) % 3) + 5; else if (tierInt <= 85) - colorInt = (random.nextInt(99) % 3) + 7; + colorInt = (random.nextInt(99) % 3) + 8; else if (tierInt <= 95) - colorInt = (random.nextInt(99) % 3) + 10; + colorInt = (random.nextInt(99) % 3) + 11; else - colorInt = (random.nextInt(99) % 3) + 13; + colorInt = (random.nextInt(99) % 3) + 14; return BackgroundType.values()[colorInt]; } diff --git a/src/main/java/com/gg/server/domain/user/type/EdgeType.java b/src/main/java/com/gg/server/domain/user/type/EdgeType.java index 5c5a7aab1..e6446216f 100644 --- a/src/main/java/com/gg/server/domain/user/type/EdgeType.java +++ b/src/main/java/com/gg/server/domain/user/type/EdgeType.java @@ -21,7 +21,8 @@ public enum EdgeType { COLOR12(12), COLOR13(13), COLOR14(14), - COLOR15(15); + COLOR15(15), + COLOR16(16); private final Integer code; @@ -31,15 +32,15 @@ public static EdgeType getRandomEdgeType() { int colorInt; if (tierInt <= 50) - colorInt = random.nextInt(100) % 4; + colorInt = random.nextInt(100) % 4 + 1; else if (tierInt <= 70) - colorInt = (random.nextInt(99) % 3) + 4; + colorInt = (random.nextInt(99) % 3) + 5; else if (tierInt <= 85) - colorInt = (random.nextInt(99) % 3) + 7; + colorInt = (random.nextInt(99) % 3) + 8; else if (tierInt <= 95) - colorInt = (random.nextInt(99) % 3) + 10; + colorInt = (random.nextInt(99) % 3) + 11; else - colorInt = (random.nextInt(99) % 3) + 13; + colorInt = (random.nextInt(99) % 3) + 14; return EdgeType.values()[colorInt]; } diff --git a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java index 962383a8d..3a5f60d9e 100644 --- a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java +++ b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java @@ -9,10 +9,15 @@ import com.gg.server.domain.game.service.GameService; import com.gg.server.domain.game.type.Mode; import com.gg.server.domain.game.type.StatusType; +import com.gg.server.domain.item.data.Item; +import com.gg.server.domain.item.type.ItemType; import com.gg.server.domain.rank.data.RankRepository; import com.gg.server.domain.rank.redis.RankRedis; import com.gg.server.domain.rank.redis.RankRedisRepository; import com.gg.server.domain.rank.redis.RedisKeyManager; +import com.gg.server.domain.receipt.data.Receipt; +import com.gg.server.domain.receipt.data.ReceiptRepository; +import com.gg.server.domain.receipt.type.ItemStatus; import com.gg.server.domain.season.data.Season; import com.gg.server.domain.season.data.SeasonRepository; import com.gg.server.domain.user.data.User; @@ -23,6 +28,7 @@ import com.gg.server.domain.user.type.*; import lombok.extern.slf4j.Slf4j; import org.assertj.core.api.Assertions; +import org.assertj.core.api.AssertionsForClassTypes; import org.junit.jupiter.api.AfterEach; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.http.MediaType; @@ -87,6 +93,8 @@ class UserControllerTest { @Autowired CoinHistoryRepository coinHistoryRepository; + @Autowired + ReceiptRepository receiptRepository; @AfterEach public void flushRedis() { @@ -356,12 +364,13 @@ public void updateTextColorTest() throws Exception { String accessToken = tokenProvider.createToken(newUser.getId()); String url = "/pingpong/users/text-color"; + Receipt receipt = receiptRepository.findById(4L).get(); String newTextColor = "#FFFFFF"; //when mockMvc.perform(patch(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) .contentType(MediaType.APPLICATION_JSON) - .content(objectMapper.writeValueAsString(new UserTextColorDto(newTextColor)))) + .content(objectMapper.writeValueAsString(new UserTextColorDto(4L, newTextColor)))) .andExpect(status().is2xxSuccessful()); //then userRepository.findById(newUser.getId()).ifPresentOrElse(user -> { @@ -369,6 +378,7 @@ public void updateTextColorTest() throws Exception { }, () -> { Assertions.fail("유저 업데이트 실패"); }); + AssertionsForClassTypes.assertThat(receipt.getStatus()).isEqualTo(ItemStatus.USED); } @Test @@ -384,11 +394,15 @@ public void updateEdgeTest() throws Exception { String statusMessage = "statusMessage"; testDataUtils.createUserRank(newUser, statusMessage, season); String accessToken = tokenProvider.createToken(newUser.getId()); + + Receipt receipt = receiptRepository.findById(3L).get(); String url = "/pingpong/users/edge"; //when mockMvc.perform(patch(url) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) + .content(objectMapper.writeValueAsString(3L)) + .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().is2xxSuccessful()) .andReturn().getResponse().getContentAsString(); @@ -399,6 +413,7 @@ public void updateEdgeTest() throws Exception { }, () -> { Assertions.fail("유저 업데이트 실패"); }); + AssertionsForClassTypes.assertThat(receipt.getStatus()).isEqualTo(ItemStatus.USED); } @Test @@ -427,26 +442,31 @@ public void updateBackgroundTest() throws Exception { Season season = testDataUtils.createSeason(); String intraId = "intraId"; String email = "email"; - String imageUrl = "imageUrl"; - User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, - SnsType.BOTH, RoleType.ADMIN); + String imageUri = "imageUri"; + User newUser = testDataUtils.createNewUser(intraId, email, imageUri, RacketType.PENHOLDER, + SnsType.BOTH, RoleType.USER); String statusMessage = "statusMessage"; testDataUtils.createUserRank(newUser, statusMessage, season); String accessToken = tokenProvider.createToken(newUser.getId()); - String url = "/pingpong/users/background"; + + Receipt receipt = receiptRepository.findById(2L).get(); + String uri = "/pingpong/users/background"; //when - mockMvc.perform(patch(url) - .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + mockMvc.perform(patch(uri) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) + .content(objectMapper.writeValueAsString(2L)) + .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().is2xxSuccessful()) .andReturn().getResponse().getContentAsString(); //then - log.info("user.getBacground() : {}", newUser.getBackground()); + log.info("user.getBackground() : {}", newUser.getBackground()); userRepository.findById(newUser.getId()).ifPresentOrElse(user -> { Assertions.assertThat(Arrays.stream(BackgroundType.values()).anyMatch(v -> v.equals(user.getBackground()))).isEqualTo(true); }, () -> { Assertions.fail("유저 업데이트 실패"); }); + AssertionsForClassTypes.assertThat(receipt.getStatus()).isEqualTo(ItemStatus.USED); } } From 0922238028407c10c892474eb5d637b6ae9ec88e Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Thu, 17 Aug 2023 10:45:59 +0900 Subject: [PATCH 095/273] =?UTF-8?q?[CHORE]=20ItemType=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gg/server/domain/item/type/ItemType.java | 2 +- .../java/com/gg/server/domain/user/service/UserService.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gg/server/domain/item/type/ItemType.java b/src/main/java/com/gg/server/domain/item/type/ItemType.java index 250ec1273..1bfafaae1 100644 --- a/src/main/java/com/gg/server/domain/item/type/ItemType.java +++ b/src/main/java/com/gg/server/domain/item/type/ItemType.java @@ -4,6 +4,6 @@ @RequiredArgsConstructor public enum ItemType { - MEGAPHONE, PROFILE_BACKGROUND, PROFILE_BAND, TEXT_COLOR, PROFILE_IMAGE + MEGAPHONE, BACKGROUND, EDGE, TEXT_COLOR, PROFILE_IMAGE } diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index f632c95ec..9ab096b24 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -289,7 +289,7 @@ public void updateEdge(UserDto user, UserEdgeDto userEdgeDto) { Receipt receipt = receiptRepository.findById(userEdgeDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); checkOwner(userId, receipt); - checkItemType(receipt, ItemType.PROFILE_BAND); + checkItemType(receipt, ItemType.EDGE); checkUseStatus(receipt); userId.updateEdge(edgeType); @@ -303,7 +303,7 @@ public void updateBackground(UserDto user, UserBackgroundDto userBackgroundDto) BackgroundType backgroundType = BackgroundType.getRandomBackgroundType(); checkOwner(userId, receipt); - checkItemType(receipt, ItemType.PROFILE_BACKGROUND); + checkItemType(receipt, ItemType.BACKGROUND); checkUseStatus(receipt); userId.updateBackground(backgroundType); From 0d6260960cd7dae5199daf374d4b329e9c610b8b Mon Sep 17 00:00:00 2001 From: sion99 Date: Thu, 17 Aug 2023 14:06:07 +0900 Subject: [PATCH 096/273] =?UTF-8?q?[TEST]=20ITEM=20=EC=88=98=EC=A0=95,=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EB=82=B4=EC=9A=A9=EC=97=90=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ItemAdminControllerTest.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java b/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java index 15579f94e..0cbbd93c4 100644 --- a/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java @@ -4,6 +4,7 @@ import com.gg.server.admin.item.data.ItemAdminRepository; import com.gg.server.admin.item.dto.ItemListResponseDto; import com.gg.server.admin.item.service.ItemAdminService; +import com.gg.server.domain.item.data.Item; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; import com.gg.server.utils.TestDataUtils; @@ -24,6 +25,8 @@ import javax.transaction.Transactional; +import java.util.List; + import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -76,7 +79,9 @@ public void getAllItemHistoryTest() throws Exception { @DisplayName("PUT /pingpong/admin/items/history/{itemId}") public void updateItemTest() throws Exception { String accessToken = testDataUtils.getAdminLoginAccessToken(); - String requestJson = "{\"name\" : \"확성기\", \"content\" : \"testing\", \"imageUri\" : \"https://kakao.com\", \"price\" : 42, \"discount\" : 50, \"creatorIntraId\" : \"cheolee\"}"; + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + String createrId = userRepository.getById(userId).getIntraId(); + String requestJson = "{\"name\" : \"확성기\", \"content\" : \"testing\", \"imageUri\" : \"https://kakao.com\", \"price\" : 42, \"discount\" : 50}"; String contentAsString = mockMvc.perform(put("/pingpong/admin/items/{itemId}", 1) .contentType(MediaType.APPLICATION_JSON) .content(requestJson) @@ -84,19 +89,21 @@ public void updateItemTest() throws Exception { .andExpect(status().isNoContent()) .andReturn().getResponse().getContentAsString(); System.out.println(contentAsString); + List list = itemAdminRepository.findAll(); + assertThat(list.get(list.size() - 1).getCreatorIntraId()).isEqualTo(createrId); } @Test @DisplayName("DELETE /pingpong/admin/items/{itemId}") public void deleteItemTest() throws Exception { String accessToken = testDataUtils.getAdminLoginAccessToken(); - String requestJson = "{\"deleterIntraId\" : \"sishin\"}"; + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + String deleterId = userRepository.getById(userId).getIntraId(); String contentAsString = mockMvc.perform(delete("/pingpong/admin/items/{itemId}", 1) - .contentType(MediaType.APPLICATION_JSON) - .content(requestJson) .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) .andExpect(status().isNoContent()) .andReturn().getResponse().getContentAsString(); - System.out.println(contentAsString); + List list = itemAdminRepository.findAll(); + assertThat(list.get(0).getDeleterIntraId()).isEqualTo(deleterId); } } \ No newline at end of file From 056a861f51217d4ac2e7cc8703b0526001419280 Mon Sep 17 00:00:00 2001 From: sion99 Date: Thu, 17 Aug 2023 16:08:39 +0900 Subject: [PATCH 097/273] =?UTF-8?q?[REFACTOR]=20UserDto=EB=A5=BC=20Service?= =?UTF-8?q?=EC=97=90=20=EB=84=98=EA=B9=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/item/controller/ItemAdminController.java | 4 ++-- .../server/admin/item/service/ItemAdminService.java | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java index 1d8f85a83..ca2f876b7 100644 --- a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java +++ b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java @@ -32,13 +32,13 @@ public ItemListResponseDto getItemHistory(@ModelAttribute @Valid PageRequestDto @PutMapping("/{itemId}") public ResponseEntity updateItem(@PathVariable("itemId") Long itemId, @RequestBody @Valid ItemUpdateRequestDto itemRequestDto, @Parameter(hidden = true) @Login UserDto user) { - itemAdminService.updateItem(itemId, itemRequestDto, user.getIntraId()); + itemAdminService.updateItem(itemId, itemRequestDto, user); return new ResponseEntity(HttpStatus.NO_CONTENT); } @DeleteMapping("/{itemId}") public ResponseEntity deleteItem(@PathVariable("itemId") Long itemId, @Parameter(hidden = true) @Login UserDto user) { - itemAdminService.deleteItem(itemId, user.getIntraId()); + itemAdminService.deleteItem(itemId, user); return new ResponseEntity(HttpStatus.NO_CONTENT); } } diff --git a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java index 49e8d85cb..63d0b3550 100644 --- a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java +++ b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java @@ -6,6 +6,7 @@ import com.gg.server.admin.item.dto.ItemUpdateRequestDto; import com.gg.server.admin.item.exception.ItemNotFoundException; import com.gg.server.domain.item.data.Item; +import com.gg.server.domain.user.dto.UserDto; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -24,18 +25,18 @@ public ItemListResponseDto getAllItemHistory(Pageable pageable) { } @Transactional - public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, String creatorId) { + public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, UserDto user) { Item item = itemAdminRepository.findById(itemId).orElseThrow(()-> new ItemNotFoundException()); item.setIsVisible(false); - item.setDeleterIntraId(creatorId); - Item newItem = new Item(itemUpdateRequestDto, creatorId); + item.setDeleterIntraId(user.getIntraId()); + Item newItem = new Item(itemUpdateRequestDto, user.getIntraId()); itemAdminRepository.save(newItem); } @Transactional - public void deleteItem(Long itemId, String deleterId) { + public void deleteItem(Long itemId, UserDto user) { Item item = itemAdminRepository.findById(itemId).orElseThrow(()-> new ItemNotFoundException()); item.setIsVisible(false); - item.setDeleterIntraId(deleterId); + item.setDeleterIntraId(user.getIntraId()); } } From 273424ba4616c58e35a9b5a9fd7b260bfe932721 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Fri, 18 Aug 2023 22:52:22 +0900 Subject: [PATCH 098/273] =?UTF-8?q?[REFACTOR]=20GGBE4-43=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=20=EB=B0=8F=20=ED=95=A8=EC=88=98=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/admin/game/controller/GameAdminController.java | 1 - .../com/gg/server/admin/game/service/GameAdminService.java | 7 ------- .../java/com/gg/server/domain/game/GameController.java | 1 - .../coin/controller/CoinPolicyAdminControllerTest.java | 4 ++-- src/test/java/com/gg/server/game/GameControllerTest.java | 5 ----- 5 files changed, 2 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/gg/server/admin/game/controller/GameAdminController.java b/src/main/java/com/gg/server/admin/game/controller/GameAdminController.java index 6fc107dcd..4d0b7349f 100644 --- a/src/main/java/com/gg/server/admin/game/controller/GameAdminController.java +++ b/src/main/java/com/gg/server/admin/game/controller/GameAdminController.java @@ -8,7 +8,6 @@ import com.gg.server.global.exception.ErrorCode; import com.gg.server.global.exception.custom.InvalidParameterException; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; diff --git a/src/main/java/com/gg/server/admin/game/service/GameAdminService.java b/src/main/java/com/gg/server/admin/game/service/GameAdminService.java index c975a32b5..e64fafc1f 100644 --- a/src/main/java/com/gg/server/admin/game/service/GameAdminService.java +++ b/src/main/java/com/gg/server/admin/game/service/GameAdminService.java @@ -24,7 +24,6 @@ import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.exception.UserNotFoundException; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Caching; import org.springframework.data.domain.*; @@ -37,7 +36,6 @@ @Service @RequiredArgsConstructor -@Slf4j public class GameAdminService { private final GameAdminRepository gameAdminRepository; @@ -64,12 +62,7 @@ public GameLogListAdminResponseDto findGamesBySeasonId(Long seasonId, Pageable p @Transactional(readOnly = true) public List getGameLogList(List gameIdList){ - log.info(gameIdList.size() + " : size"); - for (Long id:gameIdList){ - log.info(id+"::"); - } List teamViews = gameAdminRepository.findTeamsByGameIsIn(gameIdList); - log.info(teamViews.size() + "===="); return teamViews.stream().map(GameLogAdminDto::new).collect(Collectors.toList()); } diff --git a/src/main/java/com/gg/server/domain/game/GameController.java b/src/main/java/com/gg/server/domain/game/GameController.java index 60084632b..3b12caedb 100644 --- a/src/main/java/com/gg/server/domain/game/GameController.java +++ b/src/main/java/com/gg/server/domain/game/GameController.java @@ -14,7 +14,6 @@ import com.gg.server.global.utils.argumentresolver.Login; import io.swagger.v3.oas.annotations.Parameter; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; diff --git a/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerTest.java b/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerTest.java index 483615738..cce47e6b4 100644 --- a/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/coin/controller/CoinPolicyAdminControllerTest.java @@ -48,7 +48,7 @@ class CoinPolicyAdminControllerTest { @Test @DisplayName("[Get]/pingpong/admin/coinpolicy") - void getAnnouncement() throws Exception { + void getCoinPolicy() throws Exception { String accessToken = testDataUtils.getAdminLoginAccessToken(); Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); @@ -74,7 +74,7 @@ void getAnnouncement() throws Exception { @Test @DisplayName("[Post]/pingpong/admin/coinpolicy") - void addAnnouncement() throws Exception { + void addCoinPolicy() throws Exception { String accessToken = testDataUtils.getAdminLoginAccessToken(); Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); diff --git a/src/test/java/com/gg/server/game/GameControllerTest.java b/src/test/java/com/gg/server/game/GameControllerTest.java index 33ae84a7b..d8a985e3b 100644 --- a/src/test/java/com/gg/server/game/GameControllerTest.java +++ b/src/test/java/com/gg/server/game/GameControllerTest.java @@ -94,8 +94,6 @@ public class GameControllerTest { private Game game1; private Game game2; - private Game game3; - @BeforeEach void init() { season = seasonRepository.save(new Season("test season", LocalDateTime.of(2023, 7, 14, 0, 0), LocalDateTime.of(2999, 12, 31, 23, 59), @@ -292,9 +290,7 @@ public void flushRedis() { //given String url = "/pingpong/games?page=1&size=10&nickname=test1"; Pageable pageable = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "startTime")); - System.out.println("================================================"); GameListResDto expect = gameFindService.allGameListUser(pageable, "test1", null); - System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++"); //when String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) .andExpect(status().isOk()) @@ -371,5 +367,4 @@ public void flushRedis() { .andReturn().getResponse().getContentAsString(); System.out.println("result: " + content); } - } From c66a789d601fb078968795f221a2d66554ab72da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Mon, 21 Aug 2023 15:24:10 +0900 Subject: [PATCH 099/273] =?UTF-8?q?[FEAT]=20GGBE4-15=20=ED=99=95=EC=84=B1?= =?UTF-8?q?=EA=B8=B0=20=EB=8B=B9=EC=9D=BC=20=EC=A1=B0=ED=9A=8C=20api=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MegaphoneController.java | 13 +++++++++++++ .../dto/MegaphoneTodayListResponseDto.java | 19 +++++++++++++++++++ .../megaphone/redis/MegaphoneRedis.java | 4 +++- .../redis/MegaphoneRedisRepository.java | 2 +- .../megaphone/service/MegaphoneService.java | 11 +++++++++++ 5 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/gg/server/domain/megaphone/dto/MegaphoneTodayListResponseDto.java diff --git a/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java b/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java index e31c03fc9..b0144bc9a 100644 --- a/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java +++ b/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java @@ -1,6 +1,7 @@ package com.gg.server.domain.megaphone.controller; import com.gg.server.domain.megaphone.dto.MegaphoneDetailResponseDto; +import com.gg.server.domain.megaphone.dto.MegaphoneTodayListResponseDto; import com.gg.server.domain.megaphone.dto.MegaphoneUseRequestDto; import com.gg.server.domain.megaphone.service.MegaphoneService; import com.gg.server.domain.user.dto.UserDto; @@ -12,6 +13,7 @@ import org.springframework.web.bind.annotation.*; import javax.validation.Valid; +import java.util.List; @RestController @RequiredArgsConstructor @@ -37,4 +39,15 @@ public ResponseEntity deleteMegaphone(@PathVariable Long megaphoneId, public ResponseEntity getMegaphoneDetail(@PathVariable Long receiptId, @Parameter(hidden = true) @Login UserDto user) { return ResponseEntity.ok(megaphoneService.getMegaphoneDetail(receiptId, user)); } + + @GetMapping() + public ResponseEntity> getMegaphoneTodayList(@Parameter(hidden = true) @Login UserDto user) { + return ResponseEntity.ok(megaphoneService.getMegaphoneTodayList()); + } + + @PostMapping("/test") + public ResponseEntity testMegaphone(@Parameter(hidden = true) @Login UserDto user) { + megaphoneService.testMegaphone(); + return ResponseEntity.status(HttpStatus.CREATED).build(); + } } diff --git a/src/main/java/com/gg/server/domain/megaphone/dto/MegaphoneTodayListResponseDto.java b/src/main/java/com/gg/server/domain/megaphone/dto/MegaphoneTodayListResponseDto.java new file mode 100644 index 000000000..67e0c33fa --- /dev/null +++ b/src/main/java/com/gg/server/domain/megaphone/dto/MegaphoneTodayListResponseDto.java @@ -0,0 +1,19 @@ +package com.gg.server.domain.megaphone.dto; + +import com.gg.server.domain.megaphone.redis.MegaphoneRedis; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class MegaphoneTodayListResponseDto { + private Long megaphoneId; + private String content; + private String intraId; + + public MegaphoneTodayListResponseDto(MegaphoneRedis megaphoneRedis) { + this.megaphoneId = megaphoneRedis.getId(); + this.content = megaphoneRedis.getContent(); + this.intraId = megaphoneRedis.getIntraId(); + } +} diff --git a/src/main/java/com/gg/server/domain/megaphone/redis/MegaphoneRedis.java b/src/main/java/com/gg/server/domain/megaphone/redis/MegaphoneRedis.java index 2a7d72fd6..bd560df0b 100644 --- a/src/main/java/com/gg/server/domain/megaphone/redis/MegaphoneRedis.java +++ b/src/main/java/com/gg/server/domain/megaphone/redis/MegaphoneRedis.java @@ -7,6 +7,7 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; import org.springframework.data.redis.core.RedisHash; import javax.persistence.Id; @@ -16,7 +17,8 @@ @Getter @Builder @AllArgsConstructor -public class MegaphoneRedis{ +@NoArgsConstructor +public class MegaphoneRedis { @Id private Long id; private String intraId; diff --git a/src/main/java/com/gg/server/domain/megaphone/redis/MegaphoneRedisRepository.java b/src/main/java/com/gg/server/domain/megaphone/redis/MegaphoneRedisRepository.java index 9b6378d94..d1fd99ed3 100644 --- a/src/main/java/com/gg/server/domain/megaphone/redis/MegaphoneRedisRepository.java +++ b/src/main/java/com/gg/server/domain/megaphone/redis/MegaphoneRedisRepository.java @@ -14,7 +14,7 @@ public class MegaphoneRedisRepository { private final RedisTemplate redisTemplate; public void addMegaphone(MegaphoneRedis megaphoneRedis) { - Duration duration = Duration.between(megaphoneRedis.getUsedAt(), megaphoneRedis.getUsedAt()); + Duration duration = Duration.between(megaphoneRedis.getUsedAt(), megaphoneRedis.getUsedAt().plusDays(1)); redisTemplate.opsForValue().set("megaphone" + megaphoneRedis.getId(), megaphoneRedis, duration); } diff --git a/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java b/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java index a2e1e2675..5a4e0d99e 100644 --- a/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java +++ b/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java @@ -5,6 +5,7 @@ import com.gg.server.domain.megaphone.data.Megaphone; import com.gg.server.domain.megaphone.data.MegaphoneRepository; import com.gg.server.domain.megaphone.dto.MegaphoneDetailResponseDto; +import com.gg.server.domain.megaphone.dto.MegaphoneTodayListResponseDto; import com.gg.server.domain.megaphone.dto.MegaphoneUseRequestDto; import com.gg.server.domain.megaphone.exception.MegaphoneNotFoundException; import com.gg.server.domain.megaphone.exception.MegaphoneTimeException; @@ -29,6 +30,7 @@ import java.time.LocalDateTime; import java.time.LocalTime; import java.util.List; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -92,6 +94,10 @@ public MegaphoneDetailResponseDto getMegaphoneDetail(Long receiptId, UserDto use return new MegaphoneDetailResponseDto(megaphone); } + public List getMegaphoneTodayList() { + return megaphoneRedisRepository.getAllMegaphone().stream().map(MegaphoneTodayListResponseDto::new).collect(Collectors.toList()); + } + private void checkOwner(User loginUser, Receipt receipt) { if (!receipt.getOwnerIntraId().equals(loginUser.getIntraId())) throw new ReceiptNotOwnerException(); @@ -106,4 +112,9 @@ private void checkUseStatus(Receipt receipt) { if (!(receipt.getStatus().equals(ItemStatus.WAITING) || receipt.getStatus().equals(ItemStatus.USING))) throw new ItemStatusException(); } + + @Transactional + public void testMegaphone() { + megaphoneRedisRepository.addMegaphone(new MegaphoneRedis(12345L, "intraId", "content", LocalDateTime.now())); + } } From 7b08d0261723e387b3a95dd00dcab439538b76e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Mon, 21 Aug 2023 15:24:51 +0900 Subject: [PATCH 100/273] =?UTF-8?q?[TEST]=20GGBE4-15=20=ED=99=95=EC=84=B1?= =?UTF-8?q?=EA=B8=B0=20=EB=8B=B9=EC=9D=BC=20=EC=A1=B0=ED=9A=8C=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MegaphoneControllerTest.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java b/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java index 477227b15..37c540b91 100644 --- a/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java +++ b/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java @@ -54,7 +54,7 @@ class MegaphoneControllerTest { @Test @Transactional @DisplayName("[Post] /pingpong/megaphones") - void getAnnouncementList() throws Exception { + void useMegaphoneTest() throws Exception { String intraId = "intra"; String email = "email"; String imageUrl = "imageUrl"; @@ -112,7 +112,7 @@ void getMegaphoneDetailTest() throws Exception { SnsType.BOTH, RoleType.ADMIN); String accessToken = tokenProvider.createToken(newUser.getId()); Receipt receipt = receiptRepository.findById(1L).get(); - String url = "/pingpong/megaphones/receipt/"+receipt.getId(); + String url = "/pingpong/megaphones/receipt/" + receipt.getId(); String contentAsString = mockMvc.perform(get(url) .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) @@ -121,4 +121,15 @@ void getMegaphoneDetailTest() throws Exception { System.out.println(contentAsString); } + + @Test + @DisplayName("[GET] /pingpong/megaphones") + void getMegaphoneTodayListTest() throws Exception { + String accessToken = testDataUtils.getLoginAccessToken(); + String url = "/pingpong/megaphones"; + mockMvc.perform(get(url) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().is2xxSuccessful()) + .andReturn().getResponse().getContentAsString(); + } } \ No newline at end of file From 6c089711f3635e22242626df0987ae367db4a6a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Tue, 22 Aug 2023 11:18:49 +0900 Subject: [PATCH 101/273] =?UTF-8?q?[REFACTOR]=20GGBE4-17=20ItemStatus=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/domain/receipt/type/ItemStatus.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gg/server/domain/receipt/type/ItemStatus.java b/src/main/java/com/gg/server/domain/receipt/type/ItemStatus.java index a9ecc3c4b..de03b6551 100644 --- a/src/main/java/com/gg/server/domain/receipt/type/ItemStatus.java +++ b/src/main/java/com/gg/server/domain/receipt/type/ItemStatus.java @@ -6,12 +6,11 @@ @Getter @RequiredArgsConstructor public enum ItemStatus { - BEFORE("before", "사용 전"), - WAITING("waiting", "사용 대기"), - USING("using", "사용 중"), - USED("used", "사용 완료"), - DELETED("deleted", "삭제"); + BEFORE("사용 전"), + WAITING("사용 대기"), + USING("사용 중"), + USED("사용 완료"), + DELETED("삭제"); - private final String code; - private final String desc; + private final String description; } \ No newline at end of file From 94e2750ae88d750483756238d9b403af9db8c2e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Tue, 22 Aug 2023 11:19:17 +0900 Subject: [PATCH 102/273] =?UTF-8?q?[FEAT]=20GGBE4-17=20=ED=99=95=EC=84=B1?= =?UTF-8?q?=EA=B8=B0=20=EC=A0=84=EC=B2=B4=20=EC=A1=B0=ED=9A=8C=20api=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/MegaphoneAdminController.java | 31 +++++++++++++++++++ .../data/MegaphoneAdminRepository.java | 10 ++++++ .../dto/MegaphoneAdminResponseDto.java | 23 ++++++++++++++ .../dto/MegaphoneHistoryResponseDto.java | 18 +++++++++++ .../service/MegaphoneAdminService.java | 27 ++++++++++++++++ 5 files changed, 109 insertions(+) create mode 100644 src/main/java/com/gg/server/admin/megaphone/controller/MegaphoneAdminController.java create mode 100644 src/main/java/com/gg/server/admin/megaphone/data/MegaphoneAdminRepository.java create mode 100644 src/main/java/com/gg/server/admin/megaphone/dto/MegaphoneAdminResponseDto.java create mode 100644 src/main/java/com/gg/server/admin/megaphone/dto/MegaphoneHistoryResponseDto.java create mode 100644 src/main/java/com/gg/server/admin/megaphone/service/MegaphoneAdminService.java diff --git a/src/main/java/com/gg/server/admin/megaphone/controller/MegaphoneAdminController.java b/src/main/java/com/gg/server/admin/megaphone/controller/MegaphoneAdminController.java new file mode 100644 index 000000000..6b0217afc --- /dev/null +++ b/src/main/java/com/gg/server/admin/megaphone/controller/MegaphoneAdminController.java @@ -0,0 +1,31 @@ +package com.gg.server.admin.megaphone.controller; + +import com.gg.server.admin.megaphone.dto.MegaphoneHistoryResponseDto; +import com.gg.server.admin.megaphone.service.MegaphoneAdminService; +import com.gg.server.global.dto.PageRequestDto; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/pingpong/admin/megaphones") +public class MegaphoneAdminController { + private final MegaphoneAdminService megaphoneAdminService; + + @GetMapping("/history") + public ResponseEntity getMegaphoneHistory(@ModelAttribute @Valid PageRequestDto pageRequestDto, + @RequestParam(required = false) String intraId) { + Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, pageRequestDto.getSize(), + Sort.by("usedAt").descending()); + if (intraId == null) + return ResponseEntity.ok(megaphoneAdminService.getMegaphoneHistory(pageable)); + return ResponseEntity.ok(megaphoneAdminService.getMegaphoneHistoryByIntraId(intraId, pageable)); + + } +} diff --git a/src/main/java/com/gg/server/admin/megaphone/data/MegaphoneAdminRepository.java b/src/main/java/com/gg/server/admin/megaphone/data/MegaphoneAdminRepository.java new file mode 100644 index 000000000..18e964254 --- /dev/null +++ b/src/main/java/com/gg/server/admin/megaphone/data/MegaphoneAdminRepository.java @@ -0,0 +1,10 @@ +package com.gg.server.admin.megaphone.data; + +import com.gg.server.domain.megaphone.data.Megaphone; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MegaphoneAdminRepository extends JpaRepository { + Page findMegaphonesByUserIntraId(String intraId, Pageable pageable); +} diff --git a/src/main/java/com/gg/server/admin/megaphone/dto/MegaphoneAdminResponseDto.java b/src/main/java/com/gg/server/admin/megaphone/dto/MegaphoneAdminResponseDto.java new file mode 100644 index 000000000..9984a0351 --- /dev/null +++ b/src/main/java/com/gg/server/admin/megaphone/dto/MegaphoneAdminResponseDto.java @@ -0,0 +1,23 @@ +package com.gg.server.admin.megaphone.dto; + +import com.gg.server.domain.megaphone.data.Megaphone; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class MegaphoneAdminResponseDto { + private Long megaphoneId; + private String content; + private String usedAt; + private String status; + private String intraId; + + public MegaphoneAdminResponseDto(Megaphone megaphone){ + this.megaphoneId = megaphone.getId(); + this.content = megaphone.getContent(); + this.usedAt = megaphone.getUsedAt().toString(); + this.status = megaphone.getReceipt().getStatus().getDescription(); + this.intraId = megaphone.getUser().getIntraId(); + } +} diff --git a/src/main/java/com/gg/server/admin/megaphone/dto/MegaphoneHistoryResponseDto.java b/src/main/java/com/gg/server/admin/megaphone/dto/MegaphoneHistoryResponseDto.java new file mode 100644 index 000000000..9337d047e --- /dev/null +++ b/src/main/java/com/gg/server/admin/megaphone/dto/MegaphoneHistoryResponseDto.java @@ -0,0 +1,18 @@ +package com.gg.server.admin.megaphone.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@NoArgsConstructor +public class MegaphoneHistoryResponseDto { + private List megaphoneList; + private int totalPage; + + public MegaphoneHistoryResponseDto(List newDtos, int totalPage){ + this.megaphoneList = newDtos; + this.totalPage= totalPage; + } +} diff --git a/src/main/java/com/gg/server/admin/megaphone/service/MegaphoneAdminService.java b/src/main/java/com/gg/server/admin/megaphone/service/MegaphoneAdminService.java new file mode 100644 index 000000000..b91076db5 --- /dev/null +++ b/src/main/java/com/gg/server/admin/megaphone/service/MegaphoneAdminService.java @@ -0,0 +1,27 @@ +package com.gg.server.admin.megaphone.service; + +import com.gg.server.admin.megaphone.data.MegaphoneAdminRepository; + +import com.gg.server.admin.megaphone.dto.MegaphoneAdminResponseDto; +import com.gg.server.admin.megaphone.dto.MegaphoneHistoryResponseDto; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; + + +@Service +@RequiredArgsConstructor +public class MegaphoneAdminService { + private final MegaphoneAdminRepository megaphoneAdminRepository; + + public MegaphoneHistoryResponseDto getMegaphoneHistory(Pageable pageable) { + Page megaphoneHistory = megaphoneAdminRepository.findAll(pageable).map(MegaphoneAdminResponseDto::new); + return new MegaphoneHistoryResponseDto(megaphoneHistory.getContent(), megaphoneHistory.getTotalPages()); + } + + public MegaphoneHistoryResponseDto getMegaphoneHistoryByIntraId(String intraId, Pageable pageable) { + Page megaphoneHistory = megaphoneAdminRepository.findMegaphonesByUserIntraId(intraId, pageable).map(MegaphoneAdminResponseDto::new); + return new MegaphoneHistoryResponseDto(megaphoneHistory.getContent(), megaphoneHistory.getTotalPages()); + } +} From 359618ee5d1e22a6f5fe5541841c439fe26de5d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Tue, 22 Aug 2023 11:19:45 +0900 Subject: [PATCH 103/273] =?UTF-8?q?[TEST]=20GGBE4-17=20=ED=99=95=EC=84=B1?= =?UTF-8?q?=EA=B8=B0=20=EC=A0=84=EC=B2=B4=20=EC=A1=B0=ED=9A=8C=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MegaphoneAdminControllerTest.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/test/java/com/gg/server/admin/megaphone/controller/MegaphoneAdminControllerTest.java diff --git a/src/test/java/com/gg/server/admin/megaphone/controller/MegaphoneAdminControllerTest.java b/src/test/java/com/gg/server/admin/megaphone/controller/MegaphoneAdminControllerTest.java new file mode 100644 index 000000000..27b671f0a --- /dev/null +++ b/src/test/java/com/gg/server/admin/megaphone/controller/MegaphoneAdminControllerTest.java @@ -0,0 +1,44 @@ +package com.gg.server.admin.megaphone.controller; + +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import lombok.RequiredArgsConstructor; +import org.apache.http.HttpHeaders; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.web.servlet.MockMvc; + +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RequiredArgsConstructor +@SpringBootTest +@AutoConfigureMockMvc +class MegaphoneAdminControllerTest { + @Autowired + TestDataUtils testDataUtils; + + @Autowired + private MockMvc mockMvc; + + @Autowired + AuthTokenProvider tokenProvider; + + @Test + @DisplayName("[GET] /pingpong/admin/megaphones/history?page={page}&size={pageSize}&intraId={intraId}") + void getMegaphoneListTest() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + tokenProvider.getUserIdFromAccessToken(accessToken); + String url = "/pingpong/admin/megaphones/history?page=1&size=30"; + + String contentAsString = mockMvc.perform(get(url) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + + System.out.println(contentAsString); + } +} \ No newline at end of file From 6b36b6393c18cc7d948f1eb527c73e757db7402d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Tue, 22 Aug 2023 11:26:21 +0900 Subject: [PATCH 104/273] =?UTF-8?q?[REFACOTOR]=20GGBE4-17=20=ED=99=95?= =?UTF-8?q?=EC=84=B1=EA=B8=B0=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=9A=A9=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/megaphone/controller/MegaphoneController.java | 6 ------ .../server/domain/megaphone/service/MegaphoneService.java | 5 ----- 2 files changed, 11 deletions(-) diff --git a/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java b/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java index b0144bc9a..e088b9946 100644 --- a/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java +++ b/src/main/java/com/gg/server/domain/megaphone/controller/MegaphoneController.java @@ -44,10 +44,4 @@ public ResponseEntity getMegaphoneDetail(@PathVariab public ResponseEntity> getMegaphoneTodayList(@Parameter(hidden = true) @Login UserDto user) { return ResponseEntity.ok(megaphoneService.getMegaphoneTodayList()); } - - @PostMapping("/test") - public ResponseEntity testMegaphone(@Parameter(hidden = true) @Login UserDto user) { - megaphoneService.testMegaphone(); - return ResponseEntity.status(HttpStatus.CREATED).build(); - } } diff --git a/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java b/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java index 5a4e0d99e..f7790558f 100644 --- a/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java +++ b/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java @@ -112,9 +112,4 @@ private void checkUseStatus(Receipt receipt) { if (!(receipt.getStatus().equals(ItemStatus.WAITING) || receipt.getStatus().equals(ItemStatus.USING))) throw new ItemStatusException(); } - - @Transactional - public void testMegaphone() { - megaphoneRedisRepository.addMegaphone(new MegaphoneRedis(12345L, "intraId", "content", LocalDateTime.now())); - } } From 2252fd283efae515f628c97ae903bc7c7a337d41 Mon Sep 17 00:00:00 2001 From: sion99 Date: Tue, 22 Aug 2023 11:46:15 +0900 Subject: [PATCH 105/273] =?UTF-8?q?[FEAT]=20getUserNormalDetail=EC=97=90?= =?UTF-8?q?=20tier=EC=A0=95=EB=B3=B4,=20level=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gg/server/domain/tier/data/Tier.java | 2 ++ .../domain/user/dto/UserNormalDetailResponseDto.java | 3 +++ .../com/gg/server/domain/user/service/UserService.java | 8 +++++++- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/tier/data/Tier.java b/src/main/java/com/gg/server/domain/tier/data/Tier.java index 79c344b28..4fd18bdea 100644 --- a/src/main/java/com/gg/server/domain/tier/data/Tier.java +++ b/src/main/java/com/gg/server/domain/tier/data/Tier.java @@ -1,11 +1,13 @@ package com.gg.server.domain.tier.data; import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.NoArgsConstructor; import javax.persistence.*; @Entity +@Getter @NoArgsConstructor @AllArgsConstructor public class Tier { diff --git a/src/main/java/com/gg/server/domain/user/dto/UserNormalDetailResponseDto.java b/src/main/java/com/gg/server/domain/user/dto/UserNormalDetailResponseDto.java index c7d078596..7dad6f36c 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserNormalDetailResponseDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserNormalDetailResponseDto.java @@ -12,4 +12,7 @@ public class UserNormalDetailResponseDto { private String userImageUri; private Boolean isAdmin; private Boolean isAttended; + private String tierName; + private String tierImageUri; + private Integer level; } diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 9ab096b24..f2c07d547 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -27,6 +27,7 @@ import com.gg.server.domain.receipt.type.ItemStatus; import com.gg.server.domain.season.data.Season; import com.gg.server.domain.season.service.SeasonFindService; +import com.gg.server.domain.tier.data.Tier; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.*; @@ -34,6 +35,7 @@ import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.exception.UserTextColorException; import com.gg.server.domain.user.type.*; +import com.gg.server.global.utils.ExpLevelCalculator; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -263,7 +265,11 @@ public UserNormalDetailResponseDto getUserNormalDetail(UserDto user) { LocalDateTime startOfDay = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0); LocalDateTime endOfDay = LocalDateTime.now().withHour(23).withMinute(59).withSecond(59); Boolean isAttended = coinHistoryRepository.existsCoinHistoryByUserAndHistoryAndCreatedAtToday(loginUser, ATTENDANCE, startOfDay, endOfDay); - return new UserNormalDetailResponseDto(user.getIntraId(), user.getImageUri(), isAdmin, isAttended); + Tier tier = rankFindService.findByUserIdAndSeasonId(user.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); + String tierName = tier.getName(); + String tierImageUri = tier.getImageUri(); + Integer level = ExpLevelCalculator.getLevel(user.getTotalExp()); + return new UserNormalDetailResponseDto(user.getIntraId(), user.getImageUri(), isAdmin, isAttended, tierName, tierImageUri, level); } @Transactional() From c9426a7259f35a06d5e5c016fda5a769132a4012 Mon Sep 17 00:00:00 2001 From: sion99 Date: Tue, 22 Aug 2023 11:59:24 +0900 Subject: [PATCH 106/273] =?UTF-8?q?[FEAT]=20getUserDetail=EC=97=90=20tier?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/domain/user/dto/UserDetailResponseDto.java | 9 ++++++++- .../com/gg/server/domain/user/service/UserService.java | 3 ++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java b/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java index 254cf93fb..9a6149639 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java @@ -1,5 +1,6 @@ package com.gg.server.domain.user.dto; +import com.gg.server.domain.tier.data.Tier; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.type.SnsType; import com.gg.server.global.utils.ExpLevelCalculator; @@ -17,13 +18,19 @@ public class UserDetailResponseDto { private Integer maxExp; private Double expRate; private SnsType snsNotiOpt; + private String tierName; + private String tierImageUri; - public UserDetailResponseDto(User user, String statusMessage) { + + + public UserDetailResponseDto(User user, String statusMessage, Tier tier) { this.intraId = user.getIntraId(); this.userImageUri = user.getImageUri(); this.racketType = user.getRacketType().getCode(); this.statusMessage = statusMessage; this.snsNotiOpt = user.getSnsNotiOpt(); + this.tierName = tier.getName(); + this.tierImageUri = tier.getImageUri(); calculateExpAndLevel(user); } diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index f2c07d547..c88821398 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -124,7 +124,8 @@ else if (game.getStatus() == StatusType.END) { public UserDetailResponseDto getUserDetail(String targetUserIntraId) { User targetUser = userFindService.findByIntraId(targetUserIntraId); String statusMessage = userFindService.getUserStatusMessage(targetUser); - return new UserDetailResponseDto(targetUser, statusMessage); + Tier tier = rankFindService.findByUserIdAndSeasonId(targetUser.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); + return new UserDetailResponseDto(targetUser, statusMessage, tier); } @Transactional From a052133168402d66b643a104ee9fb9e686056f85 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Wed, 23 Aug 2023 02:14:53 +0900 Subject: [PATCH 107/273] =?UTF-8?q?[feat]=20GGBE4-44=20=EB=9E=AD=ED=81=AC?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EC=BD=94=EC=9D=B8=20=EC=A6=9D=EA=B0=80?= =?UTF-8?q?=EB=9F=89=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coin/service/CoinHistoryService.java | 9 +++-- .../coin/service/UserCoinChangeService.java | 37 +++++++++++++++++++ .../game/dto/ExpChangeResultResDto.java | 10 ----- .../game/dto/PPPChangeResultResDto.java | 5 ++- .../domain/game/service/GameService.java | 5 ++- 5 files changed, 49 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java index be065fcda..a0c75263b 100644 --- a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java +++ b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java @@ -6,6 +6,7 @@ import com.gg.server.domain.coin.type.HistoryType; import com.gg.server.domain.user.data.User; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -28,15 +29,17 @@ public void addNormalCoin(User user){ } @Transactional - public void addRankWinCoin(User user){ + public int addRankWinCoin(User user){ int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getRankWin(); - addCoinHistory(new CoinHistory(user, HistoryType.RANKWIN.getHistory(), amount)); + coinHistoryRepository.save(new CoinHistory(user, HistoryType.RANKWIN.getHistory(), amount)); + return amount; } @Transactional - public void addRankLoseCoin(User user){ + public int addRankLoseCoin(User user){ int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getRankLose(); addCoinHistory(new CoinHistory(user, HistoryType.RANKLOSE.getHistory(), amount)); + return amount; } private void addCoinHistory(CoinHistory coinHistory){ diff --git a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java index f58b2e168..5fe174ab3 100644 --- a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java +++ b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java @@ -2,19 +2,27 @@ import com.gg.server.domain.coin.data.CoinPolicyRepository; import com.gg.server.domain.coin.dto.UserGameCoinResultDto; +import com.gg.server.domain.game.data.Game; +import com.gg.server.domain.game.service.GameFindService; +import com.gg.server.domain.team.data.Team; +import com.gg.server.domain.team.data.TeamUser; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.exception.UserNotFoundException; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + @Service @RequiredArgsConstructor public class UserCoinChangeService { private final CoinPolicyRepository coinPolicyRepository; private final CoinHistoryService coinHistoryService; private final UserRepository userRepository; + private final GameFindService gameFindService; @Transactional public UserGameCoinResultDto addNormalGameCoin(Long userId) { @@ -25,4 +33,33 @@ public UserGameCoinResultDto addNormalGameCoin(Long userId) { coinHistoryService.addNormalCoin(user); return new UserGameCoinResultDto(user.getGgCoin(), coinIncrement); } + + @Transactional + public UserGameCoinResultDto addRankGameCoin(Long gameId, Long userId) { + User user = userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException()); + int coinIncrement; + + if (userIsWinner(gameId, user)) + coinIncrement = coinHistoryService.addRankWinCoin(user); + else + coinIncrement = coinHistoryService.addRankLoseCoin(user); + + user.addGgCoin(coinIncrement); + return new UserGameCoinResultDto(user.getGgCoin(), coinIncrement); + } + + private boolean userIsWinner(Long gameId, User user) { + List teams = gameFindService.findByGameId(gameId).getTeams(); + + for(Team team: teams) { + for (TeamUser teamUser : team.getTeamUsers()){ + if (teamUser.getUser().getId() == user.getId() && team.getWin() == true) + return true; + else if (teamUser.getUser().getId() == user.getId() && team.getWin() == false) + return false; + } + } + + return false; + } } diff --git a/src/main/java/com/gg/server/domain/game/dto/ExpChangeResultResDto.java b/src/main/java/com/gg/server/domain/game/dto/ExpChangeResultResDto.java index 715933dd7..d8303f3fb 100644 --- a/src/main/java/com/gg/server/domain/game/dto/ExpChangeResultResDto.java +++ b/src/main/java/com/gg/server/domain/game/dto/ExpChangeResultResDto.java @@ -30,16 +30,6 @@ public ExpChangeResultResDto(Integer beforeExp, Integer currentExp, UserGameCoin this.coinIncrement = userGameCoinResultDto.getCoinIncrement(); } - //랭크 게임 수정 후 사라질 생성자 - public ExpChangeResultResDto(Integer beforeExp, Integer currentExp) { - this.beforeExp = ExpLevelCalculator.getCurrentLevelMyExp(beforeExp); - this.beforeLevel = ExpLevelCalculator.getLevel(beforeExp); - this.beforeMaxExp = ExpLevelCalculator.getLevelMaxExp(beforeLevel); - this.increasedExp = currentExp - beforeExp; - this.increasedLevel = ExpLevelCalculator.getLevel(currentExp) - this.beforeLevel; - this.afterMaxExp = ExpLevelCalculator.getLevelMaxExp(this.beforeLevel + this.increasedLevel); - } - @Override public boolean equals(Object obj) { if (obj == this) { diff --git a/src/main/java/com/gg/server/domain/game/dto/PPPChangeResultResDto.java b/src/main/java/com/gg/server/domain/game/dto/PPPChangeResultResDto.java index 92c0ababe..0faed8f19 100644 --- a/src/main/java/com/gg/server/domain/game/dto/PPPChangeResultResDto.java +++ b/src/main/java/com/gg/server/domain/game/dto/PPPChangeResultResDto.java @@ -1,5 +1,6 @@ package com.gg.server.domain.game.dto; +import com.gg.server.domain.coin.dto.UserGameCoinResultDto; import lombok.Getter; import lombok.NoArgsConstructor; @@ -10,8 +11,8 @@ public class PPPChangeResultResDto extends ExpChangeResultResDto { private Integer changedPpp; private Integer beforePpp; - public PPPChangeResultResDto(Integer beforeExp, Integer currentExp, Integer beforePpp, Integer afterPpp) { - super(beforeExp, currentExp); + public PPPChangeResultResDto(Integer beforeExp, Integer currentExp, Integer beforePpp, Integer afterPpp, UserGameCoinResultDto userGameCoinResultDto) { + super(beforeExp, currentExp, userGameCoinResultDto); this.changedPpp = afterPpp - beforePpp; this.beforePpp = beforePpp; } diff --git a/src/main/java/com/gg/server/domain/game/service/GameService.java b/src/main/java/com/gg/server/domain/game/service/GameService.java index 773290f44..295341696 100644 --- a/src/main/java/com/gg/server/domain/game/service/GameService.java +++ b/src/main/java/com/gg/server/domain/game/service/GameService.java @@ -123,15 +123,16 @@ public ExpChangeResultResDto expChangeResult(Long gameId, Long userId) { } } - @Transactional(readOnly = true) + @Transactional public PPPChangeResultResDto pppChangeResult(Long gameId, Long userId) throws PChangeNotExistException { Season season = gameFindService.findByGameId(gameId).getSeason(); List pppHistory = pChangeService.findPPPChangeHistory(gameId, userId, season.getId()); List expHistory = pChangeService.findExpChangeHistory(gameId, userId); + UserGameCoinResultDto userGameCoinResultDto = userCoinChangeService.addRankGameCoin(gameId, userId); return new PPPChangeResultResDto(expHistory.size() <= 1 ? 0 : expHistory.get(1).getExp(), pppHistory.get(0).getExp(), pppHistory.size() <= 1 ? season.getStartPpp() : pppHistory.get(1).getPppResult(), - pppHistory.get(0).getPppResult()); + pppHistory.get(0).getPppResult(), userGameCoinResultDto); } public void expUpdates(Game game, List teamUsers) { From 533f56435c040aa46d3ff9e4a3248901c8703f4d Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Wed, 23 Aug 2023 02:15:22 +0900 Subject: [PATCH 108/273] =?UTF-8?q?[test]=20GGBE4-44=20=EB=9E=AD=ED=81=AC?= =?UTF-8?q?=EA=B2=8C=EC=9E=84=20=EC=BD=94=EC=9D=B8=20=EC=A6=9D=EA=B0=80?= =?UTF-8?q?=EB=9F=89=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BD=94=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/UserCoinChangeServiceTest.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java b/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java index b4899cc27..53114053d 100644 --- a/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java +++ b/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java @@ -57,4 +57,28 @@ void addNormalGameService() { assertThat(coinPolicyRepository.findTopByOrderByCreatedAtDesc().getNormal()).isEqualTo(userGameCoinResultDto.getCoinIncrement()); System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); } + + @Test + @DisplayName("랭크 게임 승리 재화 증가 서비스 테스트") + void addRankWinGameService() { + User user = userRepository.getUserByIntraId("cheolee"); + + UserGameCoinResultDto userGameCoinResultDto = userCoinChangeService.addRankGameCoin(3606L, user.getId());//본인의 게임Id와 id 값 + + assertThat(user.getGgCoin()).isEqualTo(userGameCoinResultDto.getAfterCoin()); + assertThat(coinPolicyRepository.findTopByOrderByCreatedAtDesc().getRankWin()).isEqualTo(userGameCoinResultDto.getCoinIncrement()); + System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); + } + + @Test + @DisplayName("랭크 게임 패배 재화 증가 서비스 테스트") + void addRankLoseGameService() { + User user = userRepository.getUserByIntraId("cheolee"); + + UserGameCoinResultDto userGameCoinResultDto = userCoinChangeService.addRankGameCoin(3689L, user.getId()); + + assertThat(user.getGgCoin()).isEqualTo(userGameCoinResultDto.getAfterCoin()); + assertThat(coinPolicyRepository.findTopByOrderByCreatedAtDesc().getRankLose()).isEqualTo(userGameCoinResultDto.getCoinIncrement()); + System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); + } } \ No newline at end of file From 3a9bee2503948240e928d2e2b3b416bed289a057 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Wed, 23 Aug 2023 02:22:50 +0900 Subject: [PATCH 109/273] =?UTF-8?q?[style]=20GGBE4-44=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/coin/service/CoinHistoryService.java | 1 - .../java/com/gg/server/domain/game/service/GameService.java | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java index a0c75263b..73c835af5 100644 --- a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java +++ b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java @@ -6,7 +6,6 @@ import com.gg.server.domain.coin.type.HistoryType; import com.gg.server.domain.user.data.User; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/gg/server/domain/game/service/GameService.java b/src/main/java/com/gg/server/domain/game/service/GameService.java index 295341696..8b13fe31d 100644 --- a/src/main/java/com/gg/server/domain/game/service/GameService.java +++ b/src/main/java/com/gg/server/domain/game/service/GameService.java @@ -22,7 +22,6 @@ import com.gg.server.global.exception.custom.InvalidParameterException; import com.gg.server.global.utils.ExpLevelCalculator; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Caching; import org.springframework.stereotype.Service; @@ -33,7 +32,6 @@ @Service @RequiredArgsConstructor -@Slf4j public class GameService { private final GameRepository gameRepository; private final TeamUserRepository teamUserRepository; From 5fa079442e779c186415c381cac7794c1d095467 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Wed, 23 Aug 2023 02:26:57 +0900 Subject: [PATCH 110/273] =?UTF-8?q?[style]=20GGBE4-44=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B02?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/coin/service/CoinHistoryService.java | 2 +- .../gg/server/domain/coin/service/UserCoinChangeService.java | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java index 73c835af5..3eb3179e2 100644 --- a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java +++ b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java @@ -30,7 +30,7 @@ public void addNormalCoin(User user){ @Transactional public int addRankWinCoin(User user){ int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getRankWin(); - coinHistoryRepository.save(new CoinHistory(user, HistoryType.RANKWIN.getHistory(), amount)); + addCoinHistory(new CoinHistory(user, HistoryType.RANKWIN.getHistory(), amount)); return amount; } diff --git a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java index 5fe174ab3..a2ba56835 100644 --- a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java +++ b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java @@ -2,7 +2,6 @@ import com.gg.server.domain.coin.data.CoinPolicyRepository; import com.gg.server.domain.coin.dto.UserGameCoinResultDto; -import com.gg.server.domain.game.data.Game; import com.gg.server.domain.game.service.GameFindService; import com.gg.server.domain.team.data.Team; import com.gg.server.domain.team.data.TeamUser; @@ -10,7 +9,6 @@ import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.exception.UserNotFoundException; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; From 2464aebecbc9b88f6a5269c43cdb897d5d6b99d5 Mon Sep 17 00:00:00 2001 From: sion99 Date: Wed, 23 Aug 2023 10:45:51 +0900 Subject: [PATCH 111/273] =?UTF-8?q?[REFACTOR]=20=ED=8B=B0=EC=96=B4?= =?UTF-8?q?=EA=B0=80=20=EC=A1=B4=EC=9E=AC=ED=95=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EC=9D=84=EB=95=8C=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/user/service/UserService.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index c88821398..b04f432af 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -266,10 +266,16 @@ public UserNormalDetailResponseDto getUserNormalDetail(UserDto user) { LocalDateTime startOfDay = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0); LocalDateTime endOfDay = LocalDateTime.now().withHour(23).withMinute(59).withSecond(59); Boolean isAttended = coinHistoryRepository.existsCoinHistoryByUserAndHistoryAndCreatedAtToday(loginUser, ATTENDANCE, startOfDay, endOfDay); + Integer level = ExpLevelCalculator.getLevel(user.getTotalExp()); Tier tier = rankFindService.findByUserIdAndSeasonId(user.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); + /* 티어가 존재하지 않는 일반 유저일때 : None, None 처리해서 보내기*/ + if (tier == null) { + String tierName = "NONE"; + String tierImageUri = "NONE"; + return new UserNormalDetailResponseDto(user.getIntraId(), user.getImageUri(), isAdmin, isAttended, tierName, tierImageUri, level); + } String tierName = tier.getName(); String tierImageUri = tier.getImageUri(); - Integer level = ExpLevelCalculator.getLevel(user.getTotalExp()); return new UserNormalDetailResponseDto(user.getIntraId(), user.getImageUri(), isAdmin, isAttended, tierName, tierImageUri, level); } From deaaaae3353dd17022d976a12b6f748e6b94aacf Mon Sep 17 00:00:00 2001 From: sion99 Date: Wed, 23 Aug 2023 11:45:13 +0900 Subject: [PATCH 112/273] =?UTF-8?q?[FEAT]=20Tier=20Repository=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gg/server/domain/rank/data/Rank.java | 3 ++- .../java/com/gg/server/domain/tier/data/TierRepository.java | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/gg/server/domain/tier/data/TierRepository.java diff --git a/src/main/java/com/gg/server/domain/rank/data/Rank.java b/src/main/java/com/gg/server/domain/rank/data/Rank.java index aaf069519..6ae27a3a2 100644 --- a/src/main/java/com/gg/server/domain/rank/data/Rank.java +++ b/src/main/java/com/gg/server/domain/rank/data/Rank.java @@ -67,13 +67,14 @@ public static Rank from (User user, Season season, Integer ppp) { @Builder public Rank(User user, Season season, Integer ppp, Integer wins, - Integer losses, String statusMessage) { + Integer losses, String statusMessage, Tier tier) { this.user = user; this.season = season; this.ppp = ppp; this.wins = wins; this.losses = losses; this.statusMessage = statusMessage; + this.tier = tier; } public void setStatusMessage(String statusMessage) { diff --git a/src/main/java/com/gg/server/domain/tier/data/TierRepository.java b/src/main/java/com/gg/server/domain/tier/data/TierRepository.java new file mode 100644 index 000000000..0fb50bca1 --- /dev/null +++ b/src/main/java/com/gg/server/domain/tier/data/TierRepository.java @@ -0,0 +1,6 @@ +package com.gg.server.domain.tier.data; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TierRepository extends JpaRepository { +} From e6e3d1a1cc9c6520b1aa31e3ac38bed5f32bc333 Mon Sep 17 00:00:00 2001 From: sion99 Date: Wed, 23 Aug 2023 11:46:37 +0900 Subject: [PATCH 113/273] =?UTF-8?q?[TEST]=20Tier=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/controller/UserControllerTest.java | 14 ++++++++++-- .../com/gg/server/utils/TestDataUtils.java | 22 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java index a89c50b90..9befeb20e 100644 --- a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java +++ b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java @@ -21,6 +21,8 @@ import com.gg.server.domain.receipt.type.ItemStatus; import com.gg.server.domain.season.data.Season; import com.gg.server.domain.season.data.SeasonRepository; +import com.gg.server.domain.tier.data.Tier; +import com.gg.server.domain.tier.data.TierRepository; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.controller.dto.GameInfoDto; @@ -76,6 +78,9 @@ class UserControllerTest { @Autowired RankRedisRepository redisRepository; + @Autowired + TierRepository tierRepository; + @Autowired RankRepository rankRepository; @@ -157,7 +162,7 @@ public void userLiveTest() throws Exception { } @Test - @DisplayName("/") + @DisplayName("GET /pingpong/users") public void userNormalDetail() throws Exception { //given String url = "/pingpong/users"; @@ -166,7 +171,11 @@ public void userNormalDetail() throws Exception { String imageUrl = "imageUrl"; User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, SnsType.BOTH, RoleType.ADMIN); + Season season = testDataUtils.createSeason(); String accessToken = tokenProvider.createToken(newUser.getId()); + Tier tier = tierRepository.getById(1L); + testDataUtils.createUserRank(newUser, "statusMessage", season, tier); + //when String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) @@ -219,7 +228,8 @@ public void getUserDetail() throws Exception { User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, SnsType.BOTH, RoleType.ADMIN); String accessToken = tokenProvider.createToken(newUser.getId()); - testDataUtils.createUserRank(newUser, statusMessage, season); + Tier tier = tierRepository.getById(1L); + testDataUtils.createUserRank(newUser, statusMessage, season, tier); String url = "/pingpong/users/" + newUser.getIntraId(); //when diff --git a/src/test/java/com/gg/server/utils/TestDataUtils.java b/src/test/java/com/gg/server/utils/TestDataUtils.java index 11f043fd4..f95c2c5d1 100644 --- a/src/test/java/com/gg/server/utils/TestDataUtils.java +++ b/src/test/java/com/gg/server/utils/TestDataUtils.java @@ -18,6 +18,8 @@ import com.gg.server.domain.team.data.TeamRepository; import com.gg.server.domain.team.data.TeamUser; import com.gg.server.domain.team.data.TeamUserRepository; +import com.gg.server.domain.tier.data.Tier; +import com.gg.server.domain.tier.data.TierRepository; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.controller.dto.GameInfoDto; @@ -46,6 +48,7 @@ public class TestDataUtils { private final RankRedisRepository redisRepository; private final PChangeRepository pChangeRepository; private final RankRepository rankRepository; + private final TierRepository tierRepository; public String getLoginAccessToken() { User user = User.builder() @@ -199,6 +202,25 @@ public void createUserRank(User newUser, String statusMessage, Season season) { rankRepository.save(userRank); } + public void createUserRank(User newUser, String statusMessage, Season season, Tier tier) { + if (rankRepository.findByUserIdAndSeasonId(newUser.getId(), season.getId()).isPresent()) + return ; + String zSetKey = RedisKeyManager.getZSetKey(season.getId()); + String hashKey = RedisKeyManager.getHashKey(season.getId()); + redisRepository.addRankData(hashKey, newUser.getId(), + new RankRedis(newUser.getId(), "aa", season.getStartPpp(), 0, 0, statusMessage)); + Rank userRank = Rank.builder() + .user(newUser) + .season(season) + .ppp(season.getStartPpp()) + .wins(0) + .losses(0) + .statusMessage(statusMessage) + .tier(tier) + .build(); + rankRepository.save(userRank); + } + public void createUserRank(User newUser, String statusMessage, Season season, int ppp) { String zSetKey = RedisKeyManager.getZSetKey(season.getId()); String hashKey = RedisKeyManager.getHashKey(season.getId()); From 0dabe200c0cdae3829e389d6b3a489025dc39a3e Mon Sep 17 00:00:00 2001 From: sion99 Date: Wed, 23 Aug 2023 11:52:23 +0900 Subject: [PATCH 114/273] =?UTF-8?q?[STYLE]=20Receipt=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=20=EC=97=94=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/admin/receipt/controller/ReceiptAdminController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/admin/receipt/controller/ReceiptAdminController.java b/src/main/java/com/gg/server/admin/receipt/controller/ReceiptAdminController.java index a63686023..5f67a94e0 100644 --- a/src/main/java/com/gg/server/admin/receipt/controller/ReceiptAdminController.java +++ b/src/main/java/com/gg/server/admin/receipt/controller/ReceiptAdminController.java @@ -20,7 +20,7 @@ public class ReceiptAdminController { private final ReceiptAdminService receiptAdminService; - @GetMapping("/list") + @GetMapping public ReceiptListResponseDto getReceiptList(@ModelAttribute @Valid ReceiptAdminPageRequestDto req) { if (req.getIntraId() == null) { From d2f611eb58801fabc2a13895abb47c472ab50c49 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Wed, 23 Aug 2023 22:56:42 +0900 Subject: [PATCH 115/273] =?UTF-8?q?[fix]=20GGBE4-53=20=EB=AA=85=EC=84=B8?= =?UTF-8?q?=EC=84=9C=EB=9E=91=20=EB=8B=A4=EB=A5=B8=20=EB=B6=80=EB=B6=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/domain/user/controller/UserController.java | 2 +- .../domain/user/dto/UserCoinHistoryListResponseDto.java | 2 +- .../server/domain/user/controller/UserControllerTest.java | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index 071fbcb1f..9f88919ce 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -146,7 +146,7 @@ public ResponseEntity updateBackground(@RequestBody @Valid UserBackgroundDto use return new ResponseEntity(HttpStatus.NO_CONTENT); } - @GetMapping("/coins") + @GetMapping("/coinhistory") public ResponseEntity getUserCoinHistory(@ModelAttribute @Valid PageRequestDto coReq, @Parameter(hidden = true) @Login UserDto user) { Pageable pageable = PageRequest.of(coReq.getPage() - 1, coReq.getSize(), Sort.by("createdAt").descending()); diff --git a/src/main/java/com/gg/server/domain/user/dto/UserCoinHistoryListResponseDto.java b/src/main/java/com/gg/server/domain/user/dto/UserCoinHistoryListResponseDto.java index b00f3c702..0c80b4a71 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserCoinHistoryListResponseDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserCoinHistoryListResponseDto.java @@ -12,6 +12,6 @@ @NoArgsConstructor @Getter public class UserCoinHistoryListResponseDto { - private List coinPolicyList; + private List useCoinList; private int totalPage; } diff --git a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java index 9befeb20e..626347359 100644 --- a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java +++ b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java @@ -486,7 +486,7 @@ public void updateBackgroundTest() throws Exception { } @Test - @DisplayName("[get]/pingpong/users/coins") + @DisplayName("[get]/pingpong/users/coinhistory") public void getUserCoinHistory() throws Exception { String accessToken = testDataUtils.getAdminLoginAccessToken(); Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); @@ -495,7 +495,7 @@ public void getUserCoinHistory() throws Exception { coinHistoryService.addNormalCoin(user); coinHistoryService.addRankWinCoin(user); coinHistoryService.addNormalCoin(user); - String url = "/pingpong/users/coins?page=1&size=5"; + String url = "/pingpong/users/coinhistory?page=1&size=5"; String contentAsString = mockMvc.perform(get(url) .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) @@ -505,7 +505,7 @@ public void getUserCoinHistory() throws Exception { UserCoinHistoryListResponseDto result = objectMapper.readValue(contentAsString, UserCoinHistoryListResponseDto.class); System.out.println(result.getTotalPage()); - for(CoinHistoryResponseDto temp : result.getCoinPolicyList()){ + for(CoinHistoryResponseDto temp : result.getUseCoinList()){ System.out.println(temp.getHistory() + " " + temp.getAmount() + " " + temp.getCreatedAt()); } } From c20ee9750ae8017f4da34d22f21184e70faa84c3 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Thu, 24 Aug 2023 01:24:34 +0900 Subject: [PATCH 116/273] =?UTF-8?q?[REFACTOR]=20GGBE4-54=20=EC=B6=9C?= =?UTF-8?q?=EC=84=9D=20=EC=BD=94=EC=9D=B8=20=EC=A6=9D=EA=B0=80=20=EC=BD=94?= =?UTF-8?q?=EC=9D=B8=20=EC=84=9C=EB=B9=84=EC=8A=A4=EB=A1=9C=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=9D=B4=EB=8F=99=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coin/service/CoinHistoryService.java | 11 ++++++++ .../coin/service/UserCoinChangeService.java | 14 ++++++++++ .../domain/user/service/UserService.java | 27 +++++++------------ .../service/UserCoinChangeServiceTest.java | 24 ++++++++++++++++- 4 files changed, 58 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java index 3eb3179e2..991d419a0 100644 --- a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java +++ b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java @@ -9,6 +9,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; + @Service @RequiredArgsConstructor public class CoinHistoryService { @@ -41,7 +43,16 @@ public int addRankLoseCoin(User user){ return amount; } + @Transactional(readOnly = true) + public boolean isUserTodayAttended(User user) { + LocalDateTime startOfDay = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0); + LocalDateTime endOfDay = LocalDateTime.now().withHour(23).withMinute(59).withSecond(59); + return coinHistoryRepository.existsCoinHistoryByUserAndHistoryAndCreatedAtToday( + user, HistoryType.ATTENDANCECOIN.getHistory(), startOfDay, endOfDay); + } + private void addCoinHistory(CoinHistory coinHistory){ coinHistoryRepository.save(coinHistory); } + } diff --git a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java index a2ba56835..fad726ed3 100644 --- a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java +++ b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java @@ -1,17 +1,21 @@ package com.gg.server.domain.coin.service; +import com.gg.server.domain.coin.data.CoinHistoryRepository; import com.gg.server.domain.coin.data.CoinPolicyRepository; import com.gg.server.domain.coin.dto.UserGameCoinResultDto; +import com.gg.server.domain.coin.type.HistoryType; import com.gg.server.domain.game.service.GameFindService; import com.gg.server.domain.team.data.Team; import com.gg.server.domain.team.data.TeamUser; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.exception.UserAlreadyAttendanceException; import com.gg.server.domain.user.exception.UserNotFoundException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.List; @Service @@ -22,6 +26,16 @@ public class UserCoinChangeService { private final UserRepository userRepository; private final GameFindService gameFindService; + @Transactional + public int addAttendanceCoin(User user){ + if (coinHistoryService.isUserTodayAttended(user)) + throw new UserAlreadyAttendanceException(); + int coinIncrement = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getAttendance(); + user.addGgCoin(coinIncrement); + coinHistoryService.addAttendanceCoinHistory(user); + return coinIncrement; + } + @Transactional public UserGameCoinResultDto addNormalGameCoin(Long userId) { User user = userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException()); diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index b04f432af..4f55e1bc0 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -3,6 +3,8 @@ import com.gg.server.domain.coin.data.CoinHistory; import com.gg.server.domain.coin.data.CoinHistoryRepository; import com.gg.server.domain.coin.data.CoinPolicyRepository; +import com.gg.server.domain.coin.service.CoinHistoryService; +import com.gg.server.domain.coin.service.UserCoinChangeService; import com.gg.server.domain.game.data.Game; import com.gg.server.domain.game.data.GameRepository; import com.gg.server.domain.game.type.StatusType; @@ -65,12 +67,10 @@ public class UserService { private final PChangeRepository pChangeRepository; private final RankFindService rankFindService; private final RedisMatchUserRepository redisMatchUserRepository; - private final CoinHistoryRepository coinHistoryRepository; - private final CoinPolicyRepository coinPolicyRepository; + private final UserCoinChangeService userCoinChangeService; + private final CoinHistoryService coinHistoryService; private final ReceiptRepository receiptRepository; - private final String ATTENDANCE = "ATTENDANCE"; - /** * @param intraId * @return intraId가 포함된 유저들의 intraId를 페이징 관계없이 최대 5개까지 검색하여 List로 return @@ -248,24 +248,17 @@ public UserImageResponseDto getRankedUserImagesByExp(PageRequest pageRequest) { @Transactional public UserAttendanceResponseDto attendUser(Long userId) { User user = userRepository.findById(userId).orElseThrow(() -> new UsernameNotFoundException("User" + userId)); - LocalDateTime startOfDay = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0); - LocalDateTime endOfDay = LocalDateTime.now().withHour(23).withMinute(59).withSecond(59); - if (coinHistoryRepository.existsCoinHistoryByUserAndHistoryAndCreatedAtToday(user, ATTENDANCE, startOfDay, endOfDay)) - throw new UserAlreadyAttendanceException(); - int plus = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getAttendance(); - CoinHistory coinHistory = new CoinHistory(user, ATTENDANCE, plus); - coinHistoryRepository.save(coinHistory); - int beforeCoin = user.getGgCoin(); - user.addGgCoin(plus); - return new UserAttendanceResponseDto(beforeCoin, user.getGgCoin(), plus); + + int plus = userCoinChangeService.addAttendanceCoin(user); + + return new UserAttendanceResponseDto(user.getGgCoin() - plus, user.getGgCoin(), plus); } + @Transactional public UserNormalDetailResponseDto getUserNormalDetail(UserDto user) { User loginUser = userRepository.findById(user.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + user.getId())); Boolean isAdmin = user.getRoleType() == RoleType.ADMIN; - LocalDateTime startOfDay = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0); - LocalDateTime endOfDay = LocalDateTime.now().withHour(23).withMinute(59).withSecond(59); - Boolean isAttended = coinHistoryRepository.existsCoinHistoryByUserAndHistoryAndCreatedAtToday(loginUser, ATTENDANCE, startOfDay, endOfDay); + Boolean isAttended = coinHistoryService.isUserTodayAttended(loginUser); Integer level = ExpLevelCalculator.getLevel(user.getTotalExp()); Tier tier = rankFindService.findByUserIdAndSeasonId(user.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); /* 티어가 존재하지 않는 일반 유저일때 : None, None 처리해서 보내기*/ diff --git a/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java b/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java index 53114053d..1941d080f 100644 --- a/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java +++ b/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java @@ -43,6 +43,29 @@ class UserCoinChangeServiceTest { @Autowired UserCoinChangeService userCoinChangeService; + @Test + @DisplayName("출석시 재화 증가 서비스 테스트") + void addAttendanceCoin() { + String accessToken = testDataUtils.getLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + User user = userRepository.getById(userId); + + int beforeCoin = user.getGgCoin(); + + int coinIncrement = userCoinChangeService.addAttendanceCoin(user); + + assertThat(beforeCoin + coinIncrement).isEqualTo(user.getGgCoin()); + assertThat(coinPolicyRepository.findTopByOrderByCreatedAtDesc().getAttendance()).isEqualTo(coinIncrement); + System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); + + try{ + coinIncrement = userCoinChangeService.addAttendanceCoin(user); + }catch (Exception e){ + System.out.println(e.getMessage() + " " + e); + System.out.println("===출석 중복 제거 기능 수행 완료==="); + } + } + @Test @DisplayName("노말 게임 재화 증가 서비스 테스트") void addNormalGameService() { @@ -50,7 +73,6 @@ void addNormalGameService() { Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); User user = userRepository.getById(userId); - UserGameCoinResultDto userGameCoinResultDto = userCoinChangeService.addNormalGameCoin(userId); assertThat(user.getGgCoin()).isEqualTo(userGameCoinResultDto.getAfterCoin()); From ee457f6f146d0b509c7bb7c823b0f62720a0811d Mon Sep 17 00:00:00 2001 From: sion99 Date: Thu, 24 Aug 2023 14:56:22 +0900 Subject: [PATCH 117/273] =?UTF-8?q?[FEAT]=20ITEM=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=EC=8B=9C=20=EC=82=AC=EC=A7=84=20=EC=A0=80=EC=9E=A5=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/controller/ItemAdminController.java | 23 +++++++-- .../admin/item/dto/ItemUpdateRequestDto.java | 4 -- .../admin/item/service/ItemAdminService.java | 27 ++++++++-- .../com/gg/server/domain/item/data/Item.java | 18 ++++++- .../exception/ItemImageLargeException.java | 10 ++++ .../exception/ItemImageTypeException.java | 10 ++++ .../gg/server/global/exception/ErrorCode.java | 2 + .../server/global/utils/ItemImageHandler.java | 51 +++++++++++++++++++ .../utils/aws/AsyncNewItemImageUploader.java | 33 ++++++++++++ 9 files changed, 167 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/gg/server/domain/item/exception/ItemImageLargeException.java create mode 100644 src/main/java/com/gg/server/domain/item/exception/ItemImageTypeException.java create mode 100644 src/main/java/com/gg/server/global/utils/ItemImageHandler.java create mode 100644 src/main/java/com/gg/server/global/utils/aws/AsyncNewItemImageUploader.java diff --git a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java index ca2f876b7..3354c2098 100644 --- a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java +++ b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java @@ -3,6 +3,8 @@ import com.gg.server.admin.item.dto.ItemListResponseDto; import com.gg.server.admin.item.dto.ItemUpdateRequestDto; import com.gg.server.admin.item.service.ItemAdminService; +import com.gg.server.domain.item.exception.ItemImageLargeException; +import com.gg.server.domain.item.exception.ItemImageTypeException; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.global.dto.PageRequestDto; import com.gg.server.global.utils.argumentresolver.Login; @@ -12,10 +14,13 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.validation.Valid; +import java.io.IOException; @RestController @RequiredArgsConstructor @@ -30,9 +35,21 @@ public ItemListResponseDto getItemHistory(@ModelAttribute @Valid PageRequestDto return itemAdminService.getAllItemHistory(pageable); } - @PutMapping("/{itemId}") - public ResponseEntity updateItem(@PathVariable("itemId") Long itemId, @RequestBody @Valid ItemUpdateRequestDto itemRequestDto, @Parameter(hidden = true) @Login UserDto user) { - itemAdminService.updateItem(itemId, itemRequestDto, user); + @PutMapping(path="/{itemId}") + public ResponseEntity updateItem(@PathVariable("itemId") Long itemId, + @RequestPart @Valid ItemUpdateRequestDto itemRequestDto, + @RequestPart(required = false) MultipartFile imgData, + @Parameter(hidden = true) @Login UserDto user) throws IOException { + if (imgData != null) { + if (imgData.getSize() > 50000) { + throw new ItemImageLargeException(); + } else if (imgData.getContentType() == null || !imgData.getContentType().equals("image/jpeg")) { + throw new ItemImageTypeException(); + } + itemAdminService.updateItem(itemId, itemRequestDto, imgData, user); + } else { + itemAdminService.updateItem(itemId, itemRequestDto, user); + } return new ResponseEntity(HttpStatus.NO_CONTENT); } diff --git a/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java b/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java index a3ac60591..c11c71130 100644 --- a/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java +++ b/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java @@ -17,9 +17,6 @@ public class ItemUpdateRequestDto { @NotNull(message = "plz. content") private String content; - @NotNull(message = "plz. imageUri") - private String imageUri; - @NotNull(message = "plz. price") private Integer price; @@ -34,7 +31,6 @@ public String toString() { return "ItemUpdateRequestDto{" + "name='" + name + '\'' + ", content='" + content + '\'' + - ", imageUri='" + imageUri + '\'' + ", price=" + price + ", discount=" + discount + ", itemType='" + itemType + '\'' + diff --git a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java index 63d0b3550..79b7ad092 100644 --- a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java +++ b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java @@ -7,17 +7,24 @@ import com.gg.server.admin.item.exception.ItemNotFoundException; import com.gg.server.domain.item.data.Item; import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.global.utils.aws.AsyncNewItemImageUploader; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; @Service @RequiredArgsConstructor public class ItemAdminService { + private final ItemAdminRepository itemAdminRepository; + private final AsyncNewItemImageUploader asyncNewItemImageUploader; + @Transactional(readOnly = true) public ItemListResponseDto getAllItemHistory(Pageable pageable) { Page responseDtos = itemAdminRepository.findAll(pageable).map(ItemHistoryResponseDto::new); @@ -25,17 +32,31 @@ public ItemListResponseDto getAllItemHistory(Pageable pageable) { } @Transactional - public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, UserDto user) { - Item item = itemAdminRepository.findById(itemId).orElseThrow(()-> new ItemNotFoundException()); + //TODO 삭제된 경우 에러처리 + public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, + MultipartFile itemImageFile, UserDto user) throws IOException { + Item item = itemAdminRepository.findById(itemId).orElseThrow(() -> new ItemNotFoundException()); item.setIsVisible(false); item.setDeleterIntraId(user.getIntraId()); Item newItem = new Item(itemUpdateRequestDto, user.getIntraId()); + if (itemImageFile != null) + asyncNewItemImageUploader.upload(newItem, itemImageFile); + itemAdminRepository.save(newItem); + } + + @Transactional + public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, + UserDto user) { + Item item = itemAdminRepository.findById(itemId).orElseThrow(() -> new ItemNotFoundException()); + item.setIsVisible(false); + item.setDeleterIntraId(user.getIntraId()); + Item newItem = new Item(itemUpdateRequestDto, user.getIntraId(), item.getImageUri()); itemAdminRepository.save(newItem); } @Transactional public void deleteItem(Long itemId, UserDto user) { - Item item = itemAdminRepository.findById(itemId).orElseThrow(()-> new ItemNotFoundException()); + Item item = itemAdminRepository.findById(itemId).orElseThrow(() -> new ItemNotFoundException()); item.setIsVisible(false); item.setDeleterIntraId(user.getIntraId()); } diff --git a/src/main/java/com/gg/server/domain/item/data/Item.java b/src/main/java/com/gg/server/domain/item/data/Item.java index 85e3b9933..a99350483 100644 --- a/src/main/java/com/gg/server/domain/item/data/Item.java +++ b/src/main/java/com/gg/server/domain/item/data/Item.java @@ -67,11 +67,23 @@ public Item(String name, String content, String imageUri, Integer price, this.createdAt = createdAt; } + @Builder + public Item(ItemUpdateRequestDto updateRequestDto, String creatorIntraId, String itemImageUri) { + this.name = updateRequestDto.getName(); + this.content = updateRequestDto.getContent(); + this.imageUri = itemImageUri; + this.price = updateRequestDto.getPrice(); + this.discount = updateRequestDto.getDiscount(); + this.isVisible = true; + this.creatorIntraId = creatorIntraId; + this.createdAt = LocalDateTime.now(); + this.type = updateRequestDto.getItemType(); + } + @Builder public Item(ItemUpdateRequestDto updateRequestDto, String creatorIntraId) { this.name = updateRequestDto.getName(); this.content = updateRequestDto.getContent(); - this.imageUri = updateRequestDto.getImageUri(); this.price = updateRequestDto.getPrice(); this.discount = updateRequestDto.getDiscount(); this.isVisible = true; @@ -80,6 +92,10 @@ public Item(ItemUpdateRequestDto updateRequestDto, String creatorIntraId) { this.type = updateRequestDto.getItemType(); } + public void imageUpdate(String imageUri) { + this.imageUri = imageUri; + } + @Override public String toString() { return "Item{" + diff --git a/src/main/java/com/gg/server/domain/item/exception/ItemImageLargeException.java b/src/main/java/com/gg/server/domain/item/exception/ItemImageLargeException.java new file mode 100644 index 000000000..8c8dd7561 --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/exception/ItemImageLargeException.java @@ -0,0 +1,10 @@ +package com.gg.server.domain.item.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.FileException; + +public class ItemImageLargeException extends FileException { + public ItemImageLargeException() { + super("이미지 파일 50KB 초과", ErrorCode.USER_IMAGE_TOO_LARGE); + } +} diff --git a/src/main/java/com/gg/server/domain/item/exception/ItemImageTypeException.java b/src/main/java/com/gg/server/domain/item/exception/ItemImageTypeException.java new file mode 100644 index 000000000..34955934f --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/exception/ItemImageTypeException.java @@ -0,0 +1,10 @@ +package com.gg.server.domain.item.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.FileException; + +public class ItemImageTypeException extends FileException { + public ItemImageTypeException() { + super("이미지 타입이 올바르지 않습니다", ErrorCode.ITEM_IMAGE_WRONG_TYPE); + } +} diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index e2a22e428..d3d1026d3 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -42,6 +42,8 @@ public enum ErrorCode { ITEM_TYPE_NOT_MATCHED(400, "IT200", "ITEM TYPE NOT MATCHED"), ITEM_NOT_PURCHASABLE(400, "IT201", "ITEM NOT PURCHASABLE"), INSUFFICIENT_GGCOIN(400,"IT202","INSUFFICIENT GGCOIN"), + ITEM_IMAGE_TOO_LARGE(413, "IT401", "ITEM IMAGE IS TOO LARGE"), + ITEM_IMAGE_WRONG_TYPE(415, "IT402", "ITEM IMAGE TYPE IS WRONG"), //receipt RECEIPT_NOT_FOUND(404, "RC100", "RECEIPT NOT FOUND"), diff --git a/src/main/java/com/gg/server/global/utils/ItemImageHandler.java b/src/main/java/com/gg/server/global/utils/ItemImageHandler.java new file mode 100644 index 000000000..dfcd319c9 --- /dev/null +++ b/src/main/java/com/gg/server/global/utils/ItemImageHandler.java @@ -0,0 +1,51 @@ +package com.gg.server.global.utils; + +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.model.CannedAccessControlList; +import com.amazonaws.services.s3.model.ObjectMetadata; +import com.amazonaws.services.s3.model.PutObjectRequest; +import com.gg.server.domain.item.data.Item; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.io.InputStream; +import java.util.UUID; + +@Component +public class ItemImageHandler { + private final AmazonS3 amazonS3; + + public ItemImageHandler(AmazonS3 amazonS3) { + this.amazonS3 = amazonS3; + } + + @Value("${cloud.aws.s3.bucket}") + private String bucketName; + + @Value("${cloud.aws.s3.dir}") + private String dir; + + @Value("${info.image.defaultUrl}") + private String defaultImageUrl; + + public String updateAndGetS3ImageUri(MultipartFile multipartFile, Item item) throws IOException { + String itemFileName = item.getName() + "-" + UUID.randomUUID() + ".jpeg"; + if (itemFileName.equals("small_default.jpeg")) + return defaultImageUrl; + else { + String s3ImageUrl = uploadToS3(multipartFile, itemFileName); + return s3ImageUrl; + } + } + + public String uploadToS3(MultipartFile multipartFile, String fileName) throws IOException { + String s3FileName = dir + fileName; + InputStream inputStream = multipartFile.getInputStream(); + ObjectMetadata objMeta = new ObjectMetadata(); + objMeta.setContentLength(multipartFile.getSize()); + amazonS3.putObject(new PutObjectRequest(bucketName, s3FileName, inputStream, objMeta).withCannedAcl(CannedAccessControlList.PublicRead)); + return amazonS3.getUrl(bucketName, s3FileName).toString(); + } +} diff --git a/src/main/java/com/gg/server/global/utils/aws/AsyncNewItemImageUploader.java b/src/main/java/com/gg/server/global/utils/aws/AsyncNewItemImageUploader.java new file mode 100644 index 000000000..a7baafdff --- /dev/null +++ b/src/main/java/com/gg/server/global/utils/aws/AsyncNewItemImageUploader.java @@ -0,0 +1,33 @@ +package com.gg.server.global.utils.aws; + +import com.gg.server.domain.item.data.Item; +import com.gg.server.global.utils.ItemImageHandler; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; + +@Component +public class AsyncNewItemImageUploader { + private final ItemImageHandler itemImageHandler; + + @Value("${info.image.defaultUrl}") + private String defaultImageUrl; + + public AsyncNewItemImageUploader(ItemImageHandler itemImageHandler) { + this.itemImageHandler = itemImageHandler; + } + + @Transactional + public void upload(Item item, + MultipartFile multipartFile) throws IOException { + String s3ImageUrl = itemImageHandler.updateAndGetS3ImageUri(multipartFile, item); + if (s3ImageUrl == null) { + item.imageUpdate(defaultImageUrl); + } else { + item.imageUpdate(s3ImageUrl); + } + } +} From 822eb652b818d184df6cfa57f5ba86ed58ee59a3 Mon Sep 17 00:00:00 2001 From: sion99 Date: Fri, 25 Aug 2023 11:27:07 +0900 Subject: [PATCH 118/273] =?UTF-8?q?[REFACTOR]=20ITEM=20UPDATE=20API=20put?= =?UTF-8?q?=EC=97=90=EC=84=9C=20post=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/admin/item/controller/ItemAdminController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java index 3354c2098..4a1e2fa08 100644 --- a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java +++ b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java @@ -35,7 +35,8 @@ public ItemListResponseDto getItemHistory(@ModelAttribute @Valid PageRequestDto return itemAdminService.getAllItemHistory(pageable); } - @PutMapping(path="/{itemId}") + @PostMapping(path="/{itemId}", consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE}) +// @PostMapping("{itemId}") public ResponseEntity updateItem(@PathVariable("itemId") Long itemId, @RequestPart @Valid ItemUpdateRequestDto itemRequestDto, @RequestPart(required = false) MultipartFile imgData, From bbe969f7e5ca74408d4befcddbac028fca4202bb Mon Sep 17 00:00:00 2001 From: sion99 Date: Fri, 25 Aug 2023 11:27:30 +0900 Subject: [PATCH 119/273] =?UTF-8?q?[TEST]=20ITEM=20UPDATE=20API=20?= =?UTF-8?q?=EC=9D=B4=EB=AF=B8=EC=A7=80=20=ED=8C=8C=EC=9D=BC=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/controller/ItemAdminControllerTest.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java b/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java index 0cbbd93c4..2a1996b6b 100644 --- a/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java @@ -17,7 +17,7 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; -import org.springframework.http.MediaType; +import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.web.servlet.MockMvc; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; @@ -80,17 +80,15 @@ public void getAllItemHistoryTest() throws Exception { public void updateItemTest() throws Exception { String accessToken = testDataUtils.getAdminLoginAccessToken(); Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); - String createrId = userRepository.getById(userId).getIntraId(); - String requestJson = "{\"name\" : \"확성기\", \"content\" : \"testing\", \"imageUri\" : \"https://kakao.com\", \"price\" : 42, \"discount\" : 50}"; - String contentAsString = mockMvc.perform(put("/pingpong/admin/items/{itemId}", 1) - .contentType(MediaType.APPLICATION_JSON) - .content(requestJson) + String creatorId = userRepository.getById(userId).getIntraId(); + MockMultipartFile image = new MockMultipartFile("file", "imagefile.jpeg", "image/jpeg", "<>".getBytes()); + MockMultipartFile jsonFile = new MockMultipartFile("itemRequestDto", "", "application/json", "{\"name\": \"TEST\", \"content\": \"TESTING\", \"price\": 42, \"discount\": 50, \"itemType\": \"MEGAPHONE\"}".getBytes()); + String contentAsString = mockMvc.perform(multipart("/pingpong/admin/items/{itemId}", 1) + .file(image) + .file(jsonFile) .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) .andExpect(status().isNoContent()) .andReturn().getResponse().getContentAsString(); - System.out.println(contentAsString); - List list = itemAdminRepository.findAll(); - assertThat(list.get(list.size() - 1).getCreatorIntraId()).isEqualTo(createrId); } @Test From a08125cd461e9ffffafa0d5cee27137168c5f1be Mon Sep 17 00:00:00 2001 From: sion99 Date: Fri, 25 Aug 2023 11:33:38 +0900 Subject: [PATCH 120/273] =?UTF-8?q?[STYLE]=20=EC=A3=BC=EC=84=9D=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/admin/item/controller/ItemAdminController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java index 4a1e2fa08..281b6ab1e 100644 --- a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java +++ b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java @@ -36,7 +36,6 @@ public ItemListResponseDto getItemHistory(@ModelAttribute @Valid PageRequestDto } @PostMapping(path="/{itemId}", consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE}) -// @PostMapping("{itemId}") public ResponseEntity updateItem(@PathVariable("itemId") Long itemId, @RequestPart @Valid ItemUpdateRequestDto itemRequestDto, @RequestPart(required = false) MultipartFile imgData, From b1158c9f27af9899ef66d9006df698acb6eb445f Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Mon, 28 Aug 2023 16:07:29 +0900 Subject: [PATCH 121/273] =?UTF-8?q?[FEAT]=20=EC=9C=A0=EC=A0=80=EB=B3=84=20?= =?UTF-8?q?=EC=95=84=EC=9D=B4=ED=85=9C=20=EB=B3=B4=EA=B4=80=ED=95=A8=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/controller/ItemController.java | 16 ++++++ .../domain/item/data/UserItemRepository.java | 14 ++++++ .../item/dto/UserItemListResponseDto.java | 19 +++++++ .../item/dto/UserItemPageRequestDto.java | 12 +++++ .../domain/item/dto/UserItemResponseDto.java | 29 +++++++++++ .../domain/item/service/ItemService.java | 14 ++++++ .../UserItemResponseControllerTest.java | 49 +++++++++++++++++++ 7 files changed, 153 insertions(+) create mode 100644 src/main/java/com/gg/server/domain/item/data/UserItemRepository.java create mode 100644 src/main/java/com/gg/server/domain/item/dto/UserItemListResponseDto.java create mode 100644 src/main/java/com/gg/server/domain/item/dto/UserItemPageRequestDto.java create mode 100644 src/main/java/com/gg/server/domain/item/dto/UserItemResponseDto.java create mode 100644 src/test/java/com/gg/server/domain/item/controller/UserItemResponseControllerTest.java diff --git a/src/main/java/com/gg/server/domain/item/controller/ItemController.java b/src/main/java/com/gg/server/domain/item/controller/ItemController.java index 8603ff197..b27cc19ad 100644 --- a/src/main/java/com/gg/server/domain/item/controller/ItemController.java +++ b/src/main/java/com/gg/server/domain/item/controller/ItemController.java @@ -2,15 +2,22 @@ import com.gg.server.domain.item.dto.ItemGiftRequestDto; import com.gg.server.domain.item.dto.ItemStoreListResponseDto; +import com.gg.server.domain.item.dto.UserItemListResponseDto; +import com.gg.server.domain.item.dto.UserItemPageRequestDto; import com.gg.server.domain.item.service.ItemService; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.global.utils.argumentresolver.Login; import io.swagger.v3.oas.annotations.Parameter; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; + @RestController @RequiredArgsConstructor @RequestMapping("/pingpong/items") @@ -37,4 +44,13 @@ public ResponseEntity giftItem(@PathVariable Long itemId, itemService.giftItem(itemId, recipient.getOwnerId(), userDto); return new ResponseEntity(HttpStatus.CREATED); } + + @GetMapping + public UserItemListResponseDto getItemByUser(@ModelAttribute @Valid UserItemPageRequestDto req, + @Parameter(hidden = true) @Login UserDto userDto) { + Pageable pageable = PageRequest.of(req.getPage() - 1, req.getSize(), + Sort.by("createdAt").descending()); + return itemService.getItemByUser(userDto, pageable); + } + } diff --git a/src/main/java/com/gg/server/domain/item/data/UserItemRepository.java b/src/main/java/com/gg/server/domain/item/data/UserItemRepository.java new file mode 100644 index 000000000..3a71e92e9 --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/data/UserItemRepository.java @@ -0,0 +1,14 @@ +package com.gg.server.domain.item.data; + +import com.gg.server.domain.receipt.data.Receipt; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +public interface UserItemRepository extends JpaRepository { + + @Query("select r from Receipt r where r.ownerIntraId = :intraId and (r.status = 'BEFORE' or r.status = 'USING') order by r.createdAt desc") + Page findByOwnerIntraId(@Param("intraId") String intraId, Pageable pageable); +} diff --git a/src/main/java/com/gg/server/domain/item/dto/UserItemListResponseDto.java b/src/main/java/com/gg/server/domain/item/dto/UserItemListResponseDto.java new file mode 100644 index 000000000..230d00524 --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/dto/UserItemListResponseDto.java @@ -0,0 +1,19 @@ +package com.gg.server.domain.item.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@NoArgsConstructor +public class UserItemListResponseDto { + private List storageItemList; + private Integer totalPage; + + public UserItemListResponseDto(List storageItemList, Integer totalPage){ + this.storageItemList = storageItemList; + this.totalPage = totalPage; + } + +} \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/item/dto/UserItemPageRequestDto.java b/src/main/java/com/gg/server/domain/item/dto/UserItemPageRequestDto.java new file mode 100644 index 000000000..cdc31b4f7 --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/dto/UserItemPageRequestDto.java @@ -0,0 +1,12 @@ +package com.gg.server.domain.item.dto; + +import com.gg.server.global.dto.PageRequestDto; +import lombok.Getter; + +@Getter +public class UserItemPageRequestDto extends PageRequestDto { + + public UserItemPageRequestDto(Integer page, Integer size) { + super(page, size); + } +} diff --git a/src/main/java/com/gg/server/domain/item/dto/UserItemResponseDto.java b/src/main/java/com/gg/server/domain/item/dto/UserItemResponseDto.java new file mode 100644 index 000000000..653f1d159 --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/dto/UserItemResponseDto.java @@ -0,0 +1,29 @@ +package com.gg.server.domain.item.dto; + +import com.gg.server.domain.item.data.Item; +import com.gg.server.domain.receipt.data.Receipt; +import com.gg.server.domain.receipt.type.ItemStatus; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class UserItemResponseDto { + private Long receiptId; + private String itemName; + private String imageUri; + private String purchaserIntra; + private ItemStatus itemStatus; + + public UserItemResponseDto(Receipt receipt) { + Item item = receipt.getItem(); + this.receiptId = receipt.getId(); + this.itemName = item.getName(); + this.imageUri = item.getImageUri(); + this.purchaserIntra = receipt.getPurchaserIntraId(); + this.itemStatus = receipt.getStatus(); + } + +} \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index b8279ea09..7db1e8840 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -2,8 +2,11 @@ import com.gg.server.domain.item.data.Item; import com.gg.server.domain.item.data.ItemRepository; +import com.gg.server.domain.item.data.UserItemRepository; import com.gg.server.domain.item.dto.ItemStoreListResponseDto; import com.gg.server.domain.item.dto.ItemStoreResponseDto; +import com.gg.server.domain.item.dto.UserItemListResponseDto; +import com.gg.server.domain.item.dto.UserItemResponseDto; import com.gg.server.domain.item.exception.InsufficientGgcoinException; import com.gg.server.domain.item.exception.ItemNotFoundException; import com.gg.server.domain.item.exception.ItemNotPurchasableException; @@ -15,6 +18,8 @@ import com.gg.server.domain.user.dto.UserDto; import com.gg.server.domain.user.exception.UserNotFoundException; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -29,7 +34,9 @@ public class ItemService { private final ItemRepository itemRepository; private final ReceiptRepository receiptRepository; private final UserRepository userRepository; + private final UserItemRepository userItemRepository; + @Transactional(readOnly = true) public ItemStoreListResponseDto getAllItems() { List itemStoreListResponseDto = itemRepository.findAllByIsVisible(true) @@ -109,4 +116,11 @@ public void giftItem(Long itemId, String ownerId, UserDto userDto) { ItemStatus.BEFORE, LocalDateTime.now()); receiptRepository.save(receipt); } + + @Transactional(readOnly = true) + public UserItemListResponseDto getItemByUser(UserDto userDto, Pageable pageable) { + Page receipts = userItemRepository.findByOwnerIntraId(userDto.getIntraId(), pageable); + Page responseDtos = receipts.map(UserItemResponseDto::new); + return new UserItemListResponseDto(responseDtos.getContent(), responseDtos.getTotalPages()); + } } diff --git a/src/test/java/com/gg/server/domain/item/controller/UserItemResponseControllerTest.java b/src/test/java/com/gg/server/domain/item/controller/UserItemResponseControllerTest.java new file mode 100644 index 000000000..63c8edeb0 --- /dev/null +++ b/src/test/java/com/gg/server/domain/item/controller/UserItemResponseControllerTest.java @@ -0,0 +1,49 @@ +package com.gg.server.domain.item.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.domain.item.service.ItemService; +import com.gg.server.utils.TestDataUtils; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.HttpHeaders; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +public class UserItemResponseControllerTest { + + @Autowired + ItemService itemService; + + @Autowired + TestDataUtils testDataUtils; + + @Autowired + ObjectMapper objectMapper; + + @Autowired + MockMvc mockMvc; + + @Test + @DisplayName("GET /pingpong/items?page=1&size=20") + public void getItemByUser() throws Exception { + String accessToken = testDataUtils.getLoginAccessToken(); + + Integer page = 1; + Integer size = 20; + + String url = "/pingpong/items?page=" + page + "&size=" + size; + + mockMvc.perform(get(url) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + } +} \ No newline at end of file From 0ee53075de720d80894c926d823df21f6ef4aa2b Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Tue, 29 Aug 2023 00:23:25 +0900 Subject: [PATCH 122/273] =?UTF-8?q?[refactor]=20GGBE4-54=20=ED=95=A8?= =?UTF-8?q?=EC=88=98=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/coin/service/CoinHistoryService.java | 2 +- .../gg/server/domain/coin/service/UserCoinChangeService.java | 2 +- .../java/com/gg/server/domain/user/service/UserService.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java index 991d419a0..eb59c722c 100644 --- a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java +++ b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java @@ -44,7 +44,7 @@ public int addRankLoseCoin(User user){ } @Transactional(readOnly = true) - public boolean isUserTodayAttended(User user) { + public boolean hasAttendedToday(User user) { LocalDateTime startOfDay = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0); LocalDateTime endOfDay = LocalDateTime.now().withHour(23).withMinute(59).withSecond(59); return coinHistoryRepository.existsCoinHistoryByUserAndHistoryAndCreatedAtToday( diff --git a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java index fad726ed3..d14866874 100644 --- a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java +++ b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java @@ -28,7 +28,7 @@ public class UserCoinChangeService { @Transactional public int addAttendanceCoin(User user){ - if (coinHistoryService.isUserTodayAttended(user)) + if (coinHistoryService.hasAttendedToday(user)) throw new UserAlreadyAttendanceException(); int coinIncrement = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getAttendance(); user.addGgCoin(coinIncrement); diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 4f55e1bc0..48bab97d4 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -258,7 +258,7 @@ public UserAttendanceResponseDto attendUser(Long userId) { public UserNormalDetailResponseDto getUserNormalDetail(UserDto user) { User loginUser = userRepository.findById(user.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + user.getId())); Boolean isAdmin = user.getRoleType() == RoleType.ADMIN; - Boolean isAttended = coinHistoryService.isUserTodayAttended(loginUser); + Boolean isAttended = coinHistoryService.hasAttendedToday(loginUser); Integer level = ExpLevelCalculator.getLevel(user.getTotalExp()); Tier tier = rankFindService.findByUserIdAndSeasonId(user.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); /* 티어가 존재하지 않는 일반 유저일때 : None, None 처리해서 보내기*/ From 416431132ab9cbb95b2e90937d080b884895a954 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Tue, 29 Aug 2023 00:43:38 +0900 Subject: [PATCH 123/273] =?UTF-8?q?[REFACTOR]=20item=20Entity=20=EC=88=98?= =?UTF-8?q?=EC=A0=95(content->main,sub=20=EB=91=90=EA=B0=9C=EB=A1=9C)=20+?= =?UTF-8?q?=20=EC=83=81=EC=A0=90=20=EC=9D=B8=EA=B8=B0=EC=88=9C=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/item/dto/ItemHistoryResponseDto.java | 9 ++++++--- .../admin/item/dto/ItemUpdateRequestDto.java | 10 +++++++--- .../com/gg/server/domain/item/data/Item.java | 18 ++++++++++++------ .../domain/item/data/ItemRepository.java | 5 ++++- .../domain/item/dto/ItemStoreResponseDto.java | 6 ++++-- .../domain/item/service/ItemService.java | 2 +- .../V2.4__modify_item_content_columns.sql | 10 ++++++++++ .../controller/ItemAdminControllerTest.java | 3 ++- .../ItemStoreListControllerTest.java | 9 +++++---- 9 files changed, 51 insertions(+), 21 deletions(-) create mode 100644 src/main/resources/db/migration/V2.4__modify_item_content_columns.sql diff --git a/src/main/java/com/gg/server/admin/item/dto/ItemHistoryResponseDto.java b/src/main/java/com/gg/server/admin/item/dto/ItemHistoryResponseDto.java index cf04e5f46..5e8acf572 100644 --- a/src/main/java/com/gg/server/admin/item/dto/ItemHistoryResponseDto.java +++ b/src/main/java/com/gg/server/admin/item/dto/ItemHistoryResponseDto.java @@ -13,7 +13,8 @@ public class ItemHistoryResponseDto { private Long itemId; private String name; - private String content; + private String mainContent; + private String subContent; private String imageUri; private Integer price; private Integer discount; @@ -25,7 +26,8 @@ public class ItemHistoryResponseDto { public ItemHistoryResponseDto(Item item) { this.itemId = item.getId(); this.name = item.getName(); - this.content = item.getContent(); + this.mainContent = item.getMainContent(); + this.subContent = item.getSubContent(); this.imageUri = item.getImageUri(); this.price = item.getPrice(); this.discount = item.getDiscount(); @@ -40,7 +42,8 @@ public String toString() { return "ItemHistoryResponseDto{" + "itemId=" + itemId + ", name='" + name + '\'' + - ", content='" + content + '\'' + + ", mainContent='" + mainContent + '\'' + + ", subContent='" + subContent + '\'' + ", imageUri='" + imageUri + '\'' + ", price=" + price + ", discount=" + discount + diff --git a/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java b/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java index 156219979..d29818654 100644 --- a/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java +++ b/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java @@ -13,8 +13,11 @@ public class ItemUpdateRequestDto { @NotNull(message = "plz. itemName") private String name; - @NotNull(message = "plz. content") - private String content; + @NotNull(message = "plz. mainContent") + private String mainContent; + + @NotNull(message = "plz. subContent") + private String subContent; @NotNull(message = "plz. imageUri") private String imageUri; @@ -32,7 +35,8 @@ public class ItemUpdateRequestDto { public String toString() { return "ItemRequestDto{" + "name='" + name + '\'' + - ", content='" + content + '\'' + + ", mainContent='" + mainContent + '\'' + + ", subContent='" + subContent + '\'' + ", imageUri='" + imageUri + '\'' + ", price=" + price + ", discount=" + discount + diff --git a/src/main/java/com/gg/server/domain/item/data/Item.java b/src/main/java/com/gg/server/domain/item/data/Item.java index a81a954e9..e6f6661dc 100644 --- a/src/main/java/com/gg/server/domain/item/data/Item.java +++ b/src/main/java/com/gg/server/domain/item/data/Item.java @@ -20,8 +20,11 @@ public class Item { @Column(name = "name", length = 30) private String name; - @Column(name = "content", length = 255) - private String content; + @Column(name = "main_content", length = 255) + private String mainContent; + + @Column(name = "sub_content", length = 255) + private String subContent; @Column(name = "image_uri", length = 255) private String imageUri; @@ -55,10 +58,11 @@ public class Item { @Setter private String deleterIntraId; - public Item(String name, String content, String imageUri, Integer price, + public Item(String name, String mainContent, String subContent, String imageUri, Integer price, Boolean isVisible, Integer discount, ItemType type, LocalDateTime createdAt) { this.name = name; - this.content = content; + this.mainContent = mainContent; + this.subContent = subContent; this.imageUri = imageUri; this.price = price; this.isVisible = isVisible; @@ -70,7 +74,8 @@ public Item(String name, String content, String imageUri, Integer price, @Builder public Item(ItemUpdateRequestDto updateRequestDto) { this.name = updateRequestDto.getName(); - this.content = updateRequestDto.getContent(); + this.mainContent = updateRequestDto.getMainContent(); + this.subContent = updateRequestDto.getSubContent(); this.imageUri = updateRequestDto.getImageUri(); this.price = updateRequestDto.getPrice(); this.discount = updateRequestDto.getDiscount(); @@ -84,7 +89,8 @@ public String toString() { return "Item{" + "id=" + id + ", name='" + name + '\'' + - ", content='" + content + '\'' + + ", mainContent='" + mainContent + '\'' + + ", subContent='" + subContent + '\'' + ", imageUri='" + imageUri + '\'' + ", price=" + price + ", isVisible=" + isVisible + diff --git a/src/main/java/com/gg/server/domain/item/data/ItemRepository.java b/src/main/java/com/gg/server/domain/item/data/ItemRepository.java index 8c5d28ef3..4852d74fa 100644 --- a/src/main/java/com/gg/server/domain/item/data/ItemRepository.java +++ b/src/main/java/com/gg/server/domain/item/data/ItemRepository.java @@ -1,9 +1,12 @@ package com.gg.server.domain.item.data; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import java.util.List; public interface ItemRepository extends JpaRepository { - List findAllByIsVisible(boolean isVisible); + @Query("SELECT i FROM Item i " + "LEFT JOIN Receipt r ON r.item = i " + "WHERE i.isVisible = true " + + "GROUP BY i " + "ORDER BY COALESCE(COUNT(r), 0) DESC, i.createdAt DESC") + List findAllByPopDesc(); } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/item/dto/ItemStoreResponseDto.java b/src/main/java/com/gg/server/domain/item/dto/ItemStoreResponseDto.java index db64f9ab8..7b693dcf0 100644 --- a/src/main/java/com/gg/server/domain/item/dto/ItemStoreResponseDto.java +++ b/src/main/java/com/gg/server/domain/item/dto/ItemStoreResponseDto.java @@ -11,7 +11,8 @@ public class ItemStoreResponseDto { private Long itemId; private String itemName; - private String content; + private String mainContent; + private String subContent; private String itemType; private String imageUri; private Integer originalPrice; @@ -21,7 +22,8 @@ public class ItemStoreResponseDto { public ItemStoreResponseDto(Item item) { this.itemId = item.getId(); this.itemName = item.getName(); - this.content = item.getContent(); + this.mainContent = item.getMainContent(); + this.subContent = item.getSubContent(); this.itemType = item.getType().toString(); this.imageUri = item.getImageUri(); this.originalPrice = item.getPrice(); diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index 7db1e8840..62abade68 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -39,7 +39,7 @@ public class ItemService { @Transactional(readOnly = true) public ItemStoreListResponseDto getAllItems() { - List itemStoreListResponseDto = itemRepository.findAllByIsVisible(true) + List itemStoreListResponseDto = itemRepository.findAllByPopDesc() .stream().map(ItemStoreResponseDto::new).collect(Collectors.toList()); return new ItemStoreListResponseDto(itemStoreListResponseDto); } diff --git a/src/main/resources/db/migration/V2.4__modify_item_content_columns.sql b/src/main/resources/db/migration/V2.4__modify_item_content_columns.sql new file mode 100644 index 000000000..06d2baae0 --- /dev/null +++ b/src/main/resources/db/migration/V2.4__modify_item_content_columns.sql @@ -0,0 +1,10 @@ +alter table item + add column main_content varchar(255); + +alter table item + add column sub_content varchar(255); + +UPDATE item SET main_content = content, sub_content = content; + +alter table item +drop column content; \ No newline at end of file diff --git a/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java b/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java index 15579f94e..a60ba5bae 100644 --- a/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/item/controller/ItemAdminControllerTest.java @@ -68,7 +68,8 @@ public void getAllItemHistoryTest() throws Exception { System.out.println(result.getHistoryList().get(0)); assertThat(result.getHistoryList().get(0).getItemId()); assertThat(result.getHistoryList().get(0).getName()); - assertThat(result.getHistoryList().get(0).getContent()); + assertThat(result.getHistoryList().get(0).getMainContent()); + assertThat(result.getHistoryList().get(0).getSubContent()); assertThat(result.getHistoryList().get(0).getPrice()); } diff --git a/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java b/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java index 1cc8012c2..59d15d6e2 100644 --- a/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java +++ b/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java @@ -54,9 +54,9 @@ public void getAllItemsTest() throws Exception { //given List testItems = Arrays.asList( - new ItemStoreResponseDto(1L, "itemName 1", "Content 1", "MEGAPHONE", "ImageUrl 1", 1000, 10, 900), - new ItemStoreResponseDto(2L, "itemName 2", "Content 2", "PROFILE_IMAGE", "ImageUrl 2", 2000, 20, 1800), - new ItemStoreResponseDto(3L, "itemName 3", "Content 3", "TEXT_COLOR", "ImageUrl 3", 3000, 30, 2700) + new ItemStoreResponseDto(1L, "itemName 1", "mainContent 1","subContent 1", "MEGAPHONE", "ImageUrl 1", 1000, 10, 900), + new ItemStoreResponseDto(2L, "itemName 2", "mainContent 2","subContent 2", "PROFILE_IMAGE", "ImageUrl 2", 2000, 20, 1800), + new ItemStoreResponseDto(3L, "itemName 3", "mainContent 2","subContent 2", "TEXT_COLOR", "ImageUrl 3", 3000, 30, 2700) ); ItemStoreListResponseDto testResponse = new ItemStoreListResponseDto(testItems); when(itemService.getAllItems()).thenReturn(testResponse); @@ -84,7 +84,8 @@ public void getAllItemsTest() throws Exception { assertThat(actual.getItemId()).isEqualTo(expected.getItemId()); assertThat(actual.getItemName()).isEqualTo(expected.getItemName()); - assertThat(actual.getContent()).isEqualTo(expected.getContent()); + assertThat(actual.getMainContent()).isEqualTo(expected.getMainContent()); + assertThat(actual.getSubContent()).isEqualTo(expected.getSubContent()); assertThat(actual.getItemType()).isEqualTo(expected.getItemType()); assertThat(actual.getImageUri()).isEqualTo(expected.getImageUri()); assertThat(actual.getOriginalPrice()).isEqualTo(expected.getOriginalPrice()); From 9d365c53121e4dd014043c68450fc73cffa859f1 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Tue, 29 Aug 2023 09:17:21 +0900 Subject: [PATCH 124/273] [FEAT] add profile image post --- .../user/controller/UserController.java | 17 ++-- .../gg/server/domain/user/data/UserImage.java | 84 +++++++++---------- .../domain/user/data/UserImageRepository.java | 7 ++ .../server/domain/user/dto/UserImageDto.java | 12 ++- .../domain/user/dto/UserProfileImageDto.java | 15 ++++ .../exception/UserImageNullException.java | 10 +++ .../domain/user/service/UserService.java | 34 ++++++-- .../gg/server/global/exception/ErrorCode.java | 1 + .../server/global/utils/UserImageHandler.java | 5 +- .../utils/aws/AsyncNewUserImageUploader.java | 21 +++-- .../db/migration/V2.4__add_userImage.sql | 17 ++++ 11 files changed, 160 insertions(+), 63 deletions(-) create mode 100644 src/main/java/com/gg/server/domain/user/data/UserImageRepository.java create mode 100644 src/main/java/com/gg/server/domain/user/dto/UserProfileImageDto.java create mode 100644 src/main/java/com/gg/server/domain/user/exception/UserImageNullException.java create mode 100644 src/main/resources/db/migration/V2.4__add_userImage.sql diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index 071fbcb1f..0cc2fe115 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -3,10 +3,7 @@ import com.gg.server.domain.game.type.Mode; import com.gg.server.domain.user.dto.*; import com.gg.server.domain.user.exception.KakaoOauth2AlreadyExistException; -import com.gg.server.domain.user.service.UserAuthenticationService; -import com.gg.server.domain.user.service.UserCoinService; -import com.gg.server.domain.user.service.UserService; -import com.gg.server.domain.user.service.UserTextColorCheckService; +import com.gg.server.domain.user.service.*; import com.gg.server.domain.user.type.OauthType; import com.gg.server.domain.user.type.RoleType; import com.gg.server.global.dto.PageRequestDto; @@ -22,11 +19,14 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; +import java.io.IOException; import java.util.List; @RestController @@ -34,7 +34,6 @@ @RequestMapping("/pingpong/users") public class UserController { private final UserService userService; - private final UserTextColorCheckService userTextColorCheck; private final UserAuthenticationService userAuthenticationService; private final CookieUtil cookieUtil; private final UserCoinService userCoinService; @@ -153,4 +152,12 @@ public ResponseEntity getUserCoinHistory(@ModelA return ResponseEntity.ok() .body(userCoinService.getUserCoinHistory(pageable ,user.getIntraId())); } + + @PostMapping(path = "/profile-image", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE, MediaType.APPLICATION_JSON_VALUE}) + public ResponseEntity updateUserProfileImage(@RequestPart(required = false) MultipartFile profileImage, + @RequestPart @Valid UserProfileImageDto userProfileImageDto, + @Parameter(hidden = true) @Login UserDto user) throws IOException { + userService.updateUserProfileImage(user, userProfileImageDto, profileImage); + return new ResponseEntity(HttpStatus.NO_CONTENT); + } } diff --git a/src/main/java/com/gg/server/domain/user/data/UserImage.java b/src/main/java/com/gg/server/domain/user/data/UserImage.java index 0af2a37d9..2d5a5d87a 100644 --- a/src/main/java/com/gg/server/domain/user/data/UserImage.java +++ b/src/main/java/com/gg/server/domain/user/data/UserImage.java @@ -1,43 +1,43 @@ -package com.gg.server.domain.user.data; - -import com.gg.server.global.utils.BaseTimeEntity; -import com.sun.istack.NotNull; - -import javax.persistence.*; -import java.io.Serializable; - -public class UserImage extends BaseTimeEntity implements Serializable { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @NotNull - @ManyToOne - @Column(name = "user_id", length = 30) - private String userId; - - @NotNull - @Column(name = "image_url") - private String imageUrl; - - public UserImage(String userId, String imageUrl) { - this.userId = userId; - this.imageUrl = imageUrl; - } - - public String getImageId() { - return imageUrl; - } - - public String getuserId() { - return userId; - } - - public String getUserImageUrl() { - return imageUrl; - } - - public void imageUpdate(String imageUrl) { - this.imageUrl = imageUrl; - } +package com.gg.server.domain.user.data; + +import com.sun.istack.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@NoArgsConstructor +@AllArgsConstructor +@Entity +@Getter +public class UserImage { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @NotNull + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id") + private User user; + + @NotNull + @Column(name = "image_uri") + private String imageUri; + + @NotNull + @Column(name = "created_at") + private LocalDateTime createdAt; + + @NotNull + @Column(name = "is_deleted") + private Boolean isDeleted; + + public UserImage(User user, String imageUri, LocalDateTime createdAt, Boolean isDeleted) { + this.user = user; + this.imageUri = imageUri; + this.createdAt = createdAt; + this.isDeleted = isDeleted; + } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/user/data/UserImageRepository.java b/src/main/java/com/gg/server/domain/user/data/UserImageRepository.java new file mode 100644 index 000000000..1342aeb97 --- /dev/null +++ b/src/main/java/com/gg/server/domain/user/data/UserImageRepository.java @@ -0,0 +1,7 @@ +package com.gg.server.domain.user.data; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface UserImageRepository extends JpaRepository { + +} diff --git a/src/main/java/com/gg/server/domain/user/dto/UserImageDto.java b/src/main/java/com/gg/server/domain/user/dto/UserImageDto.java index 33c02c46d..a6530ec57 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserImageDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserImageDto.java @@ -4,11 +4,19 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; + + @Getter @NoArgsConstructor @AllArgsConstructor public class UserImageDto { - String intraId; - String userImageUri; + Long id; + Long userId; + String imageUri; + LocalDateTime createdAt; + Boolean isDeleted; + public UserImageDto(Long id, String imageUri, LocalDateTime now, boolean isDeleted) { + } } diff --git a/src/main/java/com/gg/server/domain/user/dto/UserProfileImageDto.java b/src/main/java/com/gg/server/domain/user/dto/UserProfileImageDto.java new file mode 100644 index 000000000..65857268d --- /dev/null +++ b/src/main/java/com/gg/server/domain/user/dto/UserProfileImageDto.java @@ -0,0 +1,15 @@ +package com.gg.server.domain.user.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class UserProfileImageDto { + @NotNull + private Long receiptId; +} diff --git a/src/main/java/com/gg/server/domain/user/exception/UserImageNullException.java b/src/main/java/com/gg/server/domain/user/exception/UserImageNullException.java new file mode 100644 index 000000000..b7e8b8598 --- /dev/null +++ b/src/main/java/com/gg/server/domain/user/exception/UserImageNullException.java @@ -0,0 +1,10 @@ +package com.gg.server.domain.user.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.FileException; + +public class UserImageNullException extends FileException { + public UserImageNullException() { + super("이미지 파일이 없습니다.", ErrorCode.USER_IMAGE_NOT_FOUND); + } +} diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 9ab096b24..1d15de7d8 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -30,11 +30,11 @@ import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.*; -import com.gg.server.domain.user.exception.UserAlreadyAttendanceException; -import com.gg.server.domain.user.exception.UserNotFoundException; -import com.gg.server.domain.user.exception.UserTextColorException; +import com.gg.server.domain.user.exception.*; import com.gg.server.domain.user.type.*; +import com.gg.server.global.utils.aws.AsyncNewUserImageUploader; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -42,7 +42,9 @@ import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Collections; @@ -66,6 +68,7 @@ public class UserService { private final CoinHistoryRepository coinHistoryRepository; private final CoinPolicyRepository coinPolicyRepository; private final ReceiptRepository receiptRepository; + private final AsyncNewUserImageUploader asyncNewUserImageUploader; private final String ATTENDANCE = "ATTENDANCE"; @@ -225,7 +228,7 @@ public UserImageResponseDto getRankedUserImagesByPPP(Long seasonId) { List userImages = new ArrayList<>(); userIds.forEach(userId -> { User user = users.stream().filter(u -> u.getId().equals(userId)).findFirst().orElseThrow(UserNotFoundException::new); - userImages.add(new UserImageDto(user.getIntraId(), user.getImageUri())); + userImages.add(new UserImageDto(user.getId(), user.getImageUri(), LocalDateTime.now(), false)); }); return new UserImageResponseDto(userImages); } catch (RedisDataNotFoundException ex) { @@ -237,7 +240,7 @@ public UserImageResponseDto getRankedUserImagesByExp(PageRequest pageRequest) { List users = userRepository.findAll(pageRequest).getContent(); List userImages = new ArrayList<>(); for (User user : users) { - userImages.add(new UserImageDto(user.getIntraId(), user.getImageUri())); + userImages.add(new UserImageDto(user.getId(), user.getImageUri(), LocalDateTime.now(), false)); } return new UserImageResponseDto(userImages); } @@ -310,6 +313,27 @@ public void updateBackground(UserDto user, UserBackgroundDto userBackgroundDto) receipt.updateStatus(ItemStatus.USED); } + @Transactional + public void updateUserProfileImage(UserDto user, UserProfileImageDto userProfileImageDto, MultipartFile userImageFile) throws IOException { + User userId = userRepository.findById(user.getId()).orElseThrow(UserNotFoundException::new); + Receipt receipt = receiptRepository.findById(userProfileImageDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); + + checkOwner(userId, receipt); + checkItemType(receipt, ItemType.PROFILE_IMAGE); + checkUseStatus(receipt); + + if (userImageFile == null) + throw new UserImageNullException(); + if (userImageFile.getSize() > 50000) { + throw new UserImageLargeException(); + } else if (userImageFile.getContentType() == null || !userImageFile.getContentType().equals("image/jpeg")) { + throw new UserImageTypeException(); + } + + asyncNewUserImageUploader.update(user.getIntraId(), userImageFile); + receipt.updateStatus(ItemStatus.USED); + } + public void checkOwner(User loginUser, Receipt receipt) { if (!receipt.getOwnerIntraId().equals(loginUser.getIntraId())) throw new ReceiptNotOwnerException(); diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index e2a22e428..58476bc04 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -9,6 +9,7 @@ public enum ErrorCode { //user USER_NOT_FOUND(404, "UR100", "USER NOT FOUND"), + USER_IMAGE_NOT_FOUND(404, "UR200", "USER IMAGE NOT FOUND"), USER_IMAGE_TOO_LARGE(413, "UR401", "USER IMAGE IS TOO LARGE"), USER_IMAGE_WRONG_TYPE(415, "UR402", "USER IMAGE TYPE IS WRONG"), KAKAO_OAUTH2_NOT_FOUND(404, "UR101", "KAKAO OAUTH2 NOT FOUND"), diff --git a/src/main/java/com/gg/server/global/utils/UserImageHandler.java b/src/main/java/com/gg/server/global/utils/UserImageHandler.java index b4cf25754..4e6e75369 100644 --- a/src/main/java/com/gg/server/global/utils/UserImageHandler.java +++ b/src/main/java/com/gg/server/global/utils/UserImageHandler.java @@ -56,11 +56,12 @@ public String updateAndGetS3ImageUri(MultipartFile multipartFile, User user) thr return defaultImageUrl; else { String s3ImageUrl = uploadToS3(multipartFile, updateFileName);; - if (!imageUrl.equals(defaultImageUrl)) - amazonS3.deleteObject(new DeleteObjectRequest(bucketName, dir + userFileName)); +// if (!imageUrl.equals(defaultImageUrl)) +// amazonS3.deleteObject(new DeleteObjectRequest(bucketName, dir + userFileName)); return s3ImageUrl; } } + private Boolean isStringValid(String intraId) { return intraId != null && intraId.length() != 0; } diff --git a/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java b/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java index de1126c40..ac2eee61d 100644 --- a/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java +++ b/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java @@ -1,8 +1,11 @@ package com.gg.server.global.utils.aws; import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserImage; +import com.gg.server.domain.user.data.UserImageRepository; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.global.utils.UserImageHandler; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; @@ -12,7 +15,9 @@ import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.io.IOException; +import java.time.LocalDateTime; +@Slf4j @Component public class AsyncNewUserImageUploader { private final UserImageHandler userImageHandler; @@ -22,10 +27,13 @@ public class AsyncNewUserImageUploader { @Value("${info.image.defaultUrl}") private String defaultImageUrl; + private final UserImageRepository userImageRepository; - public AsyncNewUserImageUploader(UserImageHandler userImageHandler, UserRepository userRepository) { + public AsyncNewUserImageUploader(UserImageHandler userImageHandler, UserRepository userRepository, + UserImageRepository userImageRepository) { this.userImageHandler = userImageHandler; this.userRepository = userRepository; + this.userImageRepository = userImageRepository; } @Async("asyncExecutor") @@ -46,12 +54,11 @@ public void upload(String intraId, String imageUrl) { @Transactional public void update(String intraId, MultipartFile multipartFile) throws IOException { - User user = userRepository.getUserByIntraId(intraId); + User user = userRepository.findByIntraId(intraId).get(); String s3ImageUrl = userImageHandler.updateAndGetS3ImageUri(multipartFile, user); - if (s3ImageUrl == null) { - user.imageUpdate(defaultImageUrl); - } else { - user.imageUpdate(s3ImageUrl); - } + s3ImageUrl = s3ImageUrl == null ? defaultImageUrl : s3ImageUrl; + UserImage userImage = new UserImage(user, s3ImageUrl, LocalDateTime.now(), false); + userImageRepository.saveAndFlush(userImage); + } } diff --git a/src/main/resources/db/migration/V2.4__add_userImage.sql b/src/main/resources/db/migration/V2.4__add_userImage.sql new file mode 100644 index 000000000..d511a8aa6 --- /dev/null +++ b/src/main/resources/db/migration/V2.4__add_userImage.sql @@ -0,0 +1,17 @@ +create table user_image +( + id bigint not null auto_increment, + user_id bigint, + image_uri varchar(255), + created_at datetime(6) not null, + visible bit not null default 1, + + primary key (id) +); + +alter table user_image + add constraint fk_user_image_user_user_id + foreign key (user_id) + references user (id); + +INSERT INTO user_image (user_id, image_uri, created_at) SELECT id, image_uri, created_at FROM user; From ee32bbfd6dde9a7bd09c4d6479b02e5a07b6f55b Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Tue, 29 Aug 2023 10:25:56 +0900 Subject: [PATCH 125/273] [FEAT] add add_userImage_and_user_image_uri. sql --- ...erImage.sql => V2.4__add_userImage_and_user_image_uri.sql} | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) rename src/main/resources/db/migration/{V2.4__add_userImage.sql => V2.4__add_userImage_and_user_image_uri.sql} (86%) diff --git a/src/main/resources/db/migration/V2.4__add_userImage.sql b/src/main/resources/db/migration/V2.4__add_userImage_and_user_image_uri.sql similarity index 86% rename from src/main/resources/db/migration/V2.4__add_userImage.sql rename to src/main/resources/db/migration/V2.4__add_userImage_and_user_image_uri.sql index d511a8aa6..6f176a87c 100644 --- a/src/main/resources/db/migration/V2.4__add_userImage.sql +++ b/src/main/resources/db/migration/V2.4__add_userImage_and_user_image_uri.sql @@ -12,6 +12,8 @@ create table user_image alter table user_image add constraint fk_user_image_user_user_id foreign key (user_id) - references user (id); + references `user` (id); INSERT INTO user_image (user_id, image_uri, created_at) SELECT id, image_uri, created_at FROM user; + +alter table user drop `image_uri` \ No newline at end of file From 6dc08e2da46e9867cff5410636826fcc003597e1 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Tue, 29 Aug 2023 12:58:52 +0900 Subject: [PATCH 126/273] =?UTF-8?q?[FIX]=20V2.4=20migration=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db/migration/V2.4__add_userImage_and_user_image_uri.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/db/migration/V2.4__add_userImage_and_user_image_uri.sql b/src/main/resources/db/migration/V2.4__add_userImage_and_user_image_uri.sql index 6f176a87c..dc738f777 100644 --- a/src/main/resources/db/migration/V2.4__add_userImage_and_user_image_uri.sql +++ b/src/main/resources/db/migration/V2.4__add_userImage_and_user_image_uri.sql @@ -4,7 +4,7 @@ create table user_image user_id bigint, image_uri varchar(255), created_at datetime(6) not null, - visible bit not null default 1, + is_deleted bit not null default 1, primary key (id) ); From cf76009098f18ade9d178ec75885e2b9a1a7d509 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Tue, 29 Aug 2023 15:41:18 +0900 Subject: [PATCH 127/273] =?UTF-8?q?[REFACTOR]=20=EC=84=A0=EB=AC=BC?= =?UTF-8?q?=ED=95=98=EA=B8=B0=20=ED=95=98=EB=A9=B4=20=EC=95=8C=EB=A6=BC=20?= =?UTF-8?q?=EB=B0=9C=EC=86=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/item/service/ItemService.java | 3 +++ .../com/gg/server/domain/noti/service/NotiService.java | 8 ++++++++ .../java/com/gg/server/domain/noti/type/NotiType.java | 3 ++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index 62abade68..fbbff65a5 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -10,6 +10,7 @@ import com.gg.server.domain.item.exception.InsufficientGgcoinException; import com.gg.server.domain.item.exception.ItemNotFoundException; import com.gg.server.domain.item.exception.ItemNotPurchasableException; +import com.gg.server.domain.noti.service.NotiService; import com.gg.server.domain.receipt.data.Receipt; import com.gg.server.domain.receipt.data.ReceiptRepository; import com.gg.server.domain.receipt.type.ItemStatus; @@ -35,6 +36,7 @@ public class ItemService { private final ReceiptRepository receiptRepository; private final UserRepository userRepository; private final UserItemRepository userItemRepository; + private final NotiService notiService; @Transactional(readOnly = true) public ItemStoreListResponseDto getAllItems() { @@ -115,6 +117,7 @@ public void giftItem(Long itemId, String ownerId, UserDto userDto) { Receipt receipt = new Receipt(item, userDto.getIntraId(), ownerId, ItemStatus.BEFORE, LocalDateTime.now()); receiptRepository.save(receipt); + notiService.createGiftNoti(owner, payUser, item.getName()); } @Transactional(readOnly = true) diff --git a/src/main/java/com/gg/server/domain/noti/service/NotiService.java b/src/main/java/com/gg/server/domain/noti/service/NotiService.java index 5147380bd..ef01f10f3 100644 --- a/src/main/java/com/gg/server/domain/noti/service/NotiService.java +++ b/src/main/java/com/gg/server/domain/noti/service/NotiService.java @@ -76,6 +76,14 @@ public Noti createMatchCancel(User user, LocalDateTime startTime) { return noti; } + @Transactional + public Noti createGiftNoti(User ownerUser, User payUser, String itemName) { + String notiMessage = "ଘ(੭ˊᵕˋ)੭* ੈ✩ " + payUser.getIntraId() + "님에게 " + itemName + " 아이템을 선물받았어요!"; + Noti noti = new Noti(ownerUser, NotiType.GIFT, notiMessage, false); + notiRepository.save(noti); + return noti; + } + public Noti createImminentNoti(User user, String enemyIntra, NotiType notiType, Integer gameOpenMinute) { String msg = "님과 경기 " + gameOpenMinute + "분 전 입니다. 서두르세요!"; return notiRepository.save(new Noti(user, notiType, msg, false)); diff --git a/src/main/java/com/gg/server/domain/noti/type/NotiType.java b/src/main/java/com/gg/server/domain/noti/type/NotiType.java index 331d86d1b..55fce1253 100644 --- a/src/main/java/com/gg/server/domain/noti/type/NotiType.java +++ b/src/main/java/com/gg/server/domain/noti/type/NotiType.java @@ -14,7 +14,8 @@ public enum NotiType { CANCELEDBYMAN("canceledbyman", "매칭이 취소되었퐁."), CANCELEDBYTIME("canceledbytime", "매칭이 상대 없음으로 취소되었퐁."), IMMINENT("imminent", "매치가 곧 시작될퐁."), - ANNOUNCE("announce", "공지사항이 도착했퐁."); + ANNOUNCE("announce", "공지사항이 도착했퐁."), + GIFT("gift", "새로운 선물이 도착했퐁."); private final String code; private final String message; From 0d858a088cc66bb0c32afd00cd6c8586a87174c3 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Tue, 29 Aug 2023 17:49:40 +0900 Subject: [PATCH 128/273] =?UTF-8?q?[REFACTOR]=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=EA=B0=80=20=EB=B3=B4=EA=B4=80=ED=95=A8=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=ED=95=A0=EB=95=8C=20BEFORE,=20USING,=20WAITING=20=EB=B3=B4?= =?UTF-8?q?=EC=97=AC=EC=A4=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/item/data/UserItemRepository.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/item/data/UserItemRepository.java b/src/main/java/com/gg/server/domain/item/data/UserItemRepository.java index 3a71e92e9..6fcab5174 100644 --- a/src/main/java/com/gg/server/domain/item/data/UserItemRepository.java +++ b/src/main/java/com/gg/server/domain/item/data/UserItemRepository.java @@ -9,6 +9,7 @@ public interface UserItemRepository extends JpaRepository { - @Query("select r from Receipt r where r.ownerIntraId = :intraId and (r.status = 'BEFORE' or r.status = 'USING') order by r.createdAt desc") + @Query("select r from Receipt r where r.ownerIntraId = :intraId " + + "and (r.status = 'BEFORE' or r.status = 'USING' or r.status = 'WAITING') order by r.createdAt desc") Page findByOwnerIntraId(@Param("intraId") String intraId, Pageable pageable); } From f89717d84f94e09963b022897790caf1d7916383 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Tue, 29 Aug 2023 19:37:05 +0900 Subject: [PATCH 129/273] [TEST] add profile image post test --- .../server/admin/user/dto/UserAdminDto.java | 5 +- .../user/dto/UserDetailAdminResponseDto.java | 8 ++-- .../admin/user/dto/UserSearchAdminDto.java | 2 +- .../admin/user/service/UserAdminService.java | 13 +++++- .../gg/server/domain/rank/dto/ExpRankDto.java | 5 +- .../domain/rank/service/RankService.java | 6 ++- .../com/gg/server/domain/user/data/User.java | 10 +--- .../domain/user/data/UserImageRepository.java | 4 +- .../user/dto/UserDetailResponseDto.java | 9 +++- .../gg/server/domain/user/dto/UserDto.java | 3 -- .../domain/user/service/UserService.java | 16 +++++-- .../server/global/security/UserPrincipal.java | 6 +-- .../service/CustomOAuth2UserService.java | 1 - .../server/global/utils/UserImageHandler.java | 13 +++--- .../utils/aws/AsyncNewUserImageUploader.java | 10 ++-- .../PenaltyAdminControllerTest.java | 4 +- .../domain/match/service/MatchTestUtils.java | 2 - .../controller/MegaphoneControllerTest.java | 8 ++-- .../user/controller/UserControllerTest.java | 46 ++++++++++++------- .../gg/server/game/GameControllerTest.java | 4 +- .../game/service/GameStatusServiceTest.java | 4 +- .../com/gg/server/utils/TestDataUtils.java | 7 +-- 22 files changed, 101 insertions(+), 85 deletions(-) diff --git a/src/main/java/com/gg/server/admin/user/dto/UserAdminDto.java b/src/main/java/com/gg/server/admin/user/dto/UserAdminDto.java index 30e12eb66..521f0c36e 100644 --- a/src/main/java/com/gg/server/admin/user/dto/UserAdminDto.java +++ b/src/main/java/com/gg/server/admin/user/dto/UserAdminDto.java @@ -1,6 +1,7 @@ package com.gg.server.admin.user.dto; import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserImage; import com.gg.server.domain.user.type.RacketType; import com.gg.server.domain.user.type.RoleType; import com.gg.server.domain.user.type.SnsType; @@ -19,7 +20,7 @@ public class UserAdminDto { private Integer totalExp; private SnsType snsNotiOpt; - static public UserAdminDto from (User user) { + static public UserAdminDto from (User user, UserImage userImage) { UserAdminDto userDto; if (user == null) { userDto = null; @@ -28,7 +29,7 @@ static public UserAdminDto from (User user) { .id(user.getId()) .intraId(user.getIntraId()) .eMail(user.getEMail()) - .imageUri(user.getImageUri()) + .imageUri(userImage.getImageUri()) .racketType(user.getRacketType()) .roleType(user.getRoleType()) .totalExp(user.getTotalExp()) diff --git a/src/main/java/com/gg/server/admin/user/dto/UserDetailAdminResponseDto.java b/src/main/java/com/gg/server/admin/user/dto/UserDetailAdminResponseDto.java index 819134d75..6bebf1a22 100644 --- a/src/main/java/com/gg/server/admin/user/dto/UserDetailAdminResponseDto.java +++ b/src/main/java/com/gg/server/admin/user/dto/UserDetailAdminResponseDto.java @@ -23,10 +23,10 @@ public class UserDetailAdminResponseDto { private Integer exp; private Integer coin; - public UserDetailAdminResponseDto(User user, RankRedis rank) { + public UserDetailAdminResponseDto(User user, String userImageUri, RankRedis rank) { this.userId = user.getId(); this.intraId = user.getIntraId(); - this.userImageUri = user.getImageUri(); + this.userImageUri = userImageUri; this.racketType = user.getRacketType().getCode(); this.statusMessage = rank.getStatusMessage(); this.wins = rank.getWins(); @@ -38,10 +38,10 @@ public UserDetailAdminResponseDto(User user, RankRedis rank) { this.coin = user.getGgCoin(); } - public UserDetailAdminResponseDto(User user) { + public UserDetailAdminResponseDto(User user, String userImageUri) { this.userId = user.getId(); this.intraId = user.getIntraId(); - this.userImageUri = user.getImageUri(); + this.userImageUri = userImageUri; this.racketType = user.getRacketType().getCode(); this.statusMessage = ""; this.wins = 0; diff --git a/src/main/java/com/gg/server/admin/user/dto/UserSearchAdminDto.java b/src/main/java/com/gg/server/admin/user/dto/UserSearchAdminDto.java index a354e9a96..7acb80653 100644 --- a/src/main/java/com/gg/server/admin/user/dto/UserSearchAdminDto.java +++ b/src/main/java/com/gg/server/admin/user/dto/UserSearchAdminDto.java @@ -22,7 +22,7 @@ public UserSearchAdminDto (User user, String statusMessage) { @Override public String toString() { - return "UserAdminDto{" + + return "{" + "id=" + id + ", intraId='" + intraId + '\'' + ", statusMessage='" + statusMessage + '\'' + diff --git a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java index d2438e87d..a666ba82d 100644 --- a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java +++ b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java @@ -16,8 +16,11 @@ import com.gg.server.domain.season.data.Season; import com.gg.server.domain.season.exception.SeasonNotFoundException; import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserImage; +import com.gg.server.domain.user.data.UserImageRepository; import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.service.UserFindService; +import com.gg.server.domain.user.service.UserService; import com.gg.server.global.utils.aws.AsyncNewUserImageUploader; import lombok.AllArgsConstructor; import org.springframework.data.domain.Page; @@ -42,6 +45,7 @@ public class UserAdminService { private final RankRedisAdminService rankRedisAdminService; private final AsyncNewUserImageUploader asyncNewUserImageUploader; private final UserFindService userFindService; + private final UserImageRepository userImageRepository; @Transactional(readOnly = true) public UserSearchAdminResponseDto searchAll(Pageable pageable) { @@ -78,9 +82,9 @@ public UserDetailAdminResponseDto getUserDetailByIntraId(String intraId) { try { RankRedis userCurrRank = rankRedisRepository.findRankByUserId(RedisKeyManager.getHashKey(currSeason.getId()), user.getId()); - return new UserDetailAdminResponseDto(user, userCurrRank); + return new UserDetailAdminResponseDto(user, getUserImageToString(user), userCurrRank); } catch (RedisDataNotFoundException e){ - return new UserDetailAdminResponseDto(user); + return new UserDetailAdminResponseDto(user, getUserImageToString(user)); } } @@ -113,4 +117,9 @@ private void updateUserRank(Long userId, Long currSeasonId, UserUpdateAdminReque RedisKeyManager.getZSetKey(currSeasonId), userId, userCurrRankRedis); } + + public String getUserImageToString(User user) { + UserImage userImage = userImageRepository.findTopByUserAndIsDeletedOrderById(user, false).orElse(null); + return userImage.toString(); + } } diff --git a/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java b/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java index ff854ffb8..3c15c1833 100644 --- a/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java +++ b/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java @@ -1,6 +1,7 @@ package com.gg.server.domain.rank.dto; import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserImage; import com.gg.server.global.utils.ExpLevelCalculator; import lombok.Builder; import lombok.Getter; @@ -15,14 +16,14 @@ public class ExpRankDto { private Integer exp; private String userImageUri; - public static ExpRankDto from (User user, Integer rank, String statusMessage){ + public static ExpRankDto from (User user, UserImage userImage, Integer rank, String statusMessage){ ExpRankDto dto = ExpRankDto.builder() .intraId(user.getIntraId()) .rank(user.getTotalExp() == 0 ? -1 : rank) .statusMessage(statusMessage) .level(ExpLevelCalculator.getLevel(user.getTotalExp())) .exp(user.getTotalExp()) - .userImageUri(user.getImageUri()) + .userImageUri(userImage.getImageUri()) .build(); return dto; } diff --git a/src/main/java/com/gg/server/domain/rank/service/RankService.java b/src/main/java/com/gg/server/domain/rank/service/RankService.java index a1bec3b06..b502e55a1 100644 --- a/src/main/java/com/gg/server/domain/rank/service/RankService.java +++ b/src/main/java/com/gg/server/domain/rank/service/RankService.java @@ -11,6 +11,8 @@ import com.gg.server.domain.season.data.Season; import com.gg.server.domain.season.service.SeasonFindService; import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserImage; +import com.gg.server.domain.user.data.UserImageRepository; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.global.exception.ErrorCode; @@ -34,6 +36,7 @@ public class RankService { private final UserRepository userRepository; private final RankRedisRepository redisRepository; private final SeasonFindService seasonFindService; + private final UserImageRepository userImageRepository; @Transactional(readOnly = true) public ExpRankPageResponseDto getExpRankPage(PageRequest pageRequest, UserDto curUser) { @@ -54,7 +57,8 @@ public ExpRankPageResponseDto getExpRankPage(PageRequest pageRequest, UserDto cu for(int i = 0; i < ranks.size(); i++) { RankRedis rank = ranks.get(i); User user = users.getContent().get(i); - expRankDtos.add(ExpRankDto.from(user, startRank + i, rank.getStatusMessage())); + UserImage userImageUri = userImageRepository.findTopByUserAndIsDeletedOrderById(user, false).orElse(null); + expRankDtos.add(ExpRankDto.from(user, userImageUri, startRank + i, rank.getStatusMessage())); } return new ExpRankPageResponseDto(myRank.intValue(), pageRequest.getPageNumber() + 1, users.getTotalPages(), expRankDtos); diff --git a/src/main/java/com/gg/server/domain/user/data/User.java b/src/main/java/com/gg/server/domain/user/data/User.java index 6daebe7ec..d1f9e27dd 100644 --- a/src/main/java/com/gg/server/domain/user/data/User.java +++ b/src/main/java/com/gg/server/domain/user/data/User.java @@ -25,9 +25,6 @@ public class User extends BaseTimeEntity implements Serializable { @Column(name = "e_mail", length = 60) private String eMail; - @Column(name = "image_uri") - private String imageUri; - @Enumerated(EnumType.STRING) @Column(name = "racket_type", length = 10) private RacketType racketType; @@ -62,11 +59,10 @@ public class User extends BaseTimeEntity implements Serializable { private EdgeType edge; @Builder - public User(String intraId, String eMail, String imageUri, RacketType racketType, + public User(String intraId, String eMail, RacketType racketType, RoleType roleType, Integer totalExp, SnsType snsNotiOpt, Long kakaoId) { this.intraId = intraId; this.eMail = eMail; - this.imageUri = imageUri; this.racketType = racketType; this.roleType = roleType; this.totalExp = totalExp; @@ -85,10 +81,6 @@ public void modifyUserDetail(UserUpdateAdminRequestDto updateReq) { this.ggCoin = updateReq.getCoin(); } - public void imageUpdate(String imageUri) { - this.imageUri = imageUri; - } - public void updateTypes(RacketType racketType, SnsType snsType) { this.racketType = racketType; this.snsNotiOpt = snsType; diff --git a/src/main/java/com/gg/server/domain/user/data/UserImageRepository.java b/src/main/java/com/gg/server/domain/user/data/UserImageRepository.java index 1342aeb97..7cc686ff5 100644 --- a/src/main/java/com/gg/server/domain/user/data/UserImageRepository.java +++ b/src/main/java/com/gg/server/domain/user/data/UserImageRepository.java @@ -2,6 +2,8 @@ import org.springframework.data.jpa.repository.JpaRepository; -public interface UserImageRepository extends JpaRepository { +import java.util.Optional; +public interface UserImageRepository extends JpaRepository { + Optional findTopByUserAndIsDeletedOrderById(User user, Boolean isDeleted); } diff --git a/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java b/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java index 254cf93fb..cea2f8d45 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java @@ -1,6 +1,8 @@ package com.gg.server.domain.user.dto; import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.type.BackgroundType; +import com.gg.server.domain.user.type.EdgeType; import com.gg.server.domain.user.type.SnsType; import com.gg.server.global.utils.ExpLevelCalculator; import lombok.*; @@ -17,10 +19,13 @@ public class UserDetailResponseDto { private Integer maxExp; private Double expRate; private SnsType snsNotiOpt; + private BackgroundType background; + private String textColor; + private EdgeType edge; - public UserDetailResponseDto(User user, String statusMessage) { + public UserDetailResponseDto(User user, String userImageUri, String statusMessage) { this.intraId = user.getIntraId(); - this.userImageUri = user.getImageUri(); + this.userImageUri = userImageUri; this.racketType = user.getRacketType().getCode(); this.statusMessage = statusMessage; this.snsNotiOpt = user.getSnsNotiOpt(); diff --git a/src/main/java/com/gg/server/domain/user/dto/UserDto.java b/src/main/java/com/gg/server/domain/user/dto/UserDto.java index f6d24c3df..393aeaa6a 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserDto.java @@ -13,7 +13,6 @@ public class UserDto { private Long id; private String intraId; private String eMail; - private String imageUri; private RacketType racketType; private RoleType roleType; private Integer totalExp; @@ -31,7 +30,6 @@ static public UserDto from (User user) { .id(user.getId()) .intraId(user.getIntraId()) .eMail(user.getEMail()) - .imageUri(user.getImageUri()) .racketType(user.getRacketType()) .roleType(user.getRoleType()) .totalExp(user.getTotalExp()) @@ -49,7 +47,6 @@ public String toString() { "id=" + id + ", intraId='" + intraId + '\'' + ", eMail='" + eMail + '\'' + - ", imageUri='" + imageUri + '\'' + ", racketType=" + racketType + ", roleType=" + roleType + ", totalExp=" + totalExp + diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 1d15de7d8..302bc33a1 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -28,6 +28,8 @@ import com.gg.server.domain.season.data.Season; import com.gg.server.domain.season.service.SeasonFindService; import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserImage; +import com.gg.server.domain.user.data.UserImageRepository; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.*; import com.gg.server.domain.user.exception.*; @@ -69,6 +71,7 @@ public class UserService { private final CoinPolicyRepository coinPolicyRepository; private final ReceiptRepository receiptRepository; private final AsyncNewUserImageUploader asyncNewUserImageUploader; + private final UserImageRepository userImageRepository; private final String ATTENDANCE = "ATTENDANCE"; @@ -125,7 +128,7 @@ else if (game.getStatus() == StatusType.END) { public UserDetailResponseDto getUserDetail(String targetUserIntraId) { User targetUser = userFindService.findByIntraId(targetUserIntraId); String statusMessage = userFindService.getUserStatusMessage(targetUser); - return new UserDetailResponseDto(targetUser, statusMessage); + return new UserDetailResponseDto(targetUser, getUserImageToString(targetUser), statusMessage); } @Transactional @@ -228,7 +231,7 @@ public UserImageResponseDto getRankedUserImagesByPPP(Long seasonId) { List userImages = new ArrayList<>(); userIds.forEach(userId -> { User user = users.stream().filter(u -> u.getId().equals(userId)).findFirst().orElseThrow(UserNotFoundException::new); - userImages.add(new UserImageDto(user.getId(), user.getImageUri(), LocalDateTime.now(), false)); + userImages.add(new UserImageDto(user.getId(), getUserImageToString(user), LocalDateTime.now(), false)); }); return new UserImageResponseDto(userImages); } catch (RedisDataNotFoundException ex) { @@ -240,7 +243,7 @@ public UserImageResponseDto getRankedUserImagesByExp(PageRequest pageRequest) { List users = userRepository.findAll(pageRequest).getContent(); List userImages = new ArrayList<>(); for (User user : users) { - userImages.add(new UserImageDto(user.getId(), user.getImageUri(), LocalDateTime.now(), false)); + userImages.add(new UserImageDto(user.getId(), getUserImageToString(user), LocalDateTime.now(), false)); } return new UserImageResponseDto(userImages); } @@ -266,7 +269,7 @@ public UserNormalDetailResponseDto getUserNormalDetail(UserDto user) { LocalDateTime startOfDay = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0); LocalDateTime endOfDay = LocalDateTime.now().withHour(23).withMinute(59).withSecond(59); Boolean isAttended = coinHistoryRepository.existsCoinHistoryByUserAndHistoryAndCreatedAtToday(loginUser, ATTENDANCE, startOfDay, endOfDay); - return new UserNormalDetailResponseDto(user.getIntraId(), user.getImageUri(), isAdmin, isAttended); + return new UserNormalDetailResponseDto(user.getIntraId(), getUserImageToString(loginUser), isAdmin, isAttended); } @Transactional() @@ -348,4 +351,9 @@ public void checkUseStatus(Receipt receipt) { if (!receipt.getStatus().equals(ItemStatus.BEFORE)) throw new ItemStatusException(); } + + public String getUserImageToString(User user) { + UserImage userImage = userImageRepository.findTopByUserAndIsDeletedOrderById(user, false).orElse(null); + return userImage.toString(); + } } diff --git a/src/main/java/com/gg/server/global/security/UserPrincipal.java b/src/main/java/com/gg/server/global/security/UserPrincipal.java index f4e1a03a6..30eb2236e 100644 --- a/src/main/java/com/gg/server/global/security/UserPrincipal.java +++ b/src/main/java/com/gg/server/global/security/UserPrincipal.java @@ -14,14 +14,12 @@ public class UserPrincipal implements OAuth2User, UserDetails { private final Long id; private final String nickname; - private final String profileImg; private final Collection authorities; private Map attributes; - public UserPrincipal(Long id, String nickname, String profileImg, Collection authorities) { + public UserPrincipal(Long id, String nickname, Collection authorities) { this.id = id; this.nickname = nickname; - this.profileImg = profileImg; this.authorities = authorities; } @@ -33,7 +31,7 @@ public static UserPrincipal create(User user) { authorities.add(new SimpleGrantedAuthority(RoleType.USER.getKey())); authorities.add(new SimpleGrantedAuthority(RoleType.ADMIN.getKey())); } - return new UserPrincipal(user.getId(), user.getIntraId(), user.getImageUri(), authorities); + return new UserPrincipal(user.getId(), user.getIntraId(), authorities); } public static UserPrincipal create(User user, Map attributes) { diff --git a/src/main/java/com/gg/server/global/security/service/CustomOAuth2UserService.java b/src/main/java/com/gg/server/global/security/service/CustomOAuth2UserService.java index 1fdd80a79..fb8525a74 100644 --- a/src/main/java/com/gg/server/global/security/service/CustomOAuth2UserService.java +++ b/src/main/java/com/gg/server/global/security/service/CustomOAuth2UserService.java @@ -94,7 +94,6 @@ private User createUser(OAuthUserInfo userInfo) { User user = User.builder() .intraId(userInfo.getIntraId()) .roleType(userInfo.getRoleType()) - .imageUri(userInfo.getImageUrl()) .kakaoId(userInfo.getKakaoId()) .snsNotiOpt(SnsType.EMAIL) .racketType(RacketType.NONE) diff --git a/src/main/java/com/gg/server/global/utils/UserImageHandler.java b/src/main/java/com/gg/server/global/utils/UserImageHandler.java index 4e6e75369..da5e094a0 100644 --- a/src/main/java/com/gg/server/global/utils/UserImageHandler.java +++ b/src/main/java/com/gg/server/global/utils/UserImageHandler.java @@ -2,10 +2,11 @@ import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.model.CannedAccessControlList; -import com.amazonaws.services.s3.model.DeleteObjectRequest; import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.PutObjectRequest; import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserImage; +import com.gg.server.domain.user.data.UserImageRepository; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; @@ -19,9 +20,11 @@ public class UserImageHandler { private final AmazonS3 amazonS3; private final FileDownloader fileDownloader; - public UserImageHandler(AmazonS3 amazonS3, FileDownloader fileDownloader) { + public UserImageHandler(AmazonS3 amazonS3, FileDownloader fileDownloader, + UserImageRepository userImageRepository) { this.amazonS3 = amazonS3; this.fileDownloader = fileDownloader; + this.userImageRepository = userImageRepository; } @Value("${cloud.aws.s3.bucket}") @@ -32,6 +35,7 @@ public UserImageHandler(AmazonS3 amazonS3, FileDownloader fileDownloader) { @Value("${info.image.defaultUrl}") private String defaultImageUrl; + private final UserImageRepository userImageRepository; public String uploadAndGetS3ImageUri(String intraId, String imageUrl) { if (!isStringValid(intraId) || !isStringValid(imageUrl)) { @@ -49,15 +53,12 @@ public String uploadAndGetS3ImageUri(String intraId, String imageUrl) { public String updateAndGetS3ImageUri(MultipartFile multipartFile, User user) throws IOException { - String imageUrl = user.getImageUri(); - String userFileName = imageUrl.split("/")[imageUrl.split("/").length - 1]; + UserImage userImage = userImageRepository.findTopByUserAndIsDeletedOrderById(user, false).orElse(null); String updateFileName = user.getIntraId() + "-" + UUID.randomUUID().toString() + ".jpeg"; if (updateFileName.equals("small_default.jpeg")) return defaultImageUrl; else { String s3ImageUrl = uploadToS3(multipartFile, updateFileName);; -// if (!imageUrl.equals(defaultImageUrl)) -// amazonS3.deleteObject(new DeleteObjectRequest(bucketName, dir + userFileName)); return s3ImageUrl; } } diff --git a/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java b/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java index ac2eee61d..f2843c4d2 100644 --- a/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java +++ b/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java @@ -43,12 +43,9 @@ public void upload(String intraId, String imageUrl) { return ; } userRepository.findByIntraId(intraId).ifPresent(user -> { - if (s3ImageUrl == null) { - user.imageUpdate(defaultImageUrl); - } else { - user.imageUpdate(s3ImageUrl); - } - userRepository.save(user); + UserImage userImage = new UserImage(user, (s3ImageUrl != null) ? s3ImageUrl : defaultImageUrl, + LocalDateTime.now(), false); + userImageRepository.save(userImage); }); } @@ -59,6 +56,5 @@ public void update(String intraId, MultipartFile multipartFile) throws IOExcepti s3ImageUrl = s3ImageUrl == null ? defaultImageUrl : s3ImageUrl; UserImage userImage = new UserImage(user, s3ImageUrl, LocalDateTime.now(), false); userImageRepository.saveAndFlush(userImage); - } } diff --git a/src/test/java/com/gg/server/admin/penalty/controller/PenaltyAdminControllerTest.java b/src/test/java/com/gg/server/admin/penalty/controller/PenaltyAdminControllerTest.java index 5404fe23f..b70cad13b 100644 --- a/src/test/java/com/gg/server/admin/penalty/controller/PenaltyAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/penalty/controller/PenaltyAdminControllerTest.java @@ -205,14 +205,14 @@ public void checkPaginationWithKeyword() throws Exception { for (int i = 0; i < 20; i++) { String intraId = UUID.randomUUID().toString().substring(0, 4) + "test" + UUID.randomUUID().toString() .substring(0, 4); - User newUser = testDataUtils.createNewUser(intraId, "test", "test", RacketType.NONE, SnsType.EMAIL, + User newUser = testDataUtils.createNewUser(intraId, "test", RacketType.NONE, SnsType.EMAIL, RoleType.USER); users.add(newUser); penaltyAdminService.givePenalty(newUser.getIntraId(), 3, "test" + String.valueOf(i)); } for (int i = 0; i < 20; i++) { String intraId = "dummy" + String.valueOf(i); - User newUser = testDataUtils.createNewUser(intraId, "test", "test", RacketType.NONE, SnsType.EMAIL, + User newUser = testDataUtils.createNewUser(intraId, "test", RacketType.NONE, SnsType.EMAIL, RoleType.USER); users.add(newUser); penaltyAdminService.givePenalty(newUser.getIntraId(), 3, "test" + String.valueOf(i)); diff --git a/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java b/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java index 27c5abe65..e681e3d7d 100644 --- a/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java +++ b/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java @@ -34,7 +34,6 @@ public User createUser() { User user = User.builder() .eMail("email") .intraId(randomId) - .imageUri("image") .racketType(RacketType.PENHOLDER) .snsNotiOpt(SnsType.NONE) .roleType(RoleType.USER) @@ -49,7 +48,6 @@ public User createGuestUser() { User user = User.builder() .eMail("email") .intraId(randomId) - .imageUri("image") .racketType(RacketType.PENHOLDER) .snsNotiOpt(SnsType.NONE) .roleType(RoleType.GUEST) diff --git a/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java b/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java index 477227b15..8793d8973 100644 --- a/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java +++ b/src/test/java/com/gg/server/domain/megaphone/controller/MegaphoneControllerTest.java @@ -57,8 +57,7 @@ class MegaphoneControllerTest { void getAnnouncementList() throws Exception { String intraId = "intra"; String email = "email"; - String imageUrl = "imageUrl"; - User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, + User newUser = testDataUtils.createNewUser(intraId, email, RacketType.PENHOLDER, SnsType.BOTH, RoleType.ADMIN); String accessToken = tokenProvider.createToken(newUser.getId()); // db에 저장해두고 테스트 @@ -86,7 +85,7 @@ public void deleteMegaphoneTest() throws Exception { String intraId = "intra"; String email = "email"; String imageUrl = "imageUrl"; - User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, + User newUser = testDataUtils.createNewUser(intraId, email, RacketType.PENHOLDER, SnsType.BOTH, RoleType.ADMIN); String accessToken = tokenProvider.createToken(newUser.getId()); Receipt receipt = receiptRepository.findById(2L).get(); @@ -107,8 +106,7 @@ public void deleteMegaphoneTest() throws Exception { void getMegaphoneDetailTest() throws Exception { String intraId = "intra"; String email = "email"; - String imageUrl = "imageUrl"; - User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, + User newUser = testDataUtils.createNewUser(intraId, email, RacketType.PENHOLDER, SnsType.BOTH, RoleType.ADMIN); String accessToken = tokenProvider.createToken(newUser.getId()); Receipt receipt = receiptRepository.findById(1L).get(); diff --git a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java index a89c50b90..122ae6c3c 100644 --- a/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java +++ b/src/test/java/com/gg/server/domain/user/controller/UserControllerTest.java @@ -18,10 +18,13 @@ import com.gg.server.domain.rank.redis.RedisKeyManager; import com.gg.server.domain.receipt.data.Receipt; import com.gg.server.domain.receipt.data.ReceiptRepository; +import com.gg.server.domain.receipt.exception.ReceiptNotFoundException; import com.gg.server.domain.receipt.type.ItemStatus; import com.gg.server.domain.season.data.Season; import com.gg.server.domain.season.data.SeasonRepository; import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserImage; +import com.gg.server.domain.user.data.UserImageRepository; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.controller.dto.GameInfoDto; import com.gg.server.domain.user.dto.*; @@ -33,6 +36,7 @@ import org.junit.jupiter.api.AfterEach; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.http.MediaType; +import org.springframework.mock.web.MockMultipartFile; import org.springframework.test.web.servlet.MockMvc; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; import com.gg.server.utils.TestDataUtils; @@ -43,6 +47,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; +import java.io.FileInputStream; import java.time.LocalDateTime; import java.util.Arrays; import java.util.Comparator; @@ -164,8 +169,7 @@ public void userNormalDetail() throws Exception { String intraId = "intra"; String email = "email"; String imageUrl = "imageUrl"; - User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, - SnsType.BOTH, RoleType.ADMIN); + User newUser = testDataUtils.createNewUser(intraId, email, RacketType.PENHOLDER, SnsType.BOTH, RoleType.ADMIN); String accessToken = tokenProvider.createToken(newUser.getId()); //when @@ -187,10 +191,9 @@ public void searchUser() throws Exception { //given String intraId[] = {"intraId", "2intra2", "2intra", "aaaa", "bbbb"}; String email = "email"; - String imageUrl = "imageUrl"; User user = null; for (String intra : intraId) { - user = testDataUtils.createNewUser(intra, email, imageUrl, RacketType.PENHOLDER, + user = testDataUtils.createNewUser(intra, email, RacketType.PENHOLDER, SnsType.BOTH, RoleType.ADMIN); } String accessToken = tokenProvider.createToken(user.getId()); @@ -216,8 +219,7 @@ public void getUserDetail() throws Exception { String email = "email"; String imageUrl = "imageUrl"; String statusMessage = "statusMessage"; - User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, - SnsType.BOTH, RoleType.ADMIN); + User newUser = testDataUtils.createNewUser(intraId, email, RacketType.PENHOLDER, SnsType.BOTH, RoleType.USER); String accessToken = tokenProvider.createToken(newUser.getId()); testDataUtils.createUserRank(newUser, statusMessage, season); String url = "/pingpong/users/" + newUser.getIntraId(); @@ -303,8 +305,7 @@ public void updateUser() throws Exception { String intraId = "intraId"; String email = "email"; String imageUrl = "imageUrl"; - User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, - SnsType.BOTH, RoleType.ADMIN); + User newUser = testDataUtils.createNewUser(intraId, email, RacketType.PENHOLDER, SnsType.BOTH, RoleType.USER); String statusMessage = "statusMessage"; testDataUtils.createUserRank(newUser, statusMessage, season); String accessToken = tokenProvider.createToken(newUser.getId()); @@ -361,9 +362,7 @@ public void updateTextColorTest() throws Exception { Season season = testDataUtils.createSeason(); String intraId = "intraId"; String email = "email"; - String imageUrl = "imageUrl"; - User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, - SnsType.BOTH, RoleType.ADMIN); + User newUser = testDataUtils.createNewUser(intraId, email, RacketType.PENHOLDER, SnsType.BOTH, RoleType.USER); String statusMessage = "statusMessage"; testDataUtils.createUserRank(newUser, statusMessage, season); String accessToken = tokenProvider.createToken(newUser.getId()); @@ -393,9 +392,7 @@ public void updateEdgeTest() throws Exception { Season season = testDataUtils.createSeason(); String intraId = "intraId"; String email = "email"; - String imageUrl = "imageUrl"; - User newUser = testDataUtils.createNewUser(intraId, email, imageUrl, RacketType.PENHOLDER, - SnsType.BOTH, RoleType.ADMIN); + User newUser = testDataUtils.createNewUser(intraId, email, RacketType.PENHOLDER, SnsType.BOTH, RoleType.USER); String statusMessage = "statusMessage"; testDataUtils.createUserRank(newUser, statusMessage, season); String accessToken = tokenProvider.createToken(newUser.getId()); @@ -447,9 +444,7 @@ public void updateBackgroundTest() throws Exception { Season season = testDataUtils.createSeason(); String intraId = "intraId"; String email = "email"; - String imageUri = "imageUri"; - User newUser = testDataUtils.createNewUser(intraId, email, imageUri, RacketType.PENHOLDER, - SnsType.BOTH, RoleType.USER); + User newUser = testDataUtils.createNewUser(intraId, email, RacketType.PENHOLDER, SnsType.BOTH, RoleType.USER); String statusMessage = "statusMessage"; testDataUtils.createUserRank(newUser, statusMessage, season); String accessToken = tokenProvider.createToken(newUser.getId()); @@ -499,4 +494,21 @@ public void getUserCoinHistory() throws Exception { System.out.println(temp.getHistory() + " " + temp.getAmount() + " " + temp.getCreatedAt()); } } + + @Test + @DisplayName("[post]/pingpong/users/profile-image") + public void getUserImage() throws Exception { + String accessToken = testDataUtils.getLoginAccessToken(); + Receipt receipt = receiptRepository.findById(7L).orElseThrow(ReceiptNotFoundException::new); + MockMultipartFile image = new MockMultipartFile("profileImage", "imagefile.jpeg", "image/jpeg", "<>".getBytes()); + MockMultipartFile jsonFile = new MockMultipartFile("userProfileImageDto", "", "application/json", ("{\"receiptId\": " + receipt.getId() + "}").getBytes()); + + String contentAsString = mockMvc.perform(multipart("/pingpong/users/profile-image") + .file(image) + .file(jsonFile) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isNoContent()) + .andReturn().getResponse().getContentAsString(); + AssertionsForClassTypes.assertThat(receipt.getStatus()).isEqualTo(ItemStatus.USED); + } } diff --git a/src/test/java/com/gg/server/game/GameControllerTest.java b/src/test/java/com/gg/server/game/GameControllerTest.java index 54309ab77..93675d064 100644 --- a/src/test/java/com/gg/server/game/GameControllerTest.java +++ b/src/test/java/com/gg/server/game/GameControllerTest.java @@ -98,9 +98,9 @@ public class GameControllerTest { void init() { season = seasonRepository.save(new Season("test season", LocalDateTime.of(2023, 5, 14, 0, 0), LocalDateTime.of(2999, 12, 31, 23, 59), 1000, 100)); - user1 = testDataUtils.createNewUser("test1", "test1@email", "null1", RacketType.NONE, SnsType.EMAIL, RoleType.USER); + user1 = testDataUtils.createNewUser("test1", "test1@email", RacketType.NONE, SnsType.EMAIL, RoleType.USER); accessToken = tokenProvider.createToken(user1.getId()); - user2 = testDataUtils.createNewUser("test2", "test2@email", "null1", RacketType.NONE, SnsType.EMAIL, RoleType.USER); + user2 = testDataUtils.createNewUser("test2", "test2@email", RacketType.NONE, SnsType.EMAIL, RoleType.USER); rankRepository.save(Rank.from(user1, season, season.getStartPpp())); rankRepository.save(Rank.from(user2, season, season.getStartPpp())); RankRedis userRank = RankRedis.from(UserDto.from(user1), season.getStartPpp()); diff --git a/src/test/java/com/gg/server/game/service/GameStatusServiceTest.java b/src/test/java/com/gg/server/game/service/GameStatusServiceTest.java index 39fe6f1ee..fc011c887 100644 --- a/src/test/java/com/gg/server/game/service/GameStatusServiceTest.java +++ b/src/test/java/com/gg/server/game/service/GameStatusServiceTest.java @@ -56,8 +56,8 @@ public class GameStatusServiceTest { void init() { season = seasonRepository.save(new Season("test season", LocalDateTime.of(2023, 5, 14, 0, 0), LocalDateTime.of(2999, 12, 31, 23, 59), 1000, 100)); - user1 = testDataUtils.createNewUser("test2", "test2@naver.com", "null1", RacketType.NONE, SnsType.EMAIL, RoleType.USER); - user2 = testDataUtils.createNewUser("test3", "test3@naver.com", "null1", RacketType.NONE, SnsType.EMAIL, RoleType.USER); + user1 = testDataUtils.createNewUser("test2", "test2@naver.com", RacketType.NONE, SnsType.EMAIL, RoleType.USER); + user2 = testDataUtils.createNewUser("test3", "test3@naver.com", RacketType.NONE, SnsType.EMAIL, RoleType.USER); LocalDateTime now = LocalDateTime.now(); LocalDateTime startTime = LocalDateTime.of(now.getYear(), now.getMonthValue(), now.getDayOfMonth(), now.getHour(), now.getMinute()); game1 = gameRepository.save(new Game(season, StatusType.BEFORE, Mode.RANK, startTime, startTime.plusMinutes(15))); diff --git a/src/test/java/com/gg/server/utils/TestDataUtils.java b/src/test/java/com/gg/server/utils/TestDataUtils.java index 11f043fd4..67cd49b8b 100644 --- a/src/test/java/com/gg/server/utils/TestDataUtils.java +++ b/src/test/java/com/gg/server/utils/TestDataUtils.java @@ -51,7 +51,6 @@ public String getLoginAccessToken() { User user = User.builder() .eMail("email") .intraId("intraId") - .imageUri("image") .racketType(RacketType.PENHOLDER) .snsNotiOpt(SnsType.NONE) .roleType(RoleType.USER) @@ -65,7 +64,6 @@ public String getAdminLoginAccessToken() { User user = User.builder() .eMail("email") .intraId("intraId") - .imageUri("image") .racketType(RacketType.PENHOLDER) .snsNotiOpt(SnsType.NONE) .roleType(RoleType.ADMIN) @@ -80,7 +78,6 @@ public User createNewUser(){ User user = User.builder() .eMail("email") .intraId(randomId) - .imageUri("image") .racketType(RacketType.PENHOLDER) .snsNotiOpt(SnsType.NONE) .roleType(RoleType.USER) @@ -90,12 +87,11 @@ public User createNewUser(){ return user; } - public User createNewUser(String intraId, String email, String imageUrl, RacketType racketType, + public User createNewUser(String intraId, String email, RacketType racketType, SnsType snsType, RoleType roleType){ User user = User.builder() .eMail(email) .intraId(intraId) - .imageUri(imageUrl) .racketType(racketType) .snsNotiOpt(snsType) .roleType(roleType) @@ -110,7 +106,6 @@ public User createNewUser(int totalExp){ User user = User.builder() .eMail("email") .intraId(randomId) - .imageUri("image") .racketType(RacketType.PENHOLDER) .snsNotiOpt(SnsType.NONE) .roleType(RoleType.USER) From 99d73ade4815538db41bd95a25729006db123782 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Wed, 30 Aug 2023 04:22:03 +0900 Subject: [PATCH 130/273] [FIX] renamed to V2.5 migration --- ...r_image_uri.sql => V2.5__add_userImage_and_user_image_uri.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/resources/db/migration/{V2.4__add_userImage_and_user_image_uri.sql => V2.5__add_userImage_and_user_image_uri.sql} (100%) diff --git a/src/main/resources/db/migration/V2.4__add_userImage_and_user_image_uri.sql b/src/main/resources/db/migration/V2.5__add_userImage_and_user_image_uri.sql similarity index 100% rename from src/main/resources/db/migration/V2.4__add_userImage_and_user_image_uri.sql rename to src/main/resources/db/migration/V2.5__add_userImage_and_user_image_uri.sql From 7714ba8e5667241cfc76b539487111c765c8d664 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Wed, 30 Aug 2023 15:31:52 +0900 Subject: [PATCH 131/273] =?UTF-8?q?[REFACTOR]=20=EC=9D=B8=EA=B8=B0?= =?UTF-8?q?=EC=88=9C=20=EC=A0=95=EB=A0=AC=EC=9D=84=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=EC=9D=BC=EC=9E=90=20=EC=88=9C=20=EC=A0=95=EB=A0=AC=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/item/data/ItemRepository.java | 8 +++----- .../com/gg/server/domain/item/service/ItemService.java | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gg/server/domain/item/data/ItemRepository.java b/src/main/java/com/gg/server/domain/item/data/ItemRepository.java index 4852d74fa..ef6f26fd8 100644 --- a/src/main/java/com/gg/server/domain/item/data/ItemRepository.java +++ b/src/main/java/com/gg/server/domain/item/data/ItemRepository.java @@ -2,11 +2,9 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; - import java.util.List; public interface ItemRepository extends JpaRepository { - @Query("SELECT i FROM Item i " + "LEFT JOIN Receipt r ON r.item = i " + "WHERE i.isVisible = true " + - "GROUP BY i " + "ORDER BY COALESCE(COUNT(r), 0) DESC, i.createdAt DESC") - List findAllByPopDesc(); -} \ No newline at end of file + @Query("SELECT i FROM Item i WHERE i.isVisible = true ORDER BY i.createdAt DESC") + List findAllByCreatedAtDesc(); +} diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index 62abade68..63286fb8b 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -39,7 +39,7 @@ public class ItemService { @Transactional(readOnly = true) public ItemStoreListResponseDto getAllItems() { - List itemStoreListResponseDto = itemRepository.findAllByPopDesc() + List itemStoreListResponseDto = itemRepository.findAllByCreatedAtDesc() .stream().map(ItemStoreResponseDto::new).collect(Collectors.toList()); return new ItemStoreListResponseDto(itemStoreListResponseDto); } From 505f7d8d7fa8f1b49efb9e05605dcc2a0b97e0f1 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Thu, 31 Aug 2023 16:54:12 +0900 Subject: [PATCH 132/273] =?UTF-8?q?[REFACOTR]=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=EB=B3=84=20=EC=95=84=EC=9D=B4=ED=85=9C=20=EB=B3=B4=EA=B4=80?= =?UTF-8?q?=ED=95=A8=20=EC=A1=B0=ED=9A=8C=EC=97=90=20itemType=EB=8F=84=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/item/dto/UserItemResponseDto.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/gg/server/domain/item/dto/UserItemResponseDto.java b/src/main/java/com/gg/server/domain/item/dto/UserItemResponseDto.java index 653f1d159..a2e5d49bd 100644 --- a/src/main/java/com/gg/server/domain/item/dto/UserItemResponseDto.java +++ b/src/main/java/com/gg/server/domain/item/dto/UserItemResponseDto.java @@ -1,6 +1,7 @@ package com.gg.server.domain.item.dto; import com.gg.server.domain.item.data.Item; +import com.gg.server.domain.item.type.ItemType; import com.gg.server.domain.receipt.data.Receipt; import com.gg.server.domain.receipt.type.ItemStatus; import lombok.AllArgsConstructor; @@ -16,6 +17,7 @@ public class UserItemResponseDto { private String imageUri; private String purchaserIntra; private ItemStatus itemStatus; + private ItemType itemType; public UserItemResponseDto(Receipt receipt) { Item item = receipt.getItem(); @@ -24,6 +26,7 @@ public UserItemResponseDto(Receipt receipt) { this.imageUri = item.getImageUri(); this.purchaserIntra = receipt.getPurchaserIntraId(); this.itemStatus = receipt.getStatus(); + this.itemType = item.getType(); } } \ No newline at end of file From efd4d768498df9f1748d6ad7fcb40be9deb0591e Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Fri, 1 Sep 2023 09:02:56 +0900 Subject: [PATCH 133/273] [FIX] fix userimageresponsedto --- .../com/gg/server/admin/user/service/UserAdminService.java | 2 +- .../com/gg/server/domain/rank/service/RankService.java | 3 ++- .../gg/server/domain/user/controller/UserController.java | 4 ++-- .../gg/server/domain/user/data/UserImageRepository.java | 2 +- .../gg/server/domain/user/dto/UserDetailResponseDto.java | 3 +++ ...rofileImageDto.java => UserProfileImageRequestDto.java} | 2 +- .../com/gg/server/domain/user/service/UserService.java | 7 +++---- .../java/com/gg/server/global/utils/UserImageHandler.java | 2 +- 8 files changed, 14 insertions(+), 11 deletions(-) rename src/main/java/com/gg/server/domain/user/dto/{UserProfileImageDto.java => UserProfileImageRequestDto.java} (86%) diff --git a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java index a666ba82d..9594865fd 100644 --- a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java +++ b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java @@ -119,7 +119,7 @@ private void updateUserRank(Long userId, Long currSeasonId, UserUpdateAdminReque } public String getUserImageToString(User user) { - UserImage userImage = userImageRepository.findTopByUserAndIsDeletedOrderById(user, false).orElse(null); + UserImage userImage = userImageRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElse(null); return userImage.toString(); } } diff --git a/src/main/java/com/gg/server/domain/rank/service/RankService.java b/src/main/java/com/gg/server/domain/rank/service/RankService.java index b502e55a1..469ae65df 100644 --- a/src/main/java/com/gg/server/domain/rank/service/RankService.java +++ b/src/main/java/com/gg/server/domain/rank/service/RankService.java @@ -15,6 +15,7 @@ import com.gg.server.domain.user.data.UserImageRepository; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.domain.user.exception.UserImageNullException; import com.gg.server.global.exception.ErrorCode; import com.gg.server.global.exception.custom.PageNotFoundException; import lombok.RequiredArgsConstructor; @@ -57,7 +58,7 @@ public ExpRankPageResponseDto getExpRankPage(PageRequest pageRequest, UserDto cu for(int i = 0; i < ranks.size(); i++) { RankRedis rank = ranks.get(i); User user = users.getContent().get(i); - UserImage userImageUri = userImageRepository.findTopByUserAndIsDeletedOrderById(user, false).orElse(null); + UserImage userImageUri = userImageRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElseThrow(UserImageNullException::new); expRankDtos.add(ExpRankDto.from(user, userImageUri, startRank + i, rank.getStatusMessage())); } diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index 0cc2fe115..791e89355 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -155,9 +155,9 @@ public ResponseEntity getUserCoinHistory(@ModelA @PostMapping(path = "/profile-image", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE, MediaType.APPLICATION_JSON_VALUE}) public ResponseEntity updateUserProfileImage(@RequestPart(required = false) MultipartFile profileImage, - @RequestPart @Valid UserProfileImageDto userProfileImageDto, + @RequestPart @Valid UserProfileImageRequestDto userProfileImageRequestDto, @Parameter(hidden = true) @Login UserDto user) throws IOException { - userService.updateUserProfileImage(user, userProfileImageDto, profileImage); + userService.updateUserProfileImage(user, userProfileImageRequestDto, profileImage); return new ResponseEntity(HttpStatus.NO_CONTENT); } } diff --git a/src/main/java/com/gg/server/domain/user/data/UserImageRepository.java b/src/main/java/com/gg/server/domain/user/data/UserImageRepository.java index 7cc686ff5..a777fb7b2 100644 --- a/src/main/java/com/gg/server/domain/user/data/UserImageRepository.java +++ b/src/main/java/com/gg/server/domain/user/data/UserImageRepository.java @@ -5,5 +5,5 @@ import java.util.Optional; public interface UserImageRepository extends JpaRepository { - Optional findTopByUserAndIsDeletedOrderById(User user, Boolean isDeleted); + Optional findTopByUserAndIsDeletedOrderByIdDesc(User user, Boolean isDeleted); } diff --git a/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java b/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java index cea2f8d45..5add19d86 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java @@ -29,6 +29,9 @@ public UserDetailResponseDto(User user, String userImageUri, String statusMessag this.racketType = user.getRacketType().getCode(); this.statusMessage = statusMessage; this.snsNotiOpt = user.getSnsNotiOpt(); + this.background= user.getBackground(); + this.textColor = user.getTextColor(); + this.edge = user.getEdge(); calculateExpAndLevel(user); } diff --git a/src/main/java/com/gg/server/domain/user/dto/UserProfileImageDto.java b/src/main/java/com/gg/server/domain/user/dto/UserProfileImageRequestDto.java similarity index 86% rename from src/main/java/com/gg/server/domain/user/dto/UserProfileImageDto.java rename to src/main/java/com/gg/server/domain/user/dto/UserProfileImageRequestDto.java index 65857268d..7666b2afe 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserProfileImageDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserProfileImageRequestDto.java @@ -9,7 +9,7 @@ @Getter @AllArgsConstructor @NoArgsConstructor -public class UserProfileImageDto { +public class UserProfileImageRequestDto { @NotNull private Long receiptId; } diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 302bc33a1..a816dcf1c 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -36,7 +36,6 @@ import com.gg.server.domain.user.type.*; import com.gg.server.global.utils.aws.AsyncNewUserImageUploader; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -317,9 +316,9 @@ public void updateBackground(UserDto user, UserBackgroundDto userBackgroundDto) } @Transactional - public void updateUserProfileImage(UserDto user, UserProfileImageDto userProfileImageDto, MultipartFile userImageFile) throws IOException { + public void updateUserProfileImage(UserDto user, UserProfileImageRequestDto userProfileImageRequestDto, MultipartFile userImageFile) throws IOException { User userId = userRepository.findById(user.getId()).orElseThrow(UserNotFoundException::new); - Receipt receipt = receiptRepository.findById(userProfileImageDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); + Receipt receipt = receiptRepository.findById(userProfileImageRequestDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); checkOwner(userId, receipt); checkItemType(receipt, ItemType.PROFILE_IMAGE); @@ -353,7 +352,7 @@ public void checkUseStatus(Receipt receipt) { } public String getUserImageToString(User user) { - UserImage userImage = userImageRepository.findTopByUserAndIsDeletedOrderById(user, false).orElse(null); + UserImage userImage = userImageRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElse(null); return userImage.toString(); } } diff --git a/src/main/java/com/gg/server/global/utils/UserImageHandler.java b/src/main/java/com/gg/server/global/utils/UserImageHandler.java index da5e094a0..a29e0037d 100644 --- a/src/main/java/com/gg/server/global/utils/UserImageHandler.java +++ b/src/main/java/com/gg/server/global/utils/UserImageHandler.java @@ -7,6 +7,7 @@ import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserImage; import com.gg.server.domain.user.data.UserImageRepository; +import com.gg.server.domain.user.exception.UserImageNullException; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; @@ -53,7 +54,6 @@ public String uploadAndGetS3ImageUri(String intraId, String imageUrl) { public String updateAndGetS3ImageUri(MultipartFile multipartFile, User user) throws IOException { - UserImage userImage = userImageRepository.findTopByUserAndIsDeletedOrderById(user, false).orElse(null); String updateFileName = user.getIntraId() + "-" + UUID.randomUUID().toString() + ".jpeg"; if (updateFileName.equals("small_default.jpeg")) return defaultImageUrl; From 4b9308aead4bf10e2c6a44b279735c8a4e5d979e Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Fri, 1 Sep 2023 15:56:47 +0900 Subject: [PATCH 134/273] [FIX] error userservice --- .../java/com/gg/server/domain/user/service/UserService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 2dcf2903a..1235ba529 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -278,7 +278,7 @@ public UserNormalDetailResponseDto getUserNormalDetail(UserDto user) { if (tier == null) { String tierName = "NONE"; String tierImageUri = "NONE"; - return new UserNormalDetailResponseDto(user.getIntraId(), user.getImageUri(), isAdmin, isAttended, tierName, tierImageUri, level); + return new UserNormalDetailResponseDto(loginUser.getIntraId(), getUserImageToString(loginUser), isAdmin, isAttended, tierName, tierImageUri, level); } String tierName = tier.getName(); String tierImageUri = tier.getImageUri(); From 58e6590f1b0f09d0feca724561843043b87d062d Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Fri, 1 Sep 2023 22:14:04 +0900 Subject: [PATCH 135/273] [FIX] V2.5 migration --- .../db/migration/V2.5__add_userImage_and_user_image_uri.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/db/migration/V2.5__add_userImage_and_user_image_uri.sql b/src/main/resources/db/migration/V2.5__add_userImage_and_user_image_uri.sql index dc738f777..0641d83d4 100644 --- a/src/main/resources/db/migration/V2.5__add_userImage_and_user_image_uri.sql +++ b/src/main/resources/db/migration/V2.5__add_userImage_and_user_image_uri.sql @@ -4,7 +4,7 @@ create table user_image user_id bigint, image_uri varchar(255), created_at datetime(6) not null, - is_deleted bit not null default 1, + is_deleted bit not null default 0, primary key (id) ); From 69951d2e06a6ec2fd932396c2bd99d5cbbe72795 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Fri, 1 Sep 2023 23:27:16 +0900 Subject: [PATCH 136/273] =?UTF-8?q?[feat]=20GGBE4-55=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=EA=B5=AC=EB=A7=A4=ED=95=98=EA=B8=B0=20=EC=9C=A0?= =?UTF-8?q?=EC=A0=80=EC=BD=94=EC=9D=B8=EC=82=AC=EC=9A=A9=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=B0=8F=20=ED=9E=88=EC=8A=A4=ED=86=A0=EB=A6=AC=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/coin/service/CoinHistoryService.java | 7 +++++++ .../domain/coin/service/UserCoinChangeService.java | 14 ++++++++++++++ .../gg/server/domain/item/service/ItemService.java | 12 +++--------- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java index eb59c722c..293c82460 100644 --- a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java +++ b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java @@ -4,6 +4,7 @@ import com.gg.server.domain.coin.data.CoinHistoryRepository; import com.gg.server.domain.coin.data.CoinPolicyRepository; import com.gg.server.domain.coin.type.HistoryType; +import com.gg.server.domain.item.data.Item; import com.gg.server.domain.user.data.User; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -23,6 +24,12 @@ public void addAttendanceCoinHistory(User user) { addCoinHistory(new CoinHistory(user, HistoryType.ATTENDANCECOIN.getHistory(), amount)); } + @Transactional + public void addPurchaseItemCoinHistory(User user, Item item, Integer price) { + int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getAttendance(); + addCoinHistory(new CoinHistory(user, item.getName()+ "를 구매!", amount)); + } + @Transactional public void addNormalCoin(User user){ int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getNormal(); diff --git a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java index d14866874..4cabc846e 100644 --- a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java +++ b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java @@ -5,6 +5,8 @@ import com.gg.server.domain.coin.dto.UserGameCoinResultDto; import com.gg.server.domain.coin.type.HistoryType; import com.gg.server.domain.game.service.GameFindService; +import com.gg.server.domain.item.data.Item; +import com.gg.server.domain.item.exception.InsufficientGgcoinException; import com.gg.server.domain.team.data.Team; import com.gg.server.domain.team.data.TeamUser; import com.gg.server.domain.user.data.User; @@ -36,6 +38,18 @@ public int addAttendanceCoin(User user){ return coinIncrement; } + @Transactional + public void purchaseItemCoin(Item item, Integer price, Long userId){ + + User user = userRepository.findById(userId) + .orElseThrow(() -> new UserNotFoundException()); + + user.payGgCoin(price); + + coinHistoryService.addPurchaseItemCoinHistory(user, item, price); + } + + @Transactional public UserGameCoinResultDto addNormalGameCoin(Long userId) { User user = userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException()); diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index 9fb059a54..a6adf26e6 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -1,5 +1,6 @@ package com.gg.server.domain.item.service; +import com.gg.server.domain.coin.service.UserCoinChangeService; import com.gg.server.domain.item.data.Item; import com.gg.server.domain.item.data.ItemRepository; import com.gg.server.domain.item.data.UserItemRepository; @@ -37,6 +38,7 @@ public class ItemService { private final UserRepository userRepository; private final UserItemRepository userItemRepository; private final NotiService notiService; + private final UserCoinChangeService userCoinChangeService; @Transactional(readOnly = true) public ItemStoreListResponseDto getAllItems() { @@ -66,15 +68,7 @@ public void purchaseItem(Long itemId, UserDto userDto) { finalPrice = item.getPrice(); } - // 사용자의 GGcoin이 상품 가격보다 낮으면 예외 처리. - if (userDto.getGgCoin() < finalPrice) { - throw new InsufficientGgcoinException(); - } - - User payUser = userRepository.findById(userDto.getId()) - .orElseThrow(() -> new UserNotFoundException()); - - payUser.payGgCoin(finalPrice); //상품 구매에 따른 차감 + userCoinChangeService.purchaseItemCoin(item, finalPrice, userDto.getId()); Receipt receipt = new Receipt(item, userDto.getIntraId(), userDto.getIntraId(), ItemStatus.BEFORE, LocalDateTime.now()); From 0c19b7f11f8788ad176364adcb64c7ba2f57d849 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Fri, 1 Sep 2023 23:28:22 +0900 Subject: [PATCH 137/273] =?UTF-8?q?[test]=20GGBE4-55=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=EA=B5=AC=EB=A7=A4=20=EC=BD=94=EC=9D=B8=20=EC=84=9C?= =?UTF-8?q?=EB=B9=84=EC=8A=A4=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=BD=94?= =?UTF-8?q?=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/item/data/Item.java | 14 ++++++++ .../service/UserCoinChangeServiceTest.java | 34 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/src/main/java/com/gg/server/domain/item/data/Item.java b/src/main/java/com/gg/server/domain/item/data/Item.java index 88ce3009c..f915c5f8a 100644 --- a/src/main/java/com/gg/server/domain/item/data/Item.java +++ b/src/main/java/com/gg/server/domain/item/data/Item.java @@ -71,6 +71,20 @@ public Item(String name, String mainContent, String subContent, String imageUri, this.createdAt = createdAt; } + public Item(String name, String mainContent, String subContent, String imageUri, Integer price, + Boolean isVisible, Integer discount, ItemType type, LocalDateTime createdAt, String creatorIntraId) { + this.name = name; + this.mainContent = mainContent; + this.subContent = subContent; + this.imageUri = imageUri; + this.price = price; + this.isVisible = isVisible; + this.discount = discount; + this.type = type; + this.createdAt = createdAt; + this.creatorIntraId = creatorIntraId; + } + @Builder public Item(ItemUpdateRequestDto updateRequestDto, String creatorIntraId, String itemImageUri) { this.name = updateRequestDto.getName(); diff --git a/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java b/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java index 1941d080f..dc09414e3 100644 --- a/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java +++ b/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java @@ -4,6 +4,9 @@ import com.gg.server.domain.coin.data.CoinPolicy; import com.gg.server.domain.coin.data.CoinPolicyRepository; import com.gg.server.domain.coin.dto.UserGameCoinResultDto; +import com.gg.server.domain.item.data.Item; +import com.gg.server.domain.item.data.ItemRepository; +import com.gg.server.domain.item.type.ItemType; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; @@ -15,6 +18,8 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; + import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; @@ -43,6 +48,9 @@ class UserCoinChangeServiceTest { @Autowired UserCoinChangeService userCoinChangeService; + @Autowired + ItemRepository itemRepository; + @Test @DisplayName("출석시 재화 증가 서비스 테스트") void addAttendanceCoin() { @@ -66,6 +74,32 @@ void addAttendanceCoin() { } } + @Test + @DisplayName("아이템 구매시 코인사용 테스트") + void purchaseItemCoin() { + String accessToken = testDataUtils.getLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + User user = userRepository.getById(userId); + user.addGgCoin(100); + int beforeCoin = user.getGgCoin(); + + Item item = new Item("과자", "111", "1", "1", 100, true, 0, + ItemType.EDGE,LocalDateTime.now(), user.getIntraId()); + itemRepository.save(item); + + userCoinChangeService.purchaseItemCoin(item, item.getPrice(), userId); + + assertThat(beforeCoin).isEqualTo(user.getGgCoin() + item.getPrice()); + System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); + + try{ + userCoinChangeService.purchaseItemCoin(item, item.getPrice(), userId); + }catch (Exception e){ + System.out.println(e.getMessage() + " " + e); + System.out.println("===coin이 없을 때 방어로직 기능 수행 완료==="); + } + } + @Test @DisplayName("노말 게임 재화 증가 서비스 테스트") void addNormalGameService() { From c4af4eb3f55eb67594196d78c4aeac10d3bf7a63 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Fri, 1 Sep 2023 23:38:51 +0900 Subject: [PATCH 138/273] =?UTF-8?q?[style]=20GGBE4-55=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=20=EC=B6=9C=EC=84=9D=20=EC=B2=B4=ED=81=AC=20=EB=94=94=EB=B9=84?= =?UTF-8?q?=ED=98=B8=EC=B6=9C=20=ED=95=A8=EC=88=98=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/coin/data/CoinHistoryRepository.java | 2 +- .../com/gg/server/domain/coin/service/CoinHistoryService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java b/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java index cb75f9483..934ce06c4 100644 --- a/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java +++ b/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java @@ -13,7 +13,7 @@ public interface CoinHistoryRepository extends JpaRepository { @Query("SELECT CASE WHEN COUNT(ch) > 0 THEN true ELSE false END FROM CoinHistory ch WHERE ch.user = :user AND ch.history = :history AND ch.createdAt >= :startOfDay AND ch.createdAt <= :endOfDay") - boolean existsCoinHistoryByUserAndHistoryAndCreatedAtToday(@Param("user") User user, @Param("history") String history, @Param("startOfDay") LocalDateTime startOfDay, @Param("endOfDay") LocalDateTime endOfDay); + boolean existsUserAttendedCheckToday(@Param("user") User user, @Param("history") String history, @Param("startOfDay") LocalDateTime startOfDay, @Param("endOfDay") LocalDateTime endOfDay); CoinHistory findFirstByOrderByIdDesc(); diff --git a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java index 293c82460..203be35fb 100644 --- a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java +++ b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java @@ -54,7 +54,7 @@ public int addRankLoseCoin(User user){ public boolean hasAttendedToday(User user) { LocalDateTime startOfDay = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0); LocalDateTime endOfDay = LocalDateTime.now().withHour(23).withMinute(59).withSecond(59); - return coinHistoryRepository.existsCoinHistoryByUserAndHistoryAndCreatedAtToday( + return coinHistoryRepository.existsUserAttendedCheckToday( user, HistoryType.ATTENDANCECOIN.getHistory(), startOfDay, endOfDay); } From bf38ab9cefa24ca96aa1698618db6f97ffc4e6fd Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Sat, 2 Sep 2023 00:12:10 +0900 Subject: [PATCH 139/273] =?UTF-8?q?[feat]=20GGBE4-56=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=20=EC=84=A0=EB=AC=B8=ED=95=98=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=BD=94=EC=9D=B8=20=ED=9E=88=EC=8A=A4=ED=86=A0=EB=A6=AC=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/domain/coin/service/CoinHistoryService.java | 8 ++++++-- .../server/domain/coin/service/UserCoinChangeService.java | 7 +++++++ .../com/gg/server/domain/item/service/ItemService.java | 8 +------- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java index 203be35fb..8253daa6c 100644 --- a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java +++ b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java @@ -26,8 +26,12 @@ public void addAttendanceCoinHistory(User user) { @Transactional public void addPurchaseItemCoinHistory(User user, Item item, Integer price) { - int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getAttendance(); - addCoinHistory(new CoinHistory(user, item.getName()+ "를 구매!", amount)); + addCoinHistory(new CoinHistory(user, item.getName()+ "를 구매!", price)); + } + + @Transactional + public void addGiftItemCoinHistory(User user, User giftTarget, Item item, Integer price) { + addCoinHistory(new CoinHistory(user, item.getName()+ "를 " + giftTarget.getIntraId() + "에게 선물!", price)); } @Transactional diff --git a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java index 4cabc846e..dce2b1830 100644 --- a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java +++ b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java @@ -49,6 +49,13 @@ public void purchaseItemCoin(Item item, Integer price, Long userId){ coinHistoryService.addPurchaseItemCoinHistory(user, item, price); } + @Transactional + public void giftItemCoin(Item item, Integer price, User user, User giftTarget){ + user.payGgCoin(price); + + coinHistoryService.addGiftItemCoinHistory(user, giftTarget, item, price); + } + @Transactional public UserGameCoinResultDto addNormalGameCoin(Long userId) { diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index a6adf26e6..ac0eb7d7b 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -94,19 +94,13 @@ public void giftItem(Long itemId, String ownerId, UserDto userDto) { finalPrice = item.getPrice(); } - // 사용자의 GGcoin이 상품 가격보다 낮으면 예외 처리. - if (userDto.getGgCoin() < finalPrice) { - throw new InsufficientGgcoinException(); - } - User payUser = userRepository.findById(userDto.getId()) .orElseThrow(() -> new UserNotFoundException()); - User owner = userRepository.findByIntraId(ownerId) .orElseThrow(() -> new UserNotFoundException()); - payUser.payGgCoin(finalPrice); //상품 구매에 따른 차감 + userCoinChangeService.giftItemCoin(item, finalPrice, payUser, owner); Receipt receipt = new Receipt(item, userDto.getIntraId(), ownerId, ItemStatus.BEFORE, LocalDateTime.now()); From 0079dadc4244baeea70076762de411c7b2191ad6 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Sat, 2 Sep 2023 00:12:55 +0900 Subject: [PATCH 140/273] =?UTF-8?q?[test]=20GGBE4-56=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=20=EC=84=A0=EB=AC=B8=ED=95=98=EA=B8=B0=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=BD=94=EC=9D=B8=20=ED=9E=88=EC=8A=A4=ED=86=A0=EB=A6=AC=20?= =?UTF-8?q?=EC=A0=80=EC=9E=A5=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/UserCoinChangeServiceTest.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java b/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java index dc09414e3..80a97bc57 100644 --- a/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java +++ b/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java @@ -100,6 +100,32 @@ void purchaseItemCoin() { } } + @Test + @DisplayName("아이템 선물시 코인사용 테스트") + void giftItemCoin() { + String accessToken = testDataUtils.getLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + User user = userRepository.getById(userId); + user.addGgCoin(100); + int beforeCoin = user.getGgCoin(); + + Item item = new Item("과자", "111", "1", "1", 100, true, 0, + ItemType.EDGE,LocalDateTime.now(), user.getIntraId()); + itemRepository.save(item); + + userCoinChangeService.giftItemCoin(item, item.getPrice(), user, user); + + assertThat(beforeCoin).isEqualTo(user.getGgCoin() + item.getPrice()); + System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); + + try{ + userCoinChangeService.giftItemCoin(item, item.getPrice(), user, user); + }catch (Exception e){ + System.out.println(e.getMessage() + " " + e); + System.out.println("===coin이 없을 때 방어로직 기능 수행 완료==="); + } + } + @Test @DisplayName("노말 게임 재화 증가 서비스 테스트") void addNormalGameService() { From 1046a51bfc67a8a9c17343202b2744b18a4e076f Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Sat, 2 Sep 2023 00:49:23 +0900 Subject: [PATCH 141/273] =?UTF-8?q?[test]=20GGBE4-56=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/coin/service/UserCoinChangeServiceTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java b/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java index 80a97bc57..35ae6dc29 100644 --- a/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java +++ b/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java @@ -90,7 +90,7 @@ void purchaseItemCoin() { userCoinChangeService.purchaseItemCoin(item, item.getPrice(), userId); assertThat(beforeCoin).isEqualTo(user.getGgCoin() + item.getPrice()); - System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); + System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()+coinHistoryRepository.findFirstByOrderByIdDesc().getAmount()); try{ userCoinChangeService.purchaseItemCoin(item, item.getPrice(), userId); @@ -116,7 +116,7 @@ void giftItemCoin() { userCoinChangeService.giftItemCoin(item, item.getPrice(), user, user); assertThat(beforeCoin).isEqualTo(user.getGgCoin() + item.getPrice()); - System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); + System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()+coinHistoryRepository.findFirstByOrderByIdDesc().getAmount()); try{ userCoinChangeService.giftItemCoin(item, item.getPrice(), user, user); From 83dac4c35f27880a3866a60695bc01450ed69359 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Fri, 1 Sep 2023 21:54:19 +0900 Subject: [PATCH 142/273] [FEAT] Tier Service --- .../domain/rank/data/RankRepository.java | 7 ++- .../com/gg/server/domain/tier/data/Tier.java | 3 +- .../domain/tier/data/TierRepository.java | 6 +++ .../domain/tier/service/TierService.java | 45 +++++++++++++++++++ 4 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/gg/server/domain/tier/service/TierService.java diff --git a/src/main/java/com/gg/server/domain/rank/data/RankRepository.java b/src/main/java/com/gg/server/domain/rank/data/RankRepository.java index 4c9bc6ca3..67726c8e2 100644 --- a/src/main/java/com/gg/server/domain/rank/data/RankRepository.java +++ b/src/main/java/com/gg/server/domain/rank/data/RankRepository.java @@ -20,6 +20,11 @@ public interface RankRepository extends JpaRepository { Optional findFirstByOrderByCreatedAtDesc(); - @EntityGraph(attributePaths = {"user"}) + @EntityGraph(attributePaths = {"user", "tier"}) List findAllBySeasonId(Long seasonId); + + List findAllBySeasonIdOrderByPppDesc(Long seasonId); + + @Query(value = "select count(r) from Rank r where r.season.id=:seasonId and not (r.wins = 0 and r.losses = 0)") + Long countRealRankPlayers(@Param("seasonId") Long seasonId); } diff --git a/src/main/java/com/gg/server/domain/tier/data/Tier.java b/src/main/java/com/gg/server/domain/tier/data/Tier.java index 4fd18bdea..f367e7071 100644 --- a/src/main/java/com/gg/server/domain/tier/data/Tier.java +++ b/src/main/java/com/gg/server/domain/tier/data/Tier.java @@ -5,12 +5,13 @@ import lombok.NoArgsConstructor; import javax.persistence.*; +import java.io.Serializable; @Entity @Getter @NoArgsConstructor @AllArgsConstructor -public class Tier { +public class Tier implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; diff --git a/src/main/java/com/gg/server/domain/tier/data/TierRepository.java b/src/main/java/com/gg/server/domain/tier/data/TierRepository.java index 0fb50bca1..0b3137595 100644 --- a/src/main/java/com/gg/server/domain/tier/data/TierRepository.java +++ b/src/main/java/com/gg/server/domain/tier/data/TierRepository.java @@ -2,5 +2,11 @@ import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; +import java.util.Optional; + public interface TierRepository extends JpaRepository { + Optional findByName(String name); + + List findAll(); } diff --git a/src/main/java/com/gg/server/domain/tier/service/TierService.java b/src/main/java/com/gg/server/domain/tier/service/TierService.java new file mode 100644 index 000000000..2809f1ba9 --- /dev/null +++ b/src/main/java/com/gg/server/domain/tier/service/TierService.java @@ -0,0 +1,45 @@ +package com.gg.server.domain.tier.service; + +import com.gg.server.domain.rank.data.Rank; +import com.gg.server.domain.rank.data.RankRepository; +import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.tier.data.Tier; +import com.gg.server.domain.tier.data.TierRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class TierService { + private final TierRepository tierRepository; + private final RankRepository rankRepository; + + @Transactional + public void updateAllTier(Season season) { + List rankList = rankRepository.findAllBySeasonIdOrderByPppDesc(season.getId()); + Long totalRankPlayers = rankRepository.countRealRankPlayers(season.getId()); + List tierList = tierRepository.findAll(Sort.by(Sort.Direction.ASC, "id")); + + int top30percentPpp = rankList.get((int) (totalRankPlayers * 0.3)).getPpp(); + int top10percentPpp = rankList.get((int) (totalRankPlayers * 0.1)).getPpp(); + + for (int i = 0; i < rankList.size(); i++) { + Rank rank = rankList.get(i); + if (rank.getWins() == 0 && rank.getLosses() == 0) { + rank.updateTier(tierList.get(0)); + } else { + if (i < 3) { + rank.updateTier(tierList.get(6)); + continue; + } + if (rank.getPpp() < 970) { + rank.updateTier(tierList.get(0)); + } + } + } + } +} From da74b029c8cc1587bdc35ada20f1f318cff92dfd Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Sat, 2 Sep 2023 21:53:54 +0900 Subject: [PATCH 143/273] =?UTF-8?q?[FEAT]=20Tier=20Service=20=EB=B0=8F=20R?= =?UTF-8?q?ankRedis=20Service=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/game/service/GameService.java | 9 ++- .../com/gg/server/domain/rank/data/Rank.java | 4 ++ .../gg/server/domain/rank/dto/RankDto.java | 2 + .../server/domain/rank/redis/RankRedis.java | 10 +++- .../rank/redis/RankRedisRepository.java | 7 +++ .../domain/rank/redis/RankRedisService.java | 60 ++++++++++++++++++- .../domain/tier/service/TierService.java | 20 ++++++- 7 files changed, 107 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gg/server/domain/game/service/GameService.java b/src/main/java/com/gg/server/domain/game/service/GameService.java index 8b13fe31d..b84e514d0 100644 --- a/src/main/java/com/gg/server/domain/game/service/GameService.java +++ b/src/main/java/com/gg/server/domain/game/service/GameService.java @@ -14,10 +14,12 @@ import com.gg.server.domain.pchange.service.PChangeService; import com.gg.server.domain.rank.redis.RankRedisService; import com.gg.server.domain.game.type.StatusType; +import com.gg.server.domain.rank.service.RedisUploadService; import com.gg.server.domain.season.data.Season; import com.gg.server.domain.team.data.TeamUser; import com.gg.server.domain.team.data.TeamUserRepository; import com.gg.server.domain.team.exception.TeamIdNotMatchException; +import com.gg.server.domain.tier.service.TierService; import com.gg.server.global.exception.ErrorCode; import com.gg.server.global.exception.custom.InvalidParameterException; import com.gg.server.global.utils.ExpLevelCalculator; @@ -40,6 +42,8 @@ public class GameService { private final PChangeRepository pChangeRepository; private final GameFindService gameFindService; private final UserCoinChangeService userCoinChangeService; + private final TierService tierService; + private final RedisUploadService redisUploadService; @Transactional(readOnly = true) public GameTeamInfo getUserGameInfo(Long gameId, Long userId) { @@ -168,7 +172,8 @@ private TeamUser findTeamId(Long teamId, List teamUsers) { throw new TeamIdNotMatchException(); } - private Boolean updateScore(Game game, RankResultReqDto scoreDto, Long userId) { + @Transactional + public Boolean updateScore(Game game, RankResultReqDto scoreDto, Long userId) { List teams = teamUserRepository.findAllByGameId(game.getId()); TeamUser myTeam = findTeamId(scoreDto.getMyTeamId(), teams); TeamUser enemyTeam = findTeamId(scoreDto.getEnemyTeamId(), teams); @@ -180,6 +185,8 @@ private Boolean updateScore(Game game, RankResultReqDto scoreDto, Long userId) { setTeamScore(enemyTeam, scoreDto.getEnemyTeamScore(), scoreDto.getMyTeamScore() < scoreDto.getEnemyTeamScore()); expUpdates(game, teams); rankRedisService.updateRankRedis(myTeam, enemyTeam, game); + tierService.updateAllTier(game.getSeason()); + redisUploadService.uploadRedis(); } else { // score 가 이미 입력됨 return false; diff --git a/src/main/java/com/gg/server/domain/rank/data/Rank.java b/src/main/java/com/gg/server/domain/rank/data/Rank.java index 6ae27a3a2..8e1a37f64 100644 --- a/src/main/java/com/gg/server/domain/rank/data/Rank.java +++ b/src/main/java/com/gg/server/domain/rank/data/Rank.java @@ -92,4 +92,8 @@ public void modifyUserRank(Integer ppp, int wins, int losses) { this.wins = wins; this.losses = losses; } + + public void updateTier(Tier tier) { + this.tier = tier; + } } diff --git a/src/main/java/com/gg/server/domain/rank/dto/RankDto.java b/src/main/java/com/gg/server/domain/rank/dto/RankDto.java index 78d88f66d..2466ee996 100644 --- a/src/main/java/com/gg/server/domain/rank/dto/RankDto.java +++ b/src/main/java/com/gg/server/domain/rank/dto/RankDto.java @@ -13,6 +13,7 @@ public class RankDto { private int rank; private int ppp; private String statusMessage; + private String tierImageUri; public static RankDto from(RankRedis rankRedis, int rank) { @@ -21,6 +22,7 @@ public static RankDto from(RankRedis rankRedis, int rank) { .rank(rank) .ppp(rankRedis.getPpp()) .statusMessage(rankRedis.getStatusMessage()) + .tierImageUri(rankRedis.getTierImageUrl()) .build(); return dto; } diff --git a/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java b/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java index 6a5c28c42..ce6b5e2a0 100644 --- a/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java +++ b/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java @@ -14,13 +14,13 @@ @Builder @AllArgsConstructor public class RankRedis implements Serializable { - private Long userId; private String intraId; private int ppp; private int wins; private int losses; private String statusMessage; + private String tierImageUrl; public void updateRank(int changePpp, int wins, int losses) { this.ppp += changePpp; @@ -28,6 +28,10 @@ public void updateRank(int changePpp, int wins, int losses) { this.losses = losses; } + public void updateTierImage(String tierImageUrl) { + this.tierImageUrl = tierImageUrl; + } + public void changedRank(int ppp, int wins, int losses) { this.ppp = ppp; this.wins = wins; @@ -46,11 +50,12 @@ public static RankRedis from(UserDto user, Integer ppp) { .wins(0) .losses(0) .statusMessage("") + .tierImageUrl("") .build(); return rankRedis; } - public static RankRedis from(Rank rank){ + public static RankRedis from(Rank rank) { RankRedis rankRedis = RankRedis.builder() .userId(rank.getUser().getId()) .intraId(rank.getUser().getIntraId()) @@ -58,6 +63,7 @@ public static RankRedis from(Rank rank){ .wins(rank.getWins()) .losses(rank.getLosses()) .statusMessage(rank.getStatusMessage()) + .tierImageUrl(rank.getTier().getImageUri()) .build(); return rankRedis; } diff --git a/src/main/java/com/gg/server/domain/rank/redis/RankRedisRepository.java b/src/main/java/com/gg/server/domain/rank/redis/RankRedisRepository.java index eb80b8899..f312ec14d 100644 --- a/src/main/java/com/gg/server/domain/rank/redis/RankRedisRepository.java +++ b/src/main/java/com/gg/server/domain/rank/redis/RankRedisRepository.java @@ -187,6 +187,13 @@ public List findRanksByUserIds(String key, List userIds) { return objects.stream().map(RankRedis.class::cast).collect(Collectors.toList()); } + public List findAllRanks(String key) { + List objects = hashOps.values(key); + if(objects == null) + throw new RedisDataNotFoundException(); + return objects.stream().map(RankRedis.class::cast).collect(Collectors.toList()); + } + public Long countTotalRank(String zSetKey) { Long result = zSetOps.size(zSetKey); if(result == null) diff --git a/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java b/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java index 18a0c353f..411c9d122 100644 --- a/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java +++ b/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java @@ -1,17 +1,20 @@ package com.gg.server.domain.rank.redis; import com.gg.server.domain.game.data.Game; -import com.gg.server.domain.game.service.GameService; import com.gg.server.domain.pchange.service.PChangeService; import com.gg.server.domain.rank.data.Rank; import com.gg.server.domain.rank.data.RankRepository; import com.gg.server.domain.rank.exception.RankNotFoundException; +import com.gg.server.domain.season.data.Season; import com.gg.server.domain.team.data.TeamUser; +import com.gg.server.domain.tier.data.Tier; +import com.gg.server.domain.tier.data.TierRepository; import com.gg.server.global.exception.ErrorCode; import com.gg.server.global.exception.custom.NotExistException; import com.gg.server.global.utils.EloRating; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,6 +25,7 @@ @Slf4j public class RankRedisService { private final RankRedisRepository rankRedisRepository; + private final TierRepository tierRepository; private final PChangeService pChangeService; private final RankRepository rankRepository; @@ -39,6 +43,7 @@ public void updateRankRedis(TeamUser myTeamUser, TeamUser enemyTeamUser, Game ga Integer enemyPPP = enemyTeam.getPpp(); updatePPP(myTeamUser, myTeam, enemyTeamUser.getTeam().getScore(), myPPP, enemyPPP, game.getSeason().getId()); updatePPP(enemyTeamUser, enemyTeam, myTeamUser.getTeam().getScore(), enemyPPP, myPPP, game.getSeason().getId()); +// updateAllTier(key, game.getSeason()); updateRankUser(key, zsetKey, myTeamUser.getUser().getId(), myTeam); updateRankUser(key, zsetKey, enemyTeamUser.getUser().getId(), enemyTeam); pChangeService.addPChange(game, myTeamUser.getUser(), myTeam.getPpp(), true); @@ -61,8 +66,61 @@ public void updatePPP(TeamUser teamuser, RankRedis myTeam, int enemyScore, Integ Integer changedPpp = EloRating.pppChange(myPPP, enemyPPP, teamuser.getTeam().getWin(), Math.abs(teamuser.getTeam().getScore() - enemyScore) == 2); rank.modifyUserRank(rank.getPpp() + changedPpp, win, losses); + myTeam.updateRank(changedPpp, win, losses); + + } + + public void updateAllTier(String key, Season season) { + // 전체 레디스 랭크 티어 새로고침하는 로직 + List rankRedisList = rankRedisRepository.findAllRanks(key); + Long totalRankPlayers = rankRepository.countRealRankPlayers(season.getId()); + List tierList = tierRepository.findAll(Sort.by(Sort.Direction.ASC, "id")); + + for (Tier tier : tierList) { + System.out.println(tier); + } + + System.out.println("RankRedisService : Update All Tier"); + System.out.println("전체 활성 랭크 유저 수 : " + totalRankPlayers); + + int top30percentPpp = rankRedisList.get((int) (totalRankPlayers * 0.3)).getPpp(); + int top10percentPpp = rankRedisList.get((int) (totalRankPlayers * 0.1)).getPpp(); + + for (int i = 0; i < rankRedisList.size(); i++) { + RankRedis rankRedis = rankRedisList.get(i); + if (rankRedis.getWins() == 0 && rankRedis.getLosses() == 0) { + rankRedis.updateTierImage(tierList.get(0).getImageUri()); + } else { + if (i < 3) { + // 1, 2, 3등 + rankRedis.updateTierImage(tierList.get(6).getImageUri()); + continue; + } + if (rankRedis.getPpp() < 970) { + // 970 미만 + rankRedis.updateTierImage(tierList.get(1).getImageUri()); + } else if (rankRedis.getPpp() < 1010) { + // 970 ~ 1009 + rankRedis.updateTierImage(tierList.get(2).getImageUri()); + } else if (rankRedis.getPpp() < 1050) { + // 1010 ~ 1049 + rankRedis.updateTierImage(tierList.get(3).getImageUri()); + } else { + if ((rankRedis.getPpp() >= top30percentPpp) && (rankRedis.getPpp() < top10percentPpp)) { + // 1050 이상, 30% 이상, 10% 미만 + rankRedis.updateTierImage(tierList.get(4).getImageUri()); + } else if (rankRedis.getPpp() >= top10percentPpp) { + // 1050 이상, 10% 이상 + rankRedis.updateTierImage(tierList.get(5).getImageUri()); + } else { + // 1050 이상, 30% 미만 + rankRedis.updateTierImage(tierList.get(3).getImageUri()); + } + } + } + } } public void rollbackRank(TeamUser teamUser, int ppp, Long seasonId) { diff --git a/src/main/java/com/gg/server/domain/tier/service/TierService.java b/src/main/java/com/gg/server/domain/tier/service/TierService.java index 2809f1ba9..8821003d7 100644 --- a/src/main/java/com/gg/server/domain/tier/service/TierService.java +++ b/src/main/java/com/gg/server/domain/tier/service/TierService.java @@ -37,7 +37,25 @@ public void updateAllTier(Season season) { continue; } if (rank.getPpp() < 970) { - rank.updateTier(tierList.get(0)); + // 970 미만 + rank.updateTier(tierList.get(1)); + } else if (rank.getPpp() < 1010) { + // 970 - 1009 + rank.updateTier(tierList.get(2)); + } else if (rank.getPpp() < 1050) { + // 1010 - 1049 + rank.updateTier(tierList.get(3)); + } else if (rank.getPpp() >= 1050) { + if (rank.getPpp() >= top30percentPpp && rank.getPpp() < top10percentPpp) { + // 1050 이상, 30% 이상, 10% 미만 + rank.updateTier(tierList.get(4)); + } else if (rank.getPpp() >= top10percentPpp) { + // 1050 이상, 10% 이상 + rank.updateTier(tierList.get(5)); + } else { + // 1050 이상, 30% 미만 + rank.updateTier(tierList.get(3)); + } } } } From dec27b775f9a00c2f9ec290d1baf8a09ff4481fa Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sat, 2 Sep 2023 23:41:48 +0900 Subject: [PATCH 144/273] [FEAT] user admin delete user profile image --- .../admin/user/controller/UserAdminController.java | 6 ++++++ .../admin/user/data/UserImageAdminRepository.java | 11 +++++++++++ .../server/admin/user/service/UserAdminService.java | 13 ++++++++++--- .../com/gg/server/domain/user/data/UserImage.java | 2 ++ 4 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java diff --git a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java index 15bc936cf..b15cd4884 100644 --- a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java +++ b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java @@ -62,4 +62,10 @@ public ResponseEntity userUpdateDetail(@PathVariable String intraId, return new ResponseEntity(HttpStatus.NO_CONTENT); } + + @DeleteMapping("/{intraId}") + public ResponseEntity deleteUserProfileImage(@PathVariable String intraId) { + userAdminService.deleteUserProfileImage(intraId); + return new ResponseEntity(HttpStatus.NO_CONTENT); + } } diff --git a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java new file mode 100644 index 000000000..43d96f8e8 --- /dev/null +++ b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java @@ -0,0 +1,11 @@ +package com.gg.server.admin.user.data; + +import com.gg.server.domain.user.data.User; +import org.springframework.data.jpa.repository.JpaRepository; +import com.gg.server.domain.user.data.UserImage; + +import java.util.Optional; + +public interface UserImageAdminRepository extends JpaRepository{ + Optional findTopByUserAndIsDeletedOrderByIdDesc(User user, Boolean isDeleted); +} diff --git a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java index 9594865fd..3ba8b77ee 100644 --- a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java +++ b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java @@ -2,6 +2,7 @@ import com.gg.server.admin.rank.service.RankRedisAdminService; import com.gg.server.admin.season.data.SeasonAdminRepository; import com.gg.server.admin.user.data.UserAdminRepository; +import com.gg.server.admin.user.data.UserImageAdminRepository; import com.gg.server.admin.user.dto.UserDetailAdminResponseDto; import com.gg.server.admin.user.dto.UserSearchAdminDto; import com.gg.server.admin.user.dto.UserSearchAdminResponseDto; @@ -20,7 +21,6 @@ import com.gg.server.domain.user.data.UserImageRepository; import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.service.UserFindService; -import com.gg.server.domain.user.service.UserService; import com.gg.server.global.utils.aws.AsyncNewUserImageUploader; import lombok.AllArgsConstructor; import org.springframework.data.domain.Page; @@ -45,7 +45,7 @@ public class UserAdminService { private final RankRedisAdminService rankRedisAdminService; private final AsyncNewUserImageUploader asyncNewUserImageUploader; private final UserFindService userFindService; - private final UserImageRepository userImageRepository; + private final UserImageAdminRepository userImageAdminRepository; @Transactional(readOnly = true) public UserSearchAdminResponseDto searchAll(Pageable pageable) { @@ -119,7 +119,14 @@ private void updateUserRank(Long userId, Long currSeasonId, UserUpdateAdminReque } public String getUserImageToString(User user) { - UserImage userImage = userImageRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElse(null); + UserImage userImage = userImageAdminRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElse(null); return userImage.toString(); } + + @Transactional + public void deleteUserProfileImage(String intraId) { + User user = userAdminRepository.findByIntraId(intraId).orElseThrow(UserNotFoundException::new); + UserImage userImage = userImageAdminRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElseThrow(UserNotFoundException::new); + userImage.setIsDeleted(true); + } } diff --git a/src/main/java/com/gg/server/domain/user/data/UserImage.java b/src/main/java/com/gg/server/domain/user/data/UserImage.java index 2d5a5d87a..5013c8419 100644 --- a/src/main/java/com/gg/server/domain/user/data/UserImage.java +++ b/src/main/java/com/gg/server/domain/user/data/UserImage.java @@ -4,6 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import javax.persistence.*; import java.time.LocalDateTime; @@ -12,6 +13,7 @@ @AllArgsConstructor @Entity @Getter +@Setter public class UserImage { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) From a2550b55cb7f59eb9a65f8f3d3ed37f1a07808de Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sat, 2 Sep 2023 23:42:41 +0900 Subject: [PATCH 145/273] [TEST] user admin delete user profile image --- .../controller/UserAdminControllerTest.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java index 3c90cd52b..993f5197d 100644 --- a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java @@ -2,12 +2,15 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.gg.server.admin.user.data.UserAdminRepository; +import com.gg.server.admin.user.data.UserImageAdminRepository; import com.gg.server.admin.user.dto.UserDetailAdminResponseDto; import com.gg.server.admin.user.dto.UserSearchAdminDto; import com.gg.server.admin.user.dto.UserSearchAdminResponseDto; import com.gg.server.admin.user.service.UserAdminService; import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserImage; import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; import com.gg.server.utils.TestDataUtils; import lombok.RequiredArgsConstructor; @@ -27,6 +30,7 @@ import java.util.List; +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.delete; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -49,6 +53,8 @@ class UserAdminControllerTest { MockMvc mockMvc; @Autowired ObjectMapper objectMapper; + @Autowired + UserImageAdminRepository userImageAdminRepository; @Test @DisplayName("GET /pingpong/admin/users") @@ -145,4 +151,23 @@ public void userGetDetailTest() throws Exception{ Assertions.assertThat(actureResponse.getExp()).isEqualTo(expectedResponse.getExp()); Assertions.assertThat(actureResponse.getCoin()).isEqualTo(expectedResponse.getCoin()); } + + @Test + @DisplayName("DELETE /pingpong/admin/users/{intraId}") + @Transactional + public void deleteUserProfileImageTest() throws Exception{ + //given + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + User user = userRepository.findByIntraId("klew").get(); + String url = "/pingpong/admin/users/" + user.getIntraId(); + UserImage PrevUserImage = userImageAdminRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElseThrow(UserNotFoundException::new); + //when + //200 성공 + mockMvc.perform(delete(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isNoContent()); + + UserImage CurrentUserImage = userImageAdminRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElseThrow(UserNotFoundException::new); + Assertions.assertThat(PrevUserImage.getId()).isNotEqualTo(CurrentUserImage.getId()); + } } \ No newline at end of file From 3d3c649f35bb5e381fffecd929bee7f6d840abe3 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sun, 3 Sep 2023 13:12:29 +0900 Subject: [PATCH 146/273] [FEAT] GET UserImage delete-list --- .../user/controller/UserAdminController.java | 15 ++++++++--- .../user/data/UserImageAdminRepository.java | 4 +++ .../admin/user/dto/UserImageAdminDto.java | 27 +++++++++++++++++++ .../dto/UserImageListAdminResponseDto.java | 16 +++++++++++ .../admin/user/service/UserAdminService.java | 14 ++++++---- 5 files changed, 67 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/gg/server/admin/user/dto/UserImageAdminDto.java create mode 100644 src/main/java/com/gg/server/admin/user/dto/UserImageListAdminResponseDto.java diff --git a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java index b15cd4884..29ab041c5 100644 --- a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java +++ b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java @@ -1,11 +1,9 @@ package com.gg.server.admin.user.controller; -import com.gg.server.admin.user.dto.UserDetailAdminResponseDto; -import com.gg.server.admin.user.dto.UserSearchAdminRequestDto; -import com.gg.server.admin.user.dto.UserSearchAdminResponseDto; -import com.gg.server.admin.user.dto.UserUpdateAdminRequestDto; +import com.gg.server.admin.user.dto.*; import com.gg.server.admin.user.service.UserAdminService; import com.gg.server.domain.rank.exception.RankUpdateException; +import com.gg.server.domain.user.dto.UserImageResponseDto; import com.gg.server.domain.user.exception.UserImageLargeException; import com.gg.server.domain.user.exception.UserImageTypeException; import com.gg.server.global.dto.PageRequestDto; @@ -68,4 +66,13 @@ public ResponseEntity deleteUserProfileImage(@PathVariable String intraId) { userAdminService.deleteUserProfileImage(intraId); return new ResponseEntity(HttpStatus.NO_CONTENT); } + + @GetMapping("/delete-list") + public ResponseEntity getUserImageDeleteList(@ModelAttribute @Valid PageRequestDto pageRequestDto) { + Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, + pageRequestDto.getSize(), + Sort.by("createdAt").descending()); + return ResponseEntity.ok() + .body(userAdminService.getUserImageDeleteList(pageable)); + } } diff --git a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java index 43d96f8e8..9e93e5f7f 100644 --- a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java +++ b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java @@ -1,6 +1,9 @@ package com.gg.server.admin.user.data; +import com.gg.server.admin.user.dto.UserImageAdminDto; import com.gg.server.domain.user.data.User; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import com.gg.server.domain.user.data.UserImage; @@ -8,4 +11,5 @@ public interface UserImageAdminRepository extends JpaRepository{ Optional findTopByUserAndIsDeletedOrderByIdDesc(User user, Boolean isDeleted); + Page findAllByIsDeleted(Pageable pageable, Boolean isDeleted); } diff --git a/src/main/java/com/gg/server/admin/user/dto/UserImageAdminDto.java b/src/main/java/com/gg/server/admin/user/dto/UserImageAdminDto.java new file mode 100644 index 000000000..228fc0ae0 --- /dev/null +++ b/src/main/java/com/gg/server/admin/user/dto/UserImageAdminDto.java @@ -0,0 +1,27 @@ +package com.gg.server.admin.user.dto; + +import com.gg.server.domain.user.data.UserImage; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class UserImageAdminDto { + Long id; + Long userId; + String imageUri; + LocalDateTime createdAt; + Boolean isDeleted; + + public UserImageAdminDto(UserImage userImage) { + this.id = userImage.getId(); + this.userId = userImage.getUser().getId(); + this.imageUri = userImage.getImageUri(); + this.createdAt = userImage.getCreatedAt(); + this.isDeleted = userImage.getIsDeleted(); + } +} diff --git a/src/main/java/com/gg/server/admin/user/dto/UserImageListAdminResponseDto.java b/src/main/java/com/gg/server/admin/user/dto/UserImageListAdminResponseDto.java new file mode 100644 index 000000000..1c07d01a2 --- /dev/null +++ b/src/main/java/com/gg/server/admin/user/dto/UserImageListAdminResponseDto.java @@ -0,0 +1,16 @@ +package com.gg.server.admin.user.dto; + +import com.gg.server.admin.coin.dto.CoinPolicyAdminResponseDto; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class UserImageListAdminResponseDto { + private List userImageList; + private int totalPage; +} diff --git a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java index 3ba8b77ee..147d0aeac 100644 --- a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java +++ b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java @@ -3,10 +3,7 @@ import com.gg.server.admin.season.data.SeasonAdminRepository; import com.gg.server.admin.user.data.UserAdminRepository; import com.gg.server.admin.user.data.UserImageAdminRepository; -import com.gg.server.admin.user.dto.UserDetailAdminResponseDto; -import com.gg.server.admin.user.dto.UserSearchAdminDto; -import com.gg.server.admin.user.dto.UserSearchAdminResponseDto; -import com.gg.server.admin.user.dto.UserUpdateAdminRequestDto; +import com.gg.server.admin.user.dto.*; import com.gg.server.domain.rank.data.Rank; import com.gg.server.domain.rank.data.RankRepository; import com.gg.server.domain.rank.exception.RankNotFoundException; @@ -18,7 +15,6 @@ import com.gg.server.domain.season.exception.SeasonNotFoundException; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserImage; -import com.gg.server.domain.user.data.UserImageRepository; import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.service.UserFindService; import com.gg.server.global.utils.aws.AsyncNewUserImageUploader; @@ -129,4 +125,12 @@ public void deleteUserProfileImage(String intraId) { UserImage userImage = userImageAdminRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElseThrow(UserNotFoundException::new); userImage.setIsDeleted(true); } + + @Transactional(readOnly = true) + public UserImageListAdminResponseDto getUserImageDeleteList(Pageable pageable) { + Page userImagePage = userImageAdminRepository.findAllByIsDeleted(pageable, true); + Page userImageAdminDto = userImagePage.map(UserImageAdminDto::new); + + return new UserImageListAdminResponseDto(userImageAdminDto.getContent(), userImageAdminDto.getTotalPages()); + } } From e42ff8ab626865e0643710d5ccc82a0f26cf2319 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sun, 3 Sep 2023 13:22:55 +0900 Subject: [PATCH 147/273] [TEST] GET UserImage delete-list --- .../controller/UserAdminControllerTest.java | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java index 993f5197d..d232ff8f0 100644 --- a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java @@ -3,9 +3,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.gg.server.admin.user.data.UserAdminRepository; import com.gg.server.admin.user.data.UserImageAdminRepository; -import com.gg.server.admin.user.dto.UserDetailAdminResponseDto; -import com.gg.server.admin.user.dto.UserSearchAdminDto; -import com.gg.server.admin.user.dto.UserSearchAdminResponseDto; +import com.gg.server.admin.user.dto.*; import com.gg.server.admin.user.service.UserAdminService; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserImage; @@ -170,4 +168,29 @@ public void deleteUserProfileImageTest() throws Exception{ UserImage CurrentUserImage = userImageAdminRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElseThrow(UserNotFoundException::new); Assertions.assertThat(PrevUserImage.getId()).isNotEqualTo(CurrentUserImage.getId()); } + + @Test + @DisplayName("GET /pingpong/admin/users/delete-list") + @Transactional + public void getUserImageDeleteListTest() throws Exception{ + //given + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + int page = 1; + int size = 30; + String url = "/pingpong/admin/users/delete-list?page=1"; + + //when + //200 성공 + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + UserImageListAdminResponseDto actureResponse = objectMapper.readValue(contentAsString, UserImageListAdminResponseDto.class); + + //then + //각 유저의 이미지가 삭제된 이미지인지 확인 + List actureUserImageList = actureResponse.getUserImageList(); + for (UserImageAdminDto userImageDto : actureUserImageList) + Assertions.assertThat(userImageDto.getIsDeleted()).isEqualTo(true); + } } \ No newline at end of file From 308f7fa0383844222e5f3215338f5b67488a5c5d Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sun, 3 Sep 2023 17:03:39 +0900 Subject: [PATCH 148/273] [FEAT] GET user profile changed list --- .../admin/user/controller/UserAdminController.java | 11 ++++++++++- .../admin/user/data/UserImageAdminRepository.java | 6 ++++++ .../server/admin/user/service/UserAdminService.java | 8 ++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java index 29ab041c5..f5e847f9b 100644 --- a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java +++ b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java @@ -71,8 +71,17 @@ public ResponseEntity deleteUserProfileImage(@PathVariable String intraId) { public ResponseEntity getUserImageDeleteList(@ModelAttribute @Valid PageRequestDto pageRequestDto) { Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, pageRequestDto.getSize(), - Sort.by("createdAt").descending()); + Sort.by("id").descending()); return ResponseEntity.ok() .body(userAdminService.getUserImageDeleteList(pageable)); } + + @GetMapping("/images") + public ResponseEntity getUserImageList(@ModelAttribute @Valid PageRequestDto pageRequestDto) { + Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, + pageRequestDto.getSize(), + Sort.by("id").descending()); + return ResponseEntity.ok() + .body(userAdminService.getUserImageList(pageable)); + } } diff --git a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java index 9e93e5f7f..e4cbfad05 100644 --- a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java +++ b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java @@ -6,10 +6,16 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import com.gg.server.domain.user.data.UserImage; +import org.springframework.data.jpa.repository.Query; import java.util.Optional; public interface UserImageAdminRepository extends JpaRepository{ Optional findTopByUserAndIsDeletedOrderByIdDesc(User user, Boolean isDeleted); Page findAllByIsDeleted(Pageable pageable, Boolean isDeleted); + + @Query(value = "SELECT * FROM user_image WHERE id NOT IN (" + + "SELECT MIN(id) FROM user_image GROUP BY user_id" + + ") ORDER BY id DESC", nativeQuery = true) + Page findChanged(Pageable pageable); } diff --git a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java index 147d0aeac..7efc22ed8 100644 --- a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java +++ b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java @@ -133,4 +133,12 @@ public UserImageListAdminResponseDto getUserImageDeleteList(Pageable pageable) { return new UserImageListAdminResponseDto(userImageAdminDto.getContent(), userImageAdminDto.getTotalPages()); } + + @Transactional(readOnly = true) + public UserImageListAdminResponseDto getUserImageList(Pageable pageable) { + Page userImagePage = userImageAdminRepository.findChanged(pageable); + Page userImageAdminDto = userImagePage.map(UserImageAdminDto::new); + + return new UserImageListAdminResponseDto(userImageAdminDto.getContent(), userImageAdminDto.getTotalPages()); + } } From 762a3b88873aa17a7123311c5bca78ddbf14de65 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sun, 3 Sep 2023 17:12:50 +0900 Subject: [PATCH 149/273] [TEST] GET user profile changed list --- .../controller/UserAdminControllerTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java index d232ff8f0..bee144242 100644 --- a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java @@ -28,6 +28,7 @@ import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.delete; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -193,4 +194,24 @@ public void getUserImageDeleteListTest() throws Exception{ for (UserImageAdminDto userImageDto : actureUserImageList) Assertions.assertThat(userImageDto.getIsDeleted()).isEqualTo(true); } + + @Test + @DisplayName("GET /pingpong/admin/users/images") + @Transactional + public void getUserImageListTest() throws Exception{ + //given + String accessToken = testDataUtils.getAdminLoginAccessToken(); + String url = "/pingpong/admin/users/images?page=1"; + + //when + //200 성공 + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + + //then + //각 유저의 이미지가 삭제된 이미지인지 확인 + UserImageListAdminResponseDto actureResponse = objectMapper.readValue(contentAsString, UserImageListAdminResponseDto.class); + assertThat(actureResponse.getUserImageList().size()).isEqualTo(3); + } } \ No newline at end of file From 8f371b195fd06d37fd665c717d0333c8d0006c84 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sun, 3 Sep 2023 17:21:46 +0900 Subject: [PATCH 150/273] =?UTF-8?q?[FIX]=20=EC=A4=91=EB=B3=B5=20sort=20?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/admin/user/controller/UserAdminController.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java index f5e847f9b..91ada4b76 100644 --- a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java +++ b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java @@ -79,8 +79,7 @@ public ResponseEntity getUserImageDeleteList(@Mod @GetMapping("/images") public ResponseEntity getUserImageList(@ModelAttribute @Valid PageRequestDto pageRequestDto) { Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, - pageRequestDto.getSize(), - Sort.by("id").descending()); + pageRequestDto.getSize()); return ResponseEntity.ok() .body(userAdminService.getUserImageList(pageable)); } From 133105b7786bd8bb247c9f0404094a3c3779e354 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Mon, 4 Sep 2023 13:21:40 +0900 Subject: [PATCH 151/273] =?UTF-8?q?[REFACTOR]=20ItemUpdateRequestDto=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD=20=EB=B0=8F=20imageUri?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/admin/item/controller/ItemAdminController.java | 6 +++--- .../com/gg/server/admin/item/dto/ItemUpdateRequestDto.java | 4 ---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java index 281b6ab1e..ab76b429e 100644 --- a/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java +++ b/src/main/java/com/gg/server/admin/item/controller/ItemAdminController.java @@ -37,7 +37,7 @@ public ItemListResponseDto getItemHistory(@ModelAttribute @Valid PageRequestDto @PostMapping(path="/{itemId}", consumes = {MediaType.APPLICATION_JSON_VALUE, MediaType.MULTIPART_FORM_DATA_VALUE}) public ResponseEntity updateItem(@PathVariable("itemId") Long itemId, - @RequestPart @Valid ItemUpdateRequestDto itemRequestDto, + @RequestPart @Valid ItemUpdateRequestDto updateItemInfo, @RequestPart(required = false) MultipartFile imgData, @Parameter(hidden = true) @Login UserDto user) throws IOException { if (imgData != null) { @@ -46,9 +46,9 @@ public ResponseEntity updateItem(@PathVariable("itemId") Long itemId, } else if (imgData.getContentType() == null || !imgData.getContentType().equals("image/jpeg")) { throw new ItemImageTypeException(); } - itemAdminService.updateItem(itemId, itemRequestDto, imgData, user); + itemAdminService.updateItem(itemId, updateItemInfo, imgData, user); } else { - itemAdminService.updateItem(itemId, itemRequestDto, user); + itemAdminService.updateItem(itemId, updateItemInfo, user); } return new ResponseEntity(HttpStatus.NO_CONTENT); } diff --git a/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java b/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java index 582f133e7..d6384aba1 100644 --- a/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java +++ b/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java @@ -20,9 +20,6 @@ public class ItemUpdateRequestDto { @NotNull(message = "plz. subContent") private String subContent; - @NotNull(message = "plz. imageUri") - private String imageUri; - @NotNull(message = "plz. price") private Integer price; @@ -38,7 +35,6 @@ public String toString() { "name='" + name + '\'' + ", mainContent='" + mainContent + '\'' + ", subContent='" + subContent + '\'' + - ", imageUri='" + imageUri + '\'' + ", price=" + price + ", discount=" + discount + ", itemType='" + itemType + '\'' + From 9549270955d37b14cd96c5cbccba0d99d038f8e7 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Mon, 4 Sep 2023 13:24:09 +0900 Subject: [PATCH 152/273] =?UTF-8?q?[REFACTOR]=20Item=20ImageUri=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gg/server/domain/item/data/Item.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/item/data/Item.java b/src/main/java/com/gg/server/domain/item/data/Item.java index 88ce3009c..271d90a1b 100644 --- a/src/main/java/com/gg/server/domain/item/data/Item.java +++ b/src/main/java/com/gg/server/domain/item/data/Item.java @@ -76,7 +76,7 @@ public Item(ItemUpdateRequestDto updateRequestDto, String creatorIntraId, String this.name = updateRequestDto.getName(); this.mainContent = updateRequestDto.getMainContent(); this.subContent = updateRequestDto.getSubContent(); - this.imageUri = updateRequestDto.getImageUri(); + this.imageUri = itemImageUri; this.price = updateRequestDto.getPrice(); this.discount = updateRequestDto.getDiscount(); this.isVisible = true; From a2a38383b95c4925b4ae22daba77b6dd9bd74e6b Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Mon, 4 Sep 2023 14:44:40 +0900 Subject: [PATCH 153/273] =?UTF-8?q?[FEAT]=20RankRedisService=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/game/service/GameService.java | 1 - .../domain/rank/redis/RankRedisService.java | 16 ++++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gg/server/domain/game/service/GameService.java b/src/main/java/com/gg/server/domain/game/service/GameService.java index b84e514d0..d1e60bb9a 100644 --- a/src/main/java/com/gg/server/domain/game/service/GameService.java +++ b/src/main/java/com/gg/server/domain/game/service/GameService.java @@ -186,7 +186,6 @@ public Boolean updateScore(Game game, RankResultReqDto scoreDto, Long userId) { expUpdates(game, teams); rankRedisService.updateRankRedis(myTeam, enemyTeam, game); tierService.updateAllTier(game.getSeason()); - redisUploadService.uploadRedis(); } else { // score 가 이미 입력됨 return false; diff --git a/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java b/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java index 411c9d122..fae226161 100644 --- a/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java +++ b/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java @@ -43,9 +43,9 @@ public void updateRankRedis(TeamUser myTeamUser, TeamUser enemyTeamUser, Game ga Integer enemyPPP = enemyTeam.getPpp(); updatePPP(myTeamUser, myTeam, enemyTeamUser.getTeam().getScore(), myPPP, enemyPPP, game.getSeason().getId()); updatePPP(enemyTeamUser, enemyTeam, myTeamUser.getTeam().getScore(), enemyPPP, myPPP, game.getSeason().getId()); -// updateAllTier(key, game.getSeason()); updateRankUser(key, zsetKey, myTeamUser.getUser().getId(), myTeam); updateRankUser(key, zsetKey, enemyTeamUser.getUser().getId(), enemyTeam); + updateAllTier(key, game.getSeason()); pChangeService.addPChange(game, myTeamUser.getUser(), myTeam.getPpp(), true); pChangeService.addPChange(game, enemyTeamUser.getUser(), enemyTeam.getPpp(), false); } @@ -88,16 +88,13 @@ public void updateAllTier(String key, Season season) { int top30percentPpp = rankRedisList.get((int) (totalRankPlayers * 0.3)).getPpp(); int top10percentPpp = rankRedisList.get((int) (totalRankPlayers * 0.1)).getPpp(); + System.out.println(rankRedisList.size()); + for (int i = 0; i < rankRedisList.size(); i++) { RankRedis rankRedis = rankRedisList.get(i); if (rankRedis.getWins() == 0 && rankRedis.getLosses() == 0) { rankRedis.updateTierImage(tierList.get(0).getImageUri()); } else { - if (i < 3) { - // 1, 2, 3등 - rankRedis.updateTierImage(tierList.get(6).getImageUri()); - continue; - } if (rankRedis.getPpp() < 970) { // 970 미만 rankRedis.updateTierImage(tierList.get(1).getImageUri()); @@ -121,6 +118,13 @@ public void updateAllTier(String key, Season season) { } } } + for (int i = 0; i < 3; i++) { + RankRedis rankRedis = rankRedisList.get(i); + rankRedis.updateTierImage(tierList.get(7).getImageUri()); + } + for (RankRedis rankRedis : rankRedisList) { + rankRedisRepository.updateRankData(key, rankRedis.getUserId(), rankRedis); + } } public void rollbackRank(TeamUser teamUser, int ppp, Long seasonId) { From a44cdc7d865bd345aaba46d5c2eff9cad14c5f7e Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Mon, 4 Sep 2023 16:52:18 +0900 Subject: [PATCH 154/273] =?UTF-8?q?[FEAT]=20rank=20redis=20tier=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/rank/redis/RankRedis.java | 1 + .../domain/rank/redis/RankRedisRepository.java | 5 +++-- .../server/domain/rank/redis/RankRedisService.java | 13 ++++++++----- .../gg/server/domain/tier/service/TierService.java | 3 +++ 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java b/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java index ce6b5e2a0..726203eec 100644 --- a/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java +++ b/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java @@ -77,6 +77,7 @@ public String toString() { ", wins=" + wins + ", losses=" + losses + ", statusMessage='" + statusMessage + '\'' + + ", tierImageUrl='" + tierImageUrl + '\'' + '}'; } } diff --git a/src/main/java/com/gg/server/domain/rank/redis/RankRedisRepository.java b/src/main/java/com/gg/server/domain/rank/redis/RankRedisRepository.java index f312ec14d..957cedb96 100644 --- a/src/main/java/com/gg/server/domain/rank/redis/RankRedisRepository.java +++ b/src/main/java/com/gg/server/domain/rank/redis/RankRedisRepository.java @@ -7,6 +7,7 @@ import org.springframework.data.redis.core.ZSetOperations; import org.springframework.stereotype.Repository; +import java.util.Comparator; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -187,11 +188,11 @@ public List findRanksByUserIds(String key, List userIds) { return objects.stream().map(RankRedis.class::cast).collect(Collectors.toList()); } - public List findAllRanks(String key) { + public List findAllRanksOrderByPppDesc(String key) { List objects = hashOps.values(key); if(objects == null) throw new RedisDataNotFoundException(); - return objects.stream().map(RankRedis.class::cast).collect(Collectors.toList()); + return objects.stream().map(RankRedis.class::cast).sorted(Comparator.comparing(RankRedis::getPpp).reversed()).collect(Collectors.toList()); } public Long countTotalRank(String zSetKey) { diff --git a/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java b/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java index fae226161..5ee9cec35 100644 --- a/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java +++ b/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java @@ -74,7 +74,7 @@ public void updatePPP(TeamUser teamuser, RankRedis myTeam, int enemyScore, Integ public void updateAllTier(String key, Season season) { // 전체 레디스 랭크 티어 새로고침하는 로직 - List rankRedisList = rankRedisRepository.findAllRanks(key); + List rankRedisList = rankRedisRepository.findAllRanksOrderByPppDesc(key); Long totalRankPlayers = rankRepository.countRealRankPlayers(season.getId()); List tierList = tierRepository.findAll(Sort.by(Sort.Direction.ASC, "id")); @@ -89,12 +89,19 @@ public void updateAllTier(String key, Season season) { int top10percentPpp = rankRedisList.get((int) (totalRankPlayers * 0.1)).getPpp(); System.out.println(rankRedisList.size()); + System.out.println("top30percentPpp : " + top30percentPpp); + System.out.println("top10percentPpp : " + top10percentPpp); for (int i = 0; i < rankRedisList.size(); i++) { RankRedis rankRedis = rankRedisList.get(i); + System.out.println("check rankRedis: " + rankRedis); if (rankRedis.getWins() == 0 && rankRedis.getLosses() == 0) { rankRedis.updateTierImage(tierList.get(0).getImageUri()); } else { + if (i < 3) { + rankRedis.updateTierImage(tierList.get(6).getImageUri()); + continue; + } if (rankRedis.getPpp() < 970) { // 970 미만 rankRedis.updateTierImage(tierList.get(1).getImageUri()); @@ -118,10 +125,6 @@ public void updateAllTier(String key, Season season) { } } } - for (int i = 0; i < 3; i++) { - RankRedis rankRedis = rankRedisList.get(i); - rankRedis.updateTierImage(tierList.get(7).getImageUri()); - } for (RankRedis rankRedis : rankRedisList) { rankRedisRepository.updateRankData(key, rankRedis.getUserId(), rankRedis); } diff --git a/src/main/java/com/gg/server/domain/tier/service/TierService.java b/src/main/java/com/gg/server/domain/tier/service/TierService.java index 8821003d7..3af9e8464 100644 --- a/src/main/java/com/gg/server/domain/tier/service/TierService.java +++ b/src/main/java/com/gg/server/domain/tier/service/TierService.java @@ -27,6 +27,9 @@ public void updateAllTier(Season season) { int top30percentPpp = rankList.get((int) (totalRankPlayers * 0.3)).getPpp(); int top10percentPpp = rankList.get((int) (totalRankPlayers * 0.1)).getPpp(); + System.out.println("Tier-top30percentPpp : " + top30percentPpp); + System.out.println("Tier-top10percentPpp : " + top10percentPpp); + for (int i = 0; i < rankList.size(); i++) { Rank rank = rankList.get(i); if (rank.getWins() == 0 && rank.getLosses() == 0) { From 29fbd8bd20d47c9bc7dfc62c819ec6c67e290815 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Mon, 4 Sep 2023 17:20:18 +0900 Subject: [PATCH 155/273] =?UTF-8?q?[FEAT]=20RankRedisService=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gg/server/domain/rank/dto/RankDto.java | 2 ++ .../java/com/gg/server/domain/rank/dto/RankPageResponseDto.java | 2 ++ .../com/gg/server/domain/rank/redis/RankRedisRepository.java | 1 - 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/rank/dto/RankDto.java b/src/main/java/com/gg/server/domain/rank/dto/RankDto.java index 2466ee996..1d02b6c86 100644 --- a/src/main/java/com/gg/server/domain/rank/dto/RankDto.java +++ b/src/main/java/com/gg/server/domain/rank/dto/RankDto.java @@ -4,9 +4,11 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; +import lombok.NoArgsConstructor; @Getter @AllArgsConstructor +@NoArgsConstructor @Builder public class RankDto { private String intraId; diff --git a/src/main/java/com/gg/server/domain/rank/dto/RankPageResponseDto.java b/src/main/java/com/gg/server/domain/rank/dto/RankPageResponseDto.java index ad7c1860d..3bd4a4dee 100644 --- a/src/main/java/com/gg/server/domain/rank/dto/RankPageResponseDto.java +++ b/src/main/java/com/gg/server/domain/rank/dto/RankPageResponseDto.java @@ -2,11 +2,13 @@ import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; import java.util.List; @Getter @AllArgsConstructor +@NoArgsConstructor public class RankPageResponseDto { private int myRank; private int currentPage; diff --git a/src/main/java/com/gg/server/domain/rank/redis/RankRedisRepository.java b/src/main/java/com/gg/server/domain/rank/redis/RankRedisRepository.java index 957cedb96..dd58303c5 100644 --- a/src/main/java/com/gg/server/domain/rank/redis/RankRedisRepository.java +++ b/src/main/java/com/gg/server/domain/rank/redis/RankRedisRepository.java @@ -1,7 +1,6 @@ package com.gg.server.domain.rank.redis; import com.gg.server.domain.rank.exception.RedisDataNotFoundException; -import com.gg.server.global.exception.ErrorCode; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ZSetOperations; From f33d677ce3e69e7e973bee950697bb7421d338aa Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Mon, 4 Sep 2023 17:20:36 +0900 Subject: [PATCH 156/273] =?UTF-8?q?[TEST]=20Rank=20Controller=20Test=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/match/service/MatchTestUtils.java | 2 +- .../rank/redis/RankRedisRepositoryTest.java | 16 ++++++++-------- .../java/com/gg/server/utils/TestDataUtils.java | 8 +++++--- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java b/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java index e681e3d7d..7ccab1101 100644 --- a/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java +++ b/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java @@ -59,7 +59,7 @@ public User createGuestUser() { public RankRedis addUsertoRankRedis(Long userId, Integer ppp, Long seasonId) { String randomId = UUID.randomUUID().toString(); - RankRedis rankRedis = new RankRedis(userId, randomId, ppp, 0, 0,"test"); + RankRedis rankRedis = new RankRedis(userId, randomId, ppp, 0, 0,"test", "aa"); rankRedisRepository.addRankData(RedisKeyManager.getHashKey(seasonId), userId, rankRedis); rankRedisRepository.addToZSet(RedisKeyManager.getZSetKey(seasonId), userId, ppp); return rankRedis; diff --git a/src/test/java/com/gg/server/domain/rank/redis/RankRedisRepositoryTest.java b/src/test/java/com/gg/server/domain/rank/redis/RankRedisRepositoryTest.java index 635b1204c..7e502f811 100644 --- a/src/test/java/com/gg/server/domain/rank/redis/RankRedisRepositoryTest.java +++ b/src/test/java/com/gg/server/domain/rank/redis/RankRedisRepositoryTest.java @@ -157,7 +157,7 @@ public void rankCreateSearch () throws Exception int win = 3; int lose = 4; String statusMessage = "statusMessage"; - RankRedis ranking = new RankRedis(userId, "aa", ppp, win, lose, statusMessage); + RankRedis ranking = new RankRedis(userId, "aa", ppp, win, lose, statusMessage, "aa"); //when redisRepository.addRankData(hashKey, userId, ranking); @@ -181,7 +181,7 @@ public void updateRank () throws Exception int win = 3; int lose = 4; String statusMessage = "statusMessage"; - RankRedis ranking = new RankRedis(userId, "aa", ppp, win, lose, statusMessage); + RankRedis ranking = new RankRedis(userId, "aa", ppp, win, lose, statusMessage, "aa"); redisRepository.addRankData(hashKey, userId, ranking); //when @@ -189,7 +189,7 @@ public void updateRank () throws Exception int newWin = 4; int newLose = 5; String newStatusMessage = "newStatusMessage"; - RankRedis newRanking = new RankRedis(userId, "aa", newPpp, newWin, newLose, newStatusMessage); + RankRedis newRanking = new RankRedis(userId, "aa", newPpp, newWin, newLose, newStatusMessage, "aa"); redisRepository.updateRankData(hashKey, userId, newRanking); //then @@ -211,7 +211,7 @@ public void deleteUserRank () throws Exception int win = 3; int lose = 4; String statusMessage = "statusMessage"; - RankRedis ranking = new RankRedis(userId, "aa", ppp, win, lose, statusMessage); + RankRedis ranking = new RankRedis(userId, "aa", ppp, win, lose, statusMessage, "aa"); redisRepository.addRankData(hashKey, userId, ranking); //when @@ -234,10 +234,10 @@ void findRanksByUserIds() { int ppp3 = 300; int ppp4 = 400; - RankRedis rank1 = new RankRedis(userId, "aa", ppp, 0, 0, "statusMessage"); - RankRedis rank2 = new RankRedis(userId2,"aa", ppp2, 0, 0, "statusMessage"); - RankRedis rank3 = new RankRedis(userId3, "aa", ppp3, 0, 0, "statusMessage"); - RankRedis rank4 = new RankRedis(userId4, "aa", ppp4, 0, 0, "statusMessage"); + RankRedis rank1 = new RankRedis(userId, "aa", ppp, 0, 0, "statusMessage", "aa"); + RankRedis rank2 = new RankRedis(userId2,"aa", ppp2, 0, 0, "statusMessage", "aa"); + RankRedis rank3 = new RankRedis(userId3, "aa", ppp3, 0, 0, "statusMessage", "aa"); + RankRedis rank4 = new RankRedis(userId4, "aa", ppp4, 0, 0, "statusMessage", "aa"); redisRepository.addRankData(hashKey, userId, rank1); redisRepository.addRankData(hashKey, userId2, rank2); redisRepository.addRankData(hashKey, userId3, rank3); diff --git a/src/test/java/com/gg/server/utils/TestDataUtils.java b/src/test/java/com/gg/server/utils/TestDataUtils.java index e62eb3ff0..17d46a665 100644 --- a/src/test/java/com/gg/server/utils/TestDataUtils.java +++ b/src/test/java/com/gg/server/utils/TestDataUtils.java @@ -185,7 +185,7 @@ public void createUserRank(User newUser, String statusMessage, Season season) { String zSetKey = RedisKeyManager.getZSetKey(season.getId()); String hashKey = RedisKeyManager.getHashKey(season.getId()); redisRepository.addRankData(hashKey, newUser.getId(), - new RankRedis(newUser.getId(), "aa", season.getStartPpp(), 0, 0, statusMessage)); + new RankRedis(newUser.getId(), "aa", season.getStartPpp(), 0, 0, statusMessage, "aa")); Rank userRank = Rank.builder() .user(newUser) .season(season) @@ -203,7 +203,7 @@ public void createUserRank(User newUser, String statusMessage, Season season, Ti String zSetKey = RedisKeyManager.getZSetKey(season.getId()); String hashKey = RedisKeyManager.getHashKey(season.getId()); redisRepository.addRankData(hashKey, newUser.getId(), - new RankRedis(newUser.getId(), "aa", season.getStartPpp(), 0, 0, statusMessage)); + new RankRedis(newUser.getId(), "aa", season.getStartPpp(), 0, 0, statusMessage, "aa")); Rank userRank = Rank.builder() .user(newUser) .season(season) @@ -219,9 +219,10 @@ public void createUserRank(User newUser, String statusMessage, Season season, Ti public void createUserRank(User newUser, String statusMessage, Season season, int ppp) { String zSetKey = RedisKeyManager.getZSetKey(season.getId()); String hashKey = RedisKeyManager.getHashKey(season.getId()); + Tier tier = tierRepository.getById(1L); redisRepository.addToZSet(zSetKey, newUser.getId(), ppp); redisRepository.addRankData(hashKey, newUser.getId(), - new RankRedis(newUser.getId(), "aa", ppp, 1, 0, statusMessage)); + new RankRedis(newUser.getId(), "aa", ppp, 1, 0, statusMessage, "aa")); Rank userRank = Rank.builder() .user(newUser) .season(season) @@ -229,6 +230,7 @@ public void createUserRank(User newUser, String statusMessage, Season season, in .wins(1) .losses(0) .statusMessage(statusMessage) + .tier(tier) .build(); rankRepository.save(userRank); } From 31a1bbc4c85285cc82acf35af93583eb2d37ad5f Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Mon, 4 Sep 2023 17:26:18 +0900 Subject: [PATCH 157/273] =?UTF-8?q?[CORE]=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=B6=9C=EB=A0=A5=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/rank/redis/RankRedisService.java | 12 ------------ .../gg/server/domain/tier/service/TierService.java | 3 --- 2 files changed, 15 deletions(-) diff --git a/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java b/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java index 5ee9cec35..82ae9c62f 100644 --- a/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java +++ b/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java @@ -78,23 +78,11 @@ public void updateAllTier(String key, Season season) { Long totalRankPlayers = rankRepository.countRealRankPlayers(season.getId()); List tierList = tierRepository.findAll(Sort.by(Sort.Direction.ASC, "id")); - for (Tier tier : tierList) { - System.out.println(tier); - } - - System.out.println("RankRedisService : Update All Tier"); - System.out.println("전체 활성 랭크 유저 수 : " + totalRankPlayers); - int top30percentPpp = rankRedisList.get((int) (totalRankPlayers * 0.3)).getPpp(); int top10percentPpp = rankRedisList.get((int) (totalRankPlayers * 0.1)).getPpp(); - System.out.println(rankRedisList.size()); - System.out.println("top30percentPpp : " + top30percentPpp); - System.out.println("top10percentPpp : " + top10percentPpp); - for (int i = 0; i < rankRedisList.size(); i++) { RankRedis rankRedis = rankRedisList.get(i); - System.out.println("check rankRedis: " + rankRedis); if (rankRedis.getWins() == 0 && rankRedis.getLosses() == 0) { rankRedis.updateTierImage(tierList.get(0).getImageUri()); } else { diff --git a/src/main/java/com/gg/server/domain/tier/service/TierService.java b/src/main/java/com/gg/server/domain/tier/service/TierService.java index 3af9e8464..8821003d7 100644 --- a/src/main/java/com/gg/server/domain/tier/service/TierService.java +++ b/src/main/java/com/gg/server/domain/tier/service/TierService.java @@ -27,9 +27,6 @@ public void updateAllTier(Season season) { int top30percentPpp = rankList.get((int) (totalRankPlayers * 0.3)).getPpp(); int top10percentPpp = rankList.get((int) (totalRankPlayers * 0.1)).getPpp(); - System.out.println("Tier-top30percentPpp : " + top30percentPpp); - System.out.println("Tier-top10percentPpp : " + top10percentPpp); - for (int i = 0; i < rankList.size(); i++) { Rank rank = rankList.get(i); if (rank.getWins() == 0 && rank.getLosses() == 0) { From 085a60081df5936c87c676d2eec327ce48657ccd Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Mon, 4 Sep 2023 17:40:30 +0900 Subject: [PATCH 158/273] [FIX] setter moved to column --- src/main/java/com/gg/server/domain/user/data/UserImage.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/user/data/UserImage.java b/src/main/java/com/gg/server/domain/user/data/UserImage.java index 5013c8419..c6d046080 100644 --- a/src/main/java/com/gg/server/domain/user/data/UserImage.java +++ b/src/main/java/com/gg/server/domain/user/data/UserImage.java @@ -13,7 +13,6 @@ @AllArgsConstructor @Entity @Getter -@Setter public class UserImage { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -33,6 +32,7 @@ public class UserImage { private LocalDateTime createdAt; @NotNull + @Setter @Column(name = "is_deleted") private Boolean isDeleted; From 60e26133ef4d4e50b2070858b16137699911c04a Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sun, 3 Sep 2023 13:12:29 +0900 Subject: [PATCH 159/273] [FEAT] GET UserImage delete-list --- .../user/controller/UserAdminController.java | 15 ++++++++--- .../user/data/UserImageAdminRepository.java | 4 +++ .../admin/user/dto/UserImageAdminDto.java | 27 +++++++++++++++++++ .../dto/UserImageListAdminResponseDto.java | 16 +++++++++++ .../admin/user/service/UserAdminService.java | 14 ++++++---- 5 files changed, 67 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/gg/server/admin/user/dto/UserImageAdminDto.java create mode 100644 src/main/java/com/gg/server/admin/user/dto/UserImageListAdminResponseDto.java diff --git a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java index b15cd4884..29ab041c5 100644 --- a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java +++ b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java @@ -1,11 +1,9 @@ package com.gg.server.admin.user.controller; -import com.gg.server.admin.user.dto.UserDetailAdminResponseDto; -import com.gg.server.admin.user.dto.UserSearchAdminRequestDto; -import com.gg.server.admin.user.dto.UserSearchAdminResponseDto; -import com.gg.server.admin.user.dto.UserUpdateAdminRequestDto; +import com.gg.server.admin.user.dto.*; import com.gg.server.admin.user.service.UserAdminService; import com.gg.server.domain.rank.exception.RankUpdateException; +import com.gg.server.domain.user.dto.UserImageResponseDto; import com.gg.server.domain.user.exception.UserImageLargeException; import com.gg.server.domain.user.exception.UserImageTypeException; import com.gg.server.global.dto.PageRequestDto; @@ -68,4 +66,13 @@ public ResponseEntity deleteUserProfileImage(@PathVariable String intraId) { userAdminService.deleteUserProfileImage(intraId); return new ResponseEntity(HttpStatus.NO_CONTENT); } + + @GetMapping("/delete-list") + public ResponseEntity getUserImageDeleteList(@ModelAttribute @Valid PageRequestDto pageRequestDto) { + Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, + pageRequestDto.getSize(), + Sort.by("createdAt").descending()); + return ResponseEntity.ok() + .body(userAdminService.getUserImageDeleteList(pageable)); + } } diff --git a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java index 43d96f8e8..9e93e5f7f 100644 --- a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java +++ b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java @@ -1,6 +1,9 @@ package com.gg.server.admin.user.data; +import com.gg.server.admin.user.dto.UserImageAdminDto; import com.gg.server.domain.user.data.User; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import com.gg.server.domain.user.data.UserImage; @@ -8,4 +11,5 @@ public interface UserImageAdminRepository extends JpaRepository{ Optional findTopByUserAndIsDeletedOrderByIdDesc(User user, Boolean isDeleted); + Page findAllByIsDeleted(Pageable pageable, Boolean isDeleted); } diff --git a/src/main/java/com/gg/server/admin/user/dto/UserImageAdminDto.java b/src/main/java/com/gg/server/admin/user/dto/UserImageAdminDto.java new file mode 100644 index 000000000..228fc0ae0 --- /dev/null +++ b/src/main/java/com/gg/server/admin/user/dto/UserImageAdminDto.java @@ -0,0 +1,27 @@ +package com.gg.server.admin.user.dto; + +import com.gg.server.domain.user.data.UserImage; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class UserImageAdminDto { + Long id; + Long userId; + String imageUri; + LocalDateTime createdAt; + Boolean isDeleted; + + public UserImageAdminDto(UserImage userImage) { + this.id = userImage.getId(); + this.userId = userImage.getUser().getId(); + this.imageUri = userImage.getImageUri(); + this.createdAt = userImage.getCreatedAt(); + this.isDeleted = userImage.getIsDeleted(); + } +} diff --git a/src/main/java/com/gg/server/admin/user/dto/UserImageListAdminResponseDto.java b/src/main/java/com/gg/server/admin/user/dto/UserImageListAdminResponseDto.java new file mode 100644 index 000000000..1c07d01a2 --- /dev/null +++ b/src/main/java/com/gg/server/admin/user/dto/UserImageListAdminResponseDto.java @@ -0,0 +1,16 @@ +package com.gg.server.admin.user.dto; + +import com.gg.server.admin.coin.dto.CoinPolicyAdminResponseDto; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class UserImageListAdminResponseDto { + private List userImageList; + private int totalPage; +} diff --git a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java index 3ba8b77ee..147d0aeac 100644 --- a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java +++ b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java @@ -3,10 +3,7 @@ import com.gg.server.admin.season.data.SeasonAdminRepository; import com.gg.server.admin.user.data.UserAdminRepository; import com.gg.server.admin.user.data.UserImageAdminRepository; -import com.gg.server.admin.user.dto.UserDetailAdminResponseDto; -import com.gg.server.admin.user.dto.UserSearchAdminDto; -import com.gg.server.admin.user.dto.UserSearchAdminResponseDto; -import com.gg.server.admin.user.dto.UserUpdateAdminRequestDto; +import com.gg.server.admin.user.dto.*; import com.gg.server.domain.rank.data.Rank; import com.gg.server.domain.rank.data.RankRepository; import com.gg.server.domain.rank.exception.RankNotFoundException; @@ -18,7 +15,6 @@ import com.gg.server.domain.season.exception.SeasonNotFoundException; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserImage; -import com.gg.server.domain.user.data.UserImageRepository; import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.service.UserFindService; import com.gg.server.global.utils.aws.AsyncNewUserImageUploader; @@ -129,4 +125,12 @@ public void deleteUserProfileImage(String intraId) { UserImage userImage = userImageAdminRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElseThrow(UserNotFoundException::new); userImage.setIsDeleted(true); } + + @Transactional(readOnly = true) + public UserImageListAdminResponseDto getUserImageDeleteList(Pageable pageable) { + Page userImagePage = userImageAdminRepository.findAllByIsDeleted(pageable, true); + Page userImageAdminDto = userImagePage.map(UserImageAdminDto::new); + + return new UserImageListAdminResponseDto(userImageAdminDto.getContent(), userImageAdminDto.getTotalPages()); + } } From 67370d446c8bfe9ee7034d974cc0014b085d8027 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sun, 3 Sep 2023 13:22:55 +0900 Subject: [PATCH 160/273] [TEST] GET UserImage delete-list --- .../controller/UserAdminControllerTest.java | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java index 993f5197d..d232ff8f0 100644 --- a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java @@ -3,9 +3,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.gg.server.admin.user.data.UserAdminRepository; import com.gg.server.admin.user.data.UserImageAdminRepository; -import com.gg.server.admin.user.dto.UserDetailAdminResponseDto; -import com.gg.server.admin.user.dto.UserSearchAdminDto; -import com.gg.server.admin.user.dto.UserSearchAdminResponseDto; +import com.gg.server.admin.user.dto.*; import com.gg.server.admin.user.service.UserAdminService; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserImage; @@ -170,4 +168,29 @@ public void deleteUserProfileImageTest() throws Exception{ UserImage CurrentUserImage = userImageAdminRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElseThrow(UserNotFoundException::new); Assertions.assertThat(PrevUserImage.getId()).isNotEqualTo(CurrentUserImage.getId()); } + + @Test + @DisplayName("GET /pingpong/admin/users/delete-list") + @Transactional + public void getUserImageDeleteListTest() throws Exception{ + //given + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + int page = 1; + int size = 30; + String url = "/pingpong/admin/users/delete-list?page=1"; + + //when + //200 성공 + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + UserImageListAdminResponseDto actureResponse = objectMapper.readValue(contentAsString, UserImageListAdminResponseDto.class); + + //then + //각 유저의 이미지가 삭제된 이미지인지 확인 + List actureUserImageList = actureResponse.getUserImageList(); + for (UserImageAdminDto userImageDto : actureUserImageList) + Assertions.assertThat(userImageDto.getIsDeleted()).isEqualTo(true); + } } \ No newline at end of file From 5a45b8510baa06351710c8bd7f68ede645dda8b0 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sun, 3 Sep 2023 17:03:39 +0900 Subject: [PATCH 161/273] [FEAT] GET user profile changed list --- .../admin/user/controller/UserAdminController.java | 11 ++++++++++- .../admin/user/data/UserImageAdminRepository.java | 6 ++++++ .../server/admin/user/service/UserAdminService.java | 8 ++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java index 29ab041c5..f5e847f9b 100644 --- a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java +++ b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java @@ -71,8 +71,17 @@ public ResponseEntity deleteUserProfileImage(@PathVariable String intraId) { public ResponseEntity getUserImageDeleteList(@ModelAttribute @Valid PageRequestDto pageRequestDto) { Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, pageRequestDto.getSize(), - Sort.by("createdAt").descending()); + Sort.by("id").descending()); return ResponseEntity.ok() .body(userAdminService.getUserImageDeleteList(pageable)); } + + @GetMapping("/images") + public ResponseEntity getUserImageList(@ModelAttribute @Valid PageRequestDto pageRequestDto) { + Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, + pageRequestDto.getSize(), + Sort.by("id").descending()); + return ResponseEntity.ok() + .body(userAdminService.getUserImageList(pageable)); + } } diff --git a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java index 9e93e5f7f..e4cbfad05 100644 --- a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java +++ b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java @@ -6,10 +6,16 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import com.gg.server.domain.user.data.UserImage; +import org.springframework.data.jpa.repository.Query; import java.util.Optional; public interface UserImageAdminRepository extends JpaRepository{ Optional findTopByUserAndIsDeletedOrderByIdDesc(User user, Boolean isDeleted); Page findAllByIsDeleted(Pageable pageable, Boolean isDeleted); + + @Query(value = "SELECT * FROM user_image WHERE id NOT IN (" + + "SELECT MIN(id) FROM user_image GROUP BY user_id" + + ") ORDER BY id DESC", nativeQuery = true) + Page findChanged(Pageable pageable); } diff --git a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java index 147d0aeac..7efc22ed8 100644 --- a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java +++ b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java @@ -133,4 +133,12 @@ public UserImageListAdminResponseDto getUserImageDeleteList(Pageable pageable) { return new UserImageListAdminResponseDto(userImageAdminDto.getContent(), userImageAdminDto.getTotalPages()); } + + @Transactional(readOnly = true) + public UserImageListAdminResponseDto getUserImageList(Pageable pageable) { + Page userImagePage = userImageAdminRepository.findChanged(pageable); + Page userImageAdminDto = userImagePage.map(UserImageAdminDto::new); + + return new UserImageListAdminResponseDto(userImageAdminDto.getContent(), userImageAdminDto.getTotalPages()); + } } From b179e9eac214a07a3e6a3371d45515c972887f83 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sun, 3 Sep 2023 17:12:50 +0900 Subject: [PATCH 162/273] [TEST] GET user profile changed list --- .../controller/UserAdminControllerTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java index d232ff8f0..bee144242 100644 --- a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java @@ -28,6 +28,7 @@ import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.delete; import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -193,4 +194,24 @@ public void getUserImageDeleteListTest() throws Exception{ for (UserImageAdminDto userImageDto : actureUserImageList) Assertions.assertThat(userImageDto.getIsDeleted()).isEqualTo(true); } + + @Test + @DisplayName("GET /pingpong/admin/users/images") + @Transactional + public void getUserImageListTest() throws Exception{ + //given + String accessToken = testDataUtils.getAdminLoginAccessToken(); + String url = "/pingpong/admin/users/images?page=1"; + + //when + //200 성공 + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + + //then + //각 유저의 이미지가 삭제된 이미지인지 확인 + UserImageListAdminResponseDto actureResponse = objectMapper.readValue(contentAsString, UserImageListAdminResponseDto.class); + assertThat(actureResponse.getUserImageList().size()).isEqualTo(3); + } } \ No newline at end of file From 94f5f757d1907af55b367baeec89b6264532b9fb Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sun, 3 Sep 2023 17:21:46 +0900 Subject: [PATCH 163/273] =?UTF-8?q?[FIX]=20=EC=A4=91=EB=B3=B5=20sort=20?= =?UTF-8?q?=EC=BF=BC=EB=A6=AC=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/admin/user/controller/UserAdminController.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java index f5e847f9b..91ada4b76 100644 --- a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java +++ b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java @@ -79,8 +79,7 @@ public ResponseEntity getUserImageDeleteList(@Mod @GetMapping("/images") public ResponseEntity getUserImageList(@ModelAttribute @Valid PageRequestDto pageRequestDto) { Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, - pageRequestDto.getSize(), - Sort.by("id").descending()); + pageRequestDto.getSize()); return ResponseEntity.ok() .body(userAdminService.getUserImageList(pageable)); } From f124fb52b8075b19fdf81316de60724add908cba Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sun, 3 Sep 2023 20:13:19 +0900 Subject: [PATCH 164/273] [FEAT] search user image list by intraId --- .../admin/user/controller/UserAdminController.java | 8 ++++++++ .../server/admin/user/data/UserImageAdminRepository.java | 3 +++ .../gg/server/admin/user/service/UserAdminService.java | 9 +++++++++ 3 files changed, 20 insertions(+) diff --git a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java index 91ada4b76..b0c3b419a 100644 --- a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java +++ b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java @@ -83,4 +83,12 @@ public ResponseEntity getUserImageList(@ModelAttr return ResponseEntity.ok() .body(userAdminService.getUserImageList(pageable)); } + + @GetMapping("/images/{intraId}") + public ResponseEntity getUserImage(@ModelAttribute @Valid PageRequestDto pageRequestDto, @PathVariable String intraId) { + Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, + pageRequestDto.getSize()); + return ResponseEntity.ok() + .body(userAdminService.getUserImageListByIntraId(pageable, intraId)); + } } diff --git a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java index e4cbfad05..34075a3da 100644 --- a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java +++ b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java @@ -12,10 +12,13 @@ public interface UserImageAdminRepository extends JpaRepository{ Optional findTopByUserAndIsDeletedOrderByIdDesc(User user, Boolean isDeleted); + Page findAllByIsDeleted(Pageable pageable, Boolean isDeleted); @Query(value = "SELECT * FROM user_image WHERE id NOT IN (" + "SELECT MIN(id) FROM user_image GROUP BY user_id" + ") ORDER BY id DESC", nativeQuery = true) Page findChanged(Pageable pageable); + + Page findAllByUserOrderByIdDesc(Pageable pageable, User user); } diff --git a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java index 7efc22ed8..4d4c77945 100644 --- a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java +++ b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java @@ -141,4 +141,13 @@ public UserImageListAdminResponseDto getUserImageList(Pageable pageable) { return new UserImageListAdminResponseDto(userImageAdminDto.getContent(), userImageAdminDto.getTotalPages()); } + + @Transactional(readOnly = true) + public UserImageListAdminResponseDto getUserImageListByIntraId(Pageable pageable, String intraId) { + User user = userAdminRepository.findByIntraId(intraId).orElseThrow(UserNotFoundException::new); + Page userImagePage = userImageAdminRepository.findAllByUserOrderByIdDesc(pageable, user); + Page userImageAdminDto = userImagePage.map(UserImageAdminDto::new); + + return new UserImageListAdminResponseDto(userImageAdminDto.getContent(), userImageAdminDto.getTotalPages()); + } } From 09287e97c191c6445850e68a3b435a30e10151b5 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sun, 3 Sep 2023 20:16:03 +0900 Subject: [PATCH 165/273] [TEST] search user image list by intraId --- .../controller/UserAdminControllerTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java index bee144242..7383d6ed9 100644 --- a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java @@ -214,4 +214,25 @@ public void getUserImageListTest() throws Exception{ UserImageListAdminResponseDto actureResponse = objectMapper.readValue(contentAsString, UserImageListAdminResponseDto.class); assertThat(actureResponse.getUserImageList().size()).isEqualTo(3); } + + @Test + @DisplayName("GET /pingpong/admin/users/images/{intraId}") + @Transactional + public void getUserImageListByIntraIdTest() throws Exception{ + //given + String accessToken = testDataUtils.getAdminLoginAccessToken(); + String intraId = "klew"; + String url = "/pingpong/admin/users/images/" + intraId + "?page=1"; + + //when + //200 성공 + String contentAsString = mockMvc.perform(get(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().isOk()) + .andReturn().getResponse().getContentAsString(); + + //then + //각 유저의 이미지가 삭제된 이미지인지 확인 + UserImageListAdminResponseDto actureResponse = objectMapper.readValue(contentAsString, UserImageListAdminResponseDto.class); + assertThat(actureResponse.getUserImageList().size()).isEqualTo(3); + } } \ No newline at end of file From 864f0c518d43d85a82965885dc35f2812b8f084e Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sun, 3 Sep 2023 20:35:10 +0900 Subject: [PATCH 166/273] =?UTF-8?q?[FIX]=20=EC=B2=98=EC=9D=8C=20=EC=9D=B8?= =?UTF-8?q?=ED=8A=B8=EB=9D=BC=EB=84=B7=20=ED=94=84=EB=A1=9C=ED=95=84?= =?UTF-8?q?=EC=9D=80=20=EB=B3=B4=EB=82=B4=EC=A7=80=20=EC=95=8A=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/admin/user/data/UserImageAdminRepository.java | 6 +++++- .../com/gg/server/admin/user/service/UserAdminService.java | 2 +- .../admin/user/controller/UserAdminControllerTest.java | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java index 34075a3da..d50e405d6 100644 --- a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java +++ b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java @@ -2,6 +2,7 @@ import com.gg.server.admin.user.dto.UserImageAdminDto; import com.gg.server.domain.user.data.User; +import io.lettuce.core.dynamic.annotation.Param; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -18,7 +19,10 @@ public interface UserImageAdminRepository extends JpaRepository @Query(value = "SELECT * FROM user_image WHERE id NOT IN (" + "SELECT MIN(id) FROM user_image GROUP BY user_id" + ") ORDER BY id DESC", nativeQuery = true) - Page findChanged(Pageable pageable); + Page findAllChanged(Pageable pageable); + @Query(value = "SELECT * FROM user_image WHERE id NOT IN (" + + "SELECT MIN(id) FROM user_image GROUP BY user_id" + + ") AND user_id = ?1 ORDER BY id DESC", nativeQuery = true) Page findAllByUserOrderByIdDesc(Pageable pageable, User user); } diff --git a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java index 4d4c77945..13500c8c7 100644 --- a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java +++ b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java @@ -136,7 +136,7 @@ public UserImageListAdminResponseDto getUserImageDeleteList(Pageable pageable) { @Transactional(readOnly = true) public UserImageListAdminResponseDto getUserImageList(Pageable pageable) { - Page userImagePage = userImageAdminRepository.findChanged(pageable); + Page userImagePage = userImageAdminRepository.findAllChanged(pageable); Page userImageAdminDto = userImagePage.map(UserImageAdminDto::new); return new UserImageListAdminResponseDto(userImageAdminDto.getContent(), userImageAdminDto.getTotalPages()); diff --git a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java index 7383d6ed9..3c8bc3ad2 100644 --- a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java @@ -233,6 +233,6 @@ public void getUserImageListByIntraIdTest() throws Exception{ //then //각 유저의 이미지가 삭제된 이미지인지 확인 UserImageListAdminResponseDto actureResponse = objectMapper.readValue(contentAsString, UserImageListAdminResponseDto.class); - assertThat(actureResponse.getUserImageList().size()).isEqualTo(3); + assertThat(actureResponse.getUserImageList().size()).isEqualTo(2); } } \ No newline at end of file From 2c47acaa86d1aa4658a01e28a625b5698635e205 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Mon, 4 Sep 2023 15:32:45 +0900 Subject: [PATCH 167/273] [FIX] get imageUri toString error solved --- .../com/gg/server/admin/user/service/UserAdminService.java | 3 ++- .../java/com/gg/server/domain/user/service/UserService.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java index 13500c8c7..8dd3b1451 100644 --- a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java +++ b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java @@ -116,7 +116,8 @@ private void updateUserRank(Long userId, Long currSeasonId, UserUpdateAdminReque public String getUserImageToString(User user) { UserImage userImage = userImageAdminRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElse(null); - return userImage.toString(); + assert userImage != null; + return userImage.getImageUri(); } @Transactional diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 7b91b5ac5..33f18452a 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -360,6 +360,7 @@ public void checkUseStatus(Receipt receipt) { public String getUserImageToString(User user) { UserImage userImage = userImageRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElse(null); - return userImage.toString(); + assert userImage != null; + return userImage.getImageUri(); } } From 93e13e2a5eec41e120e16053a48be1a189ff1ec9 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Mon, 4 Sep 2023 19:06:23 +0900 Subject: [PATCH 168/273] [FIX] fix imageuri get address --- .../java/com/gg/server/domain/user/service/UserService.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 33f18452a..3934c326e 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -359,8 +359,12 @@ public void checkUseStatus(Receipt receipt) { } public String getUserImageToString(User user) { +<<<<<<< Updated upstream UserImage userImage = userImageRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElse(null); assert userImage != null; +======= + UserImage userImage = userImageRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElse(null); assert userImage != null; +>>>>>>> Stashed changes return userImage.getImageUri(); } } From d3c8129ba21e9f4fc7a18688966321a3ea57065a Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Mon, 4 Sep 2023 19:06:33 +0900 Subject: [PATCH 169/273] =?UTF-8?q?[REFACTOR]=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=EA=B5=AC=EB=A7=A4=20=EC=8B=9C=20=EC=B9=B4=EC=B9=B4?= =?UTF-8?q?=EC=98=A4=20=EC=9C=A0=EC=A0=80=EB=8A=94=20=EA=B5=AC=EB=A7=A4=20?= =?UTF-8?q?=EB=B6=88=EA=B0=80=20=EC=97=90=EB=9F=AC=20=EB=B0=9C=EC=83=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/item/exception/KakaoPurchaseException.java | 10 ++++++++++ .../com/gg/server/domain/item/service/ItemService.java | 6 ++++++ .../java/com/gg/server/global/exception/ErrorCode.java | 3 +++ 3 files changed, 19 insertions(+) create mode 100644 src/main/java/com/gg/server/domain/item/exception/KakaoPurchaseException.java diff --git a/src/main/java/com/gg/server/domain/item/exception/KakaoPurchaseException.java b/src/main/java/com/gg/server/domain/item/exception/KakaoPurchaseException.java new file mode 100644 index 000000000..07b623d6e --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/exception/KakaoPurchaseException.java @@ -0,0 +1,10 @@ +package com.gg.server.domain.item.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.BusinessException; + +public class KakaoPurchaseException extends BusinessException { + public KakaoPurchaseException() { + super("카카오 게스트는 구매할 수 없습니다.", ErrorCode.GUEST_ROLE_PURCHASE_FORBIDDEN); + } +} diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index 40ccaf43f..fd89d78cb 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -7,6 +7,7 @@ import com.gg.server.domain.item.exception.InsufficientGgcoinException; import com.gg.server.domain.item.exception.ItemNotFoundException; import com.gg.server.domain.item.exception.ItemNotPurchasableException; +import com.gg.server.domain.item.exception.KakaoPurchaseException; import com.gg.server.domain.receipt.data.Receipt; import com.gg.server.domain.receipt.data.ReceiptRepository; import com.gg.server.domain.receipt.type.ItemStatus; @@ -14,6 +15,7 @@ import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.domain.user.exception.UserNotFoundException; +import com.gg.server.domain.user.type.RoleType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -64,6 +66,10 @@ public void purchaseItem(Long itemId, UserDto userDto) { User payUser = userRepository.findById(userDto.getId()) .orElseThrow(() -> new UserNotFoundException()); + if (payUser.getRoleType() == RoleType.GUEST) { + throw new KakaoPurchaseException(); + } + payUser.payGgCoin(finalPrice); //상품 구매에 따른 차감 Receipt receipt = new Receipt(item, userDto.getIntraId(), userDto.getIntraId(), diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index 00ea3dd9c..e72a90da0 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -42,6 +42,9 @@ public enum ErrorCode { ITEM_TYPE_NOT_MATCHED(400, "IT200", "ITEM TYPE NOT MATCHED"), ITEM_NOT_PURCHASABLE(400, "IT201", "ITEM NOT PURCHASABLE"), INSUFFICIENT_GGCOIN(400,"IT202","INSUFFICIENT GGCOIN"), + GUEST_ROLE_PURCHASE_FORBIDDEN(403, "IT203", "Guest role users cannot purchase items."), + GUEST_ROLE_GIFT_FORBIDDEN(403, "IT204", "Guest role users cannot gift items."), + //receipt RECEIPT_NOT_FOUND(404, "RC100", "RECEIPT NOT FOUND"), From 0e95f58833a5607407b8188b57347e196a85511b Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Mon, 4 Sep 2023 19:08:25 +0900 Subject: [PATCH 170/273] [FIX] fix conflict service --- .../java/com/gg/server/domain/user/service/UserService.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 3934c326e..33f18452a 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -359,12 +359,8 @@ public void checkUseStatus(Receipt receipt) { } public String getUserImageToString(User user) { -<<<<<<< Updated upstream UserImage userImage = userImageRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElse(null); assert userImage != null; -======= - UserImage userImage = userImageRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElse(null); assert userImage != null; ->>>>>>> Stashed changes return userImage.getImageUri(); } } From 9a3923ad953d2dfb4969ae13f2136cd3c073ac8b Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Mon, 4 Sep 2023 19:23:26 +0900 Subject: [PATCH 171/273] =?UTF-8?q?[REFACTOR]=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=EA=B5=AC=EB=A7=A4=20=EC=8B=9C=20=EC=B9=B4=EC=B9=B4?= =?UTF-8?q?=EC=98=A4=20=EC=9C=A0=EC=A0=80=EB=8A=94=20=EC=84=A0=EB=AC=BC=20?= =?UTF-8?q?=EB=B6=88=EA=B0=80=20=EC=97=90=EB=9F=AC=20=EB=B0=9C=EC=83=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/item/exception/KakaoGiftException.java | 10 ++++++++++ .../item/exception/KakaoPurchaseException.java | 10 ++++++++++ .../gg/server/domain/item/service/ItemService.java | 12 +++++++++--- .../com/gg/server/global/exception/ErrorCode.java | 2 ++ 4 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/gg/server/domain/item/exception/KakaoGiftException.java create mode 100644 src/main/java/com/gg/server/domain/item/exception/KakaoPurchaseException.java diff --git a/src/main/java/com/gg/server/domain/item/exception/KakaoGiftException.java b/src/main/java/com/gg/server/domain/item/exception/KakaoGiftException.java new file mode 100644 index 000000000..e85c4190e --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/exception/KakaoGiftException.java @@ -0,0 +1,10 @@ +package com.gg.server.domain.item.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.BusinessException; + +public class KakaoGiftException extends BusinessException { + public KakaoGiftException() { + super("카카오 게스트는 선물할 수 없습니다.", ErrorCode.GUEST_ROLE_GIFT_FORBIDDEN); + } +} diff --git a/src/main/java/com/gg/server/domain/item/exception/KakaoPurchaseException.java b/src/main/java/com/gg/server/domain/item/exception/KakaoPurchaseException.java new file mode 100644 index 000000000..11517d56c --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/exception/KakaoPurchaseException.java @@ -0,0 +1,10 @@ +package com.gg.server.domain.item.exception; + + import com.gg.server.global.exception.ErrorCode; + import com.gg.server.global.exception.custom.BusinessException; + +public class KakaoPurchaseException extends BusinessException { + public KakaoPurchaseException() { + super("카카오 게스트는 구매할 수 없습니다.", ErrorCode.GUEST_ROLE_PURCHASE_FORBIDDEN); + } +} \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index 9fb059a54..7163341be 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -7,9 +7,7 @@ import com.gg.server.domain.item.dto.ItemStoreResponseDto; import com.gg.server.domain.item.dto.UserItemListResponseDto; import com.gg.server.domain.item.dto.UserItemResponseDto; -import com.gg.server.domain.item.exception.InsufficientGgcoinException; -import com.gg.server.domain.item.exception.ItemNotFoundException; -import com.gg.server.domain.item.exception.ItemNotPurchasableException; +import com.gg.server.domain.item.exception.*; import com.gg.server.domain.noti.service.NotiService; import com.gg.server.domain.receipt.data.Receipt; import com.gg.server.domain.receipt.data.ReceiptRepository; @@ -18,6 +16,7 @@ import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.domain.user.exception.UserNotFoundException; +import com.gg.server.domain.user.type.RoleType; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -108,10 +107,17 @@ public void giftItem(Long itemId, String ownerId, UserDto userDto) { User payUser = userRepository.findById(userDto.getId()) .orElseThrow(() -> new UserNotFoundException()); + if (payUser.getRoleType() == RoleType.GUEST) { + throw new KakaoPurchaseException(); + } User owner = userRepository.findByIntraId(ownerId) .orElseThrow(() -> new UserNotFoundException()); + if (owner.getRoleType() == RoleType.GUEST) { + throw new KakaoGiftException(); + } + payUser.payGgCoin(finalPrice); //상품 구매에 따른 차감 Receipt receipt = new Receipt(item, userDto.getIntraId(), ownerId, diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index d3d1026d3..92612484e 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -42,6 +42,8 @@ public enum ErrorCode { ITEM_TYPE_NOT_MATCHED(400, "IT200", "ITEM TYPE NOT MATCHED"), ITEM_NOT_PURCHASABLE(400, "IT201", "ITEM NOT PURCHASABLE"), INSUFFICIENT_GGCOIN(400,"IT202","INSUFFICIENT GGCOIN"), + GUEST_ROLE_PURCHASE_FORBIDDEN(403, "IT203", "Guest role users cannot purchase items."), + GUEST_ROLE_GIFT_FORBIDDEN(403, "IT204", "Guest role users cannot gift items."), ITEM_IMAGE_TOO_LARGE(413, "IT401", "ITEM IMAGE IS TOO LARGE"), ITEM_IMAGE_WRONG_TYPE(415, "IT402", "ITEM IMAGE TYPE IS WRONG"), From e287b317962f7eaab7a79b1a784807b0dee895b3 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Mon, 4 Sep 2023 19:30:36 +0900 Subject: [PATCH 172/273] =?UTF-8?q?[STYLE]=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gg/server/global/exception/ErrorCode.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index 1c4ebd1f7..0eb74b15e 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -43,8 +43,8 @@ public enum ErrorCode { ITEM_TYPE_NOT_MATCHED(400, "IT200", "ITEM TYPE NOT MATCHED"), ITEM_NOT_PURCHASABLE(400, "IT201", "ITEM NOT PURCHASABLE"), INSUFFICIENT_GGCOIN(400,"IT202","INSUFFICIENT GGCOIN"), - GUEST_ROLE_PURCHASE_FORBIDDEN(403, "IT203", "Guest role users cannot purchase items."), - GUEST_ROLE_GIFT_FORBIDDEN(403, "IT204", "Guest role users cannot gift items."), + GUEST_ROLE_PURCHASE_FORBIDDEN(403, "IT203", "GUEST ROLE USERS CANNOT PURCHASE ITEMS."), + GUEST_ROLE_GIFT_FORBIDDEN(403, "IT204", "GUEST ROLE USERS CANNOT GIFT ITEMS."), ITEM_IMAGE_TOO_LARGE(413, "IT401", "ITEM IMAGE IS TOO LARGE"), ITEM_IMAGE_WRONG_TYPE(415, "IT402", "ITEM IMAGE TYPE IS WRONG"), From 2db95b144e247ca9acaa930c0d96b66bfb3e3e19 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Mon, 4 Sep 2023 19:31:51 +0900 Subject: [PATCH 173/273] =?UTF-8?q?[STYLE]=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gg/server/global/exception/ErrorCode.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index fdf861969..0eb74b15e 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -43,9 +43,8 @@ public enum ErrorCode { ITEM_TYPE_NOT_MATCHED(400, "IT200", "ITEM TYPE NOT MATCHED"), ITEM_NOT_PURCHASABLE(400, "IT201", "ITEM NOT PURCHASABLE"), INSUFFICIENT_GGCOIN(400,"IT202","INSUFFICIENT GGCOIN"), - GUEST_ROLE_PURCHASE_FORBIDDEN(403, "IT203", "Guest role users cannot purchase items."), - GUEST_ROLE_GIFT_FORBIDDEN(403, "IT204", "Guest role users cannot gift items."), - + GUEST_ROLE_PURCHASE_FORBIDDEN(403, "IT203", "GUEST ROLE USERS CANNOT PURCHASE ITEMS."), + GUEST_ROLE_GIFT_FORBIDDEN(403, "IT204", "GUEST ROLE USERS CANNOT GIFT ITEMS."), ITEM_IMAGE_TOO_LARGE(413, "IT401", "ITEM IMAGE IS TOO LARGE"), ITEM_IMAGE_WRONG_TYPE(415, "IT402", "ITEM IMAGE TYPE IS WRONG"), From d514006f50336386eea666851d663b17946ce58c Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Tue, 5 Sep 2023 13:04:57 +0900 Subject: [PATCH 174/273] =?UTF-8?q?[EDIT]=20api=EC=97=90=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=ED=85=9C=20=EA=B2=B0=EA=B3=BC=EA=B0=92=20body=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/controller/UserController.java | 12 ++++++++---- .../java/com/gg/server/domain/user/data/User.java | 9 ++++++++- .../gg/server/domain/user/service/UserService.java | 8 ++++++-- .../global/utils/aws/AsyncNewUserImageUploader.java | 2 ++ .../V2.5__add_userImage_and_user_image_uri.sql | 4 +--- 5 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index 8b920a62a..ed4c0325b 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -1,8 +1,11 @@ package com.gg.server.domain.user.controller; import com.gg.server.domain.game.type.Mode; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.*; import com.gg.server.domain.user.exception.KakaoOauth2AlreadyExistException; +import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.service.*; import com.gg.server.domain.user.type.OauthType; import com.gg.server.domain.user.type.RoleType; @@ -37,6 +40,7 @@ public class UserController { private final UserAuthenticationService userAuthenticationService; private final CookieUtil cookieUtil; private final UserCoinService userCoinService; + private final UserRepository userRepository; @PostMapping("/accesstoken") public ResponseEntity generateAccessToken(@RequestParam String refreshToken) { @@ -130,8 +134,8 @@ public UserAttendanceResponseDto attendUser(@Parameter(hidden = true) @Login Use @PatchMapping("/edge") public ResponseEntity updateEdge(@RequestBody @Valid UserEdgeDto userEdgeDto, @Parameter(hidden = true) @Login UserDto user) { - userService.updateEdge(user, userEdgeDto); - return new ResponseEntity(HttpStatus.NO_CONTENT); + String edge = userService.updateEdge(user, userEdgeDto); + return new ResponseEntity(HttpStatus.NO_CONTENT).ok().body("{\"edge\": " + "\"" + edge + "\"" +"}"); } @GetMapping("/coin") @@ -141,8 +145,8 @@ public UserCoinResponseDto getUserCoin(@Parameter(hidden = true) @Login UserDto @PatchMapping("/background") public ResponseEntity updateBackground(@RequestBody @Valid UserBackgroundDto userBackgroundDto, @Parameter(hidden = true) @Login UserDto user) { - userService.updateBackground(user, userBackgroundDto); - return new ResponseEntity(HttpStatus.NO_CONTENT); + String background = userService.updateBackground(user, userBackgroundDto); + return new ResponseEntity(HttpStatus.NO_CONTENT).ok().body("{\"background\": " + "\"" + background + "\"" +"}"); } @GetMapping("/coinhistory") diff --git a/src/main/java/com/gg/server/domain/user/data/User.java b/src/main/java/com/gg/server/domain/user/data/User.java index d1f9e27dd..93262d21b 100644 --- a/src/main/java/com/gg/server/domain/user/data/User.java +++ b/src/main/java/com/gg/server/domain/user/data/User.java @@ -25,6 +25,9 @@ public class User extends BaseTimeEntity implements Serializable { @Column(name = "e_mail", length = 60) private String eMail; + @Column(name = "image_uri") + private String imageUri; + @Enumerated(EnumType.STRING) @Column(name = "racket_type", length = 10) private RacketType racketType; @@ -59,7 +62,7 @@ public class User extends BaseTimeEntity implements Serializable { private EdgeType edge; @Builder - public User(String intraId, String eMail, RacketType racketType, + public User(String intraId, String eMail, String imageUri, RacketType racketType, RoleType roleType, Integer totalExp, SnsType snsNotiOpt, Long kakaoId) { this.intraId = intraId; this.eMail = eMail; @@ -81,6 +84,10 @@ public void modifyUserDetail(UserUpdateAdminRequestDto updateReq) { this.ggCoin = updateReq.getCoin(); } + public void updateImageUri(String imageUri) { + this.imageUri = imageUri; + } + public void updateTypes(RacketType racketType, SnsType snsType) { this.racketType = racketType; this.snsNotiOpt = snsType; diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 33f18452a..afc31d437 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -295,7 +295,7 @@ public void updateTextColor(Long userId, UserTextColorDto textColorDto) { } @Transactional - public void updateEdge(UserDto user, UserEdgeDto userEdgeDto) { + public String updateEdge(UserDto user, UserEdgeDto userEdgeDto) { User userId = userRepository.findById(user.getId()).orElseThrow(UserNotFoundException::new); EdgeType edgeType = EdgeType.getRandomEdgeType(); Receipt receipt = receiptRepository.findById(userEdgeDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); @@ -306,10 +306,12 @@ public void updateEdge(UserDto user, UserEdgeDto userEdgeDto) { userId.updateEdge(edgeType); receipt.updateStatus(ItemStatus.USED); + + return edgeType.toString(); } @Transactional - public void updateBackground(UserDto user, UserBackgroundDto userBackgroundDto) { + public String updateBackground(UserDto user, UserBackgroundDto userBackgroundDto) { User userId = userRepository.findById(user.getId()).orElseThrow(UserNotFoundException::new); Receipt receipt = receiptRepository.findById(userBackgroundDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); @@ -320,6 +322,8 @@ public void updateBackground(UserDto user, UserBackgroundDto userBackgroundDto) userId.updateBackground(backgroundType); receipt.updateStatus(ItemStatus.USED); + + return backgroundType.toString(); } @Transactional diff --git a/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java b/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java index f2843c4d2..bac456454 100644 --- a/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java +++ b/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java @@ -46,6 +46,7 @@ public void upload(String intraId, String imageUrl) { UserImage userImage = new UserImage(user, (s3ImageUrl != null) ? s3ImageUrl : defaultImageUrl, LocalDateTime.now(), false); userImageRepository.save(userImage); + user.updateImageUri(userImage.getImageUri()); }); } @@ -56,5 +57,6 @@ public void update(String intraId, MultipartFile multipartFile) throws IOExcepti s3ImageUrl = s3ImageUrl == null ? defaultImageUrl : s3ImageUrl; UserImage userImage = new UserImage(user, s3ImageUrl, LocalDateTime.now(), false); userImageRepository.saveAndFlush(userImage); + user.updateImageUri(s3ImageUrl); } } diff --git a/src/main/resources/db/migration/V2.5__add_userImage_and_user_image_uri.sql b/src/main/resources/db/migration/V2.5__add_userImage_and_user_image_uri.sql index 0641d83d4..d4f76366a 100644 --- a/src/main/resources/db/migration/V2.5__add_userImage_and_user_image_uri.sql +++ b/src/main/resources/db/migration/V2.5__add_userImage_and_user_image_uri.sql @@ -14,6 +14,4 @@ alter table user_image foreign key (user_id) references `user` (id); -INSERT INTO user_image (user_id, image_uri, created_at) SELECT id, image_uri, created_at FROM user; - -alter table user drop `image_uri` \ No newline at end of file +INSERT INTO user_image (user_id, image_uri, created_at) SELECT id, image_uri, created_at FROM user; \ No newline at end of file From cb1dfccd65c32fbdf90f891994315b659ceef327 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Tue, 5 Sep 2023 14:51:35 +0900 Subject: [PATCH 175/273] =?UTF-8?q?[REFACTOR]=20user=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EB=B8=94=20image=20uri=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20user?= =?UTF-8?q?Image=20=ED=85=8C=EC=9D=B4=EB=B8=94=20=EC=97=B0=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/user/dto/UserDetailAdminResponseDto.java | 8 ++++---- .../server/admin/user/service/UserAdminService.java | 8 +++++--- .../server/domain/user/controller/UserController.java | 1 - .../java/com/gg/server/domain/user/data/User.java | 1 + .../com/gg/server/domain/user/data/UserImage.java | 6 ++++-- .../server/domain/user/dto/UserDetailResponseDto.java | 4 ++-- .../gg/server/domain/user/service/UserService.java | 11 +++++------ 7 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/gg/server/admin/user/dto/UserDetailAdminResponseDto.java b/src/main/java/com/gg/server/admin/user/dto/UserDetailAdminResponseDto.java index 6bebf1a22..819134d75 100644 --- a/src/main/java/com/gg/server/admin/user/dto/UserDetailAdminResponseDto.java +++ b/src/main/java/com/gg/server/admin/user/dto/UserDetailAdminResponseDto.java @@ -23,10 +23,10 @@ public class UserDetailAdminResponseDto { private Integer exp; private Integer coin; - public UserDetailAdminResponseDto(User user, String userImageUri, RankRedis rank) { + public UserDetailAdminResponseDto(User user, RankRedis rank) { this.userId = user.getId(); this.intraId = user.getIntraId(); - this.userImageUri = userImageUri; + this.userImageUri = user.getImageUri(); this.racketType = user.getRacketType().getCode(); this.statusMessage = rank.getStatusMessage(); this.wins = rank.getWins(); @@ -38,10 +38,10 @@ public UserDetailAdminResponseDto(User user, String userImageUri, RankRedis rank this.coin = user.getGgCoin(); } - public UserDetailAdminResponseDto(User user, String userImageUri) { + public UserDetailAdminResponseDto(User user) { this.userId = user.getId(); this.intraId = user.getIntraId(); - this.userImageUri = userImageUri; + this.userImageUri = user.getImageUri(); this.racketType = user.getRacketType().getCode(); this.statusMessage = ""; this.wins = 0; diff --git a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java index 8dd3b1451..95a254c1e 100644 --- a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java +++ b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java @@ -78,9 +78,9 @@ public UserDetailAdminResponseDto getUserDetailByIntraId(String intraId) { try { RankRedis userCurrRank = rankRedisRepository.findRankByUserId(RedisKeyManager.getHashKey(currSeason.getId()), user.getId()); - return new UserDetailAdminResponseDto(user, getUserImageToString(user), userCurrRank); + return new UserDetailAdminResponseDto(user, userCurrRank); } catch (RedisDataNotFoundException e){ - return new UserDetailAdminResponseDto(user, getUserImageToString(user)); + return new UserDetailAdminResponseDto(user); } } @@ -124,7 +124,9 @@ public String getUserImageToString(User user) { public void deleteUserProfileImage(String intraId) { User user = userAdminRepository.findByIntraId(intraId).orElseThrow(UserNotFoundException::new); UserImage userImage = userImageAdminRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElseThrow(UserNotFoundException::new); - userImage.setIsDeleted(true); + userImage.updateIsDeleted(true); + String userImageUri = getUserImageToString(user); + user.updateImageUri(userImageUri); } @Transactional(readOnly = true) diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index ed4c0325b..e88ec4ef8 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -40,7 +40,6 @@ public class UserController { private final UserAuthenticationService userAuthenticationService; private final CookieUtil cookieUtil; private final UserCoinService userCoinService; - private final UserRepository userRepository; @PostMapping("/accesstoken") public ResponseEntity generateAccessToken(@RequestParam String refreshToken) { diff --git a/src/main/java/com/gg/server/domain/user/data/User.java b/src/main/java/com/gg/server/domain/user/data/User.java index 93262d21b..1a9b58b21 100644 --- a/src/main/java/com/gg/server/domain/user/data/User.java +++ b/src/main/java/com/gg/server/domain/user/data/User.java @@ -66,6 +66,7 @@ public User(String intraId, String eMail, String imageUri, RacketType racketType RoleType roleType, Integer totalExp, SnsType snsNotiOpt, Long kakaoId) { this.intraId = intraId; this.eMail = eMail; + this.imageUri = imageUri; this.racketType = racketType; this.roleType = roleType; this.totalExp = totalExp; diff --git a/src/main/java/com/gg/server/domain/user/data/UserImage.java b/src/main/java/com/gg/server/domain/user/data/UserImage.java index c6d046080..4611a7838 100644 --- a/src/main/java/com/gg/server/domain/user/data/UserImage.java +++ b/src/main/java/com/gg/server/domain/user/data/UserImage.java @@ -4,7 +4,6 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; import javax.persistence.*; import java.time.LocalDateTime; @@ -32,7 +31,6 @@ public class UserImage { private LocalDateTime createdAt; @NotNull - @Setter @Column(name = "is_deleted") private Boolean isDeleted; @@ -42,4 +40,8 @@ public UserImage(User user, String imageUri, LocalDateTime createdAt, Boolean is this.createdAt = createdAt; this.isDeleted = isDeleted; } + + public void updateIsDeleted(Boolean isDeleted) { + this.isDeleted = isDeleted; + } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java b/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java index 8732753c5..1fb6b72ec 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserDetailResponseDto.java @@ -26,10 +26,10 @@ public class UserDetailResponseDto { private String tierName; private String tierImageUri; - public UserDetailResponseDto(User user, String userImageUri, String statusMessage, Tier tier) { + public UserDetailResponseDto(User user, String statusMessage, Tier tier) { this.intraId = user.getIntraId(); - this.userImageUri = userImageUri; this.racketType = user.getRacketType().getCode(); + this.userImageUri = user.getImageUri(); this.statusMessage = statusMessage; this.snsNotiOpt = user.getSnsNotiOpt(); this.background= user.getBackground(); diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index afc31d437..d82566f3f 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -129,9 +129,8 @@ else if (game.getStatus() == StatusType.END) { public UserDetailResponseDto getUserDetail(String targetUserIntraId) { User targetUser = userFindService.findByIntraId(targetUserIntraId); String statusMessage = userFindService.getUserStatusMessage(targetUser); - Tier tier = rankFindService.findByUserIdAndSeasonId(targetUser.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); - return new UserDetailResponseDto(targetUser, getUserImageToString(targetUser), statusMessage, tier); + return new UserDetailResponseDto(targetUser, statusMessage, tier); } @Transactional @@ -234,7 +233,7 @@ public UserImageResponseDto getRankedUserImagesByPPP(Long seasonId) { List userImages = new ArrayList<>(); userIds.forEach(userId -> { User user = users.stream().filter(u -> u.getId().equals(userId)).findFirst().orElseThrow(UserNotFoundException::new); - userImages.add(new UserImageDto(user.getId(), getUserImageToString(user), LocalDateTime.now(), false)); + userImages.add(new UserImageDto(user.getId(), user.getImageUri(), LocalDateTime.now(), false)); }); return new UserImageResponseDto(userImages); } catch (RedisDataNotFoundException ex) { @@ -246,7 +245,7 @@ public UserImageResponseDto getRankedUserImagesByExp(PageRequest pageRequest) { List users = userRepository.findAll(pageRequest).getContent(); List userImages = new ArrayList<>(); for (User user : users) { - userImages.add(new UserImageDto(user.getId(), getUserImageToString(user), LocalDateTime.now(), false)); + userImages.add(new UserImageDto(user.getId(), user.getImageUri(), LocalDateTime.now(), false)); } return new UserImageResponseDto(userImages); } @@ -271,11 +270,11 @@ public UserNormalDetailResponseDto getUserNormalDetail(UserDto user) { if (tier == null) { String tierName = "NONE"; String tierImageUri = "NONE"; - return new UserNormalDetailResponseDto(loginUser.getIntraId(), getUserImageToString(loginUser), isAdmin, isAttended, tierName, tierImageUri, level); + return new UserNormalDetailResponseDto(loginUser.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, tierName, tierImageUri, level); } String tierName = tier.getName(); String tierImageUri = tier.getImageUri(); - return new UserNormalDetailResponseDto(user.getIntraId(), getUserImageToString(loginUser), isAdmin, isAttended, tierName, tierImageUri, level); + return new UserNormalDetailResponseDto(user.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, tierName, tierImageUri, level); } @Transactional() From 6a1eb77d9c6cccf2ef9bf1b48a17d37f0747e180 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Tue, 5 Sep 2023 16:18:26 +0900 Subject: [PATCH 176/273] =?UTF-8?q?[FIX]=20top3=20image=20null=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/user/controller/UserController.java | 5 ----- .../com/gg/server/domain/user/dto/UserImageDto.java | 10 ++++++++-- .../com/gg/server/domain/user/service/UserService.java | 7 ++++--- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index e88ec4ef8..7b945e71d 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -1,23 +1,18 @@ package com.gg.server.domain.user.controller; import com.gg.server.domain.game.type.Mode; -import com.gg.server.domain.user.data.User; -import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.*; import com.gg.server.domain.user.exception.KakaoOauth2AlreadyExistException; -import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.service.*; import com.gg.server.domain.user.type.OauthType; import com.gg.server.domain.user.type.RoleType; import com.gg.server.global.dto.PageRequestDto; -import com.gg.server.global.security.config.properties.AppProperties; import com.gg.server.global.security.cookie.CookieUtil; import com.gg.server.global.security.jwt.utils.TokenHeaders; import com.gg.server.global.utils.argumentresolver.Login; import io.swagger.v3.oas.annotations.Parameter; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; diff --git a/src/main/java/com/gg/server/domain/user/dto/UserImageDto.java b/src/main/java/com/gg/server/domain/user/dto/UserImageDto.java index a6530ec57..e19ad272e 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserImageDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserImageDto.java @@ -3,6 +3,7 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.ToString; import java.time.LocalDateTime; @@ -12,11 +13,16 @@ @AllArgsConstructor public class UserImageDto { Long id; - Long userId; + String intraId; String imageUri; LocalDateTime createdAt; Boolean isDeleted; - public UserImageDto(Long id, String imageUri, LocalDateTime now, boolean isDeleted) { + public UserImageDto(Long id, String intraId, String imageUri, LocalDateTime now, boolean isDeleted) { + this.id = id; + this.intraId = intraId; + this.imageUri = imageUri; + this.createdAt = now; + this.isDeleted = isDeleted; } } diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index d82566f3f..2d9656662 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -222,6 +222,7 @@ public void deleteKakaoId(Long userId) { @Transactional(readOnly = true) public UserImageResponseDto getRankedUserImagesByPPP(Long seasonId) { Season targetSeason; + if (seasonId == 0) targetSeason = seasonFindService.findCurrentSeason(LocalDateTime.now()); else @@ -233,7 +234,7 @@ public UserImageResponseDto getRankedUserImagesByPPP(Long seasonId) { List userImages = new ArrayList<>(); userIds.forEach(userId -> { User user = users.stream().filter(u -> u.getId().equals(userId)).findFirst().orElseThrow(UserNotFoundException::new); - userImages.add(new UserImageDto(user.getId(), user.getImageUri(), LocalDateTime.now(), false)); + userImages.add(new UserImageDto(user.getId(), user.getIntraId(), user.getImageUri(), LocalDateTime.now(), false)); }); return new UserImageResponseDto(userImages); } catch (RedisDataNotFoundException ex) { @@ -245,7 +246,7 @@ public UserImageResponseDto getRankedUserImagesByExp(PageRequest pageRequest) { List users = userRepository.findAll(pageRequest).getContent(); List userImages = new ArrayList<>(); for (User user : users) { - userImages.add(new UserImageDto(user.getId(), user.getImageUri(), LocalDateTime.now(), false)); + userImages.add(new UserImageDto(user.getId(), user.getIntraId(), user.getImageUri(), LocalDateTime.now(), false)); } return new UserImageResponseDto(userImages); } @@ -312,9 +313,9 @@ public String updateEdge(UserDto user, UserEdgeDto userEdgeDto) { @Transactional public String updateBackground(UserDto user, UserBackgroundDto userBackgroundDto) { User userId = userRepository.findById(user.getId()).orElseThrow(UserNotFoundException::new); + BackgroundType backgroundType = BackgroundType.getRandomBackgroundType(); Receipt receipt = receiptRepository.findById(userBackgroundDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); - BackgroundType backgroundType = BackgroundType.getRandomBackgroundType(); checkOwner(userId, receipt); checkItemType(receipt, ItemType.BACKGROUND); checkUseStatus(receipt); From 865c98ee9824c56cdb99187afe0bc2896cf6b9af Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Tue, 5 Sep 2023 23:27:51 +0900 Subject: [PATCH 177/273] [EDIT] top3 page add edge and tierImage --- .../java/com/gg/server/domain/user/dto/UserImageDto.java | 7 ++++++- .../com/gg/server/domain/user/service/UserService.java | 6 ++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gg/server/domain/user/dto/UserImageDto.java b/src/main/java/com/gg/server/domain/user/dto/UserImageDto.java index e19ad272e..a0d88cbf8 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserImageDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserImageDto.java @@ -1,5 +1,6 @@ package com.gg.server.domain.user.dto; +import com.gg.server.domain.user.type.EdgeType; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -15,13 +16,17 @@ public class UserImageDto { Long id; String intraId; String imageUri; + EdgeType edge; + String tierImage; LocalDateTime createdAt; Boolean isDeleted; - public UserImageDto(Long id, String intraId, String imageUri, LocalDateTime now, boolean isDeleted) { + public UserImageDto(Long id, String intraId, String imageUri, EdgeType edge, String tierImage, LocalDateTime now, boolean isDeleted) { this.id = id; this.intraId = intraId; this.imageUri = imageUri; + this.edge = edge; + this.tierImage = tierImage; this.createdAt = now; this.isDeleted = isDeleted; } diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 2d9656662..25e9f18d9 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -234,7 +234,8 @@ public UserImageResponseDto getRankedUserImagesByPPP(Long seasonId) { List userImages = new ArrayList<>(); userIds.forEach(userId -> { User user = users.stream().filter(u -> u.getId().equals(userId)).findFirst().orElseThrow(UserNotFoundException::new); - userImages.add(new UserImageDto(user.getId(), user.getIntraId(), user.getImageUri(), LocalDateTime.now(), false)); + Tier tier = rankFindService.findByUserIdAndSeasonId(user.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); + userImages.add(new UserImageDto(user.getId(), user.getIntraId(), user.getImageUri(), user.getEdge(), tier.getImageUri(), LocalDateTime.now(), false)); }); return new UserImageResponseDto(userImages); } catch (RedisDataNotFoundException ex) { @@ -246,7 +247,8 @@ public UserImageResponseDto getRankedUserImagesByExp(PageRequest pageRequest) { List users = userRepository.findAll(pageRequest).getContent(); List userImages = new ArrayList<>(); for (User user : users) { - userImages.add(new UserImageDto(user.getId(), user.getIntraId(), user.getImageUri(), LocalDateTime.now(), false)); + Tier tier = rankFindService.findByUserIdAndSeasonId(user.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); + userImages.add(new UserImageDto(user.getId(), user.getIntraId(), user.getImageUri(), user.getEdge(), tier.getImageUri(), LocalDateTime.now(), false)); } return new UserImageResponseDto(userImages); } From e2577745eb81be293fd733355343719ab9589e75 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Wed, 6 Sep 2023 12:19:41 +0900 Subject: [PATCH 178/273] =?UTF-8?q?[FEAT]=20admin=20images=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=EC=97=90=20userIntraId=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gg/server/admin/user/dto/UserImageAdminDto.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/gg/server/admin/user/dto/UserImageAdminDto.java b/src/main/java/com/gg/server/admin/user/dto/UserImageAdminDto.java index 228fc0ae0..18eb18315 100644 --- a/src/main/java/com/gg/server/admin/user/dto/UserImageAdminDto.java +++ b/src/main/java/com/gg/server/admin/user/dto/UserImageAdminDto.java @@ -13,6 +13,7 @@ public class UserImageAdminDto { Long id; Long userId; + String userIntraId; String imageUri; LocalDateTime createdAt; Boolean isDeleted; @@ -20,6 +21,7 @@ public class UserImageAdminDto { public UserImageAdminDto(UserImage userImage) { this.id = userImage.getId(); this.userId = userImage.getUser().getId(); + this.userIntraId = userImage.getUser().getIntraId(); this.imageUri = userImage.getImageUri(); this.createdAt = userImage.getCreatedAt(); this.isDeleted = userImage.getIsDeleted(); From 5a45b476218e98fb7abe65cae2657ff6184d7686 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Wed, 6 Sep 2023 21:33:20 +0900 Subject: [PATCH 179/273] =?UTF-8?q?[feat]=20=EC=BD=94=EC=9D=B8=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=8B=9C=20=ED=9E=88=EC=8A=A4=ED=86=A0=EB=A6=AC?= =?UTF-8?q?=EC=97=90=20=EC=9D=8C=EC=88=98=EB=A1=9C=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/coin/service/CoinHistoryService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java index 8253daa6c..6aaeda0ee 100644 --- a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java +++ b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java @@ -26,12 +26,12 @@ public void addAttendanceCoinHistory(User user) { @Transactional public void addPurchaseItemCoinHistory(User user, Item item, Integer price) { - addCoinHistory(new CoinHistory(user, item.getName()+ "를 구매!", price)); + addCoinHistory(new CoinHistory(user, item.getName()+ "를 구매!", price*(-1))); } @Transactional public void addGiftItemCoinHistory(User user, User giftTarget, Item item, Integer price) { - addCoinHistory(new CoinHistory(user, item.getName()+ "를 " + giftTarget.getIntraId() + "에게 선물!", price)); + addCoinHistory(new CoinHistory(user, item.getName()+ "를 " + giftTarget.getIntraId() + "에게 선물!", price*(-1))); } @Transactional From 74d922c4ae4a34386fbd61c277bb8a2f5b80b79f Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Wed, 6 Sep 2023 21:57:58 +0900 Subject: [PATCH 180/273] =?UTF-8?q?[fix]=20=EC=BD=94=EC=9D=B8=20=EB=B3=80?= =?UTF-8?q?=ED=99=94=EB=9F=89=20=EC=A0=80=EC=9E=A5=20=EB=82=B4=EC=97=AD=20?= =?UTF-8?q?=EB=AA=85=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/coin/service/CoinHistoryService.java | 4 ++-- src/main/java/com/gg/server/domain/coin/type/HistoryType.java | 2 +- .../server/domain/coin/service/UserCoinChangeServiceTest.java | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java index 6aaeda0ee..cb3ec9b7a 100644 --- a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java +++ b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java @@ -26,12 +26,12 @@ public void addAttendanceCoinHistory(User user) { @Transactional public void addPurchaseItemCoinHistory(User user, Item item, Integer price) { - addCoinHistory(new CoinHistory(user, item.getName()+ "를 구매!", price*(-1))); + addCoinHistory(new CoinHistory(user, item.getName()+ " 구매", price*(-1))); } @Transactional public void addGiftItemCoinHistory(User user, User giftTarget, Item item, Integer price) { - addCoinHistory(new CoinHistory(user, item.getName()+ "를 " + giftTarget.getIntraId() + "에게 선물!", price*(-1))); + addCoinHistory(new CoinHistory(user, giftTarget.getIntraId() + "에게 " + item.getName()+ " 선물", price*(-1))); } @Transactional diff --git a/src/main/java/com/gg/server/domain/coin/type/HistoryType.java b/src/main/java/com/gg/server/domain/coin/type/HistoryType.java index 7b391b26b..ba5646592 100644 --- a/src/main/java/com/gg/server/domain/coin/type/HistoryType.java +++ b/src/main/java/com/gg/server/domain/coin/type/HistoryType.java @@ -7,7 +7,7 @@ @RequiredArgsConstructor public enum HistoryType { - ATTENDANCECOIN("출석 입니다."), + ATTENDANCECOIN("출석"), NORMAL("일반전 코인 획득"), RANKWIN("랭크전 승리 코인 획득"), RANKLOSE("랭크전 패배 코인 획득"); diff --git a/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java b/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java index 35ae6dc29..a0b114460 100644 --- a/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java +++ b/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java @@ -91,7 +91,7 @@ void purchaseItemCoin() { assertThat(beforeCoin).isEqualTo(user.getGgCoin() + item.getPrice()); System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()+coinHistoryRepository.findFirstByOrderByIdDesc().getAmount()); - + System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); try{ userCoinChangeService.purchaseItemCoin(item, item.getPrice(), userId); }catch (Exception e){ @@ -117,6 +117,7 @@ void giftItemCoin() { assertThat(beforeCoin).isEqualTo(user.getGgCoin() + item.getPrice()); System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()+coinHistoryRepository.findFirstByOrderByIdDesc().getAmount()); + System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); try{ userCoinChangeService.giftItemCoin(item, item.getPrice(), user, user); From 481b05bcdfdc981a28be7bf1fe9968c2383ed000 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Thu, 7 Sep 2023 13:45:59 +0900 Subject: [PATCH 181/273] =?UTF-8?q?[FEAT]=20Item=20Update=20=EB=B6=88?= =?UTF-8?q?=ED=95=84=EC=9A=94=ED=95=9C=20=EC=95=84=EC=9D=B4=ED=85=9C=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=20=EC=83=9D=EC=84=B1=20=EC=B0=A8=EB=8B=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/admin/item/service/ItemAdminService.java | 7 +++++++ .../item/exception/ItemNotAvailableException.java | 10 ++++++++++ .../java/com/gg/server/global/exception/ErrorCode.java | 1 + 3 files changed, 18 insertions(+) create mode 100644 src/main/java/com/gg/server/domain/item/exception/ItemNotAvailableException.java diff --git a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java index 79b7ad092..e2f3167d7 100644 --- a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java +++ b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java @@ -6,6 +6,7 @@ import com.gg.server.admin.item.dto.ItemUpdateRequestDto; import com.gg.server.admin.item.exception.ItemNotFoundException; import com.gg.server.domain.item.data.Item; +import com.gg.server.domain.item.exception.ItemNotAvailableException; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.global.utils.aws.AsyncNewItemImageUploader; import lombok.RequiredArgsConstructor; @@ -36,6 +37,9 @@ public ItemListResponseDto getAllItemHistory(Pageable pageable) { public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, MultipartFile itemImageFile, UserDto user) throws IOException { Item item = itemAdminRepository.findById(itemId).orElseThrow(() -> new ItemNotFoundException()); + if (item.getIsVisible() == false) { + throw new ItemNotAvailableException(); + } item.setIsVisible(false); item.setDeleterIntraId(user.getIntraId()); Item newItem = new Item(itemUpdateRequestDto, user.getIntraId()); @@ -48,6 +52,9 @@ public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, UserDto user) { Item item = itemAdminRepository.findById(itemId).orElseThrow(() -> new ItemNotFoundException()); + if (item.getIsVisible() == false) { + throw new ItemNotAvailableException(); + } item.setIsVisible(false); item.setDeleterIntraId(user.getIntraId()); Item newItem = new Item(itemUpdateRequestDto, user.getIntraId(), item.getImageUri()); diff --git a/src/main/java/com/gg/server/domain/item/exception/ItemNotAvailableException.java b/src/main/java/com/gg/server/domain/item/exception/ItemNotAvailableException.java new file mode 100644 index 000000000..ab807ed84 --- /dev/null +++ b/src/main/java/com/gg/server/domain/item/exception/ItemNotAvailableException.java @@ -0,0 +1,10 @@ +package com.gg.server.domain.item.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.FileException; + +public class ItemNotAvailableException extends FileException { + public ItemNotAvailableException() { + super("아이템 접근이 불가합니다", ErrorCode.ITEM_NOT_AVAILABLE); + } +} diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index 0eb74b15e..24381e61b 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -45,6 +45,7 @@ public enum ErrorCode { INSUFFICIENT_GGCOIN(400,"IT202","INSUFFICIENT GGCOIN"), GUEST_ROLE_PURCHASE_FORBIDDEN(403, "IT203", "GUEST ROLE USERS CANNOT PURCHASE ITEMS."), GUEST_ROLE_GIFT_FORBIDDEN(403, "IT204", "GUEST ROLE USERS CANNOT GIFT ITEMS."), + ITEM_NOT_AVAILABLE(400, "IT205", "ITEM NOT AVAILABLE"), ITEM_IMAGE_TOO_LARGE(413, "IT401", "ITEM IMAGE IS TOO LARGE"), ITEM_IMAGE_WRONG_TYPE(415, "IT402", "ITEM IMAGE TYPE IS WRONG"), From 8caf0e2b5936b5e087bea848b27a2716589b2a0e Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Thu, 7 Sep 2023 13:58:37 +0900 Subject: [PATCH 182/273] [FIX] resolved image-list paging and add delete-list by intraId --- .../user/controller/UserAdminController.java | 15 ++++++++++++++- .../user/data/UserImageAdminRepository.java | 18 +++++++++++------- .../admin/user/service/UserAdminService.java | 9 +++++++++ 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java index b0c3b419a..39e4061de 100644 --- a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java +++ b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java @@ -61,7 +61,7 @@ public ResponseEntity userUpdateDetail(@PathVariable String intraId, return new ResponseEntity(HttpStatus.NO_CONTENT); } - @DeleteMapping("/{intraId}") + @DeleteMapping("/images/{intraId}") public ResponseEntity deleteUserProfileImage(@PathVariable String intraId) { userAdminService.deleteUserProfileImage(intraId); return new ResponseEntity(HttpStatus.NO_CONTENT); @@ -76,12 +76,25 @@ public ResponseEntity getUserImageDeleteList(@Mod .body(userAdminService.getUserImageDeleteList(pageable)); } + @GetMapping("/delete-list/{intraId}") + public ResponseEntity getUserImageDeleteListByIntraId(@ModelAttribute @Valid PageRequestDto pageRequestDto, @PathVariable String intraId) { + Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, + pageRequestDto.getSize(), + Sort.by("id").descending()); + return ResponseEntity.ok() + .body(userAdminService.getUserImageDeleteListByIntraId(pageable, intraId)); + } + @GetMapping("/images") public ResponseEntity getUserImageList(@ModelAttribute @Valid PageRequestDto pageRequestDto) { Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, pageRequestDto.getSize()); return ResponseEntity.ok() +<<<<<<< Updated upstream .body(userAdminService.getUserImageList(pageable)); +======= + .body(userAdminService.getUserImageList(pageable)); +>>>>>>> Stashed changes } @GetMapping("/images/{intraId}") diff --git a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java index ea3960b13..7eda5ea3b 100644 --- a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java +++ b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java @@ -16,13 +16,17 @@ public interface UserImageAdminRepository extends JpaRepository Page findAllByIsDeleted(Pageable pageable, Boolean isDeleted); - @Query(value = "SELECT * FROM user_image WHERE id NOT IN (" + - "SELECT MIN(id) FROM user_image GROUP BY user_id" + - ") ORDER BY id DESC", nativeQuery = true) + @Query(value = "SELECT ui FROM UserImage ui WHERE ui.user.id = ?1 " + + "AND ui.isDeleted = true ORDER BY ui.id DESC") + Page findAllByUserAndIsDeletedOrderByIdDesc(Long userId, Pageable pageable); + + @Query(value = "SELECT ui FROM UserImage ui WHERE ui.id NOT IN (" + + "SELECT MIN(ui.id) FROM UserImage ui GROUP BY ui.user.id" + + ") ORDER BY ui.user.id DESC") Page findAllChanged(Pageable pageable); - @Query(value = "SELECT * FROM user_image WHERE id NOT IN (" + - "SELECT MIN(id) FROM user_image GROUP BY user_id" + - ") AND user_id = ?1 ORDER BY id DESC", nativeQuery = true) - Page findAllByUserOrderByIdDesc(Pageable pageable, User user); + @Query(value = "SELECT ui FROM UserImage ui WHERE ui.id NOT IN (" + + "SELECT MIN(ui.id) FROM UserImage ui GROUP BY ui.user.id" + + ") AND ui.user.id = ?1 ORDER BY ui.user.id DESC") + Page findAllByUserOrderByIdDesc(Long userId, Pageable pageable); } diff --git a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java index 95a254c1e..8ae940a62 100644 --- a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java +++ b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java @@ -136,6 +136,15 @@ public UserImageListAdminResponseDto getUserImageDeleteList(Pageable pageable) { return new UserImageListAdminResponseDto(userImageAdminDto.getContent(), userImageAdminDto.getTotalPages()); } + @Transactional(readOnly = true) + public UserImageListAdminResponseDto getUserImageDeleteListByIntraId(Pageable pageable, String intraId) { + User user = userAdminRepository.findByIntraId(intraId).orElseThrow(UserNotFoundException::new); + Page userImagePage = userImageAdminRepository.findAllByUserAndIsDeletedOrderByIdDesc(user.getId(), pageable); + Page userImageAdminDto = userImagePage.map(UserImageAdminDto::new); + + return new UserImageListAdminResponseDto(userImageAdminDto.getContent(), userImageAdminDto.getTotalPages()); + } + @Transactional(readOnly = true) public UserImageListAdminResponseDto getUserImageList(Pageable pageable) { From aaab778581f305551d3637a03f6f36000877c95c Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Thu, 7 Sep 2023 14:00:32 +0900 Subject: [PATCH 183/273] [REFACTOR] add responseEntity --- .../gg/server/admin/user/controller/UserAdminController.java | 4 ---- .../com/gg/server/admin/user/service/UserAdminService.java | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java index 39e4061de..7526fe92b 100644 --- a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java +++ b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java @@ -90,11 +90,7 @@ public ResponseEntity getUserImageList(@ModelAttr Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, pageRequestDto.getSize()); return ResponseEntity.ok() -<<<<<<< Updated upstream - .body(userAdminService.getUserImageList(pageable)); -======= .body(userAdminService.getUserImageList(pageable)); ->>>>>>> Stashed changes } @GetMapping("/images/{intraId}") diff --git a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java index 8ae940a62..f50e8ac53 100644 --- a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java +++ b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java @@ -157,7 +157,7 @@ public UserImageListAdminResponseDto getUserImageList(Pageable pageable) { @Transactional(readOnly = true) public UserImageListAdminResponseDto getUserImageListByIntraId(Pageable pageable, String intraId) { User user = userAdminRepository.findByIntraId(intraId).orElseThrow(UserNotFoundException::new); - Page userImagePage = userImageAdminRepository.findAllByUserOrderByIdDesc(pageable, user); + Page userImagePage = userImageAdminRepository.findAllByUserOrderByIdDesc(user.getId(), pageable); Page userImageAdminDto = userImagePage.map(UserImageAdminDto::new); return new UserImageListAdminResponseDto(userImageAdminDto.getContent(), userImageAdminDto.getTotalPages()); From 5ad9cfdc754de907c9c1d9755c77d89ea9379d9a Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Fri, 8 Sep 2023 11:13:11 +0900 Subject: [PATCH 184/273] =?UTF-8?q?[REFACTOR]=20=EC=83=81=EC=A0=90=20?= =?UTF-8?q?=EA=B5=AC=EB=A7=A4,=20=EC=84=A0=EB=AC=BC=ED=95=98=EA=B8=B0=20GU?= =?UTF-8?q?EST=EB=8A=94=20=EB=B6=88=EA=B0=80=20(security=20filter)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/global/security/config/SecurityConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/gg/server/global/security/config/SecurityConfig.java b/src/main/java/com/gg/server/global/security/config/SecurityConfig.java index 4a5e0bb9c..06d64a988 100644 --- a/src/main/java/com/gg/server/global/security/config/SecurityConfig.java +++ b/src/main/java/com/gg/server/global/security/config/SecurityConfig.java @@ -53,6 +53,7 @@ protected void configure(HttpSecurity http) throws Exception { .antMatchers("/pingpong/admin/**").hasRole("ADMIN") .antMatchers(HttpMethod.PUT, "/pingpong/users/{intraId}").hasAnyRole("USER", "ADMIN") .antMatchers(HttpMethod.POST, "/pingpong/match").hasAnyRole("USER", "ADMIN") + .antMatchers(HttpMethod.GET, "/pingpong/items/purchases/{itemId}", "/pingpong/items/gift/{itemId}").hasAnyRole("USER", "ADMIN") .antMatchers("/login", "/oauth2/authorization/**", "/","/pingpong/users/oauth/**", "/pingpong/users/accesstoken", "/actuator/**", "/swagger-ui/**", "/swagger-ui**", "/v3/api-docs/**", "/v3/api-docs**", "/api-docs").permitAll() From f809ae3c63a7846c1dfefe97fb6767c95829b8f6 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Fri, 8 Sep 2023 14:24:06 +0900 Subject: [PATCH 185/273] =?UTF-8?q?[FIX]=20httpMethod=EB=A5=BC=20GET?= =?UTF-8?q?=EC=97=90=EC=84=9C=20POST=EB=A1=9C=20=EC=95=8C=EB=A7=9E?= =?UTF-8?q?=EA=B2=8C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/global/security/config/SecurityConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/global/security/config/SecurityConfig.java b/src/main/java/com/gg/server/global/security/config/SecurityConfig.java index 06d64a988..34637f108 100644 --- a/src/main/java/com/gg/server/global/security/config/SecurityConfig.java +++ b/src/main/java/com/gg/server/global/security/config/SecurityConfig.java @@ -53,7 +53,7 @@ protected void configure(HttpSecurity http) throws Exception { .antMatchers("/pingpong/admin/**").hasRole("ADMIN") .antMatchers(HttpMethod.PUT, "/pingpong/users/{intraId}").hasAnyRole("USER", "ADMIN") .antMatchers(HttpMethod.POST, "/pingpong/match").hasAnyRole("USER", "ADMIN") - .antMatchers(HttpMethod.GET, "/pingpong/items/purchases/{itemId}", "/pingpong/items/gift/{itemId}").hasAnyRole("USER", "ADMIN") + .antMatchers(HttpMethod.POST, "/pingpong/items/purchases/{itemId}", "/pingpong/items/gift/{itemId}").hasAnyRole("USER", "ADMIN") .antMatchers("/login", "/oauth2/authorization/**", "/","/pingpong/users/oauth/**", "/pingpong/users/accesstoken", "/actuator/**", "/swagger-ui/**", "/swagger-ui**", "/v3/api-docs/**", "/v3/api-docs**", "/api-docs").permitAll() From b39fd0e0b95750579a5d3c0f1c5b1789553c5eeb Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Fri, 8 Sep 2023 19:21:45 +0900 Subject: [PATCH 186/273] =?UTF-8?q?[FEAT]=20user=20=EA=B8=B0=EB=B3=B8?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EC=A1=B0=ED=9A=8C=20edge=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/user/dto/UserNormalDetailResponseDto.java | 2 ++ .../java/com/gg/server/domain/user/service/UserService.java | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/domain/user/dto/UserNormalDetailResponseDto.java b/src/main/java/com/gg/server/domain/user/dto/UserNormalDetailResponseDto.java index 7dad6f36c..259c3db39 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserNormalDetailResponseDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserNormalDetailResponseDto.java @@ -1,5 +1,6 @@ package com.gg.server.domain.user.dto; +import com.gg.server.domain.user.type.EdgeType; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -12,6 +13,7 @@ public class UserNormalDetailResponseDto { private String userImageUri; private Boolean isAdmin; private Boolean isAttended; + private EdgeType edgeType; private String tierName; private String tierImageUri; private Integer level; diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 25e9f18d9..5e55f5fa6 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -273,11 +273,11 @@ public UserNormalDetailResponseDto getUserNormalDetail(UserDto user) { if (tier == null) { String tierName = "NONE"; String tierImageUri = "NONE"; - return new UserNormalDetailResponseDto(loginUser.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, tierName, tierImageUri, level); + return new UserNormalDetailResponseDto(loginUser.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, loginUser.getEdge(), tierName, tierImageUri, level); } String tierName = tier.getName(); String tierImageUri = tier.getImageUri(); - return new UserNormalDetailResponseDto(user.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, tierName, tierImageUri, level); + return new UserNormalDetailResponseDto(user.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, loginUser.getEdge(), tierName, tierImageUri, level); } @Transactional() From 23b5cfe5e4708f7d5ed1567ef5ff73ba6dfbfb4b Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Fri, 8 Sep 2023 19:27:12 +0900 Subject: [PATCH 187/273] =?UTF-8?q?[FEAT]=20get/rank=20textColor=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gg/server/domain/rank/dto/RankDto.java | 4 +++- .../java/com/gg/server/domain/rank/service/RankService.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/domain/rank/dto/RankDto.java b/src/main/java/com/gg/server/domain/rank/dto/RankDto.java index 1d02b6c86..462146611 100644 --- a/src/main/java/com/gg/server/domain/rank/dto/RankDto.java +++ b/src/main/java/com/gg/server/domain/rank/dto/RankDto.java @@ -16,15 +16,17 @@ public class RankDto { private int ppp; private String statusMessage; private String tierImageUri; + private String textColor; - public static RankDto from(RankRedis rankRedis, int rank) { + public static RankDto from(RankRedis rankRedis, int rank, String textColor) { RankDto dto = RankDto.builder() .intraId(rankRedis.getIntraId()) .rank(rank) .ppp(rankRedis.getPpp()) .statusMessage(rankRedis.getStatusMessage()) .tierImageUri(rankRedis.getTierImageUrl()) + .textColor(textColor) .build(); return dto; } diff --git a/src/main/java/com/gg/server/domain/rank/service/RankService.java b/src/main/java/com/gg/server/domain/rank/service/RankService.java index 469ae65df..56572a9e8 100644 --- a/src/main/java/com/gg/server/domain/rank/service/RankService.java +++ b/src/main/java/com/gg/server/domain/rank/service/RankService.java @@ -16,6 +16,7 @@ import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.domain.user.exception.UserImageNullException; +import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.global.exception.ErrorCode; import com.gg.server.global.exception.custom.PageNotFoundException; import lombok.RequiredArgsConstructor; @@ -119,7 +120,8 @@ private List createRankList(int startRank, int endRank, Season season) List rankList = new ArrayList<>(); for (int i = 0; i < userRanks.size(); i++) { - rankList.add(RankDto.from(userRanks.get(i), ++startRank)); + User user = userRepository.findById(userRanks.get(i).getUserId()).orElseThrow(UserNotFoundException::new); + rankList.add(RankDto.from(userRanks.get(i), ++startRank, user.getTextColor())); } return rankList; } From c8bdcbbd9674c69e12bc0a2c75c56aa4141769e9 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Sat, 9 Sep 2023 22:24:24 +0900 Subject: [PATCH 188/273] =?UTF-8?q?[style]=20GGBE4-67=20=ED=9E=88=EC=8A=A4?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EC=A0=80=EC=9E=A5=EB=82=B4=EC=97=AD=20?= =?UTF-8?q?=EB=AA=85=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gg/server/domain/coin/type/HistoryType.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gg/server/domain/coin/type/HistoryType.java b/src/main/java/com/gg/server/domain/coin/type/HistoryType.java index ba5646592..8144c712a 100644 --- a/src/main/java/com/gg/server/domain/coin/type/HistoryType.java +++ b/src/main/java/com/gg/server/domain/coin/type/HistoryType.java @@ -8,9 +8,9 @@ public enum HistoryType { ATTENDANCECOIN("출석"), - NORMAL("일반전 코인 획득"), - RANKWIN("랭크전 승리 코인 획득"), - RANKLOSE("랭크전 패배 코인 획득"); + NORMAL("일반전 참가"), + RANKWIN("랭크전 승리"), + RANKLOSE("랭크전 패배"); private final String history; } From 89cc89126438e173afefe48bf0e63c85088dec22 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Sat, 9 Sep 2023 22:28:22 +0900 Subject: [PATCH 189/273] =?UTF-8?q?[feat]=20GGBE4-67=20=EA=B8=B0=EC=A1=B4?= =?UTF-8?q?=EC=97=90=20=EC=84=A0=EB=AC=BC=EC=8B=9C=20=EC=BD=94=EC=9D=B8=20?= =?UTF-8?q?=ED=9E=88=EC=8A=A4=ED=86=A0=EB=A6=AC=EC=97=90=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=EB=90=98=EC=A7=80=EC=95=8A=EB=8D=98=20=EB=88=84?= =?UTF-8?q?=EB=9D=BD=EB=90=9C=20=EB=B6=80=EB=B6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gg/server/domain/item/service/ItemService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index f10110d00..8c51d73d2 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -107,7 +107,7 @@ public void giftItem(Long itemId, String ownerId, UserDto userDto) { throw new KakaoGiftException(); } - payUser.payGgCoin(finalPrice); //상품 구매에 따른 차감 + userCoinChangeService.giftItemCoin(item, finalPrice, payUser, owner); Receipt receipt = new Receipt(item, userDto.getIntraId(), ownerId, ItemStatus.BEFORE, LocalDateTime.now()); From 93b6f94c920a791ad68e78fd36817a1bf3429d8d Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Sat, 9 Sep 2023 22:31:40 +0900 Subject: [PATCH 190/273] =?UTF-8?q?[fix]=20GGBE4-67=20=EB=9E=AD=ED=81=AC?= =?UTF-8?q?=EC=A0=84=20=ED=8C=A8=EB=B0=B0=EC=8B=9C=200=EC=BD=94=EC=9D=B8?= =?UTF-8?q?=20=ED=9A=8D=EB=93=9D=20=ED=9E=88=EC=8A=A4=ED=86=A0=EB=A6=AC?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EC=A0=9C=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/coin/service/CoinHistoryService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java index cb3ec9b7a..9b48dca47 100644 --- a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java +++ b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java @@ -50,6 +50,8 @@ public int addRankWinCoin(User user){ @Transactional public int addRankLoseCoin(User user){ int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getRankLose(); + if (amount == 0) + return amount; addCoinHistory(new CoinHistory(user, HistoryType.RANKLOSE.getHistory(), amount)); return amount; } From 2aed525d79ec6bda14a4d2580481f0fa83905fcf Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sun, 10 Sep 2023 20:24:19 +0900 Subject: [PATCH 191/273] [FEAT] GET userImage IsCurrent Page API --- .../user/controller/UserAdminController.java | 19 ++++++++- .../user/data/UserImageAdminRepository.java | 28 ++++++++----- .../admin/user/dto/UserImageAdminDto.java | 8 ++-- .../admin/user/service/UserAdminService.java | 40 ++++++++++++++----- .../domain/rank/service/RankService.java | 2 +- .../gg/server/domain/user/data/UserImage.java | 21 +++++++--- .../domain/user/data/UserImageRepository.java | 4 +- .../domain/user/service/UserService.java | 8 +--- .../utils/aws/AsyncNewUserImageUploader.java | 4 +- ...V2.5__add_userImage_and_user_image_uri.sql | 3 +- .../controller/UserAdminControllerTest.java | 4 +- 11 files changed, 96 insertions(+), 45 deletions(-) diff --git a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java index 7526fe92b..1b9522ac6 100644 --- a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java +++ b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java @@ -79,8 +79,7 @@ public ResponseEntity getUserImageDeleteList(@Mod @GetMapping("/delete-list/{intraId}") public ResponseEntity getUserImageDeleteListByIntraId(@ModelAttribute @Valid PageRequestDto pageRequestDto, @PathVariable String intraId) { Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, - pageRequestDto.getSize(), - Sort.by("id").descending()); + pageRequestDto.getSize()); return ResponseEntity.ok() .body(userAdminService.getUserImageDeleteListByIntraId(pageable, intraId)); } @@ -100,4 +99,20 @@ public ResponseEntity getUserImage(@ModelAttribut return ResponseEntity.ok() .body(userAdminService.getUserImageListByIntraId(pageable, intraId)); } + + @GetMapping("/images/current") + public ResponseEntity getUserImageCurrent(@ModelAttribute @Valid PageRequestDto pageRequestDto) { + Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, + pageRequestDto.getSize()); + return ResponseEntity.ok() + .body(userAdminService.getUserImageCurrent(pageable)); + } + + @GetMapping("/images/current/{intraId}") + public ResponseEntity getUserImageCurrentByIntraId(@ModelAttribute @Valid PageRequestDto pageRequestDto, @PathVariable String intraId) { + Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, + pageRequestDto.getSize()); + return ResponseEntity.ok() + .body(userAdminService.getUserImageCurrentByIntraId(pageable, intraId)); + } } diff --git a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java index 7eda5ea3b..703bd10d4 100644 --- a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java +++ b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java @@ -1,8 +1,6 @@ package com.gg.server.admin.user.data; -import com.gg.server.admin.user.dto.UserImageAdminDto; import com.gg.server.domain.user.data.User; -import io.lettuce.core.dynamic.annotation.Param; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -12,21 +10,31 @@ import java.util.Optional; public interface UserImageAdminRepository extends JpaRepository{ - Optional findTopByUserAndIsDeletedOrderByIdDesc(User user, Boolean isDeleted); + Optional findTopByUserAndIsCurrentIsTrueOrderByCreatedAtDesc(User user); + + Optional findTopByUserAndDeletedAtIsNullOrderByCreatedAtDesc(User user); - Page findAllByIsDeleted(Pageable pageable, Boolean isDeleted); + Page findAllByDeletedAtNotNullOrderByDeletedAtDesc(Pageable pageable); @Query(value = "SELECT ui FROM UserImage ui WHERE ui.user.id = ?1 " + - "AND ui.isDeleted = true ORDER BY ui.id DESC") - Page findAllByUserAndIsDeletedOrderByIdDesc(Long userId, Pageable pageable); + "AND ui.deletedAt != NULL ORDER BY ui.deletedAt DESC") + Page findAllByUserAndDeletedAtNotNullOrderByDeletedAtDesc(Long userId, Pageable pageable); @Query(value = "SELECT ui FROM UserImage ui WHERE ui.id NOT IN (" + "SELECT MIN(ui.id) FROM UserImage ui GROUP BY ui.user.id" + - ") ORDER BY ui.user.id DESC") - Page findAllChanged(Pageable pageable); + ") ORDER BY ui.user.createdAt DESC") + Page findAllChangedOrderByCreatedAt(Pageable pageable); @Query(value = "SELECT ui FROM UserImage ui WHERE ui.id NOT IN (" + "SELECT MIN(ui.id) FROM UserImage ui GROUP BY ui.user.id" + - ") AND ui.user.id = ?1 ORDER BY ui.user.id DESC") - Page findAllByUserOrderByIdDesc(Long userId, Pageable pageable); + ") AND ui.user.id = ?1 ORDER BY ui.user.createdAt DESC") + Page findAllByUserOrderByCreatedAtDesc(Long userId, Pageable pageable); + + @Query(value = "SELECT ui FROM UserImage ui WHERE ui.isCurrent IS TRUE" + + " ORDER BY ui.user.createdAt DESC") + Page findAllByIsCurrentTrueOrderByCreatedAtDesc(Pageable pageable); + + @Query(value = "SELECT ui FROM UserImage ui WHERE ui.isCurrent IS True" + + " AND ui.user.id = ?1 ORDER BY ui.user.createdAt DESC") + Page findAllByUserAndIsCurrentTrueOrderByCreatedAtDesc(Long userId, Pageable pageable); } diff --git a/src/main/java/com/gg/server/admin/user/dto/UserImageAdminDto.java b/src/main/java/com/gg/server/admin/user/dto/UserImageAdminDto.java index 18eb18315..a0a90fda1 100644 --- a/src/main/java/com/gg/server/admin/user/dto/UserImageAdminDto.java +++ b/src/main/java/com/gg/server/admin/user/dto/UserImageAdminDto.java @@ -12,18 +12,18 @@ @AllArgsConstructor public class UserImageAdminDto { Long id; - Long userId; String userIntraId; String imageUri; LocalDateTime createdAt; - Boolean isDeleted; + LocalDateTime deletedAt; + Boolean isCurrent; public UserImageAdminDto(UserImage userImage) { this.id = userImage.getId(); - this.userId = userImage.getUser().getId(); this.userIntraId = userImage.getUser().getIntraId(); this.imageUri = userImage.getImageUri(); this.createdAt = userImage.getCreatedAt(); - this.isDeleted = userImage.getIsDeleted(); + this.deletedAt = userImage.getDeletedAt(); + this.isCurrent = userImage.getIsCurrent(); } } diff --git a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java index f50e8ac53..d56ccd4fc 100644 --- a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java +++ b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java @@ -115,23 +115,27 @@ private void updateUserRank(Long userId, Long currSeasonId, UserUpdateAdminReque } public String getUserImageToString(User user) { - UserImage userImage = userImageAdminRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElse(null); - assert userImage != null; - return userImage.getImageUri(); + UserImage userImage = userImageAdminRepository.findTopByUserAndDeletedAtIsNullOrderByCreatedAtDesc(user).orElse(null); + if (userImage == null) + return "null"; + else { + userImage.updateIsCurrent(true); + return userImage.getImageUri(); + } } @Transactional public void deleteUserProfileImage(String intraId) { User user = userAdminRepository.findByIntraId(intraId).orElseThrow(UserNotFoundException::new); - UserImage userImage = userImageAdminRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElseThrow(UserNotFoundException::new); - userImage.updateIsDeleted(true); + UserImage userImage = userImageAdminRepository.findTopByUserAndIsCurrentIsTrueOrderByCreatedAtDesc(user).orElseThrow(UserNotFoundException::new); + userImage.updateDeletedAt(LocalDateTime.now()); String userImageUri = getUserImageToString(user); user.updateImageUri(userImageUri); } @Transactional(readOnly = true) public UserImageListAdminResponseDto getUserImageDeleteList(Pageable pageable) { - Page userImagePage = userImageAdminRepository.findAllByIsDeleted(pageable, true); + Page userImagePage = userImageAdminRepository.findAllByDeletedAtNotNullOrderByDeletedAtDesc(pageable); Page userImageAdminDto = userImagePage.map(UserImageAdminDto::new); return new UserImageListAdminResponseDto(userImageAdminDto.getContent(), userImageAdminDto.getTotalPages()); @@ -139,16 +143,15 @@ public UserImageListAdminResponseDto getUserImageDeleteList(Pageable pageable) { @Transactional(readOnly = true) public UserImageListAdminResponseDto getUserImageDeleteListByIntraId(Pageable pageable, String intraId) { User user = userAdminRepository.findByIntraId(intraId).orElseThrow(UserNotFoundException::new); - Page userImagePage = userImageAdminRepository.findAllByUserAndIsDeletedOrderByIdDesc(user.getId(), pageable); + Page userImagePage = userImageAdminRepository.findAllByUserAndDeletedAtNotNullOrderByDeletedAtDesc(user.getId(), pageable); Page userImageAdminDto = userImagePage.map(UserImageAdminDto::new); return new UserImageListAdminResponseDto(userImageAdminDto.getContent(), userImageAdminDto.getTotalPages()); } - @Transactional(readOnly = true) public UserImageListAdminResponseDto getUserImageList(Pageable pageable) { - Page userImagePage = userImageAdminRepository.findAllChanged(pageable); + Page userImagePage = userImageAdminRepository.findAllChangedOrderByCreatedAt(pageable); Page userImageAdminDto = userImagePage.map(UserImageAdminDto::new); return new UserImageListAdminResponseDto(userImageAdminDto.getContent(), userImageAdminDto.getTotalPages()); @@ -157,7 +160,24 @@ public UserImageListAdminResponseDto getUserImageList(Pageable pageable) { @Transactional(readOnly = true) public UserImageListAdminResponseDto getUserImageListByIntraId(Pageable pageable, String intraId) { User user = userAdminRepository.findByIntraId(intraId).orElseThrow(UserNotFoundException::new); - Page userImagePage = userImageAdminRepository.findAllByUserOrderByIdDesc(user.getId(), pageable); + Page userImagePage = userImageAdminRepository.findAllByUserOrderByCreatedAtDesc(user.getId(), pageable); + Page userImageAdminDto = userImagePage.map(UserImageAdminDto::new); + + return new UserImageListAdminResponseDto(userImageAdminDto.getContent(), userImageAdminDto.getTotalPages()); + } + + @Transactional(readOnly = true) + public UserImageListAdminResponseDto getUserImageCurrent(Pageable pageable) { + Page userImagePage = userImageAdminRepository.findAllByIsCurrentTrueOrderByCreatedAtDesc(pageable); + Page userImageAdminDto = userImagePage.map(UserImageAdminDto::new); + + return new UserImageListAdminResponseDto(userImageAdminDto.getContent(), userImageAdminDto.getTotalPages()); + } + + @Transactional(readOnly = true) + public UserImageListAdminResponseDto getUserImageCurrentByIntraId(Pageable pageable, String intraId) { + User user = userAdminRepository.findByIntraId(intraId).orElseThrow(UserNotFoundException::new); + Page userImagePage = userImageAdminRepository.findAllByUserAndIsCurrentTrueOrderByCreatedAtDesc(user.getId(), pageable); Page userImageAdminDto = userImagePage.map(UserImageAdminDto::new); return new UserImageListAdminResponseDto(userImageAdminDto.getContent(), userImageAdminDto.getTotalPages()); diff --git a/src/main/java/com/gg/server/domain/rank/service/RankService.java b/src/main/java/com/gg/server/domain/rank/service/RankService.java index 56572a9e8..33abf7342 100644 --- a/src/main/java/com/gg/server/domain/rank/service/RankService.java +++ b/src/main/java/com/gg/server/domain/rank/service/RankService.java @@ -59,7 +59,7 @@ public ExpRankPageResponseDto getExpRankPage(PageRequest pageRequest, UserDto cu for(int i = 0; i < ranks.size(); i++) { RankRedis rank = ranks.get(i); User user = users.getContent().get(i); - UserImage userImageUri = userImageRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElseThrow(UserImageNullException::new); + UserImage userImageUri = userImageRepository.findTopByUserAndDeletedAtNotNullOrderByIdDesc(user).orElseThrow(UserImageNullException::new); expRankDtos.add(ExpRankDto.from(user, userImageUri, startRank + i, rank.getStatusMessage())); } diff --git a/src/main/java/com/gg/server/domain/user/data/UserImage.java b/src/main/java/com/gg/server/domain/user/data/UserImage.java index 4611a7838..58e5d3247 100644 --- a/src/main/java/com/gg/server/domain/user/data/UserImage.java +++ b/src/main/java/com/gg/server/domain/user/data/UserImage.java @@ -30,18 +30,27 @@ public class UserImage { @Column(name = "created_at") private LocalDateTime createdAt; + @Column(name = "deleted_at") + private LocalDateTime deletedAt; + @NotNull - @Column(name = "is_deleted") - private Boolean isDeleted; + @Column(name = "is_current") + private Boolean isCurrent; - public UserImage(User user, String imageUri, LocalDateTime createdAt, Boolean isDeleted) { + public UserImage(User user, String imageUri, LocalDateTime createdAt, LocalDateTime deletedAt, Boolean isCurrent) { this.user = user; this.imageUri = imageUri; this.createdAt = createdAt; - this.isDeleted = isDeleted; + this.deletedAt = deletedAt; + this.isCurrent = isCurrent; + } + + public void updateIsCurrent(Boolean isCurrent) { + this.isCurrent = isCurrent; } - public void updateIsDeleted(Boolean isDeleted) { - this.isDeleted = isDeleted; + public void updateDeletedAt(LocalDateTime deletedAt) { + this.deletedAt = deletedAt; + updateIsCurrent(false); } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/user/data/UserImageRepository.java b/src/main/java/com/gg/server/domain/user/data/UserImageRepository.java index a777fb7b2..8ac21fb23 100644 --- a/src/main/java/com/gg/server/domain/user/data/UserImageRepository.java +++ b/src/main/java/com/gg/server/domain/user/data/UserImageRepository.java @@ -5,5 +5,7 @@ import java.util.Optional; public interface UserImageRepository extends JpaRepository { - Optional findTopByUserAndIsDeletedOrderByIdDesc(User user, Boolean isDeleted); + Optional findTopByUserAndDeletedAtNotNullOrderByIdDesc(User user); + + Optional findTopByUserAndIsCurrentIsTrueOrderByIdDesc(User user); } diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 5e55f5fa6..ae0cb6b70 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -345,6 +345,8 @@ public void updateUserProfileImage(UserDto user, UserProfileImageRequestDto user throw new UserImageTypeException(); } + UserImage userImage = userImageRepository.findTopByUserAndIsCurrentIsTrueOrderByIdDesc(userId).orElseThrow(null); + userImage.updateIsCurrent(false); asyncNewUserImageUploader.update(user.getIntraId(), userImageFile); receipt.updateStatus(ItemStatus.USED); } @@ -363,10 +365,4 @@ public void checkUseStatus(Receipt receipt) { if (!receipt.getStatus().equals(ItemStatus.BEFORE)) throw new ItemStatusException(); } - - public String getUserImageToString(User user) { - UserImage userImage = userImageRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElse(null); - assert userImage != null; - return userImage.getImageUri(); - } } diff --git a/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java b/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java index bac456454..802e8ccc9 100644 --- a/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java +++ b/src/main/java/com/gg/server/global/utils/aws/AsyncNewUserImageUploader.java @@ -44,7 +44,7 @@ public void upload(String intraId, String imageUrl) { } userRepository.findByIntraId(intraId).ifPresent(user -> { UserImage userImage = new UserImage(user, (s3ImageUrl != null) ? s3ImageUrl : defaultImageUrl, - LocalDateTime.now(), false); + LocalDateTime.now(), null, true); userImageRepository.save(userImage); user.updateImageUri(userImage.getImageUri()); }); @@ -55,7 +55,7 @@ public void update(String intraId, MultipartFile multipartFile) throws IOExcepti User user = userRepository.findByIntraId(intraId).get(); String s3ImageUrl = userImageHandler.updateAndGetS3ImageUri(multipartFile, user); s3ImageUrl = s3ImageUrl == null ? defaultImageUrl : s3ImageUrl; - UserImage userImage = new UserImage(user, s3ImageUrl, LocalDateTime.now(), false); + UserImage userImage = new UserImage(user, s3ImageUrl, LocalDateTime.now(), null, true); userImageRepository.saveAndFlush(userImage); user.updateImageUri(s3ImageUrl); } diff --git a/src/main/resources/db/migration/V2.5__add_userImage_and_user_image_uri.sql b/src/main/resources/db/migration/V2.5__add_userImage_and_user_image_uri.sql index d4f76366a..c67b74395 100644 --- a/src/main/resources/db/migration/V2.5__add_userImage_and_user_image_uri.sql +++ b/src/main/resources/db/migration/V2.5__add_userImage_and_user_image_uri.sql @@ -4,7 +4,8 @@ create table user_image user_id bigint, image_uri varchar(255), created_at datetime(6) not null, - is_deleted bit not null default 0, + deleted_at datetime(6) default null, + is_current bit default 1 not null, primary key (id) ); diff --git a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java index 3c8bc3ad2..21d9e8b15 100644 --- a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java @@ -160,13 +160,13 @@ public void deleteUserProfileImageTest() throws Exception{ Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); User user = userRepository.findByIntraId("klew").get(); String url = "/pingpong/admin/users/" + user.getIntraId(); - UserImage PrevUserImage = userImageAdminRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElseThrow(UserNotFoundException::new); + UserImage PrevUserImage = userImageAdminRepository.findTopByUserAndDeletedAtNotNullOrderByIdDesc(user).orElseThrow(UserNotFoundException::new); //when //200 성공 mockMvc.perform(delete(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) .andExpect(status().isNoContent()); - UserImage CurrentUserImage = userImageAdminRepository.findTopByUserAndIsDeletedOrderByIdDesc(user, false).orElseThrow(UserNotFoundException::new); + UserImage CurrentUserImage = userImageAdminRepository.findTopByUserAndDeletedAtNotNullOrderByIdDesc(user).orElseThrow(UserNotFoundException::new); Assertions.assertThat(PrevUserImage.getId()).isNotEqualTo(CurrentUserImage.getId()); } From f59590d48f18bc783194d65fddb3d93c3ca2c7f5 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sun, 10 Sep 2023 20:29:21 +0900 Subject: [PATCH 192/273] [TEST] DELETE userImage IntreId --- .../admin/user/controller/UserAdminControllerTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java index 21d9e8b15..2393b08e0 100644 --- a/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/user/controller/UserAdminControllerTest.java @@ -160,13 +160,13 @@ public void deleteUserProfileImageTest() throws Exception{ Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); User user = userRepository.findByIntraId("klew").get(); String url = "/pingpong/admin/users/" + user.getIntraId(); - UserImage PrevUserImage = userImageAdminRepository.findTopByUserAndDeletedAtNotNullOrderByIdDesc(user).orElseThrow(UserNotFoundException::new); + UserImage PrevUserImage = userImageAdminRepository.findTopByUserAndIsCurrentIsTrueOrderByCreatedAtDesc(user).orElseThrow(UserNotFoundException::new); //when //200 성공 mockMvc.perform(delete(url).header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) .andExpect(status().isNoContent()); - UserImage CurrentUserImage = userImageAdminRepository.findTopByUserAndDeletedAtNotNullOrderByIdDesc(user).orElseThrow(UserNotFoundException::new); + UserImage CurrentUserImage = userImageAdminRepository.findTopByUserAndIsCurrentIsTrueOrderByCreatedAtDesc(user).orElseThrow(UserNotFoundException::new); Assertions.assertThat(PrevUserImage.getId()).isNotEqualTo(CurrentUserImage.getId()); } @@ -192,7 +192,7 @@ public void getUserImageDeleteListTest() throws Exception{ //각 유저의 이미지가 삭제된 이미지인지 확인 List actureUserImageList = actureResponse.getUserImageList(); for (UserImageAdminDto userImageDto : actureUserImageList) - Assertions.assertThat(userImageDto.getIsDeleted()).isEqualTo(true); + Assertions.assertThat(userImageDto.getDeletedAt()).isNotEqualTo(null); } @Test From 44f627002295cfc0142dccf4883d1c13b6774088 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Sun, 10 Sep 2023 20:58:03 +0900 Subject: [PATCH 193/273] [REFACTOR] changed expRankDtos --- src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java | 4 ++-- .../java/com/gg/server/domain/rank/service/RankService.java | 5 +---- .../com/gg/server/domain/user/data/UserImageRepository.java | 2 -- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java b/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java index 3c15c1833..81287fd69 100644 --- a/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java +++ b/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java @@ -16,14 +16,14 @@ public class ExpRankDto { private Integer exp; private String userImageUri; - public static ExpRankDto from (User user, UserImage userImage, Integer rank, String statusMessage){ + public static ExpRankDto from (User user, Integer rank, String statusMessage){ ExpRankDto dto = ExpRankDto.builder() .intraId(user.getIntraId()) .rank(user.getTotalExp() == 0 ? -1 : rank) .statusMessage(statusMessage) .level(ExpLevelCalculator.getLevel(user.getTotalExp())) .exp(user.getTotalExp()) - .userImageUri(userImage.getImageUri()) + .userImageUri(user.getImageUri()) .build(); return dto; } diff --git a/src/main/java/com/gg/server/domain/rank/service/RankService.java b/src/main/java/com/gg/server/domain/rank/service/RankService.java index 33abf7342..acc573ace 100644 --- a/src/main/java/com/gg/server/domain/rank/service/RankService.java +++ b/src/main/java/com/gg/server/domain/rank/service/RankService.java @@ -15,7 +15,6 @@ import com.gg.server.domain.user.data.UserImageRepository; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; -import com.gg.server.domain.user.exception.UserImageNullException; import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.global.exception.ErrorCode; import com.gg.server.global.exception.custom.PageNotFoundException; @@ -38,7 +37,6 @@ public class RankService { private final UserRepository userRepository; private final RankRedisRepository redisRepository; private final SeasonFindService seasonFindService; - private final UserImageRepository userImageRepository; @Transactional(readOnly = true) public ExpRankPageResponseDto getExpRankPage(PageRequest pageRequest, UserDto curUser) { @@ -59,8 +57,7 @@ public ExpRankPageResponseDto getExpRankPage(PageRequest pageRequest, UserDto cu for(int i = 0; i < ranks.size(); i++) { RankRedis rank = ranks.get(i); User user = users.getContent().get(i); - UserImage userImageUri = userImageRepository.findTopByUserAndDeletedAtNotNullOrderByIdDesc(user).orElseThrow(UserImageNullException::new); - expRankDtos.add(ExpRankDto.from(user, userImageUri, startRank + i, rank.getStatusMessage())); + expRankDtos.add(ExpRankDto.from(user, startRank + i, rank.getStatusMessage())); } return new ExpRankPageResponseDto(myRank.intValue(), pageRequest.getPageNumber() + 1, users.getTotalPages(), expRankDtos); diff --git a/src/main/java/com/gg/server/domain/user/data/UserImageRepository.java b/src/main/java/com/gg/server/domain/user/data/UserImageRepository.java index 8ac21fb23..660805a63 100644 --- a/src/main/java/com/gg/server/domain/user/data/UserImageRepository.java +++ b/src/main/java/com/gg/server/domain/user/data/UserImageRepository.java @@ -5,7 +5,5 @@ import java.util.Optional; public interface UserImageRepository extends JpaRepository { - Optional findTopByUserAndDeletedAtNotNullOrderByIdDesc(User user); - Optional findTopByUserAndIsCurrentIsTrueOrderByIdDesc(User user); } From b96324f88e44fddeb4ae02a21c8a9334ca97b934 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Mon, 11 Sep 2023 11:03:25 +0900 Subject: [PATCH 194/273] =?UTF-8?q?[REFACOTOR]=20GGBE4-17=20=ED=99=95?= =?UTF-8?q?=EC=84=B1=EA=B8=B0=20=EC=A0=95=EB=A0=AC=20=EC=A1=B0=EA=B1=B4=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/megaphone/controller/MegaphoneAdminController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/admin/megaphone/controller/MegaphoneAdminController.java b/src/main/java/com/gg/server/admin/megaphone/controller/MegaphoneAdminController.java index 6b0217afc..41bbca3ee 100644 --- a/src/main/java/com/gg/server/admin/megaphone/controller/MegaphoneAdminController.java +++ b/src/main/java/com/gg/server/admin/megaphone/controller/MegaphoneAdminController.java @@ -22,7 +22,7 @@ public class MegaphoneAdminController { public ResponseEntity getMegaphoneHistory(@ModelAttribute @Valid PageRequestDto pageRequestDto, @RequestParam(required = false) String intraId) { Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, pageRequestDto.getSize(), - Sort.by("usedAt").descending()); + Sort.by("id").descending()); if (intraId == null) return ResponseEntity.ok(megaphoneAdminService.getMegaphoneHistory(pageable)); return ResponseEntity.ok(megaphoneAdminService.getMegaphoneHistoryByIntraId(intraId, pageable)); From 685489591ba243ff71b65dce3c7d56a5b48f0562 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Mon, 11 Sep 2023 12:54:26 +0900 Subject: [PATCH 195/273] =?UTF-8?q?[FEAT]=20=EC=83=88=20=EC=8B=9C=EC=A6=8C?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=EC=8B=9C=20=ED=8B=B0=EC=96=B4=201?= =?UTF-8?q?=EB=A1=9C=20=EC=B4=88=EA=B8=B0=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/admin/rank/service/RankAdminService.java | 6 +++++- src/main/java/com/gg/server/domain/rank/data/Rank.java | 3 ++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/admin/rank/service/RankAdminService.java b/src/main/java/com/gg/server/admin/rank/service/RankAdminService.java index 44f6c5cd0..78c91fb64 100644 --- a/src/main/java/com/gg/server/admin/rank/service/RankAdminService.java +++ b/src/main/java/com/gg/server/admin/rank/service/RankAdminService.java @@ -8,6 +8,8 @@ import com.gg.server.domain.season.data.SeasonRepository; import com.gg.server.domain.season.exception.SeasonForbiddenException; import com.gg.server.domain.season.exception.SeasonTimeBeforeException; +import com.gg.server.domain.tier.data.Tier; +import com.gg.server.domain.tier.data.TierRepository; import com.gg.server.domain.user.data.User; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; @@ -25,6 +27,7 @@ public class RankAdminService { private final RankRepository rankRepository; private final UserAdminRepository userAdminRepository; private final SeasonRepository seasonRepository; + private final TierRepository tierRepository; @Transactional public void addAllUserRankByNewSeason(SeasonAdminDto seasonAdminDto) { @@ -34,9 +37,10 @@ public void addAllUserRankByNewSeason(SeasonAdminDto seasonAdminDto) { List ranks = new ArrayList<>(); Season season = seasonRepository.findById(seasonAdminDto.getSeasonId()).get(); + Tier tier = tierRepository.findAll().get(0); users.forEach(user -> { if (user.getRoleType() != GUEST) { - Rank userRank = Rank.from(user, season, seasonAdminDto.getStartPpp()); + Rank userRank = Rank.from(user, season, seasonAdminDto.getStartPpp(), tier); ranks.add(userRank); } }); diff --git a/src/main/java/com/gg/server/domain/rank/data/Rank.java b/src/main/java/com/gg/server/domain/rank/data/Rank.java index 8e1a37f64..275f21646 100644 --- a/src/main/java/com/gg/server/domain/rank/data/Rank.java +++ b/src/main/java/com/gg/server/domain/rank/data/Rank.java @@ -54,7 +54,7 @@ public class Rank extends BaseTimeEntity implements Serializable { private String statusMessage; - public static Rank from (User user, Season season, Integer ppp) { + public static Rank from (User user, Season season, Integer ppp, Tier tier) { return Rank.builder() .user(user) .ppp(ppp) @@ -62,6 +62,7 @@ public static Rank from (User user, Season season, Integer ppp) { .wins(0) .losses(0) .statusMessage("") + .tier(tier) .build(); } From 515e1c0a3501bac5755ae218f01334b6eac0e066 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Mon, 11 Sep 2023 12:58:47 +0900 Subject: [PATCH 196/273] =?UTF-8?q?[FEAT]=20=EC=83=88=20=EC=8B=9C=EC=A6=8C?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=EC=8B=9C=20=ED=8B=B0=EC=96=B4=201?= =?UTF-8?q?=EB=A1=9C=20=EC=B4=88=EA=B8=B0=ED=99=94=20(=EB=A0=88=EB=94=94?= =?UTF-8?q?=EC=8A=A4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/admin/rank/service/RankRedisAdminService.java | 5 ++++- src/main/java/com/gg/server/domain/rank/redis/RankRedis.java | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gg/server/admin/rank/service/RankRedisAdminService.java b/src/main/java/com/gg/server/admin/rank/service/RankRedisAdminService.java index 70573e033..5cd36c650 100644 --- a/src/main/java/com/gg/server/admin/rank/service/RankRedisAdminService.java +++ b/src/main/java/com/gg/server/admin/rank/service/RankRedisAdminService.java @@ -4,6 +4,7 @@ import com.gg.server.domain.rank.redis.RankRedis; import com.gg.server.domain.rank.redis.RankRedisRepository; import com.gg.server.domain.rank.redis.RedisKeyManager; +import com.gg.server.domain.tier.data.TierRepository; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; @@ -20,17 +21,19 @@ public class RankRedisAdminService { private final UserRepository userRepository; private final RankRedisRepository rankRedisRepository; + private final TierRepository tierRepository; @Transactional public void addAllUserRankByNewSeason(SeasonAdminDto seasonAdminDto) { List users = userRepository.findAll(); String redisHashKey = RedisKeyManager.getHashKey(seasonAdminDto.getSeasonId()); + String tierImageUrl = tierRepository.findAll().get(0).getImageUri(); users.forEach(user -> { if (user.getRoleType() != GUEST) { UserDto userDto = UserDto.from(user); - RankRedis userRank = RankRedis.from(userDto, seasonAdminDto.getStartPpp()); + RankRedis userRank = RankRedis.from(userDto, seasonAdminDto.getStartPpp(), tierImageUrl); rankRedisRepository.addRankData(redisHashKey, user.getId(), userRank); } diff --git a/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java b/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java index 726203eec..f2a6724cd 100644 --- a/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java +++ b/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java @@ -42,7 +42,7 @@ public void setStatusMessage(String msg) { this.statusMessage = msg; } - public static RankRedis from(UserDto user, Integer ppp) { + public static RankRedis from(UserDto user, Integer ppp, String tierImageUrl) { RankRedis rankRedis = RankRedis.builder() .userId(user.getId()) .intraId(user.getIntraId()) @@ -50,7 +50,7 @@ public static RankRedis from(UserDto user, Integer ppp) { .wins(0) .losses(0) .statusMessage("") - .tierImageUrl("") + .tierImageUrl(tierImageUrl) .build(); return rankRedis; } From 3a4cfe84acad3f1789a3919b2688313e9b316122 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Mon, 11 Sep 2023 13:00:28 +0900 Subject: [PATCH 197/273] [FIX] The user specified as a definer ('42gg'@'%'172.26.0.13') does not exist --- .../java/com/gg/server/domain/user/dto/UserImageDto.java | 9 +-------- .../com/gg/server/domain/user/service/UserService.java | 8 +++++--- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/gg/server/domain/user/dto/UserImageDto.java b/src/main/java/com/gg/server/domain/user/dto/UserImageDto.java index a0d88cbf8..b4e0f4fd1 100644 --- a/src/main/java/com/gg/server/domain/user/dto/UserImageDto.java +++ b/src/main/java/com/gg/server/domain/user/dto/UserImageDto.java @@ -11,23 +11,16 @@ @Getter @NoArgsConstructor -@AllArgsConstructor public class UserImageDto { - Long id; String intraId; String imageUri; EdgeType edge; String tierImage; - LocalDateTime createdAt; - Boolean isDeleted; - public UserImageDto(Long id, String intraId, String imageUri, EdgeType edge, String tierImage, LocalDateTime now, boolean isDeleted) { - this.id = id; + public UserImageDto(String intraId, String imageUri, EdgeType edge, String tierImage) { this.intraId = intraId; this.imageUri = imageUri; this.edge = edge; this.tierImage = tierImage; - this.createdAt = now; - this.isDeleted = isDeleted; } } diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index ae0cb6b70..ffd890ec5 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -234,8 +234,9 @@ public UserImageResponseDto getRankedUserImagesByPPP(Long seasonId) { List userImages = new ArrayList<>(); userIds.forEach(userId -> { User user = users.stream().filter(u -> u.getId().equals(userId)).findFirst().orElseThrow(UserNotFoundException::new); - Tier tier = rankFindService.findByUserIdAndSeasonId(user.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); - userImages.add(new UserImageDto(user.getId(), user.getIntraId(), user.getImageUri(), user.getEdge(), tier.getImageUri(), LocalDateTime.now(), false)); + Tier tier = rankFindService.findByUserIdAndSeasonId(user.getId(), targetSeason.getId()).getTier(); + System.out.println("klew22 test: " + tier.getImageUri()); + userImages.add(new UserImageDto(user.getIntraId(), user.getImageUri(), user.getEdge(), tier.getImageUri())); }); return new UserImageResponseDto(userImages); } catch (RedisDataNotFoundException ex) { @@ -248,7 +249,8 @@ public UserImageResponseDto getRankedUserImagesByExp(PageRequest pageRequest) { List userImages = new ArrayList<>(); for (User user : users) { Tier tier = rankFindService.findByUserIdAndSeasonId(user.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); - userImages.add(new UserImageDto(user.getId(), user.getIntraId(), user.getImageUri(), user.getEdge(), tier.getImageUri(), LocalDateTime.now(), false)); + System.out.println("klew test: " + tier.getImageUri()); + userImages.add(new UserImageDto(user.getIntraId(), user.getImageUri(), user.getEdge(), tier.getImageUri())); } return new UserImageResponseDto(userImages); } From 6ae403e0aed4daaff74e0f8cec4047abdfa7e896 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Mon, 11 Sep 2023 13:23:33 +0900 Subject: [PATCH 198/273] [FIX] userImageAdminRepository sort --- .../admin/user/data/UserImageAdminRepository.java | 10 +++++----- .../gg/server/admin/user/service/UserAdminService.java | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java index 703bd10d4..555cc14ea 100644 --- a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java +++ b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java @@ -22,19 +22,19 @@ public interface UserImageAdminRepository extends JpaRepository @Query(value = "SELECT ui FROM UserImage ui WHERE ui.id NOT IN (" + "SELECT MIN(ui.id) FROM UserImage ui GROUP BY ui.user.id" + - ") ORDER BY ui.user.createdAt DESC") - Page findAllChangedOrderByCreatedAt(Pageable pageable); + ") ORDER BY ui.createdAt DESC") + Page findAllChangedOrderByCreatedAtDesc(Pageable pageable); @Query(value = "SELECT ui FROM UserImage ui WHERE ui.id NOT IN (" + "SELECT MIN(ui.id) FROM UserImage ui GROUP BY ui.user.id" + - ") AND ui.user.id = ?1 ORDER BY ui.user.createdAt DESC") + ") AND ui.user.id = ?1 ORDER BY ui.createdAt DESC") Page findAllByUserOrderByCreatedAtDesc(Long userId, Pageable pageable); @Query(value = "SELECT ui FROM UserImage ui WHERE ui.isCurrent IS TRUE" + - " ORDER BY ui.user.createdAt DESC") + " ORDER BY ui.createdAt DESC") Page findAllByIsCurrentTrueOrderByCreatedAtDesc(Pageable pageable); @Query(value = "SELECT ui FROM UserImage ui WHERE ui.isCurrent IS True" + - " AND ui.user.id = ?1 ORDER BY ui.user.createdAt DESC") + " AND ui.user.id = ?1 ORDER BY ui.createdAt DESC") Page findAllByUserAndIsCurrentTrueOrderByCreatedAtDesc(Long userId, Pageable pageable); } diff --git a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java index d56ccd4fc..7a37d19e3 100644 --- a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java +++ b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java @@ -151,7 +151,7 @@ public UserImageListAdminResponseDto getUserImageDeleteListByIntraId(Pageable pa @Transactional(readOnly = true) public UserImageListAdminResponseDto getUserImageList(Pageable pageable) { - Page userImagePage = userImageAdminRepository.findAllChangedOrderByCreatedAt(pageable); + Page userImagePage = userImageAdminRepository.findAllChangedOrderByCreatedAtDesc(pageable); Page userImageAdminDto = userImagePage.map(UserImageAdminDto::new); return new UserImageListAdminResponseDto(userImageAdminDto.getContent(), userImageAdminDto.getTotalPages()); From fc3a8d34486db1abbde8b8d39f55e5d6832116bf Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Mon, 11 Sep 2023 13:51:25 +0900 Subject: [PATCH 199/273] [CHORE] delete println --- .../java/com/gg/server/domain/user/service/UserService.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index ffd890ec5..db81f0a27 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -235,7 +235,6 @@ public UserImageResponseDto getRankedUserImagesByPPP(Long seasonId) { userIds.forEach(userId -> { User user = users.stream().filter(u -> u.getId().equals(userId)).findFirst().orElseThrow(UserNotFoundException::new); Tier tier = rankFindService.findByUserIdAndSeasonId(user.getId(), targetSeason.getId()).getTier(); - System.out.println("klew22 test: " + tier.getImageUri()); userImages.add(new UserImageDto(user.getIntraId(), user.getImageUri(), user.getEdge(), tier.getImageUri())); }); return new UserImageResponseDto(userImages); @@ -249,7 +248,6 @@ public UserImageResponseDto getRankedUserImagesByExp(PageRequest pageRequest) { List userImages = new ArrayList<>(); for (User user : users) { Tier tier = rankFindService.findByUserIdAndSeasonId(user.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); - System.out.println("klew test: " + tier.getImageUri()); userImages.add(new UserImageDto(user.getIntraId(), user.getImageUri(), user.getEdge(), tier.getImageUri())); } return new UserImageResponseDto(userImages); From 0ba56f8db3c13c487105be8b3ff1b897849859a8 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Mon, 11 Sep 2023 14:24:55 +0900 Subject: [PATCH 200/273] =?UTF-8?q?[FIX]=20rank.from,=20rankredis.from=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EB=B3=80=EA=B2=BD=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=A5=B8=20=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/match/service/MatchFindService.java | 6 +++++- .../security/service/CustomOAuth2UserService.java | 8 ++++++-- .../com/gg/server/game/GameControllerTest.java | 15 +++++++++++---- .../server/game/service/GameFindServiceTest.java | 9 ++++++++- .../gg/server/game/service/GameServiceTest.java | 10 ++++++++-- 5 files changed, 38 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gg/server/domain/match/service/MatchFindService.java b/src/main/java/com/gg/server/domain/match/service/MatchFindService.java index 28aed48ff..070060cd7 100644 --- a/src/main/java/com/gg/server/domain/match/service/MatchFindService.java +++ b/src/main/java/com/gg/server/domain/match/service/MatchFindService.java @@ -20,6 +20,8 @@ import com.gg.server.domain.season.service.SeasonFindService; import com.gg.server.domain.slotmanagement.SlotManagement; import com.gg.server.domain.slotmanagement.data.SlotManagementRepository; +import com.gg.server.domain.tier.data.Tier; +import com.gg.server.domain.tier.data.TierRepository; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; @@ -44,6 +46,7 @@ public class MatchFindService { private final SeasonFindService seasonFindService; private final RankRedisRepository rankRedisRepository; private final RedisMatchTimeRepository redisMatchTimeRepository; + private final TierRepository tierRepository; @Transactional(readOnly = true) @@ -70,9 +73,10 @@ public SlotStatusResponseListDto getAllMatchStatus(UserDto userDto, Option optio SlotManagement slotManagement = slotManagementRepository.findCurrent(LocalDateTime.now()) .orElseThrow(SlotNotFoundException::new); Season season = seasonFindService.findCurrentSeason(LocalDateTime.now()); + Tier tier = tierRepository.findAll().get(0); RankRedis user; if (userDto.getRoleType().equals(RoleType.GUEST)) { - user = RankRedis.from(userDto, season.getStartPpp()); + user = RankRedis.from(userDto, season.getStartPpp(), tier.getImageUri()); } else { user = rankRedisRepository. findRankByUserId(RedisKeyManager.getHashKey(season.getId()), userDto.getId()); diff --git a/src/main/java/com/gg/server/global/security/service/CustomOAuth2UserService.java b/src/main/java/com/gg/server/global/security/service/CustomOAuth2UserService.java index fb8525a74..8c7804b5f 100644 --- a/src/main/java/com/gg/server/global/security/service/CustomOAuth2UserService.java +++ b/src/main/java/com/gg/server/global/security/service/CustomOAuth2UserService.java @@ -6,6 +6,8 @@ import com.gg.server.domain.rank.redis.RankRedisRepository; import com.gg.server.domain.rank.redis.RedisKeyManager; import com.gg.server.domain.season.data.SeasonRepository; +import com.gg.server.domain.tier.data.Tier; +import com.gg.server.domain.tier.data.TierRepository; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; @@ -38,6 +40,7 @@ public class CustomOAuth2UserService extends DefaultOAuth2UserService { private final RankRepository rankRepository; private final SeasonRepository seasonRepository; private final RankRedisRepository rankRedisRepository; + private final TierRepository tierRepository; @Value("${info.image.defaultUrl}") private String defaultImageUrl; @@ -79,11 +82,12 @@ private OAuth2User process(OAuth2UserRequest userRequest, OAuth2User user) { } private void createUserRank(User savedUser) { + Tier tier = tierRepository.findAll().get(0); seasonRepository.findCurrentAndNewSeason(LocalDateTime.now()).forEach( season -> { - Rank userRank = Rank.from(savedUser, season, season.getStartPpp()); + Rank userRank = Rank.from(savedUser, season, season.getStartPpp(), tier); rankRepository.save(userRank); - RankRedis rankRedis = RankRedis.from(UserDto.from(savedUser), season.getStartPpp()); + RankRedis rankRedis = RankRedis.from(UserDto.from(savedUser), season.getStartPpp(), tier.getImageUri()); String hashKey = RedisKeyManager.getHashKey(season.getId()); rankRedisRepository.addRankData(hashKey, savedUser.getId(), rankRedis); } diff --git a/src/test/java/com/gg/server/game/GameControllerTest.java b/src/test/java/com/gg/server/game/GameControllerTest.java index 7fd451ce8..e2f71cfb3 100644 --- a/src/test/java/com/gg/server/game/GameControllerTest.java +++ b/src/test/java/com/gg/server/game/GameControllerTest.java @@ -24,6 +24,8 @@ import com.gg.server.domain.team.data.TeamRepository; import com.gg.server.domain.team.data.TeamUser; import com.gg.server.domain.team.data.TeamUserRepository; +import com.gg.server.domain.tier.data.Tier; +import com.gg.server.domain.tier.data.TierRepository; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.domain.user.type.RacketType; @@ -69,6 +71,10 @@ public class GameControllerTest { TeamUserRepository teamUserRepository; @Autowired RankRedisRepository rankRedisRepository; + + @Autowired + TierRepository tierRepository; + @Autowired PChangeRepository pChangeRepository; @Autowired @@ -101,12 +107,13 @@ void init() { user1 = testDataUtils.createNewUser("test1", "test1@email", RacketType.NONE, SnsType.EMAIL, RoleType.USER); accessToken = tokenProvider.createToken(user1.getId()); user2 = testDataUtils.createNewUser("test2", "test2@email", RacketType.NONE, SnsType.EMAIL, RoleType.USER); - rankRepository.save(Rank.from(user1, season, season.getStartPpp())); - rankRepository.save(Rank.from(user2, season, season.getStartPpp())); - RankRedis userRank = RankRedis.from(UserDto.from(user1), season.getStartPpp()); + Tier tier = tierRepository.findAll().get(0); + rankRepository.save(Rank.from(user1, season, season.getStartPpp(), tier)); + rankRepository.save(Rank.from(user2, season, season.getStartPpp(), tier)); + RankRedis userRank = RankRedis.from(UserDto.from(user1), season.getStartPpp(), tier.getImageUri()); String redisHashKey = RedisKeyManager.getHashKey(season.getId()); rankRedisRepository.addRankData(redisHashKey, user1.getId(), userRank); - userRank = RankRedis.from(UserDto.from(user2), season.getStartPpp()); + userRank = RankRedis.from(UserDto.from(user2), season.getStartPpp(), tier.getImageUri()); rankRedisRepository.addRankData(redisHashKey, user2.getId(), userRank); for (int i = 0; i < 10; i++) { Game game = gameRepository.save(new Game(season, StatusType.WAIT, Mode.RANK, LocalDateTime.now().minusMinutes(15), LocalDateTime.now())); diff --git a/src/test/java/com/gg/server/game/service/GameFindServiceTest.java b/src/test/java/com/gg/server/game/service/GameFindServiceTest.java index 853417967..b2875f960 100644 --- a/src/test/java/com/gg/server/game/service/GameFindServiceTest.java +++ b/src/test/java/com/gg/server/game/service/GameFindServiceTest.java @@ -12,6 +12,8 @@ import com.gg.server.domain.rank.redis.RankRedisRepository; import com.gg.server.domain.rank.redis.RedisKeyManager; import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.tier.data.Tier; +import com.gg.server.domain.tier.data.TierRepository; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; @@ -47,6 +49,10 @@ public class GameFindServiceTest { AuthTokenProvider tokenProvider; @Autowired RankRedisRepository rankRedisRepository; + + @Autowired + TierRepository tierRepository; + @Autowired GameRepository gameRepository; @@ -54,6 +60,7 @@ public class GameFindServiceTest { void init() { Season season = testDataUtils.createSeason(); User newUser = testDataUtils.createNewUser(); + Tier tier = tierRepository.findAll().get(0); String accessToken = tokenProvider.createToken(newUser.getId()); String statusMsg = "status message test1"; @@ -70,7 +77,7 @@ void init() { testDataUtils.createMockMatch(newUser, season, startTime2, endTime2); testDataUtils.createUserRank(newUser, statusMsg, season); - RankRedis userRank = RankRedis.from(UserDto.from(newUser), season.getStartPpp()); + RankRedis userRank = RankRedis.from(UserDto.from(newUser), season.getStartPpp(), tier.getImageUri()); String redisHashKey = RedisKeyManager.getHashKey(season.getId()); rankRedisRepository.addRankData(redisHashKey, newUser.getId(), userRank); } diff --git a/src/test/java/com/gg/server/game/service/GameServiceTest.java b/src/test/java/com/gg/server/game/service/GameServiceTest.java index 7de4b0945..5150b2c9e 100644 --- a/src/test/java/com/gg/server/game/service/GameServiceTest.java +++ b/src/test/java/com/gg/server/game/service/GameServiceTest.java @@ -17,6 +17,8 @@ import com.gg.server.domain.team.data.TeamRepository; import com.gg.server.domain.team.data.TeamUser; import com.gg.server.domain.team.data.TeamUserRepository; +import com.gg.server.domain.tier.data.Tier; +import com.gg.server.domain.tier.data.TierRepository; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; @@ -52,6 +54,9 @@ public class GameServiceTest { @Autowired RankRepository rankRepository; + @Autowired + TierRepository tierRepository; + @Autowired GameService gameService; @@ -67,6 +72,7 @@ public class GameServiceTest { @BeforeEach void init() { Season season = testDataUtils.createSeason(); + Tier tier = tierRepository.findAll().get(0); user1 = testDataUtils.createNewUser(); user2 = testDataUtils.createNewUser(); LocalDateTime now = LocalDateTime.now(); @@ -79,12 +85,12 @@ void init() { String statusMsg = "status message test1"; testDataUtils.createUserRank(user1, statusMsg, season); - RankRedis userRank = RankRedis.from(UserDto.from(user1), season.getStartPpp()); + RankRedis userRank = RankRedis.from(UserDto.from(user1), season.getStartPpp(), tier.getImageUri()); String redisHashKey = RedisKeyManager.getHashKey(season.getId()); rankRedisRepository.addRankData(redisHashKey, user1.getId(), userRank); statusMsg = "status message test2"; testDataUtils.createUserRank(user2, statusMsg, season); - RankRedis userRank2 = RankRedis.from(UserDto.from(user2), season.getStartPpp()); + RankRedis userRank2 = RankRedis.from(UserDto.from(user2), season.getStartPpp(), tier.getImageUri()); rankRedisRepository.addRankData(redisHashKey, user2.getId(), userRank2); } @AfterEach From 13053ed75e0d46e7e09d7cc11b65abec2fd798ab Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Mon, 11 Sep 2023 14:43:01 +0900 Subject: [PATCH 201/273] =?UTF-8?q?[FIX]=20ExpRankDto=EC=97=90=20textColor?= =?UTF-8?q?=EA=B0=92=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java | 4 +++- .../java/com/gg/server/domain/rank/service/RankService.java | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java b/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java index 81287fd69..98574dd2e 100644 --- a/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java +++ b/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java @@ -15,8 +15,9 @@ public class ExpRankDto { private Integer level; private Integer exp; private String userImageUri; + private String textColor; - public static ExpRankDto from (User user, Integer rank, String statusMessage){ + public static ExpRankDto from (User user, Integer rank, String statusMessage, String textColor){ ExpRankDto dto = ExpRankDto.builder() .intraId(user.getIntraId()) .rank(user.getTotalExp() == 0 ? -1 : rank) @@ -24,6 +25,7 @@ public static ExpRankDto from (User user, Integer rank, String statusMessage){ .level(ExpLevelCalculator.getLevel(user.getTotalExp())) .exp(user.getTotalExp()) .userImageUri(user.getImageUri()) + .textColor(textColor) .build(); return dto; } diff --git a/src/main/java/com/gg/server/domain/rank/service/RankService.java b/src/main/java/com/gg/server/domain/rank/service/RankService.java index acc573ace..779ea5be3 100644 --- a/src/main/java/com/gg/server/domain/rank/service/RankService.java +++ b/src/main/java/com/gg/server/domain/rank/service/RankService.java @@ -57,7 +57,7 @@ public ExpRankPageResponseDto getExpRankPage(PageRequest pageRequest, UserDto cu for(int i = 0; i < ranks.size(); i++) { RankRedis rank = ranks.get(i); User user = users.getContent().get(i); - expRankDtos.add(ExpRankDto.from(user, startRank + i, rank.getStatusMessage())); + expRankDtos.add(ExpRankDto.from(user, startRank + i, rank.getStatusMessage(), user.getTextColor())); } return new ExpRankPageResponseDto(myRank.intValue(), pageRequest.getPageNumber() + 1, users.getTotalPages(), expRankDtos); From ba426ac9889a32a12ac37926d9094fdcfe1d46a4 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Tue, 12 Sep 2023 11:16:51 +0900 Subject: [PATCH 202/273] =?UTF-8?q?[CHORE]=20itemNotFoundImageUrl=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/global/utils/aws/AsyncNewItemImageUploader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/global/utils/aws/AsyncNewItemImageUploader.java b/src/main/java/com/gg/server/global/utils/aws/AsyncNewItemImageUploader.java index a7baafdff..5dcce6806 100644 --- a/src/main/java/com/gg/server/global/utils/aws/AsyncNewItemImageUploader.java +++ b/src/main/java/com/gg/server/global/utils/aws/AsyncNewItemImageUploader.java @@ -13,7 +13,7 @@ public class AsyncNewItemImageUploader { private final ItemImageHandler itemImageHandler; - @Value("${info.image.defaultUrl}") + @Value("${info.image.itemNotFoundUrl}") private String defaultImageUrl; public AsyncNewItemImageUploader(ItemImageHandler itemImageHandler) { From 68439436819c9411119628d819da21cadaa01b20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Tue, 12 Sep 2023 14:27:29 +0900 Subject: [PATCH 203/273] =?UTF-8?q?[FIX]=20GGBE4-69=20=ED=99=95=EC=84=B1?= =?UTF-8?q?=EA=B8=B0=20=EB=B6=80=ED=99=9C=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/domain/megaphone/data/MegaphoneRepository.java | 3 ++- .../gg/server/domain/megaphone/service/MegaphoneService.java | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gg/server/domain/megaphone/data/MegaphoneRepository.java b/src/main/java/com/gg/server/domain/megaphone/data/MegaphoneRepository.java index 64da1fd71..3c3f33087 100644 --- a/src/main/java/com/gg/server/domain/megaphone/data/MegaphoneRepository.java +++ b/src/main/java/com/gg/server/domain/megaphone/data/MegaphoneRepository.java @@ -1,6 +1,7 @@ package com.gg.server.domain.megaphone.data; import com.gg.server.domain.receipt.data.Receipt; +import com.gg.server.domain.receipt.type.ItemStatus; import org.springframework.data.jpa.repository.JpaRepository; import java.time.LocalDate; @@ -8,7 +9,7 @@ import java.util.Optional; public interface MegaphoneRepository extends JpaRepository { - List findAllByUsedAt(LocalDate date); + List findAllByUsedAtAndReceiptStatus(LocalDate date, ItemStatus itemStatus); Megaphone findFirstByOrderByIdDesc(); diff --git a/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java b/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java index f7790558f..a6c9917de 100644 --- a/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java +++ b/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java @@ -59,9 +59,9 @@ public void useMegaphone(MegaphoneUseRequestDto megaphoneUseRequestDto, UserDto @Transactional public void setMegaphoneList(LocalDate today) { - megaphoneRepository.findAllByUsedAt(today).forEach(megaphone -> megaphone.getReceipt().updateStatus(ItemStatus.USED)); + megaphoneRepository.findAllByUsedAtAndReceiptStatus(today, ItemStatus.USING).forEach(megaphone -> megaphone.getReceipt().updateStatus(ItemStatus.USED)); megaphoneRedisRepository.deleteAllMegaphone(); - List megaphones = megaphoneRepository.findAllByUsedAt(today.plusDays(1)); + List megaphones = megaphoneRepository.findAllByUsedAtAndReceiptStatus(today.plusDays(1), ItemStatus.WAITING); for (Megaphone megaphone : megaphones) { megaphone.getReceipt().updateStatus(ItemStatus.USING); megaphoneRedisRepository.addMegaphone(new MegaphoneRedis(megaphone.getId(), megaphone.getUser().getIntraId(), megaphone.getContent(), From 53ef23b52b9709c7a5b49c8602c078c419d44966 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Tue, 12 Sep 2023 14:33:25 +0900 Subject: [PATCH 204/273] =?UTF-8?q?[REFACTOR]=20GGBE4-69=20=ED=99=95?= =?UTF-8?q?=EC=84=B1=EA=B8=B0=20=EB=82=B4=EC=9A=A9=20=EC=97=86=EB=8A=94=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20=EC=97=90=EB=9F=AC=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../megaphone/exception/MegaphoneContentException.java | 10 ++++++++++ .../domain/megaphone/service/MegaphoneService.java | 4 ++++ .../java/com/gg/server/global/exception/ErrorCode.java | 1 + 3 files changed, 15 insertions(+) create mode 100644 src/main/java/com/gg/server/domain/megaphone/exception/MegaphoneContentException.java diff --git a/src/main/java/com/gg/server/domain/megaphone/exception/MegaphoneContentException.java b/src/main/java/com/gg/server/domain/megaphone/exception/MegaphoneContentException.java new file mode 100644 index 000000000..8022d7bef --- /dev/null +++ b/src/main/java/com/gg/server/domain/megaphone/exception/MegaphoneContentException.java @@ -0,0 +1,10 @@ +package com.gg.server.domain.megaphone.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.BusinessException; + +public class MegaphoneContentException extends BusinessException { + public MegaphoneContentException() { + super("확성기 내용이 없습니다.", ErrorCode.MEGAPHONE_CONTENT); + } +} diff --git a/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java b/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java index a6c9917de..744f5c229 100644 --- a/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java +++ b/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java @@ -7,6 +7,7 @@ import com.gg.server.domain.megaphone.dto.MegaphoneDetailResponseDto; import com.gg.server.domain.megaphone.dto.MegaphoneTodayListResponseDto; import com.gg.server.domain.megaphone.dto.MegaphoneUseRequestDto; +import com.gg.server.domain.megaphone.exception.MegaphoneContentException; import com.gg.server.domain.megaphone.exception.MegaphoneNotFoundException; import com.gg.server.domain.megaphone.exception.MegaphoneTimeException; import com.gg.server.domain.megaphone.redis.MegaphoneRedis; @@ -52,6 +53,9 @@ public void useMegaphone(MegaphoneUseRequestDto megaphoneUseRequestDto, UserDto if (!receipt.getStatus().equals(ItemStatus.BEFORE)) { throw new ItemStatusException(); } + if (megaphoneUseRequestDto.getContent().length() == 0) { + throw new MegaphoneContentException(); + } receipt.updateStatus(ItemStatus.WAITING); Megaphone megaphone = new Megaphone(loginUser, receipt, megaphoneUseRequestDto.getContent(), LocalDate.now().plusDays(1)); megaphoneRepository.save(megaphone); diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index 24381e61b..ab23b5e02 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -57,6 +57,7 @@ public enum ErrorCode { //megaphone MEGAPHONE_NOT_FOUND(404, "ME100", "MEGAPHONE NOT FOUND"), MEGAPHONE_TIME(400, "ME200", "MEGAPHONE TIME"), + MEGAPHONE_CONTENT(400, "ME201", "MEGAPHONE CONTENT IS EMPTY"), /** Penalty **/ PENALTY_NOT_FOUND(404, "PE100", "PENALTY NOT FOUND"), From ab738fbad8bad87c852d9901e0c0af99731fda1e Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Fri, 15 Sep 2023 01:29:59 +0900 Subject: [PATCH 205/273] =?UTF-8?q?[FIX]=20GGBE4-70=20=ED=98=84=EC=9E=AC?= =?UTF-8?q?=20=EC=8B=9C=EC=A6=8C=20=EC=88=98=EC=A0=95=EC=8B=9C=20204?= =?UTF-8?q?=EA=B0=80=20=EC=95=84=EB=8B=8C=20403=EB=B0=98=ED=99=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../season/service/SeasonAdminService.java | 3 +++ .../season/SeasonAdminControllerTest.java | 24 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/main/java/com/gg/server/admin/season/service/SeasonAdminService.java b/src/main/java/com/gg/server/admin/season/service/SeasonAdminService.java index f6218d2c1..aeee8b46d 100644 --- a/src/main/java/com/gg/server/admin/season/service/SeasonAdminService.java +++ b/src/main/java/com/gg/server/admin/season/service/SeasonAdminService.java @@ -83,6 +83,9 @@ public void updateSeason(Long seasonId, SeasonUpdateRequestDto updateDto) { Season season = seasonAdminRepository.findById(seasonId) .orElseThrow(() -> new SeasonNotFoundException()); + if (LocalDateTime.now().isAfter(season.getStartTime())) + throw new SeasonForbiddenException(); + if (LocalDateTime.now().isBefore(season.getStartTime())) { detach(season); season.setSeasonName(updateDto.getSeasonName()); diff --git a/src/test/java/com/gg/server/admin/season/SeasonAdminControllerTest.java b/src/test/java/com/gg/server/admin/season/SeasonAdminControllerTest.java index 8e5d801b2..740c1ac39 100644 --- a/src/test/java/com/gg/server/admin/season/SeasonAdminControllerTest.java +++ b/src/test/java/com/gg/server/admin/season/SeasonAdminControllerTest.java @@ -200,4 +200,28 @@ void updateSeasons() throws Exception { assertThat(seasonAdminRepository.findById(dbSeasonId).get().getSeasonName()) .isEqualTo(seasonUpdateRequestDto.getSeasonName()); } + + @Test + @DisplayName("Fail[Put]/pingpong/admin/seasons/{seasonId}") + void failUpdateSeasons() throws Exception {//현재 시즌을 변경할 때 400번대 상태코드 반환 + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + + Long nowSeasonId = seasonAdminRepository.findCurrentSeason(LocalDateTime.now()).get().getId(); + SeasonUpdateRequestDto seasonUpdateRequestDto = new SeasonUpdateRequestDto( + "putSeasonTestName", + LocalDateTime.now().plusHours(25), + 1000, + 500); + + String content = objectMapper.writeValueAsString(seasonUpdateRequestDto); + + String contentAsString = mockMvc.perform(MockMvcRequestBuilders.put("/pingpong/admin/seasons/" + nowSeasonId) + .content(content) + .contentType(MediaType.APPLICATION_JSON) + .header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken)) + .andExpect(status().is4xxClientError())//403반환 + .andReturn().getResponse().getContentAsString(); + + } } \ No newline at end of file From 66cf164d518ce042b0acc4d990a6d00bec040f4d Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Fri, 15 Sep 2023 14:09:31 +0900 Subject: [PATCH 206/273] =?UTF-8?q?[REFACTOR]=20RankRedis=20TextColor=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/domain/rank/dto/ExpRankDto.java | 4 ++-- .../com/gg/server/domain/rank/dto/RankDto.java | 4 ++-- .../gg/server/domain/rank/redis/RankRedis.java | 4 ++++ .../server/domain/rank/service/RankService.java | 11 ++++++----- .../domain/match/service/MatchTestUtils.java | 2 +- .../rank/redis/RankRedisRepositoryTest.java | 16 ++++++++-------- .../java/com/gg/server/utils/TestDataUtils.java | 6 +++--- 7 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java b/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java index 98574dd2e..7718b914a 100644 --- a/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java +++ b/src/main/java/com/gg/server/domain/rank/dto/ExpRankDto.java @@ -17,7 +17,7 @@ public class ExpRankDto { private String userImageUri; private String textColor; - public static ExpRankDto from (User user, Integer rank, String statusMessage, String textColor){ + public static ExpRankDto from (User user, Integer rank, String statusMessage){ ExpRankDto dto = ExpRankDto.builder() .intraId(user.getIntraId()) .rank(user.getTotalExp() == 0 ? -1 : rank) @@ -25,7 +25,7 @@ public static ExpRankDto from (User user, Integer rank, String statusMessage, St .level(ExpLevelCalculator.getLevel(user.getTotalExp())) .exp(user.getTotalExp()) .userImageUri(user.getImageUri()) - .textColor(textColor) + .textColor(user.getTextColor()) .build(); return dto; } diff --git a/src/main/java/com/gg/server/domain/rank/dto/RankDto.java b/src/main/java/com/gg/server/domain/rank/dto/RankDto.java index 462146611..a52dd8cf5 100644 --- a/src/main/java/com/gg/server/domain/rank/dto/RankDto.java +++ b/src/main/java/com/gg/server/domain/rank/dto/RankDto.java @@ -19,14 +19,14 @@ public class RankDto { private String textColor; - public static RankDto from(RankRedis rankRedis, int rank, String textColor) { + public static RankDto from(RankRedis rankRedis, int rank) { RankDto dto = RankDto.builder() .intraId(rankRedis.getIntraId()) .rank(rank) .ppp(rankRedis.getPpp()) .statusMessage(rankRedis.getStatusMessage()) .tierImageUri(rankRedis.getTierImageUrl()) - .textColor(textColor) + .textColor(rankRedis.getTextColor()) .build(); return dto; } diff --git a/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java b/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java index f2a6724cd..8e994e599 100644 --- a/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java +++ b/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java @@ -21,6 +21,7 @@ public class RankRedis implements Serializable { private int losses; private String statusMessage; private String tierImageUrl; + private String textColor; public void updateRank(int changePpp, int wins, int losses) { this.ppp += changePpp; @@ -51,6 +52,7 @@ public static RankRedis from(UserDto user, Integer ppp, String tierImageUrl) { .losses(0) .statusMessage("") .tierImageUrl(tierImageUrl) + .textColor(user.getTextColor()) .build(); return rankRedis; } @@ -64,6 +66,7 @@ public static RankRedis from(Rank rank) { .losses(rank.getLosses()) .statusMessage(rank.getStatusMessage()) .tierImageUrl(rank.getTier().getImageUri()) + .textColor(rank.getUser().getTextColor()) .build(); return rankRedis; } @@ -78,6 +81,7 @@ public String toString() { ", losses=" + losses + ", statusMessage='" + statusMessage + '\'' + ", tierImageUrl='" + tierImageUrl + '\'' + + ", textColor='" + textColor + '\'' + '}'; } } diff --git a/src/main/java/com/gg/server/domain/rank/service/RankService.java b/src/main/java/com/gg/server/domain/rank/service/RankService.java index 779ea5be3..a51309c6a 100644 --- a/src/main/java/com/gg/server/domain/rank/service/RankService.java +++ b/src/main/java/com/gg/server/domain/rank/service/RankService.java @@ -1,5 +1,6 @@ package com.gg.server.domain.rank.service; +import com.gg.server.domain.rank.data.Rank; import com.gg.server.domain.rank.dto.ExpRankDto; import com.gg.server.domain.rank.dto.ExpRankPageResponseDto; import com.gg.server.domain.rank.dto.RankDto; @@ -27,6 +28,7 @@ import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.stream.Collectors; @@ -57,7 +59,7 @@ public ExpRankPageResponseDto getExpRankPage(PageRequest pageRequest, UserDto cu for(int i = 0; i < ranks.size(); i++) { RankRedis rank = ranks.get(i); User user = users.getContent().get(i); - expRankDtos.add(ExpRankDto.from(user, startRank + i, rank.getStatusMessage(), user.getTextColor())); + expRankDtos.add(ExpRankDto.from(user, startRank + i, rank.getStatusMessage())); } return new ExpRankPageResponseDto(myRank.intValue(), pageRequest.getPageNumber() + 1, users.getTotalPages(), expRankDtos); @@ -113,12 +115,11 @@ private List createRankList(int startRank, int endRank, Season season) String hashKey = RedisKeyManager.getHashKey(season.getId()); List userIds = redisRepository.getUserIdsByRangeFromZSet(zSetKey, startRank, endRank); - List userRanks = redisRepository.findRanksByUserIds(hashKey, userIds); + ListuserRanks = redisRepository.findRanksByUserIds(hashKey, userIds); List rankList = new ArrayList<>(); - for (int i = 0; i < userRanks.size(); i++) { - User user = userRepository.findById(userRanks.get(i).getUserId()).orElseThrow(UserNotFoundException::new); - rankList.add(RankDto.from(userRanks.get(i), ++startRank, user.getTextColor())); + for (RankRedis userRank : userRanks) { + rankList.add(RankDto.from(userRank, ++startRank)); } return rankList; } diff --git a/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java b/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java index 7ccab1101..78dcb285a 100644 --- a/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java +++ b/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java @@ -59,7 +59,7 @@ public User createGuestUser() { public RankRedis addUsertoRankRedis(Long userId, Integer ppp, Long seasonId) { String randomId = UUID.randomUUID().toString(); - RankRedis rankRedis = new RankRedis(userId, randomId, ppp, 0, 0,"test", "aa"); + RankRedis rankRedis = new RankRedis(userId, randomId, ppp, 0, 0,"test", "aa", "aa"); rankRedisRepository.addRankData(RedisKeyManager.getHashKey(seasonId), userId, rankRedis); rankRedisRepository.addToZSet(RedisKeyManager.getZSetKey(seasonId), userId, ppp); return rankRedis; diff --git a/src/test/java/com/gg/server/domain/rank/redis/RankRedisRepositoryTest.java b/src/test/java/com/gg/server/domain/rank/redis/RankRedisRepositoryTest.java index 7e502f811..9d8803c84 100644 --- a/src/test/java/com/gg/server/domain/rank/redis/RankRedisRepositoryTest.java +++ b/src/test/java/com/gg/server/domain/rank/redis/RankRedisRepositoryTest.java @@ -157,7 +157,7 @@ public void rankCreateSearch () throws Exception int win = 3; int lose = 4; String statusMessage = "statusMessage"; - RankRedis ranking = new RankRedis(userId, "aa", ppp, win, lose, statusMessage, "aa"); + RankRedis ranking = new RankRedis(userId, "aa", ppp, win, lose, statusMessage, "aa", "aa"); //when redisRepository.addRankData(hashKey, userId, ranking); @@ -181,7 +181,7 @@ public void updateRank () throws Exception int win = 3; int lose = 4; String statusMessage = "statusMessage"; - RankRedis ranking = new RankRedis(userId, "aa", ppp, win, lose, statusMessage, "aa"); + RankRedis ranking = new RankRedis(userId, "aa", ppp, win, lose, statusMessage, "aa", "aa"); redisRepository.addRankData(hashKey, userId, ranking); //when @@ -189,7 +189,7 @@ public void updateRank () throws Exception int newWin = 4; int newLose = 5; String newStatusMessage = "newStatusMessage"; - RankRedis newRanking = new RankRedis(userId, "aa", newPpp, newWin, newLose, newStatusMessage, "aa"); + RankRedis newRanking = new RankRedis(userId, "aa", newPpp, newWin, newLose, newStatusMessage, "aa", "aa"); redisRepository.updateRankData(hashKey, userId, newRanking); //then @@ -211,7 +211,7 @@ public void deleteUserRank () throws Exception int win = 3; int lose = 4; String statusMessage = "statusMessage"; - RankRedis ranking = new RankRedis(userId, "aa", ppp, win, lose, statusMessage, "aa"); + RankRedis ranking = new RankRedis(userId, "aa", ppp, win, lose, statusMessage, "aa", "aa"); redisRepository.addRankData(hashKey, userId, ranking); //when @@ -234,10 +234,10 @@ void findRanksByUserIds() { int ppp3 = 300; int ppp4 = 400; - RankRedis rank1 = new RankRedis(userId, "aa", ppp, 0, 0, "statusMessage", "aa"); - RankRedis rank2 = new RankRedis(userId2,"aa", ppp2, 0, 0, "statusMessage", "aa"); - RankRedis rank3 = new RankRedis(userId3, "aa", ppp3, 0, 0, "statusMessage", "aa"); - RankRedis rank4 = new RankRedis(userId4, "aa", ppp4, 0, 0, "statusMessage", "aa"); + RankRedis rank1 = new RankRedis(userId, "aa", ppp, 0, 0, "statusMessage", "aa", "aa"); + RankRedis rank2 = new RankRedis(userId2,"aa", ppp2, 0, 0, "statusMessage", "aa", "aa"); + RankRedis rank3 = new RankRedis(userId3, "aa", ppp3, 0, 0, "statusMessage", "aa", "aa"); + RankRedis rank4 = new RankRedis(userId4, "aa", ppp4, 0, 0, "statusMessage", "aa", "aa"); redisRepository.addRankData(hashKey, userId, rank1); redisRepository.addRankData(hashKey, userId2, rank2); redisRepository.addRankData(hashKey, userId3, rank3); diff --git a/src/test/java/com/gg/server/utils/TestDataUtils.java b/src/test/java/com/gg/server/utils/TestDataUtils.java index 17d46a665..db4648cbc 100644 --- a/src/test/java/com/gg/server/utils/TestDataUtils.java +++ b/src/test/java/com/gg/server/utils/TestDataUtils.java @@ -185,7 +185,7 @@ public void createUserRank(User newUser, String statusMessage, Season season) { String zSetKey = RedisKeyManager.getZSetKey(season.getId()); String hashKey = RedisKeyManager.getHashKey(season.getId()); redisRepository.addRankData(hashKey, newUser.getId(), - new RankRedis(newUser.getId(), "aa", season.getStartPpp(), 0, 0, statusMessage, "aa")); + new RankRedis(newUser.getId(), "aa", season.getStartPpp(), 0, 0, statusMessage, "aa", "aa")); Rank userRank = Rank.builder() .user(newUser) .season(season) @@ -203,7 +203,7 @@ public void createUserRank(User newUser, String statusMessage, Season season, Ti String zSetKey = RedisKeyManager.getZSetKey(season.getId()); String hashKey = RedisKeyManager.getHashKey(season.getId()); redisRepository.addRankData(hashKey, newUser.getId(), - new RankRedis(newUser.getId(), "aa", season.getStartPpp(), 0, 0, statusMessage, "aa")); + new RankRedis(newUser.getId(), "aa", season.getStartPpp(), 0, 0, statusMessage, "aa", "aa")); Rank userRank = Rank.builder() .user(newUser) .season(season) @@ -222,7 +222,7 @@ public void createUserRank(User newUser, String statusMessage, Season season, in Tier tier = tierRepository.getById(1L); redisRepository.addToZSet(zSetKey, newUser.getId(), ppp); redisRepository.addRankData(hashKey, newUser.getId(), - new RankRedis(newUser.getId(), "aa", ppp, 1, 0, statusMessage, "aa")); + new RankRedis(newUser.getId(), "aa", ppp, 1, 0, statusMessage, "aa", "aa")); Rank userRank = Rank.builder() .user(newUser) .season(season) From 3b1ce4910905f8f9dab28463a3247dbade93857e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Fri, 15 Sep 2023 14:18:52 +0900 Subject: [PATCH 207/273] =?UTF-8?q?[REFACTOR]=20GGBE4-71=20=EC=95=84?= =?UTF-8?q?=EC=9D=B4=ED=85=9C=20=EC=83=81=ED=83=9C,=EA=B6=8C=ED=95=9C,?= =?UTF-8?q?=ED=83=80=EC=9E=85=20=EC=B2=B4=ED=81=AC=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EB=B3=91=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/item/service/ItemService.java | 34 +++++++--- .../megaphone/service/MegaphoneService.java | 33 +++------- .../domain/user/service/UserService.java | 64 +++++++------------ 3 files changed, 58 insertions(+), 73 deletions(-) diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index 8c51d73d2..93297bdf3 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -9,9 +9,12 @@ import com.gg.server.domain.item.dto.UserItemListResponseDto; import com.gg.server.domain.item.dto.UserItemResponseDto; import com.gg.server.domain.item.exception.*; +import com.gg.server.domain.item.type.ItemType; import com.gg.server.domain.noti.service.NotiService; import com.gg.server.domain.receipt.data.Receipt; import com.gg.server.domain.receipt.data.ReceiptRepository; +import com.gg.server.domain.receipt.exception.ItemStatusException; +import com.gg.server.domain.receipt.exception.ReceiptNotOwnerException; import com.gg.server.domain.receipt.type.ItemStatus; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; @@ -50,11 +53,10 @@ public ItemStoreListResponseDto getAllItems() { @Transactional public void purchaseItem(Long itemId, UserDto userDto) { Item item = itemRepository.findById(itemId) - .orElseThrow( ()-> { + .orElseThrow(() -> { throw new ItemNotFoundException(); }); - if (!item.getIsVisible()) - { + if (!item.getIsVisible()) { throw new ItemNotPurchasableException(); } @@ -62,8 +64,7 @@ public void purchaseItem(Long itemId, UserDto userDto) { Integer finalPrice; if (item.getDiscount() != null && item.getDiscount() > 0) { finalPrice = item.getPrice() - (item.getPrice() * item.getDiscount() / 100); - } - else { + } else { finalPrice = item.getPrice(); } @@ -77,7 +78,7 @@ public void purchaseItem(Long itemId, UserDto userDto) { @Transactional public void giftItem(Long itemId, String ownerId, UserDto userDto) { Item item = itemRepository.findById(itemId) - .orElseThrow( ()-> { + .orElseThrow(() -> { throw new ItemNotFoundException(); }); if (!item.getIsVisible()) { @@ -88,8 +89,7 @@ public void giftItem(Long itemId, String ownerId, UserDto userDto) { Integer finalPrice; if (item.getDiscount() != null && item.getDiscount() > 0) { finalPrice = item.getPrice() - (item.getPrice() * item.getDiscount() / 100); - } - else { + } else { finalPrice = item.getPrice(); } @@ -121,4 +121,22 @@ public UserItemListResponseDto getItemByUser(UserDto userDto, Pageable pageable) Page responseDtos = receipts.map(UserItemResponseDto::new); return new UserItemListResponseDto(responseDtos.getContent(), responseDtos.getTotalPages()); } + + public void checkItemOwner(User loginUser, Receipt receipt) { + if (!receipt.getOwnerIntraId().equals(loginUser.getIntraId())) + throw new ReceiptNotOwnerException(); + } + + public void checkItemType(Receipt receipt, ItemType itemType) { + if (!receipt.getItem().getType().equals(itemType)) + throw new ItemTypeException(); + } + + public void checkItemStatus(Receipt receipt) { + if (receipt.getItem().getType().equals(ItemType.MEGAPHONE)) { + if (!(receipt.getStatus().equals(ItemStatus.WAITING) || receipt.getStatus().equals(ItemStatus.USING))) throw new ItemStatusException(); + } else { + if (!receipt.getStatus().equals(ItemStatus.BEFORE)) throw new ItemStatusException(); + } + } } diff --git a/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java b/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java index 744f5c229..4249e2b18 100644 --- a/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java +++ b/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java @@ -1,6 +1,6 @@ package com.gg.server.domain.megaphone.service; -import com.gg.server.domain.item.exception.ItemTypeException; +import com.gg.server.domain.item.service.ItemService; import com.gg.server.domain.item.type.ItemType; import com.gg.server.domain.megaphone.data.Megaphone; import com.gg.server.domain.megaphone.data.MegaphoneRepository; @@ -16,7 +16,6 @@ import com.gg.server.domain.receipt.data.ReceiptRepository; import com.gg.server.domain.receipt.exception.ItemStatusException; import com.gg.server.domain.receipt.exception.ReceiptNotFoundException; -import com.gg.server.domain.receipt.exception.ReceiptNotOwnerException; import com.gg.server.domain.receipt.type.ItemStatus; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; @@ -40,6 +39,7 @@ public class MegaphoneService { private final ReceiptRepository receiptRepository; private final MegaphoneRepository megaphoneRepository; private final MegaphoneRedisRepository megaphoneRedisRepository; + private final ItemService itemService; @Transactional public void useMegaphone(MegaphoneUseRequestDto megaphoneUseRequestDto, UserDto user) { @@ -48,8 +48,8 @@ public void useMegaphone(MegaphoneUseRequestDto megaphoneUseRequestDto, UserDto throw new MegaphoneTimeException(); } Receipt receipt = receiptRepository.findById(megaphoneUseRequestDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); - checkOwner(loginUser, receipt); - checkItemType(receipt); + itemService.checkItemType(receipt, ItemType.MEGAPHONE); + itemService.checkItemOwner(loginUser, receipt); if (!receipt.getStatus().equals(ItemStatus.BEFORE)) { throw new ItemStatusException(); } @@ -79,9 +79,9 @@ public void deleteMegaphone(Long megaphoneId, UserDto user) { Megaphone megaphone = megaphoneRepository.findById(megaphoneId).orElseThrow(MegaphoneNotFoundException::new); Receipt receipt = megaphone.getReceipt(); if (!user.getRoleType().equals(RoleType.ADMIN)) { - checkOwner(loginUser, receipt); + itemService.checkItemOwner(loginUser, receipt); } - checkUseStatus(receipt); + itemService.checkItemStatus(receipt); if (receipt.getStatus().equals(ItemStatus.USING)) { megaphoneRedisRepository.deleteMegaphoneById(megaphone.getId()); } @@ -91,9 +91,9 @@ public void deleteMegaphone(Long megaphoneId, UserDto user) { public MegaphoneDetailResponseDto getMegaphoneDetail(Long receiptId, UserDto user) { User loginUser = userRepository.findById(user.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + user.getId())); Receipt receipt = receiptRepository.findById(receiptId).orElseThrow(ReceiptNotFoundException::new); - checkOwner(loginUser, receipt); - checkItemType(receipt); - checkUseStatus(receipt); + itemService.checkItemType(receipt, ItemType.MEGAPHONE); + itemService.checkItemOwner(loginUser, receipt); + itemService.checkItemStatus(receipt); Megaphone megaphone = megaphoneRepository.findByReceipt(receipt).orElseThrow(MegaphoneNotFoundException::new); return new MegaphoneDetailResponseDto(megaphone); } @@ -101,19 +101,4 @@ public MegaphoneDetailResponseDto getMegaphoneDetail(Long receiptId, UserDto use public List getMegaphoneTodayList() { return megaphoneRedisRepository.getAllMegaphone().stream().map(MegaphoneTodayListResponseDto::new).collect(Collectors.toList()); } - - private void checkOwner(User loginUser, Receipt receipt) { - if (!receipt.getOwnerIntraId().equals(loginUser.getIntraId())) - throw new ReceiptNotOwnerException(); - } - - private void checkItemType(Receipt receipt) { - if (!receipt.getItem().getType().equals(ItemType.MEGAPHONE)) - throw new ItemTypeException(); - } - - private void checkUseStatus(Receipt receipt) { - if (!(receipt.getStatus().equals(ItemStatus.WAITING) || receipt.getStatus().equals(ItemStatus.USING))) - throw new ItemStatusException(); - } } diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index db81f0a27..e5bc202e7 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -1,14 +1,11 @@ package com.gg.server.domain.user.service; -import com.gg.server.domain.coin.data.CoinHistory; -import com.gg.server.domain.coin.data.CoinHistoryRepository; -import com.gg.server.domain.coin.data.CoinPolicyRepository; import com.gg.server.domain.coin.service.CoinHistoryService; import com.gg.server.domain.coin.service.UserCoinChangeService; import com.gg.server.domain.game.data.Game; import com.gg.server.domain.game.data.GameRepository; import com.gg.server.domain.game.type.StatusType; -import com.gg.server.domain.item.exception.ItemTypeException; +import com.gg.server.domain.item.service.ItemService; import com.gg.server.domain.item.type.ItemType; import com.gg.server.domain.match.data.RedisMatchUserRepository; import com.gg.server.domain.noti.data.NotiRepository; @@ -23,9 +20,7 @@ import com.gg.server.domain.rank.service.RankFindService; import com.gg.server.domain.receipt.data.Receipt; import com.gg.server.domain.receipt.data.ReceiptRepository; -import com.gg.server.domain.receipt.exception.ItemStatusException; import com.gg.server.domain.receipt.exception.ReceiptNotFoundException; -import com.gg.server.domain.receipt.exception.ReceiptNotOwnerException; import com.gg.server.domain.receipt.type.ItemStatus; import com.gg.server.domain.season.data.Season; import com.gg.server.domain.season.service.SeasonFindService; @@ -75,6 +70,7 @@ public class UserService { private final ReceiptRepository receiptRepository; private final AsyncNewUserImageUploader asyncNewUserImageUploader; private final UserImageRepository userImageRepository; + private final ItemService itemService; /** * @param intraId @@ -284,29 +280,30 @@ public UserNormalDetailResponseDto getUserNormalDetail(UserDto user) { public void updateTextColor(Long userId, UserTextColorDto textColorDto) { String textColor = textColorDto.getTextColor(); Receipt receipt = receiptRepository.findById(textColorDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); - User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new); + User loginUser = userRepository.findById(userId).orElseThrow(UserNotFoundException::new); if (!UserTextColorCheckService.check(textColor)) throw new UserTextColorException(); - checkOwner(user, receipt); - checkItemType(receipt, ItemType.TEXT_COLOR); - checkUseStatus(receipt); - user.updateTextColor(textColor); + itemService.checkItemType(receipt, ItemType.TEXT_COLOR); + itemService.checkItemOwner(loginUser, receipt); + itemService.checkItemStatus(receipt); + + loginUser.updateTextColor(textColor); receipt.updateStatus(ItemStatus.USED); } @Transactional public String updateEdge(UserDto user, UserEdgeDto userEdgeDto) { - User userId = userRepository.findById(user.getId()).orElseThrow(UserNotFoundException::new); + User loginUser = userRepository.findById(user.getId()).orElseThrow(UserNotFoundException::new); EdgeType edgeType = EdgeType.getRandomEdgeType(); Receipt receipt = receiptRepository.findById(userEdgeDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); - checkOwner(userId, receipt); - checkItemType(receipt, ItemType.EDGE); - checkUseStatus(receipt); + itemService.checkItemType(receipt, ItemType.EDGE); + itemService.checkItemOwner(loginUser, receipt); + itemService.checkItemStatus(receipt); - userId.updateEdge(edgeType); + loginUser.updateEdge(edgeType); receipt.updateStatus(ItemStatus.USED); return edgeType.toString(); @@ -314,15 +311,15 @@ public String updateEdge(UserDto user, UserEdgeDto userEdgeDto) { @Transactional public String updateBackground(UserDto user, UserBackgroundDto userBackgroundDto) { - User userId = userRepository.findById(user.getId()).orElseThrow(UserNotFoundException::new); + User loginUser = userRepository.findById(user.getId()).orElseThrow(UserNotFoundException::new); BackgroundType backgroundType = BackgroundType.getRandomBackgroundType(); Receipt receipt = receiptRepository.findById(userBackgroundDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); - checkOwner(userId, receipt); - checkItemType(receipt, ItemType.BACKGROUND); - checkUseStatus(receipt); + itemService.checkItemType(receipt, ItemType.BACKGROUND); + itemService.checkItemOwner(loginUser, receipt); + itemService.checkItemStatus(receipt); - userId.updateBackground(backgroundType); + loginUser.updateBackground(backgroundType); receipt.updateStatus(ItemStatus.USED); return backgroundType.toString(); @@ -330,12 +327,12 @@ public String updateBackground(UserDto user, UserBackgroundDto userBackgroundDto @Transactional public void updateUserProfileImage(UserDto user, UserProfileImageRequestDto userProfileImageRequestDto, MultipartFile userImageFile) throws IOException { - User userId = userRepository.findById(user.getId()).orElseThrow(UserNotFoundException::new); + User loginUser = userRepository.findById(user.getId()).orElseThrow(UserNotFoundException::new); Receipt receipt = receiptRepository.findById(userProfileImageRequestDto.getReceiptId()).orElseThrow(ReceiptNotFoundException::new); - checkOwner(userId, receipt); - checkItemType(receipt, ItemType.PROFILE_IMAGE); - checkUseStatus(receipt); + itemService.checkItemType(receipt, ItemType.PROFILE_IMAGE); + itemService.checkItemOwner(loginUser, receipt); + itemService.checkItemStatus(receipt); if (userImageFile == null) throw new UserImageNullException(); @@ -345,24 +342,9 @@ public void updateUserProfileImage(UserDto user, UserProfileImageRequestDto user throw new UserImageTypeException(); } - UserImage userImage = userImageRepository.findTopByUserAndIsCurrentIsTrueOrderByIdDesc(userId).orElseThrow(null); + UserImage userImage = userImageRepository.findTopByUserAndIsCurrentIsTrueOrderByIdDesc(loginUser).orElseThrow(null); userImage.updateIsCurrent(false); asyncNewUserImageUploader.update(user.getIntraId(), userImageFile); receipt.updateStatus(ItemStatus.USED); } - - public void checkOwner(User loginUser, Receipt receipt) { - if (!receipt.getOwnerIntraId().equals(loginUser.getIntraId())) - throw new ReceiptNotOwnerException(); - } - - public void checkItemType(Receipt receipt, ItemType itemType) { - if (!receipt.getItem().getType().equals(itemType)) - throw new ItemTypeException(); - } - - public void checkUseStatus(Receipt receipt) { - if (!receipt.getStatus().equals(ItemStatus.BEFORE)) - throw new ItemStatusException(); - } } From e9e041dfb46e9148b8ed91e228c840233c82e167 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Fri, 15 Sep 2023 14:23:41 +0900 Subject: [PATCH 208/273] =?UTF-8?q?[REFACTOR]=20GGBE4-71=20=EC=9D=91?= =?UTF-8?q?=EB=8B=B5=20=ED=98=95=ED=83=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../megaphone/controller/MegaphoneAdminController.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gg/server/admin/megaphone/controller/MegaphoneAdminController.java b/src/main/java/com/gg/server/admin/megaphone/controller/MegaphoneAdminController.java index 41bbca3ee..2986447f9 100644 --- a/src/main/java/com/gg/server/admin/megaphone/controller/MegaphoneAdminController.java +++ b/src/main/java/com/gg/server/admin/megaphone/controller/MegaphoneAdminController.java @@ -7,7 +7,6 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -19,13 +18,13 @@ public class MegaphoneAdminController { private final MegaphoneAdminService megaphoneAdminService; @GetMapping("/history") - public ResponseEntity getMegaphoneHistory(@ModelAttribute @Valid PageRequestDto pageRequestDto, - @RequestParam(required = false) String intraId) { + public MegaphoneHistoryResponseDto getMegaphoneHistory(@ModelAttribute @Valid PageRequestDto pageRequestDto, + @RequestParam(required = false) String intraId) { Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, pageRequestDto.getSize(), Sort.by("id").descending()); if (intraId == null) - return ResponseEntity.ok(megaphoneAdminService.getMegaphoneHistory(pageable)); - return ResponseEntity.ok(megaphoneAdminService.getMegaphoneHistoryByIntraId(intraId, pageable)); + return megaphoneAdminService.getMegaphoneHistory(pageable); + return megaphoneAdminService.getMegaphoneHistoryByIntraId(intraId, pageable); } } From ec8e4b5f7b843e89bbc95549d4dca0e391a572e7 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Fri, 15 Sep 2023 14:24:37 +0900 Subject: [PATCH 209/273] =?UTF-8?q?[REFACTOR]=20Response=20Entity=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/controller/UserAdminController.java | 38 +++++++------------ .../user/controller/UserController.java | 21 +++++----- 2 files changed, 24 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java index 1b9522ac6..69a870aff 100644 --- a/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java +++ b/src/main/java/com/gg/server/admin/user/controller/UserAdminController.java @@ -2,17 +2,13 @@ import com.gg.server.admin.user.dto.*; import com.gg.server.admin.user.service.UserAdminService; -import com.gg.server.domain.rank.exception.RankUpdateException; -import com.gg.server.domain.user.dto.UserImageResponseDto; import com.gg.server.domain.user.exception.UserImageLargeException; import com.gg.server.domain.user.exception.UserImageTypeException; import com.gg.server.global.dto.PageRequestDto; import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -58,61 +54,55 @@ public ResponseEntity userUpdateDetail(@PathVariable String intraId, } userAdminService.updateUserDetail(intraId, updateUserInfo, imgData); - return new ResponseEntity(HttpStatus.NO_CONTENT); + return ResponseEntity.noContent().build(); } @DeleteMapping("/images/{intraId}") public ResponseEntity deleteUserProfileImage(@PathVariable String intraId) { userAdminService.deleteUserProfileImage(intraId); - return new ResponseEntity(HttpStatus.NO_CONTENT); + return ResponseEntity.noContent().build(); } @GetMapping("/delete-list") - public ResponseEntity getUserImageDeleteList(@ModelAttribute @Valid PageRequestDto pageRequestDto) { + public UserImageListAdminResponseDto getUserImageDeleteList(@ModelAttribute @Valid PageRequestDto pageRequestDto) { Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, pageRequestDto.getSize(), Sort.by("id").descending()); - return ResponseEntity.ok() - .body(userAdminService.getUserImageDeleteList(pageable)); + return userAdminService.getUserImageDeleteList(pageable); } @GetMapping("/delete-list/{intraId}") - public ResponseEntity getUserImageDeleteListByIntraId(@ModelAttribute @Valid PageRequestDto pageRequestDto, @PathVariable String intraId) { + public UserImageListAdminResponseDto getUserImageDeleteListByIntraId(@ModelAttribute @Valid PageRequestDto pageRequestDto, @PathVariable String intraId) { Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, pageRequestDto.getSize()); - return ResponseEntity.ok() - .body(userAdminService.getUserImageDeleteListByIntraId(pageable, intraId)); + return userAdminService.getUserImageDeleteListByIntraId(pageable, intraId); } @GetMapping("/images") - public ResponseEntity getUserImageList(@ModelAttribute @Valid PageRequestDto pageRequestDto) { + public UserImageListAdminResponseDto getUserImageList(@ModelAttribute @Valid PageRequestDto pageRequestDto) { Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, pageRequestDto.getSize()); - return ResponseEntity.ok() - .body(userAdminService.getUserImageList(pageable)); + return userAdminService.getUserImageList(pageable); } @GetMapping("/images/{intraId}") - public ResponseEntity getUserImage(@ModelAttribute @Valid PageRequestDto pageRequestDto, @PathVariable String intraId) { + public UserImageListAdminResponseDto getUserImage(@ModelAttribute @Valid PageRequestDto pageRequestDto, @PathVariable String intraId) { Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, pageRequestDto.getSize()); - return ResponseEntity.ok() - .body(userAdminService.getUserImageListByIntraId(pageable, intraId)); + return userAdminService.getUserImageListByIntraId(pageable, intraId); } @GetMapping("/images/current") - public ResponseEntity getUserImageCurrent(@ModelAttribute @Valid PageRequestDto pageRequestDto) { + public UserImageListAdminResponseDto getUserImageCurrent(@ModelAttribute @Valid PageRequestDto pageRequestDto) { Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, pageRequestDto.getSize()); - return ResponseEntity.ok() - .body(userAdminService.getUserImageCurrent(pageable)); + return userAdminService.getUserImageCurrent(pageable); } @GetMapping("/images/current/{intraId}") - public ResponseEntity getUserImageCurrentByIntraId(@ModelAttribute @Valid PageRequestDto pageRequestDto, @PathVariable String intraId) { + public UserImageListAdminResponseDto getUserImageCurrentByIntraId(@ModelAttribute @Valid PageRequestDto pageRequestDto, @PathVariable String intraId) { Pageable pageable = PageRequest.of(pageRequestDto.getPage() - 1, pageRequestDto.getSize()); - return ResponseEntity.ok() - .body(userAdminService.getUserImageCurrentByIntraId(pageable, intraId)); + return userAdminService.getUserImageCurrentByIntraId(pageable, intraId); } } diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index 7b945e71d..05c864af8 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -77,11 +77,11 @@ public UserHistoryResponseDto getUserHistory(@PathVariable String intraId, @Requ public ResponseEntity doModifyUser (@Valid @RequestBody UserModifyRequestDto userModifyRequestDto, @PathVariable String intraId, @Parameter(hidden = true) @Login UserDto loginUser) { if (!loginUser.getIntraId().equals(intraId)) { - return new ResponseEntity(HttpStatus.FORBIDDEN); + return ResponseEntity.status(HttpStatus.FORBIDDEN).build(); } userService.updateUser(userModifyRequestDto.getRacketType(), userModifyRequestDto.getStatusMessage(), userModifyRequestDto.getSnsNotiOpt(), intraId); - return new ResponseEntity(HttpStatus.NO_CONTENT); + return ResponseEntity.noContent().build(); } @PostMapping("/logout") @@ -118,7 +118,7 @@ public UserImageResponseDto getUserImage(@RequestParam(required = false) Long se @PatchMapping("/text-color") public ResponseEntity updateTextColor(@RequestBody @Valid UserTextColorDto textColorDto, @Parameter(hidden = true) @Login UserDto user) { userService.updateTextColor(user.getId() ,textColorDto); - return new ResponseEntity(HttpStatus.NO_CONTENT); + return ResponseEntity.noContent().build(); } @PostMapping("/attendance") @@ -127,9 +127,9 @@ public UserAttendanceResponseDto attendUser(@Parameter(hidden = true) @Login Use } @PatchMapping("/edge") - public ResponseEntity updateEdge(@RequestBody @Valid UserEdgeDto userEdgeDto, @Parameter(hidden = true) @Login UserDto user) { + public String updateEdge(@RequestBody @Valid UserEdgeDto userEdgeDto, @Parameter(hidden = true) @Login UserDto user) { String edge = userService.updateEdge(user, userEdgeDto); - return new ResponseEntity(HttpStatus.NO_CONTENT).ok().body("{\"edge\": " + "\"" + edge + "\"" +"}"); + return "{\"edge\": " + "\"" + edge + "\"" +"}"; } @GetMapping("/coin") @@ -138,17 +138,16 @@ public UserCoinResponseDto getUserCoin(@Parameter(hidden = true) @Login UserDto } @PatchMapping("/background") - public ResponseEntity updateBackground(@RequestBody @Valid UserBackgroundDto userBackgroundDto, @Parameter(hidden = true) @Login UserDto user) { + public String updateBackground(@RequestBody @Valid UserBackgroundDto userBackgroundDto, @Parameter(hidden = true) @Login UserDto user) { String background = userService.updateBackground(user, userBackgroundDto); - return new ResponseEntity(HttpStatus.NO_CONTENT).ok().body("{\"background\": " + "\"" + background + "\"" +"}"); + return "{\"background\": " + "\"" + background + "\"" +"}"; } @GetMapping("/coinhistory") - public ResponseEntity getUserCoinHistory(@ModelAttribute @Valid PageRequestDto coReq, @Parameter(hidden = true) @Login UserDto user) { + public UserCoinHistoryListResponseDto getUserCoinHistory(@ModelAttribute @Valid PageRequestDto coReq, @Parameter(hidden = true) @Login UserDto user) { Pageable pageable = PageRequest.of(coReq.getPage() - 1, coReq.getSize(), Sort.by("createdAt").descending()); - return ResponseEntity.ok() - .body(userCoinService.getUserCoinHistory(pageable ,user.getIntraId())); + return userCoinService.getUserCoinHistory(pageable ,user.getIntraId()); } @PostMapping(path = "/profile-image", consumes = {MediaType.MULTIPART_FORM_DATA_VALUE, MediaType.APPLICATION_JSON_VALUE}) @@ -156,6 +155,6 @@ public ResponseEntity updateUserProfileImage(@RequestPart(required = false) Mult @RequestPart @Valid UserProfileImageRequestDto userProfileImageRequestDto, @Parameter(hidden = true) @Login UserDto user) throws IOException { userService.updateUserProfileImage(user, userProfileImageRequestDto, profileImage); - return new ResponseEntity(HttpStatus.NO_CONTENT); + return ResponseEntity.noContent().build(); } } From 6f772a18552d822dd841f1ebd1fdaed9be0519da Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Fri, 15 Sep 2023 14:44:29 +0900 Subject: [PATCH 210/273] =?UTF-8?q?[CHORE]=20TestCode=20=EC=9D=B8=EC=9E=90?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/match/service/MatchTestUtils.java | 2 +- .../server/domain/rank/redis/RankRedisRepositoryTest.java | 2 +- src/test/java/com/gg/server/utils/TestDataUtils.java | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java b/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java index 78dcb285a..b5f22bc36 100644 --- a/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java +++ b/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java @@ -59,7 +59,7 @@ public User createGuestUser() { public RankRedis addUsertoRankRedis(Long userId, Integer ppp, Long seasonId) { String randomId = UUID.randomUUID().toString(); - RankRedis rankRedis = new RankRedis(userId, randomId, ppp, 0, 0,"test", "aa", "aa"); + RankRedis rankRedis = new RankRedis(userId, randomId, ppp, 0, 0,"test", "aa", "#000000"); rankRedisRepository.addRankData(RedisKeyManager.getHashKey(seasonId), userId, rankRedis); rankRedisRepository.addToZSet(RedisKeyManager.getZSetKey(seasonId), userId, ppp); return rankRedis; diff --git a/src/test/java/com/gg/server/domain/rank/redis/RankRedisRepositoryTest.java b/src/test/java/com/gg/server/domain/rank/redis/RankRedisRepositoryTest.java index 9d8803c84..1cb11b865 100644 --- a/src/test/java/com/gg/server/domain/rank/redis/RankRedisRepositoryTest.java +++ b/src/test/java/com/gg/server/domain/rank/redis/RankRedisRepositoryTest.java @@ -181,7 +181,7 @@ public void updateRank () throws Exception int win = 3; int lose = 4; String statusMessage = "statusMessage"; - RankRedis ranking = new RankRedis(userId, "aa", ppp, win, lose, statusMessage, "aa", "aa"); + RankRedis ranking = new RankRedis(userId, "aa", ppp, win, lose, statusMessage, "aa", "#000000"); redisRepository.addRankData(hashKey, userId, ranking); //when diff --git a/src/test/java/com/gg/server/utils/TestDataUtils.java b/src/test/java/com/gg/server/utils/TestDataUtils.java index db4648cbc..ff540e626 100644 --- a/src/test/java/com/gg/server/utils/TestDataUtils.java +++ b/src/test/java/com/gg/server/utils/TestDataUtils.java @@ -185,7 +185,7 @@ public void createUserRank(User newUser, String statusMessage, Season season) { String zSetKey = RedisKeyManager.getZSetKey(season.getId()); String hashKey = RedisKeyManager.getHashKey(season.getId()); redisRepository.addRankData(hashKey, newUser.getId(), - new RankRedis(newUser.getId(), "aa", season.getStartPpp(), 0, 0, statusMessage, "aa", "aa")); + new RankRedis(newUser.getId(), "aa", season.getStartPpp(), 0, 0, statusMessage, "aa", "#000000")); Rank userRank = Rank.builder() .user(newUser) .season(season) @@ -203,7 +203,7 @@ public void createUserRank(User newUser, String statusMessage, Season season, Ti String zSetKey = RedisKeyManager.getZSetKey(season.getId()); String hashKey = RedisKeyManager.getHashKey(season.getId()); redisRepository.addRankData(hashKey, newUser.getId(), - new RankRedis(newUser.getId(), "aa", season.getStartPpp(), 0, 0, statusMessage, "aa", "aa")); + new RankRedis(newUser.getId(), "aa", season.getStartPpp(), 0, 0, statusMessage, "aa", "#000000")); Rank userRank = Rank.builder() .user(newUser) .season(season) @@ -222,7 +222,7 @@ public void createUserRank(User newUser, String statusMessage, Season season, in Tier tier = tierRepository.getById(1L); redisRepository.addToZSet(zSetKey, newUser.getId(), ppp); redisRepository.addRankData(hashKey, newUser.getId(), - new RankRedis(newUser.getId(), "aa", ppp, 1, 0, statusMessage, "aa", "aa")); + new RankRedis(newUser.getId(), "aa", ppp, 1, 0, statusMessage, "aa", "#000000")); Rank userRank = Rank.builder() .user(newUser) .season(season) From 6696e1275f5ad0e76e03845df3e4b06978643872 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Fri, 15 Sep 2023 15:01:37 +0900 Subject: [PATCH 211/273] =?UTF-8?q?[CHORE]=20tierImage=20Test=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/match/service/MatchTestUtils.java | 2 +- .../domain/rank/redis/RankRedisRepositoryTest.java | 14 +++++++------- .../java/com/gg/server/utils/TestDataUtils.java | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java b/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java index b5f22bc36..a410355af 100644 --- a/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java +++ b/src/test/java/com/gg/server/domain/match/service/MatchTestUtils.java @@ -59,7 +59,7 @@ public User createGuestUser() { public RankRedis addUsertoRankRedis(Long userId, Integer ppp, Long seasonId) { String randomId = UUID.randomUUID().toString(); - RankRedis rankRedis = new RankRedis(userId, randomId, ppp, 0, 0,"test", "aa", "#000000"); + RankRedis rankRedis = new RankRedis(userId, randomId, ppp, 0, 0,"test", "https://42gg-public-image.s3.ap-northeast-2.amazonaws.com/images/nheo.jpeg", "#000000"); rankRedisRepository.addRankData(RedisKeyManager.getHashKey(seasonId), userId, rankRedis); rankRedisRepository.addToZSet(RedisKeyManager.getZSetKey(seasonId), userId, ppp); return rankRedis; diff --git a/src/test/java/com/gg/server/domain/rank/redis/RankRedisRepositoryTest.java b/src/test/java/com/gg/server/domain/rank/redis/RankRedisRepositoryTest.java index 1cb11b865..f09bb82a2 100644 --- a/src/test/java/com/gg/server/domain/rank/redis/RankRedisRepositoryTest.java +++ b/src/test/java/com/gg/server/domain/rank/redis/RankRedisRepositoryTest.java @@ -181,7 +181,7 @@ public void updateRank () throws Exception int win = 3; int lose = 4; String statusMessage = "statusMessage"; - RankRedis ranking = new RankRedis(userId, "aa", ppp, win, lose, statusMessage, "aa", "#000000"); + RankRedis ranking = new RankRedis(userId, "aa", ppp, win, lose, statusMessage, "https://42gg-public-image.s3.ap-northeast-2.amazonaws.com/images/nheo.jpeg", "#000000"); redisRepository.addRankData(hashKey, userId, ranking); //when @@ -189,7 +189,7 @@ public void updateRank () throws Exception int newWin = 4; int newLose = 5; String newStatusMessage = "newStatusMessage"; - RankRedis newRanking = new RankRedis(userId, "aa", newPpp, newWin, newLose, newStatusMessage, "aa", "aa"); + RankRedis newRanking = new RankRedis(userId, "aa", newPpp, newWin, newLose, newStatusMessage, "https://42gg-public-image.s3.ap-northeast-2.amazonaws.com/images/nheo.jpeg", "#000000"); redisRepository.updateRankData(hashKey, userId, newRanking); //then @@ -211,7 +211,7 @@ public void deleteUserRank () throws Exception int win = 3; int lose = 4; String statusMessage = "statusMessage"; - RankRedis ranking = new RankRedis(userId, "aa", ppp, win, lose, statusMessage, "aa", "aa"); + RankRedis ranking = new RankRedis(userId, "aa", ppp, win, lose, statusMessage, "https://42gg-public-image.s3.ap-northeast-2.amazonaws.com/images/nheo.jpeg", "#000000"); redisRepository.addRankData(hashKey, userId, ranking); //when @@ -234,10 +234,10 @@ void findRanksByUserIds() { int ppp3 = 300; int ppp4 = 400; - RankRedis rank1 = new RankRedis(userId, "aa", ppp, 0, 0, "statusMessage", "aa", "aa"); - RankRedis rank2 = new RankRedis(userId2,"aa", ppp2, 0, 0, "statusMessage", "aa", "aa"); - RankRedis rank3 = new RankRedis(userId3, "aa", ppp3, 0, 0, "statusMessage", "aa", "aa"); - RankRedis rank4 = new RankRedis(userId4, "aa", ppp4, 0, 0, "statusMessage", "aa", "aa"); + RankRedis rank1 = new RankRedis(userId, "aa", ppp, 0, 0, "statusMessage", "https://42gg-public-image.s3.ap-northeast-2.amazonaws.com/images/nheo.jpeg", "#000000"); + RankRedis rank2 = new RankRedis(userId2,"aa", ppp2, 0, 0, "statusMessage", "https://42gg-public-image.s3.ap-northeast-2.amazonaws.com/images/nheo.jpeg", "#000000"); + RankRedis rank3 = new RankRedis(userId3, "aa", ppp3, 0, 0, "statusMessage", "https://42gg-public-image.s3.ap-northeast-2.amazonaws.com/images/nheo.jpeg", "#000000"); + RankRedis rank4 = new RankRedis(userId4, "aa", ppp4, 0, 0, "statusMessage", "https://42gg-public-image.s3.ap-northeast-2.amazonaws.com/images/nheo.jpeg", "#000000"); redisRepository.addRankData(hashKey, userId, rank1); redisRepository.addRankData(hashKey, userId2, rank2); redisRepository.addRankData(hashKey, userId3, rank3); diff --git a/src/test/java/com/gg/server/utils/TestDataUtils.java b/src/test/java/com/gg/server/utils/TestDataUtils.java index ff540e626..81d926355 100644 --- a/src/test/java/com/gg/server/utils/TestDataUtils.java +++ b/src/test/java/com/gg/server/utils/TestDataUtils.java @@ -185,7 +185,7 @@ public void createUserRank(User newUser, String statusMessage, Season season) { String zSetKey = RedisKeyManager.getZSetKey(season.getId()); String hashKey = RedisKeyManager.getHashKey(season.getId()); redisRepository.addRankData(hashKey, newUser.getId(), - new RankRedis(newUser.getId(), "aa", season.getStartPpp(), 0, 0, statusMessage, "aa", "#000000")); + new RankRedis(newUser.getId(), "aa", season.getStartPpp(), 0, 0, statusMessage, "https://42gg-public-image.s3.ap-northeast-2.amazonaws.com/images/nheo.jpeg", "#000000")); Rank userRank = Rank.builder() .user(newUser) .season(season) @@ -203,7 +203,7 @@ public void createUserRank(User newUser, String statusMessage, Season season, Ti String zSetKey = RedisKeyManager.getZSetKey(season.getId()); String hashKey = RedisKeyManager.getHashKey(season.getId()); redisRepository.addRankData(hashKey, newUser.getId(), - new RankRedis(newUser.getId(), "aa", season.getStartPpp(), 0, 0, statusMessage, "aa", "#000000")); + new RankRedis(newUser.getId(), "aa", season.getStartPpp(), 0, 0, statusMessage, "https://42gg-public-image.s3.ap-northeast-2.amazonaws.com/images/nheo.jpeg", "#000000")); Rank userRank = Rank.builder() .user(newUser) .season(season) @@ -222,7 +222,7 @@ public void createUserRank(User newUser, String statusMessage, Season season, in Tier tier = tierRepository.getById(1L); redisRepository.addToZSet(zSetKey, newUser.getId(), ppp); redisRepository.addRankData(hashKey, newUser.getId(), - new RankRedis(newUser.getId(), "aa", ppp, 1, 0, statusMessage, "aa", "#000000")); + new RankRedis(newUser.getId(), "aa", ppp, 1, 0, statusMessage, "https://42gg-public-image.s3.ap-northeast-2.amazonaws.com/images/nheo.jpeg", "#000000")); Rank userRank = Rank.builder() .user(newUser) .season(season) From 92b5446b087746833a5683f4e5c955dcbba4dfee Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Fri, 15 Sep 2023 15:04:31 +0900 Subject: [PATCH 212/273] =?UTF-8?q?[CHORE]=20tierImage=20Test=20=EC=88=98?= =?UTF-8?q?=EC=A0=952?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/domain/rank/redis/RankRedisRepositoryTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/gg/server/domain/rank/redis/RankRedisRepositoryTest.java b/src/test/java/com/gg/server/domain/rank/redis/RankRedisRepositoryTest.java index f09bb82a2..0608d0be5 100644 --- a/src/test/java/com/gg/server/domain/rank/redis/RankRedisRepositoryTest.java +++ b/src/test/java/com/gg/server/domain/rank/redis/RankRedisRepositoryTest.java @@ -157,7 +157,7 @@ public void rankCreateSearch () throws Exception int win = 3; int lose = 4; String statusMessage = "statusMessage"; - RankRedis ranking = new RankRedis(userId, "aa", ppp, win, lose, statusMessage, "aa", "aa"); + RankRedis ranking = new RankRedis(userId, "aa", ppp, win, lose, statusMessage, "https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/tier/hand.svg", "#000000"); //when redisRepository.addRankData(hashKey, userId, ranking); From e6e01bc2277c8117e611766b3b8516a8257fa079 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Fri, 15 Sep 2023 15:10:42 +0900 Subject: [PATCH 213/273] [FIX] add UserImageNullException --- .../java/com/gg/server/domain/user/service/UserService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index e5bc202e7..fbd3c9d8f 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -342,7 +342,7 @@ public void updateUserProfileImage(UserDto user, UserProfileImageRequestDto user throw new UserImageTypeException(); } - UserImage userImage = userImageRepository.findTopByUserAndIsCurrentIsTrueOrderByIdDesc(loginUser).orElseThrow(null); + UserImage userImage = userImageRepository.findTopByUserAndIsCurrentIsTrueOrderByIdDesc(loginUser).orElseThrow(UserImageNullException::new); userImage.updateIsCurrent(false); asyncNewUserImageUploader.update(user.getIntraId(), userImageFile); receipt.updateStatus(ItemStatus.USED); From 9cdd04ae85ea0b6b6c440067636eeb3592561e6a Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Fri, 15 Sep 2023 15:28:42 +0900 Subject: [PATCH 214/273] [REFACTOR] change updateIsCurrent --- .../com/gg/server/admin/user/service/UserAdminService.java | 2 +- src/main/java/com/gg/server/domain/user/data/UserImage.java | 6 +++--- .../java/com/gg/server/domain/user/service/UserService.java | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java index 7a37d19e3..ca7f84e61 100644 --- a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java +++ b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java @@ -119,7 +119,7 @@ public String getUserImageToString(User user) { if (userImage == null) return "null"; else { - userImage.updateIsCurrent(true); + userImage.updateIsCurrent(); return userImage.getImageUri(); } } diff --git a/src/main/java/com/gg/server/domain/user/data/UserImage.java b/src/main/java/com/gg/server/domain/user/data/UserImage.java index 58e5d3247..8cd0bf920 100644 --- a/src/main/java/com/gg/server/domain/user/data/UserImage.java +++ b/src/main/java/com/gg/server/domain/user/data/UserImage.java @@ -45,12 +45,12 @@ public UserImage(User user, String imageUri, LocalDateTime createdAt, LocalDateT this.isCurrent = isCurrent; } - public void updateIsCurrent(Boolean isCurrent) { - this.isCurrent = isCurrent; + public void updateIsCurrent() { + this.isCurrent = !this.isCurrent; } public void updateDeletedAt(LocalDateTime deletedAt) { this.deletedAt = deletedAt; - updateIsCurrent(false); + updateIsCurrent(); } } \ No newline at end of file diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index fbd3c9d8f..1a637f85e 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -343,7 +343,7 @@ public void updateUserProfileImage(UserDto user, UserProfileImageRequestDto user } UserImage userImage = userImageRepository.findTopByUserAndIsCurrentIsTrueOrderByIdDesc(loginUser).orElseThrow(UserImageNullException::new); - userImage.updateIsCurrent(false); + userImage.updateIsCurrent(); asyncNewUserImageUploader.update(user.getIntraId(), userImageFile); receipt.updateStatus(ItemStatus.USED); } From c0b45af8117e2f1cc7d61c3e122c9e856816f6a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Fri, 15 Sep 2023 15:40:37 +0900 Subject: [PATCH 215/273] =?UTF-8?q?[REFACTOR]=20GGBE4-71=20message=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/megaphone/dto/MegaphoneUseRequestDto.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/domain/megaphone/dto/MegaphoneUseRequestDto.java b/src/main/java/com/gg/server/domain/megaphone/dto/MegaphoneUseRequestDto.java index e090a27a9..8b44b6175 100644 --- a/src/main/java/com/gg/server/domain/megaphone/dto/MegaphoneUseRequestDto.java +++ b/src/main/java/com/gg/server/domain/megaphone/dto/MegaphoneUseRequestDto.java @@ -11,8 +11,8 @@ @NoArgsConstructor @AllArgsConstructor public class MegaphoneUseRequestDto { - @NotNull + @NotNull(message = "receiptId는 null이 될 수 없습니다.") private Long receiptId; - @NotNull @Size(max = 30) + @NotNull(message = "content는 null이 될 수 없습니다.") @Size(max = 30) private String content; } From 9d28abc496d7b274b4729ed2e9b66140d6ce0900 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Fri, 15 Sep 2023 16:38:07 +0900 Subject: [PATCH 216/273] [REFACTOR} add userImageAdminRepository @Param --- .../admin/user/data/UserImageAdminRepository.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java index 555cc14ea..70edcae1e 100644 --- a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java +++ b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java @@ -1,12 +1,15 @@ package com.gg.server.admin.user.data; import com.gg.server.domain.user.data.User; +import org.springframework.data.repository.query.Param; +import org.checkerframework.checker.interning.qual.CompareToMethod; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import com.gg.server.domain.user.data.UserImage; import org.springframework.data.jpa.repository.Query; + import java.util.Optional; public interface UserImageAdminRepository extends JpaRepository{ @@ -27,14 +30,14 @@ public interface UserImageAdminRepository extends JpaRepository @Query(value = "SELECT ui FROM UserImage ui WHERE ui.id NOT IN (" + "SELECT MIN(ui.id) FROM UserImage ui GROUP BY ui.user.id" + - ") AND ui.user.id = ?1 ORDER BY ui.createdAt DESC") - Page findAllByUserOrderByCreatedAtDesc(Long userId, Pageable pageable); + ") AND ui.user.id = :user_id ORDER BY ui.createdAt DESC") + Page findAllByUserOrderByCreatedAtDesc(@Param("user_id") Long userId, Pageable pageable); @Query(value = "SELECT ui FROM UserImage ui WHERE ui.isCurrent IS TRUE" + " ORDER BY ui.createdAt DESC") Page findAllByIsCurrentTrueOrderByCreatedAtDesc(Pageable pageable); @Query(value = "SELECT ui FROM UserImage ui WHERE ui.isCurrent IS True" + - " AND ui.user.id = ?1 ORDER BY ui.createdAt DESC") - Page findAllByUserAndIsCurrentTrueOrderByCreatedAtDesc(Long userId, Pageable pageable); + " AND ui.user.id = :user_id ORDER BY ui.createdAt DESC") + Page findAllByUserAndIsCurrentTrueOrderByCreatedAtDesc(@Param("user_id") Long userId, Pageable pageable); } From ac5a034b76926eaf8404a002f525b1234c2c7441 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Fri, 15 Sep 2023 16:41:15 +0900 Subject: [PATCH 217/273] [REFACTOR] delete useless import --- .../com/gg/server/admin/user/data/UserImageAdminRepository.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java index 70edcae1e..cd369481c 100644 --- a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java +++ b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java @@ -2,7 +2,6 @@ import com.gg.server.domain.user.data.User; import org.springframework.data.repository.query.Param; -import org.checkerframework.checker.interning.qual.CompareToMethod; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; From 275b55ebba31a33226b1aad90f1d2585c729bd8c Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Fri, 15 Sep 2023 17:21:44 +0900 Subject: [PATCH 218/273] =?UTF-8?q?[CHORE]=20Top3=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=97=94=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EB=AA=85=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/user/controller/UserController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/user/controller/UserController.java b/src/main/java/com/gg/server/domain/user/controller/UserController.java index 05c864af8..b22eb73f7 100644 --- a/src/main/java/com/gg/server/domain/user/controller/UserController.java +++ b/src/main/java/com/gg/server/domain/user/controller/UserController.java @@ -105,7 +105,7 @@ public UserOauthDto getUserOauth2Information(@Parameter(hidden = true) @Login Us return new UserOauthDto(OauthType.of(user.getRoleType(), user.getKakaoId()).getCode()); } - @GetMapping("/images") + @GetMapping("/top3") public UserImageResponseDto getUserImage(@RequestParam(required = false) Long seasonId, Mode mode) { if (mode == Mode.RANK) return userService.getRankedUserImagesByPPP(seasonId); From 4392e77c7805fb8a394e96aa9aff06fdc32defa5 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Fri, 15 Sep 2023 17:29:55 +0900 Subject: [PATCH 219/273] =?UTF-8?q?[CHORE]=20tierImageUrl=EC=9D=84=20tieri?= =?UTF-8?q?mageUri=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/rank/service/RankRedisAdminService.java | 4 ++-- .../com/gg/server/domain/rank/dto/RankDto.java | 2 +- .../com/gg/server/domain/rank/redis/RankRedis.java | 14 +++++++------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gg/server/admin/rank/service/RankRedisAdminService.java b/src/main/java/com/gg/server/admin/rank/service/RankRedisAdminService.java index 5cd36c650..403aa1f2e 100644 --- a/src/main/java/com/gg/server/admin/rank/service/RankRedisAdminService.java +++ b/src/main/java/com/gg/server/admin/rank/service/RankRedisAdminService.java @@ -28,12 +28,12 @@ public void addAllUserRankByNewSeason(SeasonAdminDto seasonAdminDto) { List users = userRepository.findAll(); String redisHashKey = RedisKeyManager.getHashKey(seasonAdminDto.getSeasonId()); - String tierImageUrl = tierRepository.findAll().get(0).getImageUri(); + String tierImageUri = tierRepository.findAll().get(0).getImageUri(); users.forEach(user -> { if (user.getRoleType() != GUEST) { UserDto userDto = UserDto.from(user); - RankRedis userRank = RankRedis.from(userDto, seasonAdminDto.getStartPpp(), tierImageUrl); + RankRedis userRank = RankRedis.from(userDto, seasonAdminDto.getStartPpp(), tierImageUri); rankRedisRepository.addRankData(redisHashKey, user.getId(), userRank); } diff --git a/src/main/java/com/gg/server/domain/rank/dto/RankDto.java b/src/main/java/com/gg/server/domain/rank/dto/RankDto.java index a52dd8cf5..15fb4b42c 100644 --- a/src/main/java/com/gg/server/domain/rank/dto/RankDto.java +++ b/src/main/java/com/gg/server/domain/rank/dto/RankDto.java @@ -25,7 +25,7 @@ public static RankDto from(RankRedis rankRedis, int rank) { .rank(rank) .ppp(rankRedis.getPpp()) .statusMessage(rankRedis.getStatusMessage()) - .tierImageUri(rankRedis.getTierImageUrl()) + .tierImageUri(rankRedis.getTierImageUri()) .textColor(rankRedis.getTextColor()) .build(); return dto; diff --git a/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java b/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java index 8e994e599..e35c49939 100644 --- a/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java +++ b/src/main/java/com/gg/server/domain/rank/redis/RankRedis.java @@ -20,7 +20,7 @@ public class RankRedis implements Serializable { private int wins; private int losses; private String statusMessage; - private String tierImageUrl; + private String tierImageUri; private String textColor; public void updateRank(int changePpp, int wins, int losses) { @@ -29,8 +29,8 @@ public void updateRank(int changePpp, int wins, int losses) { this.losses = losses; } - public void updateTierImage(String tierImageUrl) { - this.tierImageUrl = tierImageUrl; + public void updateTierImage(String tierImageUri) { + this.tierImageUri = tierImageUri; } public void changedRank(int ppp, int wins, int losses) { @@ -43,7 +43,7 @@ public void setStatusMessage(String msg) { this.statusMessage = msg; } - public static RankRedis from(UserDto user, Integer ppp, String tierImageUrl) { + public static RankRedis from(UserDto user, Integer ppp, String tierImageUri) { RankRedis rankRedis = RankRedis.builder() .userId(user.getId()) .intraId(user.getIntraId()) @@ -51,7 +51,7 @@ public static RankRedis from(UserDto user, Integer ppp, String tierImageUrl) { .wins(0) .losses(0) .statusMessage("") - .tierImageUrl(tierImageUrl) + .tierImageUri(tierImageUri) .textColor(user.getTextColor()) .build(); return rankRedis; @@ -65,7 +65,7 @@ public static RankRedis from(Rank rank) { .wins(rank.getWins()) .losses(rank.getLosses()) .statusMessage(rank.getStatusMessage()) - .tierImageUrl(rank.getTier().getImageUri()) + .tierImageUri(rank.getTier().getImageUri()) .textColor(rank.getUser().getTextColor()) .build(); return rankRedis; @@ -80,7 +80,7 @@ public String toString() { ", wins=" + wins + ", losses=" + losses + ", statusMessage='" + statusMessage + '\'' + - ", tierImageUrl='" + tierImageUrl + '\'' + + ", tierImageUri='" + tierImageUri + '\'' + ", textColor='" + textColor + '\'' + '}'; } From 3459d59fe8f35e4990229395f0cb21922179738f Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Fri, 15 Sep 2023 17:33:08 +0900 Subject: [PATCH 220/273] =?UTF-8?q?[CHORE]=20JpaRepository=EC=97=90=20?= =?UTF-8?q?=EA=B8=B0=EB=B3=B8=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EC=9E=88?= =?UTF-8?q?=EB=8A=94=20findAll=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gg/server/domain/tier/data/TierRepository.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/com/gg/server/domain/tier/data/TierRepository.java b/src/main/java/com/gg/server/domain/tier/data/TierRepository.java index 0b3137595..6f7be7c02 100644 --- a/src/main/java/com/gg/server/domain/tier/data/TierRepository.java +++ b/src/main/java/com/gg/server/domain/tier/data/TierRepository.java @@ -2,11 +2,8 @@ import org.springframework.data.jpa.repository.JpaRepository; -import java.util.List; import java.util.Optional; public interface TierRepository extends JpaRepository { Optional findByName(String name); - - List findAll(); -} +} \ No newline at end of file From 789ec25575c040cded0d74615fa744137f2d9727 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Fri, 15 Sep 2023 17:36:25 +0900 Subject: [PATCH 221/273] =?UTF-8?q?[CHORE]=20private=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/admin/item/dto/ItemListResponseDto.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/admin/item/dto/ItemListResponseDto.java b/src/main/java/com/gg/server/admin/item/dto/ItemListResponseDto.java index 17c77182d..c56e7f1a1 100644 --- a/src/main/java/com/gg/server/admin/item/dto/ItemListResponseDto.java +++ b/src/main/java/com/gg/server/admin/item/dto/ItemListResponseDto.java @@ -10,6 +10,6 @@ @NoArgsConstructor @AllArgsConstructor public class ItemListResponseDto { - List historyList; - Integer totalPage; + private List historyList; + private Integer totalPage; } From 26f5a9fd49eab1afe6e0a722b7294524374d713d Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Fri, 15 Sep 2023 17:39:43 +0900 Subject: [PATCH 222/273] =?UTF-8?q?[CHORE]=20itemUpdate=20NotNull=20messag?= =?UTF-8?q?e=20=EC=9E=90=EC=84=B8=ED=9E=88=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/admin/item/dto/ItemUpdateRequestDto.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java b/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java index d6384aba1..4c454ebe7 100644 --- a/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java +++ b/src/main/java/com/gg/server/admin/item/dto/ItemUpdateRequestDto.java @@ -11,22 +11,22 @@ @NoArgsConstructor @AllArgsConstructor public class ItemUpdateRequestDto { - @NotNull(message = "plz. itemName") + @NotNull(message = "[Request] 아이템 이름은 Null 일 수 없습니다.") private String name; - @NotNull(message = "plz. mainContent") + @NotNull(message = "[Request] 주 설명은 Null 일 수 없습니다.") private String mainContent; - @NotNull(message = "plz. subContent") + @NotNull(message = "[Request] 부 설명은 Null 일 수 없습니다.") private String subContent; - @NotNull(message = "plz. price") + @NotNull(message = "[Request] 가격은 Null 일 수 없습니다.") private Integer price; - @NotNull(message = "plz. discount") + @NotNull(message = "[Request] 할인율은 Null 일 수 없습니다.") private Integer discount; - @NotNull(message = "plz. itemType") + @NotNull(message = "[Request] 아이템 타입은 Null 일 수 없습니다.") private ItemType itemType; @Override From c1fb7ef75f823e557dd6acd31a9f81e3d6721c4a Mon Sep 17 00:00:00 2001 From: AYoungSn Date: Fri, 15 Sep 2023 17:49:18 +0900 Subject: [PATCH 223/273] =?UTF-8?q?[fix]=20game=20=EC=A0=90=EC=88=98=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=20=EC=8B=9C=20synchronized=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=ED=95=B4=EA=B2=B0=20=EC=9C=84=ED=95=B4=20Lock=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/game/data/GameRepository.java | 5 +++++ .../gg/server/domain/game/service/GameFindService.java | 4 ++++ .../com/gg/server/domain/game/service/GameService.java | 8 ++++---- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gg/server/domain/game/data/GameRepository.java b/src/main/java/com/gg/server/domain/game/data/GameRepository.java index dea56d086..613742888 100644 --- a/src/main/java/com/gg/server/domain/game/data/GameRepository.java +++ b/src/main/java/com/gg/server/domain/game/data/GameRepository.java @@ -7,11 +7,13 @@ import java.util.Optional; import com.gg.server.domain.team.dto.GameUser; +import javax.persistence.LockModeType; import org.springframework.cache.annotation.Cacheable; import org.springframework.data.jpa.repository.JpaRepository; import com.gg.server.domain.game.dto.GameTeamUser; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; +import org.springframework.data.jpa.repository.Lock; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -69,4 +71,7 @@ public interface GameRepository extends JpaRepository, GameRepositor "team t, team_user tu, user u " + "WHERE g.id=t.game_id AND t.id = tu.team_id AND tu.user_id=u.id AND g.status = 'BEFORE'", nativeQuery = true) List findAllByStartTimeLessThanEqual(@Param("time") LocalDateTime time); + @Lock(LockModeType.PESSIMISTIC_WRITE) + @Query(value = "SELECT g FROM Game g WHERE g.id=:gamdId") + Optional findWithPessimisticLockById(@Param("gameId")Long gameId); } diff --git a/src/main/java/com/gg/server/domain/game/service/GameFindService.java b/src/main/java/com/gg/server/domain/game/service/GameFindService.java index 94db942ad..1b4e047dd 100644 --- a/src/main/java/com/gg/server/domain/game/service/GameFindService.java +++ b/src/main/java/com/gg/server/domain/game/service/GameFindService.java @@ -86,4 +86,8 @@ public Game findByGameId(Long gameId) { return gameRepository.findById(gameId) .orElseThrow(GameNotExistException::new); } + public Game findGameWithPessimisticLockById(Long id) { + return gameRepository.findWithPessimisticLockById(id) + .orElseThrow(GameNotExistException::new); + } } diff --git a/src/main/java/com/gg/server/domain/game/service/GameService.java b/src/main/java/com/gg/server/domain/game/service/GameService.java index d1e60bb9a..67c1c5102 100644 --- a/src/main/java/com/gg/server/domain/game/service/GameService.java +++ b/src/main/java/com/gg/server/domain/game/service/GameService.java @@ -61,9 +61,9 @@ public GameTeamInfo getUserGameInfo(Long gameId, Long userId) { @CacheEvict(value = "allGameList", allEntries = true), @CacheEvict(value = "allGameListByUser", allEntries = true) }) - public synchronized Boolean createRankResult(RankResultReqDto scoreDto, Long userId) { + public Boolean createRankResult(RankResultReqDto scoreDto, Long userId) { // 현재 게임 id - Game game = gameFindService.findByGameId(scoreDto.getGameId()); + Game game = gameFindService.findGameWithPessimisticLockById(scoreDto.getGameId()); if (game.getStatus() != StatusType.WAIT && game.getStatus() != StatusType.LIVE) { return false; } @@ -77,8 +77,8 @@ public synchronized Boolean createRankResult(RankResultReqDto scoreDto, Long use @CacheEvict(value = "allGameList", allEntries = true), @CacheEvict(value = "allGameListByUser", allEntries = true) }) - public synchronized Boolean normalExpResult(NormalResultReqDto normalResultReqDto, Long loginUserId) { - Game game = gameFindService.findByGameId(normalResultReqDto.getGameId()); + public Boolean normalExpResult(NormalResultReqDto normalResultReqDto, Long loginUserId) { + Game game = gameFindService.findGameWithPessimisticLockById(normalResultReqDto.getGameId()); List teamUsers = teamUserRepository.findAllByGameId(game.getId()); if (teamUsers.size() == 2 && (game.getStatus() == StatusType.WAIT || game.getStatus() == StatusType.LIVE)) { From edf294de42c88bbf05ea33f95720eb27958f8ee5 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Fri, 15 Sep 2023 17:51:30 +0900 Subject: [PATCH 224/273] [REFACTOR] add optional in userRepository --- .../java/com/gg/server/domain/user/data/UserRepository.java | 2 +- .../domain/coin/service/UserCoinChangeServiceTest.java | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gg/server/domain/user/data/UserRepository.java b/src/main/java/com/gg/server/domain/user/data/UserRepository.java index 225dc8d02..ffc3f96c1 100644 --- a/src/main/java/com/gg/server/domain/user/data/UserRepository.java +++ b/src/main/java/com/gg/server/domain/user/data/UserRepository.java @@ -13,7 +13,7 @@ public interface UserRepository extends JpaRepository { Optional findByIntraId(String intraId); - User getUserByIntraId(String IntraId); + Optional getUserByIntraId(String IntraId); Page findByIntraIdContains(Pageable pageable, String intraId); diff --git a/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java b/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java index a0b114460..a4d14ba9e 100644 --- a/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java +++ b/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java @@ -9,6 +9,7 @@ import com.gg.server.domain.item.type.ItemType; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; import com.gg.server.utils.TestDataUtils; import lombok.RequiredArgsConstructor; @@ -19,6 +20,7 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; +import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.*; @@ -144,7 +146,7 @@ void addNormalGameService() { @Test @DisplayName("랭크 게임 승리 재화 증가 서비스 테스트") void addRankWinGameService() { - User user = userRepository.getUserByIntraId("cheolee"); + User user = userRepository.getUserByIntraId("cheolee").orElseThrow(UserNotFoundException::new); UserGameCoinResultDto userGameCoinResultDto = userCoinChangeService.addRankGameCoin(3606L, user.getId());//본인의 게임Id와 id 값 @@ -156,7 +158,7 @@ void addRankWinGameService() { @Test @DisplayName("랭크 게임 패배 재화 증가 서비스 테스트") void addRankLoseGameService() { - User user = userRepository.getUserByIntraId("cheolee"); + User user = userRepository.getUserByIntraId("cheolee").orElseThrow(UserNotFoundException::new); UserGameCoinResultDto userGameCoinResultDto = userCoinChangeService.addRankGameCoin(3689L, user.getId()); From 83d9c31f7c72d4316409524481fdcb9742eabb5c Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Fri, 15 Sep 2023 17:59:34 +0900 Subject: [PATCH 225/273] =?UTF-8?q?[REFACTOR]=20=EC=A4=91=EB=B3=B5?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=EC=BD=94=EB=93=9C=20setVisibility=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/item/service/ItemAdminService.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java index e2f3167d7..d7130faf7 100644 --- a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java +++ b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java @@ -32,8 +32,8 @@ public ItemListResponseDto getAllItemHistory(Pageable pageable) { return new ItemListResponseDto(responseDtos.getContent(), responseDtos.getTotalPages()); } + // 아이템 수정 시 신규 이미지가 존재하는 경우 @Transactional - //TODO 삭제된 경우 에러처리 public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, MultipartFile itemImageFile, UserDto user) throws IOException { Item item = itemAdminRepository.findById(itemId).orElseThrow(() -> new ItemNotFoundException()); @@ -48,6 +48,7 @@ public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, itemAdminRepository.save(newItem); } + // 아이템 수정 시 신규 이미지가 존재하지 않는 경우 @Transactional public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, UserDto user) { @@ -55,8 +56,7 @@ public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, if (item.getIsVisible() == false) { throw new ItemNotAvailableException(); } - item.setIsVisible(false); - item.setDeleterIntraId(user.getIntraId()); + setVisibility(item, user.getIntraId()); Item newItem = new Item(itemUpdateRequestDto, user.getIntraId(), item.getImageUri()); itemAdminRepository.save(newItem); } @@ -64,7 +64,11 @@ public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, @Transactional public void deleteItem(Long itemId, UserDto user) { Item item = itemAdminRepository.findById(itemId).orElseThrow(() -> new ItemNotFoundException()); - item.setIsVisible(false); - item.setDeleterIntraId(user.getIntraId()); + setVisibility(item, user.getIntraId()); + } + + public void setVisibility(Item item, String intraId) { + item.setIsVisible(true); + item.setDeleterIntraId(intraId); } } From 17de755fbade9a98af2906712bd7abd82e332cde Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Fri, 15 Sep 2023 18:11:54 +0900 Subject: [PATCH 226/273] =?UTF-8?q?[FEAT]=20=ED=8B=B0=EC=96=B4=20NotFoundE?= =?UTF-8?q?xception=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=ED=98=B8?= =?UTF-8?q?=EC=B6=9C=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/match/service/MatchFindService.java | 3 ++- .../domain/tier/exception/TierNotFoundException.java | 11 +++++++++++ .../com/gg/server/global/exception/ErrorCode.java | 3 +++ 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/gg/server/domain/tier/exception/TierNotFoundException.java diff --git a/src/main/java/com/gg/server/domain/match/service/MatchFindService.java b/src/main/java/com/gg/server/domain/match/service/MatchFindService.java index 070060cd7..ccaad754d 100644 --- a/src/main/java/com/gg/server/domain/match/service/MatchFindService.java +++ b/src/main/java/com/gg/server/domain/match/service/MatchFindService.java @@ -22,6 +22,7 @@ import com.gg.server.domain.slotmanagement.data.SlotManagementRepository; import com.gg.server.domain.tier.data.Tier; import com.gg.server.domain.tier.data.TierRepository; +import com.gg.server.domain.tier.exception.TierNotFoundException; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; @@ -73,7 +74,7 @@ public SlotStatusResponseListDto getAllMatchStatus(UserDto userDto, Option optio SlotManagement slotManagement = slotManagementRepository.findCurrent(LocalDateTime.now()) .orElseThrow(SlotNotFoundException::new); Season season = seasonFindService.findCurrentSeason(LocalDateTime.now()); - Tier tier = tierRepository.findAll().get(0); + Tier tier = tierRepository.findById(1L).orElseThrow(TierNotFoundException::new); RankRedis user; if (userDto.getRoleType().equals(RoleType.GUEST)) { user = RankRedis.from(userDto, season.getStartPpp(), tier.getImageUri()); diff --git a/src/main/java/com/gg/server/domain/tier/exception/TierNotFoundException.java b/src/main/java/com/gg/server/domain/tier/exception/TierNotFoundException.java new file mode 100644 index 000000000..fe13c392b --- /dev/null +++ b/src/main/java/com/gg/server/domain/tier/exception/TierNotFoundException.java @@ -0,0 +1,11 @@ +package com.gg.server.domain.tier.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.NotExistException; + +public class TierNotFoundException extends NotExistException { + public TierNotFoundException() { + super("해당 티어가 존재하지 않습니다.", ErrorCode.TIER_NOT_FOUND); + } + +} diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index ab23b5e02..8d781cfae 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -38,6 +38,9 @@ public enum ErrorCode { REDIS_RANK_NOT_FOUND(404, "RK101", "REDIS RANK NOT FOUND"), RANK_UPDATE_FAIL(400, "RK200", "RANK UPDATE FAIL"), + //tier + TIER_NOT_FOUND(404, "TR100", "TIER NOT FOUND"), + //item ITEM_NOT_FOUND(404, "IT100", "ITEM NOT FOUND"), ITEM_TYPE_NOT_MATCHED(400, "IT200", "ITEM TYPE NOT MATCHED"), From 945df6de29428b60f359db47fcb21fa376cdea0d Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Fri, 15 Sep 2023 18:14:28 +0900 Subject: [PATCH 227/273] =?UTF-8?q?[CHORE]=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20transactional=20=EC=96=B4=EB=85=B8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gg/server/domain/game/service/GameService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/game/service/GameService.java b/src/main/java/com/gg/server/domain/game/service/GameService.java index d1e60bb9a..7d0b067f8 100644 --- a/src/main/java/com/gg/server/domain/game/service/GameService.java +++ b/src/main/java/com/gg/server/domain/game/service/GameService.java @@ -172,7 +172,6 @@ private TeamUser findTeamId(Long teamId, List teamUsers) { throw new TeamIdNotMatchException(); } - @Transactional public Boolean updateScore(Game game, RankResultReqDto scoreDto, Long userId) { List teams = teamUserRepository.findAllByGameId(game.getId()); TeamUser myTeam = findTeamId(scoreDto.getMyTeamId(), teams); From 3eae0f275909df2c5ca5ecff0862bcdd7b6dba7a Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Fri, 15 Sep 2023 18:23:55 +0900 Subject: [PATCH 228/273] =?UTF-8?q?[REFACTOR]=20TierRepository=20findStart?= =?UTF-8?q?Tier=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/admin/rank/service/RankAdminService.java | 3 ++- .../gg/server/admin/rank/service/RankRedisAdminService.java | 6 ++++-- .../java/com/gg/server/domain/tier/data/TierRepository.java | 4 ++++ .../global/security/service/CustomOAuth2UserService.java | 3 ++- src/test/java/com/gg/server/game/GameControllerTest.java | 3 ++- .../com/gg/server/game/service/GameFindServiceTest.java | 3 ++- .../java/com/gg/server/game/service/GameServiceTest.java | 3 ++- 7 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gg/server/admin/rank/service/RankAdminService.java b/src/main/java/com/gg/server/admin/rank/service/RankAdminService.java index 78c91fb64..ceed91df3 100644 --- a/src/main/java/com/gg/server/admin/rank/service/RankAdminService.java +++ b/src/main/java/com/gg/server/admin/rank/service/RankAdminService.java @@ -10,6 +10,7 @@ import com.gg.server.domain.season.exception.SeasonTimeBeforeException; import com.gg.server.domain.tier.data.Tier; import com.gg.server.domain.tier.data.TierRepository; +import com.gg.server.domain.tier.exception.TierNotFoundException; import com.gg.server.domain.user.data.User; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; @@ -37,7 +38,7 @@ public void addAllUserRankByNewSeason(SeasonAdminDto seasonAdminDto) { List ranks = new ArrayList<>(); Season season = seasonRepository.findById(seasonAdminDto.getSeasonId()).get(); - Tier tier = tierRepository.findAll().get(0); + Tier tier = tierRepository.findStartTier().orElseThrow(TierNotFoundException::new); users.forEach(user -> { if (user.getRoleType() != GUEST) { Rank userRank = Rank.from(user, season, seasonAdminDto.getStartPpp(), tier); diff --git a/src/main/java/com/gg/server/admin/rank/service/RankRedisAdminService.java b/src/main/java/com/gg/server/admin/rank/service/RankRedisAdminService.java index 403aa1f2e..c8c6a1cca 100644 --- a/src/main/java/com/gg/server/admin/rank/service/RankRedisAdminService.java +++ b/src/main/java/com/gg/server/admin/rank/service/RankRedisAdminService.java @@ -4,7 +4,9 @@ import com.gg.server.domain.rank.redis.RankRedis; import com.gg.server.domain.rank.redis.RankRedisRepository; import com.gg.server.domain.rank.redis.RedisKeyManager; +import com.gg.server.domain.tier.data.Tier; import com.gg.server.domain.tier.data.TierRepository; +import com.gg.server.domain.tier.exception.TierNotFoundException; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; @@ -28,12 +30,12 @@ public void addAllUserRankByNewSeason(SeasonAdminDto seasonAdminDto) { List users = userRepository.findAll(); String redisHashKey = RedisKeyManager.getHashKey(seasonAdminDto.getSeasonId()); - String tierImageUri = tierRepository.findAll().get(0).getImageUri(); + Tier tier = tierRepository.findStartTier().orElseThrow(TierNotFoundException::new); users.forEach(user -> { if (user.getRoleType() != GUEST) { UserDto userDto = UserDto.from(user); - RankRedis userRank = RankRedis.from(userDto, seasonAdminDto.getStartPpp(), tierImageUri); + RankRedis userRank = RankRedis.from(userDto, seasonAdminDto.getStartPpp(), tier.getImageUri()); rankRedisRepository.addRankData(redisHashKey, user.getId(), userRank); } diff --git a/src/main/java/com/gg/server/domain/tier/data/TierRepository.java b/src/main/java/com/gg/server/domain/tier/data/TierRepository.java index 6f7be7c02..3e1c4747e 100644 --- a/src/main/java/com/gg/server/domain/tier/data/TierRepository.java +++ b/src/main/java/com/gg/server/domain/tier/data/TierRepository.java @@ -5,5 +5,9 @@ import java.util.Optional; public interface TierRepository extends JpaRepository { + + default Optional findStartTier() { + return findById(1L); + } Optional findByName(String name); } \ No newline at end of file diff --git a/src/main/java/com/gg/server/global/security/service/CustomOAuth2UserService.java b/src/main/java/com/gg/server/global/security/service/CustomOAuth2UserService.java index 8c7804b5f..a7442973c 100644 --- a/src/main/java/com/gg/server/global/security/service/CustomOAuth2UserService.java +++ b/src/main/java/com/gg/server/global/security/service/CustomOAuth2UserService.java @@ -8,6 +8,7 @@ import com.gg.server.domain.season.data.SeasonRepository; import com.gg.server.domain.tier.data.Tier; import com.gg.server.domain.tier.data.TierRepository; +import com.gg.server.domain.tier.exception.TierNotFoundException; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; @@ -82,7 +83,7 @@ private OAuth2User process(OAuth2UserRequest userRequest, OAuth2User user) { } private void createUserRank(User savedUser) { - Tier tier = tierRepository.findAll().get(0); + Tier tier = tierRepository.findStartTier().orElseThrow(TierNotFoundException::new); seasonRepository.findCurrentAndNewSeason(LocalDateTime.now()).forEach( season -> { Rank userRank = Rank.from(savedUser, season, season.getStartPpp(), tier); diff --git a/src/test/java/com/gg/server/game/GameControllerTest.java b/src/test/java/com/gg/server/game/GameControllerTest.java index e2f71cfb3..6a26d456e 100644 --- a/src/test/java/com/gg/server/game/GameControllerTest.java +++ b/src/test/java/com/gg/server/game/GameControllerTest.java @@ -26,6 +26,7 @@ import com.gg.server.domain.team.data.TeamUserRepository; import com.gg.server.domain.tier.data.Tier; import com.gg.server.domain.tier.data.TierRepository; +import com.gg.server.domain.tier.exception.TierNotFoundException; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.domain.user.type.RacketType; @@ -107,7 +108,7 @@ void init() { user1 = testDataUtils.createNewUser("test1", "test1@email", RacketType.NONE, SnsType.EMAIL, RoleType.USER); accessToken = tokenProvider.createToken(user1.getId()); user2 = testDataUtils.createNewUser("test2", "test2@email", RacketType.NONE, SnsType.EMAIL, RoleType.USER); - Tier tier = tierRepository.findAll().get(0); + Tier tier = tierRepository.findStartTier().orElseThrow(TierNotFoundException::new); rankRepository.save(Rank.from(user1, season, season.getStartPpp(), tier)); rankRepository.save(Rank.from(user2, season, season.getStartPpp(), tier)); RankRedis userRank = RankRedis.from(UserDto.from(user1), season.getStartPpp(), tier.getImageUri()); diff --git a/src/test/java/com/gg/server/game/service/GameFindServiceTest.java b/src/test/java/com/gg/server/game/service/GameFindServiceTest.java index b2875f960..194b31589 100644 --- a/src/test/java/com/gg/server/game/service/GameFindServiceTest.java +++ b/src/test/java/com/gg/server/game/service/GameFindServiceTest.java @@ -14,6 +14,7 @@ import com.gg.server.domain.season.data.Season; import com.gg.server.domain.tier.data.Tier; import com.gg.server.domain.tier.data.TierRepository; +import com.gg.server.domain.tier.exception.TierNotFoundException; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; @@ -60,7 +61,7 @@ public class GameFindServiceTest { void init() { Season season = testDataUtils.createSeason(); User newUser = testDataUtils.createNewUser(); - Tier tier = tierRepository.findAll().get(0); + Tier tier = tierRepository.findStartTier().orElseThrow(TierNotFoundException::new); String accessToken = tokenProvider.createToken(newUser.getId()); String statusMsg = "status message test1"; diff --git a/src/test/java/com/gg/server/game/service/GameServiceTest.java b/src/test/java/com/gg/server/game/service/GameServiceTest.java index 5150b2c9e..8080495cf 100644 --- a/src/test/java/com/gg/server/game/service/GameServiceTest.java +++ b/src/test/java/com/gg/server/game/service/GameServiceTest.java @@ -19,6 +19,7 @@ import com.gg.server.domain.team.data.TeamUserRepository; import com.gg.server.domain.tier.data.Tier; import com.gg.server.domain.tier.data.TierRepository; +import com.gg.server.domain.tier.exception.TierNotFoundException; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.global.security.jwt.utils.AuthTokenProvider; @@ -72,7 +73,7 @@ public class GameServiceTest { @BeforeEach void init() { Season season = testDataUtils.createSeason(); - Tier tier = tierRepository.findAll().get(0); + Tier tier = tierRepository.findStartTier().orElseThrow(TierNotFoundException::new); user1 = testDataUtils.createNewUser(); user2 = testDataUtils.createNewUser(); LocalDateTime now = LocalDateTime.now(); From 5fafead757011045a8fea89fe330785c2fcf975c Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Fri, 15 Sep 2023 18:23:55 +0900 Subject: [PATCH 229/273] =?UTF-8?q?[REFACTOR]=20TierRepository=20findStart?= =?UTF-8?q?Tier=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/match/service/MatchFindService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/match/service/MatchFindService.java b/src/main/java/com/gg/server/domain/match/service/MatchFindService.java index ccaad754d..6fcad5a76 100644 --- a/src/main/java/com/gg/server/domain/match/service/MatchFindService.java +++ b/src/main/java/com/gg/server/domain/match/service/MatchFindService.java @@ -74,7 +74,7 @@ public SlotStatusResponseListDto getAllMatchStatus(UserDto userDto, Option optio SlotManagement slotManagement = slotManagementRepository.findCurrent(LocalDateTime.now()) .orElseThrow(SlotNotFoundException::new); Season season = seasonFindService.findCurrentSeason(LocalDateTime.now()); - Tier tier = tierRepository.findById(1L).orElseThrow(TierNotFoundException::new); + Tier tier = tierRepository.findStartTier().orElseThrow(TierNotFoundException::new); RankRedis user; if (userDto.getRoleType().equals(RoleType.GUEST)) { user = RankRedis.from(userDto, season.getStartPpp(), tier.getImageUri()); From 0275193cf6c79591309608bd56a889faff05de6d Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Sun, 17 Sep 2023 23:34:59 +0900 Subject: [PATCH 230/273] =?UTF-8?q?[REFACTOR]=20Item=20setVisibility?= =?UTF-8?q?=EB=A5=BC=20=EC=84=9C=EB=B9=84=EC=8A=A4=EB=8B=A8=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=97=94=ED=8B=B0=ED=8B=B0=EB=8B=A8=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/admin/item/service/ItemAdminService.java | 12 +++--------- .../java/com/gg/server/domain/item/data/Item.java | 7 +++++-- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java index d7130faf7..3c04feefa 100644 --- a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java +++ b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java @@ -40,8 +40,7 @@ public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, if (item.getIsVisible() == false) { throw new ItemNotAvailableException(); } - item.setIsVisible(false); - item.setDeleterIntraId(user.getIntraId()); + item.setVisibility(user.getIntraId()); Item newItem = new Item(itemUpdateRequestDto, user.getIntraId()); if (itemImageFile != null) asyncNewItemImageUploader.upload(newItem, itemImageFile); @@ -56,7 +55,7 @@ public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, if (item.getIsVisible() == false) { throw new ItemNotAvailableException(); } - setVisibility(item, user.getIntraId()); + item.setVisibility(user.getIntraId()); Item newItem = new Item(itemUpdateRequestDto, user.getIntraId(), item.getImageUri()); itemAdminRepository.save(newItem); } @@ -64,11 +63,6 @@ public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, @Transactional public void deleteItem(Long itemId, UserDto user) { Item item = itemAdminRepository.findById(itemId).orElseThrow(() -> new ItemNotFoundException()); - setVisibility(item, user.getIntraId()); - } - - public void setVisibility(Item item, String intraId) { - item.setIsVisible(true); - item.setDeleterIntraId(intraId); + item.setVisibility(user.getIntraId()); } } diff --git a/src/main/java/com/gg/server/domain/item/data/Item.java b/src/main/java/com/gg/server/domain/item/data/Item.java index 0b096064b..7c7a776d6 100644 --- a/src/main/java/com/gg/server/domain/item/data/Item.java +++ b/src/main/java/com/gg/server/domain/item/data/Item.java @@ -35,7 +35,6 @@ public class Item { @NotNull @Column(name = "is_visible") - @Setter private Boolean isVisible; @Column(name = "discount") @@ -55,7 +54,6 @@ public class Item { private String creatorIntraId; @Column(name = "deleter_intra_id", length = 10) - @Setter private String deleterIntraId; public Item(String name, String mainContent, String subContent, String imageUri, Integer price, @@ -116,6 +114,11 @@ public void imageUpdate(String imageUri) { this.imageUri = imageUri; } + public void setVisibility(String intraId) { + this.isVisible = false; + this.deleterIntraId = intraId; + } + @Override public String toString() { return "Item{" + From 4ba8cc2254b74a053054fcc7d141654f8fd65af3 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Mon, 18 Sep 2023 01:53:37 +0900 Subject: [PATCH 231/273] =?UTF-8?q?[FIX]=20Entity=20@AllArgs=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20+=20=EC=9C=A0=EC=A0=80=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=EC=A1=B0=ED=9A=8C=20controller=EC=97=90=EC=84=9C?= =?UTF-8?q?=20UserItemPageRequestDto=20=EC=82=AD=EC=A0=9C=20=ED=9B=84=20Pa?= =?UTF-8?q?geRequestDto=20=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/item/controller/ItemController.java | 4 ++-- .../java/com/gg/server/domain/item/data/Item.java | 1 - .../domain/item/dto/UserItemPageRequestDto.java | 12 ------------ 3 files changed, 2 insertions(+), 15 deletions(-) delete mode 100644 src/main/java/com/gg/server/domain/item/dto/UserItemPageRequestDto.java diff --git a/src/main/java/com/gg/server/domain/item/controller/ItemController.java b/src/main/java/com/gg/server/domain/item/controller/ItemController.java index b27cc19ad..9b3d7df3a 100644 --- a/src/main/java/com/gg/server/domain/item/controller/ItemController.java +++ b/src/main/java/com/gg/server/domain/item/controller/ItemController.java @@ -3,9 +3,9 @@ import com.gg.server.domain.item.dto.ItemGiftRequestDto; import com.gg.server.domain.item.dto.ItemStoreListResponseDto; import com.gg.server.domain.item.dto.UserItemListResponseDto; -import com.gg.server.domain.item.dto.UserItemPageRequestDto; import com.gg.server.domain.item.service.ItemService; import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.global.dto.PageRequestDto; import com.gg.server.global.utils.argumentresolver.Login; import io.swagger.v3.oas.annotations.Parameter; import lombok.RequiredArgsConstructor; @@ -46,7 +46,7 @@ public ResponseEntity giftItem(@PathVariable Long itemId, } @GetMapping - public UserItemListResponseDto getItemByUser(@ModelAttribute @Valid UserItemPageRequestDto req, + public UserItemListResponseDto getItemByUser(@ModelAttribute @Valid PageRequestDto req, @Parameter(hidden = true) @Login UserDto userDto) { Pageable pageable = PageRequest.of(req.getPage() - 1, req.getSize(), Sort.by("createdAt").descending()); diff --git a/src/main/java/com/gg/server/domain/item/data/Item.java b/src/main/java/com/gg/server/domain/item/data/Item.java index 0b096064b..e518fba42 100644 --- a/src/main/java/com/gg/server/domain/item/data/Item.java +++ b/src/main/java/com/gg/server/domain/item/data/Item.java @@ -11,7 +11,6 @@ @Entity @Getter @NoArgsConstructor -@AllArgsConstructor public class Item { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/gg/server/domain/item/dto/UserItemPageRequestDto.java b/src/main/java/com/gg/server/domain/item/dto/UserItemPageRequestDto.java deleted file mode 100644 index cdc31b4f7..000000000 --- a/src/main/java/com/gg/server/domain/item/dto/UserItemPageRequestDto.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gg.server.domain.item.dto; - -import com.gg.server.global.dto.PageRequestDto; -import lombok.Getter; - -@Getter -public class UserItemPageRequestDto extends PageRequestDto { - - public UserItemPageRequestDto(Integer page, Integer size) { - super(page, size); - } -} From e2fb8c98747f2aa7213826ddbf94fefabc187b1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Mon, 18 Sep 2023 13:35:02 +0900 Subject: [PATCH 232/273] =?UTF-8?q?[FEAT]=20GGBE4-77=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=EC=9E=90=20=EC=BD=94=EC=9D=B8=20=EC=88=98=EC=A0=95=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coin/controller/CoinAdminController.java | 21 ++++++++++++++++ .../admin/coin/dto/CoinUpdateRequestDto.java | 19 ++++++++++++++ .../admin/coin/service/CoinAdminService.java | 25 +++++++++++++++++++ .../coin/service/CoinHistoryService.java | 12 ++++----- 4 files changed, 71 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/gg/server/admin/coin/controller/CoinAdminController.java create mode 100644 src/main/java/com/gg/server/admin/coin/dto/CoinUpdateRequestDto.java create mode 100644 src/main/java/com/gg/server/admin/coin/service/CoinAdminService.java diff --git a/src/main/java/com/gg/server/admin/coin/controller/CoinAdminController.java b/src/main/java/com/gg/server/admin/coin/controller/CoinAdminController.java new file mode 100644 index 000000000..7f05577c5 --- /dev/null +++ b/src/main/java/com/gg/server/admin/coin/controller/CoinAdminController.java @@ -0,0 +1,21 @@ +package com.gg.server.admin.coin.controller; + +import com.gg.server.admin.coin.dto.CoinUpdateRequestDto; +import com.gg.server.admin.coin.service.CoinAdminService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +@RequestMapping("pingpong/admin/coin") +public class CoinAdminController { + private final CoinAdminService coinAdminService; + + @PutMapping(value = "") + public ResponseEntity updateUserCoin(@RequestBody CoinUpdateRequestDto coinUpdateRequestDto) { + coinAdminService.updateUserCoin(coinUpdateRequestDto); + return new ResponseEntity(HttpStatus.NO_CONTENT); + } +} diff --git a/src/main/java/com/gg/server/admin/coin/dto/CoinUpdateRequestDto.java b/src/main/java/com/gg/server/admin/coin/dto/CoinUpdateRequestDto.java new file mode 100644 index 000000000..85349c464 --- /dev/null +++ b/src/main/java/com/gg/server/admin/coin/dto/CoinUpdateRequestDto.java @@ -0,0 +1,19 @@ +package com.gg.server.admin.coin.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class CoinUpdateRequestDto { + @NotNull(message = "intraId는 null이 될 수 없습니다.") + private String intraId; + @NotNull(message = "change는 null이 될 수 없습니다.") + private int change; + @NotNull(message = "content는 null이 될 수 없습니다.") + private String content; +} diff --git a/src/main/java/com/gg/server/admin/coin/service/CoinAdminService.java b/src/main/java/com/gg/server/admin/coin/service/CoinAdminService.java new file mode 100644 index 000000000..fd440e85c --- /dev/null +++ b/src/main/java/com/gg/server/admin/coin/service/CoinAdminService.java @@ -0,0 +1,25 @@ +package com.gg.server.admin.coin.service; + +import com.gg.server.admin.coin.dto.CoinUpdateRequestDto; +import com.gg.server.domain.coin.data.CoinHistory; +import com.gg.server.domain.coin.service.CoinHistoryService; +import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.exception.UserNotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class CoinAdminService { + private final UserRepository userRepository; + private final CoinHistoryService coinHistoryService; + + @Transactional + public void updateUserCoin(CoinUpdateRequestDto coinUpdateRequestDto) { + User user = userRepository.findByIntraId(coinUpdateRequestDto.getIntraId()).orElseThrow(() -> new UserNotFoundException()); + user.addGgCoin(coinUpdateRequestDto.getChange()); + coinHistoryService.addCoinHistory(new CoinHistory(user, coinUpdateRequestDto.getContent(), coinUpdateRequestDto.getChange())); + } +} diff --git a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java index 9b48dca47..df877d911 100644 --- a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java +++ b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java @@ -26,29 +26,29 @@ public void addAttendanceCoinHistory(User user) { @Transactional public void addPurchaseItemCoinHistory(User user, Item item, Integer price) { - addCoinHistory(new CoinHistory(user, item.getName()+ " 구매", price*(-1))); + addCoinHistory(new CoinHistory(user, item.getName() + " 구매", price * (-1))); } @Transactional public void addGiftItemCoinHistory(User user, User giftTarget, Item item, Integer price) { - addCoinHistory(new CoinHistory(user, giftTarget.getIntraId() + "에게 " + item.getName()+ " 선물", price*(-1))); + addCoinHistory(new CoinHistory(user, giftTarget.getIntraId() + "에게 " + item.getName() + " 선물", price * (-1))); } @Transactional - public void addNormalCoin(User user){ + public void addNormalCoin(User user) { int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getNormal(); addCoinHistory(new CoinHistory(user, HistoryType.NORMAL.getHistory(), amount)); } @Transactional - public int addRankWinCoin(User user){ + public int addRankWinCoin(User user) { int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getRankWin(); addCoinHistory(new CoinHistory(user, HistoryType.RANKWIN.getHistory(), amount)); return amount; } @Transactional - public int addRankLoseCoin(User user){ + public int addRankLoseCoin(User user) { int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getRankLose(); if (amount == 0) return amount; @@ -64,7 +64,7 @@ public boolean hasAttendedToday(User user) { user, HistoryType.ATTENDANCECOIN.getHistory(), startOfDay, endOfDay); } - private void addCoinHistory(CoinHistory coinHistory){ + public void addCoinHistory(CoinHistory coinHistory) { coinHistoryRepository.save(coinHistory); } From 5ede4ee8f10523c447269b7315553eb592b09338 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Mon, 18 Sep 2023 13:45:26 +0900 Subject: [PATCH 233/273] =?UTF-8?q?[TEST]=20GGBE4-77=20=EA=B4=80=EB=A6=AC?= =?UTF-8?q?=EC=9E=90=20=EC=BD=94=EC=9D=B8=20=EC=88=98=EC=A0=95=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/CoinAdminControllerTest.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/test/java/com/gg/server/admin/coin/controller/CoinAdminControllerTest.java diff --git a/src/test/java/com/gg/server/admin/coin/controller/CoinAdminControllerTest.java b/src/test/java/com/gg/server/admin/coin/controller/CoinAdminControllerTest.java new file mode 100644 index 000000000..bcc4734e8 --- /dev/null +++ b/src/test/java/com/gg/server/admin/coin/controller/CoinAdminControllerTest.java @@ -0,0 +1,58 @@ +package com.gg.server.admin.coin.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gg.server.admin.coin.dto.CoinUpdateRequestDto; +import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.global.security.jwt.utils.AuthTokenProvider; +import com.gg.server.utils.TestDataUtils; +import lombok.RequiredArgsConstructor; +import org.apache.http.HttpHeaders; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.transaction.annotation.Transactional; + +import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@RequiredArgsConstructor +@SpringBootTest +@AutoConfigureMockMvc +@Transactional +class CoinAdminControllerTest { + @Autowired + TestDataUtils testDataUtils; + + @Autowired + private MockMvc mockMvc; + + @Autowired + ObjectMapper objectMapper; + + @Autowired + AuthTokenProvider tokenProvider; + + @Autowired + UserRepository userRepository; + + @Test + @DisplayName("PUT /pingpong/admin/coin") + public void updateCoinTest() throws Exception { + String accessToken = testDataUtils.getAdminLoginAccessToken(); + Long userId = tokenProvider.getUserIdFromAccessToken(accessToken); + String creatorId = userRepository.getById(userId).getIntraId(); + int beforeCoin = userRepository.getById(userId).getGgCoin(); + int changeCoin = 10; + CoinUpdateRequestDto coinUpdateRequestDto = new CoinUpdateRequestDto(creatorId, changeCoin, "관리자 코인 지급 테스트"); + mockMvc.perform(put("/pingpong/admin/coin").header(HttpHeaders.AUTHORIZATION, "Bearer " + accessToken) + .contentType(MediaType.APPLICATION_JSON) + .content(objectMapper.writeValueAsString(coinUpdateRequestDto))) + .andExpect(status().isNoContent()); + Assertions.assertThat(userRepository.getById(userId).getGgCoin()).isEqualTo(beforeCoin + changeCoin); + } +} \ No newline at end of file From 1c04e034166432a41339146d53c278c453c0bea5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Mon, 18 Sep 2023 14:20:23 +0900 Subject: [PATCH 234/273] =?UTF-8?q?[REFACTOR]=20GGBE4-77=20url=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/admin/coin/controller/CoinAdminController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/admin/coin/controller/CoinAdminController.java b/src/main/java/com/gg/server/admin/coin/controller/CoinAdminController.java index 7f05577c5..581766615 100644 --- a/src/main/java/com/gg/server/admin/coin/controller/CoinAdminController.java +++ b/src/main/java/com/gg/server/admin/coin/controller/CoinAdminController.java @@ -13,7 +13,7 @@ public class CoinAdminController { private final CoinAdminService coinAdminService; - @PutMapping(value = "") + @PutMapping() public ResponseEntity updateUserCoin(@RequestBody CoinUpdateRequestDto coinUpdateRequestDto) { coinAdminService.updateUserCoin(coinUpdateRequestDto); return new ResponseEntity(HttpStatus.NO_CONTENT); From 6d9ccb406b5cf9e6ff9c0d8ccc4d606419f1fda0 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Sun, 17 Sep 2023 23:34:59 +0900 Subject: [PATCH 235/273] =?UTF-8?q?[REFACTOR]=20Item=20setVisibility?= =?UTF-8?q?=EB=A5=BC=20=EC=84=9C=EB=B9=84=EC=8A=A4=EB=8B=A8=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=97=94=ED=8B=B0=ED=8B=B0=EB=8B=A8=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/tier/data/TierRepository.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gg/server/domain/tier/data/TierRepository.java b/src/main/java/com/gg/server/domain/tier/data/TierRepository.java index 3e1c4747e..0aec19207 100644 --- a/src/main/java/com/gg/server/domain/tier/data/TierRepository.java +++ b/src/main/java/com/gg/server/domain/tier/data/TierRepository.java @@ -1,13 +1,14 @@ package com.gg.server.domain.tier.data; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import java.util.Optional; public interface TierRepository extends JpaRepository { - default Optional findStartTier() { - return findById(1L); - } + @Query("SELECT t FROM Tier t WHERE t.id = 1L") + Optional findStartTier(); + Optional findByName(String name); } \ No newline at end of file From 2084858a8d2e03bce8c7479981c10e2ef43da079 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=A5=98=EB=AF=BC=EC=95=84?= Date: Mon, 18 Sep 2023 14:56:20 +0900 Subject: [PATCH 236/273] =?UTF-8?q?[FIX]=20param=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20#265?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/game/data/GameRepository.java | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gg/server/domain/game/data/GameRepository.java b/src/main/java/com/gg/server/domain/game/data/GameRepository.java index 613742888..e63c6ed25 100644 --- a/src/main/java/com/gg/server/domain/game/data/GameRepository.java +++ b/src/main/java/com/gg/server/domain/game/data/GameRepository.java @@ -3,12 +3,14 @@ import com.gg.server.domain.game.dto.GameTeamUserInfo; import com.gg.server.domain.game.type.Mode; import com.gg.server.domain.game.type.StatusType; + import java.time.LocalDateTime; import java.util.Optional; import com.gg.server.domain.team.dto.GameUser; + import javax.persistence.LockModeType; -import org.springframework.cache.annotation.Cacheable; + import org.springframework.data.jpa.repository.JpaRepository; import com.gg.server.domain.game.dto.GameTeamUser; import org.springframework.data.domain.Pageable; @@ -19,17 +21,22 @@ import java.util.List; -public interface GameRepository extends JpaRepository, GameRepositoryCustom{ +public interface GameRepository extends JpaRepository, GameRepositoryCustom { Slice findAllByModeAndStatus(Mode mode, StatusType status, Pageable pageable); + Slice findAllByAndStatus(StatusType status, Pageable pageable); + Slice findAllByAndStatusIn(List statusList, Pageable pageable); + Slice findAllByModeAndStatusAndSeasonId(Mode mode, StatusType status, Long season, Pageable pageable); + @Query(value = "select t1.gameId, t1.startTime, t1.status, t1.mode, " + "t1.intraId t1IntraId, t1.win t1IsWin, t1.score t1Score, t1.image t1Image, t1.total_exp t1Exp, t1.wins t1Wins, t1.losses t1Losses, " + "t2.win t2IsWin, t2.score t2Score, t2.intraId t2IntraId, t2.wins t2Wins, t2.losses t2Losses, t2.image t2Image, t2.total_exp t2Exp " + "from v_rank_game_detail t1, v_rank_game_detail t2 " + "where t1.gameId IN (:games) and t1.teamId findTeamsByGameIsIn(@Param("games") List games); + @Query(value = "select t1.gameId, t1.startTime, t1.status, t1.mode, " + "t1.intraId t1IntraId, t1.win t1IsWin, t1.score t1Score, t1.image t1Image, t1.total_exp t1Exp, " + "t2.win t2IsWin, t2.score t2Score, t2.intraId t2IntraId, t2.image t2Image, t2.total_exp t2Exp " + @@ -40,29 +47,37 @@ public interface GameRepository extends JpaRepository, GameRepositor @Query(value = "SELECT teamId, gameId, score, startTime, status, mode, userId, intraId, image, total_exp exp" + " FROM v_teamuser where gameId = :gameId", nativeQuery = true) List findTeamGameUser(@Param("gameId") Long gameId); + Optional findByStartTime(LocalDateTime startTime); + @Query(value = "select g from Game g where g.startTime > :startTime and g.startTime < :endTime") - List findAllBetween(@Param("startTime")LocalDateTime startTime, @Param("endTime") LocalDateTime endTime); + List findAllBetween(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime); + @Query(value = "SELECT g FROM Game g, Team t, TeamUser tu WHERE g.startTime > :startTime AND g.startTime < :endTime " + "AND g.id = t.game.id AND t.id = tu.team.id AND tu.user.id = :userId") - Optional findByUserInSlots(@Param("startTime")LocalDateTime startTime, @Param("endTime") LocalDateTime endTime, @Param("userId") Long userId); + Optional findByUserInSlots(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime, @Param("userId") Long userId); + @Query(value = "SELECT g FROM Game g, Team t, TeamUser tu WHERE g.status = :status AND g.id = t.game.id" + " AND t.id = tu.team.id AND tu.user.id = :userId") Optional findByStatusTypeAndUserId(@Param("status") StatusType status, @Param("userId") Long userId); + @Query(value = "select gameId " + "from v_teamuser " + "where intraId = :intra and status in (:status)", nativeQuery = true) Slice findGamesByUser(@Param("intra") String intra, @Param("status") List status, Pageable pageable); + @Query(value = "select gameId " + "from v_teamuser " + "where intraId = :intra and mode in (:mode) and status=:status", nativeQuery = true) Slice findGamesByUserAndMode(@Param("intra") String intra, @Param("mode") String mode, @Param("status") String status, Pageable pageable); + @Query(value = "select gameId " + "from v_teamuser " + "where intraId = :intra and mode in (:mode) and seasonId = :seasonId and status=:status", nativeQuery = true) Slice findGamesByUserAndModeAndSeason(@Param("intra") String intra, @Param("mode") String mode, @Param("seasonId") Long seasonId, @Param("status") String status, Pageable pageable); List findAllByStatusAndStartTimeLessThanEqual(StatusType status, LocalDateTime startTime); + List findAllByStatusAndEndTimeLessThanEqual(StatusType status, LocalDateTime endTime); @Query(value = "SELECT u.id userId, u.e_mail email, u.intra_id intraId, u.sns_noti_opt snsNotiOpt, g.id gameId " + @@ -71,7 +86,8 @@ public interface GameRepository extends JpaRepository, GameRepositor "team t, team_user tu, user u " + "WHERE g.id=t.game_id AND t.id = tu.team_id AND tu.user_id=u.id AND g.status = 'BEFORE'", nativeQuery = true) List findAllByStartTimeLessThanEqual(@Param("time") LocalDateTime time); + @Lock(LockModeType.PESSIMISTIC_WRITE) - @Query(value = "SELECT g FROM Game g WHERE g.id=:gamdId") - Optional findWithPessimisticLockById(@Param("gameId")Long gameId); + @Query(value = "SELECT g FROM Game g WHERE g.id=:id") + Optional findWithPessimisticLockById(@Param("id") Long id); } From d27ea259edf4ea3df890f8768326bd8313987652 Mon Sep 17 00:00:00 2001 From: AYoungSn Date: Mon, 18 Sep 2023 15:25:46 +0900 Subject: [PATCH 237/273] =?UTF-8?q?[merge]=20#265=20jpql=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gg/server/domain/game/data/GameRepository.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/domain/game/data/GameRepository.java b/src/main/java/com/gg/server/domain/game/data/GameRepository.java index e63c6ed25..535e4d889 100644 --- a/src/main/java/com/gg/server/domain/game/data/GameRepository.java +++ b/src/main/java/com/gg/server/domain/game/data/GameRepository.java @@ -88,6 +88,5 @@ public interface GameRepository extends JpaRepository, GameRepositor List findAllByStartTimeLessThanEqual(@Param("time") LocalDateTime time); @Lock(LockModeType.PESSIMISTIC_WRITE) - @Query(value = "SELECT g FROM Game g WHERE g.id=:id") - Optional findWithPessimisticLockById(@Param("id") Long id); + Optional findWithPessimisticLockById(Long id); } From f00f4579cf3d69641e026fd5bfe8dd945e925038 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Mon, 18 Sep 2023 15:45:39 +0900 Subject: [PATCH 238/273] =?UTF-8?q?[REFACTOR]=20=3F1=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/admin/user/data/UserImageAdminRepository.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java index cd369481c..c18eb09dd 100644 --- a/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java +++ b/src/main/java/com/gg/server/admin/user/data/UserImageAdminRepository.java @@ -18,9 +18,9 @@ public interface UserImageAdminRepository extends JpaRepository Page findAllByDeletedAtNotNullOrderByDeletedAtDesc(Pageable pageable); - @Query(value = "SELECT ui FROM UserImage ui WHERE ui.user.id = ?1 " + + @Query(value = "SELECT ui FROM UserImage ui WHERE ui.user.id = :user_id " + "AND ui.deletedAt != NULL ORDER BY ui.deletedAt DESC") - Page findAllByUserAndDeletedAtNotNullOrderByDeletedAtDesc(Long userId, Pageable pageable); + Page findAllByUserAndDeletedAtNotNullOrderByDeletedAtDesc(@Param("user_id") Long userId, Pageable pageable); @Query(value = "SELECT ui FROM UserImage ui WHERE ui.id NOT IN (" + "SELECT MIN(ui.id) FROM UserImage ui GROUP BY ui.user.id" + From 56f879dc03762d8cfb6e8e556383e9cbee56c6fa Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Mon, 18 Sep 2023 16:11:35 +0900 Subject: [PATCH 239/273] =?UTF-8?q?[REFACTOR]=20private=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/admin/receipt/dto/ReceiptAdminPageRequestDto.java | 2 +- .../gg/server/admin/receipt/dto/ReceiptListResponseDto.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gg/server/admin/receipt/dto/ReceiptAdminPageRequestDto.java b/src/main/java/com/gg/server/admin/receipt/dto/ReceiptAdminPageRequestDto.java index f7fa203bb..5fcd0db68 100644 --- a/src/main/java/com/gg/server/admin/receipt/dto/ReceiptAdminPageRequestDto.java +++ b/src/main/java/com/gg/server/admin/receipt/dto/ReceiptAdminPageRequestDto.java @@ -5,7 +5,7 @@ @Getter public class ReceiptAdminPageRequestDto extends PageRequestDto { - String intraId; + private String intraId; public ReceiptAdminPageRequestDto(String intraId, Integer page, Integer size) { super(page, size); diff --git a/src/main/java/com/gg/server/admin/receipt/dto/ReceiptListResponseDto.java b/src/main/java/com/gg/server/admin/receipt/dto/ReceiptListResponseDto.java index 0127f3be3..e994ac244 100644 --- a/src/main/java/com/gg/server/admin/receipt/dto/ReceiptListResponseDto.java +++ b/src/main/java/com/gg/server/admin/receipt/dto/ReceiptListResponseDto.java @@ -10,6 +10,6 @@ @NoArgsConstructor @AllArgsConstructor public class ReceiptListResponseDto { - List receiptList; - Integer totalPage; + private List receiptList; + private Integer totalPage; } From c4dc52beaa0a498775464436437dfc69dbd2f1c5 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Mon, 18 Sep 2023 16:34:12 +0900 Subject: [PATCH 240/273] =?UTF-8?q?[REFACTOR]=20=EC=B9=B4=EC=B9=B4?= =?UTF-8?q?=EC=98=A4=20=EC=9C=A0=EC=A0=80=20=EC=97=90=EB=9F=AC=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/service/UserService.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 1a637f85e..b74ef8a33 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -13,6 +13,7 @@ import com.gg.server.domain.pchange.data.PChangeRepository; import com.gg.server.domain.pchange.exception.PChangeNotExistException; import com.gg.server.domain.rank.data.Rank; +import com.gg.server.domain.rank.exception.RankNotFoundException; import com.gg.server.domain.rank.exception.RedisDataNotFoundException; import com.gg.server.domain.rank.redis.RankRedis; import com.gg.server.domain.rank.redis.RankRedisRepository; @@ -264,16 +265,16 @@ public UserNormalDetailResponseDto getUserNormalDetail(UserDto user) { Boolean isAdmin = user.getRoleType() == RoleType.ADMIN; Boolean isAttended = coinHistoryService.hasAttendedToday(loginUser); Integer level = ExpLevelCalculator.getLevel(user.getTotalExp()); - Tier tier = rankFindService.findByUserIdAndSeasonId(user.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); - /* 티어가 존재하지 않는 일반 유저일때 : None, None 처리해서 보내기*/ - if (tier == null) { - String tierName = "NONE"; - String tierImageUri = "NONE"; - return new UserNormalDetailResponseDto(loginUser.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, loginUser.getEdge(), tierName, tierImageUri, level); + if (user.getKakaoId() != null) { + + } + try { + Tier tier = rankFindService.findByUserIdAndSeasonId(user.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); + return new UserNormalDetailResponseDto(user.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, loginUser.getEdge(), tier.getName(), tier.getImageUri(), level); + } catch (RankNotFoundException ex) { + // 카카오 유저나 Rank가 없는 유저 + return new UserNormalDetailResponseDto(user.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, loginUser.getEdge(), "NONE", "NONE", level); } - String tierName = tier.getName(); - String tierImageUri = tier.getImageUri(); - return new UserNormalDetailResponseDto(user.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, loginUser.getEdge(), tierName, tierImageUri, level); } @Transactional() From 590745a74ecdc929ffb3a58739e92a2f3b87edc6 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Mon, 18 Sep 2023 16:34:12 +0900 Subject: [PATCH 241/273] =?UTF-8?q?[REFACTOR]=20=EC=B9=B4=EC=B9=B4?= =?UTF-8?q?=EC=98=A4=20=EC=9C=A0=EC=A0=80=20=EC=97=90=EB=9F=AC=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/user/service/UserService.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 1a637f85e..c24e605ca 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -13,6 +13,7 @@ import com.gg.server.domain.pchange.data.PChangeRepository; import com.gg.server.domain.pchange.exception.PChangeNotExistException; import com.gg.server.domain.rank.data.Rank; +import com.gg.server.domain.rank.exception.RankNotFoundException; import com.gg.server.domain.rank.exception.RedisDataNotFoundException; import com.gg.server.domain.rank.redis.RankRedis; import com.gg.server.domain.rank.redis.RankRedisRepository; @@ -264,16 +265,13 @@ public UserNormalDetailResponseDto getUserNormalDetail(UserDto user) { Boolean isAdmin = user.getRoleType() == RoleType.ADMIN; Boolean isAttended = coinHistoryService.hasAttendedToday(loginUser); Integer level = ExpLevelCalculator.getLevel(user.getTotalExp()); - Tier tier = rankFindService.findByUserIdAndSeasonId(user.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); - /* 티어가 존재하지 않는 일반 유저일때 : None, None 처리해서 보내기*/ - if (tier == null) { - String tierName = "NONE"; - String tierImageUri = "NONE"; - return new UserNormalDetailResponseDto(loginUser.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, loginUser.getEdge(), tierName, tierImageUri, level); + try { + Tier tier = rankFindService.findByUserIdAndSeasonId(user.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); + return new UserNormalDetailResponseDto(user.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, loginUser.getEdge(), tier.getName(), tier.getImageUri(), level); + } catch (RankNotFoundException ex) { + // 카카오 유저나 Rank가 없는 유저 + return new UserNormalDetailResponseDto(user.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, loginUser.getEdge(), "NONE", "NONE", level); } - String tierName = tier.getName(); - String tierImageUri = tier.getImageUri(); - return new UserNormalDetailResponseDto(user.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, loginUser.getEdge(), tierName, tierImageUri, level); } @Transactional() From 8314e0f872031ecdc8d3831863ca1cafbd4c548a Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Mon, 18 Sep 2023 22:31:54 +0900 Subject: [PATCH 242/273] =?UTF-8?q?[style]=20GGBE4-80=20CoinPolicyAdminAdd?= =?UTF-8?q?Dto.java=20valid=20error=20=EB=A9=94=EC=84=B8=EC=A7=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/admin/coin/dto/CoinPolicyAdminAddDto.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminAddDto.java b/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminAddDto.java index cf35609b3..1420c2ea3 100644 --- a/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminAddDto.java +++ b/src/main/java/com/gg/server/admin/coin/dto/CoinPolicyAdminAddDto.java @@ -11,19 +11,19 @@ @NoArgsConstructor @AllArgsConstructor public class CoinPolicyAdminAddDto { - @NotNull(message = "plz. attendance") + @NotNull(message = "plz. not null attendance") @PositiveOrZero(message = "plz. attendance PositiveOrZero") private int attendance; - @NotNull(message = "plz. normal") + @NotNull(message = "plz. not null normal") @PositiveOrZero(message = "plz. normal PositiveOrZero") private int normal; - @NotNull(message = "plz. rankWin") + @NotNull(message = "plz. not null rankWin") @PositiveOrZero(message = "plz. rankWin PositiveOrZero") private int rankWin; - @NotNull(message = "plz. rankLose") + @NotNull(message = "plz. not null rankLose") @PositiveOrZero(message = "plz. rankLose PositiveOrZero") private int rankLose; } \ No newline at end of file From cff0525c68f554c8894b403bd64b0010b572311e Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Mon, 18 Sep 2023 22:38:12 +0900 Subject: [PATCH 243/273] =?UTF-8?q?[style]=20GGBE4-80=20CoinPolicyAdminCon?= =?UTF-8?q?troller=20=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/coin/controller/CoinPolicyAdminController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/admin/coin/controller/CoinPolicyAdminController.java b/src/main/java/com/gg/server/admin/coin/controller/CoinPolicyAdminController.java index f8f66dee5..b67d1537a 100644 --- a/src/main/java/com/gg/server/admin/coin/controller/CoinPolicyAdminController.java +++ b/src/main/java/com/gg/server/admin/coin/controller/CoinPolicyAdminController.java @@ -8,6 +8,7 @@ import com.gg.server.global.utils.argumentresolver.Login; import io.swagger.v3.oas.annotations.Parameter; import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; @@ -19,7 +20,7 @@ import javax.validation.Valid; @RestController -@AllArgsConstructor +@RequiredArgsConstructor @RequestMapping("pingpong/admin") @Validated public class CoinPolicyAdminController { From 38d136f04f1712ccb5827da1bc0187c16bff640d Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Mon, 18 Sep 2023 22:54:17 +0900 Subject: [PATCH 244/273] =?UTF-8?q?[fix]=20GGBE4-80=20CoinPolicyRepository?= =?UTF-8?q?=20optional=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EB=8C=80=EC=9D=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/coin/data/CoinPolicyRepository.java | 4 +++- .../domain/coin/service/CoinHistoryService.java | 13 +++++++++---- .../domain/coin/service/UserCoinChangeService.java | 11 +++++------ .../coin/service/UserCoinChangeServiceTest.java | 13 +++++++++---- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/gg/server/domain/coin/data/CoinPolicyRepository.java b/src/main/java/com/gg/server/domain/coin/data/CoinPolicyRepository.java index cc248726d..6e3eb8a77 100644 --- a/src/main/java/com/gg/server/domain/coin/data/CoinPolicyRepository.java +++ b/src/main/java/com/gg/server/domain/coin/data/CoinPolicyRepository.java @@ -2,7 +2,9 @@ import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + public interface CoinPolicyRepository extends JpaRepository { - CoinPolicy findTopByOrderByCreatedAtDesc(); + Optional findTopByOrderByCreatedAtDesc(); } diff --git a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java index df877d911..f51293cd4 100644 --- a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java +++ b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java @@ -3,6 +3,7 @@ import com.gg.server.domain.coin.data.CoinHistory; import com.gg.server.domain.coin.data.CoinHistoryRepository; import com.gg.server.domain.coin.data.CoinPolicyRepository; +import com.gg.server.domain.coin.exception.CoinPolicyNotFoundException; import com.gg.server.domain.coin.type.HistoryType; import com.gg.server.domain.item.data.Item; import com.gg.server.domain.user.data.User; @@ -20,7 +21,8 @@ public class CoinHistoryService { @Transactional public void addAttendanceCoinHistory(User user) { - int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getAttendance(); + int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc() + .orElseThrow(() -> new CoinPolicyNotFoundException()).getAttendance(); addCoinHistory(new CoinHistory(user, HistoryType.ATTENDANCECOIN.getHistory(), amount)); } @@ -36,20 +38,23 @@ public void addGiftItemCoinHistory(User user, User giftTarget, Item item, Intege @Transactional public void addNormalCoin(User user) { - int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getNormal(); + int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc() + .orElseThrow(() -> new CoinPolicyNotFoundException()).getNormal(); addCoinHistory(new CoinHistory(user, HistoryType.NORMAL.getHistory(), amount)); } @Transactional public int addRankWinCoin(User user) { - int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getRankWin(); + int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc() + .orElseThrow(() -> new CoinPolicyNotFoundException()).getRankWin(); addCoinHistory(new CoinHistory(user, HistoryType.RANKWIN.getHistory(), amount)); return amount; } @Transactional public int addRankLoseCoin(User user) { - int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getRankLose(); + int amount = coinPolicyRepository.findTopByOrderByCreatedAtDesc() + .orElseThrow(() -> new CoinPolicyNotFoundException()).getRankLose(); if (amount == 0) return amount; addCoinHistory(new CoinHistory(user, HistoryType.RANKLOSE.getHistory(), amount)); diff --git a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java index dce2b1830..9f589bcd3 100644 --- a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java +++ b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java @@ -1,12 +1,10 @@ package com.gg.server.domain.coin.service; -import com.gg.server.domain.coin.data.CoinHistoryRepository; import com.gg.server.domain.coin.data.CoinPolicyRepository; import com.gg.server.domain.coin.dto.UserGameCoinResultDto; -import com.gg.server.domain.coin.type.HistoryType; +import com.gg.server.domain.coin.exception.CoinPolicyNotFoundException; import com.gg.server.domain.game.service.GameFindService; import com.gg.server.domain.item.data.Item; -import com.gg.server.domain.item.exception.InsufficientGgcoinException; import com.gg.server.domain.team.data.Team; import com.gg.server.domain.team.data.TeamUser; import com.gg.server.domain.user.data.User; @@ -17,7 +15,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDateTime; import java.util.List; @Service @@ -32,7 +29,8 @@ public class UserCoinChangeService { public int addAttendanceCoin(User user){ if (coinHistoryService.hasAttendedToday(user)) throw new UserAlreadyAttendanceException(); - int coinIncrement = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getAttendance(); + int coinIncrement = coinPolicyRepository.findTopByOrderByCreatedAtDesc() + .orElseThrow(() -> new CoinPolicyNotFoundException()).getAttendance(); user.addGgCoin(coinIncrement); coinHistoryService.addAttendanceCoinHistory(user); return coinIncrement; @@ -60,7 +58,8 @@ public void giftItemCoin(Item item, Integer price, User user, User giftTarget){ @Transactional public UserGameCoinResultDto addNormalGameCoin(Long userId) { User user = userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException()); - int coinIncrement = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getNormal(); + int coinIncrement = coinPolicyRepository.findTopByOrderByCreatedAtDesc() + .orElseThrow(() -> new CoinPolicyNotFoundException()).getNormal(); user.addGgCoin(coinIncrement); coinHistoryService.addNormalCoin(user); diff --git a/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java b/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java index a4d14ba9e..84e52623e 100644 --- a/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java +++ b/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java @@ -4,6 +4,7 @@ import com.gg.server.domain.coin.data.CoinPolicy; import com.gg.server.domain.coin.data.CoinPolicyRepository; import com.gg.server.domain.coin.dto.UserGameCoinResultDto; +import com.gg.server.domain.coin.exception.CoinPolicyNotFoundException; import com.gg.server.domain.item.data.Item; import com.gg.server.domain.item.data.ItemRepository; import com.gg.server.domain.item.type.ItemType; @@ -65,7 +66,8 @@ void addAttendanceCoin() { int coinIncrement = userCoinChangeService.addAttendanceCoin(user); assertThat(beforeCoin + coinIncrement).isEqualTo(user.getGgCoin()); - assertThat(coinPolicyRepository.findTopByOrderByCreatedAtDesc().getAttendance()).isEqualTo(coinIncrement); + assertThat(coinPolicyRepository.findTopByOrderByCreatedAtDesc() + .orElseThrow(() -> new CoinPolicyNotFoundException()).getAttendance()).isEqualTo(coinIncrement); System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); try{ @@ -139,7 +141,8 @@ void addNormalGameService() { UserGameCoinResultDto userGameCoinResultDto = userCoinChangeService.addNormalGameCoin(userId); assertThat(user.getGgCoin()).isEqualTo(userGameCoinResultDto.getAfterCoin()); - assertThat(coinPolicyRepository.findTopByOrderByCreatedAtDesc().getNormal()).isEqualTo(userGameCoinResultDto.getCoinIncrement()); + assertThat(coinPolicyRepository.findTopByOrderByCreatedAtDesc() + .orElseThrow(() -> new CoinPolicyNotFoundException()).getNormal()).isEqualTo(userGameCoinResultDto.getCoinIncrement()); System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); } @@ -151,7 +154,8 @@ void addRankWinGameService() { UserGameCoinResultDto userGameCoinResultDto = userCoinChangeService.addRankGameCoin(3606L, user.getId());//본인의 게임Id와 id 값 assertThat(user.getGgCoin()).isEqualTo(userGameCoinResultDto.getAfterCoin()); - assertThat(coinPolicyRepository.findTopByOrderByCreatedAtDesc().getRankWin()).isEqualTo(userGameCoinResultDto.getCoinIncrement()); + assertThat(coinPolicyRepository.findTopByOrderByCreatedAtDesc() + .orElseThrow(() -> new CoinPolicyNotFoundException()).getRankWin()).isEqualTo(userGameCoinResultDto.getCoinIncrement()); System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); } @@ -163,7 +167,8 @@ void addRankLoseGameService() { UserGameCoinResultDto userGameCoinResultDto = userCoinChangeService.addRankGameCoin(3689L, user.getId()); assertThat(user.getGgCoin()).isEqualTo(userGameCoinResultDto.getAfterCoin()); - assertThat(coinPolicyRepository.findTopByOrderByCreatedAtDesc().getRankLose()).isEqualTo(userGameCoinResultDto.getCoinIncrement()); + assertThat(coinPolicyRepository.findTopByOrderByCreatedAtDesc() + .orElseThrow(() -> new CoinPolicyNotFoundException()).getRankLose()).isEqualTo(userGameCoinResultDto.getCoinIncrement()); System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); } } \ No newline at end of file From 0befb635a6c54ea52444b74a272afec49d5c06d7 Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Mon, 18 Sep 2023 22:57:59 +0900 Subject: [PATCH 245/273] =?UTF-8?q?[style]=20GGBE4-80=20FeedbackRequestDto?= =?UTF-8?q?=20valid=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/feedback/dto/FeedbackRequestDto.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/domain/feedback/dto/FeedbackRequestDto.java b/src/main/java/com/gg/server/domain/feedback/dto/FeedbackRequestDto.java index 3755c23aa..3bccca5d5 100644 --- a/src/main/java/com/gg/server/domain/feedback/dto/FeedbackRequestDto.java +++ b/src/main/java/com/gg/server/domain/feedback/dto/FeedbackRequestDto.java @@ -11,9 +11,9 @@ @Getter @NoArgsConstructor public class FeedbackRequestDto { - @NotNull(message = "plz. content") + @NotNull(message = "plz. not null FeedbackType") private FeedbackType category; - @NotNull(message = "plz. content") + @NotNull(message = "plz. not null content") @Length(max = 600, message = "plz. maxSizeMessage 600") private String content; From 709e2344197737a129dd26b398c209c0d0181b0f Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Mon, 18 Sep 2023 23:37:44 +0900 Subject: [PATCH 246/273] =?UTF-8?q?[style]=20GGBE4-80=20FeedbackService=20?= =?UTF-8?q?=EB=B9=8C=EB=8D=94=20=ED=8C=A8=ED=84=B4=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/domain/feedback/service/FeedbackService.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/com/gg/server/domain/feedback/service/FeedbackService.java b/src/main/java/com/gg/server/domain/feedback/service/FeedbackService.java index 1075f538f..40ee00ba5 100644 --- a/src/main/java/com/gg/server/domain/feedback/service/FeedbackService.java +++ b/src/main/java/com/gg/server/domain/feedback/service/FeedbackService.java @@ -20,11 +20,7 @@ public class FeedbackService { public void addFeedback(FeedbackRequestDto feedbackRequestDto, Long userId) { User user = userRepository.findById(userId).orElseThrow(() -> new UsernameNotFoundException("User" + userId)); - Feedback feedback = Feedback.builder() - .user(user) - .category(feedbackRequestDto.getCategory()) - .content(feedbackRequestDto.getContent()) - .build(); + Feedback feedback = new Feedback(user, feedbackRequestDto.getCategory(), feedbackRequestDto.getContent()); feedbackRepository.save(feedback); } } From 3ccbda8c5f5f172ead339535530d2bb8de9d43ec Mon Sep 17 00:00:00 2001 From: fefe2200 Date: Tue, 19 Sep 2023 00:02:34 +0900 Subject: [PATCH 247/273] =?UTF-8?q?[feat]=20GGBE4-80=20CoinHistoryReposito?= =?UTF-8?q?ry=20findFirstByOrderByIdDesc()=20optional=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20=EB=B0=8F=20exception=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20?= =?UTF-8?q?=EB=85=B8=EC=85=98=20=EC=97=90=EB=9F=AC=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=AC=B8=EC=84=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coin/data/CoinHistoryRepository.java | 3 +- .../CoinHistoryNotFoundException.java | 10 +++++++ .../gg/server/global/exception/ErrorCode.java | 3 ++ .../service/UserCoinChangeServiceTest.java | 28 +++++++++++++------ 4 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/gg/server/domain/coin/exception/CoinHistoryNotFoundException.java diff --git a/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java b/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java index 934ce06c4..a3f11bae5 100644 --- a/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java +++ b/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java @@ -10,12 +10,13 @@ import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; public interface CoinHistoryRepository extends JpaRepository { @Query("SELECT CASE WHEN COUNT(ch) > 0 THEN true ELSE false END FROM CoinHistory ch WHERE ch.user = :user AND ch.history = :history AND ch.createdAt >= :startOfDay AND ch.createdAt <= :endOfDay") boolean existsUserAttendedCheckToday(@Param("user") User user, @Param("history") String history, @Param("startOfDay") LocalDateTime startOfDay, @Param("endOfDay") LocalDateTime endOfDay); - CoinHistory findFirstByOrderByIdDesc(); + Optional findFirstByOrderByIdDesc(); List findAllByUserOrderByIdDesc(User user); diff --git a/src/main/java/com/gg/server/domain/coin/exception/CoinHistoryNotFoundException.java b/src/main/java/com/gg/server/domain/coin/exception/CoinHistoryNotFoundException.java new file mode 100644 index 000000000..c8e0710c5 --- /dev/null +++ b/src/main/java/com/gg/server/domain/coin/exception/CoinHistoryNotFoundException.java @@ -0,0 +1,10 @@ +package com.gg.server.domain.coin.exception; + +import com.gg.server.global.exception.ErrorCode; +import com.gg.server.global.exception.custom.CustomRuntimeException; + +public class CoinHistoryNotFoundException extends CustomRuntimeException { + public CoinHistoryNotFoundException() { + super(ErrorCode.COIN_HISTORY_NOT_FOUND.getMessage(), ErrorCode.COIN_HISTORY_NOT_FOUND); + } +} diff --git a/src/main/java/com/gg/server/global/exception/ErrorCode.java b/src/main/java/com/gg/server/global/exception/ErrorCode.java index 8d781cfae..2426eed1e 100644 --- a/src/main/java/com/gg/server/global/exception/ErrorCode.java +++ b/src/main/java/com/gg/server/global/exception/ErrorCode.java @@ -24,6 +24,9 @@ public enum ErrorCode { //coinPolicy CoinPolicy_NOT_FOUND(404, "CP100", "COINPOLICY NOT FOUND"), + //coinHistory + COIN_HISTORY_NOT_FOUND(404, "CH100", "COIN HISTORY NOT FOUND"), + //season SEASON_NOT_FOUND(404, "SE100", "SEASON NOT FOUND"), SEASON_FORBIDDEN(400, "SE500", "SEASON FORBIDDEN ERROR"), diff --git a/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java b/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java index 84e52623e..0ff7aec9e 100644 --- a/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java +++ b/src/test/java/com/gg/server/domain/coin/service/UserCoinChangeServiceTest.java @@ -4,6 +4,7 @@ import com.gg.server.domain.coin.data.CoinPolicy; import com.gg.server.domain.coin.data.CoinPolicyRepository; import com.gg.server.domain.coin.dto.UserGameCoinResultDto; +import com.gg.server.domain.coin.exception.CoinHistoryNotFoundException; import com.gg.server.domain.coin.exception.CoinPolicyNotFoundException; import com.gg.server.domain.item.data.Item; import com.gg.server.domain.item.data.ItemRepository; @@ -68,7 +69,8 @@ void addAttendanceCoin() { assertThat(beforeCoin + coinIncrement).isEqualTo(user.getGgCoin()); assertThat(coinPolicyRepository.findTopByOrderByCreatedAtDesc() .orElseThrow(() -> new CoinPolicyNotFoundException()).getAttendance()).isEqualTo(coinIncrement); - System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); + System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc() + .orElseThrow(() -> new CoinHistoryNotFoundException()).getHistory()); try{ coinIncrement = userCoinChangeService.addAttendanceCoin(user); @@ -94,8 +96,11 @@ void purchaseItemCoin() { userCoinChangeService.purchaseItemCoin(item, item.getPrice(), userId); assertThat(beforeCoin).isEqualTo(user.getGgCoin() + item.getPrice()); - System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()+coinHistoryRepository.findFirstByOrderByIdDesc().getAmount()); - System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); + System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc() + .orElseThrow(() -> new CoinHistoryNotFoundException()).getHistory()+coinHistoryRepository.findFirstByOrderByIdDesc() + .orElseThrow(() -> new CoinHistoryNotFoundException()).getAmount()); + System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc() + .orElseThrow(() -> new CoinHistoryNotFoundException()).getHistory()); try{ userCoinChangeService.purchaseItemCoin(item, item.getPrice(), userId); }catch (Exception e){ @@ -120,8 +125,12 @@ void giftItemCoin() { userCoinChangeService.giftItemCoin(item, item.getPrice(), user, user); assertThat(beforeCoin).isEqualTo(user.getGgCoin() + item.getPrice()); - System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()+coinHistoryRepository.findFirstByOrderByIdDesc().getAmount()); - System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); + System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc() + .orElseThrow(() -> new CoinHistoryNotFoundException()).getHistory() + +coinHistoryRepository.findFirstByOrderByIdDesc() + .orElseThrow(() -> new CoinHistoryNotFoundException()).getAmount()); + System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc() + .orElseThrow(() -> new CoinHistoryNotFoundException()).getHistory()); try{ userCoinChangeService.giftItemCoin(item, item.getPrice(), user, user); @@ -143,7 +152,8 @@ void addNormalGameService() { assertThat(user.getGgCoin()).isEqualTo(userGameCoinResultDto.getAfterCoin()); assertThat(coinPolicyRepository.findTopByOrderByCreatedAtDesc() .orElseThrow(() -> new CoinPolicyNotFoundException()).getNormal()).isEqualTo(userGameCoinResultDto.getCoinIncrement()); - System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); + System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc() + .orElseThrow(() -> new CoinHistoryNotFoundException()).getHistory()); } @Test @@ -156,7 +166,8 @@ void addRankWinGameService() { assertThat(user.getGgCoin()).isEqualTo(userGameCoinResultDto.getAfterCoin()); assertThat(coinPolicyRepository.findTopByOrderByCreatedAtDesc() .orElseThrow(() -> new CoinPolicyNotFoundException()).getRankWin()).isEqualTo(userGameCoinResultDto.getCoinIncrement()); - System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); + System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc() + .orElseThrow(() -> new CoinHistoryNotFoundException()).getHistory()); } @Test @@ -169,6 +180,7 @@ void addRankLoseGameService() { assertThat(user.getGgCoin()).isEqualTo(userGameCoinResultDto.getAfterCoin()); assertThat(coinPolicyRepository.findTopByOrderByCreatedAtDesc() .orElseThrow(() -> new CoinPolicyNotFoundException()).getRankLose()).isEqualTo(userGameCoinResultDto.getCoinIncrement()); - System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc().getHistory()); + System.out.println(coinHistoryRepository.findFirstByOrderByIdDesc() + .orElseThrow(() -> new CoinHistoryNotFoundException()).getHistory()); } } \ No newline at end of file From 6ae323ebc766404774b2e506094e562f4889f2d5 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Tue, 19 Sep 2023 00:50:46 +0900 Subject: [PATCH 248/273] =?UTF-8?q?[REFACTOR]=20=EC=B9=B4=EC=B9=B4?= =?UTF-8?q?=EC=98=A4=20=EC=9C=A0=EC=A0=80=20=EC=97=90=EB=9F=AC=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/user/service/UserService.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 1a637f85e..c24e605ca 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -13,6 +13,7 @@ import com.gg.server.domain.pchange.data.PChangeRepository; import com.gg.server.domain.pchange.exception.PChangeNotExistException; import com.gg.server.domain.rank.data.Rank; +import com.gg.server.domain.rank.exception.RankNotFoundException; import com.gg.server.domain.rank.exception.RedisDataNotFoundException; import com.gg.server.domain.rank.redis.RankRedis; import com.gg.server.domain.rank.redis.RankRedisRepository; @@ -264,16 +265,13 @@ public UserNormalDetailResponseDto getUserNormalDetail(UserDto user) { Boolean isAdmin = user.getRoleType() == RoleType.ADMIN; Boolean isAttended = coinHistoryService.hasAttendedToday(loginUser); Integer level = ExpLevelCalculator.getLevel(user.getTotalExp()); - Tier tier = rankFindService.findByUserIdAndSeasonId(user.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); - /* 티어가 존재하지 않는 일반 유저일때 : None, None 처리해서 보내기*/ - if (tier == null) { - String tierName = "NONE"; - String tierImageUri = "NONE"; - return new UserNormalDetailResponseDto(loginUser.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, loginUser.getEdge(), tierName, tierImageUri, level); + try { + Tier tier = rankFindService.findByUserIdAndSeasonId(user.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); + return new UserNormalDetailResponseDto(user.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, loginUser.getEdge(), tier.getName(), tier.getImageUri(), level); + } catch (RankNotFoundException ex) { + // 카카오 유저나 Rank가 없는 유저 + return new UserNormalDetailResponseDto(user.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, loginUser.getEdge(), "NONE", "NONE", level); } - String tierName = tier.getName(); - String tierImageUri = tier.getImageUri(); - return new UserNormalDetailResponseDto(user.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, loginUser.getEdge(), tierName, tierImageUri, level); } @Transactional() From 540c9df0a851915813d65a851c93ef52c2170699 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Tue, 19 Sep 2023 03:57:02 +0900 Subject: [PATCH 249/273] =?UTF-8?q?[FIX]=20ItemStoreResponseDto=20item.get?= =?UTF-8?q?Type().toString()=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/item/dto/ItemStoreResponseDto.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/domain/item/dto/ItemStoreResponseDto.java b/src/main/java/com/gg/server/domain/item/dto/ItemStoreResponseDto.java index 7b693dcf0..4ecc4bb46 100644 --- a/src/main/java/com/gg/server/domain/item/dto/ItemStoreResponseDto.java +++ b/src/main/java/com/gg/server/domain/item/dto/ItemStoreResponseDto.java @@ -1,6 +1,7 @@ package com.gg.server.domain.item.dto; import com.gg.server.domain.item.data.Item; +import com.gg.server.domain.item.type.ItemType; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; @@ -13,7 +14,7 @@ public class ItemStoreResponseDto { private String itemName; private String mainContent; private String subContent; - private String itemType; + private ItemType itemType; private String imageUri; private Integer originalPrice; private Integer discount; @@ -24,7 +25,7 @@ public ItemStoreResponseDto(Item item) { this.itemName = item.getName(); this.mainContent = item.getMainContent(); this.subContent = item.getSubContent(); - this.itemType = item.getType().toString(); + this.itemType = item.getType(); this.imageUri = item.getImageUri(); this.originalPrice = item.getPrice(); this.discount = item.getDiscount(); From 7505bc4b95bd5e04a0a0625b8e3d93cb2d9ccfa8 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Tue, 19 Sep 2023 09:14:50 +0900 Subject: [PATCH 250/273] =?UTF-8?q?[REFACTOR]=20=EC=B9=B4=EC=B9=B4?= =?UTF-8?q?=EC=98=A4=20=EC=9C=A0=EC=A0=80=20=EC=97=90=EB=9F=AC=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gg/server/domain/user/service/UserService.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index c24e605ca..9cdfb5e80 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -26,6 +26,8 @@ import com.gg.server.domain.season.data.Season; import com.gg.server.domain.season.service.SeasonFindService; import com.gg.server.domain.tier.data.Tier; +import com.gg.server.domain.tier.data.TierRepository; +import com.gg.server.domain.tier.exception.TierNotFoundException; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserImage; import com.gg.server.domain.user.data.UserImageRepository; @@ -72,6 +74,7 @@ public class UserService { private final AsyncNewUserImageUploader asyncNewUserImageUploader; private final UserImageRepository userImageRepository; private final ItemService itemService; + private final TierRepository tierRepository; /** * @param intraId @@ -270,7 +273,8 @@ public UserNormalDetailResponseDto getUserNormalDetail(UserDto user) { return new UserNormalDetailResponseDto(user.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, loginUser.getEdge(), tier.getName(), tier.getImageUri(), level); } catch (RankNotFoundException ex) { // 카카오 유저나 Rank가 없는 유저 - return new UserNormalDetailResponseDto(user.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, loginUser.getEdge(), "NONE", "NONE", level); + Tier tier = tierRepository.findStartTier().orElseThrow(TierNotFoundException::new); + return new UserNormalDetailResponseDto(user.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, loginUser.getEdge(), tier.getName(), tier.getImageUri(), level); } } From e6dc8e34b7d7bbaca4f96512bbc58535fb467397 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Tue, 19 Sep 2023 16:37:49 +0900 Subject: [PATCH 251/273] =?UTF-8?q?[FIX]=20UsernameNotFoundException=20?= =?UTF-8?q?=EC=A4=91=20'name'=20=EC=82=AD=EC=A0=9C=20+=20=EB=9E=8C?= =?UTF-8?q?=EB=8B=A4=EC=97=90=EC=84=9C=20=EB=A9=94=EC=86=8C=EB=93=9C=20?= =?UTF-8?q?=EC=B0=B8=EC=A1=B0=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/admin/coin/service/CoinAdminService.java | 2 +- .../admin/coin/service/CoinPolicyAdminService.java | 2 +- .../gg/server/admin/game/service/GameAdminService.java | 2 +- .../gg/server/admin/noti/service/NotiAdminService.java | 2 +- .../gg/server/admin/user/service/UserAdminService.java | 4 ++-- .../domain/coin/service/UserCoinChangeService.java | 6 +++--- .../domain/feedback/service/FeedbackService.java | 4 ++-- .../com/gg/server/domain/item/service/ItemService.java | 4 ++-- .../domain/megaphone/service/MegaphoneService.java | 8 ++++---- .../com/gg/server/domain/noti/service/NotiService.java | 10 +++++----- .../gg/server/domain/user/service/UserCoinService.java | 2 +- .../gg/server/domain/user/service/UserFindService.java | 4 ++-- .../com/gg/server/domain/user/service/UserService.java | 9 ++++----- .../security/service/CustomUserDetailsService.java | 4 ++-- 14 files changed, 31 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/gg/server/admin/coin/service/CoinAdminService.java b/src/main/java/com/gg/server/admin/coin/service/CoinAdminService.java index fd440e85c..2c2237f26 100644 --- a/src/main/java/com/gg/server/admin/coin/service/CoinAdminService.java +++ b/src/main/java/com/gg/server/admin/coin/service/CoinAdminService.java @@ -18,7 +18,7 @@ public class CoinAdminService { @Transactional public void updateUserCoin(CoinUpdateRequestDto coinUpdateRequestDto) { - User user = userRepository.findByIntraId(coinUpdateRequestDto.getIntraId()).orElseThrow(() -> new UserNotFoundException()); + User user = userRepository.findByIntraId(coinUpdateRequestDto.getIntraId()).orElseThrow(UserNotFoundException::new); user.addGgCoin(coinUpdateRequestDto.getChange()); coinHistoryService.addCoinHistory(new CoinHistory(user, coinUpdateRequestDto.getContent(), coinUpdateRequestDto.getChange())); } diff --git a/src/main/java/com/gg/server/admin/coin/service/CoinPolicyAdminService.java b/src/main/java/com/gg/server/admin/coin/service/CoinPolicyAdminService.java index b82aed7a6..8311b72e7 100644 --- a/src/main/java/com/gg/server/admin/coin/service/CoinPolicyAdminService.java +++ b/src/main/java/com/gg/server/admin/coin/service/CoinPolicyAdminService.java @@ -35,7 +35,7 @@ public CoinPolicyAdminListResponseDto findAllCoinPolicy(Pageable pageable) { @Transactional public void addCoinPolicy(UserDto userDto, CoinPolicyAdminAddDto addDto){ - User user = userAdminRepository.findByIntraId(userDto.getIntraId()).orElseThrow(() -> new UserNotFoundException()); + User user = userAdminRepository.findByIntraId(userDto.getIntraId()).orElseThrow(UserNotFoundException::new); CoinPolicy coinPolicy = CoinPolicy.from(user, addDto); coinPolicyAdminRepository.save(coinPolicy); diff --git a/src/main/java/com/gg/server/admin/game/service/GameAdminService.java b/src/main/java/com/gg/server/admin/game/service/GameAdminService.java index e64fafc1f..af97c7a0c 100644 --- a/src/main/java/com/gg/server/admin/game/service/GameAdminService.java +++ b/src/main/java/com/gg/server/admin/game/service/GameAdminService.java @@ -68,7 +68,7 @@ public List getGameLogList(List gameIdList){ @Transactional(readOnly = true) public GameLogListAdminResponseDto findGamesByIntraId(String intraId, Pageable pageable){ - User user = userAdminRepository.findByIntraId(intraId).orElseThrow(() -> new UserNotFoundException()); + User user = userAdminRepository.findByIntraId(intraId).orElseThrow(UserNotFoundException::new); List pChangeList = pChangeRepository.findAllByUserId(user.getId()); List gameList = new ArrayList<>(); diff --git a/src/main/java/com/gg/server/admin/noti/service/NotiAdminService.java b/src/main/java/com/gg/server/admin/noti/service/NotiAdminService.java index 82e83a479..82b1e6d5b 100644 --- a/src/main/java/com/gg/server/admin/noti/service/NotiAdminService.java +++ b/src/main/java/com/gg/server/admin/noti/service/NotiAdminService.java @@ -27,7 +27,7 @@ public void sendAnnounceNotiToUser(SendNotiAdminRequestDto sendNotiAdminRequestD String intraId = sendNotiAdminRequestDto.getIntraId(); User user = userAdminRepository.findByIntraId(intraId) - .orElseThrow(() -> new UserNotFoundException()); + .orElseThrow(UserNotFoundException::new); notiAdminRepository.save(new Noti(user, NotiType.ANNOUNCE, message, false)); } diff --git a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java index ca7f84e61..65ce4f42d 100644 --- a/src/main/java/com/gg/server/admin/user/service/UserAdminService.java +++ b/src/main/java/com/gg/server/admin/user/service/UserAdminService.java @@ -73,7 +73,7 @@ public UserSearchAdminResponseDto findByPartsOfIntraId(String intraId, Pageable @Transactional(readOnly = true) public UserDetailAdminResponseDto getUserDetailByIntraId(String intraId) { - User user = userAdminRepository.findByIntraId(intraId).orElseThrow(() -> new UserNotFoundException()); + User user = userAdminRepository.findByIntraId(intraId).orElseThrow(UserNotFoundException::new); Season currSeason = seasonAdminRepository.findCurrentSeason(LocalDateTime.now()).orElseThrow(() -> new SeasonNotFoundException()); try { RankRedis userCurrRank = rankRedisRepository.findRankByUserId(RedisKeyManager.getHashKey(currSeason.getId()), @@ -89,7 +89,7 @@ public void updateUserDetail(String intraId, UserUpdateAdminRequestDto userUpdateAdminRequestDto, MultipartFile userImageFile) throws IOException{ Season currSeason = seasonAdminRepository.findCurrentSeason(LocalDateTime.now()).orElseThrow(() -> new SeasonNotFoundException()); - User user = userAdminRepository.findByIntraId(intraId).orElseThrow(() -> new UserNotFoundException()); + User user = userAdminRepository.findByIntraId(intraId).orElseThrow(UserNotFoundException::new); user.modifyUserDetail(userUpdateAdminRequestDto); if (userImageFile != null) diff --git a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java index dce2b1830..9cbcda794 100644 --- a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java +++ b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java @@ -42,7 +42,7 @@ public int addAttendanceCoin(User user){ public void purchaseItemCoin(Item item, Integer price, Long userId){ User user = userRepository.findById(userId) - .orElseThrow(() -> new UserNotFoundException()); + .orElseThrow(UserNotFoundException::new); user.payGgCoin(price); @@ -59,7 +59,7 @@ public void giftItemCoin(Item item, Integer price, User user, User giftTarget){ @Transactional public UserGameCoinResultDto addNormalGameCoin(Long userId) { - User user = userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException()); + User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new); int coinIncrement = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getNormal(); user.addGgCoin(coinIncrement); @@ -69,7 +69,7 @@ public UserGameCoinResultDto addNormalGameCoin(Long userId) { @Transactional public UserGameCoinResultDto addRankGameCoin(Long gameId, Long userId) { - User user = userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException()); + User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new); int coinIncrement; if (userIsWinner(gameId, user)) diff --git a/src/main/java/com/gg/server/domain/feedback/service/FeedbackService.java b/src/main/java/com/gg/server/domain/feedback/service/FeedbackService.java index 1075f538f..efee27c60 100644 --- a/src/main/java/com/gg/server/domain/feedback/service/FeedbackService.java +++ b/src/main/java/com/gg/server/domain/feedback/service/FeedbackService.java @@ -5,8 +5,8 @@ import com.gg.server.domain.feedback.dto.FeedbackRequestDto; import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; +import com.gg.server.domain.user.exception.UserNotFoundException; import lombok.RequiredArgsConstructor; -import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -18,7 +18,7 @@ public class FeedbackService { @Transactional public void addFeedback(FeedbackRequestDto feedbackRequestDto, Long userId) { - User user = userRepository.findById(userId).orElseThrow(() -> new UsernameNotFoundException("User" + userId)); + User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new); Feedback feedback = Feedback.builder() .user(user) diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index 93297bdf3..d628c1ad7 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -94,14 +94,14 @@ public void giftItem(Long itemId, String ownerId, UserDto userDto) { } User payUser = userRepository.findById(userDto.getId()) - .orElseThrow(() -> new UserNotFoundException()); + .orElseThrow(UserNotFoundException::new); if (payUser.getRoleType() == RoleType.GUEST) { throw new KakaoPurchaseException(); } User owner = userRepository.findByIntraId(ownerId) - .orElseThrow(() -> new UserNotFoundException()); + .orElseThrow(UserNotFoundException::new); if (owner.getRoleType() == RoleType.GUEST) { throw new KakaoGiftException(); diff --git a/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java b/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java index 4249e2b18..d3f258dde 100644 --- a/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java +++ b/src/main/java/com/gg/server/domain/megaphone/service/MegaphoneService.java @@ -20,9 +20,9 @@ import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.type.RoleType; import lombok.RequiredArgsConstructor; -import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -43,7 +43,7 @@ public class MegaphoneService { @Transactional public void useMegaphone(MegaphoneUseRequestDto megaphoneUseRequestDto, UserDto user) { - User loginUser = userRepository.findById(user.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + user.getId())); + User loginUser = userRepository.findById(user.getId()).orElseThrow(UserNotFoundException::new); if (LocalTime.now().isAfter(LocalTime.of(23, 55)) || LocalTime.now().isBefore(LocalTime.of(0, 5))) { throw new MegaphoneTimeException(); } @@ -75,7 +75,7 @@ public void setMegaphoneList(LocalDate today) { @Transactional public void deleteMegaphone(Long megaphoneId, UserDto user) { - User loginUser = userRepository.findById(user.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + user.getId())); + User loginUser = userRepository.findById(user.getId()).orElseThrow(UserNotFoundException::new); Megaphone megaphone = megaphoneRepository.findById(megaphoneId).orElseThrow(MegaphoneNotFoundException::new); Receipt receipt = megaphone.getReceipt(); if (!user.getRoleType().equals(RoleType.ADMIN)) { @@ -89,7 +89,7 @@ public void deleteMegaphone(Long megaphoneId, UserDto user) { } public MegaphoneDetailResponseDto getMegaphoneDetail(Long receiptId, UserDto user) { - User loginUser = userRepository.findById(user.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + user.getId())); + User loginUser = userRepository.findById(user.getId()).orElseThrow(UserNotFoundException::new); Receipt receipt = receiptRepository.findById(receiptId).orElseThrow(ReceiptNotFoundException::new); itemService.checkItemType(receipt, ItemType.MEGAPHONE); itemService.checkItemOwner(loginUser, receipt); diff --git a/src/main/java/com/gg/server/domain/noti/service/NotiService.java b/src/main/java/com/gg/server/domain/noti/service/NotiService.java index ef01f10f3..f1a019265 100644 --- a/src/main/java/com/gg/server/domain/noti/service/NotiService.java +++ b/src/main/java/com/gg/server/domain/noti/service/NotiService.java @@ -8,10 +8,10 @@ import com.gg.server.domain.user.data.User; import com.gg.server.domain.user.data.UserRepository; import com.gg.server.domain.user.dto.UserDto; +import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.global.exception.ErrorCode; import com.gg.server.global.exception.custom.NotExistException; import lombok.AllArgsConstructor; -import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -29,7 +29,7 @@ public class NotiService { @Transactional(readOnly = true) public List findNotiByUser(UserDto userDto) { - User user = userRepository.findById(userDto.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + userDto.getId())); + User user = userRepository.findById(userDto.getId()).orElseThrow(UserNotFoundException::new); List notiList = notiRepository.findAllByUserOrderByIdDesc(user); List notiResponseDtoList = notiList.stream().map(NotiResponseDto::from).collect(Collectors.toList()); return notiResponseDtoList; @@ -37,14 +37,14 @@ public List findNotiByUser(UserDto userDto) { @Transactional public NotiDto findNotiByIdAndUser(UserDto userDto, Long notiId) { - User user = userRepository.findById(userDto.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + userDto.getId())); + User user = userRepository.findById(userDto.getId()).orElseThrow(UserNotFoundException::new); Noti noti = notiRepository.findByIdAndUser(notiId, user).orElseThrow(() -> new NotExistException("요청한 알림을 찾을 수 없습니다.", ErrorCode.NOT_FOUND)); return NotiDto.from(noti); } @Transactional public void modifyNotiCheckedByUser(UserDto userDto) { - User user = userRepository.findById(userDto.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + userDto.getId())); + User user = userRepository.findById(userDto.getId()).orElseThrow(UserNotFoundException::new); List notis = notiRepository.findAllByUser(user); notis.forEach(noti -> {noti.modifyIsChecked(true);}); } @@ -56,7 +56,7 @@ public void removeNotiById(Long notiId) { @Transactional public void removeAllNotisByUser(UserDto userDto) { - User user = userRepository.findById(userDto.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + userDto.getId())); + User user = userRepository.findById(userDto.getId()).orElseThrow(UserNotFoundException::new); notiRepository.deleteAllByUser(user); } diff --git a/src/main/java/com/gg/server/domain/user/service/UserCoinService.java b/src/main/java/com/gg/server/domain/user/service/UserCoinService.java index b458da43d..58fcf7407 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserCoinService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserCoinService.java @@ -33,7 +33,7 @@ public UserCoinResponseDto getUserCoin(String intraId) { @Transactional(readOnly = true) public UserCoinHistoryListResponseDto getUserCoinHistory(Pageable pageable, String intraId) { - User user = userRepository.findByIntraId(intraId).orElseThrow(() -> new UserNotFoundException()); + User user = userRepository.findByIntraId(intraId).orElseThrow(UserNotFoundException::new); Page coinHistories = coinHistoryRepository.findAllByUserOrderByIdDesc(user, pageable); Page coinHistoryResponseDtos = coinHistories.map(CoinHistoryResponseDto::new); diff --git a/src/main/java/com/gg/server/domain/user/service/UserFindService.java b/src/main/java/com/gg/server/domain/user/service/UserFindService.java index 304bc9d72..59515de0f 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserFindService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserFindService.java @@ -24,12 +24,12 @@ public class UserFindService { @Transactional(readOnly = true) public User findUserById(Long userId) { - return userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException()); + return userRepository.findById(userId).orElseThrow(UserNotFoundException::new); } @Transactional(readOnly = true) public User findByIntraId(String intraId){ - return userRepository.findByIntraId(intraId).orElseThrow(() -> new UserNotFoundException()); + return userRepository.findByIntraId(intraId).orElseThrow(UserNotFoundException::new); } @Transactional(readOnly = true) diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 1a637f85e..c50ad5dd9 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -39,7 +39,6 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; -import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -206,12 +205,12 @@ public UserRankResponseDto getUserRankDetail(String targetUserIntraId, Long seas } public User getUser(Long userId) { - return userRepository.findById(userId).orElseThrow(() -> new UsernameNotFoundException("User" + userId)); + return userRepository.findById(userId).orElseThrow(UserNotFoundException::new); } @Transactional public void deleteKakaoId(Long userId) { - User user = userRepository.findById(userId).orElseThrow(() -> new UserNotFoundException()); + User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new); user.updateKakaoId(null); } @@ -251,7 +250,7 @@ public UserImageResponseDto getRankedUserImagesByExp(PageRequest pageRequest) { @Transactional public UserAttendanceResponseDto attendUser(Long userId) { - User user = userRepository.findById(userId).orElseThrow(() -> new UsernameNotFoundException("User" + userId)); + User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new); int plus = userCoinChangeService.addAttendanceCoin(user); @@ -260,7 +259,7 @@ public UserAttendanceResponseDto attendUser(Long userId) { @Transactional public UserNormalDetailResponseDto getUserNormalDetail(UserDto user) { - User loginUser = userRepository.findById(user.getId()).orElseThrow(() -> new UsernameNotFoundException("User" + user.getId())); + User loginUser = userRepository.findById(user.getId()).orElseThrow(UserNotFoundException::new); Boolean isAdmin = user.getRoleType() == RoleType.ADMIN; Boolean isAttended = coinHistoryService.hasAttendedToday(loginUser); Integer level = ExpLevelCalculator.getLevel(user.getTotalExp()); diff --git a/src/main/java/com/gg/server/global/security/service/CustomUserDetailsService.java b/src/main/java/com/gg/server/global/security/service/CustomUserDetailsService.java index 7facdf841..a27fd87a2 100644 --- a/src/main/java/com/gg/server/global/security/service/CustomUserDetailsService.java +++ b/src/main/java/com/gg/server/global/security/service/CustomUserDetailsService.java @@ -1,12 +1,12 @@ package com.gg.server.global.security.service; import com.gg.server.domain.user.data.User; +import com.gg.server.domain.user.exception.UserNotFoundException; import com.gg.server.domain.user.service.UserFindService; import com.gg.server.global.security.UserPrincipal; import lombok.RequiredArgsConstructor; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -17,7 +17,7 @@ public class CustomUserDetailsService implements UserDetailsService { private final UserFindService userFindService; @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + public UserDetails loadUserByUsername(String username) throws UserNotFoundException { User user = userFindService.findByIntraId(username); return UserPrincipal.create(user); } From c8917534d985020a8ef70baead8f10c685e23271 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Tue, 19 Sep 2023 17:04:59 +0900 Subject: [PATCH 252/273] =?UTF-8?q?[FIX]=20UserAlreadyAttendanceException?= =?UTF-8?q?=ED=98=95=EC=9D=84=20DuplicationException=EB=A1=9C=20=EC=83=81?= =?UTF-8?q?=EC=86=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/exception/UserAlreadyAttendanceException.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/domain/user/exception/UserAlreadyAttendanceException.java b/src/main/java/com/gg/server/domain/user/exception/UserAlreadyAttendanceException.java index 60a59a849..3e3ce132e 100644 --- a/src/main/java/com/gg/server/domain/user/exception/UserAlreadyAttendanceException.java +++ b/src/main/java/com/gg/server/domain/user/exception/UserAlreadyAttendanceException.java @@ -1,9 +1,9 @@ package com.gg.server.domain.user.exception; import com.gg.server.global.exception.ErrorCode; -import com.gg.server.global.exception.custom.InvalidParameterException; +import com.gg.server.global.exception.custom.DuplicationException; -public class UserAlreadyAttendanceException extends InvalidParameterException { +public class UserAlreadyAttendanceException extends DuplicationException { public UserAlreadyAttendanceException() { super("이미 출석한 유저입니다.", ErrorCode.USER_ALREADY_ATTENDANCE); } From f8f9ebd6e8ece277390633dce1e86a08028bccc2 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Tue, 19 Sep 2023 17:48:26 +0900 Subject: [PATCH 253/273] =?UTF-8?q?[REFACTOR]=20Item=20Builder=20=ED=8C=A8?= =?UTF-8?q?=ED=84=B4=20=EC=88=98=EC=A0=95,=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20return=20=EB=AC=B8=20=EC=A4=84=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/item/service/ItemAdminService.java | 12 ++++----- .../com/gg/server/domain/item/data/Item.java | 26 ------------------- .../domain/user/service/UserService.java | 8 +++--- 3 files changed, 10 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java index 3c04feefa..7fb4a6f49 100644 --- a/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java +++ b/src/main/java/com/gg/server/admin/item/service/ItemAdminService.java @@ -36,12 +36,12 @@ public ItemListResponseDto getAllItemHistory(Pageable pageable) { @Transactional public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, MultipartFile itemImageFile, UserDto user) throws IOException { - Item item = itemAdminRepository.findById(itemId).orElseThrow(() -> new ItemNotFoundException()); - if (item.getIsVisible() == false) { + Item item = itemAdminRepository.findById(itemId).orElseThrow(ItemNotFoundException::new); + if (!item.getIsVisible()) { throw new ItemNotAvailableException(); } item.setVisibility(user.getIntraId()); - Item newItem = new Item(itemUpdateRequestDto, user.getIntraId()); + Item newItem = new Item(itemUpdateRequestDto, user.getIntraId(), null); if (itemImageFile != null) asyncNewItemImageUploader.upload(newItem, itemImageFile); itemAdminRepository.save(newItem); @@ -51,8 +51,8 @@ public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, @Transactional public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, UserDto user) { - Item item = itemAdminRepository.findById(itemId).orElseThrow(() -> new ItemNotFoundException()); - if (item.getIsVisible() == false) { + Item item = itemAdminRepository.findById(itemId).orElseThrow(ItemNotFoundException::new); + if (!item.getIsVisible()) { throw new ItemNotAvailableException(); } item.setVisibility(user.getIntraId()); @@ -62,7 +62,7 @@ public void updateItem(Long itemId, ItemUpdateRequestDto itemUpdateRequestDto, @Transactional public void deleteItem(Long itemId, UserDto user) { - Item item = itemAdminRepository.findById(itemId).orElseThrow(() -> new ItemNotFoundException()); + Item item = itemAdminRepository.findById(itemId).orElseThrow(ItemNotFoundException::new); item.setVisibility(user.getIntraId()); } } diff --git a/src/main/java/com/gg/server/domain/item/data/Item.java b/src/main/java/com/gg/server/domain/item/data/Item.java index e0eca31b7..651de5fb6 100644 --- a/src/main/java/com/gg/server/domain/item/data/Item.java +++ b/src/main/java/com/gg/server/domain/item/data/Item.java @@ -55,19 +55,6 @@ public class Item { @Column(name = "deleter_intra_id", length = 10) private String deleterIntraId; - public Item(String name, String mainContent, String subContent, String imageUri, Integer price, - Boolean isVisible, Integer discount, ItemType type, LocalDateTime createdAt) { - this.name = name; - this.mainContent = mainContent; - this.subContent = subContent; - this.imageUri = imageUri; - this.price = price; - this.isVisible = isVisible; - this.discount = discount; - this.type = type; - this.createdAt = createdAt; - } - public Item(String name, String mainContent, String subContent, String imageUri, Integer price, Boolean isVisible, Integer discount, ItemType type, LocalDateTime createdAt, String creatorIntraId) { this.name = name; @@ -96,19 +83,6 @@ public Item(ItemUpdateRequestDto updateRequestDto, String creatorIntraId, String this.type = updateRequestDto.getItemType(); } - @Builder - public Item(ItemUpdateRequestDto updateRequestDto, String creatorIntraId) { - this.name = updateRequestDto.getName(); - this.mainContent = updateRequestDto.getMainContent(); - this.subContent = updateRequestDto.getSubContent(); - this.price = updateRequestDto.getPrice(); - this.discount = updateRequestDto.getDiscount(); - this.isVisible = true; - this.creatorIntraId = creatorIntraId; - this.createdAt = LocalDateTime.now(); - this.type = updateRequestDto.getItemType(); - } - public void imageUpdate(String imageUri) { this.imageUri = imageUri; } diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 9cdfb5e80..86fca5a38 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -268,14 +268,14 @@ public UserNormalDetailResponseDto getUserNormalDetail(UserDto user) { Boolean isAdmin = user.getRoleType() == RoleType.ADMIN; Boolean isAttended = coinHistoryService.hasAttendedToday(loginUser); Integer level = ExpLevelCalculator.getLevel(user.getTotalExp()); + Tier tier; try { - Tier tier = rankFindService.findByUserIdAndSeasonId(user.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); - return new UserNormalDetailResponseDto(user.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, loginUser.getEdge(), tier.getName(), tier.getImageUri(), level); + tier = rankFindService.findByUserIdAndSeasonId(user.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); } catch (RankNotFoundException ex) { // 카카오 유저나 Rank가 없는 유저 - Tier tier = tierRepository.findStartTier().orElseThrow(TierNotFoundException::new); - return new UserNormalDetailResponseDto(user.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, loginUser.getEdge(), tier.getName(), tier.getImageUri(), level); + tier = tierRepository.findStartTier().orElseThrow(TierNotFoundException::new); } + return new UserNormalDetailResponseDto(user.getIntraId(), loginUser.getImageUri(), isAdmin, isAttended, loginUser.getEdge(), tier.getName(), tier.getImageUri(), level); } @Transactional() From 85157a73ab12444ca2a487d0afc27f9067811e82 Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Tue, 19 Sep 2023 17:57:21 +0900 Subject: [PATCH 254/273] =?UTF-8?q?[FIX]=20dev=20=EC=99=80=20merge=20(Coin?= =?UTF-8?q?Service=20=EB=B6=80=EB=B6=84=EC=97=90=20=ED=9A=8C=EC=83=89=20?= =?UTF-8?q?=EB=B6=80=EB=B6=84=20=EC=82=AD=EC=A0=9C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gg/server/domain/coin/service/UserCoinChangeService.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java index 9cbcda794..55549e767 100644 --- a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java +++ b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java @@ -1,12 +1,9 @@ package com.gg.server.domain.coin.service; -import com.gg.server.domain.coin.data.CoinHistoryRepository; import com.gg.server.domain.coin.data.CoinPolicyRepository; import com.gg.server.domain.coin.dto.UserGameCoinResultDto; -import com.gg.server.domain.coin.type.HistoryType; import com.gg.server.domain.game.service.GameFindService; import com.gg.server.domain.item.data.Item; -import com.gg.server.domain.item.exception.InsufficientGgcoinException; import com.gg.server.domain.team.data.Team; import com.gg.server.domain.team.data.TeamUser; import com.gg.server.domain.user.data.User; @@ -17,7 +14,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDateTime; import java.util.List; @Service From 3cb7efb6b8ff23f1f6441adfe157f2d8727e345f Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Tue, 19 Sep 2023 18:05:13 +0900 Subject: [PATCH 255/273] [FIX] change <= to < endOfDay --- .../com/gg/server/domain/coin/data/CoinHistoryRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java b/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java index a3f11bae5..358b6c162 100644 --- a/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java +++ b/src/main/java/com/gg/server/domain/coin/data/CoinHistoryRepository.java @@ -13,7 +13,7 @@ import java.util.Optional; public interface CoinHistoryRepository extends JpaRepository { - @Query("SELECT CASE WHEN COUNT(ch) > 0 THEN true ELSE false END FROM CoinHistory ch WHERE ch.user = :user AND ch.history = :history AND ch.createdAt >= :startOfDay AND ch.createdAt <= :endOfDay") + @Query("SELECT CASE WHEN COUNT(ch) > 0 THEN true ELSE false END FROM CoinHistory ch WHERE ch.user = :user AND ch.history = :history AND ch.createdAt >= :startOfDay AND ch.createdAt < :endOfDay") boolean existsUserAttendedCheckToday(@Param("user") User user, @Param("history") String history, @Param("startOfDay") LocalDateTime startOfDay, @Param("endOfDay") LocalDateTime endOfDay); Optional findFirstByOrderByIdDesc(); From 4740755ec7ae39891f45ae6278ec64793e30090e Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Tue, 19 Sep 2023 18:26:13 +0900 Subject: [PATCH 256/273] [FIX] change endOfDay logic --- .../com/gg/server/domain/coin/service/CoinHistoryService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java index f51293cd4..36962a1f9 100644 --- a/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java +++ b/src/main/java/com/gg/server/domain/coin/service/CoinHistoryService.java @@ -64,7 +64,7 @@ public int addRankLoseCoin(User user) { @Transactional(readOnly = true) public boolean hasAttendedToday(User user) { LocalDateTime startOfDay = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0); - LocalDateTime endOfDay = LocalDateTime.now().withHour(23).withMinute(59).withSecond(59); + LocalDateTime endOfDay = startOfDay.plusDays(1); return coinHistoryRepository.existsUserAttendedCheckToday( user, HistoryType.ATTENDANCECOIN.getHistory(), startOfDay, endOfDay); } From 537445cad69d168eb5f9a20d6c10df8af2826d9c Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Tue, 19 Sep 2023 18:36:29 +0900 Subject: [PATCH 257/273] =?UTF-8?q?[CHORE]=20=EC=83=88=EB=A1=9C=EC=9A=B4?= =?UTF-8?q?=20=EB=B0=B0=ED=8F=AC=20=EB=B2=84=EC=A0=84=20=EA=B8=B0=EB=B3=B8?= =?UTF-8?q?=20DB=20SQL=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- version2.sql | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 version2.sql diff --git a/version2.sql b/version2.sql new file mode 100644 index 000000000..f1854e9be --- /dev/null +++ b/version2.sql @@ -0,0 +1,96 @@ +-- item 삽입 -- +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (1, '2023-08-22 14:35:36.000000', 50, '/image/fallBackSrc.jpeg', false, '이미지 변경권', 84, 'taehkwon', 'hyobicho', 'PROFILE_IMAGE', '잘 지내? 프사 바꿨네', '프로필 이미지를 원하는 이미지로 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (2, '2023-08-22 14:37:06.000000', 50, '/image/fallBackSrc.jpeg', false, '확성기', 42, 'taehkwon', 'hyobicho', 'MEGAPHONE', '오늘 42GG는 내가 접수한다 - mryoo ??', '24시간 동안 모든 페이지 상단에 메시지를 띄울 수 있는 아이템입니다. 사용 다음날 적용됩니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (3, '2023-08-22 14:37:09.000000', 60, '/image/fallBackSrc.jpeg', false, '배경 뽑기', 5, 'taehkwon', 'hyobicho', 'BACKGROUND', '난 \'Background\'부터가 달라 - klew', '랜덤으로 내 프로필 페이지의 배경을 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (4, '2023-08-22 14:37:12.000000', 60, '/image/fallBackSrc.jpeg', false, 'Edge 뽑기', 5, 'taehkwon', 'hyungjpa', 'EDGE', '난 \'Edge\'로 말해.. - sishin', '랜덤으로 프로필 테두리 색상을 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (5, '2023-08-22 14:40:29.000000', 50, '/image/fallBackSrc.jpeg', false, 'ID 색깔 변경권', 10, 'taehkwon', 'hyobicho', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요!', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (6, '2023-09-07 14:25:32.860487', 50, '/image/fallBackSrc.jpeg', false, 'ID 색깔 변경권', 1000000, 'hyobicho', 'hyungjpa', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요!', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (7, '2023-09-07 14:43:45.486791', 50, '/image/fallBackSrc.jpeg', false, 'ID 색깔 변경권', 1000001, 'hyungjpa', 'hyungjpa', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요!', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (8, '2023-09-07 14:46:14.803651', 50, '/image/fallBackSrc.jpeg', false, 'ID 색깔 변경권', 1000002, 'hyungjpa', 'hyungjpa', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요!', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (9, '2023-09-07 14:49:56.836802', 50, '/image/fallBackSrc.jpeg', false, 'ID 색깔 변경권', 1000003, 'hyungjpa', 'hyungjpa', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요!', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (10, '2023-09-07 14:50:15.478127', 50, '/image/fallBackSrc.jpeg', false, 'ID 색깔 변경권', 1000004, 'hyungjpa', 'hyungjpa', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요!', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (11, '2023-09-07 14:56:39.419190', 50, '/image/fallBackSrc.jpeg', false, 'ID 색깔 변경권', 1000005, 'hyungjpa', 'hyungjpa', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요!', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (12, '2023-09-07 14:59:39.706389', 50, '/image/fallBackSrc.jpeg', false, 'ID 색깔 변경권', 1000005, 'hyungjpa', 'hyungjpa', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요!', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (13, '2023-09-07 16:20:07.594046', 50, '/image/fallBackSrc.jpeg', false, 'ID 색깔 변경권', 100, 'hyungjpa', 'hyobicho', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요!', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (14, '2023-09-07 18:49:57.274774', 60, '/image/fallBackSrc.jpeg', false, 'Edge 뽑기', 10000001, 'hyungjpa', 'sishin', 'EDGE', '난 \'Edge\'로 말해.. - sishin', '랜덤으로 프로필 테두리 색상을 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (15, '2023-09-07 21:19:06.689943', 60, '/image/fallBackSrc.jpeg', false, 'Edge 뽑기', 50, 'sishin', 'hyobicho', 'EDGE', '난 \'Edge\'로 말해.. - sishin', '랜덤으로 프로필 테두리 색상을 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (16, '2023-09-08 11:06:30.357904', 50, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', false, 'ID 색깔 변경권', 100, 'hyobicho', 'hyobicho', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요!', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (17, '2023-09-08 11:09:54.808571', 60, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/Edge%20%EB%BD%91%EA%B8%B0-4f2cc34d-a972-422d-b170-97902794b75f.jpeg', false, 'Edge 뽑기', 500000, 'hyobicho', 'hyobicho', 'EDGE', '난 \'Edge\'로 말해.. - sishin', '랜덤으로 프로필 테두리 색상을 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (18, '2023-09-08 11:10:19.901788', 0, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/Edge%20%EB%BD%91%EA%B8%B0-4f2cc34d-a972-422d-b170-97902794b75f.jpeg', false, 'Edge 뽑기', 500000, 'hyobicho', 'sishin', 'EDGE', '난 \'Edge\'로 말해.. - sishin', '랜덤으로 프로필 테두리 색상을 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (19, '2023-09-08 11:10:45.220300', 60, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%EB%B0%B0%EA%B2%BD%20%EB%BD%91%EA%B8%B0-5aefd489-224b-4481-b2fa-d08da21fef92.jpeg', false, '배경 뽑기', 5, 'hyobicho', 'hyobicho', 'BACKGROUND', '난 \'Background\'부터가 달라 - klew', '랜덤으로 내 프로필 페이지의 배경을 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (20, '2023-09-08 11:11:07.098652', 50, '/image/fallBackSrc.jpeg', false, '확성기', 42, 'hyobicho', 'hyobicho', 'MEGAPHONE', '오늘 42GG는 내가 접수한다 - mryoo ?', '24시간 동안 모든 페이지 상단에 메시지를 띄울 수 있는 아이템입니다. 사용 다음날 적용됩니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (21, '2023-09-08 11:11:34.309956', 50, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%ED%99%95%EC%84%B1%EA%B8%B0-21d5dccf-0a5a-48e3-a29c-014776a33cbf.jpeg', false, '확성기', 42, 'hyobicho', 'jeyoon', 'MEGAPHONE', '오늘 42GG는 내가 접수한다 - mryoo ?', '24시간 동안 모든 페이지 상단에 메시지를 띄울 수 있는 아이템입니다. 사용 다음날 적용됩니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (22, '2023-09-08 11:11:56.429412', 50, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%EC%9D%B4%EB%AF%B8%EC%A7%80%20%EB%B3%80%EA%B2%BD%EA%B6%8C-665c9d5d-faf1-4114-9786-ed3be3014f69.jpeg', false, '이미지 변경권', 84, 'hyobicho', 'hyobicho', 'PROFILE_IMAGE', '잘 지내? 프사 바꿨네 - taehkwon', '프로필 이미지를 원하는 이미지로 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (23, '2023-09-08 11:14:21.271245', 50, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/Edge%20%EB%BD%91%EA%B8%B0-4f2cc34d-a972-422d-b170-97902794b75f.jpeg', false, 'Edge 뽑기', 20, 'sishin', 'hyobicho', 'EDGE', '난 \'Edge\'로 말해.. - sishin?', '랜덤으로 프로필 테두리 색상을 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (24, '2023-09-08 11:59:44.397320', 50, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%EC%9D%B4%EB%AF%B8%EC%A7%80%20%EB%B3%80%EA%B2%BD%EA%B6%8C-665c9d5d-faf1-4114-9786-ed3be3014f69.jpeg', true, '프로필 변경', 84, 'hyobicho', null, 'PROFILE_IMAGE', '잘 지내? 프사 바꿨네 - taehkwon', '프로필 이미지를 원하는 이미지로 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (25, '2023-09-08 11:59:52.300983', 50, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', false, 'ID색깔 변경', 100, 'hyobicho', 'hyobicho', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요!', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (26, '2023-09-08 12:00:29.804308', 0, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%EB%B0%B0%EA%B2%BD%20%EB%BD%91%EA%B8%B0-5aefd489-224b-4481-b2fa-d08da21fef92.jpeg', false, '배경 뽑기', 5000000, 'hyobicho', 'jeyoon', 'BACKGROUND', '난 \'Background\'부터가 달라 - klew', '랜덤으로 내 프로필 페이지의 배경을 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (27, '2023-09-08 13:03:58.770124', 50, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', false, 'ID색깔 변경', 100, 'hyobicho', 'jeyoon', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요✨', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (28, '2023-09-08 14:32:30.497522', 90, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%EB%B0%B0%EA%B2%BD%20%EB%BD%91%EA%B8%B0-5aefd489-224b-4481-b2fa-d08da21fef92.jpeg', false, '배경 뽑기', 5000000, 'jeyoon', 'hyobicho', 'BACKGROUND', '난 \'Background\'부터가 달라 - klew', '랜덤으로 내 프로필 페이지의 배경을 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (29, '2023-09-08 14:35:25.008156', 50, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', false, 'ID색깔 변경', 100, 'jeyoon', 'hyobicho', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요?', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (30, '2023-09-08 14:46:18.458206', 40, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%ED%99%95%EC%84%B1%EA%B8%B0-21d5dccf-0a5a-48e3-a29c-014776a33cbf.jpeg', false, '확성기', 42, 'jeyoon', 'taehkwon', 'MEGAPHONE', '오늘 42GG는 내가 접수한다 - mryoo??', '24시간 동안 모든 페이지 상단에 메시지를 띄울 수 있는 아이템입니다. 사용 다음날 적용됩니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (31, '2023-09-08 15:46:24.475018', 90, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%EB%B0%B0%EA%B2%BD%20%EB%BD%91%EA%B8%B0-5aefd489-224b-4481-b2fa-d08da21fef92.jpeg', false, '배경 뽑기', 5, 'hyobicho', 'sishin', 'BACKGROUND', '난 \'Background\'부터가 달라 - klew', '랜덤으로 내 프로필 페이지의 배경을 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (32, '2023-09-08 15:46:45.129730', 50, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', false, 'ID색깔 변경', 1000000, 'hyobicho', 'sishin', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요?', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (33, '2023-09-08 21:40:36.371683', 50, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', false, 'ID색깔 변경', 50, 'sishin', 'hyobicho', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요?', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (34, '2023-09-09 14:54:15.161525', 0, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', false, 'ID색깔 변경', 5000000, 'hyobicho', 'sishin', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요?', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (35, '2023-09-11 15:01:34.037890', 0, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', false, 'ID색깔 변경', 500, 'sishin', 'hyungjpa', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요?', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (36, '2023-09-12 10:32:10.583894', 0, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', false, 'ID색깔 변경', 501, 'hyungjpa', 'hyungjpa', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요?', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (37, '2023-09-12 10:38:27.648500', 0, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', false, 'ID색깔 변경', 502, 'hyungjpa', 'hyungjpa', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요?', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (38, '2023-09-12 10:41:22.608031', 0, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', false, 'ID색깔 변경', 503, 'hyungjpa', 'hyungjpa', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요?', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (39, '2023-09-12 10:45:27.686939', 0, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', false, 'ID색깔 변경', 504, 'hyungjpa', 'hyungjpa', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요?', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (40, '2023-09-12 10:45:51.547954', 0, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', false, 'ID색깔 변경', 505, 'hyungjpa', 'hyungjpa', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요?', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (41, '2023-09-12 10:51:33.271699', 0, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', false, 'ID색깔 변경', 504, 'hyungjpa', 'hyungjpa', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요?', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (42, '2023-09-12 10:54:28.684097', 0, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', false, 'ID색깔 변경', 505, 'hyungjpa', 'taehkwon', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요!', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (43, '2023-09-12 11:16:13.791072', 0, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', false, 'ID색깔 변경', 505, 'taehkwon', 'hyobicho', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요!', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (44, '2023-09-12 11:16:26.258550', 40, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%ED%99%95%EC%84%B1%EA%B8%B0-21d5dccf-0a5a-48e3-a29c-014776a33cbf.jpeg', false, '확성기', 42, 'taehkwon', null, 'MEGAPHONE', '오늘 42GG는 내가 접수한다 - mryoo ??', '24시간 동안 모든 페이지 상단에 메시지를 띄울 수 있는 아이템입니다. 사용 다음날 적용됩니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (45, '2023-09-12 11:34:17.000000', 20, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%ED%99%95%EC%84%B1%EA%B8%B0-21d5dccf-0a5a-48e3-a29c-014776a33cbf.jpeg', false, '확성기', 42, 'taehkwon', 'hyobicho', 'MEGAPHONE', '오늘 42GG는 내가 접수한다 - ??', '24시간 동안 모든 페이지 상단에 메시지를 띄울 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (46, '2023-09-12 11:39:57.908793', 90, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%EB%B0%B0%EA%B2%BD%20%EB%BD%91%EA%B8%B0-5aefd489-224b-4481-b2fa-d08da21fef92.jpeg', false, '배경 뽑기', 5, 'sishin', 'hyungjpa', 'BACKGROUND', '난 \'Background\'부터가 달라 - klew ?', '랜덤으로 내 프로필 페이지의 배경을 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (47, '2023-09-12 11:46:30.148192', 80, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%EB%B0%B0%EA%B2%BD%20%EB%BD%91%EA%B8%B0-5aefd489-224b-4481-b2fa-d08da21fef92.jpeg', false, '배경 뽑기', 5, 'hyungjpa', 'hyobicho', 'BACKGROUND', '난 \'Background\'부터가 달라 - klew ?', '랜덤으로 내 프로필 페이지의 배경을 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (48, '2023-09-12 14:11:30.618603', 20, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%ED%99%95%EC%84%B1%EA%B8%B0-21d5dccf-0a5a-48e3-a29c-014776a33cbf.jpeg', false, '확성기', 42, 'hyobicho', 'hyobicho', 'MEGAPHONE', '오늘 42GG는 내가 접수한다??', '24시간 동안 모든 페이지 상단에 메시지를 띄울 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (49, '2023-09-12 14:11:50.159040', 20, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%ED%99%95%EC%84%B1%EA%B8%B0-21d5dccf-0a5a-48e3-a29c-014776a33cbf.jpeg', false, '확성기', 42, 'hyobicho', 'hyobicho', 'MEGAPHONE', '오늘 42GG는 내가 접수한다 ??', '24시간 동안 모든 페이지 상단에 메시지를 띄울 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (50, '2023-09-12 14:12:19.335975', 60, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%EB%B0%B0%EA%B2%BD%20%EB%BD%91%EA%B8%B0-5aefd489-224b-4481-b2fa-d08da21fef92.jpeg', false, '배경 뽑기', 5, 'hyobicho', 'hyungjpa', 'BACKGROUND', '난 \'Background\'부터가 달라 - klew ?', '랜덤으로 내 프로필 페이지의 배경을 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (51, '2023-09-12 14:12:35.457404', 60, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/Edge%20%EB%BD%91%EA%B8%B0-4f2cc34d-a972-422d-b170-97902794b75f.jpeg', false, 'Edge 뽑기', 5, 'hyobicho', 'jeyoon', 'EDGE', '난 \'Edge\'로 말해.. - sishin?', '랜덤으로 프로필 테두리 색상을 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (52, '2023-09-12 14:12:49.003946', 50, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%ED%99%95%EC%84%B1%EA%B8%B0-21d5dccf-0a5a-48e3-a29c-014776a33cbf.jpeg', false, '확성기', 42, 'hyobicho', 'jeyoon', 'MEGAPHONE', '오늘 42GG는 내가 접수한다 ??', '24시간 동안 모든 페이지 상단에 메시지를 띄울 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (53, '2023-09-12 14:13:02.626201', 0, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', false, 'ID색깔 변경', 50000000, 'hyobicho', 'hyobicho', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요!', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (54, '2023-09-12 14:13:15.572310', 0, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', false, 'ID색깔 변경', 50000000, 'hyobicho', 'hyobicho', 'TEXT_COLOR', '(테스트)남들과는 다르게! ID 색깔을 바꿔보세요!', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (55, '2023-09-12 15:03:09.397488', 50, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', false, 'ID색깔 변경', 10, 'hyobicho', 'jeyoon', 'TEXT_COLOR', '남들과는 다르게! ID 색깔을 바꿔보세요!', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (56, '2023-09-12 15:22:44.392857', 50, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', false, 'ID색깔 변경', 10, 'jeyoon', 'jeyoon', 'TEXT_COLOR', '남들과는 다르게! >_< ID 색깔을 바꿔보세요!', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (57, '2023-09-12 15:45:23.881988', 50, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%ED%99%95%EC%84%B1%EA%B8%B0-21d5dccf-0a5a-48e3-a29c-014776a33cbf.jpeg', false, '확성기', 42, 'jeyoon', 'jeyoon', 'MEGAPHONE', '오늘 42GG는 내가 접수한다 ?', '24시간 동안 모든 페이지 상단에 메시지를 띄울 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (58, '2023-09-12 15:46:03.038523', 50, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%ED%99%95%EC%84%B1%EA%B8%B0-21d5dccf-0a5a-48e3-a29c-014776a33cbf.jpeg', true, '확성기', 42, 'jeyoon', null, 'MEGAPHONE', '오늘 42GG는 내가 접수한다 ?', '24시간 동안 모든 페이지 상단에 메시지를 띄울 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (59, '2023-09-13 11:27:29.751601', 50, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/ID%20%EC%83%89%EA%B9%94%20%EB%B3%80%EA%B2%BD%EA%B6%8C-8f558fa8-c5f5-4c76-9aad-fb12850034a5.jpeg', true, 'ID색깔 변경', 10, 'jeyoon', null, 'TEXT_COLOR', '남들과는 다르게!? ID 색깔을 바꿔보세요!', '색상코드를 직접 입력하여 랭킹 페이지의 ID 색상을 바꿀 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (60, '2023-09-15 12:43:42.907735', 60, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/Edge%20%EB%BD%91%EA%B8%B0-4f2cc34d-a972-422d-b170-97902794b75f.jpeg', true, '엣지 ★ 뽑기', 5, 'jeyoon', null, 'EDGE', '난 \'Edge\'로 말해.. - sishin?', '랜덤으로 프로필 테두리 색상을 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (61, '2023-09-15 13:48:31.443011', 60, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%EB%B0%B0%EA%B2%BD%20%EB%BD%91%EA%B8%B0-5aefd489-224b-4481-b2fa-d08da21fef92.jpeg', false, '배경★뽑기', 5, 'hyungjpa', 'hyungjpa', 'BACKGROUND', '난 \'Background\'부터가 달라 - klew ?', '랜덤으로 내 프로필 페이지의 배경을 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (62, '2023-09-15 13:49:02.078651', 60, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%EB%B0%B0%EA%B2%BD%20%EB%BD%91%EA%B8%B0-5aefd489-224b-4481-b2fa-d08da21fef92.jpeg', false, '배경 ★ 뽑기', 5, 'hyungjpa', 'jeyoon', 'BACKGROUND', '난 \'Background\'부터가 달라 - klew ?', '랜덤으로 내 프로필 페이지의 배경을 변경할 수 있는 아이템입니다.'); +INSERT INTO MAIN.item (id, created_at, discount, image_uri, is_visible, name, price, creator_intra_id, deleter_intra_id, type, main_content, sub_content) VALUES (63, '2023-09-18 23:41:36.279521', 0, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/images/%EB%B0%B0%EA%B2%BD%20%EB%BD%91%EA%B8%B0-5aefd489-224b-4481-b2fa-d08da21fef92.jpeg', true, '배경 ★ 뽑기', 5, 'jeyoon', null, 'BACKGROUND', '난 \'Background\'부터가 달라 - klew ?', '랜덤으로 내 프로필 페이지의 배경을 변경할 수 있는 아이템입니다.'); +-- tier 삽입 -- +INSERT INTO MAIN.tier (id, image_uri, name) VALUES (1, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/tier/hand.png', '손바닥'); +INSERT INTO MAIN.tier (id, image_uri, name) VALUES (2, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/tier/new_red.png', '빨강 탁구채'); +INSERT INTO MAIN.tier (id, image_uri, name) VALUES (3, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/tier/yellow.png', '노랑 탁구채'); +INSERT INTO MAIN.tier (id, image_uri, name) VALUES (4, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/tier/new_green.png', '초록 탁구채'); +INSERT INTO MAIN.tier (id, image_uri, name) VALUES (5, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/tier/blue.png', '파랑 탁구채'); +INSERT INTO MAIN.tier (id, image_uri, name) VALUES (6, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/tier/black.png', '검정 탁구채'); +INSERT INTO MAIN.tier (id, image_uri, name) VALUES (7, 'https://42gg-public-test-image.s3.ap-northeast-2.amazonaws.com/tier/new_rainbow.png', '무지개 탁구채'); +-- coin policy 삽입 -- +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (1, 519, 0, '2023-08-23 11:13:56.679461', 2, 4, 5); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (2, 519, 0, '2023-08-23 11:32:24.664774', 2, 0, 5); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (3, 519, 0, '2023-08-23 13:14:44.954698', 2, 0, 5); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (4, 479, 0, '2023-08-24 10:54:28.328821', 2, 0, 5); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (5, 479, 0, '2023-08-24 10:56:58.974651', 10, 10, 10); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (6, 479, 0, '2023-08-24 10:57:28.292756', 2, 0, 5); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (7, 538, 0, '2023-08-24 11:44:08.657610', 20, 20, 20); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (8, 538, 0, '2023-08-24 11:44:55.125563', 2, 0, 5); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (9, 519, 0, '2023-09-12 10:09:21.339375', 2, 1, 5); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (10, 519, 0, '2023-09-12 10:09:31.922474', 2, 0, 5); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (11, 519, 0, '2023-09-13 11:45:44.627234', 2, 1, 1); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (12, 519, 0, '2023-09-13 11:46:09.009349', 2, 100, 97); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (13, 519, 0, '2023-09-13 11:46:16.664177', 2, 100, 101); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (14, 519, 0, '2023-09-13 11:46:29.574440', 2, 0, 5); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (15, 519, 0, '2023-09-13 11:48:57.729986', 2, 1, 5); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (16, 519, 0, '2023-09-13 11:49:02.751738', 2, 0, 5); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (17, 538, 0, '2023-09-14 10:37:39.008358', 100, 0, 5); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (18, 538, 0, '2023-09-14 10:37:45.892845', 2, 0, 5); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (19, 538, 0, '2023-09-14 10:38:19.264695', 2, 0, 9); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (20, 538, 0, '2023-09-14 10:38:34.185202', 2, 0, 5); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (21, 479, 0, '2023-09-14 11:00:39.986649', 2, 0, 5); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (22, 479, 0, '2023-09-14 11:02:04.693812', 2, 0, 5); +INSERT INTO MAIN.coin_policy (id, user_id, attendance, created_at, normal, rank_lose, rank_win) VALUES (23, 519, 1, '2023-09-19 16:37:05.665019', 2, 0, 5); From 0f48a5cf8b54865a59887830f37ee6e007648046 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Tue, 19 Sep 2023 20:13:59 +0900 Subject: [PATCH 258/273] [FIX] UserGameCoinResultDto fix --- .../gg/server/domain/coin/service/UserCoinChangeService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java index 11312374f..100345df7 100644 --- a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java +++ b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java @@ -58,7 +58,8 @@ public void giftItemCoin(Item item, Integer price, User user, User giftTarget){ @Transactional public UserGameCoinResultDto addNormalGameCoin(Long userId) { User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new); - int coinIncrement = coinPolicyRepository.findTopByOrderByCreatedAtDesc().getNormal(); + int coinIncrement = coinPolicyRepository.findTopByOrderByCreatedAtDesc() + .orElseThrow(() -> new CoinPolicyNotFoundException()).getNormal(); user.addGgCoin(coinIncrement); coinHistoryService.addNormalCoin(user); From 7e34ed234049192bee3412547b0f86876bd6c386 Mon Sep 17 00:00:00 2001 From: kylew1004 Date: Tue, 19 Sep 2023 20:17:45 +0900 Subject: [PATCH 259/273] =?UTF-8?q?[REFACTOR]=20UserCoinChangeService=20la?= =?UTF-8?q?mbda=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/coin/service/UserCoinChangeService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java index 100345df7..b30dbc385 100644 --- a/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java +++ b/src/main/java/com/gg/server/domain/coin/service/UserCoinChangeService.java @@ -30,7 +30,7 @@ public int addAttendanceCoin(User user){ if (coinHistoryService.hasAttendedToday(user)) throw new UserAlreadyAttendanceException(); int coinIncrement = coinPolicyRepository.findTopByOrderByCreatedAtDesc() - .orElseThrow(() -> new CoinPolicyNotFoundException()).getAttendance(); + .orElseThrow(CoinPolicyNotFoundException::new).getAttendance(); user.addGgCoin(coinIncrement); coinHistoryService.addAttendanceCoinHistory(user); return coinIncrement; @@ -59,7 +59,7 @@ public void giftItemCoin(Item item, Integer price, User user, User giftTarget){ public UserGameCoinResultDto addNormalGameCoin(Long userId) { User user = userRepository.findById(userId).orElseThrow(UserNotFoundException::new); int coinIncrement = coinPolicyRepository.findTopByOrderByCreatedAtDesc() - .orElseThrow(() -> new CoinPolicyNotFoundException()).getNormal(); + .orElseThrow(CoinPolicyNotFoundException::new).getNormal(); user.addGgCoin(coinIncrement); coinHistoryService.addNormalCoin(user); @@ -85,9 +85,9 @@ private boolean userIsWinner(Long gameId, User user) { for(Team team: teams) { for (TeamUser teamUser : team.getTeamUsers()){ - if (teamUser.getUser().getId() == user.getId() && team.getWin() == true) + if (teamUser.getUser().getId() == user.getId() && team.getWin()) return true; - else if (teamUser.getUser().getId() == user.getId() && team.getWin() == false) + else if (teamUser.getUser().getId() == user.getId() && !team.getWin()) return false; } } From bb6379d2d17ecc0b44304f7019b8c0cb64a41b5b Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Tue, 19 Sep 2023 20:28:57 +0900 Subject: [PATCH 260/273] =?UTF-8?q?[FIX]=20ItemStoreListControllerTest?= =?UTF-8?q?=EC=97=90=20toString=20=EC=A7=80=EC=9A=B4=20=EA=B2=83=EC=97=90?= =?UTF-8?q?=20=EB=8C=80=ED=95=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/controller/ItemStoreListControllerTest.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java b/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java index 59d15d6e2..6065aeaad 100644 --- a/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java +++ b/src/test/java/com/gg/server/domain/item/controller/ItemStoreListControllerTest.java @@ -16,6 +16,8 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.web.servlet.MockMvc; import org.springframework.boot.test.mock.mockito.MockBean; + +import static com.gg.server.domain.item.type.ItemType.*; import static org.assertj.core.api.Assertions.assertThat; import javax.transaction.Transactional; import java.util.Arrays; @@ -54,9 +56,9 @@ public void getAllItemsTest() throws Exception { //given List testItems = Arrays.asList( - new ItemStoreResponseDto(1L, "itemName 1", "mainContent 1","subContent 1", "MEGAPHONE", "ImageUrl 1", 1000, 10, 900), - new ItemStoreResponseDto(2L, "itemName 2", "mainContent 2","subContent 2", "PROFILE_IMAGE", "ImageUrl 2", 2000, 20, 1800), - new ItemStoreResponseDto(3L, "itemName 3", "mainContent 2","subContent 2", "TEXT_COLOR", "ImageUrl 3", 3000, 30, 2700) + new ItemStoreResponseDto(1L, "itemName 1", "mainContent 1","subContent 1", MEGAPHONE, "ImageUrl 1", 1000, 10, 900), + new ItemStoreResponseDto(2L, "itemName 2", "mainContent 2","subContent 2", PROFILE_IMAGE, "ImageUrl 2", 2000, 20, 1800), + new ItemStoreResponseDto(3L, "itemName 3", "mainContent 2","subContent 2", TEXT_COLOR, "ImageUrl 3", 3000, 30, 2700) ); ItemStoreListResponseDto testResponse = new ItemStoreListResponseDto(testItems); when(itemService.getAllItems()).thenReturn(testResponse); From 76039f95344f289f3adb3c2d9428ec66830e9d91 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Tue, 19 Sep 2023 20:32:23 +0900 Subject: [PATCH 261/273] =?UTF-8?q?[REFACTOR]=20=EC=A4=91=EB=B3=B5?= =?UTF-8?q?=EB=90=98=EB=8A=94=20=EC=A0=95=EB=A0=AC=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/admin/receipt/data/ReceiptAdminRepositorySearch.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/admin/receipt/data/ReceiptAdminRepositorySearch.java b/src/main/java/com/gg/server/admin/receipt/data/ReceiptAdminRepositorySearch.java index 8fe9ef358..4065857a5 100644 --- a/src/main/java/com/gg/server/admin/receipt/data/ReceiptAdminRepositorySearch.java +++ b/src/main/java/com/gg/server/admin/receipt/data/ReceiptAdminRepositorySearch.java @@ -7,6 +7,6 @@ import org.springframework.data.repository.query.Param; public interface ReceiptAdminRepositorySearch { - @Query(value = "select re from Receipt re where re.purchaserIntraId = :intraId or re.ownerIntraId = :intraId order by re.createdAt desc") + @Query(value = "select re from Receipt re where re.purchaserIntraId = :intraId or re.ownerIntraId = :intraId") Page findReceiptByIntraId(@Param("intraId") String intraId, Pageable pageable); } From 9ecf0102bfb735c11aae51e97115d5b62511b53a Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Tue, 19 Sep 2023 20:54:27 +0900 Subject: [PATCH 262/273] =?UTF-8?q?[REFACTOR]=20findAllByStatus=20?= =?UTF-8?q?=EB=A5=BC=20findAll=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gg/server/admin/game/service/GameAdminService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/admin/game/service/GameAdminService.java b/src/main/java/com/gg/server/admin/game/service/GameAdminService.java index e8ba299ec..0e2d55e54 100644 --- a/src/main/java/com/gg/server/admin/game/service/GameAdminService.java +++ b/src/main/java/com/gg/server/admin/game/service/GameAdminService.java @@ -49,7 +49,7 @@ public class GameAdminService { @Transactional(readOnly = true) public GameLogListAdminResponseDto findAllGamesByAdmin(Pageable pageable) { - Page gamePage = gameAdminRepository.findAllByStatus(pageable); //모든 게임 정보 가져오기 + Page gamePage = gameAdminRepository.findAll(pageable); //모든 게임 정보 가져오기 return new GameLogListAdminResponseDto(getGameLogList(gamePage.getContent().stream().map(Game::getId).collect(Collectors.toList())), gamePage.getTotalPages()); } From f5059dd989b3ab352b0f8bf181154b589b0f6ae9 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Tue, 19 Sep 2023 21:39:30 +0900 Subject: [PATCH 263/273] =?UTF-8?q?[REFACTOR]=20RankRedisService=20updateR?= =?UTF-8?q?ankUser=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/rank/redis/RankRedisService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java b/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java index 82ae9c62f..cdaa5ccfc 100644 --- a/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java +++ b/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java @@ -45,7 +45,7 @@ public void updateRankRedis(TeamUser myTeamUser, TeamUser enemyTeamUser, Game ga updatePPP(enemyTeamUser, enemyTeam, myTeamUser.getTeam().getScore(), enemyPPP, myPPP, game.getSeason().getId()); updateRankUser(key, zsetKey, myTeamUser.getUser().getId(), myTeam); updateRankUser(key, zsetKey, enemyTeamUser.getUser().getId(), enemyTeam); - updateAllTier(key, game.getSeason()); + updateAllTier(key, zsetKey, game.getSeason()); pChangeService.addPChange(game, myTeamUser.getUser(), myTeam.getPpp(), true); pChangeService.addPChange(game, enemyTeamUser.getUser(), enemyTeam.getPpp(), false); } @@ -72,7 +72,7 @@ public void updatePPP(TeamUser teamuser, RankRedis myTeam, int enemyScore, Integ } - public void updateAllTier(String key, Season season) { + public void updateAllTier(String key, String zSetKey, Season season) { // 전체 레디스 랭크 티어 새로고침하는 로직 List rankRedisList = rankRedisRepository.findAllRanksOrderByPppDesc(key); Long totalRankPlayers = rankRepository.countRealRankPlayers(season.getId()); @@ -114,7 +114,7 @@ public void updateAllTier(String key, Season season) { } } for (RankRedis rankRedis : rankRedisList) { - rankRedisRepository.updateRankData(key, rankRedis.getUserId(), rankRedis); + updateRankUser(key, zSetKey, rankRedis.getUserId(), rankRedis); } } From b2a68091c18ad75b129d3a231873ce27d16e4b00 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Tue, 19 Sep 2023 21:53:01 +0900 Subject: [PATCH 264/273] =?UTF-8?q?[REFACTOR]=20RankRedisService=20updateR?= =?UTF-8?q?ankUser=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gg/server/domain/rank/redis/RankRedisService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java b/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java index cdaa5ccfc..42d53be4e 100644 --- a/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java +++ b/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java @@ -88,6 +88,7 @@ public void updateAllTier(String key, String zSetKey, Season season) { } else { if (i < 3) { rankRedis.updateTierImage(tierList.get(6).getImageUri()); + updateRankUser(key, zSetKey, rankRedis.getUserId(), rankRedis); continue; } if (rankRedis.getPpp() < 970) { @@ -112,8 +113,6 @@ public void updateAllTier(String key, String zSetKey, Season season) { } } } - } - for (RankRedis rankRedis : rankRedisList) { updateRankUser(key, zSetKey, rankRedis.getUserId(), rankRedis); } } From 3483f08ea8ea17eaf39d94655e8a2e84aa497872 Mon Sep 17 00:00:00 2001 From: Sion Shin Date: Tue, 19 Sep 2023 21:59:05 +0900 Subject: [PATCH 265/273] =?UTF-8?q?[REFACTOR]=20RankRedisService=20updateR?= =?UTF-8?q?ankUser=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gg/server/domain/rank/redis/RankRedisService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java b/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java index 42d53be4e..59ea58c8e 100644 --- a/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java +++ b/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java @@ -112,8 +112,8 @@ public void updateAllTier(String key, String zSetKey, Season season) { rankRedis.updateTierImage(tierList.get(3).getImageUri()); } } + updateRankUser(key, zSetKey, rankRedis.getUserId(), rankRedis); } - updateRankUser(key, zSetKey, rankRedis.getUserId(), rankRedis); } } From 5289690406a6f1d65c0cd73d6c17e20b55c80b3b Mon Sep 17 00:00:00 2001 From: hyunkyu Date: Wed, 20 Sep 2023 14:46:06 +0900 Subject: [PATCH 266/273] =?UTF-8?q?tier=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EB=A1=9C=EC=A7=81=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/domain/game/GameController.java | 3 +++ .../server/domain/rank/redis/RankRedisService.java | 13 ++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gg/server/domain/game/GameController.java b/src/main/java/com/gg/server/domain/game/GameController.java index 9ea9ec2cc..3c8a3f835 100644 --- a/src/main/java/com/gg/server/domain/game/GameController.java +++ b/src/main/java/com/gg/server/domain/game/GameController.java @@ -8,6 +8,7 @@ import com.gg.server.domain.game.exception.ScoreNotMatchedException; import com.gg.server.domain.game.service.GameFindService; import com.gg.server.domain.game.service.GameService; +import com.gg.server.domain.rank.redis.RankRedisService; import com.gg.server.domain.user.dto.UserDto; import com.gg.server.global.exception.ErrorCode; import com.gg.server.global.exception.custom.InvalidParameterException; @@ -29,6 +30,7 @@ public class GameController { private final GameService gameService; private final GameFindService gameFindService; + private final RankRedisService rankRedisService; @GetMapping GameListResDto allGameList(@Valid GameListReqDto gameReq) { @@ -73,6 +75,7 @@ synchronized ResponseEntity createRankResult(@Valid @RequestBody RankResultReqDt if (!gameService.createRankResult(reqDto, user.getId())) { throw new ScoreNotMatchedException(); } + rankRedisService.updateAllTier(); return new ResponseEntity(HttpStatus.CREATED); } diff --git a/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java b/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java index 59ea58c8e..2f5db5f15 100644 --- a/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java +++ b/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java @@ -6,6 +6,7 @@ import com.gg.server.domain.rank.data.RankRepository; import com.gg.server.domain.rank.exception.RankNotFoundException; import com.gg.server.domain.season.data.Season; +import com.gg.server.domain.season.service.SeasonFindService; import com.gg.server.domain.team.data.TeamUser; import com.gg.server.domain.tier.data.Tier; import com.gg.server.domain.tier.data.TierRepository; @@ -18,6 +19,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.List; @Service @@ -28,6 +30,7 @@ public class RankRedisService { private final TierRepository tierRepository; private final PChangeService pChangeService; private final RankRepository rankRepository; + private final SeasonFindService seasonFindService; public Integer getUserPpp(Long userId, Long seasonId) { String hashKey = RedisKeyManager.getHashKey(seasonId); @@ -45,7 +48,7 @@ public void updateRankRedis(TeamUser myTeamUser, TeamUser enemyTeamUser, Game ga updatePPP(enemyTeamUser, enemyTeam, myTeamUser.getTeam().getScore(), enemyPPP, myPPP, game.getSeason().getId()); updateRankUser(key, zsetKey, myTeamUser.getUser().getId(), myTeam); updateRankUser(key, zsetKey, enemyTeamUser.getUser().getId(), enemyTeam); - updateAllTier(key, zsetKey, game.getSeason()); +// updateAllTier(key, zsetKey, game.getSeason()); pChangeService.addPChange(game, myTeamUser.getUser(), myTeam.getPpp(), true); pChangeService.addPChange(game, enemyTeamUser.getUser(), enemyTeam.getPpp(), false); } @@ -72,10 +75,14 @@ public void updatePPP(TeamUser teamuser, RankRedis myTeam, int enemyScore, Integ } - public void updateAllTier(String key, String zSetKey, Season season) { + @Transactional + public void updateAllTier() { // 전체 레디스 랭크 티어 새로고침하는 로직 + Season currentSeason = seasonFindService.findCurrentSeason(LocalDateTime.now()); + String key = RedisKeyManager.getHashKey(currentSeason.getId()); + String zSetKey = RedisKeyManager.getZSetKey(currentSeason.getId()); List rankRedisList = rankRedisRepository.findAllRanksOrderByPppDesc(key); - Long totalRankPlayers = rankRepository.countRealRankPlayers(season.getId()); + Long totalRankPlayers = rankRepository.countRealRankPlayers(currentSeason.getId()); List tierList = tierRepository.findAll(Sort.by(Sort.Direction.ASC, "id")); int top30percentPpp = rankRedisList.get((int) (totalRankPlayers * 0.3)).getPpp(); From 95a028f70a317a4850b13cc7f524e91a4f1eb051 Mon Sep 17 00:00:00 2001 From: hyunkyu Date: Wed, 20 Sep 2023 14:48:42 +0900 Subject: [PATCH 267/273] =?UTF-8?q?=EC=A3=BC=EC=84=9D=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gg/server/domain/rank/redis/RankRedisService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java b/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java index 2f5db5f15..63ca90755 100644 --- a/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java +++ b/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java @@ -48,7 +48,6 @@ public void updateRankRedis(TeamUser myTeamUser, TeamUser enemyTeamUser, Game ga updatePPP(enemyTeamUser, enemyTeam, myTeamUser.getTeam().getScore(), enemyPPP, myPPP, game.getSeason().getId()); updateRankUser(key, zsetKey, myTeamUser.getUser().getId(), myTeam); updateRankUser(key, zsetKey, enemyTeamUser.getUser().getId(), enemyTeam); -// updateAllTier(key, zsetKey, game.getSeason()); pChangeService.addPChange(game, myTeamUser.getUser(), myTeam.getPpp(), true); pChangeService.addPChange(game, enemyTeamUser.getUser(), enemyTeam.getPpp(), false); } From 56400365f12c938337b45c99c0b74790da762b9e Mon Sep 17 00:00:00 2001 From: hyunkyu Date: Wed, 20 Sep 2023 15:33:26 +0900 Subject: [PATCH 268/273] fix season find --- .../java/com/gg/server/domain/game/GameController.java | 2 +- .../com/gg/server/domain/game/data/GameRepository.java | 6 ++++++ .../gg/server/domain/rank/redis/RankRedisService.java | 10 +++++----- .../domain/season/service/SeasonFindService.java | 10 ++++++++++ 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gg/server/domain/game/GameController.java b/src/main/java/com/gg/server/domain/game/GameController.java index 3c8a3f835..3ab466208 100644 --- a/src/main/java/com/gg/server/domain/game/GameController.java +++ b/src/main/java/com/gg/server/domain/game/GameController.java @@ -75,7 +75,7 @@ synchronized ResponseEntity createRankResult(@Valid @RequestBody RankResultReqDt if (!gameService.createRankResult(reqDto, user.getId())) { throw new ScoreNotMatchedException(); } - rankRedisService.updateAllTier(); + rankRedisService.updateAllTier(reqDto.getGameId()); return new ResponseEntity(HttpStatus.CREATED); } diff --git a/src/main/java/com/gg/server/domain/game/data/GameRepository.java b/src/main/java/com/gg/server/domain/game/data/GameRepository.java index 3457a195d..21a1ec5ff 100644 --- a/src/main/java/com/gg/server/domain/game/data/GameRepository.java +++ b/src/main/java/com/gg/server/domain/game/data/GameRepository.java @@ -9,6 +9,8 @@ import com.gg.server.domain.team.dto.GameUser; import javax.persistence.LockModeType; + +import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; import com.gg.server.domain.game.dto.GameTeamUser; import org.springframework.data.domain.Pageable; @@ -87,4 +89,8 @@ public interface GameRepository extends JpaRepository, GameRepositor @Lock(LockModeType.PESSIMISTIC_WRITE) Optional findWithPessimisticLockById(Long gameId); + + @Override + @EntityGraph(attributePaths = {"season"}) + Optional findById(Long gameId); } diff --git a/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java b/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java index 63ca90755..e79bc3c11 100644 --- a/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java +++ b/src/main/java/com/gg/server/domain/rank/redis/RankRedisService.java @@ -75,13 +75,13 @@ public void updatePPP(TeamUser teamuser, RankRedis myTeam, int enemyScore, Integ } @Transactional - public void updateAllTier() { + public void updateAllTier(Long gameId) { // 전체 레디스 랭크 티어 새로고침하는 로직 - Season currentSeason = seasonFindService.findCurrentSeason(LocalDateTime.now()); - String key = RedisKeyManager.getHashKey(currentSeason.getId()); - String zSetKey = RedisKeyManager.getZSetKey(currentSeason.getId()); + Season targetSeason = seasonFindService.findSeasonByGameId(gameId); + String key = RedisKeyManager.getHashKey(targetSeason.getId()); + String zSetKey = RedisKeyManager.getZSetKey(targetSeason.getId()); List rankRedisList = rankRedisRepository.findAllRanksOrderByPppDesc(key); - Long totalRankPlayers = rankRepository.countRealRankPlayers(currentSeason.getId()); + Long totalRankPlayers = rankRepository.countRealRankPlayers(targetSeason.getId()); List tierList = tierRepository.findAll(Sort.by(Sort.Direction.ASC, "id")); int top30percentPpp = rankRedisList.get((int) (totalRankPlayers * 0.3)).getPpp(); diff --git a/src/main/java/com/gg/server/domain/season/service/SeasonFindService.java b/src/main/java/com/gg/server/domain/season/service/SeasonFindService.java index 625176255..d20216078 100644 --- a/src/main/java/com/gg/server/domain/season/service/SeasonFindService.java +++ b/src/main/java/com/gg/server/domain/season/service/SeasonFindService.java @@ -1,5 +1,8 @@ package com.gg.server.domain.season.service; +import com.gg.server.domain.game.data.Game; +import com.gg.server.domain.game.data.GameRepository; +import com.gg.server.domain.game.exception.GameNotExistException; import com.gg.server.domain.season.data.Season; import com.gg.server.domain.season.data.SeasonRepository; import com.gg.server.domain.season.exception.SeasonNotFoundException; @@ -15,6 +18,7 @@ public class SeasonFindService { private final SeasonRepository seasonRepository; + private final GameRepository gameRepository; @Transactional(readOnly = true) public Season findCurrentSeason(LocalDateTime now){ @@ -25,4 +29,10 @@ public Season findCurrentSeason(LocalDateTime now){ public Season findSeasonById(Long seasonId){ return seasonRepository.findById(seasonId).orElseThrow(() -> new SeasonNotFoundException()); } + + @Transactional(readOnly = true) + public Season findSeasonByGameId(Long gameId){ + Game game = gameRepository.findById(gameId).orElseThrow(() -> new GameNotExistException()); + return game.getSeason(); + } } From 04d87489d520dbeada060df743ce84a44b7ea891 Mon Sep 17 00:00:00 2001 From: hyunkyu Date: Wed, 20 Sep 2023 16:20:53 +0900 Subject: [PATCH 269/273] =?UTF-8?q?transaction=20rollback=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gg/server/domain/rank/service/RankFindService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/rank/service/RankFindService.java b/src/main/java/com/gg/server/domain/rank/service/RankFindService.java index a19b90655..f6e7e1f87 100644 --- a/src/main/java/com/gg/server/domain/rank/service/RankFindService.java +++ b/src/main/java/com/gg/server/domain/rank/service/RankFindService.java @@ -13,7 +13,6 @@ public class RankFindService { private final RankRepository rankRepository; - @Transactional(readOnly = true) public Rank findByUserIdAndSeasonId(Long userId, Long seasonId){ return rankRepository.findByUserIdAndSeasonId(userId, seasonId).orElseThrow(() -> new RankNotFoundException()); } From 97735ac92a8a3bd3b56f62fdacd0b0faea602805 Mon Sep 17 00:00:00 2001 From: hyunkyu Date: Wed, 20 Sep 2023 16:29:47 +0900 Subject: [PATCH 270/273] fix kakao api --- .../com/gg/server/domain/user/service/UserService.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index c5134f2c7..0142f8dbc 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -128,7 +128,12 @@ else if (game.getStatus() == StatusType.END) { public UserDetailResponseDto getUserDetail(String targetUserIntraId) { User targetUser = userFindService.findByIntraId(targetUserIntraId); String statusMessage = userFindService.getUserStatusMessage(targetUser); - Tier tier = rankFindService.findByUserIdAndSeasonId(targetUser.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); + Tier tier; + try{ + tier = rankFindService.findByUserIdAndSeasonId(targetUser.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); + } catch (TierNotFoundException e) { + tier = tierRepository.findStartTier().orElseThrow(TierNotFoundException::new); + } return new UserDetailResponseDto(targetUser, statusMessage, tier); } From fdf8557614754fa2d6ba6b27c71a62c9c8026bc3 Mon Sep 17 00:00:00 2001 From: hyunkyu Date: Wed, 20 Sep 2023 16:32:46 +0900 Subject: [PATCH 271/273] =?UTF-8?q?kakao=20user=20login=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=ED=8E=98=EC=9D=B4=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gg/server/domain/user/service/UserService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gg/server/domain/user/service/UserService.java b/src/main/java/com/gg/server/domain/user/service/UserService.java index 0142f8dbc..cf2fad59b 100644 --- a/src/main/java/com/gg/server/domain/user/service/UserService.java +++ b/src/main/java/com/gg/server/domain/user/service/UserService.java @@ -131,7 +131,7 @@ public UserDetailResponseDto getUserDetail(String targetUserIntraId) { Tier tier; try{ tier = rankFindService.findByUserIdAndSeasonId(targetUser.getId(), seasonFindService.findCurrentSeason(LocalDateTime.now()).getId()).getTier(); - } catch (TierNotFoundException e) { + } catch (RankNotFoundException e) { tier = tierRepository.findStartTier().orElseThrow(TierNotFoundException::new); } return new UserDetailResponseDto(targetUser, statusMessage, tier); From 4259dd5de779dbdc0b0f0bf80605d1d8d76da86a Mon Sep 17 00:00:00 2001 From: hyunkyu Date: Wed, 20 Sep 2023 16:50:51 +0900 Subject: [PATCH 272/273] =?UTF-8?q?fix=20kakao=20item=20=EA=B5=AC=EB=A7=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gg/server/global/security/config/SecurityConfig.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/gg/server/global/security/config/SecurityConfig.java b/src/main/java/com/gg/server/global/security/config/SecurityConfig.java index 34637f108..4a5e0bb9c 100644 --- a/src/main/java/com/gg/server/global/security/config/SecurityConfig.java +++ b/src/main/java/com/gg/server/global/security/config/SecurityConfig.java @@ -53,7 +53,6 @@ protected void configure(HttpSecurity http) throws Exception { .antMatchers("/pingpong/admin/**").hasRole("ADMIN") .antMatchers(HttpMethod.PUT, "/pingpong/users/{intraId}").hasAnyRole("USER", "ADMIN") .antMatchers(HttpMethod.POST, "/pingpong/match").hasAnyRole("USER", "ADMIN") - .antMatchers(HttpMethod.POST, "/pingpong/items/purchases/{itemId}", "/pingpong/items/gift/{itemId}").hasAnyRole("USER", "ADMIN") .antMatchers("/login", "/oauth2/authorization/**", "/","/pingpong/users/oauth/**", "/pingpong/users/accesstoken", "/actuator/**", "/swagger-ui/**", "/swagger-ui**", "/v3/api-docs/**", "/v3/api-docs**", "/api-docs").permitAll() From cfc8864b9d4289575bd351a67f68631a3f44f2fb Mon Sep 17 00:00:00 2001 From: 8luerose <8luerose@naver.com> Date: Wed, 20 Sep 2023 17:00:39 +0900 Subject: [PATCH 273/273] [FIX] Purchase KAKKAO USER Forbbiden --- .../com/gg/server/domain/item/service/ItemService.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/com/gg/server/domain/item/service/ItemService.java b/src/main/java/com/gg/server/domain/item/service/ItemService.java index 93297bdf3..c8621a4c1 100644 --- a/src/main/java/com/gg/server/domain/item/service/ItemService.java +++ b/src/main/java/com/gg/server/domain/item/service/ItemService.java @@ -68,6 +68,13 @@ public void purchaseItem(Long itemId, UserDto userDto) { finalPrice = item.getPrice(); } + User payUser = userRepository.findById(userDto.getId()) + .orElseThrow(() -> new UserNotFoundException()); + + if (payUser.getRoleType() == RoleType.GUEST) { + throw new KakaoPurchaseException(); + } + userCoinChangeService.purchaseItemCoin(item, finalPrice, userDto.getId()); Receipt receipt = new Receipt(item, userDto.getIntraId(), userDto.getIntraId(),