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

[BE] 기본 API 구현 완료 #9

Merged
merged 31 commits into from
May 7, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
fd0e31b
[#1] Create `oauth_access_token` table
isaac56 May 6, 2021
816ad46
feat: Create enums
isaac56 May 6, 2021
3121238
[#1] chore: Set auto increment to oauth_access_token table's primary key
isaac56 May 6, 2021
183a093
[#2] feat: Create user aggregate
isaac56 May 6, 2021
7cbb434
[#6] feat: Create a method that getting name from uniform number
isaac56 May 6, 2021
91025c8
[#6] feat: Create common response DTO
isaac56 May 6, 2021
75f68cc
[#6] refactor: Change some method's access modifier from private to p…
isaac56 May 7, 2021
f9f582c
[#6] feat: Add a necessary query method into UserRepository
isaac56 May 7, 2021
701a158
[#6] feat: Create PlayerDTO
isaac56 May 7, 2021
044af1c
[#6] feat: Create TeamDTO
isaac56 May 7, 2021
e17c641
[#6] feat: Create PitchHistoryDTO
isaac56 May 7, 2021
1adc355
[#6] feat: Create GameStatusDTO
isaac56 May 7, 2021
03d65cf
[#6] feat: Create GameService
isaac56 May 7, 2021
6b039c8
[#6] feat: Create ApiGameController
isaac56 May 7, 2021
c730f23
[#6] feat: Create GlobalExceptionHandler
isaac56 May 7, 2021
1091c96
[#1] chore: Add `strike_count`, `ball_count` into `pitch_history` table
isaac56 May 7, 2021
4d1b8c4
[#6] feat: Change Pitchhistory to fit modified `pitch_history` table
isaac56 May 7, 2021
f5a8bf4
[#6] feat: Modify Game to write strike, ball count into pitchHistory
isaac56 May 7, 2021
b171378
[#6] feat: Add additional informations into PitchHistoryDTO
isaac56 May 7, 2021
3dfa3d6
[#6] fix: Correct a typo (BALL -> HIT)
isaac56 May 7, 2021
148918c
[#6] refactor: Remove unnecessary `key_in_game` from `Inning`, `Batti…
isaac56 May 7, 2021
6019b12
[#6] refactor: Remove unnecessary `uniformNumber` from Player entity
isaac56 May 7, 2021
f90d289
[#6] feat: Create custom query method to get game descriptions list
isaac56 May 7, 2021
6aa30fb
[#6] feat: Implements getting game list API
isaac56 May 7, 2021
a817497
[#6] refactor: Change DTO's builder access modifier from public to pr…
isaac56 May 7, 2021
65cd76b
[#6] fix: Use `sendBatterOnPlate` method always when change batter
isaac56 May 7, 2021
ab93dfd
[#6] feat: Create BattingHistoryDTO
isaac56 May 7, 2021
9bc59a0
[#6] feat: Create TeamHistoryDTO
isaac56 May 7, 2021
8aedf48
[#6] feat: Create GameHistoryDTO
isaac56 May 7, 2021
858a04d
[#6] Implements API that response current game history
isaac56 May 7, 2021
0b10fcf
[#6] feat: Create requestDTO
isaac56 May 7, 2021
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
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package team9.baseball.DTO.response;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class ApiResult<T> {
private T data;
private String error;

private ApiResult(T data, String error) {
this.data = data;
this.error = error;
}

public static <T> ApiResult<T> 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;
}
}
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -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<Integer> awayScores = acquireScores(game, Halves.TOP);
List<Integer> 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<BattingHistoryDTO> awayBattingHistories = acquireBattingHistoryDTOList(game, awayTeam, awayPlayingUniformNumber);
List<BattingHistoryDTO> 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<Integer> 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<BattingHistoryDTO> 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());
}

}
Original file line number Diff line number Diff line change
@@ -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<PitchHistoryDTO> 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<PitchHistoryDTO> 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";
}

}
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -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();
}
}
23 changes: 23 additions & 0 deletions BE/baseball/src/main/java/team9/baseball/DTO/response/TeamDTO.java
Original file line number Diff line number Diff line change
@@ -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();
}
}
Loading