Skip to content

Commit

Permalink
YEL-162 [develop] 투표수정사항 배포
Browse files Browse the repository at this point in the history
YEL-162 [develop] 투표수정사항 배포
  • Loading branch information
hyeonjeongs authored Sep 12, 2023
2 parents ea6a9a0 + 4de1de5 commit c2b76f9
Show file tree
Hide file tree
Showing 10 changed files with 137 additions and 69 deletions.
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

0 comments on commit c2b76f9

Please sign in to comment.