diff --git a/src/main/java/com/yello/server/domain/authorization/service/AuthService.java b/src/main/java/com/yello/server/domain/authorization/service/AuthService.java index cffd8941..40140383 100644 --- a/src/main/java/com/yello/server/domain/authorization/service/AuthService.java +++ b/src/main/java/com/yello/server/domain/authorization/service/AuthService.java @@ -117,8 +117,8 @@ public void recommendUser(String recommendYelloId, String userYelloId) { UserDataType.RECOMMENDED); recommendedUser.addRecommendCount(1L); - recommendedUser.addPoint(RECOMMEND_POINT); - user.addPoint(RECOMMEND_POINT); + recommendedUser.addPointBySubscribe(RECOMMEND_POINT); + user.addPointBySubscribe(RECOMMEND_POINT); if (recommended.isEmpty()) { recommendedUser.addTicketCount(1); diff --git a/src/main/java/com/yello/server/domain/event/controller/EventController.java b/src/main/java/com/yello/server/domain/event/controller/EventController.java index c6bc8086..e6a10776 100644 --- a/src/main/java/com/yello/server/domain/event/controller/EventController.java +++ b/src/main/java/com/yello/server/domain/event/controller/EventController.java @@ -4,10 +4,13 @@ import static com.yello.server.global.common.SuccessCode.EVENT_JOIN_SUCCESS; import static com.yello.server.global.common.SuccessCode.EVENT_NOTICE_SUCCESS; import static com.yello.server.global.common.SuccessCode.EVENT_REWARD_SUCCESS; +import static com.yello.server.global.common.SuccessCode.REWARD_ADMOB_SUCCESS; import static com.yello.server.global.common.SuccessCode.VERIFY_ADMOB_SSV_SUCCESS; import static com.yello.server.global.common.util.ConstantUtil.IdempotencyKeyHeader; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ser.Serializers.Base; +import com.yello.server.domain.event.dto.request.AdmobRewardRequest; import com.yello.server.domain.event.dto.request.EventJoinRequest; import com.yello.server.domain.event.dto.response.EventResponse; import com.yello.server.domain.event.dto.response.EventRewardResponse; @@ -63,7 +66,7 @@ public BaseResponse rewardEvent(@AccessTokenUser User user, } @GetMapping("/v1/admob/verify") - public BaseResponse verifyAdmobReward(HttpServletRequest request) { + public BaseResponse verifyAdmob(HttpServletRequest request) { URI uri; try { uri = @@ -72,9 +75,13 @@ public BaseResponse verifyAdmobReward(HttpServletRequest request) { } catch (URISyntaxException e) { throw new EventBadRequestException(ADMOB_URI_BAD_REQUEST_EXCEPTION); } - eventService.verifyAdmobReward(uri, request); - return BaseResponse.success(VERIFY_ADMOB_SSV_SUCCESS); } + + @PostMapping("/v1/admob/reward") + public BaseResponse rewardAdmob(@AccessTokenUser User user, @RequestBody AdmobRewardRequest request) { + val data = eventService.rewardAdmob(user.getId(), request); + return BaseResponse.success(REWARD_ADMOB_SUCCESS, data); + } } diff --git a/src/main/java/com/yello/server/domain/event/dto/request/AdmobRewardRequest.java b/src/main/java/com/yello/server/domain/event/dto/request/AdmobRewardRequest.java new file mode 100644 index 00000000..b7e917ef --- /dev/null +++ b/src/main/java/com/yello/server/domain/event/dto/request/AdmobRewardRequest.java @@ -0,0 +1,13 @@ +package com.yello.server.domain.event.dto.request; + +import lombok.Builder; + +@Builder +public record AdmobRewardRequest( + String rewardType, + String randomType, + String uuid, + Integer rewardNumber +) { + +} diff --git a/src/main/java/com/yello/server/domain/event/entity/EventHistory.java b/src/main/java/com/yello/server/domain/event/entity/EventHistory.java index 1b493fc6..92cbecce 100644 --- a/src/main/java/com/yello/server/domain/event/entity/EventHistory.java +++ b/src/main/java/com/yello/server/domain/event/entity/EventHistory.java @@ -44,4 +44,8 @@ public static EventHistory of(User user, UUID uuidIdempotencyKey) { .idempotencyKey(uuidIdempotencyKey) .build(); } + + public void update(User user) { + this.user = user; + } } diff --git a/src/main/java/com/yello/server/domain/event/entity/EventInstance.java b/src/main/java/com/yello/server/domain/event/entity/EventInstance.java index 95f80bd4..29f83cb3 100644 --- a/src/main/java/com/yello/server/domain/event/entity/EventInstance.java +++ b/src/main/java/com/yello/server/domain/event/entity/EventInstance.java @@ -1,5 +1,7 @@ package com.yello.server.domain.event.entity; +import static com.yello.server.global.common.util.ConstantUtil.GlobalZoneId; + import com.yello.server.global.common.entity.ZonedDateTimeConverter; import jakarta.persistence.Column; import jakarta.persistence.Convert; @@ -10,6 +12,7 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; +import java.time.OffsetTime; import java.time.ZonedDateTime; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -48,6 +51,15 @@ public class EventInstance { @Builder.Default private Long remainEventCount = 0L; + public static EventInstance of(EventTime eventTime, EventHistory eventHistory) { + ZonedDateTime now = ZonedDateTime.now(GlobalZoneId); + return EventInstance.builder() + .eventHistory(eventHistory) + .eventTime(eventTime) + .instanceDate(now) + .build(); + } + public void subRemainEventCount(Long amount) { this.remainEventCount -= amount; } diff --git a/src/main/java/com/yello/server/domain/event/entity/EventInstanceReward.java b/src/main/java/com/yello/server/domain/event/entity/EventInstanceReward.java index 4d8cf899..73b77619 100644 --- a/src/main/java/com/yello/server/domain/event/entity/EventInstanceReward.java +++ b/src/main/java/com/yello/server/domain/event/entity/EventInstanceReward.java @@ -45,5 +45,14 @@ public class EventInstanceReward extends AuditingTimeEntity { @Column private String rewardImage; + public static EventInstanceReward of(EventInstance eventInstance, EventReward eventReward) { + return EventInstanceReward.builder() + .eventInstance(eventInstance) + .rewardTag(eventReward.getTag()) + .rewardValue(eventReward.getMinRewardValue()) + .rewardTitle(eventReward.getRewardTitle()) + .rewardImage(eventReward.getRewardImage()) + .build(); + } } diff --git a/src/main/java/com/yello/server/domain/event/entity/EventReward.java b/src/main/java/com/yello/server/domain/event/entity/EventReward.java index b6066617..ecd963c9 100644 --- a/src/main/java/com/yello/server/domain/event/entity/EventReward.java +++ b/src/main/java/com/yello/server/domain/event/entity/EventReward.java @@ -54,4 +54,8 @@ public class EventReward { @Column private String rewardImage; + + public void updateMinRewardValue(Long rewardValue) { + this.minRewardValue = rewardValue; + } } diff --git a/src/main/java/com/yello/server/domain/event/entity/RandomType.java b/src/main/java/com/yello/server/domain/event/entity/RandomType.java new file mode 100644 index 00000000..d3f9214f --- /dev/null +++ b/src/main/java/com/yello/server/domain/event/entity/RandomType.java @@ -0,0 +1,32 @@ +package com.yello.server.domain.event.entity; + +import static com.yello.server.global.common.ErrorCode.ENUM_BAD_REQUEST_EXCEPTION; + +import com.yello.server.global.exception.EnumIllegalArgumentException; +import java.util.Arrays; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum RandomType { + FIXED("FIXED"), + RANDOM("RANDOM"), + ADMOB_RANDOM("ADMOB_RANDOM"); + + private final String initial; + + public static RandomType fromCode(String dbData) { + return Arrays.stream(RandomType.values()) + .filter(v -> v.getInitial().equals(dbData)) + .findAny() + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); + } + + public static RandomType fromName(String name) { + return Arrays.stream(RandomType.values()) + .filter(v -> v.name().equals(name)) + .findAny() + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); + } +} diff --git a/src/main/java/com/yello/server/domain/event/entity/RandomTypeConverter.java b/src/main/java/com/yello/server/domain/event/entity/RandomTypeConverter.java new file mode 100644 index 00000000..83e6272d --- /dev/null +++ b/src/main/java/com/yello/server/domain/event/entity/RandomTypeConverter.java @@ -0,0 +1,27 @@ +package com.yello.server.domain.event.entity; + +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; +import lombok.extern.log4j.Log4j2; + +@Converter +@Log4j2 +public class RandomTypeConverter implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(RandomType type) { + if (type == null) { + return null; + } + return type.name(); + } + + @Override + public RandomType convertToEntityAttribute(String dbData) { + if (dbData == null) { + return null; + } + + return RandomType.fromName(dbData); + } +} diff --git a/src/main/java/com/yello/server/domain/event/entity/RewardType.java b/src/main/java/com/yello/server/domain/event/entity/RewardType.java new file mode 100644 index 00000000..8a995b48 --- /dev/null +++ b/src/main/java/com/yello/server/domain/event/entity/RewardType.java @@ -0,0 +1,33 @@ +package com.yello.server.domain.event.entity; + +import static com.yello.server.global.common.ErrorCode.ENUM_BAD_REQUEST_EXCEPTION; + +import com.yello.server.global.exception.EnumIllegalArgumentException; +import java.util.Arrays; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum RewardType { + POINT("POINT"), + TICKET("TICKET"), + ADMOB_POINT("ADMOB_POINT"), + ADMOB_MULTIPLE_POINT("ADMOB_MULTIPLE_POINT"); + + private final String initial; + + public static RewardType fromCode(String dbData) { + return Arrays.stream(RewardType.values()) + .filter(v -> v.getInitial().equals(dbData)) + .findAny() + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); + } + + public static RewardType fromName(String name) { + return Arrays.stream(RewardType.values()) + .filter(v -> v.name().equals(name)) + .findAny() + .orElseThrow(() -> new EnumIllegalArgumentException(ENUM_BAD_REQUEST_EXCEPTION)); + } +} diff --git a/src/main/java/com/yello/server/domain/event/entity/RewardTypeConverter.java b/src/main/java/com/yello/server/domain/event/entity/RewardTypeConverter.java new file mode 100644 index 00000000..22eb7ef8 --- /dev/null +++ b/src/main/java/com/yello/server/domain/event/entity/RewardTypeConverter.java @@ -0,0 +1,27 @@ +package com.yello.server.domain.event.entity; + +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; +import lombok.extern.log4j.Log4j2; + +@Converter +@Log4j2 +public class RewardTypeConverter implements AttributeConverter { + + @Override + public String convertToDatabaseColumn(RewardType type) { + if (type == null) { + return null; + } + return type.name(); + } + + @Override + public RewardType convertToEntityAttribute(String dbData) { + if (dbData == null) { + return null; + } + + return RewardType.fromName(dbData); + } +} diff --git a/src/main/java/com/yello/server/domain/event/exception/EventForbiddenException.java b/src/main/java/com/yello/server/domain/event/exception/EventForbiddenException.java new file mode 100644 index 00000000..304e1ceb --- /dev/null +++ b/src/main/java/com/yello/server/domain/event/exception/EventForbiddenException.java @@ -0,0 +1,11 @@ +package com.yello.server.domain.event.exception; + +import com.yello.server.global.common.ErrorCode; +import com.yello.server.global.exception.CustomException; + +public class EventForbiddenException extends CustomException { + + public EventForbiddenException(ErrorCode error) { + super(error, "[EventForbiddenException] " + error.getMessage()); + } +} diff --git a/src/main/java/com/yello/server/domain/event/repository/EventRepository.java b/src/main/java/com/yello/server/domain/event/repository/EventRepository.java index f7d3b768..5acbd26a 100644 --- a/src/main/java/com/yello/server/domain/event/repository/EventRepository.java +++ b/src/main/java/com/yello/server/domain/event/repository/EventRepository.java @@ -41,4 +41,7 @@ public interface EventRepository { Optional findHistoryByIdempotencyKey(UUID idempotencyKey); Optional findInstanceByEventHistory(EventHistory eventHistory); + + EventReward findRewardByTag(String rewardTag); + EventRewardMapping findRewardMappingByEventRewardId(Long eventRewardId); } diff --git a/src/main/java/com/yello/server/domain/event/repository/EventRepositoryImpl.java b/src/main/java/com/yello/server/domain/event/repository/EventRepositoryImpl.java index 8de36ba5..de72099a 100644 --- a/src/main/java/com/yello/server/domain/event/repository/EventRepositoryImpl.java +++ b/src/main/java/com/yello/server/domain/event/repository/EventRepositoryImpl.java @@ -1,8 +1,12 @@ package com.yello.server.domain.event.repository; +import static com.yello.server.domain.event.entity.QEventReward.eventReward; +import static com.yello.server.domain.event.entity.QEventRewardMapping.eventRewardMapping; import static com.yello.server.global.common.ErrorCode.EVENT_NOT_FOUND_EXCEPTION; import static com.yello.server.global.common.ErrorCode.EVENT_RANDOM_NOT_FOUND_EXCEPTION; +import static com.yello.server.global.common.ErrorCode.NOT_FOUND_EVENT_REWARD_EXCEPTION; +import com.querydsl.jpa.impl.JPAQueryFactory; import com.yello.server.domain.event.entity.Event; import com.yello.server.domain.event.entity.EventHistory; import com.yello.server.domain.event.entity.EventInstance; @@ -32,6 +36,7 @@ public class EventRepositoryImpl implements EventRepository { private final EventRewardJpaRepository eventRewardJpaRepository; private final EventRewardMappingJpaRepository eventRewardMappingJpaRepository; private final EventTimeJpaRepository eventTimeJpaRepository; + private final JPAQueryFactory jpaQueryFactory; @Override public EventHistory save(EventHistory newEventHistory) { @@ -100,4 +105,18 @@ public Optional findHistoryByIdempotencyKey(UUID idempotencyKey) { public Optional findInstanceByEventHistory(EventHistory eventHistory) { return eventInstanceJpaRepository.findTopByEventHistory(eventHistory); } + + @Override + public EventReward findRewardByTag(String rewardTag) { + return Optional.ofNullable(jpaQueryFactory.selectFrom(eventReward) + .where(eventReward.tag.eq(rewardTag)) + .fetchOne()).orElseThrow(() -> new EventNotFoundException(NOT_FOUND_EVENT_REWARD_EXCEPTION)); + } + + @Override + public EventRewardMapping findRewardMappingByEventRewardId(Long eventRewardId) { + return Optional.ofNullable(jpaQueryFactory.selectFrom(eventRewardMapping) + .where(eventRewardMapping.eventReward.id.eq(eventRewardId)) + .fetchOne()).orElseThrow(() -> new EventNotFoundException(NOT_FOUND_EVENT_REWARD_EXCEPTION)); + } } diff --git a/src/main/java/com/yello/server/domain/event/service/EventService.java b/src/main/java/com/yello/server/domain/event/service/EventService.java index ee964c6e..acc6e4d6 100644 --- a/src/main/java/com/yello/server/domain/event/service/EventService.java +++ b/src/main/java/com/yello/server/domain/event/service/EventService.java @@ -1,5 +1,6 @@ package com.yello.server.domain.event.service; +import static com.yello.server.global.common.ErrorCode.DUPLICATE_ADMOB_REWARD_EXCEPTION; import static com.yello.server.global.common.ErrorCode.EVENT_COUNT_BAD_REQUEST_EXCEPTION; import static com.yello.server.global.common.ErrorCode.EVENT_DATE_BAD_REQUEST_EXCEPTION; import static com.yello.server.global.common.ErrorCode.EVENT_TIME_BAD_REQUEST_EXCEPTION; @@ -11,6 +12,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.crypto.tink.apps.rewardedads.RewardedAdsVerifier; +import com.yello.server.domain.event.dto.request.AdmobRewardRequest; import com.yello.server.domain.event.dto.request.AdmobSsvRequest; import com.yello.server.domain.event.dto.request.EventJoinRequest; import com.yello.server.domain.event.dto.response.EventResponse; @@ -24,7 +26,10 @@ import com.yello.server.domain.event.entity.EventRewardMapping; import com.yello.server.domain.event.entity.EventTime; import com.yello.server.domain.event.entity.EventType; +import com.yello.server.domain.event.entity.RandomType; +import com.yello.server.domain.event.entity.RewardType; import com.yello.server.domain.event.exception.EventBadRequestException; +import com.yello.server.domain.event.exception.EventForbiddenException; import com.yello.server.domain.event.exception.EventNotFoundException; import com.yello.server.domain.event.repository.EventRepository; import com.yello.server.domain.user.entity.User; @@ -39,7 +44,6 @@ import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.Random; import java.util.UUID; @@ -106,7 +110,8 @@ public List getEvents(Long userId) throws JsonProcessingException // 이벤트 시간대가 있고, 보상 카운트가 0인 참여이력의 숫자가 RewardCount 보다 적을 때 // k번 이벤트 참여는 보상 카운트로 구현한다. boolean isEventAvailable = - !eventTimeList.isEmpty() && (eventTimeList.get(0).getRewardCount() > eventInstanceList.size()); + !eventTimeList.isEmpty() && (eventTimeList.get(0).getRewardCount() + > eventInstanceList.size()); final EventTime eventTime = isEventAvailable ? eventTimeList.get(0) : null; final List eventRewardMappingList = @@ -203,13 +208,15 @@ public EventRewardResponse rewardEvent(Long userId, UUID uuidIdempotencyKey) final EventRewardMapping randomRewardMapping = selectRandomly(eventRewardMappingList); final long randomValue = selectRandomValue(randomRewardMapping); - final EventInstanceReward eventInstanceReward = eventRepository.save(EventInstanceReward.builder() - .eventInstance(eventInstance.get()) - .rewardTag(randomRewardMapping.getEventReward().getTag()) - .rewardValue(randomValue) - .rewardTitle(String.format(randomRewardMapping.getEventReward().getRewardTitle(), randomValue)) - .rewardImage(randomRewardMapping.getEventReward().getRewardImage()) - .build()); + final EventInstanceReward eventInstanceReward = + eventRepository.save(EventInstanceReward.builder() + .eventInstance(eventInstance.get()) + .rewardTag(randomRewardMapping.getEventReward().getTag()) + .rewardValue(randomValue) + .rewardTitle(String.format(randomRewardMapping.getEventReward().getRewardTitle(), + randomValue)) + .rewardImage(randomRewardMapping.getEventReward().getRewardImage()) + .build()); /** * TODO 그냥 문자열로 저장하고 있는데, 어떻게 해야 enum의 문제를 극복하면서 switch와 함꼐 사용할 수 있을지 고민해야함. @@ -217,13 +224,14 @@ public EventRewardResponse rewardEvent(Long userId, UUID uuidIdempotencyKey) if (randomRewardMapping.getEventReward().getTag().equals("TICKET")) { user.addTicketCount((int) randomValue); } else if (randomRewardMapping.getEventReward().getTag().equals("POINT")) { - user.addPoint((int) randomValue); + user.addPointBySubscribe((int) randomValue); } eventInstance.get().subRemainEventCount(1L); return EventRewardResponse.of(eventInstanceReward); } @SneakyThrows + @Transactional public void verifyAdmobReward(URI uri, HttpServletRequest request) { // 1. admob 검증하기 RewardedAdsVerifier verifier = new RewardedAdsVerifier.Builder() @@ -247,6 +255,60 @@ public void verifyAdmobReward(URI uri, HttpServletRequest request) { eventRepository.save(EventHistory.of(null, uuidIdempotencyKey)); } + @Transactional + public EventRewardResponse rewardAdmob(Long userId, AdmobRewardRequest request) { + UUID uuid = UuidFactory.checkUuid(request.uuid()); + final User user = userRepository.getById(userId); + + // 멱등키를 통해 해당 history 찾기 + final Optional eventHistory = + eventRepository.findHistoryByIdempotencyKey(uuid); + if (eventHistory.isEmpty()) { + throw new EventBadRequestException(IDEMPOTENCY_KEY_NOT_FOUND_EXCEPTION); + } + + // history 있으면 userId로 세팅 + if (eventHistory.get().getUser()!=null) { + throw new EventForbiddenException(DUPLICATE_ADMOB_REWARD_EXCEPTION); + } + eventHistory.get().update(user); + + // event_random tag 확인 후 reward + EventReward eventReward = null; + switch (RandomType.fromCode(request.randomType())) { + case FIXED, ADMOB_RANDOM -> { + eventReward = handleRewardByType(request, user); + } + } + EventRewardMapping rewardMapping = + eventRepository.findRewardMappingByEventRewardId(eventReward.getId()); + + // event_instance에 해당 데이터 저장 + EventInstance eventInstance = eventRepository.save( + EventInstance.of(rewardMapping.getEventTime(), eventHistory.get())); + EventInstanceReward rewardInstance = + eventRepository.save(EventInstanceReward.of(eventInstance, eventReward)); + + return EventRewardResponse.of(rewardInstance); + } + + private EventReward handleRewardByType(AdmobRewardRequest request, User user) { + switch (RewardType.fromCode(request.rewardType())) { + case ADMOB_POINT -> { + EventReward rewardByTag = eventRepository.findRewardByTag(request.rewardType()); + user.addPoint(Math.toIntExact((rewardByTag.getMinRewardValue()))); + return rewardByTag; + } + case ADMOB_MULTIPLE_POINT -> { + EventReward rewardByTag = eventRepository.findRewardByTag(request.rewardType()); + user.addPoint(request.rewardNumber()); + rewardByTag.updateMinRewardValue(Long.valueOf(request.rewardNumber() * 2)); + return rewardByTag; + } + } + return null; + } + private @NotNull EventRewardMapping selectRandomly( @NotEmpty List eventRewardMappingList) { // 전체 확률 합계를 계산합니다. diff --git a/src/main/java/com/yello/server/domain/user/entity/User.java b/src/main/java/com/yello/server/domain/user/entity/User.java index c9afcfdb..76b52ddc 100644 --- a/src/main/java/com/yello/server/domain/user/entity/User.java +++ b/src/main/java/com/yello/server/domain/user/entity/User.java @@ -169,7 +169,7 @@ public void renew() { } - public void addPoint(Integer point) { + public void addPointBySubscribe(Integer point) { if (this.getSubscribe() == Subscribe.NORMAL) { this.point += point; return; @@ -180,6 +180,9 @@ public void addPoint(Integer point) { public void subPoint(Integer point) { this.point -= point; } + public void addPoint(Integer point) { + this.point += point; + } public void addRecommendCount(Long recommendCount) { this.recommendCount += recommendCount; diff --git a/src/main/java/com/yello/server/domain/vote/service/VoteService.java b/src/main/java/com/yello/server/domain/vote/service/VoteService.java index f2fc3823..4b358827 100644 --- a/src/main/java/com/yello/server/domain/vote/service/VoteService.java +++ b/src/main/java/com/yello/server/domain/vote/service/VoteService.java @@ -7,13 +7,11 @@ import static com.yello.server.global.common.ErrorCode.REVEAL_FULL_NAME_VOTE_EXCEPTION; import static com.yello.server.global.common.ErrorCode.WRONG_VOTE_TYPE_FORBIDDEN; import static com.yello.server.global.common.factory.TimeFactory.minusTime; -import static com.yello.server.global.common.util.ConstantUtil.ALL_VOTE_TYPE; import static com.yello.server.global.common.util.ConstantUtil.CHECK_FULL_NAME; import static com.yello.server.global.common.util.ConstantUtil.COOL_DOWN_TIME; import static com.yello.server.global.common.util.ConstantUtil.MINUS_TICKET_COUNT; import static com.yello.server.global.common.util.ConstantUtil.NO_FRIEND_COUNT; import static com.yello.server.global.common.util.ConstantUtil.RANDOM_COUNT; -import static com.yello.server.global.common.util.ConstantUtil.USER_VOTE_TYPE; import com.yello.server.domain.cooldown.entity.Cooldown; import com.yello.server.domain.cooldown.repository.CooldownRepository; @@ -47,7 +45,6 @@ import com.yello.server.domain.vote.exception.VoteForbiddenException; import com.yello.server.domain.vote.exception.VoteNotFoundException; import com.yello.server.domain.vote.repository.VoteRepository; -import com.yello.server.global.common.ErrorCode; import com.yello.server.infrastructure.rabbitmq.service.ProducerService; import java.time.LocalDateTime; import java.util.List; @@ -213,7 +210,7 @@ public VoteCreateVO createVote(Long userId, CreateVoteRequest request) { cooldown.updateDate(LocalDateTime.now()); producerService.produceVoteAvailableNotification(cooldown); - sender.addPoint(request.totalPoint()); + sender.addPointBySubscribe(request.totalPoint()); return VoteCreateVO.of(sender.getPoint(), votes); } diff --git a/src/main/java/com/yello/server/global/common/ErrorCode.java b/src/main/java/com/yello/server/global/common/ErrorCode.java index d690e7e8..5544893a 100644 --- a/src/main/java/com/yello/server/global/common/ErrorCode.java +++ b/src/main/java/com/yello/server/global/common/ErrorCode.java @@ -74,6 +74,7 @@ public enum ErrorCode { GOOGLE_SUBSCRIPTIONS_FORBIDDEN_EXCEPTION(FORBIDDEN, "이미 YELLO: PLUS를 구독한 상태입니다."), GOOGLE_SUBSCRIPTION_TRANSACTION_EXPIRED_EXCEPTION(FORBIDDEN, "이미 만료된 결제 내역의 영수증입니다."), WRONG_VOTE_TYPE_FORBIDDEN(FORBIDDEN, "잘못된 투표 유형입니다."), + DUPLICATE_ADMOB_REWARD_EXCEPTION(FORBIDDEN, "이미 광고 보상에 대한 처리가 완료되었습니다."), /** * 404 NOT FOUND @@ -108,6 +109,7 @@ public enum ErrorCode { EVENT_TIME_NOT_FOUND_EXCEPTION(NOT_FOUND, "해당 EventTime가 존재하지 않습니다."), IDEMPOTENCY_KEY_NOT_FOUND_EXCEPTION(NOT_FOUND, "멱등키의 이벤트가 존재하지 않습니다. 이벤트 참여를 먼저 해주세요"), EVENT_RANDOM_NOT_FOUND_EXCEPTION(NOT_FOUND, "해당 EventRandom가 존재하지 않습니다."), + NOT_FOUND_EVENT_REWARD_EXCEPTION(NOT_FOUND, "해당 EventReward가 존재하지 않습니다."), /** * 409 CONFLICT diff --git a/src/main/java/com/yello/server/global/common/SuccessCode.java b/src/main/java/com/yello/server/global/common/SuccessCode.java index cbc4d011..b589d2c0 100644 --- a/src/main/java/com/yello/server/global/common/SuccessCode.java +++ b/src/main/java/com/yello/server/global/common/SuccessCode.java @@ -77,7 +77,8 @@ public enum SuccessCode { PURCHASE_SUBSCRIPTION_VERIFY_SUCCESS(CREATED, "애플 결제 검증 및 반영에 성공하였습니다."), GOOGLE_PURCHASE_SUBSCRIPTION_VERIFY_SUCCESS(CREATED, "구글 구독 결제 검증 및 반영에 성공하였습니다."), GOOGLE_PURCHASE_INAPP_VERIFY_SUCCESS(CREATED, "구글 인앱 결제 검증 및 반영에 성공하였습니다."), - LOGIN_USER_ADMIN_SUCCESS(CREATED, "어드민 로그인에 성공하였습니다."); + LOGIN_USER_ADMIN_SUCCESS(CREATED, "어드민 로그인에 성공하였습니다."), + REWARD_ADMOB_SUCCESS(CREATED, "Admob 광고 보고 보상받기에 성공했습니다."); private final HttpStatus httpStatus; diff --git a/src/main/java/com/yello/server/global/common/util/ConstantUtil.java b/src/main/java/com/yello/server/global/common/util/ConstantUtil.java index f67a0d7c..d16758c3 100644 --- a/src/main/java/com/yello/server/global/common/util/ConstantUtil.java +++ b/src/main/java/com/yello/server/global/common/util/ConstantUtil.java @@ -76,7 +76,6 @@ public class ConstantUtil { public static final String USER_VOTE_TYPE = "send"; public static final String ALL_VOTE_TYPE = "all"; - private ConstantUtil() { throw new IllegalStateException(); } diff --git a/src/main/java/com/yello/server/global/exception/ControllerExceptionAdvice.java b/src/main/java/com/yello/server/global/exception/ControllerExceptionAdvice.java index e6933092..3b123387 100644 --- a/src/main/java/com/yello/server/global/exception/ControllerExceptionAdvice.java +++ b/src/main/java/com/yello/server/global/exception/ControllerExceptionAdvice.java @@ -21,6 +21,7 @@ import com.yello.server.domain.authorization.exception.NotValidTokenForbiddenException; import com.yello.server.domain.authorization.exception.OAuthException; import com.yello.server.domain.event.exception.EventBadRequestException; +import com.yello.server.domain.event.exception.EventForbiddenException; import com.yello.server.domain.event.exception.EventNotFoundException; import com.yello.server.domain.friend.exception.FriendException; import com.yello.server.domain.friend.exception.FriendNotFoundException; @@ -173,7 +174,8 @@ public ResponseEntity UnauthorizedException(CustomException except VoteForbiddenException.class, NotSignedInException.class, NotExpiredTokenForbiddenException.class, - NotValidTokenForbiddenException.class + NotValidTokenForbiddenException.class, + EventForbiddenException.class }) public ResponseEntity ForbiddenException(CustomException exception) { return ResponseEntity.status(FORBIDDEN) diff --git a/src/test/java/com/yello/server/domain/user/small/UserTest.java b/src/test/java/com/yello/server/domain/user/small/UserTest.java index 3ed60b1a..f8d68c7d 100644 --- a/src/test/java/com/yello/server/domain/user/small/UserTest.java +++ b/src/test/java/com/yello/server/domain/user/small/UserTest.java @@ -85,7 +85,7 @@ void init() { assertThat(user.getPoint()).isEqualTo(200); // when - user.addPoint(RECOMMEND_POINT); + user.addPointBySubscribe(RECOMMEND_POINT); // then assertThat(user.getPoint()).isEqualTo(300);