From 11b655af70f0db04104fa21e91af159905369dfd Mon Sep 17 00:00:00 2001 From: hyeonjeongs Date: Fri, 16 Feb 2024 15:36:38 +0900 Subject: [PATCH 1/6] =?UTF-8?q?=ED=95=99=EA=B5=90=20=ED=82=A4=EC=9B=8C?= =?UTF-8?q?=EB=93=9C=20=EA=B2=80=EC=83=89=EC=8B=9C=20=ED=95=B4=EB=8B=B9=20?= =?UTF-8?q?=ED=95=99=EA=B5=90=EC=9D=B8=20=EC=B9=9C=EA=B5=AC=EB=93=A4=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/friend/service/FriendService.java | 83 ++++++------ .../user/repository/UserJpaRepository.java | 124 ++++++++++-------- .../user/repository/UserRepository.java | 2 + .../user/repository/UserRepositoryImpl.java | 5 + .../server/global/common/SuccessCode.java | 2 +- .../domain/user/FakeUserRepository.java | 9 ++ 6 files changed, 122 insertions(+), 103 deletions(-) diff --git a/src/main/java/com/yello/server/domain/friend/service/FriendService.java b/src/main/java/com/yello/server/domain/friend/service/FriendService.java index 9f907c75..4450a430 100644 --- a/src/main/java/com/yello/server/domain/friend/service/FriendService.java +++ b/src/main/java/com/yello/server/domain/friend/service/FriendService.java @@ -1,16 +1,7 @@ package com.yello.server.domain.friend.service; -import static com.yello.server.global.common.ErrorCode.EXIST_FRIEND_EXCEPTION; -import static com.yello.server.global.common.util.ConstantUtil.YELLO_FEMALE; -import static com.yello.server.global.common.util.ConstantUtil.YELLO_MALE; - import com.yello.server.domain.friend.dto.request.KakaoRecommendRequest; -import com.yello.server.domain.friend.dto.response.FriendResponse; -import com.yello.server.domain.friend.dto.response.FriendShuffleResponse; -import com.yello.server.domain.friend.dto.response.FriendsResponse; -import com.yello.server.domain.friend.dto.response.RecommendFriendResponse; -import com.yello.server.domain.friend.dto.response.SearchFriendResponse; -import com.yello.server.domain.friend.dto.response.SearchFriendVO; +import com.yello.server.domain.friend.dto.response.*; import com.yello.server.domain.friend.entity.Friend; import com.yello.server.domain.friend.exception.FriendException; import com.yello.server.domain.friend.repository.FriendRepository; @@ -20,12 +11,6 @@ import com.yello.server.domain.vote.repository.VoteRepository; import com.yello.server.domain.vote.service.VoteManager; import com.yello.server.global.common.factory.PaginationFactory; -import java.lang.Character.UnicodeBlock; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Optional; import lombok.Builder; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; @@ -33,6 +18,13 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.lang.Character.UnicodeBlock; +import java.util.*; + +import static com.yello.server.global.common.ErrorCode.EXIST_FRIEND_EXCEPTION; +import static com.yello.server.global.common.util.ConstantUtil.YELLO_FEMALE; +import static com.yello.server.global.common.util.ConstantUtil.YELLO_MALE; + @Service @Builder @RequiredArgsConstructor @@ -47,13 +39,13 @@ public class FriendService { public FriendsResponse findAllFriends(Pageable pageable, Long userId) { final Page friendsData = friendRepository.findAllFriendsByUserId(pageable, userId); List friends = friendsData.stream() - .map(friend -> { - User targetUser = friend.getTarget(); - Integer friendCount = friendRepository.countAllByUserId(targetUser.getId()); - Integer yelloCount = voteRepository.countAllByReceiverUserId(targetUser.getId()); - return UserResponse.of(targetUser, yelloCount, friendCount); - }) - .toList(); + .map(friend -> { + User targetUser = friend.getTarget(); + Integer friendCount = friendRepository.countAllByUserId(targetUser.getId()); + Integer yelloCount = voteRepository.countAllByReceiverUserId(targetUser.getId()); + return UserResponse.of(targetUser, yelloCount, friendCount); + }) + .toList(); return FriendsResponse.of(friendsData.getTotalElements(), friends); } @@ -85,10 +77,10 @@ public RecommendFriendResponse findAllRecommendSchoolFriends(Pageable pageable, Integer size = userRepository.countAllByGroupNameFilteredByNotFriend(userId, user.getGroup().getGroupName()); List recommendFriends = - userRepository.findAllByGroupNameFilteredByNotFriend(userId, user.getGroup().getGroupName(), pageable) - .stream() - .map(FriendResponse::of) - .toList(); + userRepository.findAllByGroupNameFilteredByNotFriend(userId, user.getGroup().getGroupName(), pageable) + .stream() + .map(FriendResponse::of) + .toList(); return RecommendFriendResponse.of(size, recommendFriends); } @@ -106,25 +98,25 @@ public void deleteFriend(Long userId, Long targetId) { } public RecommendFriendResponse findAllRecommendKakaoFriends(Pageable pageable, Long userId, - KakaoRecommendRequest request) { + KakaoRecommendRequest request) { final User user = userRepository.getById(userId); List kakaoFriends = Arrays.stream(request.friendKakaoId()) - .filter(userRepository::existsByUuid) - .map(userRepository::getByUuid) - .filter(friend -> !friendRepository.existsByUserAndTarget(user.getId(), friend.getId())) - .toList(); + .filter(userRepository::existsByUuid) + .map(userRepository::getByUuid) + .filter(friend -> !friendRepository.existsByUserAndTarget(user.getId(), friend.getId())) + .toList(); List pageList = PaginationFactory.getPage(kakaoFriends, pageable) - .stream() - .map(FriendResponse::of) - .toList(); + .stream() + .map(FriendResponse::of) + .toList(); return RecommendFriendResponse.of(kakaoFriends.size(), pageList); } public SearchFriendResponse searchFriend(Long userId, Pageable pageable, - String keyword) { + String keyword) { final User user = userRepository.getById(userId); final String groupName = user.getGroup().getGroupName(); List uuidList = Arrays.asList(YELLO_FEMALE, YELLO_MALE); @@ -137,23 +129,24 @@ public SearchFriendResponse searchFriend(Long userId, Pageable pageable, if (!isEnglish(keyword)) { friendList.addAll( - userRepository.findAllByGroupContainingName(groupName, keyword, uuidList)); + userRepository.findAllByGroupContainingName(groupName, keyword, uuidList)); friendList.addAll( - userRepository.findAllByOtherGroupContainingName(groupName, keyword, uuidList)); + userRepository.findAllByOtherGroupContainingName(groupName, keyword, uuidList)); } else { friendList.addAll( - userRepository.findAllByGroupContainingYelloId(groupName, keyword, uuidList)); + userRepository.findAllByGroupContainingYelloId(groupName, keyword, uuidList)); friendList.addAll( - userRepository.findAllByOtherGroupContainingYelloId(groupName, keyword, uuidList)); + userRepository.findAllByOtherGroupContainingYelloId(groupName, keyword, uuidList)); + friendList.addAll(userRepository.findAllByGroupNameContainingAndFriendListNotContaining(keyword, uuidList, friendList)); } List pageList = PaginationFactory.getPage(friendList, pageable) - .stream() - .filter(friend -> !userId.equals(friend.getId())) - .map(friend -> SearchFriendVO.of(friend, - friendRepository.existsByUserAndTarget(userId, friend.getId()))) - .toList(); + .stream() + .filter(friend -> !userId.equals(friend.getId())) + .map(friend -> SearchFriendVO.of(friend, + friendRepository.existsByUserAndTarget(userId, friend.getId()))) + .toList(); return SearchFriendResponse.of(friendList.size(), pageList); } diff --git a/src/main/java/com/yello/server/domain/user/repository/UserJpaRepository.java b/src/main/java/com/yello/server/domain/user/repository/UserJpaRepository.java index 1d5eaab1..01d64b09 100644 --- a/src/main/java/com/yello/server/domain/user/repository/UserJpaRepository.java +++ b/src/main/java/com/yello/server/domain/user/repository/UserJpaRepository.java @@ -1,115 +1,125 @@ package com.yello.server.domain.user.repository; import com.yello.server.domain.user.entity.User; -import java.util.List; -import java.util.Optional; 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.List; +import java.util.Optional; + public interface UserJpaRepository extends JpaRepository { @Query("select u from User u " + - "where u.id = :id " + - "and u.deletedAt is null") + "where u.id = :id " + + "and u.deletedAt is null") Optional findById(@Param("id") Long id); @Query("select u from User u " + - "where u.id = :id") + "where u.id = :id") Optional findByIdNotFiltered(@Param("id") Long id); @Query("select u from User u " + - "where u.uuid = :uuid") + "where u.uuid = :uuid") Optional findByUuid(@Param("uuid") String uuid); @Query("select u from User u " + - "where u.uuid = :uuid") + "where u.uuid = :uuid") Optional findByUuidNotFiltered(@Param("uuid") String uuid); @Query("select case when count(u) > 0 then true else false end from User u " + - "where u.uuid = :uuid " + - "and u.deletedAt is null") + "where u.uuid = :uuid " + + "and u.deletedAt is null") boolean existsByUuid(@Param("uuid") String uuid); @Query("select u from User u " + - "where u.yelloId = :yelloId " + - "and u.deletedAt is null") + "where u.yelloId = :yelloId " + + "and u.deletedAt is null") Optional findByYelloId(@Param("yelloId") String yelloId); @Query("select u from User u " + - "where u.yelloId = :yelloId") + "where u.yelloId = :yelloId") Optional findByYelloIdNotFiltered(@Param("yelloId") String yelloId); @Query("select u from User u, UserGroup g " + - "where u.group.id = g.id " + - "and g.id = :groupId " + - "and u.deletedAt is null") + "where u.group.id = g.id " + + "and g.id = :groupId " + + "and u.deletedAt is null") List findAllByGroupId(@Param("groupId") Long groupId); @Query("select count (u) from User u, UserGroup g " + - "where u.group.id = g.id " + - "and g.groupName = :groupName " + - "and u.id <> :userId " + - "and u.id not in (select f.target.id from Friend f where :userId = f.user.id and f.target.deletedAt is null) " - + - "and u.deletedAt is null") + "where u.group.id = g.id " + + "and g.groupName = :groupName " + + "and u.id <> :userId " + + "and u.id not in (select f.target.id from Friend f where :userId = f.user.id and f.target.deletedAt is null) " + + + "and u.deletedAt is null") Integer countAllByGroupNameFilteredByNotFriend(@Param("userId") Long userId, @Param("groupName") String groupName); @Query("select u from User u, UserGroup g " + - "where u.group.id = g.id " + - "and g.groupName = :groupName " + - "and u.id <> :userId " + - "and u.id not in (select f.target.id from Friend f where :userId = f.user.id and f.target.deletedAt is null) " - + - "and u.deletedAt is null") + "where u.group.id = g.id " + + "and g.groupName = :groupName " + + "and u.id <> :userId " + + "and u.id not in (select f.target.id from Friend f where :userId = f.user.id and f.target.deletedAt is null) " + + + "and u.deletedAt is null") List findAllByGroupNameFilteredByNotFriend(@Param("userId") Long userId, - @Param("groupName") String groupName, Pageable pageable); + @Param("groupName") String groupName, Pageable pageable); @Query("select u from User u " - + "where u.group.groupName = :groupName " - + "and u.uuid not in :uuidList " - + "and u.name like CONCAT('%', :keyword, '%') " - + "and u.deletedAt is null " - + "order by u.name ASC ") + + "where u.group.groupName = :groupName " + + "and u.uuid not in :uuidList " + + "and u.name like CONCAT('%', :keyword, '%') " + + "and u.deletedAt is null " + + "order by u.name ASC ") List findAllByGroupContainingName(@Param("groupName") String groupName, - @Param("keyword") String keyword, @Param("uuidList") List uuidList); + @Param("keyword") String keyword, @Param("uuidList") List uuidList); @Query("select u from User u " - + "where u.group.groupName <> :groupName " - + "and u.uuid not in :uuidList " - + "and u.name like CONCAT('%', :keyword, '%') " - + "and u.deletedAt is null " - + "order by u.groupAdmissionYear DESC ") + + "where u.group.groupName <> :groupName " + + "and u.uuid not in :uuidList " + + "and u.name like CONCAT('%', :keyword, '%') " + + "and u.deletedAt is null " + + "order by u.groupAdmissionYear DESC ") List findAllByOtherGroupContainingName(@Param("groupName") String groupName, - @Param("keyword") String keyword, @Param("uuidList") List uuidList); + @Param("keyword") String keyword, @Param("uuidList") List uuidList); + + @Query("select u from User u " + + "where u.group.groupName like CONCAT('%', :keyword, '%') " + + "and u.uuid not in :uuidList " + + "and u not in :friendList " + + "and u.deletedAt is null " + + "order by u.name ASC ") + List findAllByGroupContaining(@Param("keyword") String keyword, @Param("uuidList") List uuidList, @Param("friendList") List friendList); + @Query("select u from User u " - + "where u.group.groupName = :groupName " - + "and u.uuid not in :uuidList " - + "and LOWER(u.yelloId) like LOWER(CONCAT('%', :keyword, '%')) " - + "and u.deletedAt is null " - + "order by u.yelloId ASC ") + + "where u.group.groupName = :groupName " + + "and u.uuid not in :uuidList " + + "and LOWER(u.yelloId) like LOWER(CONCAT('%', :keyword, '%')) " + + "and u.deletedAt is null " + + "order by u.yelloId ASC ") List findAllByGroupContainingYelloId(@Param("groupName") String groupName, - @Param("keyword") String keyword, @Param("uuidList") List uuidList); + @Param("keyword") String keyword, @Param("uuidList") List uuidList); @Query("select u from User u " - + "where u.group.groupName <> :groupName " - + "and u.uuid not in :uuidList " - + "and LOWER(u.yelloId) like LOWER(CONCAT('%', :keyword, '%')) " - + "and u.deletedAt is null " - + "order by u.groupAdmissionYear DESC ") + + "where u.group.groupName <> :groupName " + + "and u.uuid not in :uuidList " + + "and LOWER(u.yelloId) like LOWER(CONCAT('%', :keyword, '%')) " + + "and u.deletedAt is null " + + "order by u.groupAdmissionYear DESC ") List findAllByOtherGroupContainingYelloId(@Param("groupName") String groupName, - @Param("keyword") String keyword, @Param("uuidList") List uuidList); + @Param("keyword") String keyword, @Param("uuidList") List uuidList); @Query("select u from User u " - + "where u.deviceToken = :deviceToken " - + "and u.deletedAt is null") + + "where u.deviceToken = :deviceToken " + + "and u.deletedAt is null") Optional findByDeviceToken(@Param("deviceToken") String deviceToken); @Query("select u from User u " + - "where u.deviceToken = :deviceToken") + "where u.deviceToken = :deviceToken") Optional findByDeviceTokenNotFiltered(@Param("deviceToken") String deviceToken); Long countAllByYelloIdContaining(String yelloId); @@ -117,10 +127,10 @@ List findAllByOtherGroupContainingYelloId(@Param("groupName") String group Long countAllByNameContaining(String name); @Query("select u from User u " - + "where LOWER(u.yelloId) like LOWER(CONCAT('%', :yelloId, '%'))") + + "where LOWER(u.yelloId) like LOWER(CONCAT('%', :yelloId, '%'))") Page findAllByYelloIdContaining(Pageable pageable, @Param("yelloId") String yelloId); @Query("select u from User u " - + "where LOWER(u.name) like LOWER(CONCAT('%', :name, '%'))") + + "where LOWER(u.name) like LOWER(CONCAT('%', :name, '%'))") Page findAllByNameContaining(Pageable pageable, @Param("name") String name); } diff --git a/src/main/java/com/yello/server/domain/user/repository/UserRepository.java b/src/main/java/com/yello/server/domain/user/repository/UserRepository.java index 66df3633..2ef67768 100644 --- a/src/main/java/com/yello/server/domain/user/repository/UserRepository.java +++ b/src/main/java/com/yello/server/domain/user/repository/UserRepository.java @@ -60,6 +60,8 @@ List findAllByGroupContainingYelloId(String groupName, String keyword, List findAllByOtherGroupContainingYelloId(String groupName, String keyword, List uuidList); + List findAllByGroupNameContainingAndFriendListNotContaining(String keyword, List uuidList, List friendList); + Long count(); Long countAllByYelloIdContaining(String yelloId); diff --git a/src/main/java/com/yello/server/domain/user/repository/UserRepositoryImpl.java b/src/main/java/com/yello/server/domain/user/repository/UserRepositoryImpl.java index a56bc042..aa1e8df4 100644 --- a/src/main/java/com/yello/server/domain/user/repository/UserRepositoryImpl.java +++ b/src/main/java/com/yello/server/domain/user/repository/UserRepositoryImpl.java @@ -153,6 +153,11 @@ public List findAllByOtherGroupContainingYelloId(String groupName, String return userJpaRepository.findAllByOtherGroupContainingYelloId(groupName, keyword, uuidList); } + @Override + public List findAllByGroupNameContainingAndFriendListNotContaining(String keyword, List uuidList, List friendList) { + return userJpaRepository.findAllByGroupContaining(keyword, uuidList, friendList); + } + @Override public Long count() { return userJpaRepository.count(); 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 524ecb24..10025da4 100644 --- a/src/main/java/com/yello/server/global/common/SuccessCode.java +++ b/src/main/java/com/yello/server/global/common/SuccessCode.java @@ -72,7 +72,7 @@ public enum SuccessCode { private final HttpStatus httpStatus; - private final String message; + String message; public int getHttpStatusCode() { return httpStatus.value(); diff --git a/src/test/java/com/yello/server/domain/user/FakeUserRepository.java b/src/test/java/com/yello/server/domain/user/FakeUserRepository.java index 908bb1ff..569a3e48 100644 --- a/src/test/java/com/yello/server/domain/user/FakeUserRepository.java +++ b/src/test/java/com/yello/server/domain/user/FakeUserRepository.java @@ -258,6 +258,15 @@ public List findAllByOtherGroupContainingYelloId(String groupName, String .toList(); } + @Override + public List findAllByGroupNameContainingAndFriendListNotContaining(String keyword, List uuidList, List friendList) { + return data.stream() + .filter(user -> user.getGroup().getGroupName().contains(keyword)) + .filter(user -> !user.getId().equals(1L)) + .filter(user -> !uuidList.contains(user.getUuid())) + .toList(); + } + @Override public Long count() { return (long) data.size(); From 978bd4658906e030dcb584ac4f600847ce813bac Mon Sep 17 00:00:00 2001 From: hyeonjeongs Date: Sat, 17 Feb 2024 00:13:07 +0900 Subject: [PATCH 2/6] =?UTF-8?q?YEL-220=20[feat]=20=EA=B2=80=EC=83=89=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/yello/server/domain/friend/service/FriendService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/yello/server/domain/friend/service/FriendService.java b/src/main/java/com/yello/server/domain/friend/service/FriendService.java index 4450a430..db988fec 100644 --- a/src/main/java/com/yello/server/domain/friend/service/FriendService.java +++ b/src/main/java/com/yello/server/domain/friend/service/FriendService.java @@ -132,13 +132,12 @@ public SearchFriendResponse searchFriend(Long userId, Pageable pageable, userRepository.findAllByGroupContainingName(groupName, keyword, uuidList)); friendList.addAll( userRepository.findAllByOtherGroupContainingName(groupName, keyword, uuidList)); - + friendList.addAll(userRepository.findAllByGroupNameContainingAndFriendListNotContaining(keyword, uuidList, friendList)); } else { friendList.addAll( userRepository.findAllByGroupContainingYelloId(groupName, keyword, uuidList)); friendList.addAll( userRepository.findAllByOtherGroupContainingYelloId(groupName, keyword, uuidList)); - friendList.addAll(userRepository.findAllByGroupNameContainingAndFriendListNotContaining(keyword, uuidList, friendList)); } List pageList = PaginationFactory.getPage(friendList, pageable) From 4b2bc7d46616e675a4adaf8fd18a2589f5fef1d2 Mon Sep 17 00:00:00 2001 From: hyeonjeongs Date: Sat, 17 Feb 2024 01:47:41 +0900 Subject: [PATCH 3/6] =?UTF-8?q?YEL-220=20[feat]=20=EA=B4=91=EA=B3=A0=20?= =?UTF-8?q?=EB=B3=B4=EA=B3=A0=20=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EC=96=BB?= =?UTF-8?q?=EA=B8=B0=20=EC=97=AC=EB=B6=80=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/controller/EventController.java | 10 ++++++++ .../dto/response/GetIsPossibleAdmob.java | 19 ++++++++++++++ .../domain/event/service/EventService.java | 25 +++++++++++++++++++ .../server/domain/user/entity/UserData.java | 11 ++++++++ .../domain/user/entity/UserDataType.java | 4 ++- .../server/global/common/SuccessCode.java | 1 + .../global/common/util/ConstantUtil.java | 4 +-- 7 files changed, 71 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/yello/server/domain/event/dto/response/GetIsPossibleAdmob.java 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 17300e89..65a3d2fc 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,6 +4,7 @@ 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.GET_IS_POSSIBLE_ADMOB_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; @@ -14,6 +15,7 @@ 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; +import com.yello.server.domain.event.dto.response.GetIsPossibleAdmob; import com.yello.server.domain.event.exception.EventBadRequestException; import com.yello.server.domain.event.service.EventService; import com.yello.server.domain.user.entity.User; @@ -30,6 +32,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -89,4 +92,11 @@ public BaseResponse rewardAdmob(@AccessTokenUser User user, val data = eventService.rewardAdmob(user.getId(), request); return BaseResponse.success(REWARD_ADMOB_SUCCESS, data); } + + @GetMapping("/v1/admob/possible/{tag}") + public BaseResponse getIsPossibleAdmob(@AccessTokenUser User user, @PathVariable("tag") String tag) { + System.out.println(" asfsaasdfasdf"); + val data = eventService.getIsPossibleAdmob(user.getId(), tag); + return BaseResponse.success(GET_IS_POSSIBLE_ADMOB_SUCCESS, data); + } } diff --git a/src/main/java/com/yello/server/domain/event/dto/response/GetIsPossibleAdmob.java b/src/main/java/com/yello/server/domain/event/dto/response/GetIsPossibleAdmob.java new file mode 100644 index 00000000..dd5a07d4 --- /dev/null +++ b/src/main/java/com/yello/server/domain/event/dto/response/GetIsPossibleAdmob.java @@ -0,0 +1,19 @@ +package com.yello.server.domain.event.dto.response; + +import com.yello.server.domain.user.entity.UserData; +import com.yello.server.global.common.factory.TimeFactory; +import lombok.Builder; + +@Builder +public record GetIsPossibleAdmob( + String createdAt, + Boolean isPossible +) { + public static GetIsPossibleAdmob of(UserData userAdmob) { + return GetIsPossibleAdmob.builder() + .createdAt(userAdmob.getValue()) + .isPossible(userAdmob.isPossible()) + .build(); + } + +} 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 a9da86f5..09ac1eeb 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,11 +1,15 @@ package com.yello.server.domain.event.service; +import static com.yello.server.domain.user.entity.UserDataType.fromCode; 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; import static com.yello.server.global.common.ErrorCode.IDEMPOTENCY_KEY_CONFLICT_EXCEPTION; import static com.yello.server.global.common.ErrorCode.IDEMPOTENCY_KEY_NOT_FOUND_EXCEPTION; +import static com.yello.server.global.common.factory.TimeFactory.minusTime; +import static com.yello.server.global.common.factory.TimeFactory.toDateFormattedString; +import static com.yello.server.global.common.util.ConstantUtil.ADMOB_SHOP_TIME; import static com.yello.server.global.common.util.ConstantUtil.GlobalZoneId; import com.fasterxml.jackson.core.JsonProcessingException; @@ -17,6 +21,7 @@ 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; +import com.yello.server.domain.event.dto.response.GetIsPossibleAdmob; import com.yello.server.domain.event.entity.Event; import com.yello.server.domain.event.entity.EventHistory; import com.yello.server.domain.event.entity.EventInstance; @@ -33,6 +38,8 @@ import com.yello.server.domain.event.exception.EventNotFoundException; import com.yello.server.domain.event.repository.EventRepository; import com.yello.server.domain.user.entity.User; +import com.yello.server.domain.user.entity.UserData; +import com.yello.server.domain.user.repository.UserDataRepository; import com.yello.server.domain.user.repository.UserRepository; import com.yello.server.global.common.factory.UuidFactory; import jakarta.servlet.http.HttpServletRequest; @@ -40,6 +47,7 @@ import jakarta.validation.constraints.NotNull; import java.net.URI; import java.time.Duration; +import java.time.LocalDateTime; import java.time.OffsetTime; import java.time.ZonedDateTime; import java.util.ArrayList; @@ -61,6 +69,7 @@ public class EventService { private final EventRepository eventRepository; private final ObjectMapper objectMapper; private final UserRepository userRepository; + private final UserDataRepository userDataRepository; public List getEvents(Long userId) throws JsonProcessingException { // exception @@ -290,9 +299,25 @@ public EventRewardResponse rewardAdmob(Long userId, AdmobRewardRequest request) EventInstanceReward rewardInstance = eventRepository.save(EventInstanceReward.of(eventInstance, eventReward)); + // user-data cooldown 추가 + UserData userAdmob = + userDataRepository.findByUserIdAndTag(userId, fromCode(request.rewardType())) + .orElseGet(() -> userDataRepository.save(UserData.of(fromCode(request.rewardType()), + toDateFormattedString(LocalDateTime.now()), user))); + + userAdmob.setValue(toDateFormattedString(LocalDateTime.now())); + return EventRewardResponse.of(rewardInstance); } + public GetIsPossibleAdmob getIsPossibleAdmob(Long userId, String tag) { + final User user = userRepository.getById(userId); + UserData userAdmob = userDataRepository.findByUserIdAndTag(userId, fromCode(tag)) + .orElse(UserData.of(fromCode(tag), + toDateFormattedString(minusTime(LocalDateTime.now(), ADMOB_SHOP_TIME)), user)); + return GetIsPossibleAdmob.of(userAdmob); + } + private EventReward handleRewardByType(AdmobRewardRequest request, User user) { switch (RewardType.fromCode(request.rewardType())) { case ADMOB_POINT -> { diff --git a/src/main/java/com/yello/server/domain/user/entity/UserData.java b/src/main/java/com/yello/server/domain/user/entity/UserData.java index 75a3a04c..4802b2cb 100644 --- a/src/main/java/com/yello/server/domain/user/entity/UserData.java +++ b/src/main/java/com/yello/server/domain/user/entity/UserData.java @@ -1,5 +1,9 @@ package com.yello.server.domain.user.entity; +import static com.yello.server.global.common.factory.TimeFactory.getSecondsBetween; +import static com.yello.server.global.common.util.ConstantUtil.ADMOB_TIMER_TIME; + +import com.yello.server.global.common.factory.TimeFactory; import jakarta.persistence.Column; import jakarta.persistence.Convert; import jakarta.persistence.Entity; @@ -10,6 +14,8 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -53,4 +59,9 @@ public static UserData of(UserDataType tag, String value, User user) { public void setValue(String value) { this.value = value; } + + public Boolean isPossible(){ + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + return TimeFactory.getSecondsBetween(LocalDateTime.now(), LocalDateTime.parse(this.value, formatter)) >= ADMOB_TIMER_TIME; + } } diff --git a/src/main/java/com/yello/server/domain/user/entity/UserDataType.java b/src/main/java/com/yello/server/domain/user/entity/UserDataType.java index 3edcb9f9..65390e43 100644 --- a/src/main/java/com/yello/server/domain/user/entity/UserDataType.java +++ b/src/main/java/com/yello/server/domain/user/entity/UserDataType.java @@ -3,6 +3,7 @@ import static com.yello.server.global.common.ErrorCode.ENUM_BAD_REQUEST_EXCEPTION; import com.yello.server.global.exception.EnumIllegalArgumentException; +import java.time.LocalDateTime; import java.time.ZonedDateTime; import java.util.Arrays; import lombok.Getter; @@ -16,7 +17,8 @@ public enum UserDataType { */ WITHDRAW_REASON(String.class, "withdraw-reason"), ACCOUNT_UPDATED_AT(ZonedDateTime.class, "account-updated-at"), - RECOMMENDED(ZonedDateTime.class, "recommended"); + RECOMMENDED(ZonedDateTime.class, "recommended"), + ADMOB_POINT(LocalDateTime.class, "ADMOB_POINT"); private final Class classType; private final String initial; 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 7c305d39..975c0249 100644 --- a/src/main/java/com/yello/server/global/common/SuccessCode.java +++ b/src/main/java/com/yello/server/global/common/SuccessCode.java @@ -63,6 +63,7 @@ public enum SuccessCode { EVENT_JOIN_SUCCESS(OK, "이벤트 참여에 성공하였습니다."), EVENT_REWARD_SUCCESS(OK, "이벤트 보상에 성공하였습니다."), VERIFY_ADMOB_SSV_SUCCESS(OK, "Admob ssv 검증에 성공하였습니다."), + GET_IS_POSSIBLE_ADMOB_SUCCESS(OK, "광고 보고 포인트 얻기 가능 여부 조회에 성공했습니다."), /** * 201 CREATED 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 d16758c3..1aa8819d 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 @@ -73,8 +73,8 @@ public class ConstantUtil { public static final int NO_FRIEND_COUNT = 0; public static final int SUBSCRIBE_DAYS = 7; public static final int PLUS_BASIC_TIME = 0; - public static final String USER_VOTE_TYPE = "send"; - public static final String ALL_VOTE_TYPE = "all"; + public static final int ADMOB_SHOP_TIME = 60; + public static final long ADMOB_TIMER_TIME = 3600L; private ConstantUtil() { throw new IllegalStateException(); From 7a9309f884bf2429bd8aa9bad4f18aeed7f795d4 Mon Sep 17 00:00:00 2001 From: hyeonjeongs Date: Sat, 17 Feb 2024 02:20:24 +0900 Subject: [PATCH 4/6] =?UTF-8?q?YEL-220=20[feat]=20=EB=AA=85=EC=84=B8?= =?UTF-8?q?=EC=84=9C=20=EC=97=85=EB=A1=9C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../asciidoc/check-is-possible-admob.adoc | 40 ++------- src/docs/asciidoc/index.adoc | 2 +- .../static/docs/check-is-possible-admob.html | 82 ++++++++----------- src/main/resources/static/docs/index.html | 3 + .../event/medium/EventControllerTest.java | 44 +++++++++- 5 files changed, 91 insertions(+), 80 deletions(-) diff --git a/src/docs/asciidoc/check-is-possible-admob.adoc b/src/docs/asciidoc/check-is-possible-admob.adoc index 9d508af8..6620b0cc 100644 --- a/src/docs/asciidoc/check-is-possible-admob.adoc +++ b/src/docs/asciidoc/check-is-possible-admob.adoc @@ -1,52 +1,28 @@ :reproducible: -== 상점에서 보상형 광고 가능한지 여부 (명세) +== 상점에서 보상형 광고 가능한지 여부 === 요청 -[http,json] ----- -GET /api/v1/admob/{tag} HTTP/1.1 -Authorization: Bearer your-access-token -Content-Type: application/json ----- +include::{snippets}/api/v1/admob/possible/http-request.adoc[] === 요청 파라미터 +include::{snippets}/api/v1/admob/possible/path-parameters.adoc[] + ---- -tag -> shop +tag -> ADMOB_POINT ---- * 보상형 광고 다른곳에서 사용할 수도 있으므로 tag로 어떤 곳에서 사용하고 있는곳인지 tag로 명시 -* 현재는 상점 -> shop에서만 보상형 광고 진행 +* 현재는 상점에 있는 보상형 광고 (ADMOB_POINT를 tag에 요청) === 응답 -[http,json] ----- -HTTP/1.1 200 OK -Vary: Origin -Vary: Access-Control-Request-Method -Vary: Access-Control-Request-Headers -Content-Type: application/json -{ - "status" : 200, - "message" : "광고 보고 포인트 얻기 가능 여부 조회에 성공했습니다.", - "data": { - "createdAt": "2024-01-01 12:00:00", - "isPossible" : true, - } -} ----- - +include::{snippets}/api/v1/admob/possible/http-response.adoc[] === NOTE -- Header에 무작위한 UUID4 값을 넣어주세요 -* 예시) IdempotencyKey: 0397b5f3-ecdc-47d6-b5d7-2b1afcf00e87 -- 주의사항 -* 같은 멱등성키를 2번 요청하면, 400번 에러. -- ADMOB -* ADMOB 서버에 SSV(ServerSideVerification) Options의 customData에 입력한 것과 동일한 멱등성 키를 넘겨주세요. === CHANGELOG +- 2024.02.17 API 릴리즈 - 2024.02.16 명세서 작성 \ No newline at end of file diff --git a/src/docs/asciidoc/index.adoc b/src/docs/asciidoc/index.adoc index 20168055..dd03887e 100644 --- a/src/docs/asciidoc/index.adoc +++ b/src/docs/asciidoc/index.adoc @@ -118,4 +118,4 @@ * 🆕 link:reward-admob.html[광고보고 보상 얻기, 2024-02-11] -* 🆕 link:check-is-possible-admob.adoc[광고보고 보상 얻기 가능 여부 조회, 2024-02-16 (명세)] \ No newline at end of file +* 🆕 link:check-is-possible-admob.adoc[광고보고 보상 얻기 가능 여부 조회, 2024-02-17] \ No newline at end of file diff --git a/src/main/resources/static/docs/check-is-possible-admob.html b/src/main/resources/static/docs/check-is-possible-admob.html index dd8b368b..b11287cf 100644 --- a/src/main/resources/static/docs/check-is-possible-admob.html +++ b/src/main/resources/static/docs/check-is-possible-admob.html @@ -5,7 +5,7 @@ -상점에서 보상형 광고 가능한지 여부 (명세) +상점에서 보상형 광고 가능한지 여부