diff --git a/BE/.gitignore b/BE/.gitignore new file mode 100644 index 000000000..c8580902f --- /dev/null +++ b/BE/.gitignore @@ -0,0 +1,43 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### properties 제외 ### +/src/main/resources/application.properties + +### server_secret 제외 ### +/src/main/resources/server.secret.json diff --git a/BE/build.gradle b/BE/build.gradle new file mode 100644 index 000000000..d818653bf --- /dev/null +++ b/BE/build.gradle @@ -0,0 +1,37 @@ +plugins { + id 'org.springframework.boot' version '2.4.5' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' + id 'java' + id 'org.jetbrains.kotlin.jvm' version '1.4.32' +} + +group = 'com.codesquad' +version = '0.0.1-SNAPSHOT' +sourceCompatibility = '1.8' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' + implementation 'org.springframework.boot:spring-boot-starter-web' + runtimeOnly 'mysql:mysql-connector-java' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8" + implementation files('build/libs/gitOauthV5.jar') +} + +test { + useJUnitPlatform() +} +compileKotlin { + kotlinOptions { + jvmTarget = "1.8" + } +} +compileTestKotlin { + kotlinOptions { + jvmTarget = "1.8" + } +} diff --git a/BE/gradle/wrapper/gradle-wrapper.jar b/BE/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..e708b1c02 Binary files /dev/null and b/BE/gradle/wrapper/gradle-wrapper.jar differ diff --git a/BE/gradle/wrapper/gradle-wrapper.properties b/BE/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..442d9132e --- /dev/null +++ b/BE/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/BE/gradlew b/BE/gradlew new file mode 100644 index 000000000..4f906e0c8 --- /dev/null +++ b/BE/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/BE/gradlew.bat b/BE/gradlew.bat new file mode 100644 index 000000000..107acd32c --- /dev/null +++ b/BE/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/BE/settings.gradle b/BE/settings.gradle new file mode 100644 index 000000000..d7ed485c5 --- /dev/null +++ b/BE/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'coco' diff --git a/BE/src/main/java/com/codesquad/coco/CocoApplication.java b/BE/src/main/java/com/codesquad/coco/CocoApplication.java new file mode 100644 index 000000000..b92aa7349 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/CocoApplication.java @@ -0,0 +1,13 @@ +package com.codesquad.coco; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CocoApplication { + + public static void main(String[] args) { + SpringApplication.run(CocoApplication.class, args); + } + +} diff --git a/BE/src/main/java/com/codesquad/coco/WebConfig.java b/BE/src/main/java/com/codesquad/coco/WebConfig.java new file mode 100644 index 000000000..59b933933 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/WebConfig.java @@ -0,0 +1,16 @@ +package com.codesquad.coco; + + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("http://localhost:3000") + .allowedMethods("*"); + } +} \ No newline at end of file diff --git a/BE/src/main/java/com/codesquad/coco/game/GameController.java b/BE/src/main/java/com/codesquad/coco/game/GameController.java new file mode 100644 index 000000000..9b5486ec1 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/game/GameController.java @@ -0,0 +1,62 @@ +package com.codesquad.coco.game; + +import com.codesquad.coco.game.domain.model.DTO.GamePlayDTO; +import com.codesquad.coco.game.domain.model.DTO.GameScoreDTO; +import com.codesquad.coco.game.domain.model.ScoreBoard; +import com.codesquad.coco.team.TeamService; +import com.codesquad.coco.team.domain.DTO.MainPageTeamDTO; +import com.codesquad.coco.team.domain.DTO.TeamChoiceDTO; +import com.codesquad.coco.team.domain.DTO.TeamPointDTO; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api") +public class GameController { + + private TeamService teamService; + private GameService gameService; + + public GameController(TeamService teamService, GameService gameService) { + this.teamService = teamService; + this.gameService = gameService; + } + + @GetMapping("/intro") + @ResponseStatus(HttpStatus.OK) + public MainPageTeamDTO mainPage() { + return teamService.findMainTeams(); + } + + @PostMapping("/games/type-home") + @ResponseStatus(HttpStatus.CREATED) + public GamePlayDTO homeTeamMatch(@RequestBody TeamChoiceDTO choiceDTO) { + return teamService.makeHomeGameDTO(choiceDTO); + } + + @PostMapping("/games/type-away") + @ResponseStatus(HttpStatus.CREATED) + public GamePlayDTO awayTeamMatch(@RequestBody TeamChoiceDTO choiceDTO) { + return teamService.makeAwayGameDTO(choiceDTO); + } + + @PostMapping("/games/{gameId}/points") + @ResponseStatus(HttpStatus.OK) + public void plusPoint(@PathVariable Long gameId, @RequestBody TeamPointDTO teamPointDTO) { + ScoreBoard scoreBoard = gameService.findScoreBoardByTeamName(gameId, teamPointDTO); + gameService.plusPoint(scoreBoard, teamPointDTO); + } + + @GetMapping("/games/{gameId}/points") + @ResponseStatus(HttpStatus.OK) + public GameScoreDTO gamePoint(@PathVariable Long gameId) { + return gameService.findGameScoreDTOByGameId(gameId); + } + + @GetMapping("/games/{gameId}/players") + @ResponseStatus(HttpStatus.OK) + public GamePlayDTO showPlayer(@PathVariable Long gameId) { + return gameService.findGamePlayDTOByGameId(gameId); + } + +} diff --git a/BE/src/main/java/com/codesquad/coco/game/GameService.java b/BE/src/main/java/com/codesquad/coco/game/GameService.java new file mode 100644 index 000000000..e35bc90c2 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/game/GameService.java @@ -0,0 +1,73 @@ +package com.codesquad.coco.game; + +import com.codesquad.coco.game.domain.DAO.GameDAO; +import com.codesquad.coco.game.domain.DAO.ScoreBoardDAO; +import com.codesquad.coco.game.domain.model.DTO.GamePlayDTO; +import com.codesquad.coco.game.domain.model.DTO.GameScoreDTO; +import com.codesquad.coco.game.domain.model.Innings; +import com.codesquad.coco.game.domain.model.ScoreBoard; +import com.codesquad.coco.team.TeamService; +import com.codesquad.coco.team.domain.DTO.TeamDTO; +import com.codesquad.coco.team.domain.DTO.TeamPointDTO; +import com.codesquad.coco.team.domain.DTO.TeamScoreDTO; +import com.codesquad.coco.utils.DTOConverter; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class GameService { + + private GameDAO gameDAO; + private ScoreBoardDAO boardDAO; + private TeamService teamService; + + public GameService(GameDAO gameDAO, ScoreBoardDAO boardDAO, TeamService teamService) { + this.gameDAO = gameDAO; + this.boardDAO = boardDAO; + this.teamService = teamService; + } + + public ScoreBoard findScoreBoardByTeamName(Long gameId, TeamPointDTO teamPointDTO) { + return boardDAO.findByGameIdAndTeamName(gameId, teamPointDTO.getTeamName()); + } + + public void plusPoint(ScoreBoard scoreBoard, TeamPointDTO teamPointDTO) { + Innings innings = scoreBoard.updateScore(teamPointDTO.getRound(), teamPointDTO.getPoint()); + boardDAO.saveInnings(innings); + } + + public GameScoreDTO findGameScoreDTOByGameId(Long gameId) { + List scoreBoard = findScoreBoardByGameId(gameId); + String userTeamName = findUserTeamNameByGameId(gameId); + + TeamScoreDTO teamScoreDTO = DTOConverter.scoreToTeamScoreDTO(scoreBoard.get(0)); + TeamScoreDTO teamScoreDTO1 = DTOConverter.scoreToTeamScoreDTO(scoreBoard.get(1)); + + if (teamScoreDTO.getTeamName().equals(userTeamName)) { + return new GameScoreDTO(teamScoreDTO, teamScoreDTO1); + } + return new GameScoreDTO(teamScoreDTO1, teamScoreDTO); + } + + public List findScoreBoardByGameId(Long gameId) { + return boardDAO.findByGameId(gameId); + } + + public GamePlayDTO findGamePlayDTOByGameId(Long gameId) { + String userTeamName = findUserTeamNameByGameId(gameId); + + TeamDTO homeTeam = teamService.findHomeTeamByGameId(gameId); + TeamDTO awayTeam = teamService.findAwayTeamByGameId(gameId); + + if (homeTeam.getTeamName().equals(userTeamName)) { + return new GamePlayDTO(gameId, homeTeam, awayTeam); + } + return new GamePlayDTO(gameId, awayTeam, homeTeam); + } + + public String findUserTeamNameByGameId(Long gameId) { + return gameDAO.findUserTeamNameByGameId(gameId); + } + +} diff --git a/BE/src/main/java/com/codesquad/coco/game/domain/DAO/GameDAO.java b/BE/src/main/java/com/codesquad/coco/game/domain/DAO/GameDAO.java new file mode 100644 index 000000000..0257b47c4 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/game/domain/DAO/GameDAO.java @@ -0,0 +1,80 @@ +package com.codesquad.coco.game.domain.DAO; + +import com.codesquad.coco.game.domain.model.Game; +import com.codesquad.coco.game.domain.model.ScoreBoard; +import com.codesquad.coco.player.domain.PlayerDAO; +import com.codesquad.coco.utils.mapper.HomeAwayTeamNameMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Component; + +import static com.codesquad.coco.utils.BASEBALL_SQLKt.*; + +@Component +public class GameDAO { + + private PlayerDAO playerDAO; + private ScoreBoardDAO boardDAO; + private HomeAwayTeamNameMapper homeAwayTeamNameMapper = new HomeAwayTeamNameMapper(); + private NamedParameterJdbcTemplate template; + + public GameDAO(PlayerDAO playerDAO, ScoreBoardDAO boardDAO, NamedParameterJdbcTemplate template) { + this.playerDAO = playerDAO; + this.boardDAO = boardDAO; + this.template = template; + } + + public Long makeGame(Game game) { + Long gameId = saveGame(game); + ScoreBoard away = new ScoreBoard.Builder() + .game(gameId) + .team(game.awayTeamName()) + .build(); + ScoreBoard home = new ScoreBoard.Builder() + .game(gameId) + .team(game.homeTeamName()) + .build(); + + saveScoreBoard(game, away); + saveScoreBoard(game, home); + return gameId; + } + + private Long saveScoreBoard(Game game, ScoreBoard away) { + Long scoreId = boardDAO.save(away); + game.addScoreBoard(away); + return scoreId; + } + + private Long saveGame(Game game) { + KeyHolder keyHolder = new GeneratedKeyHolder(); + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("home", game.homeTeamName()); + parameter.addValue("away", game.awayTeamName()); + parameter.addValue("user_type", game.getUserType().toString()); + + template.update(GAME_SAVE_SQL, parameter, keyHolder); + + return keyHolder.getKey().longValue(); + } + + public String findUserTeamNameByGameId(Long id) { + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("id", id); + return template.queryForObject(FIND_USER_TEAM_NAME_SQL, parameter, homeAwayTeamNameMapper); + } + + public String findHomeTeamNameByGameId(Long id) { + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("id", id); + return template.queryForObject(FIND_HOME_TEAM_NAME_BY_GAME_ID, parameter, homeAwayTeamNameMapper); + } + + public String findAwayTeamNameByGameId(Long id) { + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("id", id); + return template.queryForObject(FIND_AWAY_TEAM_NAME_BY_GAME_ID, parameter, homeAwayTeamNameMapper); + } +} diff --git a/BE/src/main/java/com/codesquad/coco/game/domain/DAO/InningsDAO.java b/BE/src/main/java/com/codesquad/coco/game/domain/DAO/InningsDAO.java new file mode 100644 index 000000000..d430fd4f4 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/game/domain/DAO/InningsDAO.java @@ -0,0 +1,28 @@ +package com.codesquad.coco.game.domain.DAO; + +import com.codesquad.coco.game.domain.model.Innings; +import com.codesquad.coco.utils.mapper.InningsMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Component; + +import java.util.List; + +import static com.codesquad.coco.utils.BASEBALL_SQLKt.FIND_ALL_INNINGS_SQL; + +@Component +public class InningsDAO { + + private NamedParameterJdbcTemplate template; + private InningsMapper inningsMapper = new InningsMapper(); + + public InningsDAO(NamedParameterJdbcTemplate template) { + this.template = template; + } + + public List findAllById(long id) { + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("id", id); + return template.query(FIND_ALL_INNINGS_SQL, parameter, inningsMapper); + } +} diff --git a/BE/src/main/java/com/codesquad/coco/game/domain/DAO/ScoreBoardDAO.java b/BE/src/main/java/com/codesquad/coco/game/domain/DAO/ScoreBoardDAO.java new file mode 100644 index 000000000..1d943b421 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/game/domain/DAO/ScoreBoardDAO.java @@ -0,0 +1,74 @@ +package com.codesquad.coco.game.domain.DAO; + +import com.codesquad.coco.game.domain.model.Innings; +import com.codesquad.coco.game.domain.model.ScoreBoard; +import com.codesquad.coco.utils.mapper.ScoreBoardMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.jdbc.support.KeyHolder; +import org.springframework.stereotype.Component; + +import java.util.List; + +import static com.codesquad.coco.utils.BASEBALL_SQLKt.*; + +@Component +public class ScoreBoardDAO { + + + private InningsDAO inningsDAO; + private NamedParameterJdbcTemplate template; + private ScoreBoardMapper scoreBoardMapper = new ScoreBoardMapper(); + + public ScoreBoardDAO(InningsDAO inningsDAO, NamedParameterJdbcTemplate template) { + this.inningsDAO = inningsDAO; + this.template = template; + } + + public Long save(ScoreBoard board) { + KeyHolder keyHolder = new GeneratedKeyHolder(); + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("game", board.getGameId()); + parameter.addValue("team", board.teamName()); + + template.update(SCORE_BOARD_SAVE_SQL, parameter, keyHolder); + + return keyHolder.getKey().longValue(); + } + + public ScoreBoard findByGameIdAndTeamName(Long id, String teamName) { + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("id", id); + parameter.addValue("teamName", teamName); + + ScoreBoard board = template.queryForObject(FIND_SCORE_BOARD_SQL, parameter, scoreBoardMapper); + List innings = inningsDAO.findAllById(board.getId()); + innings.forEach(board::addInnings); + return board; + } + + public List findByGameId(Long id) { + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("id", id); + + List scoreBoards = template.query(FIND_SCORE_BOARDS_SQL, parameter, scoreBoardMapper); + + for (ScoreBoard board : scoreBoards) { + List innings = inningsDAO.findAllById(board.getId()); + innings.forEach(board::addInnings); + } + return scoreBoards; + } + + + public void saveInnings(Innings innings) { + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("score_board", innings.getScoreBoard()); + parameter.addValue("score", innings.getScore()); + parameter.addValue("score_board_key", innings.getInning()); + + template.update(INNINGS_SAVE_SQL, parameter); + } + +} diff --git a/BE/src/main/java/com/codesquad/coco/game/domain/GameRepository.java b/BE/src/main/java/com/codesquad/coco/game/domain/GameRepository.java new file mode 100644 index 000000000..a34f7a433 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/game/domain/GameRepository.java @@ -0,0 +1,8 @@ +package com.codesquad.coco.game.domain; + +import com.codesquad.coco.game.domain.model.Game; +import org.springframework.data.repository.CrudRepository; + +public interface GameRepository extends CrudRepository { + +} diff --git a/BE/src/main/java/com/codesquad/coco/game/domain/model/DTO/GamePlayDTO.java b/BE/src/main/java/com/codesquad/coco/game/domain/model/DTO/GamePlayDTO.java new file mode 100644 index 000000000..c241a25eb --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/game/domain/model/DTO/GamePlayDTO.java @@ -0,0 +1,29 @@ +package com.codesquad.coco.game.domain.model.DTO; + +import com.codesquad.coco.team.domain.DTO.TeamDTO; + +public class GamePlayDTO { + + private Long gameId; + + private TeamDTO user; + private TeamDTO opponent; + + public GamePlayDTO(Long gameId, TeamDTO user, TeamDTO opponent) { + this.gameId = gameId; + this.user = user; + this.opponent = opponent; + } + + public Long getGameId() { + return gameId; + } + + public TeamDTO getUser() { + return user; + } + + public TeamDTO getOpponent() { + return opponent; + } +} diff --git a/BE/src/main/java/com/codesquad/coco/game/domain/model/DTO/GameScoreDTO.java b/BE/src/main/java/com/codesquad/coco/game/domain/model/DTO/GameScoreDTO.java new file mode 100644 index 000000000..f089fe5a1 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/game/domain/model/DTO/GameScoreDTO.java @@ -0,0 +1,22 @@ +package com.codesquad.coco.game.domain.model.DTO; + +import com.codesquad.coco.team.domain.DTO.TeamScoreDTO; + +public class GameScoreDTO { + + private TeamScoreDTO user; + private TeamScoreDTO opponent; + + public GameScoreDTO(TeamScoreDTO user, TeamScoreDTO opponent) { + this.user = user; + this.opponent = opponent; + } + + public TeamScoreDTO getUser() { + return user; + } + + public TeamScoreDTO getOpponent() { + return opponent; + } +} diff --git a/BE/src/main/java/com/codesquad/coco/game/domain/model/Game.java b/BE/src/main/java/com/codesquad/coco/game/domain/model/Game.java new file mode 100644 index 000000000..9a925b5ef --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/game/domain/model/Game.java @@ -0,0 +1,79 @@ +package com.codesquad.coco.game.domain.model; + +import com.codesquad.coco.player.domain.UserType; +import com.codesquad.coco.team.domain.Team; +import org.springframework.data.annotation.Id; + +import java.util.HashSet; +import java.util.Set; + +public class Game { + + @Id + private Long id; + + private Team away; + + private Team home; + + private Set scoreBoard = new HashSet<>(); + + private UserType userType; + + public Game(Team away, Team home, UserType userType) { + this.away = away; + this.home = home; + this.userType = userType; + } + + public Game(Long id, Team away, Team home, Set scoreBoard, UserType userType) { + this.id = id; + this.away = away; + this.home = home; + this.scoreBoard = scoreBoard; + this.userType = userType; + } + + public Long getId() { + return id; + } + + public Team getAway() { + return away; + } + + public Team getHome() { + return home; + } + + public UserType getUserType() { + return userType; + } + + public String awayTeamName() { + return away.getName(); + } + + public String homeTeamName() { + return home.getName(); + } + + public void addScoreBoard(ScoreBoard board) { + scoreBoard.add(board); + } + + public Set getScoreBoard() { + return scoreBoard; + } + + @Override + public String toString() { + return "Game{" + + "id=" + id + + ", away=" + away + + ", home=" + home + + ", scoreBoard=" + scoreBoard + + ", userType='" + userType + '\'' + + '}'; + } +} diff --git a/BE/src/main/java/com/codesquad/coco/game/domain/model/Innings.java b/BE/src/main/java/com/codesquad/coco/game/domain/model/Innings.java new file mode 100644 index 000000000..820c18267 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/game/domain/model/Innings.java @@ -0,0 +1,54 @@ +package com.codesquad.coco.game.domain.model; + +import org.springframework.data.annotation.Id; + +public class Innings { + + @Id + private Long id; + + private Long scoreBoard; + private int score; + private int inning; + + public Innings(Long scoreBoard, int score, int inning) { + this.scoreBoard = scoreBoard; + this.score = score; + this.inning = inning; + } + + public Innings(Long id, Long scoreBoard, int score) { + this.id = id; + this.scoreBoard = scoreBoard; + this.score = score; + } + + public Long getId() { + return id; + } + + public Long getScoreBoard() { + return scoreBoard; + } + + public int getScore() { + return score; + } + + public int getInning() { + return inning; + } + + @Override + public String toString() { + return "Innings{" + + "id=" + id + + ", scoreBoard=" + scoreBoard + + ", score=" + score + + '}'; + } + + public void update(int point) { + this.score += point; + } +} diff --git a/BE/src/main/java/com/codesquad/coco/game/domain/model/ScoreBoard.java b/BE/src/main/java/com/codesquad/coco/game/domain/model/ScoreBoard.java new file mode 100644 index 000000000..50698fe0b --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/game/domain/model/ScoreBoard.java @@ -0,0 +1,93 @@ +package com.codesquad.coco.game.domain.model; + +import org.springframework.data.annotation.Id; + +import java.util.ArrayList; +import java.util.List; + +public class ScoreBoard { + + @Id + private Long id; + + private Long game; + private String team; + private List innings; + + public ScoreBoard(Long id, Long game, String team, List innings) { + this.id = id; + this.game = game; + this.team = team; + this.innings = innings; + } + + public Innings updateScore(int round, int point) { + return new Innings(this.id, point, round); + } + + public void addInnings(Innings inning) { + innings.add(inning); + } + + public Long getId() { + return id; + } + + public Long getGameId() { + return game; + } + + public String teamName() { + return team; + } + + public String getTeam() { + return team; + } + + public List getInnings() { + return innings; + } + + @Override + public String toString() { + return "ScoreBoard{" + + "id=" + id + + ", gameId=" + game + + ", team=" + team + + ", innings=" + innings + + '}'; + } + + public static class Builder { + private Long id; + private Long game; + private String team; + private List innings = new ArrayList<>(); + + public Builder id(Long val) { + id = val; + return this; + } + + public Builder game(Long val) { + game = val; + return this; + } + + public Builder team(String val) { + team = val; + return this; + } + + public Builder innings(List val) { + innings = val; + return this; + } + + public ScoreBoard build() { + return new ScoreBoard(id, game, team, innings); + } + } + +} diff --git a/BE/src/main/java/com/codesquad/coco/global/CustomExceptionController.java b/BE/src/main/java/com/codesquad/coco/global/CustomExceptionController.java new file mode 100644 index 000000000..836b3f0de --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/global/CustomExceptionController.java @@ -0,0 +1,15 @@ +package com.codesquad.coco.global; + + +import com.gitoauth.coco.JWT.OverTimeException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice +public class CustomExceptionController { + + @ExceptionHandler(OverTimeException.class) + public void OverTime(OverTimeException e) { + // todo : 시간 만료 + } +} diff --git a/BE/src/main/java/com/codesquad/coco/player/PlayerController.java b/BE/src/main/java/com/codesquad/coco/player/PlayerController.java new file mode 100644 index 000000000..93cd87273 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/player/PlayerController.java @@ -0,0 +1,26 @@ +package com.codesquad.coco.player; + +import com.codesquad.coco.player.domain.model.DTO.PlayerEventDTO; +import com.codesquad.coco.player.domain.model.Player; +import com.codesquad.coco.player.domain.model.Record; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/api") +public class PlayerController { + + private final PlayerService playerService; + + public PlayerController(PlayerService playerService) { + this.playerService = playerService; + } + + @PutMapping("/players/{playerId}/record") + @ResponseStatus(HttpStatus.OK) + public void playerEvent(@PathVariable Long playerId, @RequestBody PlayerEventDTO eventDTO) { + Player player = playerService.findById(playerId); + Record record = player.getRecord(); + playerService.updateRecord(record, eventDTO); + } +} diff --git a/BE/src/main/java/com/codesquad/coco/player/PlayerService.java b/BE/src/main/java/com/codesquad/coco/player/PlayerService.java new file mode 100644 index 000000000..c3756458e --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/player/PlayerService.java @@ -0,0 +1,27 @@ +package com.codesquad.coco.player; + +import com.codesquad.coco.player.domain.PlayerDAO; +import com.codesquad.coco.player.domain.model.DTO.PlayerEventDTO; +import com.codesquad.coco.player.domain.model.Player; +import com.codesquad.coco.player.domain.model.Record; +import org.springframework.stereotype.Service; + +@Service +public class PlayerService { + + private final PlayerDAO playerDAO; + + public PlayerService(PlayerDAO playerDAO) { + this.playerDAO = playerDAO; + } + + + public Player findById(Long playerId) { + return playerDAO.findById(playerId); + } + + public void updateRecord(Record record, PlayerEventDTO eventDTO) { + record.update(eventDTO.getRecord()); + playerDAO.updateRecord(record); + } +} diff --git a/BE/src/main/java/com/codesquad/coco/player/domain/PlayerDAO.java b/BE/src/main/java/com/codesquad/coco/player/domain/PlayerDAO.java new file mode 100644 index 000000000..068999d38 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/player/domain/PlayerDAO.java @@ -0,0 +1,44 @@ +package com.codesquad.coco.player.domain; + +import com.codesquad.coco.player.domain.model.Player; +import com.codesquad.coco.player.domain.model.Record; +import com.codesquad.coco.utils.mapper.PlayerMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Component; + +import java.util.List; + +import static com.codesquad.coco.utils.BASEBALL_SQLKt.*; + +@Component +public class PlayerDAO { + private NamedParameterJdbcTemplate template; + private PlayerMapper playerMapper = new PlayerMapper(); + + public PlayerDAO(NamedParameterJdbcTemplate template) { + this.template = template; + } + + public List findByTeamName(String teamName) { + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("teamName", teamName); + return template.query(FIND_PLAYER_BY_TEAM_NAME, parameter, playerMapper); + + } + + public Player findById(Long id) { + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("id", id); + return template.queryForObject(FIND_PLAYER_BY_PLAYER_ID, parameter, playerMapper); + } + + public void updateRecord(Record record) { + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("atBat", record.getAtBat()); + parameter.addValue("hits", record.getHits()); + parameter.addValue("outs", record.getOuts()); + parameter.addValue("id", record.getId()); + template.update(UPDATE_PLAYER_RECORD, parameter); + } +} diff --git a/BE/src/main/java/com/codesquad/coco/player/domain/RecordType.java b/BE/src/main/java/com/codesquad/coco/player/domain/RecordType.java new file mode 100644 index 000000000..e957e93fc --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/player/domain/RecordType.java @@ -0,0 +1,12 @@ +package com.codesquad.coco.player.domain; + +public enum RecordType { + HITS("hits"), + OUT("out"); + + private String log; + + RecordType(String log) { + this.log = log; + } +} diff --git a/BE/src/main/java/com/codesquad/coco/player/domain/UserType.java b/BE/src/main/java/com/codesquad/coco/player/domain/UserType.java new file mode 100644 index 000000000..e2676f03a --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/player/domain/UserType.java @@ -0,0 +1,5 @@ +package com.codesquad.coco.player.domain; + +public enum UserType { + HOME, AWAY +} diff --git a/BE/src/main/java/com/codesquad/coco/player/domain/model/DTO/PlayerDTO.java b/BE/src/main/java/com/codesquad/coco/player/domain/model/DTO/PlayerDTO.java new file mode 100644 index 000000000..c97a85ea7 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/player/domain/model/DTO/PlayerDTO.java @@ -0,0 +1,56 @@ +package com.codesquad.coco.player.domain.model.DTO; + +public class PlayerDTO { + + private Long id; + private String name; + private String type; + private int atBat; + private int hits; + private int out; + private double average; + + public PlayerDTO(Long id, String name, String type) { + this.id = id; + this.name = name; + this.type = type; + } + + public PlayerDTO(Long id, String name, String type, int atBat, int hits, int out, double average) { + this.id = id; + this.name = name; + this.type = type; + this.atBat = atBat; + this.hits = hits; + this.out = out; + this.average = average; + } + + public int getAtBat() { + return atBat; + } + + public int getHits() { + return hits; + } + + public int getOut() { + return out; + } + + public double getAverage() { + return average; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getType() { + return type; + } +} diff --git a/BE/src/main/java/com/codesquad/coco/player/domain/model/DTO/PlayerEventDTO.java b/BE/src/main/java/com/codesquad/coco/player/domain/model/DTO/PlayerEventDTO.java new file mode 100644 index 000000000..a773ff67e --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/player/domain/model/DTO/PlayerEventDTO.java @@ -0,0 +1,19 @@ +package com.codesquad.coco.player.domain.model.DTO; + +import com.codesquad.coco.player.domain.RecordType; + +public class PlayerEventDTO { + + private RecordType record; + + public RecordType getRecord() { + return record; + } + + @Override + public String toString() { + return "PlayerEventDTO{" + + "record=" + record + + '}'; + } +} diff --git a/BE/src/main/java/com/codesquad/coco/player/domain/model/Player.java b/BE/src/main/java/com/codesquad/coco/player/domain/model/Player.java new file mode 100644 index 000000000..e7d4a7a39 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/player/domain/model/Player.java @@ -0,0 +1,46 @@ +package com.codesquad.coco.player.domain.model; + +import org.springframework.data.annotation.Id; + +public class Player { + + @Id + private Long id; + + private String name; + private String type; + private Record record; + + public Player(Long id, String name, String type, Record record) { + this.id = id; + this.name = name; + this.type = type; + this.record = record; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getType() { + return type; + } + + public Record getRecord() { + return record; + } + + @Override + public String toString() { + return "Player{" + + "id=" + id + + ", name='" + name + '\'' + + ", type='" + type + '\'' + + ", record=" + record + + '}'; + } +} diff --git a/BE/src/main/java/com/codesquad/coco/player/domain/model/Record.java b/BE/src/main/java/com/codesquad/coco/player/domain/model/Record.java new file mode 100644 index 000000000..6acbc7fce --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/player/domain/model/Record.java @@ -0,0 +1,62 @@ +package com.codesquad.coco.player.domain.model; + +import com.codesquad.coco.player.domain.RecordType; +import org.springframework.data.annotation.Id; + +public class Record { + + @Id + private Long id; + + private int atBat; + private int hits; + private int outs; + + public Record(Long id, int atBat, int hits, int outs) { + this.id = id; + this.atBat = atBat; + this.hits = hits; + this.outs = outs; + } + + public Long getId() { + return id; + } + + public int getAtBat() { + return atBat; + } + + public int getHits() { + return hits; + } + + public int getOuts() { + return outs; + } + + public double getAverage() { + return (double) hits / atBat; + } + + @Override + public String toString() { + return "Record{" + + "id=" + id + + ", atBat=" + atBat + + ", hits=" + hits + + ", outs=" + outs + + ", average=" + getAverage() + + '}'; + } + + public void update(RecordType log) { + this.atBat++; + if (log == RecordType.HITS) { + this.hits++; + } + if (log == RecordType.OUT) { + this.outs++; + } + } +} diff --git a/BE/src/main/java/com/codesquad/coco/team/TeamService.java b/BE/src/main/java/com/codesquad/coco/team/TeamService.java new file mode 100644 index 000000000..ac849d701 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/team/TeamService.java @@ -0,0 +1,74 @@ +package com.codesquad.coco.team; + +import com.codesquad.coco.game.domain.DAO.GameDAO; +import com.codesquad.coco.game.domain.model.DTO.GamePlayDTO; +import com.codesquad.coco.game.domain.model.Game; +import com.codesquad.coco.player.domain.PlayerDAO; +import com.codesquad.coco.player.domain.UserType; +import com.codesquad.coco.team.domain.DTO.MainPageTeamDTO; +import com.codesquad.coco.team.domain.DTO.TeamChoiceDTO; +import com.codesquad.coco.team.domain.DTO.TeamDTO; +import com.codesquad.coco.team.domain.Team; +import com.codesquad.coco.team.domain.TeamDAO; +import org.springframework.stereotype.Service; + +@Service +public class TeamService { + + private final TeamDAO teamDAO; + private final GameDAO gameDAO; + private final PlayerDAO playerDAO; + + public TeamService(TeamDAO teamDAO, GameDAO gameDAO, PlayerDAO playerDAO) { + this.teamDAO = teamDAO; + this.gameDAO = gameDAO; + this.playerDAO = playerDAO; + } + + public MainPageTeamDTO findMainTeams() { + return teamDAO.findAllName(); + } + + public GamePlayDTO makeHomeGameDTO(TeamChoiceDTO choiceDTO) { + Team playerTeam = getPlayerTeam(choiceDTO); + Team opponentTeam = getOpponentTeam(choiceDTO); + Game game = new Game(opponentTeam, playerTeam, UserType.HOME); + + Long gameId = gameDAO.makeGame(game); + + TeamDTO homeTeam = findHomeTeamByGameId(gameId); + TeamDTO awayTeam = findAwayTeamByGameId(gameId); + return new GamePlayDTO(gameId, awayTeam, homeTeam); + } + + public GamePlayDTO makeAwayGameDTO(TeamChoiceDTO choiceDTO) { + Team playerTeam = getPlayerTeam(choiceDTO); + Team opponentTeam = getOpponentTeam(choiceDTO); + Game game = new Game(playerTeam, opponentTeam, UserType.AWAY); + + Long gameId = gameDAO.makeGame(game); + + TeamDTO homeTeam = findHomeTeamByGameId(gameId); + TeamDTO awayTeam = findAwayTeamByGameId(gameId); + + return new GamePlayDTO(gameId, awayTeam, homeTeam); + } + + private Team getPlayerTeam(TeamChoiceDTO choiceDTO) { + String teamName = choiceDTO.getUser(); + return new Team(teamName, playerDAO.findByTeamName(teamName)); + } + + private Team getOpponentTeam(TeamChoiceDTO choiceDTO) { + String teamName = choiceDTO.getOpponent(); + return new Team(teamName, playerDAO.findByTeamName(teamName)); + } + + public TeamDTO findHomeTeamByGameId(Long gameId) { + return teamDAO.findHomeTeamByGameId(gameId); + } + + public TeamDTO findAwayTeamByGameId(Long gameId) { + return teamDAO.findAwayTeamByGameId(gameId); + } +} diff --git a/BE/src/main/java/com/codesquad/coco/team/domain/DTO/MainPageTeamDTO.java b/BE/src/main/java/com/codesquad/coco/team/domain/DTO/MainPageTeamDTO.java new file mode 100644 index 000000000..62e05a734 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/team/domain/DTO/MainPageTeamDTO.java @@ -0,0 +1,18 @@ +package com.codesquad.coco.team.domain.DTO; + +import java.util.ArrayList; +import java.util.List; + +public class MainPageTeamDTO { + + private List teams = new ArrayList<>(); + + public void addTeamDTO(TeamNameDTO teamNameDTO) { + teams.add(teamNameDTO); + } + + public List getTeams() { + return teams; + } + +} diff --git a/BE/src/main/java/com/codesquad/coco/team/domain/DTO/TeamChoiceDTO.java b/BE/src/main/java/com/codesquad/coco/team/domain/DTO/TeamChoiceDTO.java new file mode 100644 index 000000000..f6ab9012a --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/team/domain/DTO/TeamChoiceDTO.java @@ -0,0 +1,20 @@ +package com.codesquad.coco.team.domain.DTO; + +public class TeamChoiceDTO { + + private String user; + private String opponent; + + public TeamChoiceDTO(String user, String opponent) { + this.user = user; + this.opponent = opponent; + } + + public String getUser() { + return user; + } + + public String getOpponent() { + return opponent; + } +} diff --git a/BE/src/main/java/com/codesquad/coco/team/domain/DTO/TeamDTO.java b/BE/src/main/java/com/codesquad/coco/team/domain/DTO/TeamDTO.java new file mode 100644 index 000000000..adfb9b9c3 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/team/domain/DTO/TeamDTO.java @@ -0,0 +1,24 @@ +package com.codesquad.coco.team.domain.DTO; + +import com.codesquad.coco.player.domain.model.DTO.PlayerDTO; + +import java.util.List; + +public class TeamDTO { + + private String teamName; + private List players; + + public TeamDTO(String teamName, List players) { + this.teamName = teamName; + this.players = players; + } + + public String getTeamName() { + return teamName; + } + + public List getPlayers() { + return players; + } +} diff --git a/BE/src/main/java/com/codesquad/coco/team/domain/DTO/TeamNameDTO.java b/BE/src/main/java/com/codesquad/coco/team/domain/DTO/TeamNameDTO.java new file mode 100644 index 000000000..2e03aae96 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/team/domain/DTO/TeamNameDTO.java @@ -0,0 +1,14 @@ +package com.codesquad.coco.team.domain.DTO; + +public class TeamNameDTO { + + private String name; + + public TeamNameDTO(String name) { + this.name = name; + } + + public String getName() { + return name; + } +} diff --git a/BE/src/main/java/com/codesquad/coco/team/domain/DTO/TeamPointDTO.java b/BE/src/main/java/com/codesquad/coco/team/domain/DTO/TeamPointDTO.java new file mode 100644 index 000000000..dbf7248cd --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/team/domain/DTO/TeamPointDTO.java @@ -0,0 +1,29 @@ +package com.codesquad.coco.team.domain.DTO; + +public class TeamPointDTO { + + private String teamName; + private int round; + private int point; + + public String getTeamName() { + return teamName; + } + + public int getRound() { + return round; + } + + public int getPoint() { + return point; + } + + @Override + public String toString() { + return "TeamPointDTO{" + + "teamName='" + teamName + '\'' + + ", round=" + round + + ", point=" + point + + '}'; + } +} diff --git a/BE/src/main/java/com/codesquad/coco/team/domain/DTO/TeamScoreDTO.java b/BE/src/main/java/com/codesquad/coco/team/domain/DTO/TeamScoreDTO.java new file mode 100644 index 000000000..c8c8dcce2 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/team/domain/DTO/TeamScoreDTO.java @@ -0,0 +1,21 @@ +package com.codesquad.coco.team.domain.DTO; + +import java.util.List; + +public class TeamScoreDTO { + private String teamName; + private List point; + + public TeamScoreDTO(String teamName, List point) { + this.teamName = teamName; + this.point = point; + } + + public String getTeamName() { + return teamName; + } + + public List getPoint() { + return point; + } +} diff --git a/BE/src/main/java/com/codesquad/coco/team/domain/Team.java b/BE/src/main/java/com/codesquad/coco/team/domain/Team.java new file mode 100644 index 000000000..685f85e54 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/team/domain/Team.java @@ -0,0 +1,35 @@ +package com.codesquad.coco.team.domain; + +import com.codesquad.coco.player.domain.model.Player; +import org.springframework.data.annotation.Id; + +import java.util.List; + +public class Team { + + @Id + private String name; + + private List players; + + public Team(String name, List players) { + this.name = name; + this.players = players; + } + + public String getName() { + return name; + } + + public List getPlayers() { + return players; + } + + @Override + public String toString() { + return "Team{" + + "name='" + name + '\'' + + ", players=" + players + + '}'; + } +} diff --git a/BE/src/main/java/com/codesquad/coco/team/domain/TeamDAO.java b/BE/src/main/java/com/codesquad/coco/team/domain/TeamDAO.java new file mode 100644 index 000000000..22d7663ac --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/team/domain/TeamDAO.java @@ -0,0 +1,49 @@ +package com.codesquad.coco.team.domain; + +import com.codesquad.coco.game.domain.DAO.GameDAO; +import com.codesquad.coco.player.domain.PlayerDAO; +import com.codesquad.coco.team.domain.DTO.MainPageTeamDTO; +import com.codesquad.coco.team.domain.DTO.TeamDTO; +import com.codesquad.coco.team.domain.DTO.TeamNameDTO; +import com.codesquad.coco.utils.DTOConverter; +import com.codesquad.coco.utils.mapper.TeamNameMapper; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Component; + +import java.util.List; + +import static com.codesquad.coco.utils.BASEBALL_SQLKt.FIND_ALL_TEAM_NAME; + +@Component +public class TeamDAO { + + private NamedParameterJdbcTemplate template; + private PlayerDAO playerDAO; + private GameDAO gameDAO; + private TeamNameMapper mapper = new TeamNameMapper(); + + public TeamDAO(NamedParameterJdbcTemplate template, PlayerDAO playerDAO, GameDAO gameDAO) { + this.template = template; + this.playerDAO = playerDAO; + this.gameDAO = gameDAO; + } + + public MainPageTeamDTO findAllName() { + MainPageTeamDTO mainPageTeamDTO = new MainPageTeamDTO(); + List query = template.query(FIND_ALL_TEAM_NAME, mapper); + query.forEach(mainPageTeamDTO::addTeamDTO); + return mainPageTeamDTO; + } + + public TeamDTO findHomeTeamByGameId(Long gameId) { + String teamName = gameDAO.findHomeTeamNameByGameId(gameId); + Team homeTeam = new Team(teamName, playerDAO.findByTeamName(teamName)); + return DTOConverter.teamToDTO(homeTeam); + } + + public TeamDTO findAwayTeamByGameId(Long gameId) { + String teamName = gameDAO.findAwayTeamNameByGameId(gameId); + Team awayTeam = new Team(teamName, playerDAO.findByTeamName(teamName)); + return DTOConverter.teamToDTO(awayTeam); + } +} diff --git a/BE/src/main/java/com/codesquad/coco/team/domain/TeamRepository.java b/BE/src/main/java/com/codesquad/coco/team/domain/TeamRepository.java new file mode 100644 index 000000000..e51f66f92 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/team/domain/TeamRepository.java @@ -0,0 +1,10 @@ +package com.codesquad.coco.team.domain; + +import org.springframework.data.repository.CrudRepository; + +import java.util.Optional; + +public interface TeamRepository extends CrudRepository { + + Optional findTeamByName(String name); +} diff --git a/BE/src/main/java/com/codesquad/coco/user/UserController.java b/BE/src/main/java/com/codesquad/coco/user/UserController.java new file mode 100644 index 000000000..b9aeefc61 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/user/UserController.java @@ -0,0 +1,78 @@ +package com.codesquad.coco.user; + +import com.codesquad.coco.utils.FindSecretServerKey; +import com.codesquad.coco.utils.SecretServerKey; +import com.gitoauth.coco.JWT.JWTUtils; +import com.gitoauth.coco.oauth.AccessToken; +import com.gitoauth.coco.oauth.Oauth; +import com.gitoauth.coco.oauth.UserInfoDTO; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Base64; + +import static com.codesquad.coco.utils.GitURI.*; + +@RestController +public class UserController { + + private UserService userService; + private SecretServerKey secretServerKey = FindSecretServerKey.find(); + private String key = Base64.getEncoder().encodeToString(secretServerKey.serverSecretToByteArray()); + private Oauth oauth = new Oauth(secretServerKey.getClientId(), + secretServerKey.getClientSecret(), + REDIRECT_URI.getUri(), + ACCESS_TOKEN_URI.getUri(), + AUTHORIZE_URI.getUri(), + USER_INFO_URI.getUri() + ); + + public UserController(UserService userService) { + this.userService = userService; + } + + @GetMapping("/login") + @ResponseStatus(HttpStatus.OK) + public void login(HttpServletRequest request, HttpServletResponse response) throws IOException { + String jwt = request.getHeader("Authorization"); + if (jwt != null) { + JWTUtils.validateJWT(jwt, key); + return; + } + oauth.requestCode(response); + } + + @GetMapping("/login/github") + @ResponseStatus(HttpStatus.OK) + public void requestResourceServer(@RequestParam("code") String code, HttpServletResponse response) { + AccessToken accessToken = oauth.requestAccessToken(code); + UserInfoDTO userInfoDTO = oauth.requestUserInfo(accessToken); + + userService.insertUser(userInfoDTO, accessToken); + + String jwt = JWTUtils.createJWTTypeBearer(userInfoDTO.getId(), key); + + response.setHeader("Authorization", jwt); + + return; + } + + + @GetMapping("/login/refresh") + @ResponseStatus(HttpStatus.OK) + public void tokenRefresh(HttpServletRequest request) { + String jwt = request.getHeader("Authorization"); + Long githubId = Long.parseLong(String.valueOf(JWTUtils.getInfoFromJWT(jwt, key, "id"))); + String refreshToken = userService.findRefreshTokenByGithubId(githubId); + + AccessToken accessToken = oauth.requestRefreshToken(refreshToken); + + userService.updateTokenByGithubId(accessToken, githubId); + } +} diff --git a/BE/src/main/java/com/codesquad/coco/user/UserService.java b/BE/src/main/java/com/codesquad/coco/user/UserService.java new file mode 100644 index 000000000..43a3abffa --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/user/UserService.java @@ -0,0 +1,51 @@ +package com.codesquad.coco.user; + +import com.codesquad.coco.user.domain.User; +import com.codesquad.coco.user.domain.UserDao; +import com.gitoauth.coco.oauth.AccessToken; +import com.gitoauth.coco.oauth.UserInfoDTO; +import org.springframework.stereotype.Service; + +@Service +public class UserService { + + private UserDao userDao; + + public UserService(UserDao userDao) { + this.userDao = userDao; + } + + public void insertUser(UserInfoDTO userInfoDTO, AccessToken accessToken) { + User user = new User.Builder() + .htmlUrl(userInfoDTO.getHtmlUrl()) + .refreshToken(accessToken.getRefreshToken()) + .accessToken(accessToken.getAccessToken()) + .followers(userInfoDTO.getFollowers()) + .following(userInfoDTO.getFollowing()) + .githubId(userInfoDTO.getId()) + .location(userInfoDTO.getLocation()) + .login(userInfoDTO.getLogin()) + .builder(); + if (userDao.checkNewUser(userInfoDTO.getId())) { + createUser(user); + return; + } + updateUser(user); + } + + private void updateUser(User user) { + userDao.updateUser(user); + } + + public void createUser(User user) { + userDao.createUser(user); + } + + public String findRefreshTokenByGithubId(Long githubId) { + return userDao.findRefreshTokenByGithubId(githubId); + } + + public void updateTokenByGithubId(AccessToken accessToken, Long githubId) { + userDao.updateTokenByGithubId(accessToken.getAccessToken(), accessToken.getRefreshToken(), githubId); + } +} diff --git a/BE/src/main/java/com/codesquad/coco/user/domain/User.java b/BE/src/main/java/com/codesquad/coco/user/domain/User.java new file mode 100644 index 000000000..ebf66f111 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/user/domain/User.java @@ -0,0 +1,129 @@ +package com.codesquad.coco.user.domain; + +import org.springframework.data.annotation.Id; + +public class User { + + @Id + private Long id; + + private Long githubId; + private String login; + private String htmlUrl; + private String location; + private int followers; + private int following; + private String accessToken; + private String refreshToken; + + private User(Long githubId, String login, String htmlUrl, String location, + int followers, int following, String accessToken, String refreshToken) { + this.id = id; + this.githubId = githubId; + this.login = login; + this.htmlUrl = htmlUrl; + this.location = location; + this.followers = followers; + this.following = following; + this.accessToken = accessToken; + this.refreshToken = refreshToken; + } + + public Long getId() { + return id; + } + + public Long getGithubId() { + return githubId; + } + + public String getLogin() { + return login; + } + + public String getHtmlUrl() { + return htmlUrl; + } + + public String getLocation() { + return location; + } + + public int getFollowers() { + return followers; + } + + public int getFollowing() { + return following; + } + + public String getAccessToken() { + return accessToken; + } + + public String getRefreshToken() { + return refreshToken; + } + + public static class Builder { + private Long id; + private Long githubId; + private String login; + private String htmlUrl; + private String location; + private int followers; + private int following; + private String accessToken; + private String refreshToken; + + public Builder id(Long val) { + id = val; + return this; + } + + public Builder githubId(Long val) { + githubId = val; + return this; + } + + public Builder login(String val) { + login = val; + return this; + } + + public Builder htmlUrl(String val) { + htmlUrl = val; + return this; + } + + public Builder location(String val) { + location = val; + return this; + } + + public Builder followers(int val) { + followers = val; + return this; + } + + public Builder following(int val) { + following = val; + return this; + } + + public Builder accessToken(String val) { + accessToken = val; + return this; + } + + public Builder refreshToken(String val) { + refreshToken = val; + return this; + } + + public User builder() { + return new User(githubId, login, htmlUrl, location, followers, following, accessToken, refreshToken); + } + + } +} diff --git a/BE/src/main/java/com/codesquad/coco/user/domain/UserDao.java b/BE/src/main/java/com/codesquad/coco/user/domain/UserDao.java new file mode 100644 index 000000000..5c9693ee9 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/user/domain/UserDao.java @@ -0,0 +1,78 @@ +package com.codesquad.coco.user.domain; + +import com.codesquad.coco.utils.mapper.UserCountMapper; +import com.codesquad.coco.utils.mapper.UserMapper; +import com.codesquad.coco.utils.mapper.UserRefreshTokenMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.stereotype.Component; + +import static com.codesquad.coco.utils.USER_SQLKt.*; + +@Component +public class UserDao { + + private NamedParameterJdbcTemplate template; + private UserMapper userMapper = new UserMapper(); + private UserCountMapper countMapper = new UserCountMapper(); + private UserRefreshTokenMapper tokenMapper = new UserRefreshTokenMapper(); + + public UserDao(NamedParameterJdbcTemplate template) { + this.template = template; + } + + public User findByGitHubId(Long id) { + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("github_id", id); + + User user = template.queryForObject(FIND_USER_BY_GITHUB_ID, parameter, userMapper); + return user; + } + + public boolean checkNewUser(Long id) { + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("github_id", id); + + Integer count = template.queryForObject(CHEK_NEW_USER_BY_GITHUB_ID, parameter, countMapper); + return count == 0; + } + + public void createUser(User user) { + insertData(CREATE_USER, user); + } + + public void updateUser(User user) { + insertData(UPDATE_USER, user); + } + + private void insertData(String SQL, User user) { + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("github_id", user.getGithubId()); + parameter.addValue("login", user.getLogin()); + parameter.addValue("html_url", user.getHtmlUrl()); + parameter.addValue("location", user.getLocation()); + parameter.addValue("followers", user.getFollowers()); + parameter.addValue("following", user.getFollowing()); + parameter.addValue("access_token", user.getAccessToken()); + parameter.addValue("refresh_token", user.getRefreshToken()); + + template.update(SQL, parameter); + } + + public String findRefreshTokenByGithubId(Long githubId) { + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("github_id", githubId); + + return template.queryForObject(FIND_REFRESH_TOKEN_BY_GITHUB_ID, parameter, tokenMapper); + + } + + public void updateTokenByGithubId(String accessToken, String refreshToken, Long githubId) { + MapSqlParameterSource parameter = new MapSqlParameterSource(); + parameter.addValue("github_id", githubId); + parameter.addValue("access_token", accessToken); + parameter.addValue("refresh_token", refreshToken); + + template.update(UPDATE_TOKEN_BY_GITHUB_ID, parameter); + } +} diff --git a/BE/src/main/java/com/codesquad/coco/utils/BASEBALL_SQL.kt b/BE/src/main/java/com/codesquad/coco/utils/BASEBALL_SQL.kt new file mode 100644 index 000000000..a67024ea0 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/utils/BASEBALL_SQL.kt @@ -0,0 +1,74 @@ +package com.codesquad.coco.utils; + +const val GAME_SAVE_SQL: String = """ +insert into game (home,away,user_type) +values (:home,:away,:user_type); +""" + +const val FIND_USER_TEAM_NAME_SQL: String = """ +select if(g.user_type = 'home',g.home,g.away) as team_name +from game g where g.id = :id; +""" + +const val FIND_ALL_INNINGS_SQL: String = """ +select i.id, i.score, i.score_board +from innings i +where i.score_board =:id order by score_board_key; +""" + +const val SCORE_BOARD_SAVE_SQL: String = """ +insert into score_board (game,team) +values (:game, :team); +""" + +const val FIND_SCORE_BOARD_SQL: String = """ +select s.id, s.game,s.team +from score_board s +where s.game =:id and s.team = :teamName; +""" + +const val FIND_SCORE_BOARDS_SQL: String = """ +select s.id, s.game,s.team +from score_board s +where s.game = :id; +""" + +const val INNINGS_SAVE_SQL: String = """ +insert into innings (score_board, score, score_board_key) +values (:score_board,:score,:score_board_key); +""" + +const val FIND_PLAYER_BY_TEAM_NAME: String = """ +SELECT p.id as pid, p.type, p.name, r.id as rid, r.outs, r.hits, r.at_bat +FROM player p +inner JOIN record r ON r.player = p.id +WHERE p.team = :teamName order by p.id; +""" + +const val FIND_PLAYER_BY_PLAYER_ID: String = """ +select p.id as pid, p.name, p.type, r.id as rid, r.outs, r.hits, r.at_bat +from player p +inner JOIN record r ON r.player = p.id +where p.id= :id; +""" + +const val UPDATE_PLAYER_RECORD: String = """ +update record set at_bat = :atBat, hits = :hits, outs = :outs +where id = :id; +""" + +const val FIND_ALL_TEAM_NAME: String = """ +select t.name +from team t +""" + +const val FIND_HOME_TEAM_NAME_BY_GAME_ID: String = """ +select g.home as team_name +from game g where g.id = :id; +""" + +const val FIND_AWAY_TEAM_NAME_BY_GAME_ID: String = """ +select g.away as team_name +from game g where g.id = :id; +""" + diff --git a/BE/src/main/java/com/codesquad/coco/utils/DTOConverter.java b/BE/src/main/java/com/codesquad/coco/utils/DTOConverter.java new file mode 100644 index 000000000..ceb38fe27 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/utils/DTOConverter.java @@ -0,0 +1,33 @@ +package com.codesquad.coco.utils; + +import com.codesquad.coco.game.domain.model.Innings; +import com.codesquad.coco.game.domain.model.ScoreBoard; +import com.codesquad.coco.player.domain.model.DTO.PlayerDTO; +import com.codesquad.coco.team.domain.DTO.TeamDTO; +import com.codesquad.coco.team.domain.DTO.TeamScoreDTO; +import com.codesquad.coco.team.domain.Team; + +import java.util.List; +import java.util.stream.Collectors; + +public class DTOConverter { + + public static TeamDTO teamToDTO(Team team) { + List opponentPlayerDTO = team.getPlayers().stream() + .map(player -> new PlayerDTO(player.getId(), player.getName(), + player.getType(), + player.getRecord().getAtBat(), + player.getRecord().getHits(), + player.getRecord().getOuts(), + player.getRecord().getAverage())) + .collect(Collectors.toList()); + return new TeamDTO(team.getName(), opponentPlayerDTO); + } + + public static TeamScoreDTO scoreToTeamScoreDTO(ScoreBoard board) { + List scores = board.getInnings().stream() + .map(Innings::getScore) + .collect(Collectors.toList()); + return new TeamScoreDTO(board.teamName(), scores); + } +} diff --git a/BE/src/main/java/com/codesquad/coco/utils/FindSecretServerKey.java b/BE/src/main/java/com/codesquad/coco/utils/FindSecretServerKey.java new file mode 100644 index 000000000..4bd2a06a9 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/utils/FindSecretServerKey.java @@ -0,0 +1,20 @@ +package com.codesquad.coco.utils; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; +import java.io.InputStream; + +public class FindSecretServerKey { + + public static SecretServerKey find() { + try { + InputStream inputStream = FindSecretServerKey.class.getResourceAsStream("/server.secret.json"); + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.readValue(inputStream, SecretServerKey.class); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/BE/src/main/java/com/codesquad/coco/utils/GitURI.java b/BE/src/main/java/com/codesquad/coco/utils/GitURI.java new file mode 100644 index 000000000..38b480164 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/utils/GitURI.java @@ -0,0 +1,19 @@ +package com.codesquad.coco.utils; + +public enum GitURI { + + REDIRECT_URI("http://ec2-52-78-180-217.ap-northeast-2.compute.amazonaws.com/login/github"), + ACCESS_TOKEN_URI("https://github.com/login/oauth/access_token"), + AUTHORIZE_URI("https://github.com/login/oauth/authorize"), + USER_INFO_URI("https://api.github.com/user"); + + private String uri; + + GitURI(String uri) { + this.uri = uri; + } + + public String getUri() { + return uri; + } +} diff --git a/BE/src/main/java/com/codesquad/coco/utils/SecretServerKey.java b/BE/src/main/java/com/codesquad/coco/utils/SecretServerKey.java new file mode 100644 index 000000000..3da32898b --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/utils/SecretServerKey.java @@ -0,0 +1,26 @@ +package com.codesquad.coco.utils; + +import java.nio.charset.StandardCharsets; + +public class SecretServerKey { + + private String clientId; + private String clientSecret; + private String serverSecret; + + public String getClientId() { + return clientId; + } + + public String getClientSecret() { + return clientSecret; + } + + public String getServerSecret() { + return serverSecret; + } + + public byte[] serverSecretToByteArray() { + return serverSecret.getBytes(StandardCharsets.UTF_8); + } +} diff --git a/BE/src/main/java/com/codesquad/coco/utils/USER_SQL.kt b/BE/src/main/java/com/codesquad/coco/utils/USER_SQL.kt new file mode 100644 index 000000000..d33af162b --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/utils/USER_SQL.kt @@ -0,0 +1,43 @@ +package com.codesquad.coco.utils; + +const val FIND_USER_BY_GITHUB_ID: String = """ +select u.id,u.github_id,u.login,u.html_url,u.location,u.followers,u.following,u.access_token,u.refresh_token +from users.u +where github_id = :github_id; +""" + + +const val CHEK_NEW_USER_BY_GITHUB_ID: String = """ +select count(*) as count +from users u +where u.github_id = :github_id; +""" + +const val CREATE_USER: String = """ +insert into users (github_id,login,html_url,location,followers,following,access_token,refresh_token) +values (:github_id,:login,:html_url,:location,:followers,:following,:access_token,:refresh_token) +""" + +const val UPDATE_USER: String = """ +update users set +login = :login,html_url = :html_url,location = :location ,followers = :followers,following = :following,access_token = :access_token,refresh_token = :refresh_token +where github_id = :github_id +""" + +const val FIND_REFRESH_TOKEN_BY_GITHUB_ID: String = """ +select u.refresh_token +from users u +where u.github_id = :github_id; +""" + +const val UPDATE_TOKEN_BY_GITHUB_ID: String = """ +update users +set refresh_token = :refresh_token, access_token = :access_token +where github_id = :github_id +""" + + + + + + diff --git a/BE/src/main/java/com/codesquad/coco/utils/mapper/HomeAwayTeamNameMapper.java b/BE/src/main/java/com/codesquad/coco/utils/mapper/HomeAwayTeamNameMapper.java new file mode 100644 index 000000000..a7286c439 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/utils/mapper/HomeAwayTeamNameMapper.java @@ -0,0 +1,14 @@ +package com.codesquad.coco.utils.mapper; + +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + + +public class HomeAwayTeamNameMapper implements RowMapper { + @Override + public String mapRow(ResultSet rs, int rowNum) throws SQLException { + return rs.getString("team_name"); + } +} diff --git a/BE/src/main/java/com/codesquad/coco/utils/mapper/InningsMapper.java b/BE/src/main/java/com/codesquad/coco/utils/mapper/InningsMapper.java new file mode 100644 index 000000000..b4d95ff7d --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/utils/mapper/InningsMapper.java @@ -0,0 +1,17 @@ +package com.codesquad.coco.utils.mapper; + +import com.codesquad.coco.game.domain.model.Innings; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class InningsMapper implements RowMapper { + @Override + public Innings mapRow(ResultSet rs, int rowNum) throws SQLException { + return new Innings( + rs.getLong("id"), + rs.getLong("score_board"), + rs.getInt("score")); + } +} diff --git a/BE/src/main/java/com/codesquad/coco/utils/mapper/PlayerMapper.java b/BE/src/main/java/com/codesquad/coco/utils/mapper/PlayerMapper.java new file mode 100644 index 000000000..6b401ad55 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/utils/mapper/PlayerMapper.java @@ -0,0 +1,26 @@ +package com.codesquad.coco.utils.mapper; + +import com.codesquad.coco.player.domain.model.Player; +import com.codesquad.coco.player.domain.model.Record; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class PlayerMapper implements RowMapper { + @Override + public Player mapRow(ResultSet rs, int rowNum) throws SQLException { + Record record = new Record( + rs.getLong("rid"), + rs.getInt("at_bat"), + rs.getInt("hits"), + rs.getInt("outs") + ); + return new Player( + rs.getLong("pid"), + rs.getString("name"), + rs.getString("type"), + record + ); + } +} diff --git a/BE/src/main/java/com/codesquad/coco/utils/mapper/ScoreBoardMapper.java b/BE/src/main/java/com/codesquad/coco/utils/mapper/ScoreBoardMapper.java new file mode 100644 index 000000000..94beb15d5 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/utils/mapper/ScoreBoardMapper.java @@ -0,0 +1,18 @@ +package com.codesquad.coco.utils.mapper; + +import com.codesquad.coco.game.domain.model.ScoreBoard; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class ScoreBoardMapper implements RowMapper { + @Override + public ScoreBoard mapRow(ResultSet rs, int rowNum) throws SQLException { + return new ScoreBoard.Builder() + .id(rs.getLong("id")) + .game(rs.getLong("game")) + .team(rs.getString("team")) + .build(); + } +} diff --git a/BE/src/main/java/com/codesquad/coco/utils/mapper/TeamNameMapper.java b/BE/src/main/java/com/codesquad/coco/utils/mapper/TeamNameMapper.java new file mode 100644 index 000000000..bedd50141 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/utils/mapper/TeamNameMapper.java @@ -0,0 +1,14 @@ +package com.codesquad.coco.utils.mapper; + +import com.codesquad.coco.team.domain.DTO.TeamNameDTO; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class TeamNameMapper implements RowMapper { + @Override + public TeamNameDTO mapRow(ResultSet rs, int rowNum) throws SQLException { + return new TeamNameDTO(rs.getString("name")); + } +} diff --git a/BE/src/main/java/com/codesquad/coco/utils/mapper/UserCountMapper.java b/BE/src/main/java/com/codesquad/coco/utils/mapper/UserCountMapper.java new file mode 100644 index 000000000..22d7d7b5b --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/utils/mapper/UserCountMapper.java @@ -0,0 +1,13 @@ +package com.codesquad.coco.utils.mapper; + +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class UserCountMapper implements RowMapper { + @Override + public Integer mapRow(ResultSet rs, int rowNum) throws SQLException { + return rs.getInt("count"); + } +} diff --git a/BE/src/main/java/com/codesquad/coco/utils/mapper/UserMapper.java b/BE/src/main/java/com/codesquad/coco/utils/mapper/UserMapper.java new file mode 100644 index 000000000..a1e1b666f --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/utils/mapper/UserMapper.java @@ -0,0 +1,25 @@ +package com.codesquad.coco.utils.mapper; + +import com.codesquad.coco.user.domain.User; +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class UserMapper implements RowMapper { + + @Override + public User mapRow(ResultSet rs, int rowNum) throws SQLException { + return new User.Builder() + .id(rs.getLong("id")) + .githubId(rs.getLong("github_id")) + .login(rs.getString("login")) + .htmlUrl(rs.getString("html_url")) + .location(rs.getString("location")) + .followers(rs.getInt("followers")) + .following(rs.getInt("following")) + .accessToken(rs.getString("access_token")) + .refreshToken(rs.getString("refresh_token")) + .builder(); + } +} diff --git a/BE/src/main/java/com/codesquad/coco/utils/mapper/UserRefreshTokenMapper.java b/BE/src/main/java/com/codesquad/coco/utils/mapper/UserRefreshTokenMapper.java new file mode 100644 index 000000000..2532f4a40 --- /dev/null +++ b/BE/src/main/java/com/codesquad/coco/utils/mapper/UserRefreshTokenMapper.java @@ -0,0 +1,13 @@ +package com.codesquad.coco.utils.mapper; + +import org.springframework.jdbc.core.RowMapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +public class UserRefreshTokenMapper implements RowMapper { + @Override + public String mapRow(ResultSet rs, int rowNum) throws SQLException { + return rs.getString("refresh_token"); + } +} diff --git a/BE/src/main/resources/data.sql b/BE/src/main/resources/data.sql new file mode 100644 index 000000000..d6fad02c2 --- /dev/null +++ b/BE/src/main/resources/data.sql @@ -0,0 +1,165 @@ +use +BASEBALL; + +INSERT INTO team + (name) +VALUES ('두산 베어스'), + ('SSG 랜더스'), + ('기아 타이거즈'), + ('키움 히어로즈'), + ('한화 이글스'), + ('롯데 자이언츠'); + + + +INSERT INTO player + (name, team, type) +VALUES +-- 두산 베어스 +('허경민', '두산 베어스', '투수'), +('오재원', '두산 베어스', '타자'), +('페르난데스', '두산 베어스', '타자'), +('박건우', '두산 베어스', '타자'), +('조수행', '두산 베어스', '타자'), +('김재환', '두산 베어스', '타자'), +('안권수', '두산 베어스', '타자'), +('권민석', '두산 베어스', '타자'), +('유희관', '두산 베어스', '타자'), +-- SSG 랜더스 +('최정', 'SSG 랜더스', '투수'), +('추신수', 'SSG 랜더스', '타자'), +('김성현', 'SSG 랜더스', '타자'), +('로맥', 'SSG 랜더스', '타자'), +('오태곤', 'SSG 랜더스', '타자'), +('정의윤', 'SSG 랜더스', '타자'), +('김강민', 'SSG 랜더스', '타자'), +('이재원', 'SSG 랜더스', '타자'), +('김광현', 'SSG 랜더스', '타자'), +-- 기아 타이거즈 +('나지완', '기아 타이거즈', '투수'), +('최형우', '기아 타이거즈', '타자'), +('김선빈', '기아 타이거즈', '타자'), +('터커', '기아 타이거즈', '타자'), +('이우성', '기아 타이거즈', '타자'), +('김민식', '기아 타이거즈', '타자'), +('나주환', '기아 타이거즈', '타자'), +('한승택', '기아 타이거즈', '타자'), +('멩덴', '기아 타이거즈', '타자'), +-- 키움 히어로즈 +('이정후', '키움 히어로즈', '투수'), +('박병호', '키움 히어로즈', '타자'), +('이용규', '키움 히어로즈', '타자'), +('허정협', '키움 히어로즈', '타자'), +('김혜성', '키움 히어로즈', '타자'), +('서건창', '키움 히어로즈', '타자'), +('신준우', '키움 히어로즈', '타자'), +('프레이타', '키움 히어로즈', '타자'), +('최원태', '키움 히어로즈', '타자'), +-- 한화 이글스 +('정은원', '한화 이글스', '투수'), +('노수광', '한화 이글스', '타자'), +('하주석', '한화 이글스', '타자'), +('힐리', '한화 이글스', '타자'), +('이성열', '한화 이글스', '타자'), +('정진호', '한화 이글스', '타자'), +('장운호', '한화 이글스', '타자'), +('임종찬', '한화 이글스', '타자'), +('김민우', '한화 이글스', '타자'), +-- 롯데 자이언츠 +('정훈', '롯데 자이언츠', '투수'), +('손아섭', '롯데 자이언츠', '타자'), +('전준우', '롯데 자이언츠', '타자'), +('이대호', '롯데 자이언츠', '타자'), +('마차도', '롯데 자이언츠', '타자'), +('오윤석', '롯데 자이언츠', '타자'), +('이병규', '롯데 자이언츠', '타자'), +('김준태', '롯데 자이언츠', '타자'), +('노경은', '롯데 자이언츠', '타자'); + + + +INSERT INTO record + (id, player, at_bat, hits, outs) +VALUES +-- 두산 베어스 +(1, 1, 2, 1, 1), +(2, 2, 2, 2, 0), +(3, 3, 2, 0, 2), +(4, 4, 2, 3, 2), +(5, 5, 2, 0, 2), +(6, 6, 2, 1, 1), +(7, 7, 2, 2, 2), +(8, 8, 2, 1, 1), +(9, 9, 2, 0, 0), +-- ssg 랜더스 +(10, 10, 2, 2, 2), +(11, 11, 2, 1, 1), +(12, 12, 2, 0, 2), +(13, 13, 2, 2, 2), +(14, 14, 2, 0, 2), +(15, 15, 2, 1, 1), +(16, 16, 2, 0, 2), +(17, 17, 2, 1, 1), +(18, 18, 2, 1, 1), +-- 기아 타이거즈 +(19, 19, 2, 1, 1), +(20, 20, 2, 0, 2), +(21, 21, 2, 1, 1), +(22, 22, 2, 2, 2), +(23, 23, 2, 0, 2), +(24, 24, 2, 1, 1), +(25, 25, 2, 2, 2), +(26, 26, 2, 0, 2), +(27, 27, 2, 1, 1), +-- 키움 히어로즈 +(28, 28, 2, 0, 2), +(29, 29, 2, 1, 1), +(30, 30, 2, 2, 2), +(31, 31, 2, 2, 2), +(32, 32, 2, 1, 1), +(33, 33, 2, 2, 2), +(34, 34, 2, 2, 2), +(35, 35, 2, 1, 1), +(36, 36, 2, 2, 2), +-- 한화 이글스 +(37, 37, 2, 0, 2), +(38, 38, 2, 2, 2), +(39, 39, 2, 2, 2), +(40, 40, 2, 0, 2), +(41, 41, 2, 2, 2), +(42, 42, 2, 2, 2), +(43, 43, 2, 1, 1), +(44, 44, 2, 2, 2), +(45, 45, 2, 2, 2), +-- 롯데 자이언츠 +(46, 46, 2, 2, 2), +(47, 47, 2, 0, 2), +(48, 48, 2, 2, 2), +(49, 49, 2, 2, 2), +(50, 50, 2, 2, 2), +(51, 51, 2, 2, 2), +(52, 52, 2, 1, 1), +(53, 53, 2, 0, 2), +(54, 54, 2, 2, 2); + + +insert into game(id, home, away, user_type) +values (1, '두산 베어스', 'SSG 랜더스', 'HOME'); + +insert into score_board(id, game, team) +values (1, 1, '두산 베어스'); + +insert into score_board(id, game, team) +values (2, 1, 'SSG 랜더스'); + +insert into innings (id, score, score_board, score_board_key) +values (1, 0, 1, 1), + (2, 2, 1, 2), + (3, 1, 1, 3); + +insert into innings (id, score, score_board, score_board_key) +values (4, 2, 2, 1), + (5, 0, 2, 2), + (6, 0, 2, 3); + + diff --git a/BE/src/main/resources/schema.sql b/BE/src/main/resources/schema.sql new file mode 100644 index 000000000..1d59af83f --- /dev/null +++ b/BE/src/main/resources/schema.sql @@ -0,0 +1,70 @@ +use +BASEBALL; + +drop table if exists team; +drop table if exists player; +drop table if exists record; +drop table if exists game; +drop table if exists score_board; +drop table if exists innings; +drop table if exists users; + +create table team +( + name varchar(20) primary key not null +); + +create table player +( + id BIGINT auto_increment primary key, + name varchar(20) not null, + type varchar(20) not null, + team varchar(20) references team (name) +); + +create table record +( + id BIGINT auto_increment primary key, + at_bat int not null, + hits int not null, + outs int not null, + + player BIGINT references player (id) +); + +create table game +( + id BIGINT auto_increment primary key, + user_type varchar(20) not null, + home varchar(20) references team (name), + away varchar(20) references team (name) +); + +create table score_board +( + id BIGINT auto_increment primary key, + game BIGINT references game (id), + team varchar(20) references team (name) +); + +create table innings +( + id BIGINT auto_increment primary key, + score int not null, + score_board BIGINT references score_board (id), + score_board_key int +); + +create table users +( + id BIGINT auto_increment primary key, + github_id varchar(64) not null, + login varchar(64) not null, + html_url varchar(64) not null, + location varchar(64) not null, + followers int not null, + following int not null, + access_token varchar(200), + refresh_token varchar(200) +); + diff --git a/README.md b/README.md index 029ce7391..4fdcfbe6e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,32 @@ -# baseball -그룹프로젝트 #3 + + +# **CPR** 페이지에 오신걸 환영합니다!!!!! + +## 맴버 + +| CPR Position | Name | Comment | +| :-: | :--: | :-----: | +| **BE** | [coco](https://github.com/ChoiGiSung) | | +| **FE** | [pengdori](https://github.com/dudn1933) | | +| **FE** | [Rano](https://github.com/17-sss) | | + +## CPR WIKI 😀 +- [CPR : WIKI](https://github.com/ChoiGiSung/baseball/wiki) +- [CPR : 협업룰](https://github.com/ChoiGiSung/baseball/wiki/CPR-협업룰) +- [CPR : API 설계 (1주차)](https://github.com/ChoiGiSung/baseball/wiki/baseball-API-설계) + +### Current Page (1주차) +![녹화_2021_05_07_16_42_51_966](https://user-images.githubusercontent.com/33610315/117416308-3074b280-af54-11eb-95bb-12a98737040a.gif)