diff --git a/.github/workflows/test_run.yml b/.github/workflows/test_run.yml index b7cdadd8..b7b6716e 100644 --- a/.github/workflows/test_run.yml +++ b/.github/workflows/test_run.yml @@ -27,5 +27,5 @@ jobs: cache: gradle - name: Run tests - run: ./gradlew clean test + run: ./gradlew clean test --info diff --git a/src/main/java/com/wootecam/luckyvickyauction/core/auction/domain/Auction.java b/src/main/java/com/wootecam/luckyvickyauction/core/auction/domain/Auction.java index 0490d66d..fb939ce6 100644 --- a/src/main/java/com/wootecam/luckyvickyauction/core/auction/domain/Auction.java +++ b/src/main/java/com/wootecam/luckyvickyauction/core/auction/domain/Auction.java @@ -11,9 +11,8 @@ public class Auction { private static final int MINIMUM_STOCK_COUNT = 1; - private static final int DURATION_ONE_MINUTE = 1; - private static final int DURATION_FIVE_MINUTE = 5; - private static final int DURATION_TEN_MINUTE = 10; + private static final long NANOS_IN_MINUTE = 60_000_000_000L; // 1분의 나노초 + private static final long MAX_AUCTION_DURATION_NANOS = 60 * NANOS_IN_MINUTE; // 60분의 나노초 private Long id; private final Long sellerId; @@ -65,24 +64,26 @@ public Auction( } private void validateAuctionTime(LocalDateTime startedAt, LocalDateTime finishedAt) { - Duration diff = Duration.between(startedAt, finishedAt); - long diffNanos = diff.toMillis(); - long tenMinutesInNanos = 10L * 60 * 1_000; // 10분을 나노초로 변환 + Duration duration = Duration.between(startedAt, finishedAt); + long durationNanos = duration.toNanos(); - if (!(diffNanos % tenMinutesInNanos == 0 && diffNanos / tenMinutesInNanos <= 6)) { - String message = String.format("경매 지속 시간은 10분 단위여야하고, 최대 60분까지만 가능합니다. 현재: %.9f분", - diffNanos / (60.0 * 1_000)); + if (durationNanos > MAX_AUCTION_DURATION_NANOS) { + long leftNanoSeconds = durationNanos % NANOS_IN_MINUTE; + String message = String.format("경매 지속 시간은 최대 60분까지만 가능합니다. 현재 초과되는 나노초: %d초", leftNanoSeconds); throw new BadRequestException(message, ErrorCode.A007); } + + if (durationNanos % NANOS_IN_MINUTE != 0) { + long leftNanoSeconds = durationNanos % NANOS_IN_MINUTE; + String message = String.format("경매 지속 시간은 정확히 분 단위여야 합니다. 현재 남는 나노초: %d초", leftNanoSeconds); + throw new BadRequestException(message, ErrorCode.A030); + } } private void validateVariationDuration(Duration variationDuration, Duration auctionDuration) { - if (!isAllowedDuration(variationDuration)) { - String message = String.format("경매 할인 주기 시간은 %d, %d, %d만 선택할 수 있습니다.", - DURATION_ONE_MINUTE, - DURATION_FIVE_MINUTE, - DURATION_TEN_MINUTE - ); + if (!isAllowedDuration(variationDuration, auctionDuration)) { + String message = String.format("경매 할인 주기는 경매 지속 시간에서 나누었을때 나누어 떨어져야 합니다. 할인 주기 시간(초): %d, 경매 주기 시간(초): %d", + variationDuration.getSeconds(), auctionDuration.getSeconds()); throw new BadRequestException(message, ErrorCode.A028); } @@ -92,10 +93,14 @@ private void validateVariationDuration(Duration variationDuration, Duration auct } } - private boolean isAllowedDuration(Duration duration) { - return duration.equals(Duration.ofMinutes(DURATION_ONE_MINUTE)) - || duration.equals(Duration.ofMinutes(DURATION_FIVE_MINUTE)) - || duration.equals(Duration.ofMinutes(DURATION_TEN_MINUTE)); + private boolean isAllowedDuration(Duration duration, Duration auctionDuration) { + if (duration.isZero() || auctionDuration.isZero()) { + return false; + } + long durationSeconds = duration.getSeconds(); + long auctionDurationSeconds = auctionDuration.getSeconds(); + + return auctionDurationSeconds % durationSeconds == 0; } private void validateMinimumPrice(LocalDateTime startedAt, LocalDateTime finishedAt, Duration variationDuration, diff --git a/src/main/java/com/wootecam/luckyvickyauction/core/member/entity/MemberEntity.java b/src/main/java/com/wootecam/luckyvickyauction/core/member/entity/MemberEntity.java index ebbe95e0..f6b4d5b4 100644 --- a/src/main/java/com/wootecam/luckyvickyauction/core/member/entity/MemberEntity.java +++ b/src/main/java/com/wootecam/luckyvickyauction/core/member/entity/MemberEntity.java @@ -1,6 +1,9 @@ package com.wootecam.luckyvickyauction.core.member.entity; +import com.wootecam.luckyvickyauction.core.member.domain.Role; import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; @@ -20,11 +23,12 @@ public class MemberEntity { private Long id; private String signInId; private String password; - private String role; + @Enumerated(value = EnumType.STRING) + private Role role; private Long point; @Builder - private MemberEntity(Long id, String signInId, String password, String role, Long point) { + private MemberEntity(Long id, String signInId, String password, Role role, Long point) { this.id = id; this.signInId = signInId; this.password = password; diff --git a/src/main/java/com/wootecam/luckyvickyauction/core/payment/entity/ReceiptEntity.java b/src/main/java/com/wootecam/luckyvickyauction/core/payment/entity/ReceiptEntity.java index fe827154..1e6f6d5b 100644 --- a/src/main/java/com/wootecam/luckyvickyauction/core/payment/entity/ReceiptEntity.java +++ b/src/main/java/com/wootecam/luckyvickyauction/core/payment/entity/ReceiptEntity.java @@ -2,6 +2,8 @@ import com.wootecam.luckyvickyauction.core.payment.domain.ReceiptStatus; import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; @@ -24,6 +26,7 @@ public class ReceiptEntity { private String productName; private long price; private long quantity; + @Enumerated(value = EnumType.STRING) private ReceiptStatus receiptStatus; private long auctionId; private Long sellerId; diff --git a/src/main/java/com/wootecam/luckyvickyauction/global/exception/ErrorCode.java b/src/main/java/com/wootecam/luckyvickyauction/global/exception/ErrorCode.java index bf7cdee3..9522ca3a 100644 --- a/src/main/java/com/wootecam/luckyvickyauction/global/exception/ErrorCode.java +++ b/src/main/java/com/wootecam/luckyvickyauction/global/exception/ErrorCode.java @@ -9,7 +9,7 @@ public enum ErrorCode { A004("가격 변동폭은 0과 같거나 작을 수 없습니다."), A005("변동 시간 단위는 0과 같거나 작을 수 없습니다."), A006("경매의 시작 시간은 종료 시간보다 클 수 없습니다."), - A007("경매 생성 시, 경매 지속시간은 10, 20, 30, 40, 50, 60분이 아닌 경우 예외가 발생합니다."), + A007("경매 생성 시, 경매 지속시간이 60분을 넘기는 경우 예외가 발생합니다."), A008("경매 가격 변동폭은 경매 가격보다 낮아야 합니다."), A009("경매 생성 시, 할인율이 0퍼센트 미만이거나 50 퍼센트를 초과한 경우 예외가 발생합니다."), A010("경매ID를 기준으로 경매를 찾으려고 했지만 찾을 수 없습니다."), @@ -30,8 +30,9 @@ public enum ErrorCode { A025("JSON을 가격 정책 객체로 변환 시, 변환이 불가능할 경우 예외가 발생합니다."), A026("경매 입찰 요청 시, 요청 가격이 0보다 작으면 예외가 발생합니다."), A027("경매 입찰 요청 시, 요청 수량이 1 미만일 경우 예외가 발생합니다."), - A028("경매 생성 시, 경매 할인 주기 시간이 1, 5, 10분이 아닌 경우 예외가 발생합니다."), + A028("경매 생성 시, 경매 지속 시간에서 경매 할인 주기 시간을 나누었을때, 나누어 떨어지지 않는 경우 예외가 발생합니다."), A029("경매 생성 시, 경매 할인 주기 시간이 경매 지속 시간보다 크거나 같은 경우 예외가 발생합니다."), + A030("경매 생성 시, 경매 지속 시간이 정확히 분 단위가 아닌 경우 예외가 발생합니다."), // Receipt 관련 예외 코드 R000("거래 내역 조회 시, 거래 내역을 찾을 수 없을 경우 예외가 발생합니다."), diff --git a/src/main/java/com/wootecam/luckyvickyauction/global/util/Mapper.java b/src/main/java/com/wootecam/luckyvickyauction/global/util/Mapper.java index 44154b93..771412a2 100644 --- a/src/main/java/com/wootecam/luckyvickyauction/global/util/Mapper.java +++ b/src/main/java/com/wootecam/luckyvickyauction/global/util/Mapper.java @@ -9,7 +9,6 @@ import com.wootecam.luckyvickyauction.core.auction.entity.AuctionEntity; import com.wootecam.luckyvickyauction.core.member.domain.Member; import com.wootecam.luckyvickyauction.core.member.domain.Point; -import com.wootecam.luckyvickyauction.core.member.domain.Role; import com.wootecam.luckyvickyauction.core.member.entity.MemberEntity; import com.wootecam.luckyvickyauction.core.payment.domain.Receipt; import com.wootecam.luckyvickyauction.core.payment.dto.BuyerReceiptSimpleInfo; @@ -198,7 +197,7 @@ public static Member convertToMember(MemberEntity entity) { .id(entity.getId()) .signInId(entity.getSignInId()) .password(entity.getPassword()) - .role(Role.find(entity.getRole())) + .role(entity.getRole()) .point(new Point(entity.getPoint())) .build(); } @@ -208,7 +207,7 @@ public static MemberEntity convertToMemberEntity(Member member) { .id(member.getId()) .signInId(member.getSignInId()) .password(member.getPassword()) - .role(member.getRole().name()) + .role(member.getRole()) .point(member.getPoint().getAmount()) .build(); } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 618f3865..37b68bda 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -11,7 +11,7 @@ spring: database-platform: org.hibernate.dialect.MySQLDialect open-in-view: off hibernate: - ddl-auto: none + ddl-auto: create data: redis: diff --git a/src/main/resources/docs/index.html b/src/main/resources/docs/index.html index 32ad1920..23cd9ad6 100644 --- a/src/main/resources/docs/index.html +++ b/src/main/resources/docs/index.html @@ -835,14 +835,14 @@
A007
경매 생성 시, 경매 지속시간은 10, 20, 30, 40, 50, 60분이 아닌 경우 예외가 발생합니다.
경매 생성 시, 경매 지속시간이 60분을 넘기는 경우 예외가 발생합니다.
A008
A028
경매 생성 시, 경매 할인 주기 시간이 1, 5, 10분이 아닌 경우 예외가 발생합니다.
경매 생성 시, 경매 지속 시간에서 경매 할인 주기 시간을 나누었을때, 나누어 떨어지지 않는 경우 예외가 발생합니다.
A029
경매 생성 시, 경매 할인 주기 시간이 경매 지속 시간보다 크거나 같은 경우 예외가 발생합니다.
A030
경매 생성 시, 경매 지속 시간이 정확히 분 단위가 아닌 경우 예외가 발생합니다.
R000
거래 내역 조회 시, 거래 내역을 찾을 수 없을 경우 예외가 발생합니다.