Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

YEL-162 [revert] YEL-162 [feat] 투표 수정사항 반영 #336

Merged
merged 1 commit into from
Sep 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
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.ErrorCode.LACK_USER_EXCEPTION;
import static com.yello.server.global.common.util.ConstantUtil.RANDOM_COUNT;
import static com.yello.server.global.common.util.ConstantUtil.YELLO_FEMALE;
import static com.yello.server.global.common.util.ConstantUtil.YELLO_MALE;

Expand All @@ -20,6 +18,7 @@
import com.yello.server.domain.user.entity.User;
import com.yello.server.domain.user.repository.UserRepository;
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;
Expand All @@ -43,6 +42,7 @@ public class FriendService {
private final FriendRepository friendRepository;
private final UserRepository userRepository;
private final VoteRepository voteRepository;
private final VoteManager voteManager;

public FriendsResponse findAllFriends(Pageable pageable, Long userId) {
final Page<Friend> friendsData = friendRepository.findAllFriendsByUserId(pageable, userId);
Expand Down Expand Up @@ -77,20 +77,7 @@ public Friend addFriend(Long userId, Long targetId) {
public List<FriendShuffleResponse> findShuffledFriend(Long userId) {
final User user = userRepository.getById(userId);

final List<Friend> friends =
new ArrayList<>(friendRepository.findAllByUserId(user.getId()));
List<Friend> friendList = new ArrayList<>(friends);

if (friendList.size() < RANDOM_COUNT) {
throw new FriendException(LACK_USER_EXCEPTION);
}

Collections.shuffle(friendList);

return friendList.stream()
.map(FriendShuffleResponse::of)
.limit(RANDOM_COUNT)
.toList();
return voteManager.getShuffledFriends(user);
}

public RecommendFriendResponse findAllRecommendSchoolFriends(Pageable pageable, Long userId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,16 @@
public record VoteAvailableResponse(
Boolean isPossible,
Integer point,
String createdAt
String createdAt,
Integer friendStatus
) {

public static VoteAvailableResponse of(User user, Cooldown cooldown) {
public static VoteAvailableResponse of(User user, Cooldown cooldown, Integer friendStatus) {
return VoteAvailableResponse.builder()
.isPossible(cooldown.isPossible())
.point(user.getPoint())
.createdAt(toDateFormattedString(cooldown.getCreatedAt()))
.friendStatus(friendStatus)
.build();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.yello.server.domain.vote.service;

import com.yello.server.domain.friend.dto.response.FriendShuffleResponse;
import com.yello.server.domain.keyword.dto.response.KeywordCheckResponse;
import com.yello.server.domain.question.dto.response.QuestionForVoteResponse;
import com.yello.server.domain.question.entity.Question;
Expand All @@ -19,4 +20,7 @@ public interface VoteManager {
KeywordCheckResponse useKeywordHint(User user, Vote vote);

void makeGreetingVote(User user);

List<FriendShuffleResponse> getShuffledFriends(User user);

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,20 @@
import static com.yello.server.global.common.ErrorCode.DUPLICATE_VOTE_EXCEPTION;
import static com.yello.server.global.common.ErrorCode.INVALID_VOTE_EXCEPTION;
import static com.yello.server.global.common.ErrorCode.LACK_POINT_EXCEPTION;
import static com.yello.server.global.common.ErrorCode.LACK_USER_EXCEPTION;
import static com.yello.server.global.common.factory.WeightedRandomFactory.randomPoint;
import static com.yello.server.global.common.util.ConstantUtil.KEYWORD_HINT_POINT;
import static com.yello.server.global.common.util.ConstantUtil.NAME_HINT_DEFAULT;
import static com.yello.server.global.common.util.ConstantUtil.NAME_HINT_POINT;
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.VOTE_COUNT;
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.response.FriendShuffleResponse;
import com.yello.server.domain.friend.entity.Friend;
import com.yello.server.domain.friend.exception.FriendException;
import com.yello.server.domain.friend.repository.FriendRepository;
import com.yello.server.domain.keyword.dto.response.KeywordCheckResponse;
import com.yello.server.domain.keyword.entity.Keyword;
Expand Down Expand Up @@ -107,19 +110,19 @@ public List<QuestionForVoteResponse> generateVoteQuestion(User user, List<Questi

@Override
public int useNameHint(User sender, Vote vote) {
if (sender.getPoint() < NAME_HINT_POINT && sender.getSubscribe() == Subscribe.NORMAL) {
if (sender.getPoint() < NAME_HINT_POINT && sender.getSubscribe()==Subscribe.NORMAL) {
throw new VoteForbiddenException(LACK_POINT_EXCEPTION);
}

if (vote.getNameHint() != NAME_HINT_DEFAULT) {
if (vote.getNameHint()!=NAME_HINT_DEFAULT) {
throw new VoteNotFoundException(INVALID_VOTE_EXCEPTION);
}

final ThreadLocalRandom random = ThreadLocalRandom.current();
int randomIndex = random.nextInt(2);
vote.checkNameIndexOf(randomIndex);

if (sender.getSubscribe() == Subscribe.NORMAL) {
if (sender.getSubscribe()==Subscribe.NORMAL) {
sender.minusPoint(NAME_HINT_POINT);
return randomIndex;
}
Expand Down Expand Up @@ -160,24 +163,35 @@ public void makeGreetingVote(User user) {
voteRepository.save(createFirstVote(sender, user, greetingQuestion));
}

private boolean isDuplicatedVote(int index, List<VoteAnswer> voteAnswers) {
return index > 0 && voteAnswers.get(index - 1).questionId()
.equals(voteAnswers.get(index).questionId());
}

private List<FriendShuffleResponse> getShuffledFriends(User user) {
@Override
public List<FriendShuffleResponse> getShuffledFriends(User user) {
List<String> uuidList = Arrays.asList(YELLO_FEMALE, YELLO_MALE);
final List<Friend> friends = friendRepository.findAllByUserIdNotIn(user.getId(), uuidList);

List<Friend> friendList = new ArrayList<>(friends);
Collections.shuffle(friendList);

if (friends.size()==NO_FRIEND_COUNT) {
throw new FriendException(LACK_USER_EXCEPTION);
}

if (friends.size() > NO_FRIEND_COUNT && friends.size() < RANDOM_COUNT) {
return friendList.stream()
.map(FriendShuffleResponse::of)
.toList();
}

return friendList.stream()
.map(FriendShuffleResponse::of)
.limit(RANDOM_COUNT)
.toList();
}

private boolean isDuplicatedVote(int index, List<VoteAnswer> voteAnswers) {
return index > 0 && voteAnswers.get(index - 1).questionId()
.equals(voteAnswers.get(index).questionId());
}

private List<String> getShuffledKeywords(Question question) {
final List<Keyword> keywords = question.getKeywordList();
List<Keyword> keywordList = new ArrayList<>(keywords);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
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 com.yello.server.domain.cooldown.entity.Cooldown;
Expand Down Expand Up @@ -122,7 +123,7 @@ public List<QuestionForVoteResponse> findVoteQuestionList(Long userId) {
final User user = userRepository.getById(userId);

final List<Friend> friends = friendRepository.findAllByUserId(user.getId());
if (friends.size() < RANDOM_COUNT) {
if (friends.size()==NO_FRIEND_COUNT) {
throw new FriendException(LACK_USER_EXCEPTION);
}

Expand All @@ -144,14 +145,18 @@ public VoteAvailableResponse checkVoteAvailable(Long userId) {
final String messageId = UUID.randomUUID().toString();
final List<Friend> friends = friendRepository.findAllByUserId(user.getId());

if (friends.size() < RANDOM_COUNT) {
if (friends.size()==NO_FRIEND_COUNT) {
throw new FriendException(LACK_USER_EXCEPTION);
}

final Cooldown cooldown = cooldownRepository.findByUserId(user.getId())
.orElse(Cooldown.of(user, messageId, minusTime(LocalDateTime.now(), COOL_DOWN_TIME)));

return VoteAvailableResponse.of(user, cooldown);
if (friends.size() > NO_FRIEND_COUNT && friends.size() < RANDOM_COUNT) {
return VoteAvailableResponse.of(user, cooldown, 0);
}

return VoteAvailableResponse.of(user, cooldown, 1);
}

@Transactional
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public enum ErrorCode {
REQUEST_VALIDATION_EXCEPTION(BAD_REQUEST, "잘못된 요청입니다."),
YELLOID_REQUIRED_EXCEPTION(BAD_REQUEST, "쿼리 스트링에 yelloId를 포함해야 합니다."),
OAUTH_ACCESS_TOKEN_REQUIRED_EXCEPTION(BAD_REQUEST, "소셜 액세스 토큰이 없습니다."),
LACK_USER_EXCEPTION(BAD_REQUEST, "친구가 4명 이하입니다."),
LACK_USER_EXCEPTION(BAD_REQUEST, "친구가 부족합니다."),
SIGNIN_FIELD_REQUIRED_EXCEPTION(BAD_REQUEST, "회원가입에 필요한 값이 없습니다."),
FIELD_REQUIRED_EXCEPTION(BAD_REQUEST, "필요한 값이 없습니다."),
INVALID_VOTE_EXCEPTION(BAD_REQUEST, "이미 공개한 투표입니다"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ public class ConstantUtil {
public static final int REFUND_ONE_TICKET = 1;
public static final int REFUND_TWO_TICKET = 2;
public static final int REFUND_FIVE_TICKET = 5;
public static final int NO_FRIEND_COUNT = 0;


private ConstantUtil() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,16 @@
import com.yello.server.domain.friend.service.FriendService;
import com.yello.server.domain.question.FakeQuestionRepository;
import com.yello.server.domain.question.repository.QuestionRepository;
import com.yello.server.domain.user.FakeUserManager;
import com.yello.server.domain.user.FakeUserRepository;
import com.yello.server.domain.user.entity.User;
import com.yello.server.domain.user.exception.UserNotFoundException;
import com.yello.server.domain.user.repository.UserRepository;
import com.yello.server.domain.user.service.UserManager;
import com.yello.server.domain.vote.FakeVoteManager;
import com.yello.server.domain.vote.FakeVoteRepository;
import com.yello.server.domain.vote.repository.VoteRepository;
import com.yello.server.domain.vote.service.VoteManager;
import com.yello.server.util.TestDataRepositoryUtil;
import java.util.List;
import java.util.Optional;
Expand All @@ -42,6 +46,10 @@ class FriendServiceTest {
private final FriendRepository friendRepository = new FakeFriendRepository();
private final VoteRepository voteRepository = new FakeVoteRepository();
private final QuestionRepository questionRepository = new FakeQuestionRepository();
private final UserManager userManager = new FakeUserManager(userRepository);
private final VoteManager voteManager =
new FakeVoteManager(userRepository, questionRepository, voteRepository, friendRepository,
userManager);
private final TestDataRepositoryUtil testDataUtil = new TestDataRepositoryUtil(
userRepository,
voteRepository,
Expand All @@ -62,6 +70,7 @@ void init() {
.userRepository(userRepository)
.friendRepository(friendRepository)
.voteRepository(voteRepository)
.voteManager(voteManager)
.build();

user1 = testDataUtil.generateUser(1L, 1L);
Expand Down Expand Up @@ -163,13 +172,13 @@ void init() {
@Test
void 친구_셔플_시_친구_수가_부족한_경우에_FriendException이_발생합니다() {
// given
final Long userId = 1L;
final Long userId = 3L;

// when
// then
assertThatThrownBy(() -> friendService.findShuffledFriend(userId))
.isInstanceOf(FriendException.class)
.hasMessageContaining("[FriendException] 친구가 4명 이하입니다.");
.hasMessageContaining("[FriendException] 친구가 부족합니다.");
}

@Test
Expand Down
16 changes: 15 additions & 1 deletion src/test/java/com/yello/server/domain/vote/FakeVoteManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,18 @@
import static com.yello.server.global.common.ErrorCode.DUPLICATE_VOTE_EXCEPTION;
import static com.yello.server.global.common.ErrorCode.INVALID_VOTE_EXCEPTION;
import static com.yello.server.global.common.ErrorCode.LACK_POINT_EXCEPTION;
import static com.yello.server.global.common.ErrorCode.LACK_USER_EXCEPTION;
import static com.yello.server.global.common.factory.WeightedRandomFactory.randomPoint;
import static com.yello.server.global.common.util.ConstantUtil.KEYWORD_HINT_POINT;
import static com.yello.server.global.common.util.ConstantUtil.NAME_HINT_DEFAULT;
import static com.yello.server.global.common.util.ConstantUtil.NAME_HINT_POINT;
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.VOTE_COUNT;

import com.yello.server.domain.friend.dto.response.FriendShuffleResponse;
import com.yello.server.domain.friend.entity.Friend;
import com.yello.server.domain.friend.exception.FriendException;
import com.yello.server.domain.friend.repository.FriendRepository;
import com.yello.server.domain.keyword.dto.response.KeywordCheckResponse;
import com.yello.server.domain.keyword.entity.Keyword;
Expand Down Expand Up @@ -163,11 +166,22 @@ private boolean isDuplicatedVote(int index, List<VoteAnswer> voteAnswers) {
.equals(voteAnswers.get(index).questionId());
}

private List<FriendShuffleResponse> getShuffledFriends(User user) {
@Override
public List<FriendShuffleResponse> getShuffledFriends(User user) {
final List<Friend> friends = friendRepository.findAllByUserId(user.getId());
List<Friend> friendList = new ArrayList<>(friends);
Collections.shuffle(friendList);

if (friends.size()==NO_FRIEND_COUNT) {
throw new FriendException(LACK_USER_EXCEPTION);
}

if (friends.size() > NO_FRIEND_COUNT && friends.size() < RANDOM_COUNT) {
return friendList.stream()
.map(FriendShuffleResponse::of)
.toList();
}

return friendList.stream()
.map(FriendShuffleResponse::of)
.limit(RANDOM_COUNT)
Expand Down
Loading