diff --git a/BE/baseball/src/main/java/team9/baseball/DTO/request/CreateGameDTO.java b/BE/baseball/src/main/java/team9/baseball/DTO/request/CreateGameDTO.java new file mode 100644 index 000000000..2bb70f10c --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/DTO/request/CreateGameDTO.java @@ -0,0 +1,11 @@ +package team9.baseball.DTO.request; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class CreateGameDTO { + private int away_team_id; + private int home_team_id; +} diff --git a/BE/baseball/src/main/java/team9/baseball/DTO/request/JoinGameDTO.java b/BE/baseball/src/main/java/team9/baseball/DTO/request/JoinGameDTO.java new file mode 100644 index 000000000..4a1ab95db --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/DTO/request/JoinGameDTO.java @@ -0,0 +1,16 @@ +package team9.baseball.DTO.request; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import team9.baseball.domain.enums.Venue; + +import javax.validation.constraints.NotNull; + +@Getter +@AllArgsConstructor +public class JoinGameDTO { + private int game_id; + + @NotNull + private Venue my_venue; +} diff --git a/BE/baseball/src/main/java/team9/baseball/DTO/request/PitchResultDTO.java b/BE/baseball/src/main/java/team9/baseball/DTO/request/PitchResultDTO.java new file mode 100644 index 000000000..a05d48f48 --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/DTO/request/PitchResultDTO.java @@ -0,0 +1,13 @@ +package team9.baseball.DTO.request; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import team9.baseball.domain.enums.PitchResult; + +@Getter +@Setter +@NoArgsConstructor +public class PitchResultDTO { + private PitchResult pitch_result; +} diff --git a/BE/baseball/src/main/java/team9/baseball/DTO/response/ApiResult.java b/BE/baseball/src/main/java/team9/baseball/DTO/response/ApiResult.java new file mode 100644 index 000000000..33d221630 --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/DTO/response/ApiResult.java @@ -0,0 +1,36 @@ +package team9.baseball.DTO.response; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ApiResult { + private T data; + private String error; + + private ApiResult(T data, String error) { + this.data = data; + this.error = error; + } + + public static ApiResult succeed(T data) { + return new ApiResult(data, null); + } + + public static ApiResult failed(String errorMessage) { + return new ApiResult<>(null, errorMessage); + } + + public static ApiResult failed(Throwable throwable) { + return failed(throwable.getMessage()); + } + + public T getData() { + return data; + } + + public String getError() { + return error; + } +} diff --git a/BE/baseball/src/main/java/team9/baseball/DTO/response/BattingHistoryDTO.java b/BE/baseball/src/main/java/team9/baseball/DTO/response/BattingHistoryDTO.java new file mode 100644 index 000000000..733c91527 --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/DTO/response/BattingHistoryDTO.java @@ -0,0 +1,37 @@ +package team9.baseball.DTO.response; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import team9.baseball.domain.aggregate.game.BattingHistory; +import team9.baseball.domain.aggregate.team.Team; + +@Getter +@Builder(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class BattingHistoryDTO { + private int uniform_number; + private String name; + private int appear_count; + private int hit_count; + private double hit_ratio; + private boolean playing; + + + public static BattingHistoryDTO of(Team team, BattingHistory battingHistory, int playingUniformNumber) { + double hitRatio = 0; + if (battingHistory.getAppear() != 0) { + hitRatio = (double) battingHistory.getHits() / (double) battingHistory.getAppear(); + } + + return builder() + .uniform_number(battingHistory.getBatterUniformNumber()) + .name(team.getPlayerName(battingHistory.getBatterUniformNumber())) + .appear_count(battingHistory.getAppear()) + .hit_count(battingHistory.getHits()) + .hit_ratio(hitRatio) + .playing(battingHistory.getBatterUniformNumber() == playingUniformNumber) + .build(); + } +} diff --git a/BE/baseball/src/main/java/team9/baseball/DTO/response/GameDescriptionDTO.java b/BE/baseball/src/main/java/team9/baseball/DTO/response/GameDescriptionDTO.java new file mode 100644 index 000000000..60cee7909 --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/DTO/response/GameDescriptionDTO.java @@ -0,0 +1,16 @@ +package team9.baseball.DTO.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +@AllArgsConstructor +public class GameDescriptionDTO { + private Long id; + private String awayTeam; + private String homeTeam; + private String awayUserEmail; + private String homeUserEmail; +} diff --git a/BE/baseball/src/main/java/team9/baseball/DTO/response/GameHistoryDTO.java b/BE/baseball/src/main/java/team9/baseball/DTO/response/GameHistoryDTO.java new file mode 100644 index 000000000..22da78322 --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/DTO/response/GameHistoryDTO.java @@ -0,0 +1,56 @@ +package team9.baseball.DTO.response; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import team9.baseball.domain.aggregate.game.Game; +import team9.baseball.domain.aggregate.game.Inning; +import team9.baseball.domain.aggregate.team.Team; +import team9.baseball.domain.enums.Halves; + +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +@Getter +@Builder(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class GameHistoryDTO { + private TeamHistoryDTO away_team; + private TeamHistoryDTO home_team; + + public static GameHistoryDTO of(Game game, Team awayTeam, Team homeTeam) { + List awayScores = acquireScores(game, Halves.TOP); + List homeScores = acquireScores(game, Halves.BOTTOM); + + int awayPlayingUniformNumber = game.getCurrentHalves() == Halves.TOP ? + game.getBatterUniformNumber() : game.getPitcherUniformNumber(); + int homePlayingUniformNumber = game.getCurrentHalves() == Halves.BOTTOM ? + game.getBatterUniformNumber() : game.getPitcherUniformNumber(); + + List awayBattingHistories = acquireBattingHistoryDTOList(game, awayTeam, awayPlayingUniformNumber); + List homeBattingHistories = acquireBattingHistoryDTOList(game, homeTeam, homePlayingUniformNumber); + + return builder() + .away_team(TeamHistoryDTO.of(awayTeam.getName(), awayScores, awayBattingHistories)) + .home_team(TeamHistoryDTO.of(homeTeam.getName(), homeScores, homeBattingHistories)) + .build(); + } + + private static List acquireScores(Game game, Halves halves) { + return game.getInningMap().values().stream(). + filter(x -> x.getHalves() == halves) + .sorted(Comparator.comparingInt(Inning::getInning)) + .map(x -> x.getScore()) + .collect(Collectors.toList()); + } + + private static List acquireBattingHistoryDTOList(Game game, Team team, int playingUniformNumber) { + return game.getBattingHistoryMap().values().stream() + .filter(x -> x.getBatterTeamId() == team.getId()) + .map(x -> BattingHistoryDTO.of(team, x, playingUniformNumber)) + .collect(Collectors.toList()); + } + +} diff --git a/BE/baseball/src/main/java/team9/baseball/DTO/response/GameStatusDTO.java b/BE/baseball/src/main/java/team9/baseball/DTO/response/GameStatusDTO.java new file mode 100644 index 000000000..4a6756081 --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/DTO/response/GameStatusDTO.java @@ -0,0 +1,116 @@ +package team9.baseball.DTO.response; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import team9.baseball.domain.aggregate.game.BattingHistory; +import team9.baseball.domain.aggregate.game.Game; +import team9.baseball.domain.aggregate.game.Inning; +import team9.baseball.domain.aggregate.team.Team; +import team9.baseball.domain.enums.Halves; +import team9.baseball.domain.enums.Venue; + +import java.util.List; +import java.util.stream.Collectors; + +@Getter +@Builder(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class GameStatusDTO { + private int strike; + + private int ball; + + private int out; + + private TeamDTO away_team; + + private TeamDTO home_team; + + private String inning; + + private String halves; + + private PlayerDTO pitcher; + + private String pitcher_status; + + private PlayerDTO batter; + + private String batter_status; + + private PlayerDTO base1; + + private PlayerDTO base2; + + private PlayerDTO base3; + + private List pitch_histories; + + private String my_role; + + public static GameStatusDTO of(Game game, Team awayTeam, Team homeTeam, Venue userVenue) { + Team attackTeam = game.acquireAttackTeam(awayTeam, homeTeam); + Team defenseTeam = game.acquireDefenseTeam(awayTeam, homeTeam); + + TeamDTO awayTeamDTO = TeamDTO.of(awayTeam.getName(), game.getTotalScore(Halves.TOP), + acquireCurrentRole(game.getCurrentHalves(), Halves.TOP)); + TeamDTO homeTeamDTO = TeamDTO.of(homeTeam.getName(), game.getTotalScore(Halves.BOTTOM), + acquireCurrentRole(game.getCurrentHalves(), Halves.BOTTOM)); + + + BattingHistory batterHistory = game.acquireBattingHistory(attackTeam.getId(), game.getBatterUniformNumber()); + String batterStatus = acquireBatterStatus(batterHistory); + String pitcherStatus = acquirePitcherStatus(game, defenseTeam.getId(), game.getPitcherUniformNumber()); + + String myRole = userVenue.getHalves() == game.getCurrentHalves() ? "ATTACK" : "DEFENSE"; + + return builder() + .strike(game.getStrikeCount()) + .ball(game.getBallCount()) + .out(game.getOutCount()) + .away_team(awayTeamDTO) + .home_team(homeTeamDTO) + .inning(game.getCurrentInning().toString()) + .halves(game.getCurrentHalves().name()) + .pitcher(PlayerDTO.of(defenseTeam, game.getPitcherUniformNumber())) + .pitcher_status(pitcherStatus) + .batter(PlayerDTO.of(attackTeam, game.getBatterUniformNumber())) + .batter_status(batterStatus) + .base1(PlayerDTO.of(attackTeam, game.getBase1UniformNumber())) + .base2(PlayerDTO.of(attackTeam, game.getBase2UniformNumber())) + .base3(PlayerDTO.of(attackTeam, game.getBase3UniformNumber())) + .pitch_histories(acquirePitchHistories(attackTeam, defenseTeam, game.acquireCurrentInning())) + .my_role(myRole) + .build(); + } + + private static String acquireBatterStatus(BattingHistory batterHistory) { + return String.format("%d타석 %d안타", batterHistory.getAppear(), batterHistory.getHits()); + } + + private static String acquirePitcherStatus(Game game, int pitcherTeamId, int pitcherUniformNumber) { + long pitcherCount = game.getInningMap().values().stream() + .flatMap(inning -> inning.getPitchHistoryList().stream()) + .filter(pitchHistory -> pitchHistory.getPitcherTeamId() == pitcherTeamId && + pitchHistory.getPitcherUniformNumber() == pitcherUniformNumber) + .count(); + + return "#" + pitcherCount; + } + + private static List acquirePitchHistories(Team attackTeam, Team defenseTeam, Inning inning) { + return inning.getPitchHistoryList().stream(). + map(pitchHistory -> PitchHistoryDTO.of(attackTeam, defenseTeam, pitchHistory)). + collect(Collectors.toList()); + } + + private static String acquireCurrentRole(Halves currentHalves, Halves halves) { + if (currentHalves == halves) { + return "ATTACK"; + } + return "DEFENSE"; + } + +} diff --git a/BE/baseball/src/main/java/team9/baseball/DTO/response/PitchHistoryDTO.java b/BE/baseball/src/main/java/team9/baseball/DTO/response/PitchHistoryDTO.java new file mode 100644 index 000000000..80ff48b5c --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/DTO/response/PitchHistoryDTO.java @@ -0,0 +1,29 @@ +package team9.baseball.DTO.response; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import team9.baseball.domain.aggregate.game.PitchHistory; +import team9.baseball.domain.aggregate.team.Team; + +@Getter +@Builder(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class PitchHistoryDTO { + private PlayerDTO pitcher; + private PlayerDTO batter; + private String result; + private int strike_count; + private int ball_count; + + public static PitchHistoryDTO of(Team attackTeam, Team defenseTeam, PitchHistory pitchHistory) { + return builder() + .pitcher(PlayerDTO.of(defenseTeam, pitchHistory.getPitcherUniformNumber())) + .batter(PlayerDTO.of(attackTeam, pitchHistory.getBatterUniformNumber())) + .result(pitchHistory.getResult().name()) + .strike_count(pitchHistory.getStrikeCount()) + .ball_count(pitchHistory.getBallCount()) + .build(); + } +} diff --git a/BE/baseball/src/main/java/team9/baseball/DTO/response/PlayerDTO.java b/BE/baseball/src/main/java/team9/baseball/DTO/response/PlayerDTO.java new file mode 100644 index 000000000..dc4167652 --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/DTO/response/PlayerDTO.java @@ -0,0 +1,28 @@ +package team9.baseball.DTO.response; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import team9.baseball.domain.aggregate.team.Team; + +@Getter +@Builder(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class PlayerDTO { + private int team_id; + private int uniform_number; + private String name; + + public static PlayerDTO of(Team team, Integer uniform_number) { + if (uniform_number == null) { + return null; + } + + return builder() + .team_id(team.getId()) + .uniform_number(uniform_number) + .name(team.getPlayerName(uniform_number)) + .build(); + } +} diff --git a/BE/baseball/src/main/java/team9/baseball/DTO/response/TeamDTO.java b/BE/baseball/src/main/java/team9/baseball/DTO/response/TeamDTO.java new file mode 100644 index 000000000..6ad250566 --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/DTO/response/TeamDTO.java @@ -0,0 +1,23 @@ +package team9.baseball.DTO.response; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class TeamDTO { + private String name; + private int score; + private String role; + + public static TeamDTO of(String name, int score, String role) { + return builder() + .name(name) + .score(score) + .role(role) + .build(); + } +} diff --git a/BE/baseball/src/main/java/team9/baseball/DTO/response/TeamHistoryDTO.java b/BE/baseball/src/main/java/team9/baseball/DTO/response/TeamHistoryDTO.java new file mode 100644 index 000000000..4b378a121 --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/DTO/response/TeamHistoryDTO.java @@ -0,0 +1,25 @@ +package team9.baseball.DTO.response; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; + +import java.util.List; + +@Getter +@Builder(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class TeamHistoryDTO { + private String team_name; + private List scores; + private List batting_history; + + public static TeamHistoryDTO of(String team_name, List scores, List batting_history) { + return builder() + .team_name(team_name) + .scores(scores) + .batting_history(batting_history) + .build(); + } +} diff --git a/BE/baseball/src/main/java/team9/baseball/controller/ApiGameController.java b/BE/baseball/src/main/java/team9/baseball/controller/ApiGameController.java new file mode 100644 index 000000000..75c113b5a --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/controller/ApiGameController.java @@ -0,0 +1,55 @@ +package team9.baseball.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import team9.baseball.DTO.request.CreateGameDTO; +import team9.baseball.DTO.request.JoinGameDTO; +import team9.baseball.DTO.request.PitchResultDTO; +import team9.baseball.DTO.response.ApiResult; +import team9.baseball.service.GameService; + +import javax.validation.Valid; + +@RestController +@RequestMapping("/game") +public class ApiGameController { + private final GameService gameService; + + @Autowired + public ApiGameController(GameService gameService) { + this.gameService = gameService; + } + + @GetMapping("/list") + public ApiResult getGameDescriptions() { + return ApiResult.succeed(gameService.getAllGameList()); + } + + @PostMapping + public ApiResult createGame(@RequestBody CreateGameDTO createGameDTO) { + gameService.createNewGame(1l, createGameDTO.getAway_team_id(), createGameDTO.getHome_team_id()); + return ApiResult.succeed("OK"); + } + + @PostMapping("/joining") + public ApiResult joinGame(@Valid @RequestBody JoinGameDTO joinGameDTO) { + gameService.joinGame(1l, joinGameDTO.getGame_id(), joinGameDTO.getMy_venue()); + return ApiResult.succeed("OK"); + } + + @GetMapping("/status") + public ApiResult getCurrentGameStatus() { + return ApiResult.succeed(gameService.getCurrentGameStatus(1l)); + } + + @PostMapping("/status/pitch-result") + public ApiResult pitch(@RequestBody PitchResultDTO pitchResultDTO) { + gameService.applyPitchResult(1l, pitchResultDTO.getPitch_result()); + return ApiResult.succeed("OK"); + } + + @GetMapping("/history") + public ApiResult getCurrentGameHistory() { + return ApiResult.succeed(gameService.getCurrentGameHistory(1l)); + } +} diff --git a/BE/baseball/src/main/java/team9/baseball/domain/aggregate/game/BattingHistory.java b/BE/baseball/src/main/java/team9/baseball/domain/aggregate/game/BattingHistory.java index 7b7abd617..a35630ec4 100644 --- a/BE/baseball/src/main/java/team9/baseball/domain/aggregate/game/BattingHistory.java +++ b/BE/baseball/src/main/java/team9/baseball/domain/aggregate/game/BattingHistory.java @@ -23,12 +23,9 @@ public class BattingHistory { private int out; - private String keyInGame; - public BattingHistory(Integer batterTeamId, Integer batterUniformNumber) { this.batterTeamId = batterTeamId; this.batterUniformNumber = batterUniformNumber; - this.keyInGame = acquireKeyInGame(batterTeamId, batterUniformNumber); } public static String acquireKeyInGame(Integer batterTeamId, Integer batterUniformNumber) { diff --git a/BE/baseball/src/main/java/team9/baseball/domain/aggregate/game/Game.java b/BE/baseball/src/main/java/team9/baseball/domain/aggregate/game/Game.java index 891bc785e..6952fe59e 100644 --- a/BE/baseball/src/main/java/team9/baseball/domain/aggregate/game/Game.java +++ b/BE/baseball/src/main/java/team9/baseball/domain/aggregate/game/Game.java @@ -6,10 +6,10 @@ import lombok.Setter; import org.springframework.data.annotation.Id; import org.springframework.data.relational.core.mapping.MappedCollection; -import team9.baseball.domain.aggregate.team.Player; import team9.baseball.domain.aggregate.team.Team; import team9.baseball.domain.enums.Halves; import team9.baseball.domain.enums.PitchResult; +import team9.baseball.exception.NotFoundException; import java.util.HashMap; import java.util.Map; @@ -54,35 +54,34 @@ public class Game { public Game(Team awayTeam, Team homeTeam) { this.awayTeamId = awayTeam.getId(); this.homeTeamId = homeTeam.getId(); - this.pitcherUniformNumber = awayTeam.getFirstPlayerUniformNumber(); - this.batterUniformNumber = homeTeam.getFirstPlayerUniformNumber(); - initializeBattingHistory(awayTeam); initializeBattingHistory(homeTeam); + this.pitcherUniformNumber = homeTeam.getFirstPlayerUniformNumber(); + sendBatterOnPlate(awayTeamId, awayTeam.getFirstPlayerUniformNumber()); + this.currentInning = 1; this.currentHalves = Halves.TOP; - Inning firstInning = new Inning(currentInning, currentHalves); - this.inningMap.put(firstInning.getKeyInGame(), firstInning); + this.inningMap.put(Inning.acquireKeyInGame(currentInning, currentHalves), new Inning(currentInning, currentHalves)); } private void initializeBattingHistory(Team team) { - for (Player player : team.getPlayerMap().values()) { - BattingHistory battingHistory = new BattingHistory(team.getId(), player.getUniformNumber()); - this.battingHistoryMap.put(battingHistory.getKeyInGame(), battingHistory); + for (Integer uniform_number : team.getPlayerMap().keySet()) { + String key = BattingHistory.acquireKeyInGame(team.getId(), uniform_number); + BattingHistory battingHistory = new BattingHistory(team.getId(), uniform_number); + this.battingHistoryMap.put(key, battingHistory); } } public void proceedStrike(Team awayTeam, Team homeTeam) { - //카운트 증가 - this.strikeCount++; - //기록할 pitch history 생성 PitchHistory pitchHistory = new PitchHistory(acquireDefenseTeamId(), pitcherUniformNumber, - acquireAttackTeamId(), batterUniformNumber, PitchResult.STRIKE); + acquireAttackTeamId(), batterUniformNumber, PitchResult.STRIKE, this.strikeCount, this.ballCount); //현재 이닝에 pitch history 기록 acquireCurrentInning().pitchHistoryList.add(pitchHistory); + //카운트 증가 + this.strikeCount++; //삼진 아웃 처리 if (strikeCount == 3) { proceedOut(awayTeam, homeTeam); @@ -90,43 +89,74 @@ public void proceedStrike(Team awayTeam, Team homeTeam) { } public void proceedBall(Team awayTeam, Team homeTeam) { - //카운트 증가 - this.ballCount++; - //기록할 pitch history 생성 PitchHistory pitchHistory = new PitchHistory(acquireDefenseTeamId(), pitcherUniformNumber, - acquireAttackTeamId(), batterUniformNumber, PitchResult.BALL); + acquireAttackTeamId(), batterUniformNumber, PitchResult.BALL, this.strikeCount, this.ballCount); //현재 이닝에 pitch history 기록 acquireCurrentInning().pitchHistoryList.add(pitchHistory); + //카운트 증가 + this.ballCount++; //볼넷일 경우 출루하고 다음 타자 등판 if (ballCount == 4) { sendBatterOnBase(); Team attackTeam = acquireAttackTeam(awayTeam, homeTeam); - sendBatterOnPlate(attackTeam); + sendBatterOnPlate(attackTeam.getId(), attackTeam.getNextPlayerUniformNumber(batterUniformNumber)); } } public void proceedHit(Team awayTeam, Team homeTeam) { - Team attackTeam = acquireAttackTeam(awayTeam, homeTeam); + //기록할 pitch history 생성 + PitchHistory pitchHistory = new PitchHistory(acquireDefenseTeamId(), pitcherUniformNumber, + acquireAttackTeamId(), batterUniformNumber, PitchResult.HIT, this.strikeCount, this.ballCount); + //현재 이닝에 pitch history 기록 + acquireCurrentInning().pitchHistoryList.add(pitchHistory); //타자의 battingHistory 에 타수 카운트 추가 - String battingHistoryKey = BattingHistory.acquireKeyInGame(attackTeam.getId(), batterUniformNumber); - BattingHistory battingHistory = battingHistoryMap.get(battingHistoryKey); + Team attackTeam = acquireAttackTeam(awayTeam, homeTeam); + BattingHistory battingHistory = acquireBattingHistory(attackTeam.getId(), batterUniformNumber); battingHistory.plusHits(); //타자 출루 sendBatterOnBase(); //타석에 다음 타자 등판 - sendBatterOnPlate(attackTeam); + sendBatterOnPlate(attackTeam.getId(), attackTeam.getNextPlayerUniformNumber(batterUniformNumber)); } public int getTotalScore(Halves halves) { return inningMap.values().stream().filter(x -> x.getHalves() == halves).mapToInt(x -> x.getScore()).sum(); } + public Team acquireAttackTeam(Team awayTeam, Team homeTeam) { + if (currentHalves == Halves.TOP) { + return awayTeam; + } + return homeTeam; + } + + public Team acquireDefenseTeam(Team awayTeam, Team homeTeam) { + if (currentHalves == Halves.TOP) { + return homeTeam; + } + return awayTeam; + } + + public Inning acquireCurrentInning() { + String currentInningKey = Inning.acquireKeyInGame(currentInning, currentHalves); + return inningMap.get(currentInningKey); + } + + public BattingHistory acquireBattingHistory(int batterTeamId, int batterUniformNumber) { + String key = BattingHistory.acquireKeyInGame(batterTeamId, batterUniformNumber); + if (!battingHistoryMap.containsKey(key)) { + throw new NotFoundException(String.format("%d번 게임방에 %d팀 %d 번호 선수에 대한 기록이 없습니다.", + this.id, batterTeamId, batterUniformNumber)); + } + return battingHistoryMap.get(key); + } + private void proceedOut(Team awayTeam, Team homeTeam) { //아웃 카운트 증가 this.outCount++; @@ -144,7 +174,7 @@ private void proceedOut(Team awayTeam, Team homeTeam) { //타석에 다음 타자 등판 Team attackTeam = acquireAttackTeam(awayTeam, homeTeam); - sendBatterOnPlate(attackTeam); + sendBatterOnPlate(attackTeam.getId(), attackTeam.getNextPlayerUniformNumber(batterUniformNumber)); } private void sendBatterOnBase() { @@ -159,7 +189,7 @@ private void sendBatterOnBase() { this.base1UniformNumber = this.batterUniformNumber; } - private void goToNextInning(Team homeTeam, Team awayTeam) { + private void goToNextInning(Team awayTeam, Team homeTeam) { //카운트 초기화 this.strikeCount = 0; this.ballCount = 0; @@ -172,10 +202,9 @@ private void goToNextInning(Team homeTeam, Team awayTeam) { } else { this.currentHalves = Halves.BOTTOM; } - Inning inning = new Inning(currentInning, currentHalves); - this.inningMap.put(inning.getKeyInGame(), inning); + this.inningMap.put(Inning.acquireKeyInGame(currentInning, currentHalves), new Inning(currentInning, currentHalves)); - //현재 이닝의 공격팀 수비팀 설정 + //현재 이닝의 공격팀 수비팀 확인 Team attackTeam = acquireAttackTeam(awayTeam, homeTeam); Team defenseTeam = acquireDefenseTeam(awayTeam, homeTeam); @@ -184,17 +213,15 @@ private void goToNextInning(Team homeTeam, Team awayTeam) { //공격팀 타자 설정 (직전 투수의 다음 등번호가 타자가 됨) int nextBatterUniformNumber = attackTeam.getNextPlayerUniformNumber(pitcherUniformNumber); this.pitcherUniformNumber = nextPitcherUniformNumber; - this.batterUniformNumber = nextBatterUniformNumber; + sendBatterOnPlate(attackTeam.getId(), nextBatterUniformNumber); } - private void sendBatterOnPlate(Team attackTeam) { + private void sendBatterOnPlate(int batterTeamId, int nextBatterUniformNumber) { //카운트 초기화 this.strikeCount = 0; this.ballCount = 0; //타석에 다음 선수 등판 - int batterTeamId = attackTeam.getId(); - int nextBatterUniformNumber = attackTeam.getNextPlayerUniformNumber(batterUniformNumber); this.batterUniformNumber = nextBatterUniformNumber; //선수의 BatterHistory 에 타석 카운트 추가 @@ -203,25 +230,6 @@ private void sendBatterOnPlate(Team attackTeam) { battingHistory.plusAppear(); } - private Team acquireAttackTeam(Team awayTeam, Team homeTeam) { - if (currentHalves == Halves.TOP) { - return awayTeam; - } - return homeTeam; - } - - private Team acquireDefenseTeam(Team awayTeam, Team homeTeam) { - if (currentHalves == Halves.TOP) { - return homeTeam; - } - return awayTeam; - } - - private Inning acquireCurrentInning() { - String currentInningKey = Inning.acquireKeyInGame(currentInning, currentHalves); - return inningMap.get(currentInningKey); - } - private int acquireAttackTeamId() { if (currentHalves == Halves.TOP) { return awayTeamId; diff --git a/BE/baseball/src/main/java/team9/baseball/domain/aggregate/game/Inning.java b/BE/baseball/src/main/java/team9/baseball/domain/aggregate/game/Inning.java index 7f4d9e108..38dd32953 100644 --- a/BE/baseball/src/main/java/team9/baseball/domain/aggregate/game/Inning.java +++ b/BE/baseball/src/main/java/team9/baseball/domain/aggregate/game/Inning.java @@ -24,8 +24,6 @@ public class Inning { private int score; - private String keyInGame; - @MappedCollection(idColumn = "inning_id", keyColumn = "index_in_inning") List pitchHistoryList = new ArrayList<>(); @@ -33,7 +31,6 @@ public Inning(Integer inning, Halves halves) { this.inning = inning; this.halves = halves; this.score = 0; - this.keyInGame = acquireKeyInGame(inning, halves); } public void plusScore() { diff --git a/BE/baseball/src/main/java/team9/baseball/domain/aggregate/game/PitchHistory.java b/BE/baseball/src/main/java/team9/baseball/domain/aggregate/game/PitchHistory.java index 26e614670..c1dcbcbf9 100644 --- a/BE/baseball/src/main/java/team9/baseball/domain/aggregate/game/PitchHistory.java +++ b/BE/baseball/src/main/java/team9/baseball/domain/aggregate/game/PitchHistory.java @@ -24,12 +24,19 @@ public class PitchHistory { private PitchResult result; + private int strikeCount; + + private int ballCount; + public PitchHistory(Integer pitcherTeamId, Integer pitcherUniformNumber, - Integer batterTeamId, Integer batterUniformNumber, PitchResult result) { + Integer batterTeamId, Integer batterUniformNumber, PitchResult result, + int strikeCount, int ballCount) { this.pitcherTeamId = pitcherTeamId; this.pitcherUniformNumber = pitcherUniformNumber; this.batterTeamId = batterTeamId; this.batterUniformNumber = batterUniformNumber; this.result = result; + this.strikeCount = strikeCount; + this.ballCount = ballCount; } } diff --git a/BE/baseball/src/main/java/team9/baseball/domain/aggregate/team/Player.java b/BE/baseball/src/main/java/team9/baseball/domain/aggregate/team/Player.java index 3ebd37cb2..1c0a128c2 100644 --- a/BE/baseball/src/main/java/team9/baseball/domain/aggregate/team/Player.java +++ b/BE/baseball/src/main/java/team9/baseball/domain/aggregate/team/Player.java @@ -12,10 +12,7 @@ public class Player { private String name; - private Integer uniformNumber; - - public Player(String name, Integer uniformNumber) { + public Player(String name) { this.name = name; - this.uniformNumber = uniformNumber; } } diff --git a/BE/baseball/src/main/java/team9/baseball/domain/aggregate/team/Team.java b/BE/baseball/src/main/java/team9/baseball/domain/aggregate/team/Team.java index 7f3903f58..bc5b4b587 100644 --- a/BE/baseball/src/main/java/team9/baseball/domain/aggregate/team/Team.java +++ b/BE/baseball/src/main/java/team9/baseball/domain/aggregate/team/Team.java @@ -29,15 +29,20 @@ public Team(String name) { this.name = name; } + public String getPlayerName(int uniform_number) { + if (!playerMap.containsKey(uniform_number)) { + throw new NotFoundException(this.id + "팀에 " + uniform_number + "번호의 선수가 없습니다."); + } + return playerMap.get(uniform_number).getName(); + } + public int getFirstPlayerUniformNumber() { - Player firstPlayer = playerMap.values().stream().findFirst(). + return playerMap.keySet().stream().findFirst(). orElseThrow(() -> new NotFoundException("팀에 속한 선수가 없습니다.")); - - return firstPlayer.getUniformNumber(); } - public void addPlayer(Player player) { - playerMap.put(player.getUniformNumber(), player); + public void addPlayer(int uniform_number, Player player) { + playerMap.put(uniform_number, player); } public int getNextPlayerUniformNumber(int currentUniformNumber) { @@ -45,8 +50,7 @@ public int getNextPlayerUniformNumber(int currentUniformNumber) { throw new NotFoundException("팀에 속한 선수가 없습니다."); } - List playerList = playerMap.values().stream().map(x -> x.getUniformNumber()) - .sorted().collect(Collectors.toList()); + List playerList = playerMap.keySet().stream().sorted().collect(Collectors.toList()); int currentIndex = playerList.indexOf(currentUniformNumber); int nextIndex = (currentIndex + 1) % playerList.size(); diff --git a/BE/baseball/src/main/java/team9/baseball/domain/aggregate/user/OauthAccessToken.java b/BE/baseball/src/main/java/team9/baseball/domain/aggregate/user/OauthAccessToken.java new file mode 100644 index 000000000..ba9198c54 --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/domain/aggregate/user/OauthAccessToken.java @@ -0,0 +1,25 @@ +package team9.baseball.domain.aggregate.user; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.data.annotation.Id; +import team9.baseball.domain.enums.ResourceOwner; + +@Getter +@Setter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class OauthAccessToken { + @Id + private Long id; + + private String resourceOwner; + + private String accessToken; + + public OauthAccessToken(ResourceOwner resourceOwner, String accessToken) { + this.resourceOwner = resourceOwner.name(); + this.accessToken = accessToken; + } +} diff --git a/BE/baseball/src/main/java/team9/baseball/domain/aggregate/user/User.java b/BE/baseball/src/main/java/team9/baseball/domain/aggregate/user/User.java new file mode 100644 index 000000000..8d5fe2da2 --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/domain/aggregate/user/User.java @@ -0,0 +1,44 @@ +package team9.baseball.domain.aggregate.user; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.data.annotation.Id; +import org.springframework.data.relational.core.mapping.MappedCollection; +import team9.baseball.domain.enums.ResourceOwner; +import team9.baseball.domain.enums.Venue; +import team9.baseball.exception.NotFoundException; + +import java.util.HashMap; +import java.util.Map; + +@Getter +@Setter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class User { + @Id + private Long id; + + private String email; + + private Long currentGameId; + + private Venue currentGameVenue; + + @MappedCollection(idColumn = "user_id", keyColumn = "resource_owner") + private Map oauthAccessTokenMap = new HashMap<>(); + + public User(String email, OauthAccessToken oauthAccessToken) { + this.email = email; + this.oauthAccessTokenMap.put(oauthAccessToken.getResourceOwner(), oauthAccessToken); + } + + public String getAccessToken(ResourceOwner resourceOwner) { + OauthAccessToken oauthAccessToken = oauthAccessTokenMap.getOrDefault(resourceOwner.name(), null); + if (oauthAccessToken == null) { + throw new NotFoundException(resourceOwner.name() + "의 access token이 존재하지 않습니다."); + } + return oauthAccessToken.getAccessToken(); + } +} diff --git a/BE/baseball/src/main/java/team9/baseball/domain/enums/ResourceOwner.java b/BE/baseball/src/main/java/team9/baseball/domain/enums/ResourceOwner.java new file mode 100644 index 000000000..5267977c7 --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/domain/enums/ResourceOwner.java @@ -0,0 +1,5 @@ +package team9.baseball.domain.enums; + +public enum ResourceOwner { + GITHUB +} diff --git a/BE/baseball/src/main/java/team9/baseball/domain/enums/Venue.java b/BE/baseball/src/main/java/team9/baseball/domain/enums/Venue.java new file mode 100644 index 000000000..fe1e46faa --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/domain/enums/Venue.java @@ -0,0 +1,13 @@ +package team9.baseball.domain.enums; + +public enum Venue { + AWAY, + HOME; + + public Halves getHalves() { + if (this == Venue.AWAY) { + return Halves.TOP; + } + return Halves.BOTTOM; + } +} diff --git a/BE/baseball/src/main/java/team9/baseball/exceptionHandler/GlobalExceptionHandler.java b/BE/baseball/src/main/java/team9/baseball/exceptionHandler/GlobalExceptionHandler.java new file mode 100644 index 000000000..28a23aad0 --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/exceptionHandler/GlobalExceptionHandler.java @@ -0,0 +1,23 @@ +package team9.baseball.exceptionHandler; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import team9.baseball.DTO.response.ApiResult; +import team9.baseball.exception.NotFoundException; + +@RestControllerAdvice +public class GlobalExceptionHandler { + @ExceptionHandler(RuntimeException.class) + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + public ApiResult runtimeExcpetion(Exception ex) { + return ApiResult.failed(ex); + } + + @ExceptionHandler(NotFoundException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + public ApiResult notFoundException(Exception ex) { + return ApiResult.failed(ex); + } +} diff --git a/BE/baseball/src/main/java/team9/baseball/repository/CustomGameRepository.java b/BE/baseball/src/main/java/team9/baseball/repository/CustomGameRepository.java new file mode 100644 index 000000000..5699d296b --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/repository/CustomGameRepository.java @@ -0,0 +1,20 @@ +package team9.baseball.repository; + +import org.springframework.data.jdbc.repository.query.Query; +import org.springframework.stereotype.Repository; +import team9.baseball.DTO.response.GameDescriptionDTO; + +import java.util.List; + +@Repository +public interface CustomGameRepository { + @Query("select SG.id, SG.away_team, SG.home_team, away_user.email as `away_user_email`, home_user.email as `home_user_email` from " + + "( " + + "select G.id as `id`, T1.name as `away_team`, T2.name as `home_team` from game G " + + "left join team T1 on G.away_team_id = T1.id " + + "left join team T2 on G.home_team_id = T2.id " + + ") SG " + + "left join `user` away_user on SG.id = away_user.current_game_id and away_user.current_game_venue = 'AWAY' " + + "left join `user` home_user on SG.id = home_user.current_game_id and home_user.current_game_venue = 'HOME'") + List findAllGameDescription(); +} diff --git a/BE/baseball/src/main/java/team9/baseball/repository/GameRepository.java b/BE/baseball/src/main/java/team9/baseball/repository/GameRepository.java index 81ae23d4a..97b96d5c9 100644 --- a/BE/baseball/src/main/java/team9/baseball/repository/GameRepository.java +++ b/BE/baseball/src/main/java/team9/baseball/repository/GameRepository.java @@ -3,5 +3,8 @@ import org.springframework.data.repository.CrudRepository; import team9.baseball.domain.aggregate.game.Game; -public interface GameRepository extends CrudRepository { +import java.util.List; + +public interface GameRepository extends CrudRepository, CustomGameRepository { + List findAll(); } diff --git a/BE/baseball/src/main/java/team9/baseball/repository/UserRepository.java b/BE/baseball/src/main/java/team9/baseball/repository/UserRepository.java new file mode 100644 index 000000000..edda651c0 --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/repository/UserRepository.java @@ -0,0 +1,9 @@ +package team9.baseball.repository; + +import org.springframework.data.repository.CrudRepository; +import team9.baseball.domain.aggregate.user.User; +import team9.baseball.domain.enums.Venue; + +public interface UserRepository extends CrudRepository { + boolean existsByCurrentGameIdAndCurrentGameVenue(Long currentGameId, Venue currentGameVenue); +} diff --git a/BE/baseball/src/main/java/team9/baseball/service/GameService.java b/BE/baseball/src/main/java/team9/baseball/service/GameService.java new file mode 100644 index 000000000..8ba2b306a --- /dev/null +++ b/BE/baseball/src/main/java/team9/baseball/service/GameService.java @@ -0,0 +1,124 @@ +package team9.baseball.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import team9.baseball.DTO.response.GameDescriptionDTO; +import team9.baseball.DTO.response.GameHistoryDTO; +import team9.baseball.DTO.response.GameStatusDTO; +import team9.baseball.domain.aggregate.game.Game; +import team9.baseball.domain.aggregate.team.Team; +import team9.baseball.domain.aggregate.user.User; +import team9.baseball.domain.enums.PitchResult; +import team9.baseball.domain.enums.Venue; +import team9.baseball.exception.NotFoundException; +import team9.baseball.repository.GameRepository; +import team9.baseball.repository.TeamRepository; +import team9.baseball.repository.UserRepository; + +import java.util.List; + +@Service +public class GameService { + private final GameRepository gameRepository; + private final TeamRepository teamRepository; + private final UserRepository userRepository; + + @Autowired + public GameService(GameRepository gameRepository, TeamRepository teamRepository, UserRepository userRepository) { + this.gameRepository = gameRepository; + this.teamRepository = teamRepository; + this.userRepository = userRepository; + } + + public void applyPitchResult(long userId, PitchResult pitchResult) { + User user = getUser(userId); + if (user.getCurrentGameId() == null) { + throw new RuntimeException(userId + "사용자는 게임중이 아닙니다."); + } + Game game = getGame(user.getCurrentGameId()); + Team awayTeam = getTeam(game.getAwayTeamId()); + Team homeTeam = getTeam(game.getHomeTeamId()); + + //현재 내가 공격팀이면 공을 던질 수 없다. + if (game.getCurrentHalves() == user.getCurrentGameVenue().getHalves()) { + throw new RuntimeException(userId + "번 사용자는 현재 공격팀입니다."); + } + + switch (pitchResult) { + case HIT: + game.proceedHit(awayTeam, homeTeam); + break; + case STRIKE: + game.proceedStrike(awayTeam, homeTeam); + break; + case BALL: + game.proceedBall(awayTeam, homeTeam); + break; + } + gameRepository.save(game); + } + + public GameStatusDTO getCurrentGameStatus(long userId) { + User user = getUser(userId); + if (user.getCurrentGameId() == null) { + throw new RuntimeException(userId + "사용자는 게임중이 아닙니다."); + } + Game game = getGame(user.getCurrentGameId()); + Team awayTeam = getTeam(game.getAwayTeamId()); + Team homeTeam = getTeam(game.getHomeTeamId()); + + return GameStatusDTO.of(game, awayTeam, homeTeam, user.getCurrentGameVenue()); + } + + public GameHistoryDTO getCurrentGameHistory(long userId) { + User user = getUser(userId); + if (user.getCurrentGameId() == null) { + throw new RuntimeException(userId + "사용자는 게임중이 아닙니다."); + } + Game game = getGame(user.getCurrentGameId()); + Team awayTeam = getTeam(game.getAwayTeamId()); + Team homeTeam = getTeam(game.getHomeTeamId()); + + return GameHistoryDTO.of(game, awayTeam, homeTeam); + } + + public void createNewGame(long userId, int awayTeamId, int homeTeamId) { + User user = getUser(userId); + Team awayTeam = getTeam(awayTeamId); + Team homeTeam = getTeam(homeTeamId); + + Game game = new Game(awayTeam, homeTeam); + game = gameRepository.save(game); + } + + public void joinGame(long userId, long gameId, Venue venue) { + User user = getUser(userId); + if (user.getCurrentGameId() != null) { + throw new RuntimeException(userId + "사용자는 이미 게임중입니다."); + } + Game game = getGame(gameId); + if (userRepository.existsByCurrentGameIdAndCurrentGameVenue(gameId, venue)) { + throw new RuntimeException(gameId + "번 게임의 " + venue + "팀은 다른 사용자가 참가했습니다."); + } + + user.setCurrentGameId(gameId); + user.setCurrentGameVenue(venue); + userRepository.save(user); + } + + public List getAllGameList() { + return gameRepository.findAllGameDescription(); + } + + private User getUser(long userId) { + return userRepository.findById(userId).orElseThrow(() -> new NotFoundException(userId + " 사용자는 존재하지 않습니다.")); + } + + private Game getGame(long gameId) { + return gameRepository.findById(gameId).orElseThrow(() -> new NotFoundException(gameId + "번 게임은 존재하지 않습니다.")); + } + + private Team getTeam(int teamId) { + return teamRepository.findById(teamId).orElseThrow(() -> new NotFoundException(teamId + "번 팀은 존재하지 않습니다.")); + } +} diff --git a/BE/baseball/src/main/resources/data.sql b/BE/baseball/src/main/resources/data.sql index 8dea8816d..81c5e2541 100644 --- a/BE/baseball/src/main/resources/data.sql +++ b/BE/baseball/src/main/resources/data.sql @@ -1,9 +1,17 @@ -INSERT INTO team (name) VALUES ('코드스쿼드2'); +INSERT INTO team (name) VALUES ('코드쓰쿼드'); INSERT INTO player (team_id, name, uniform_number) VALUES (1, '아이작', 1); INSERT INTO player (team_id, name, uniform_number) VALUES (1, '쏭', 2); INSERT INTO player (team_id, name, uniform_number) VALUES (1, '쑤', 3); +INSERT INTO player (team_id, name, uniform_number) VALUES (1, '쿠퍼', 4); +INSERT INTO player (team_id, name, uniform_number) VALUES (1, '우디', 5); -INSERT INTO team (name) VALUES ('마스터즈2'); +INSERT INTO team (name) VALUES ('마스터'); INSERT INTO player (team_id, name, uniform_number) VALUES (2, '호눅스', 1); INSERT INTO player (team_id, name, uniform_number) VALUES (2, 'JK', 2); INSERT INTO player (team_id, name, uniform_number) VALUES (2, '크롱', 3); +INSERT INTO player (team_id, name, uniform_number) VALUES (2, '세라', 4); +INSERT INTO player (team_id, name, uniform_number) VALUES (2, '헤드', 5); + +INSERT INTO `user` (email) VALUES ('isaac@naver.com'); +INSERT INTO `user` (email) VALUES ('soo@naver.com'); +INSERT INTO `user` (email) VALUES ('song@naver.com'); diff --git a/BE/baseball/src/main/resources/schema.sql b/BE/baseball/src/main/resources/schema.sql index a8b66992e..e7cf64e15 100644 --- a/BE/baseball/src/main/resources/schema.sql +++ b/BE/baseball/src/main/resources/schema.sql @@ -1,5 +1,5 @@ -- MySQL Script generated by MySQL Workbench --- Wed May 5 17:44:37 2021 +-- Fri May 7 10:28:19 2021 -- Model: New Model Version: 1.0 -- MySQL Workbench Forward Engineering @@ -73,13 +73,13 @@ DROP TABLE IF EXISTS `baseball`.`user` ; CREATE TABLE IF NOT EXISTS `baseball`.`user` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NOT NULL, - `game_id` BIGINT NULL, - `venue` CHAR(4) NULL, + `current_game_id` BIGINT NULL, + `current_game_venue` CHAR(4) NULL, PRIMARY KEY (`id`), - INDEX `fk_user_game1_idx` (`game_id` ASC), + INDEX `fk_user_game1_idx` (`current_game_id` ASC), UNIQUE INDEX `email_UNIQUE` (`email` ASC), CONSTRAINT `fk_user_game1` - FOREIGN KEY (`game_id`) + FOREIGN KEY (`current_game_id`) REFERENCES `baseball`.`game` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION) @@ -142,6 +142,8 @@ CREATE TABLE IF NOT EXISTS `baseball`.`pitch_history` ( `batter_uniform_number` INT NOT NULL, `result` VARCHAR(6) NOT NULL, `index_in_inning` INT NOT NULL, + `strike_count` INT NOT NULL, + `ball_count` INT NOT NULL, PRIMARY KEY (`id`), INDEX `fk_history_inning1_idx` (`inning_id` ASC), INDEX `fk_pitch_history_team1_idx` (`pitcher_team_id` ASC), @@ -194,6 +196,27 @@ CREATE TABLE IF NOT EXISTS `baseball`.`batting_history` ( ENGINE = InnoDB; +-- ----------------------------------------------------- +-- Table `baseball`.`oauth_access_token` +-- ----------------------------------------------------- +DROP TABLE IF EXISTS `baseball`.`oauth_access_token` ; + +CREATE TABLE IF NOT EXISTS `baseball`.`oauth_access_token` ( + `id` BIGINT NOT NULL AUTO_INCREMENT, + `user_id` BIGINT NOT NULL, + `resource_owner` VARCHAR(45) NOT NULL, + `access_token` VARCHAR(100) NOT NULL, + PRIMARY KEY (`id`), + INDEX `fk_oauth_access_token_user1_idx` (`user_id` ASC), + INDEX `uk_user_id_resource_owner` (`user_id` ASC, `resource_owner` ASC), + CONSTRAINT `fk_oauth_access_token_user1` + FOREIGN KEY (`user_id`) + REFERENCES `baseball`.`user` (`id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) + ENGINE = InnoDB; + + SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; diff --git a/BE/baseball/src/test/java/team9/baseball/domain/aggregate/game/GameTest.java b/BE/baseball/src/test/java/team9/baseball/domain/aggregate/game/GameTest.java index b798cf93d..c401b6768 100644 --- a/BE/baseball/src/test/java/team9/baseball/domain/aggregate/game/GameTest.java +++ b/BE/baseball/src/test/java/team9/baseball/domain/aggregate/game/GameTest.java @@ -17,19 +17,19 @@ class GameTest { void setUp() { homeTeam = new Team("코드스쿼드"); homeTeam.setId(1); - homeTeam.addPlayer(new Player("아이작", 1)); - homeTeam.addPlayer(new Player("쏭", 2)); - homeTeam.addPlayer(new Player("쑤", 3)); - homeTeam.addPlayer(new Player("쿠퍼", 4)); - homeTeam.addPlayer(new Player("우디", 5)); + homeTeam.addPlayer(1, new Player("아이작")); + homeTeam.addPlayer(2, new Player("쏭")); + homeTeam.addPlayer(3, new Player("쑤")); + homeTeam.addPlayer(4, new Player("쿠퍼")); + homeTeam.addPlayer(5, new Player("우디")); awayTeam = new Team("마스터즈"); awayTeam.setId(2); - awayTeam.addPlayer(new Player("호눅스", 1)); - awayTeam.addPlayer(new Player("JK", 2)); - awayTeam.addPlayer(new Player("크롱", 3)); - awayTeam.addPlayer(new Player("세라", 4)); - awayTeam.addPlayer(new Player("헤드", 5)); + awayTeam.addPlayer(1, new Player("호눅스")); + awayTeam.addPlayer(2, new Player("JK")); + awayTeam.addPlayer(3, new Player("크롱")); + awayTeam.addPlayer(4, new Player("세라")); + awayTeam.addPlayer(5, new Player("헤드")); game = new Game(awayTeam, homeTeam); } diff --git a/BE/baseball/src/test/java/team9/baseball/repository/GameRepositoryTest.java b/BE/baseball/src/test/java/team9/baseball/repository/GameRepositoryTest.java index 6b1707d96..0b046fe95 100644 --- a/BE/baseball/src/test/java/team9/baseball/repository/GameRepositoryTest.java +++ b/BE/baseball/src/test/java/team9/baseball/repository/GameRepositoryTest.java @@ -27,15 +27,15 @@ public GameRepositoryTest(TeamRepository teamRepository, GameRepository gameRepo @BeforeEach void setUp() { Team testTeam = new Team("코드스쿼드"); - testTeam.addPlayer(new Player("아이작", 1)); - testTeam.addPlayer(new Player("쏭", 2)); - testTeam.addPlayer(new Player("쑤", 3)); + testTeam.addPlayer(1, new Player("아이작")); + testTeam.addPlayer(2, new Player("쏭")); + testTeam.addPlayer(3, new Player("쑤")); this.teamRepository.save(testTeam); Team testTeam2 = new Team("마스터즈"); - testTeam2.addPlayer(new Player("호눅스", 1)); - testTeam2.addPlayer(new Player("JK", 2)); - testTeam2.addPlayer(new Player("크롱", 3)); + testTeam2.addPlayer(1, new Player("호눅스")); + testTeam2.addPlayer(2, new Player("JK")); + testTeam2.addPlayer(3, new Player("크롱")); this.teamRepository.save(testTeam2); } diff --git a/BE/baseball/src/test/java/team9/baseball/repository/TeamRepositoryTest.java b/BE/baseball/src/test/java/team9/baseball/repository/TeamRepositoryTest.java index 562c243d3..ada7a7a08 100644 --- a/BE/baseball/src/test/java/team9/baseball/repository/TeamRepositoryTest.java +++ b/BE/baseball/src/test/java/team9/baseball/repository/TeamRepositoryTest.java @@ -23,9 +23,9 @@ public TeamRepositoryTest(TeamRepository teamRepository) { @DisplayName("Team 생성 테스트") void create() { Team testTeam2 = new Team("마스터즈"); - testTeam2.addPlayer(new Player("호눅스", 1)); - testTeam2.addPlayer(new Player("JK", 2)); - testTeam2.addPlayer(new Player("크롱", 3)); + testTeam2.addPlayer(1, new Player("호눅스")); + testTeam2.addPlayer(2, new Player("JK")); + testTeam2.addPlayer(3, new Player("크롱")); Team saved = this.teamRepository.save(testTeam2); Assertions.assertThat(saved.getName()).isEqualTo("마스터즈"); Assertions.assertThat(saved.getPlayerMap().size()).isEqualTo(3); diff --git a/BE/baseball/src/test/java/team9/baseball/repository/UserRepositoryTest.java b/BE/baseball/src/test/java/team9/baseball/repository/UserRepositoryTest.java new file mode 100644 index 000000000..3384facf9 --- /dev/null +++ b/BE/baseball/src/test/java/team9/baseball/repository/UserRepositoryTest.java @@ -0,0 +1,35 @@ +package team9.baseball.repository; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; +import team9.baseball.domain.aggregate.user.OauthAccessToken; +import team9.baseball.domain.aggregate.user.User; +import team9.baseball.domain.enums.ResourceOwner; + +@SpringBootTest +@Transactional +class UserRepositoryTest { + private UserRepository userRepository; + + @Autowired + public UserRepositoryTest(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Test + public void 유저생성조회테스트() { + OauthAccessToken oauthAccessToken = new OauthAccessToken(ResourceOwner.GITHUB, "TEST"); + User user = new User("isaac56@naver.com", oauthAccessToken); + User saved = userRepository.save(user); + + Assertions.assertThat(user.getEmail()).isEqualTo(saved.getEmail()); + + User found = userRepository.findById(saved.getId()).get(); + Assertions.assertThat(found.getEmail()).isEqualTo(saved.getEmail()); + + Assertions.assertThat(found.getAccessToken(ResourceOwner.GITHUB)).isEqualTo(oauthAccessToken.getAccessToken()); + } +} diff --git a/docs/database/Schema.mwb b/docs/database/Schema.mwb index 6d3addeb6..2acb540db 100644 Binary files a/docs/database/Schema.mwb and b/docs/database/Schema.mwb differ diff --git a/docs/database/Schema.png b/docs/database/Schema.png index 92506db29..6e8741e20 100644 Binary files a/docs/database/Schema.png and b/docs/database/Schema.png differ