Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
…ev.v2 into 232-fix-admin-게임-관리-페이지에서-점수-수정-시-승패-수정-안되는-문제
  • Loading branch information
AYoungSn committed Jan 24, 2024
2 parents 4c2acc2 + 21f33a2 commit c7a394d
Show file tree
Hide file tree
Showing 36 changed files with 438 additions and 963 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/test-code-validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
- name: mv for separate report name
run: mv ./build/reports/jacoco/unitTest/jacocoTestReport.xml ./build/reports/jacoco/unitTest/unitTestReport.xml
- name: 📲 Upload unitTest coverage to Codecov
uses: codecov/codecov-action@v2
uses: codecov/codecov-action@v3
with:
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: true
Expand All @@ -33,7 +33,7 @@ jobs:
- name: 👨‍👨‍👧‍👦 Integration Test with Gradle
run: ./gradlew --console verbose clean integrationTestCoverage
- name: 📲 Upload integrationTest coverage to Codecov
uses: codecov/codecov-action@v2
uses: codecov/codecov-action@v3
with:
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public class TournamentAdminCreateRequestDto {
private String title;

@NotNull(message = "내용이 필요합니다.")
@Length(max = 1000, message = "내용은 1000자 이내로 작성해주세요.")
@Length(max = 3000, message = "내용은 3000자 이내로 작성해주세요.")
private String contents;

@NotNull(message = "시작 시간이 필요합니다.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public class TournamentAdminUpdateRequestDto {
private String title;

@NotNull(message = "내용이 필요합니다.")
@Length(max = 1000, message = "내용은 1000자 이내로 작성해주세요.")
@Length(max = 3000, message = "내용은 3000자 이내로 작성해주세요.")
private String contents;

@NotNull(message = "시작 시간이 필요합니다.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,6 @@ public SlotStatusResponseListDto getAllMatchStatus(UserDto userDto, Option optio
List<Game> games = gameRepository.findAllBetween(slotGenerator.getNow(), slotGenerator.getMaxTime());
slotGenerator.addPastSlots();
slotGenerator.addMatchedSlots(games);
List<Tournament> tournaments = tournamentRepository.findAllByStatusIsNot(TournamentStatus.END);
slotGenerator.addTournamentSlots(tournaments);

Optional<Game> myGame = gameRepository.findByStatusTypeAndUserId(StatusType.BEFORE, userDto.getId());
Set<LocalDateTime> gameTimes = games.stream().map(Game::getStartTime).collect(Collectors.toSet());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.gg.server.domain.tournament.data.Tournament;
import com.gg.server.domain.tournament.data.TournamentGame;
import com.gg.server.domain.tournament.data.TournamentGameRepository;
import com.gg.server.domain.tournament.data.TournamentUser;
import com.gg.server.domain.tournament.exception.TournamentGameNotFoundException;
import com.gg.server.domain.tournament.type.TournamentRound;
import com.gg.server.domain.tournament.type.TournamentStatus;
Expand All @@ -31,9 +32,7 @@

import javax.transaction.Transactional;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;

import static com.gg.server.domain.match.type.TournamentMatchStatus.*;
Expand Down Expand Up @@ -101,25 +100,22 @@ public void matchGames(Tournament tournament, TournamentRound round) {
int gameInterval = slotManagement.getGameInterval();
List<TournamentGame> allTournamentGames = tournamentGameRepository.findAllByTournamentId(tournament.getId());
List<TournamentGame> tournamentGames = findSameRoundGames(allTournamentGames, round.getRoundNumber());
List<TournamentGame> previousRoundTournamentGames = findSameRoundGames(allTournamentGames, TournamentRound.getPreviousRoundNumber(round));
List<User> notiUsers = new ArrayList<>();
List<User> players = findSortedPlayers(tournament, round);
LocalDateTime startTime = calculateStartTime(tournament, round, gameInterval);

for (int i = 0; i < tournamentGames.size(); ++i) {
Game game = new Game(season, StatusType.BEFORE, Mode.TOURNAMENT, startTime, startTime.plusMinutes(gameInterval));
Team team1 = new Team(game, -1, false);
Team team2 = new Team(game, -1, false);
User user1 = findMatchUser(previousRoundTournamentGames, i * 2, tournament);
User user2 = findMatchUser(previousRoundTournamentGames, i * 2 + 1, tournament);
User user1 = players.get(i * 2);
User user2 = players.get(i * 2 + 1);
new TeamUser(team1, user1);
new TeamUser(team2, user2);
gameRepository.save(game);
tournamentGames.get(i).updateGame(game);
notiUsers.add(user1);
notiUsers.add(user2);
startTime = startTime.plusMinutes((long) gameInterval);
}
notiUsers.stream().distinct()
players.stream().distinct()
.forEach(user -> notiAdminService.sendAnnounceNotiToUser(new SendNotiAdminRequestDto(user.getIntraId(), NotiType.TOURNAMENT_GAME_MATCHED.getMessage())));
}

Expand Down Expand Up @@ -166,12 +162,39 @@ private LocalDateTime calculateStartTime(Tournament tournament, TournamentRound
return lastGame.getGame().getEndTime().plusMinutes(gameInterval);
}

private User findMatchUser(List<TournamentGame> previousTournamentGames, int index, Tournament tournament) {
if (previousTournamentGames.isEmpty()) {
return tournament.getTournamentUsers().get(index).getUser();
/**
* 토너먼트 라운드에 매칭될 플레이어를 찾는다.
* @param tournament 토너먼트
* @param round 매칭할 토너먼트 라운드
* @return 토너먼트 라운드에 매칭될 플레이어 List (정렬된 상태)
*/
private List<User> findSortedPlayers(Tournament tournament, TournamentRound round) {
List<User> players = new ArrayList<>();

if (TournamentRound.QUARTER_FINAL_1.getRoundNumber() == round.getRoundNumber()) {
Map<Integer, Integer> randomNumbers = new LinkedHashMap<>();
Random random = new Random();
while (randomNumbers.size() < Tournament.ALLOWED_JOINED_NUMBER) {
int randomNumber = random.nextInt(Tournament.ALLOWED_JOINED_NUMBER);
if (!randomNumbers.containsValue(randomNumber)) {
randomNumbers.put(randomNumbers.size(), randomNumber);
}
}
for (Integer randomNumber : randomNumbers.values()) {
List<TournamentUser> tournamentUsers = tournament.getTournamentUsers();
User user = tournamentUsers.get(randomNumber).getUser();
players.add(user);
}
} else {
List<TournamentGame> previousRoundTournamentGames = findSameRoundGames(tournament.getTournamentGames(), TournamentRound.getPreviousRoundNumber(round));
int roundNum = round.getRoundNumber();
for (int i = 0; i < roundNum; ++i) {
User user = getWinningTeam(previousRoundTournamentGames.get(i).getGame())
.getTeamUsers().get(0).getUser();
players.add(user);
}
}
return getWinningTeam(previousTournamentGames.get(index).getGame())
.getTeamUsers().get(0).getUser();
return players;
}

/**
Expand Down Expand Up @@ -206,9 +229,9 @@ private void closeTournament(Tournament tournament, Game finalGame) {

/**
* 같은 round의 토너먼트 게임을 찾는다.
* @param tournamentGames - 토너먼트 게임 List
* @param roundNum - 토너먼트 라운드 number
* @return - 같은 roundNum의 tournamentGame List
* @param tournamentGames 토너먼트 게임 List
* @param roundNum 토너먼트 라운드 number (2, 4, 8, ...) (잘못된 roundNum일 경우 Empty List 반환한다.)
* @return tournamentGames 중 roundNum과 동일한 roundNum을 가진 round 순으로 정렬된 tournamentGame List 반환
*/
private List<TournamentGame> findSameRoundGames(List<TournamentGame> tournamentGames, int roundNum) {
return tournamentGames.stream()
Expand Down
19 changes: 0 additions & 19 deletions src/main/java/com/gg/server/domain/match/utils/SlotGenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -61,25 +61,6 @@ public void addMatchedSlots(List<Game> games) {
new SlotStatusDto(e.getStartTime(), SlotStatus.CLOSE, interval)));
}

/**
* BEFORE, LIVE 상태의 토너먼트 진행 시간에 슬롯을 block함
*/
public void addTournamentSlots(List<Tournament> tournaments) {
for (Tournament tournament : tournaments) {
LocalDateTime startTime = tournament.getStartTime();
int startTimeMinute = startTime.getMinute();
startTimeMinute = startTimeMinute - (startTimeMinute % interval);
startTime = startTime.withMinute(startTimeMinute);
LocalDateTime endTime = tournament.getEndTime();
int endTimeMinute = endTime.getMinute();
endTimeMinute = endTimeMinute + (interval - (endTimeMinute % interval));
endTime = endTime.withMinute(endTimeMinute);
for (LocalDateTime time = startTime; time.isBefore(endTime); time = time.plusMinutes(interval)) {
slots.put(time, new SlotStatusDto(time, SlotStatus.CLOSE, interval));
}
}
}

public void addMySlots(Game myGame) {
slots.put(myGame.getStartTime(),
new SlotStatusDto(myGame.getStartTime(), myGame.getEndTime(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
Expand All @@ -37,7 +39,7 @@ public ExpRankPageResponseDto getExpRankPage(@Valid PageRequestDto pageRequestDt
*/
@GetMapping("/ranks/{gameType}")
public RankPageResponseDto getRankPage(@Valid PageRequestDto pageRequestDto, @Parameter(hidden = true) @Login UserDto user,
Long season, String gameType){
@RequestParam Long season, @PathVariable String gameType){
PageRequest pageRequest = PageRequest.of(pageRequestDto.getPage() - 1, pageRequestDto.getSize());
return rankService.getRankPageV2(pageRequest, user, season);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ public interface RankRepository extends JpaRepository<Rank, Long> {
+ " GROUP BY p.user_id) pg "
+ "ON pg.user_id = u.id "
+ "WHERE r.season_id = :seasonId AND (r.losses > 0 OR r.wins > 0) "
+ "LIMIT :pageSize OFFSET :pageNum ", nativeQuery = true)
List<RankV2Dto> findPppRankBySeasonId(@Param("pageNum")int pageNum, @Param("pageSize")int pageSize, @Param("seasonId") Long seasonId);
+ "LIMIT :limit OFFSET :offset ", nativeQuery = true)
List<RankV2Dto> findPppRankBySeasonId(@Param("offset")int offset, @Param("limit")int limit, @Param("seasonId") Long seasonId);

@Query(value = "SELECT count(*) "
+ "FROM Ranks r "
Expand Down
11 changes: 7 additions & 4 deletions src/main/java/com/gg/server/domain/rank/service/RankService.java
Original file line number Diff line number Diff line change
Expand Up @@ -86,11 +86,13 @@ public ExpRankPageResponseDto getExpRankPage(PageRequest pageRequest, UserDto cu
users.getTotalPages(),
expRankDtos);
}

@Cacheable(value = "expRanking", cacheManager = "gameCacheManager",
key = "#pageRequest.pageNumber + #pageRequest.pageSize")
key = "#pageRequest.pageNumber + #pageRequest.pageSize.toString()")
public List<ExpRankDto> getExpRankList(PageRequest pageRequest) {
Season curSeason = seasonFindService.findCurrentSeason(LocalDateTime.now());
List<ExpRankV2Dto> expRankV2Dtos = userRepository.findExpRank(pageRequest.getPageNumber(), pageRequest.getPageSize(), curSeason.getId());
int pageOffset = pageRequest.getPageNumber() * pageRequest.getPageSize();
List<ExpRankV2Dto> expRankV2Dtos = userRepository.findExpRank(pageOffset, pageRequest.getPageSize(), curSeason.getId());
return expRankV2Dtos.stream().map(ExpRankDto::from).collect(Collectors.toList());
}

Expand All @@ -103,7 +105,7 @@ public List<ExpRankDto> getExpRankList(PageRequest pageRequest) {
*/
@Transactional(readOnly = true)
@Cacheable(value = "ranking", cacheManager = "gameCacheManager",
key = "#pageRequest.pageSize + #pageRequest.pageNumber + #curUser.id + #seasonId")
key = "#pageRequest.pageSize.toString() + #pageRequest.pageNumber + #curUser.id + #seasonId")
public RankPageResponseDto getRankPageV2(PageRequest pageRequest, UserDto curUser, Long seasonId) {
Season season;
if (seasonId == null || seasonId == 0) {
Expand All @@ -119,7 +121,8 @@ public RankPageResponseDto getRankPageV2(PageRequest pageRequest, UserDto curUse

int myRank = rankRepository.findRankByUserIdAndSeasonId(curUser.getId(), season.getId())
.orElse(-1);
List<RankDto> rankList = rankRepository.findPppRankBySeasonId(pageRequest.getPageNumber(), pageRequest.getPageSize(), season.getId())
int pageOffset = pageRequest.getPageNumber() * pageRequest.getPageSize();
List<RankDto> rankList = rankRepository.findPppRankBySeasonId(pageOffset, pageRequest.getPageSize(), season.getId())
.stream().map(RankDto::from).collect(Collectors.toList());
return new RankPageResponseDto(myRank, pageRequest.getPageNumber() + 1, totalPage, rankList);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public class TournamentController {
*/
@GetMapping
public ResponseEntity<TournamentListResponseDto> getAllTournamentList(@ModelAttribute @Valid TournamentFilterRequestDto tournamentFilterRequestDto){
Pageable pageRequest = PageRequest.of(tournamentFilterRequestDto.getPage() - 1, tournamentFilterRequestDto.getSize(), Sort.by("startTime").descending());
Pageable pageRequest = PageRequest.of(tournamentFilterRequestDto.getPage() - 1, tournamentFilterRequestDto.getSize(), Sort.by("startTime").ascending());
return ResponseEntity.status(HttpStatus.OK).
body(tournamentService.getAllTournamentList(pageRequest, tournamentFilterRequestDto.getType(), tournamentFilterRequestDto.getStatus()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public class Tournament extends BaseTimeEntity {
private String title;

@NotNull
@Column(name = "contents", length = 1000)
@Column(name = "contents", length = 3000)
private String contents;

@NotNull
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public interface UserRepository extends JpaRepository<User, Long> {
+ "FROM User u LEFT JOIN Ranks r "
+ "ON u.id = r.user_id "
+ "WHERE r.season_id = :seasonId AND u.total_exp > 0 "
+ "LIMIT :pageSize OFFSET :pageNum", nativeQuery = true)
List<ExpRankV2Dto> findExpRank(@Param("pageNum")int pageNum, @Param("pageSize")int pageSize, @Param("seasonId")Long seasonId);
+ "LIMIT :limit OFFSET :offset", nativeQuery = true)
List<ExpRankV2Dto> findExpRank(@Param("offset")int offset, @Param("limit")int limit, @Param("seasonId")Long seasonId);

}
Loading

0 comments on commit c7a394d

Please sign in to comment.