From 57b46bca9fd895883ccd66d56dd66a174dde8a20 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 12 Oct 2023 20:11:42 +0900 Subject: [PATCH 001/101] Initial Commit --- .gitignore | 37 +++ build.gradle | 25 ++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 63721 bytes gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 249 ++++++++++++++++++ gradlew.bat | 92 +++++++ settings.gradle | 1 + .../VoucherManagementApplication.java | 13 + src/main/resources/application.properties | 1 + .../VoucherManagementApplicationTests.java | 13 + 10 files changed, 438 insertions(+) create mode 100644 .gitignore create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/main/java/org/prgrms/vouchermanagement/VoucherManagementApplication.java create mode 100644 src/main/resources/application.properties create mode 100644 src/test/java/org/prgrms/vouchermanagement/VoucherManagementApplicationTests.java diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..c2065bc262 --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +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/ diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000000..e185923415 --- /dev/null +++ b/build.gradle @@ -0,0 +1,25 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '3.1.4' + id 'io.spring.dependency-management' version '1.1.3' +} + +group = 'org.prgrms' +version = '0.0.1-SNAPSHOT' + +java { + sourceCompatibility = '17' +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter' + testImplementation 'org.springframework.boot:spring-boot-starter-test' +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7f93135c49b765f8051ef9d0a6055ff8e46073d8 GIT binary patch literal 63721 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鯊%1Et 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⁢ zv5o9#E7!G0XmdzfsS{efPNi`1b44~SZ4Z8fuX!I}#8g+(wxzQwUT#Xb2(tbY1+EUhGKoT@KEU9Ktl>_0 z%bjDJg;#*gtJZv!-Zs`?^}v5eKmnbjqlvnSzE@_SP|LG_PJ6CYU+6zY6>92%E+ z=j@TZf-iW4(%U{lnYxQA;7Q!b;^brF8n0D>)`q5>|WDDXLrqYU_tKN2>=#@~OE7grMnNh?UOz-O~6 z6%rHy{#h9K0AT+lDC7q4{hw^|q6*Ry;;L%Q@)Ga}$60_q%D)rv(CtS$CQbpq9|y1e zRSrN4;$Jyl{m5bZw`$8TGvb}(LpY{-cQ)fcyJv7l3S52TLXVDsphtv&aPuDk1OzCA z4A^QtC(!11`IsNx_HnSy?>EKpHJWT^wmS~hc^p^zIIh@9f6U@I2 zC=Mve{j2^)mS#U$e{@Q?SO6%LDsXz@SY+=cK_QMmXBIU)j!$ajc-zLx3V60EXJ!qC zi<%2x8Q24YN+&8U@CIlN zrZkcT9yh%LrlGS9`G)KdP(@9Eo-AQz@8GEFWcb7U=a0H^ZVbLmz{+&M7W(nXJ4sN8 zJLR7eeK(K8`2-}j(T7JsO`L!+CvbueT%izanm-^A1Dn{`1Nw`9P?cq;7no+XfC`K(GO9?O^5zNIt4M+M8LM0=7Gz8UA@Z0N+lg+cX)NfazRu z5D)~HA^(u%w^cz+@2@_#S|u>GpB+j4KzQ^&Wcl9f z&hG#bCA(Yk0D&t&aJE^xME^&E-&xGHhXn%}psEIj641H+Nl-}boj;)Zt*t(4wZ5DN z@GXF$bL=&pBq-#vkTkh>7hl%K5|3 z{`Vn9b$iR-SoGENp}bn4;fR3>9sA%X2@1L3aE9yTra;Wb#_`xWwLSLdfu+PAu+o3| zGVnpzPr=ch{uuoHjtw7+_!L_2;knQ!DuDl0R`|%jr+}jFzXtrHIKc323?JO{l&;VF z*L1+}JU7%QJOg|5|Tc|D8fN zJORAg=_vsy{ak|o);@)Yh8Lkcg@$FG3k@ep36BRa^>~UmnRPziS>Z=`Jb2x*Q#`%A zU*i3&Vg?TluO@X0O;r2Jl6LKLUOVhSqg1*qOt^|8*c7 zo(298@+r$k_wQNGHv{|$tW(T8L+4_`FQ{kEW5Jgg{yf7ey4ss_(SNKfz(N9lx&a;< je(UuV8hP?p&}TPdm1I$XmG#(RzlD&B2izSj9sl%y5~4qc literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..ac72c34e8a --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000000..0adc8e1a53 --- /dev/null +++ b/gradlew @@ -0,0 +1,249 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original 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 POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# 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 ;; #( + MSYS* | 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 + if ! command -v java >/dev/null 2>&1 + then + 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 +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# 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"' + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000000..93e3f59f13 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,92 @@ +@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=. +@rem This is normally unused +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% equ 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% equ 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! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000000..2f01e7d093 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'voucher-management' diff --git a/src/main/java/org/prgrms/vouchermanagement/VoucherManagementApplication.java b/src/main/java/org/prgrms/vouchermanagement/VoucherManagementApplication.java new file mode 100644 index 0000000000..957265cb86 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/VoucherManagementApplication.java @@ -0,0 +1,13 @@ +package org.prgrms.vouchermanagement; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class VoucherManagementApplication { + + public static void main(String[] args) { + SpringApplication.run(VoucherManagementApplication.class, args); + } + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/src/test/java/org/prgrms/vouchermanagement/VoucherManagementApplicationTests.java b/src/test/java/org/prgrms/vouchermanagement/VoucherManagementApplicationTests.java new file mode 100644 index 0000000000..6a5ee73f6e --- /dev/null +++ b/src/test/java/org/prgrms/vouchermanagement/VoucherManagementApplicationTests.java @@ -0,0 +1,13 @@ +package org.prgrms.vouchermanagement; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class VoucherManagementApplicationTests { + + @Test + void contextLoads() { + } + +} From 4a75e000b0f23d103c3a31e789f45a179ca20ee6 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 15:34:38 +0900 Subject: [PATCH 002/101] =?UTF-8?q?Feat=20:=20=ED=94=84=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EB=9E=A8=20=EC=8B=9C=EC=9E=91=20=EC=8B=9C=20=EC=A7=80=EC=9B=90?= =?UTF-8?q?=20=EA=B0=80=EB=8A=A5=ED=95=9C=20=EB=AA=85=EB=A0=B9=EC=96=B4=20?= =?UTF-8?q?enum?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/prgrms/vouchermanagement/view/Command.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/view/Command.java diff --git a/src/main/java/org/prgrms/vouchermanagement/view/Command.java b/src/main/java/org/prgrms/vouchermanagement/view/Command.java new file mode 100644 index 0000000000..86476f4ac4 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/view/Command.java @@ -0,0 +1,7 @@ +package org.prgrms.vouchermanagement.view; + +public enum Command { + CREATE, // 바우처 생성 + LIST, // 바우처 리스트 + EXIT // 종료 +} From b44b834fc988a2cf989dac6ebc121d3c90bdcb57 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 15:35:20 +0900 Subject: [PATCH 003/101] =?UTF-8?q?Feat=20:=20=EC=BD=98=EC=86=94=EC=9D=84?= =?UTF-8?q?=20=ED=86=B5=ED=95=B4=20=EC=9E=85=EB=A0=A5=EC=9D=84=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=ED=95=98=EB=8A=94=20ConsoleInput=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/view/ConsoleInput.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/view/ConsoleInput.java diff --git a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleInput.java b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleInput.java new file mode 100644 index 0000000000..cb4f28d0c3 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleInput.java @@ -0,0 +1,54 @@ +package org.prgrms.vouchermanagement.view; + +import org.prgrms.vouchermanagement.dto.VoucherInfo; +import org.prgrms.vouchermanagement.exception.InvalidInputException; +import org.prgrms.vouchermanagement.voucher.PolicyStatus; + +import java.util.Scanner; + +public class ConsoleInput { + + private final Scanner scanner = new Scanner(System.in); + private final ConsoleOutput consoleOutput = new ConsoleOutput(); + + public Command commandInput() { + consoleOutput.getInput(); + String inputCommand = scanner.nextLine(); + return validateAndConvertToCommand(inputCommand); + } + + public VoucherInfo createVoucherInput() { + consoleOutput.getInput(); + String inputPolicy = scanner.nextLine(); + PolicyStatus policy = validateAndConvertPolicy(inputPolicy); + + consoleOutput.getInput(); + String inputAmountOrPercent = scanner.nextLine(); + long amountOrPercent = validateAndConvertAmountOrPercent(inputAmountOrPercent); + return new VoucherInfo(policy, amountOrPercent); + } + + private Command validateAndConvertToCommand(String inputCommand) { + try { + return Command.valueOf(inputCommand.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new InvalidInputException("잘못된 command 입력입니다."); + } + } + + private PolicyStatus validateAndConvertPolicy(String inputPolicy) { + try { + return PolicyStatus.valueOf(inputPolicy.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new InvalidInputException("잘못된 policy 입력입니다."); + } + } + + private long validateAndConvertAmountOrPercent(String inputAmountOrPercent) { + try { + return Long.parseLong(inputAmountOrPercent); + } catch (NumberFormatException e) { + throw new InvalidInputException("잘못된 amountOrPercent 입력입니다."); + } + } +} From 7e985fbc59d0188afbc4f3ea132dc1f7c98a75b7 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 15:35:36 +0900 Subject: [PATCH 004/101] =?UTF-8?q?Feat=20:=20=EC=BD=98=EC=86=94=EC=9D=84?= =?UTF-8?q?=20=ED=86=B5=ED=95=B4=20=EC=B6=9C=EB=A0=A5=EC=9D=84=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=ED=95=98=EB=8A=94=20ConsoleOutput=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/view/ConsoleOutput.java | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java diff --git a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java new file mode 100644 index 0000000000..7d87d2e78d --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java @@ -0,0 +1,74 @@ +package org.prgrms.vouchermanagement.view; + +import org.prgrms.vouchermanagement.voucher.Voucher; + +import java.util.List; + +public class ConsoleOutput { + + private static final String welcome = """ + + === Voucher Program === + Type exit to exit the program. + Type create to create a new voucher. + Type list to list all vouchers. + """; + + private static final String createVoucher = """ + + === CREATE VOUCHER === + select policy(fixed, percent) + input amount or percent + """; + + private static final String createVoucherComplete = """ + + === COMPLETE CREATE VOUCHER === + """; + + private static final String showVoucherLists = """ + + === VOUCHER LISTS === + """; + + private static final String exit = """ + + === Bye Bye === + """; + + public void printMessage(String message) { + System.out.print(message); + } + + public void printlnMessage(String message) { + System.out.println(message); + } + + public void getInput() { + System.out.print("> "); + } + + public void printWelcomeMessage() { + printMessage(welcome); + } + + public void printCreateVoucherMessage() { + printMessage(createVoucher); + } + + public void printCreateVoucherCompleteMessage() { + printMessage(createVoucherComplete); + } + + public void printVouchers(List vouchers) { + printMessage(showVoucherLists); + for(Voucher voucher : vouchers) { + printlnMessage("voucherId : " + voucher.getVoucherId() + ", policy : " + voucher.getDiscountPolicy().getPolicyStatus()); + } + } + + public void printExitMessage() { + printMessage(exit); + } + +} From 81c24a7b01bf824a5eb77ff7b048a996b8425bae Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 15:36:48 +0900 Subject: [PATCH 005/101] =?UTF-8?q?Feat=20:=20=EC=95=A0=ED=94=8C=EB=A6=AC?= =?UTF-8?q?=EC=BC=80=EC=9D=B4=EC=85=98=20=EC=8B=9C=EC=9E=91=20=EC=8B=9C=20?= =?UTF-8?q?=EC=9E=85=EC=B6=9C=EB=A0=A5=20=EB=B0=8F=20=EB=AA=85=EB=A0=B9?= =?UTF-8?q?=EC=96=B4=EC=9D=84=20=EA=B4=80=EB=A6=AC=ED=95=98=EB=8A=94=20Con?= =?UTF-8?q?troller?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prgrms/vouchermanagement/Controller.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/Controller.java diff --git a/src/main/java/org/prgrms/vouchermanagement/Controller.java b/src/main/java/org/prgrms/vouchermanagement/Controller.java new file mode 100644 index 0000000000..d21d623d75 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/Controller.java @@ -0,0 +1,58 @@ +package org.prgrms.vouchermanagement; + +import org.prgrms.vouchermanagement.dto.VoucherInfo; +import org.prgrms.vouchermanagement.service.VoucherService; +import org.prgrms.vouchermanagement.view.Command; +import org.prgrms.vouchermanagement.view.ConsoleInput; +import org.prgrms.vouchermanagement.view.ConsoleOutput; +import org.prgrms.vouchermanagement.voucher.Voucher; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class Controller implements CommandLineRunner { + + private final ConsoleInput consoleInput = new ConsoleInput(); + private final ConsoleOutput consoleOutput = new ConsoleOutput(); + + private final VoucherService voucherService; + + public Controller(VoucherService voucherService) { + this.voucherService = voucherService; + } + + @Override + public void run(String... args) throws Exception { + boolean notExitCommand = true; + + while (notExitCommand) { + consoleOutput.printWelcomeMessage(); + Command command = consoleInput.commandInput(); + + switch (command) { + case CREATE -> createVoucher(); + case LIST -> voucherLists(); + case EXIT -> notExitCommand = exit(); + } + } + } + + private void createVoucher() { + consoleOutput.printCreateVoucherMessage(); + VoucherInfo voucherInput = consoleInput.createVoucherInput(); + voucherService.createVoucher(voucherInput.policy(), voucherInput.amountOrPercent()); + consoleOutput.printCreateVoucherCompleteMessage(); + } + + private void voucherLists() { + List vouchers = voucherService.voucherLists(); + consoleOutput.printVouchers(vouchers); + } + + private boolean exit() { + consoleOutput.printExitMessage(); + return false; + } +} From d59c34e9f7aed1440a9be8f7c8af50bf628c1c8e Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 15:37:47 +0900 Subject: [PATCH 006/101] =?UTF-8?q?Feat=20:=20voucher=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/voucher/Voucher.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/voucher/Voucher.java diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/Voucher.java b/src/main/java/org/prgrms/vouchermanagement/voucher/Voucher.java new file mode 100644 index 0000000000..c834fe54cc --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/Voucher.java @@ -0,0 +1,21 @@ +package org.prgrms.vouchermanagement.voucher; + +import java.util.UUID; + +public class Voucher { + private final UUID voucherId; + private final DiscountPolicy discountPolicy; + + public Voucher(UUID voucherId, DiscountPolicy discountPolicy) { + this.voucherId = voucherId; + this.discountPolicy = discountPolicy; + } + + public UUID getVoucherId() { + return voucherId; + } + + public DiscountPolicy getDiscountPolicy() { + return discountPolicy; + } +} From 0c8441d9f703f6fb9744628da3bfc754e2bfd4e6 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 15:38:40 +0900 Subject: [PATCH 007/101] =?UTF-8?q?Feat=20:=20=ED=95=A0=EC=9D=B8=20?= =?UTF-8?q?=EC=A0=95=EC=B1=85=20interface?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prgrms/vouchermanagement/voucher/DiscountPolicy.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/voucher/DiscountPolicy.java diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/DiscountPolicy.java b/src/main/java/org/prgrms/vouchermanagement/voucher/DiscountPolicy.java new file mode 100644 index 0000000000..a51d2db908 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/DiscountPolicy.java @@ -0,0 +1,9 @@ +package org.prgrms.vouchermanagement.voucher; + +import java.util.UUID; + +public interface DiscountPolicy { + UUID getVoucherId(); + + PolicyStatus getPolicyStatus(); +} From 51710e271a614d07e2c03a4b5cea417bbe8afe24 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 15:39:02 +0900 Subject: [PATCH 008/101] =?UTF-8?q?Feat=20:=20=EA=B3=A0=EC=A0=95=20?= =?UTF-8?q?=EA=B8=88=EC=95=A1=20=EB=B0=94=EC=9A=B0=EC=B2=98=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voucher/FixedAmountVoucher.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/voucher/FixedAmountVoucher.java diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/FixedAmountVoucher.java b/src/main/java/org/prgrms/vouchermanagement/voucher/FixedAmountVoucher.java new file mode 100644 index 0000000000..896201149f --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/FixedAmountVoucher.java @@ -0,0 +1,26 @@ +package org.prgrms.vouchermanagement.voucher; + +import java.util.UUID; + +public class FixedAmountVoucher implements DiscountPolicy { + + private final UUID voucherId; + private final long amount; + private final PolicyStatus policyStatus; + + public FixedAmountVoucher(UUID voucherId, long amount, PolicyStatus policyStatus) { + this.voucherId = voucherId; + this.amount = amount; + this.policyStatus = policyStatus; + } + + @Override + public UUID getVoucherId() { + return voucherId; + } + + @Override + public PolicyStatus getPolicyStatus() { + return policyStatus; + } +} From ff51c802c24527a59d3a767015526534b5304f82 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 15:39:26 +0900 Subject: [PATCH 009/101] =?UTF-8?q?Feat=20:=20=ED=8D=BC=EC=84=BC=ED=8A=B8?= =?UTF-8?q?=20=ED=95=A0=EC=9D=B8=20=EB=B0=94=EC=9A=B0=EC=B2=98=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voucher/PercentDiscountVoucher.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/voucher/PercentDiscountVoucher.java diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/PercentDiscountVoucher.java b/src/main/java/org/prgrms/vouchermanagement/voucher/PercentDiscountVoucher.java new file mode 100644 index 0000000000..e93e982028 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/PercentDiscountVoucher.java @@ -0,0 +1,26 @@ +package org.prgrms.vouchermanagement.voucher; + +import java.util.UUID; + +public class PercentDiscountVoucher implements DiscountPolicy { + + private final UUID voucherId; + private final long percent; + private final PolicyStatus policyStatus; + + public PercentDiscountVoucher(UUID voucherId, long percent, PolicyStatus policyStatus) { + this.voucherId = voucherId; + this.percent = percent; + this.policyStatus = policyStatus; + } + + @Override + public UUID getVoucherId() { + return voucherId; + } + + @Override + public PolicyStatus getPolicyStatus() { + return policyStatus; + } +} From 64ed06f9c6eaadb14aa376b52be29e5196be9e43 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 15:40:11 +0900 Subject: [PATCH 010/101] =?UTF-8?q?Feat=20:=20=EB=B0=94=EC=9A=B0=EC=B2=98?= =?UTF-8?q?=20=ED=95=84=EB=93=9C=EB=A5=BC=20=EC=A0=84=EB=8B=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=B0=94=EC=9A=B0=EC=B2=98=20dto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/prgrms/vouchermanagement/dto/VoucherInfo.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/dto/VoucherInfo.java diff --git a/src/main/java/org/prgrms/vouchermanagement/dto/VoucherInfo.java b/src/main/java/org/prgrms/vouchermanagement/dto/VoucherInfo.java new file mode 100644 index 0000000000..cf63e7eeee --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/dto/VoucherInfo.java @@ -0,0 +1,7 @@ +package org.prgrms.vouchermanagement.dto; + +import org.prgrms.vouchermanagement.voucher.PolicyStatus; + +public record VoucherInfo( + PolicyStatus policy, + long amountOrPercent) {} From a87c5b129c587516a14faa9f0bfc20576f9cbbe1 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 15:40:44 +0900 Subject: [PATCH 011/101] =?UTF-8?q?Feat=20:=20=ED=95=A0=EC=9D=B8=20?= =?UTF-8?q?=EC=A0=95=EC=B1=85=EC=9D=84=20=EB=82=98=ED=83=80=EB=82=B4?= =?UTF-8?q?=EB=8A=94=20enum?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/prgrms/vouchermanagement/voucher/PolicyStatus.java | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/voucher/PolicyStatus.java diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/PolicyStatus.java b/src/main/java/org/prgrms/vouchermanagement/voucher/PolicyStatus.java new file mode 100644 index 0000000000..e8e740a7bf --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/PolicyStatus.java @@ -0,0 +1,6 @@ +package org.prgrms.vouchermanagement.voucher; + +public enum PolicyStatus { + FIXED, //고정 + PERCENT //퍼센트 +} From fde8fa8e1d1e7e640a5a42c7baa1c4d7e6754643 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 15:41:26 +0900 Subject: [PATCH 012/101] =?UTF-8?q?Feat=20:=20=EB=B0=94=EC=9A=B0=EC=B2=98?= =?UTF-8?q?=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EA=B4=80=EB=A6=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20Repository=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/exception/InvalidInputException.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/exception/InvalidInputException.java diff --git a/src/main/java/org/prgrms/vouchermanagement/exception/InvalidInputException.java b/src/main/java/org/prgrms/vouchermanagement/exception/InvalidInputException.java new file mode 100644 index 0000000000..9cf662fd6d --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/exception/InvalidInputException.java @@ -0,0 +1,7 @@ +package org.prgrms.vouchermanagement.exception; + +public class InvalidInputException extends RuntimeException{ + public InvalidInputException(String message) { + super(message); + } +} From 2fed8449ea12ab52fbc355ab57b6b5bbab6b27ee Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 15:41:45 +0900 Subject: [PATCH 013/101] =?UTF-8?q?Feat=20:=20=EB=B0=94=EC=9A=B0=EC=B2=98?= =?UTF-8?q?=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EA=B4=80=EB=A6=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20Repository=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/VoucherRepository.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java b/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java new file mode 100644 index 0000000000..b5fb28fb1b --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java @@ -0,0 +1,14 @@ +package org.prgrms.vouchermanagement.repository; + +import org.prgrms.vouchermanagement.voucher.Voucher; + +import java.util.List; +import java.util.UUID; + +public interface VoucherRepository { + public void create(Voucher voucher); + + public Voucher getById(UUID voucherId); + + public List voucherLists(); +} From 823033c7635e295e9c55a940921599366b16c793 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 15:42:54 +0900 Subject: [PATCH 014/101] =?UTF-8?q?Feat=20:=20=EB=A9=94=EB=AA=A8=EB=A6=AC?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=B0=94=EC=9A=B0=EC=B2=98=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EB=A5=BC=20=EA=B4=80=EB=A6=AC=ED=95=98=EB=8A=94=20Mem?= =?UTF-8?q?oryRepository=20=EA=B5=AC=ED=98=84=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/MemoryRepository.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java b/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java new file mode 100644 index 0000000000..608fd99119 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java @@ -0,0 +1,35 @@ +package org.prgrms.vouchermanagement.repository; + +import org.prgrms.vouchermanagement.voucher.Voucher; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +@Repository +//@Qualifier("memory") +@Primary +public class MemoryRepository implements VoucherRepository{ + + private final Map storage = new ConcurrentHashMap<>(); + + @Override + public void create(Voucher voucher) { + storage.put(voucher.getVoucherId(), voucher); + } + + @Override + public Voucher getById(UUID voucherId) { + return storage.get(voucherId); + } + + @Override + public List voucherLists() { + return storage.values().stream() + .toList(); + } +} From 2c799c8cc79309547514e53a46cd437e6a591d5a Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 15:43:17 +0900 Subject: [PATCH 015/101] =?UTF-8?q?Feat=20:=20=ED=8C=8C=EC=9D=BC=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EB=B0=94=EC=9A=B0=EC=B2=98=20=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=EB=A5=BC=20=EA=B4=80=EB=A6=AC=ED=95=98=EB=8A=94=20FileReposito?= =?UTF-8?q?ry=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/FileRepository.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java b/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java new file mode 100644 index 0000000000..3063614699 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java @@ -0,0 +1,25 @@ +package org.prgrms.vouchermanagement.repository; + +import org.prgrms.vouchermanagement.voucher.Voucher; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.UUID; + +@Repository +//@Qualifier("file") +public class FileRepository implements VoucherRepository{ + @Override + public void create(Voucher voucher) {} + + @Override + public Voucher getById(UUID voucherId) { + return null; + } + + @Override + public List voucherLists() { + return null; + } +} From 48e29c5033171729e544dc798f5bcc5ebb99eb70 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 15:44:19 +0900 Subject: [PATCH 016/101] =?UTF-8?q?Feat=20:=20Controller=EB=A5=BC=20?= =?UTF-8?q?=ED=86=B5=ED=95=B4=20=EB=93=A4=EC=96=B4=EC=98=A8=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=EC=9D=84=20=EC=88=98=ED=96=89=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=20=EB=A1=9C=EC=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/VoucherService.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/service/VoucherService.java diff --git a/src/main/java/org/prgrms/vouchermanagement/service/VoucherService.java b/src/main/java/org/prgrms/vouchermanagement/service/VoucherService.java new file mode 100644 index 0000000000..18273dd7c4 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/service/VoucherService.java @@ -0,0 +1,44 @@ +package org.prgrms.vouchermanagement.service; + +import org.prgrms.vouchermanagement.exception.InvalidRangeException; +import org.prgrms.vouchermanagement.repository.VoucherRepository; +import org.prgrms.vouchermanagement.voucher.*; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.UUID; + +@Service +public class VoucherService { + + private final VoucherRepository voucherRepository; + + public VoucherService(VoucherRepository voucherRepository) { + this.voucherRepository = voucherRepository; + } + + public void createVoucher(PolicyStatus policy, long amountOrPercent) { + UUID uuid = UUID.randomUUID(); + DiscountPolicy discountPolicy = null; + if (policy == PolicyStatus.FIXED) { + discountPolicy = new FixedAmountVoucher(uuid, amountOrPercent, policy); + } else if (policy == PolicyStatus.PERCENT) { + validateAmountOrPercentRange(amountOrPercent); + discountPolicy = new PercentDiscountVoucher(uuid, amountOrPercent, policy); + } + + Voucher voucher = new Voucher(uuid, discountPolicy); + voucherRepository.create(voucher); + } + + public List voucherLists() { + return voucherRepository.voucherLists(); + } + + private void validateAmountOrPercentRange(long amountOrPercent) { + if (amountOrPercent < 0 || amountOrPercent > 100) { + throw new InvalidRangeException("PercentDiscountPolicy는 0~100 사이의 값을 가져야 합니다."); + } + } + +} From a36073cc810bc25c685c5d898cf445a90ee30342 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 15:44:38 +0900 Subject: [PATCH 017/101] =?UTF-8?q?Feat=20:=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EA=B0=80=EC=A7=80=EA=B3=A0=20?= =?UTF-8?q?=EC=9E=88=E3=84=B4=20AppConfiguration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/prgrms/vouchermanagement/AppConfiguration.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/AppConfiguration.java diff --git a/src/main/java/org/prgrms/vouchermanagement/AppConfiguration.java b/src/main/java/org/prgrms/vouchermanagement/AppConfiguration.java new file mode 100644 index 0000000000..3d14d92505 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/AppConfiguration.java @@ -0,0 +1,10 @@ +package org.prgrms.vouchermanagement; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan +public class AppConfiguration { + +} From 29506c928a1d7bef0f8a53bbe36430dab06ed0bd Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 15:45:29 +0900 Subject: [PATCH 018/101] =?UTF-8?q?Feat=20:=20=ED=8D=BC=EC=84=BC=ED=8A=B8?= =?UTF-8?q?=20=ED=95=A0=EC=9D=B8=20=EC=A0=95=EC=B1=85=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=93=A4=EC=96=B4=EC=98=A8=20=EA=B0=92=EC=9D=98=20=EB=B2=94?= =?UTF-8?q?=EC=9C=84=EB=A5=BC=20=ED=99=95=EC=9D=B8=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EC=98=88=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/exception/InvalidRangeException.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/exception/InvalidRangeException.java diff --git a/src/main/java/org/prgrms/vouchermanagement/exception/InvalidRangeException.java b/src/main/java/org/prgrms/vouchermanagement/exception/InvalidRangeException.java new file mode 100644 index 0000000000..0bae4d5960 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/exception/InvalidRangeException.java @@ -0,0 +1,7 @@ +package org.prgrms.vouchermanagement.exception; + +public class InvalidRangeException extends RuntimeException{ + public InvalidRangeException(String message) { + super(message); + } +} From 11e6fa3dbe7f518c6f4980c76a65cdc43ac7550c Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 15:46:35 +0900 Subject: [PATCH 019/101] =?UTF-8?q?Feat=20:=20=EC=8A=A4=ED=94=84=EB=A7=81?= =?UTF-8?q?=20=EB=B6=80=ED=8A=B8=20=EC=8B=9C=EC=9E=91=EC=A0=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prgrms/vouchermanagement/VoucherManagementApplication.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/VoucherManagementApplication.java b/src/main/java/org/prgrms/vouchermanagement/VoucherManagementApplication.java index 957265cb86..099b1b047a 100644 --- a/src/main/java/org/prgrms/vouchermanagement/VoucherManagementApplication.java +++ b/src/main/java/org/prgrms/vouchermanagement/VoucherManagementApplication.java @@ -5,7 +5,6 @@ @SpringBootApplication public class VoucherManagementApplication { - public static void main(String[] args) { SpringApplication.run(VoucherManagementApplication.class, args); } From 5b7634bdbab276d2b0d5e4a17562173687679e4f Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 17:38:45 +0900 Subject: [PATCH 020/101] =?UTF-8?q?Feat=20:=20=EC=98=88=EC=99=B8=EA=B0=80?= =?UTF-8?q?=20=EB=B0=9C=EC=83=9D=ED=95=9C=20=EA=B1=B4=EC=9D=80=20file?= =?UTF-8?q?=EB=A1=9C=20=EC=A0=80=EC=9E=A5=ED=95=A0=20=EC=88=98=20=EC=9E=88?= =?UTF-8?q?=EA=B2=8C=20logback=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application_log/application.log | 14 ++++++++++++++ build.gradle | 2 +- src/main/resources/logback.xml | 27 +++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 application_log/application.log create mode 100644 src/main/resources/logback.xml diff --git a/application_log/application.log b/application_log/application.log new file mode 100644 index 0000000000..d698c3a246 --- /dev/null +++ b/application_log/application.log @@ -0,0 +1,14 @@ +20231015 17:36:45.137 [main] ERROR [SpringApplication:827] - Application run failed +java.lang.IllegalStateException: Failed to execute CommandLineRunner + at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:777) + at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:758) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:322) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298) + at org.prgrms.vouchermanagement.VoucherManagementApplication.main(VoucherManagementApplication.java:9) +Caused by: org.prgrms.vouchermanagement.exception.InvalidInputException: 잘못된 command 입력입니다. + at org.prgrms.vouchermanagement.view.ConsoleInput.validateAndConvertToCommand(ConsoleInput.java:35) + at org.prgrms.vouchermanagement.view.ConsoleInput.commandInput(ConsoleInput.java:17) + at org.prgrms.vouchermanagement.Controller.run(Controller.java:32) + at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:774) + ... 5 common frames omitted diff --git a/build.gradle b/build.gradle index e185923415..a3ea2b55ed 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter' - testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.boot:spring-boot-starter-test' } tasks.named('test') { diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 0000000000..8dce9fe8b2 --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,27 @@ + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + ./application_log/application.log + + %d{yyyyMMdd HH:mm:ss.SSS} [%thread] %-5level [%logger{0}:%line] - %msg %n + + + application.log.%d{yyyy-MM-dd}.gz + 30 + 1GB + + + + + + + + + + + From 6ec4c0ad1cd3c8ecdacb435e8aaedfcae25da5a9 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 18:06:27 +0900 Subject: [PATCH 021/101] =?UTF-8?q?Feat=20:=20=EB=A1=9C=EA=B7=B8=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index c2065bc262..63d9a9aa9f 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,5 @@ out/ ### VS Code ### .vscode/ + +application_log From cba2e97df000c83a24cce2a47c34e09abed7edae Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 18:07:17 +0900 Subject: [PATCH 022/101] =?UTF-8?q?Feat=20:=20@Profile=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=A5=B8=20=EC=8B=A4=ED=96=89=20=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?yaml=20=ED=8C=8C=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prgrms/vouchermanagement/repository/FileRepository.java | 5 +++-- .../vouchermanagement/repository/MemoryRepository.java | 6 +++--- src/main/resources/application.yml | 3 +++ 3 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/application.yml diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java b/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java index 3063614699..ee8fa620dd 100644 --- a/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java @@ -1,14 +1,14 @@ package org.prgrms.vouchermanagement.repository; import org.prgrms.vouchermanagement.voucher.Voucher; -import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; import java.util.List; import java.util.UUID; @Repository -//@Qualifier("file") +@Profile("dev") public class FileRepository implements VoucherRepository{ @Override public void create(Voucher voucher) {} @@ -20,6 +20,7 @@ public Voucher getById(UUID voucherId) { @Override public List voucherLists() { + System.out.println("dev"); return null; } } diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java b/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java index 608fd99119..64e71a35a6 100644 --- a/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java @@ -1,8 +1,8 @@ package org.prgrms.vouchermanagement.repository; import org.prgrms.vouchermanagement.voucher.Voucher; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; import java.util.List; @@ -11,8 +11,7 @@ import java.util.concurrent.ConcurrentHashMap; @Repository -//@Qualifier("memory") -@Primary +@Profile("local") public class MemoryRepository implements VoucherRepository{ private final Map storage = new ConcurrentHashMap<>(); @@ -29,6 +28,7 @@ public Voucher getById(UUID voucherId) { @Override public List voucherLists() { + System.out.println("local"); return storage.values().stream() .toList(); } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000000..d74c444c1c --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,3 @@ +spring: + profiles: + active: local From f0a652655f717f5a3e9dda7c9d88f62a8ba6c046 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 18:16:15 +0900 Subject: [PATCH 023/101] =?UTF-8?q?Feat=20:=20FileRepository=EB=A1=9C=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=EB=90=98=EB=8A=94=20file=20=EC=A0=80?= =?UTF-8?q?=EC=9E=A5=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- voucherFiles | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 voucherFiles diff --git a/voucherFiles b/voucherFiles new file mode 100644 index 0000000000..e69de29bb2 From bf5acc8293ac941289fb0b732a978771a9851dfa Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 19:07:30 +0900 Subject: [PATCH 024/101] =?UTF-8?q?Feat=20:=20=EA=B3=A0=EA=B0=9D=20?= =?UTF-8?q?=EB=B8=94=EB=9E=99=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80(=EC=9D=BD=EA=B8=B0=EC=9A=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/blackList.csv | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/main/resources/blackList.csv diff --git a/src/main/resources/blackList.csv b/src/main/resources/blackList.csv new file mode 100644 index 0000000000..eae69b11a0 --- /dev/null +++ b/src/main/resources/blackList.csv @@ -0,0 +1,4 @@ +b30b3c8e-ebfa-4c06-9af8-0adc86167fe2,김씨,22 +430e153a-273e-4ab5-94b5-9409f642b637,나씨,23 +30542d90-75b7-4830-bea2-b8011aff5a5b,박씨,21 +aa50802e-0eeb-444d-a6bf-5ab2dcb44bf9,이씨,24 From 0c4b3e46fcd54d42661bd38708148625b9af27b1 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 19:07:48 +0900 Subject: [PATCH 025/101] =?UTF-8?q?Feat=20:=20BLACKLIST=20enum=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/prgrms/vouchermanagement/view/Command.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/prgrms/vouchermanagement/view/Command.java b/src/main/java/org/prgrms/vouchermanagement/view/Command.java index 86476f4ac4..a77b6632d4 100644 --- a/src/main/java/org/prgrms/vouchermanagement/view/Command.java +++ b/src/main/java/org/prgrms/vouchermanagement/view/Command.java @@ -3,5 +3,6 @@ public enum Command { CREATE, // 바우처 생성 LIST, // 바우처 리스트 + BLACKLIST, // 블랙 리스트 EXIT // 종료 } From e40b34eb7906cec7da97e05933e9a76415a84b5d Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 20:13:11 +0900 Subject: [PATCH 026/101] =?UTF-8?q?Feat=20:=20=EB=B8=94=EB=9E=99=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EA=B3=A0?= =?UTF-8?q?=EA=B0=9D=20=EB=8F=84=EB=A9=94=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/customer/Customer.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/customer/Customer.java diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/Customer.java b/src/main/java/org/prgrms/vouchermanagement/customer/Customer.java new file mode 100644 index 0000000000..dd56a9f0ab --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/customer/Customer.java @@ -0,0 +1,27 @@ +package org.prgrms.vouchermanagement.customer; + +import java.util.UUID; + +public class Customer { + private final UUID customerId; + private final String name; + private final int age; + + public Customer(UUID customerId, String name, int age) { + this.customerId = customerId; + this.name = name; + this.age = age; + } + + public UUID getCustomerId() { + return customerId; + } + + public String getName() { + return name; + } + + public int getAge() { + return age; + } +} From 0e2495fe407fb4d125202e1455b81381d837701b Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 20:13:35 +0900 Subject: [PATCH 027/101] =?UTF-8?q?Feat=20:=20csv=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=EB=A1=9C=EB=B6=80=ED=84=B0=20=EB=B8=94=EB=9E=99=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EB=A5=BC=20=EA=B0=80=EC=A0=B8=EC=98=A4?= =?UTF-8?q?=EB=8A=94=20Repository?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../customer/CustomerRepository.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/customer/CustomerRepository.java diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/CustomerRepository.java b/src/main/java/org/prgrms/vouchermanagement/customer/CustomerRepository.java new file mode 100644 index 0000000000..3b4c3d2858 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/customer/CustomerRepository.java @@ -0,0 +1,43 @@ +package org.prgrms.vouchermanagement.customer; + +import org.prgrms.vouchermanagement.exception.LoadFailException; +import org.springframework.stereotype.Repository; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@Repository +public class CustomerRepository { + + private final List blackList = new ArrayList<>(); + private final String filePath = "./blacklist/blackList.csv"; + + public List load() { + if(blackList.isEmpty()) { + getFromFile(); + } + return blackList; + } + + private void getFromFile() { + try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { + String line; + while ((line = reader.readLine()) != null) { + String[] parts = line.split(","); + + UUID uuid = UUID.fromString(parts[0]); + String name = parts[1]; + int age = Integer.parseInt(parts[2]); + Customer customer = new Customer(uuid, name, age); + + blackList.add(customer); + } + } catch (IOException e) { + throw new LoadFailException("CSV 파일을 찾을 수 없습니다."); + } + } +} From 6ef43c5b668cef80fe45429c844e4a76f6743707 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 20:13:49 +0900 Subject: [PATCH 028/101] =?UTF-8?q?Feat=20:=20=EB=B8=94=EB=9E=99=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20=EC=88=98?= =?UTF-8?q?=ED=96=89=ED=95=98=EB=8A=94=20=EC=84=9C=EB=B9=84=EC=8A=A4=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../customer/CustomerService.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/customer/CustomerService.java diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/CustomerService.java b/src/main/java/org/prgrms/vouchermanagement/customer/CustomerService.java new file mode 100644 index 0000000000..da45f3853d --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/customer/CustomerService.java @@ -0,0 +1,19 @@ +package org.prgrms.vouchermanagement.customer; + +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class CustomerService { + + private final CustomerRepository customerRepository; + + public CustomerService(CustomerRepository customerRepository) { + this.customerRepository = customerRepository; + } + + public List getBlackList() { + return customerRepository.load(); + } +} From 60f2ab6bc8b2e9f80b13f0c992cfa88e16921f14 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 20:14:10 +0900 Subject: [PATCH 029/101] =?UTF-8?q?Feat=20:=20=ED=8C=8C=EC=9D=BC=EB=A1=9C?= =?UTF-8?q?=EB=B6=80=ED=84=B0=20=EA=B0=80=EC=A0=B8=EC=98=A4=EC=A7=80=20?= =?UTF-8?q?=EB=AA=BB=ED=95=A0=20=EA=B2=BD=EC=9A=B0=20=EB=B0=9C=EC=83=9D?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EC=98=88=EC=99=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/exception/LoadFailException.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/exception/LoadFailException.java diff --git a/src/main/java/org/prgrms/vouchermanagement/exception/LoadFailException.java b/src/main/java/org/prgrms/vouchermanagement/exception/LoadFailException.java new file mode 100644 index 0000000000..e2465786e9 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/exception/LoadFailException.java @@ -0,0 +1,7 @@ +package org.prgrms.vouchermanagement.exception; + +public class LoadFailException extends RuntimeException { + public LoadFailException(String message) { + super(message); + } +} From 813c731a5db20d78491a37fde2b0cfc94fc96758 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 20:14:42 +0900 Subject: [PATCH 030/101] =?UTF-8?q?Refactor=20:=20csv=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- {src/main/resources => blacklist}/blackList.csv | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {src/main/resources => blacklist}/blackList.csv (100%) diff --git a/src/main/resources/blackList.csv b/blacklist/blackList.csv similarity index 100% rename from src/main/resources/blackList.csv rename to blacklist/blackList.csv From a2c34f978c6f653931aaf35e6aafb363f6c7d4c1 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 20:15:08 +0900 Subject: [PATCH 031/101] =?UTF-8?q?feat=20:=20=EB=B8=94=EB=9E=99=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EB=A5=BC=20=EB=B3=B4=EC=97=AC=EC=A3=BC?= =?UTF-8?q?=EB=8A=94=20showBlackList=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/prgrms/vouchermanagement/Controller.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/Controller.java b/src/main/java/org/prgrms/vouchermanagement/Controller.java index d21d623d75..03911953b8 100644 --- a/src/main/java/org/prgrms/vouchermanagement/Controller.java +++ b/src/main/java/org/prgrms/vouchermanagement/Controller.java @@ -1,6 +1,8 @@ package org.prgrms.vouchermanagement; import org.prgrms.vouchermanagement.dto.VoucherInfo; +import org.prgrms.vouchermanagement.customer.Customer; +import org.prgrms.vouchermanagement.customer.CustomerService; import org.prgrms.vouchermanagement.service.VoucherService; import org.prgrms.vouchermanagement.view.Command; import org.prgrms.vouchermanagement.view.ConsoleInput; @@ -18,9 +20,11 @@ public class Controller implements CommandLineRunner { private final ConsoleOutput consoleOutput = new ConsoleOutput(); private final VoucherService voucherService; + private final CustomerService customerService; - public Controller(VoucherService voucherService) { + public Controller(VoucherService voucherService, CustomerService customerService) { this.voucherService = voucherService; + this.customerService = customerService; } @Override @@ -34,6 +38,7 @@ public void run(String... args) throws Exception { switch (command) { case CREATE -> createVoucher(); case LIST -> voucherLists(); + case BLACKLIST -> showBlackList(); case EXIT -> notExitCommand = exit(); } } @@ -51,6 +56,11 @@ private void voucherLists() { consoleOutput.printVouchers(vouchers); } + private void showBlackList() { + List blackList = customerService.getBlackList(); + consoleOutput.printBlackList(blackList); + } + private boolean exit() { consoleOutput.printExitMessage(); return false; From 6d1ce6934f8a07eaa49cacce94d3a08167902de0 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 20:15:27 +0900 Subject: [PATCH 032/101] =?UTF-8?q?feat=20:=20=EB=B8=94=EB=9E=99=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EB=A5=BC=20=EB=B3=B4=EC=97=AC=EC=A3=BC?= =?UTF-8?q?=EA=B8=B0=20=EC=9C=84=ED=95=9C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/view/ConsoleOutput.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java index 7d87d2e78d..2c106c066b 100644 --- a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java +++ b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java @@ -1,5 +1,6 @@ package org.prgrms.vouchermanagement.view; +import org.prgrms.vouchermanagement.customer.Customer; import org.prgrms.vouchermanagement.voucher.Voucher; import java.util.List; @@ -9,9 +10,10 @@ public class ConsoleOutput { private static final String welcome = """ === Voucher Program === - Type exit to exit the program. Type create to create a new voucher. Type list to list all vouchers. + Type blacklist to list customer in blacklist + Type exit to exit the program. """; private static final String createVoucher = """ @@ -31,6 +33,11 @@ select policy(fixed, percent) === VOUCHER LISTS === """; + private static final String showBlackList = """ + + === CUSTOMER BLACKLIST === + """; + private static final String exit = """ === Bye Bye === @@ -60,6 +67,13 @@ public void printCreateVoucherCompleteMessage() { printMessage(createVoucherComplete); } + public void printBlackList(List blackList) { + printMessage(showBlackList); + for(Customer customer : blackList) { + printlnMessage("customerId : " + customer.getCustomerId() + ", name : " + customer.getName() + ", age : " + customer.getAge()); + } + } + public void printVouchers(List vouchers) { printMessage(showVoucherLists); for(Voucher voucher : vouchers) { From 01b89d01ebfd96efe7324feaf55d2b863568c177 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 20:16:11 +0900 Subject: [PATCH 033/101] =?UTF-8?q?Refactor=20:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20import=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prgrms/vouchermanagement/repository/MemoryRepository.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java b/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java index 64e71a35a6..258378b93f 100644 --- a/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java @@ -1,7 +1,6 @@ package org.prgrms.vouchermanagement.repository; import org.prgrms.vouchermanagement.voucher.Voucher; -import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; @@ -28,7 +27,6 @@ public Voucher getById(UUID voucherId) { @Override public List voucherLists() { - System.out.println("local"); return storage.values().stream() .toList(); } From cb803e2f5264b1bd9fd337931317a313cba33f55 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 21:47:35 +0900 Subject: [PATCH 034/101] =?UTF-8?q?Feat=20:=20=ED=8C=8C=EC=9D=BC=EC=97=90?= =?UTF-8?q?=20=EC=A0=80=EC=9E=A5=ED=95=A0=20=EB=95=8C=20=EB=B0=9C=EC=83=9D?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EC=98=88=EC=99=B8=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/exception/InsertFailException.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/exception/InsertFailException.java diff --git a/src/main/java/org/prgrms/vouchermanagement/exception/InsertFailException.java b/src/main/java/org/prgrms/vouchermanagement/exception/InsertFailException.java new file mode 100644 index 0000000000..e1cf8deb61 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/exception/InsertFailException.java @@ -0,0 +1,7 @@ +package org.prgrms.vouchermanagement.exception; + +public class InsertFailException extends RuntimeException { + public InsertFailException(String message) { + super(message); + } +} From d049508dec5da430f5f7d6f8c429b73e3254b1d9 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 21:47:51 +0900 Subject: [PATCH 035/101] =?UTF-8?q?Feat=20:=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- voucherFile/voucherFile | 2 ++ voucherFiles | 0 2 files changed, 2 insertions(+) create mode 100644 voucherFile/voucherFile delete mode 100644 voucherFiles diff --git a/voucherFile/voucherFile b/voucherFile/voucherFile new file mode 100644 index 0000000000..75d7e04bb5 --- /dev/null +++ b/voucherFile/voucherFile @@ -0,0 +1,2 @@ +2905aeba-eb09-4d9e-bbec-7104c7dfca8a,FIXED,10000 +64eaa00c-8e11-45d2-917d-433387830976,PERCENT,50 diff --git a/voucherFiles b/voucherFiles deleted file mode 100644 index e69de29bb2..0000000000 From 7f4679f64fd9aacb1c4e31e6609e32a43cac11e0 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 21:48:40 +0900 Subject: [PATCH 036/101] =?UTF-8?q?Refactor=20:=20=EA=B8=B0=EB=8A=A5=20Rep?= =?UTF-8?q?ository=EB=A1=9C=20=EC=9D=B4=EA=B4=80=20=EB=B0=8F=20load=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/VoucherService.java | 21 +++---------------- 1 file changed, 3 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/service/VoucherService.java b/src/main/java/org/prgrms/vouchermanagement/service/VoucherService.java index 18273dd7c4..1469e240c2 100644 --- a/src/main/java/org/prgrms/vouchermanagement/service/VoucherService.java +++ b/src/main/java/org/prgrms/vouchermanagement/service/VoucherService.java @@ -15,30 +15,15 @@ public class VoucherService { public VoucherService(VoucherRepository voucherRepository) { this.voucherRepository = voucherRepository; + voucherRepository.load(); } public void createVoucher(PolicyStatus policy, long amountOrPercent) { - UUID uuid = UUID.randomUUID(); - DiscountPolicy discountPolicy = null; - if (policy == PolicyStatus.FIXED) { - discountPolicy = new FixedAmountVoucher(uuid, amountOrPercent, policy); - } else if (policy == PolicyStatus.PERCENT) { - validateAmountOrPercentRange(amountOrPercent); - discountPolicy = new PercentDiscountVoucher(uuid, amountOrPercent, policy); - } - - Voucher voucher = new Voucher(uuid, discountPolicy); - voucherRepository.create(voucher); + UUID voucherId = UUID.randomUUID(); + voucherRepository.create(voucherId, amountOrPercent, policy); } public List voucherLists() { return voucherRepository.voucherLists(); } - - private void validateAmountOrPercentRange(long amountOrPercent) { - if (amountOrPercent < 0 || amountOrPercent > 100) { - throw new InvalidRangeException("PercentDiscountPolicy는 0~100 사이의 값을 가져야 합니다."); - } - } - } From 4714b73523a1bd19d9014fb0771183d22cac92fc Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 21:48:54 +0900 Subject: [PATCH 037/101] =?UTF-8?q?Feat=20:=20load()=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/repository/VoucherRepository.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java b/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java index b5fb28fb1b..1fa078a0b3 100644 --- a/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java @@ -1,12 +1,15 @@ package org.prgrms.vouchermanagement.repository; +import org.prgrms.vouchermanagement.voucher.PolicyStatus; import org.prgrms.vouchermanagement.voucher.Voucher; import java.util.List; import java.util.UUID; public interface VoucherRepository { - public void create(Voucher voucher); + public void load(); + + public void create(UUID voucherId, long amountOrPercent, PolicyStatus policy); public Voucher getById(UUID voucherId); From d9ccb276d75c3f83ae5c22ae4b190a8ec18d8641 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 21:49:16 +0900 Subject: [PATCH 038/101] =?UTF-8?q?Feat=20:=20getAmountOrPercent()=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/prgrms/vouchermanagement/voucher/DiscountPolicy.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/DiscountPolicy.java b/src/main/java/org/prgrms/vouchermanagement/voucher/DiscountPolicy.java index a51d2db908..90c1c9f9b6 100644 --- a/src/main/java/org/prgrms/vouchermanagement/voucher/DiscountPolicy.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/DiscountPolicy.java @@ -5,5 +5,7 @@ public interface DiscountPolicy { UUID getVoucherId(); + long getAmountOrPercent(); + PolicyStatus getPolicyStatus(); } From 4792f1ac09076463e4b89d37ae75014b2ebfa2a1 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 21:49:57 +0900 Subject: [PATCH 039/101] =?UTF-8?q?Feat=20:=20list=20=EC=B6=9C=EB=A0=A5=20?= =?UTF-8?q?=EC=8B=9C=20=EA=B8=88=EC=95=A1/=ED=8D=BC=EC=84=BC=ED=8A=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EC=B6=9C=EB=A0=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/prgrms/vouchermanagement/view/ConsoleOutput.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java index 2c106c066b..dd5718ee3a 100644 --- a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java +++ b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java @@ -77,7 +77,7 @@ public void printBlackList(List blackList) { public void printVouchers(List vouchers) { printMessage(showVoucherLists); for(Voucher voucher : vouchers) { - printlnMessage("voucherId : " + voucher.getVoucherId() + ", policy : " + voucher.getDiscountPolicy().getPolicyStatus()); + printlnMessage("voucherId : " + voucher.getVoucherId() + ", policy : " + voucher.getDiscountPolicy().getPolicyStatus() + ", amountOrPercent : " + voucher.getDiscountPolicy().getAmountOrPercent()); } } From f65a928134fa3f8644c67bad26cd10e5e7202523 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 21:50:18 +0900 Subject: [PATCH 040/101] =?UTF-8?q?Feat=20:=20FileRepository=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/FileRepository.java | 72 +++++++++++++++++-- 1 file changed, 67 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java b/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java index ee8fa620dd..9c3789e05e 100644 --- a/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java @@ -1,26 +1,88 @@ package org.prgrms.vouchermanagement.repository; -import org.prgrms.vouchermanagement.voucher.Voucher; +import org.prgrms.vouchermanagement.exception.InsertFailException; +import org.prgrms.vouchermanagement.exception.InvalidRangeException; +import org.prgrms.vouchermanagement.exception.LoadFailException; +import org.prgrms.vouchermanagement.voucher.*; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; +import java.io.*; import java.util.List; +import java.util.Map; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; @Repository @Profile("dev") public class FileRepository implements VoucherRepository{ + + private static final String path = "./voucherFile/voucherFile"; + private final Map storage = new ConcurrentHashMap<>(); + @Override - public void create(Voucher voucher) {} + public void load() { + if(storage.isEmpty()) { + try (BufferedReader reader = new BufferedReader(new FileReader(path))) { + String line; + while ((line = reader.readLine()) != null) { + String[] parts = line.split(","); + + UUID voucherId = UUID.fromString(parts[0]); + PolicyStatus policy = PolicyStatus.valueOf(parts[1]); + long amountOrPercent = Long.parseLong(parts[2]); + + DiscountPolicy discountPolicy = null; + if (policy == PolicyStatus.FIXED) { + discountPolicy = new FixedAmountVoucher(voucherId, amountOrPercent, policy); + } else if (policy == PolicyStatus.PERCENT) { + validateAmountOrPercentRange(amountOrPercent); + discountPolicy = new PercentDiscountVoucher(voucherId, amountOrPercent, policy); + } + + storage.put(voucherId, new Voucher(voucherId, discountPolicy)); + } + } catch (IOException e) { + throw new LoadFailException("파일로부터 읽어올 수 없습니다."); + } + } + } + + @Override + public void create(UUID voucherId, long amountOrPercent, PolicyStatus policy) { + DiscountPolicy discountPolicy = null; + if (policy == PolicyStatus.FIXED) { + discountPolicy = new FixedAmountVoucher(voucherId, amountOrPercent, policy); + } else if (policy == PolicyStatus.PERCENT) { + validateAmountOrPercentRange(amountOrPercent); + discountPolicy = new PercentDiscountVoucher(voucherId, amountOrPercent, policy); + } + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(path, true))) { + writer.write(voucherId + "," + policy + "," + amountOrPercent); + writer.newLine(); // 새로운 줄 추가 + } catch (IOException e) { + throw new InsertFailException("데이터 삽입에 실패하였습니다."); + } + + Voucher voucher = new Voucher(voucherId, discountPolicy); + storage.put(voucherId, voucher); + } @Override public Voucher getById(UUID voucherId) { - return null; + return storage.get(voucherId); } @Override public List voucherLists() { - System.out.println("dev"); - return null; + return storage.values().stream() + .toList(); + } + + private void validateAmountOrPercentRange(long amountOrPercent) { + if (amountOrPercent < 0 || amountOrPercent > 100) { + throw new InvalidRangeException("PercentDiscountPolicy는 0~100 사이의 값을 가져야 합니다."); + } } } From d43d4107d713723f380f81e5c67d14252ffdcbaa Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 21:50:39 +0900 Subject: [PATCH 041/101] =?UTF-8?q?Feat=20:=20getAmountOrPercent=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prgrms/vouchermanagement/voucher/FixedAmountVoucher.java | 5 +++++ .../vouchermanagement/voucher/PercentDiscountVoucher.java | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/FixedAmountVoucher.java b/src/main/java/org/prgrms/vouchermanagement/voucher/FixedAmountVoucher.java index 896201149f..857f6e4d48 100644 --- a/src/main/java/org/prgrms/vouchermanagement/voucher/FixedAmountVoucher.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/FixedAmountVoucher.java @@ -19,6 +19,11 @@ public UUID getVoucherId() { return voucherId; } + @Override + public long getAmountOrPercent() { + return amount; + } + @Override public PolicyStatus getPolicyStatus() { return policyStatus; diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/PercentDiscountVoucher.java b/src/main/java/org/prgrms/vouchermanagement/voucher/PercentDiscountVoucher.java index e93e982028..11d365c3e6 100644 --- a/src/main/java/org/prgrms/vouchermanagement/voucher/PercentDiscountVoucher.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/PercentDiscountVoucher.java @@ -19,6 +19,11 @@ public UUID getVoucherId() { return voucherId; } + @Override + public long getAmountOrPercent() { + return percent; + } + @Override public PolicyStatus getPolicyStatus() { return policyStatus; From 8fa1f89f8a74b5d32dbb92707c4c587d553dd0c6 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sun, 15 Oct 2023 21:51:33 +0900 Subject: [PATCH 042/101] =?UTF-8?q?Refactor=20:=20DiscountPolicy=20?= =?UTF-8?q?=EC=84=A0=ED=83=9D=EC=9D=84=20Repository=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=ED=95=98=EB=8F=84=EB=A1=9D=20=EA=B8=B0=EB=8A=A5=20=EC=9D=B4?= =?UTF-8?q?=EA=B4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/MemoryRepository.java | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java b/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java index 258378b93f..fe95a0a168 100644 --- a/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java @@ -1,6 +1,7 @@ package org.prgrms.vouchermanagement.repository; -import org.prgrms.vouchermanagement.voucher.Voucher; +import org.prgrms.vouchermanagement.exception.InvalidRangeException; +import org.prgrms.vouchermanagement.voucher.*; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; @@ -15,9 +16,24 @@ public class MemoryRepository implements VoucherRepository{ private final Map storage = new ConcurrentHashMap<>(); + + @Override + public void load() { + + } + @Override - public void create(Voucher voucher) { - storage.put(voucher.getVoucherId(), voucher); + public void create(UUID voucherId, long amountOrPercent, PolicyStatus policy) { + DiscountPolicy discountPolicy = null; + if (policy == PolicyStatus.FIXED) { + discountPolicy = new FixedAmountVoucher(voucherId, amountOrPercent, policy); + } else if (policy == PolicyStatus.PERCENT) { + validateAmountOrPercentRange(amountOrPercent); + discountPolicy = new PercentDiscountVoucher(voucherId, amountOrPercent, policy); + } + + Voucher voucher = new Voucher(voucherId, discountPolicy); + storage.put(voucherId, voucher); } @Override @@ -30,4 +46,10 @@ public List voucherLists() { return storage.values().stream() .toList(); } + + private void validateAmountOrPercentRange(long amountOrPercent) { + if (amountOrPercent < 0 || amountOrPercent > 100) { + throw new InvalidRangeException("PercentDiscountPolicy는 0~100 사이의 값을 가져야 합니다."); + } + } } From 8262de65ef84318b9d43b8b3ca12fd7068959fd2 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Mon, 23 Oct 2023 18:10:36 +0900 Subject: [PATCH 043/101] =?UTF-8?q?Refactor=20:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20load()=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/repository/VoucherRepository.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java b/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java index 1fa078a0b3..d17f861a6b 100644 --- a/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java @@ -7,11 +7,9 @@ import java.util.UUID; public interface VoucherRepository { - public void load(); + void create(UUID voucherId, long amountOrPercent, PolicyStatus policy); - public void create(UUID voucherId, long amountOrPercent, PolicyStatus policy); + Voucher getById(UUID voucherId); - public Voucher getById(UUID voucherId); - - public List voucherLists(); + List voucherLists(); } From baec4acc9f45e9732c13dd50633d39337c809773 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Mon, 23 Oct 2023 18:10:57 +0900 Subject: [PATCH 044/101] =?UTF-8?q?Refactor=20:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20load()=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/repository/FileRepository.java | 3 +-- .../vouchermanagement/repository/MemoryRepository.java | 9 ++++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java b/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java index 9c3789e05e..986a0667f2 100644 --- a/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java @@ -20,8 +20,7 @@ public class FileRepository implements VoucherRepository{ private static final String path = "./voucherFile/voucherFile"; private final Map storage = new ConcurrentHashMap<>(); - @Override - public void load() { + public FileRepository() { if(storage.isEmpty()) { try (BufferedReader reader = new BufferedReader(new FileReader(path))) { String line; diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java b/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java index fe95a0a168..86665cae6a 100644 --- a/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java @@ -17,11 +17,9 @@ public class MemoryRepository implements VoucherRepository{ private final Map storage = new ConcurrentHashMap<>(); - @Override - public void load() { - - } - + //의존관계를 직접 관리하면 생기는 유연하지 않는 부분? -> 스프링의 이점 + //영속화하는 레포지토리 + //service @Override public void create(UUID voucherId, long amountOrPercent, PolicyStatus policy) { DiscountPolicy discountPolicy = null; @@ -47,6 +45,7 @@ public List voucherLists() { .toList(); } + //constructor private void validateAmountOrPercentRange(long amountOrPercent) { if (amountOrPercent < 0 || amountOrPercent > 100) { throw new InvalidRangeException("PercentDiscountPolicy는 0~100 사이의 값을 가져야 합니다."); From 829a16149f0fc9d45707c82842db5c0cc80747b0 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Mon, 23 Oct 2023 18:11:27 +0900 Subject: [PATCH 045/101] =?UTF-8?q?Refactor=20:=20=ED=8C=A8=ED=82=A4?= =?UTF-8?q?=EC=A7=80=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prgrms/vouchermanagement/{ => controller}/Controller.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename src/main/java/org/prgrms/vouchermanagement/{ => controller}/Controller.java (96%) diff --git a/src/main/java/org/prgrms/vouchermanagement/Controller.java b/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java similarity index 96% rename from src/main/java/org/prgrms/vouchermanagement/Controller.java rename to src/main/java/org/prgrms/vouchermanagement/controller/Controller.java index 03911953b8..ad87d46303 100644 --- a/src/main/java/org/prgrms/vouchermanagement/Controller.java +++ b/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java @@ -1,4 +1,4 @@ -package org.prgrms.vouchermanagement; +package org.prgrms.vouchermanagement.controller; import org.prgrms.vouchermanagement.dto.VoucherInfo; import org.prgrms.vouchermanagement.customer.Customer; @@ -28,7 +28,7 @@ public Controller(VoucherService voucherService, CustomerService customerService } @Override - public void run(String... args) throws Exception { + public void run(String... args) { boolean notExitCommand = true; while (notExitCommand) { From 61c30b958aa67e66dc763081b2002dc62fc61a02 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Tue, 24 Oct 2023 13:37:37 +0900 Subject: [PATCH 046/101] =?UTF-8?q?Refactor=20:=20record=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=20=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/prgrms/vouchermanagement/dto/VoucherInfo.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/dto/VoucherInfo.java b/src/main/java/org/prgrms/vouchermanagement/dto/VoucherInfo.java index cf63e7eeee..3a02e43c0d 100644 --- a/src/main/java/org/prgrms/vouchermanagement/dto/VoucherInfo.java +++ b/src/main/java/org/prgrms/vouchermanagement/dto/VoucherInfo.java @@ -4,4 +4,5 @@ public record VoucherInfo( PolicyStatus policy, - long amountOrPercent) {} + long amountOrPercent +) { } From 879b76ceaab7ff82f6674e6b8cf083ff316032d9 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Tue, 24 Oct 2023 13:45:01 +0900 Subject: [PATCH 047/101] =?UTF-8?q?Remove=20:=20@SpringBootApplication?= =?UTF-8?q?=EC=9D=B4=20=EC=88=98=ED=96=89=ED=95=98=EB=8A=94=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=20=EC=84=A4=EC=A0=95=20=EA=B5=AC=EC=84=B1=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/prgrms/vouchermanagement/AppConfiguration.java | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 src/main/java/org/prgrms/vouchermanagement/AppConfiguration.java diff --git a/src/main/java/org/prgrms/vouchermanagement/AppConfiguration.java b/src/main/java/org/prgrms/vouchermanagement/AppConfiguration.java deleted file mode 100644 index 3d14d92505..0000000000 --- a/src/main/java/org/prgrms/vouchermanagement/AppConfiguration.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.prgrms.vouchermanagement; - -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; - -@Configuration -@ComponentScan -public class AppConfiguration { - -} From a63f60e81e163f9986a4b6b83eb76fff5cdf9914 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Tue, 24 Oct 2023 13:45:45 +0900 Subject: [PATCH 048/101] =?UTF-8?q?Refactor=20:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20getVoucherId()=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prgrms/vouchermanagement/voucher/DiscountPolicy.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/DiscountPolicy.java b/src/main/java/org/prgrms/vouchermanagement/voucher/DiscountPolicy.java index 90c1c9f9b6..0ce6f1b40d 100644 --- a/src/main/java/org/prgrms/vouchermanagement/voucher/DiscountPolicy.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/DiscountPolicy.java @@ -1,11 +1,9 @@ package org.prgrms.vouchermanagement.voucher; -import java.util.UUID; - public interface DiscountPolicy { - UUID getVoucherId(); - long getAmountOrPercent(); PolicyStatus getPolicyStatus(); + + long discount(long price); } From 1eadbf661302c230fbb2d0a4790fcab3fa9bba50 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Tue, 24 Oct 2023 13:46:41 +0900 Subject: [PATCH 049/101] =?UTF-8?q?Refactor=20:=20Repository=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=88=98=ED=96=89=ED=95=98=EB=8A=94=20discountPoli?= =?UTF-8?q?cy=20=EA=B5=AC=EB=B6=84=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=88=98=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/VoucherService.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/service/VoucherService.java b/src/main/java/org/prgrms/vouchermanagement/service/VoucherService.java index 1469e240c2..896c00d840 100644 --- a/src/main/java/org/prgrms/vouchermanagement/service/VoucherService.java +++ b/src/main/java/org/prgrms/vouchermanagement/service/VoucherService.java @@ -1,6 +1,5 @@ package org.prgrms.vouchermanagement.service; -import org.prgrms.vouchermanagement.exception.InvalidRangeException; import org.prgrms.vouchermanagement.repository.VoucherRepository; import org.prgrms.vouchermanagement.voucher.*; import org.springframework.stereotype.Service; @@ -15,15 +14,27 @@ public class VoucherService { public VoucherService(VoucherRepository voucherRepository) { this.voucherRepository = voucherRepository; - voucherRepository.load(); } public void createVoucher(PolicyStatus policy, long amountOrPercent) { UUID voucherId = UUID.randomUUID(); - voucherRepository.create(voucherId, amountOrPercent, policy); + + DiscountPolicy discountPolicy = getDiscountPolicy(policy, amountOrPercent); + + voucherRepository.create(voucherId, discountPolicy); } public List voucherLists() { return voucherRepository.voucherLists(); } + + private static DiscountPolicy getDiscountPolicy(PolicyStatus policy, long amountOrPercent) { + DiscountPolicy discountPolicy = null; + if (policy == PolicyStatus.FIXED) { + discountPolicy = new FixedAmountVoucher(amountOrPercent); + } else if (policy == PolicyStatus.PERCENT) { + discountPolicy = new PercentDiscountVoucher(amountOrPercent); + } + return discountPolicy; + } } From 854150470f4eb95056e65b87b619819994d17b52 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Tue, 24 Oct 2023 13:49:04 +0900 Subject: [PATCH 050/101] =?UTF-8?q?Refactor=20:=20load=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EA=B3=A0=20=EC=83=9D=EC=84=B1=EC=9E=90?= =?UTF-8?q?=EB=A5=BC=20=ED=86=B5=ED=95=B4=20file=20=EB=B6=88=EB=9F=AC?= =?UTF-8?q?=EC=98=A4=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=E3=85=85=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/FileRepository.java | 24 +++++-------------- 1 file changed, 6 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java b/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java index 986a0667f2..419d18d812 100644 --- a/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java @@ -1,7 +1,6 @@ package org.prgrms.vouchermanagement.repository; import org.prgrms.vouchermanagement.exception.InsertFailException; -import org.prgrms.vouchermanagement.exception.InvalidRangeException; import org.prgrms.vouchermanagement.exception.LoadFailException; import org.prgrms.vouchermanagement.voucher.*; import org.springframework.context.annotation.Profile; @@ -33,10 +32,9 @@ public FileRepository() { DiscountPolicy discountPolicy = null; if (policy == PolicyStatus.FIXED) { - discountPolicy = new FixedAmountVoucher(voucherId, amountOrPercent, policy); + discountPolicy = new FixedAmountVoucher(amountOrPercent); } else if (policy == PolicyStatus.PERCENT) { - validateAmountOrPercentRange(amountOrPercent); - discountPolicy = new PercentDiscountVoucher(voucherId, amountOrPercent, policy); + discountPolicy = new PercentDiscountVoucher(amountOrPercent); } storage.put(voucherId, new Voucher(voucherId, discountPolicy)); @@ -48,14 +46,10 @@ public FileRepository() { } @Override - public void create(UUID voucherId, long amountOrPercent, PolicyStatus policy) { - DiscountPolicy discountPolicy = null; - if (policy == PolicyStatus.FIXED) { - discountPolicy = new FixedAmountVoucher(voucherId, amountOrPercent, policy); - } else if (policy == PolicyStatus.PERCENT) { - validateAmountOrPercentRange(amountOrPercent); - discountPolicy = new PercentDiscountVoucher(voucherId, amountOrPercent, policy); - } + public void create(UUID voucherId, DiscountPolicy discountPolicy) { + + long amountOrPercent = discountPolicy.getAmountOrPercent(); + PolicyStatus policy = discountPolicy.getPolicyStatus(); try (BufferedWriter writer = new BufferedWriter(new FileWriter(path, true))) { writer.write(voucherId + "," + policy + "," + amountOrPercent); @@ -78,10 +72,4 @@ public List voucherLists() { return storage.values().stream() .toList(); } - - private void validateAmountOrPercentRange(long amountOrPercent) { - if (amountOrPercent < 0 || amountOrPercent > 100) { - throw new InvalidRangeException("PercentDiscountPolicy는 0~100 사이의 값을 가져야 합니다."); - } - } } From e26c1869e2dad08b845f7591d5531304fda68005 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Tue, 24 Oct 2023 13:49:50 +0900 Subject: [PATCH 051/101] =?UTF-8?q?Refactor=20:=20create=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=EC=9D=98=20=EC=9D=B8=EC=9E=90=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/repository/VoucherRepository.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java b/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java index d17f861a6b..5ab3db0e6e 100644 --- a/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java @@ -1,13 +1,13 @@ package org.prgrms.vouchermanagement.repository; -import org.prgrms.vouchermanagement.voucher.PolicyStatus; +import org.prgrms.vouchermanagement.voucher.DiscountPolicy; import org.prgrms.vouchermanagement.voucher.Voucher; import java.util.List; import java.util.UUID; public interface VoucherRepository { - void create(UUID voucherId, long amountOrPercent, PolicyStatus policy); + void create(UUID voucherId, DiscountPolicy discountPolicy); Voucher getById(UUID voucherId); From 7892ddfe1c1793bdabbf36f8e02cfac13a6b0113 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Tue, 24 Oct 2023 13:50:36 +0900 Subject: [PATCH 052/101] =?UTF-8?q?Refactor=20:=20Voucher=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=A4=91=EB=B3=B5=EC=9C=BC=EB=A1=9C=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EB=8A=94=20voucherId=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voucher/FixedAmountVoucher.java | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/FixedAmountVoucher.java b/src/main/java/org/prgrms/vouchermanagement/voucher/FixedAmountVoucher.java index 857f6e4d48..93ddd81b94 100644 --- a/src/main/java/org/prgrms/vouchermanagement/voucher/FixedAmountVoucher.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/FixedAmountVoucher.java @@ -1,22 +1,12 @@ package org.prgrms.vouchermanagement.voucher; -import java.util.UUID; - public class FixedAmountVoucher implements DiscountPolicy { - private final UUID voucherId; private final long amount; - private final PolicyStatus policyStatus; + private final PolicyStatus policyStatus = PolicyStatus.FIXED; - public FixedAmountVoucher(UUID voucherId, long amount, PolicyStatus policyStatus) { - this.voucherId = voucherId; + public FixedAmountVoucher(long amount) { this.amount = amount; - this.policyStatus = policyStatus; - } - - @Override - public UUID getVoucherId() { - return voucherId; } @Override @@ -28,4 +18,9 @@ public long getAmountOrPercent() { public PolicyStatus getPolicyStatus() { return policyStatus; } + + @Override + public long discount(long price) { + return price - amount; + } } From e776c1f548cec61085174e223df900bc99c4e87d Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Tue, 24 Oct 2023 13:51:33 +0900 Subject: [PATCH 053/101] =?UTF-8?q?Refactor=20:=20validatePercent=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20PercentDiscountVoucher=EB=A1=9C?= =?UTF-8?q?=20=EC=9D=B4=EA=B4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/MemoryRepository.java | 22 +------------------ 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java b/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java index 86665cae6a..ee58c49211 100644 --- a/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java @@ -1,6 +1,5 @@ package org.prgrms.vouchermanagement.repository; -import org.prgrms.vouchermanagement.exception.InvalidRangeException; import org.prgrms.vouchermanagement.voucher.*; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; @@ -16,20 +15,8 @@ public class MemoryRepository implements VoucherRepository{ private final Map storage = new ConcurrentHashMap<>(); - - //의존관계를 직접 관리하면 생기는 유연하지 않는 부분? -> 스프링의 이점 - //영속화하는 레포지토리 - //service @Override - public void create(UUID voucherId, long amountOrPercent, PolicyStatus policy) { - DiscountPolicy discountPolicy = null; - if (policy == PolicyStatus.FIXED) { - discountPolicy = new FixedAmountVoucher(voucherId, amountOrPercent, policy); - } else if (policy == PolicyStatus.PERCENT) { - validateAmountOrPercentRange(amountOrPercent); - discountPolicy = new PercentDiscountVoucher(voucherId, amountOrPercent, policy); - } - + public void create(UUID voucherId, DiscountPolicy discountPolicy) { Voucher voucher = new Voucher(voucherId, discountPolicy); storage.put(voucherId, voucher); } @@ -44,11 +31,4 @@ public List voucherLists() { return storage.values().stream() .toList(); } - - //constructor - private void validateAmountOrPercentRange(long amountOrPercent) { - if (amountOrPercent < 0 || amountOrPercent > 100) { - throw new InvalidRangeException("PercentDiscountPolicy는 0~100 사이의 값을 가져야 합니다."); - } - } } From b56866d2f0e7bcfb37096f28b680e9ec43d0460d Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Tue, 24 Oct 2023 13:51:47 +0900 Subject: [PATCH 054/101] =?UTF-8?q?Refactor=20:=20validatePercent=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20PercentDiscountVoucher=EB=A1=9C?= =?UTF-8?q?=20=EC=9D=B4=EA=B4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voucher/PercentDiscountVoucher.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/PercentDiscountVoucher.java b/src/main/java/org/prgrms/vouchermanagement/voucher/PercentDiscountVoucher.java index 11d365c3e6..99dcbb4e3f 100644 --- a/src/main/java/org/prgrms/vouchermanagement/voucher/PercentDiscountVoucher.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/PercentDiscountVoucher.java @@ -1,22 +1,18 @@ package org.prgrms.vouchermanagement.voucher; -import java.util.UUID; +import org.prgrms.vouchermanagement.exception.InvalidRangeException; public class PercentDiscountVoucher implements DiscountPolicy { - private final UUID voucherId; private final long percent; - private final PolicyStatus policyStatus; + private final PolicyStatus policyStatus = PolicyStatus.PERCENT; - public PercentDiscountVoucher(UUID voucherId, long percent, PolicyStatus policyStatus) { - this.voucherId = voucherId; + public PercentDiscountVoucher(long percent) { this.percent = percent; - this.policyStatus = policyStatus; - } - @Override - public UUID getVoucherId() { - return voucherId; + if (percent < 0 || percent > 100) { + throw new InvalidRangeException("PercentDiscountPolicy는 0~100 사이의 값을 가져야 합니다."); + } } @Override @@ -28,4 +24,9 @@ public long getAmountOrPercent() { public PolicyStatus getPolicyStatus() { return policyStatus; } + + @Override + public long discount(long price) { + return (price - (price/percent)); + } } From 788a4af4050f977d8ce84e07f11d78b8d79b401e Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Tue, 24 Oct 2023 17:14:22 +0900 Subject: [PATCH 055/101] =?UTF-8?q?Refactor=20:=20blackList=EC=9D=98=20cus?= =?UTF-8?q?tomer=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BlackCustomer.java} | 6 +++--- .../BlackCustomerRepository.java} | 12 ++++++------ .../blackCustomer/BlackCustomerService.java | 19 +++++++++++++++++++ .../controller/Controller.java | 12 ++++++------ .../customer/CustomerService.java | 19 ------------------- .../vouchermanagement/view/ConsoleOutput.java | 10 +++++----- 6 files changed, 39 insertions(+), 39 deletions(-) rename src/main/java/org/prgrms/vouchermanagement/{customer/Customer.java => blackCustomer/BlackCustomer.java} (72%) rename src/main/java/org/prgrms/vouchermanagement/{customer/CustomerRepository.java => blackCustomer/BlackCustomerRepository.java} (75%) create mode 100644 src/main/java/org/prgrms/vouchermanagement/blackCustomer/BlackCustomerService.java delete mode 100644 src/main/java/org/prgrms/vouchermanagement/customer/CustomerService.java diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/Customer.java b/src/main/java/org/prgrms/vouchermanagement/blackCustomer/BlackCustomer.java similarity index 72% rename from src/main/java/org/prgrms/vouchermanagement/customer/Customer.java rename to src/main/java/org/prgrms/vouchermanagement/blackCustomer/BlackCustomer.java index dd56a9f0ab..cf6aa51698 100644 --- a/src/main/java/org/prgrms/vouchermanagement/customer/Customer.java +++ b/src/main/java/org/prgrms/vouchermanagement/blackCustomer/BlackCustomer.java @@ -1,13 +1,13 @@ -package org.prgrms.vouchermanagement.customer; +package org.prgrms.vouchermanagement.blackCustomer; import java.util.UUID; -public class Customer { +public class BlackCustomer { private final UUID customerId; private final String name; private final int age; - public Customer(UUID customerId, String name, int age) { + public BlackCustomer(UUID customerId, String name, int age) { this.customerId = customerId; this.name = name; this.age = age; diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/CustomerRepository.java b/src/main/java/org/prgrms/vouchermanagement/blackCustomer/BlackCustomerRepository.java similarity index 75% rename from src/main/java/org/prgrms/vouchermanagement/customer/CustomerRepository.java rename to src/main/java/org/prgrms/vouchermanagement/blackCustomer/BlackCustomerRepository.java index 3b4c3d2858..8c8a59c18d 100644 --- a/src/main/java/org/prgrms/vouchermanagement/customer/CustomerRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/blackCustomer/BlackCustomerRepository.java @@ -1,4 +1,4 @@ -package org.prgrms.vouchermanagement.customer; +package org.prgrms.vouchermanagement.blackCustomer; import org.prgrms.vouchermanagement.exception.LoadFailException; import org.springframework.stereotype.Repository; @@ -11,12 +11,12 @@ import java.util.UUID; @Repository -public class CustomerRepository { +public class BlackCustomerRepository { - private final List blackList = new ArrayList<>(); + private final List blackList = new ArrayList<>(); private final String filePath = "./blacklist/blackList.csv"; - public List load() { + public List load() { if(blackList.isEmpty()) { getFromFile(); } @@ -32,9 +32,9 @@ private void getFromFile() { UUID uuid = UUID.fromString(parts[0]); String name = parts[1]; int age = Integer.parseInt(parts[2]); - Customer customer = new Customer(uuid, name, age); + BlackCustomer blackCustomer = new BlackCustomer(uuid, name, age); - blackList.add(customer); + blackList.add(blackCustomer); } } catch (IOException e) { throw new LoadFailException("CSV 파일을 찾을 수 없습니다."); diff --git a/src/main/java/org/prgrms/vouchermanagement/blackCustomer/BlackCustomerService.java b/src/main/java/org/prgrms/vouchermanagement/blackCustomer/BlackCustomerService.java new file mode 100644 index 0000000000..68272a6b68 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/blackCustomer/BlackCustomerService.java @@ -0,0 +1,19 @@ +package org.prgrms.vouchermanagement.blackCustomer; + +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class BlackCustomerService { + + private final BlackCustomerRepository blackCustomerRepository; + + public BlackCustomerService(BlackCustomerRepository blackCustomerRepository) { + this.blackCustomerRepository = blackCustomerRepository; + } + + public List getBlackList() { + return blackCustomerRepository.load(); + } +} diff --git a/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java b/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java index ad87d46303..e405619ecd 100644 --- a/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java +++ b/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java @@ -1,8 +1,8 @@ package org.prgrms.vouchermanagement.controller; import org.prgrms.vouchermanagement.dto.VoucherInfo; -import org.prgrms.vouchermanagement.customer.Customer; -import org.prgrms.vouchermanagement.customer.CustomerService; +import org.prgrms.vouchermanagement.blackCustomer.BlackCustomer; +import org.prgrms.vouchermanagement.blackCustomer.BlackCustomerService; import org.prgrms.vouchermanagement.service.VoucherService; import org.prgrms.vouchermanagement.view.Command; import org.prgrms.vouchermanagement.view.ConsoleInput; @@ -20,11 +20,11 @@ public class Controller implements CommandLineRunner { private final ConsoleOutput consoleOutput = new ConsoleOutput(); private final VoucherService voucherService; - private final CustomerService customerService; + private final BlackCustomerService blackCustomerService; - public Controller(VoucherService voucherService, CustomerService customerService) { + public Controller(VoucherService voucherService, BlackCustomerService blackCustomerService) { this.voucherService = voucherService; - this.customerService = customerService; + this.blackCustomerService = blackCustomerService; } @Override @@ -57,7 +57,7 @@ private void voucherLists() { } private void showBlackList() { - List blackList = customerService.getBlackList(); + List blackList = blackCustomerService.getBlackList(); consoleOutput.printBlackList(blackList); } diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/CustomerService.java b/src/main/java/org/prgrms/vouchermanagement/customer/CustomerService.java deleted file mode 100644 index da45f3853d..0000000000 --- a/src/main/java/org/prgrms/vouchermanagement/customer/CustomerService.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.prgrms.vouchermanagement.customer; - -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -public class CustomerService { - - private final CustomerRepository customerRepository; - - public CustomerService(CustomerRepository customerRepository) { - this.customerRepository = customerRepository; - } - - public List getBlackList() { - return customerRepository.load(); - } -} diff --git a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java index dd5718ee3a..6fb659c92d 100644 --- a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java +++ b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java @@ -1,6 +1,6 @@ package org.prgrms.vouchermanagement.view; -import org.prgrms.vouchermanagement.customer.Customer; +import org.prgrms.vouchermanagement.blackCustomer.BlackCustomer; import org.prgrms.vouchermanagement.voucher.Voucher; import java.util.List; @@ -12,7 +12,7 @@ public class ConsoleOutput { === Voucher Program === Type create to create a new voucher. Type list to list all vouchers. - Type blacklist to list customer in blacklist + Type blacklist to list blackCustomer in blacklist Type exit to exit the program. """; @@ -67,10 +67,10 @@ public void printCreateVoucherCompleteMessage() { printMessage(createVoucherComplete); } - public void printBlackList(List blackList) { + public void printBlackList(List blackList) { printMessage(showBlackList); - for(Customer customer : blackList) { - printlnMessage("customerId : " + customer.getCustomerId() + ", name : " + customer.getName() + ", age : " + customer.getAge()); + for(BlackCustomer blackCustomer : blackList) { + printlnMessage("customerId : " + blackCustomer.getCustomerId() + ", name : " + blackCustomer.getName() + ", age : " + blackCustomer.getAge()); } } From 3d36e808e9f333689c1bd90b6b1c28458b651533 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Tue, 24 Oct 2023 17:22:19 +0900 Subject: [PATCH 056/101] =?UTF-8?q?feat=20:=20customer=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application_log/application.log | 18 +++++++++++++++++- .../vouchermanagement/customer/Customer.java | 4 ++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/prgrms/vouchermanagement/customer/Customer.java diff --git a/application_log/application.log b/application_log/application.log index d698c3a246..3c43a8b3bd 100644 --- a/application_log/application.log +++ b/application_log/application.log @@ -9,6 +9,22 @@ java.lang.IllegalStateException: Failed to execute CommandLineRunner Caused by: org.prgrms.vouchermanagement.exception.InvalidInputException: 잘못된 command 입력입니다. at org.prgrms.vouchermanagement.view.ConsoleInput.validateAndConvertToCommand(ConsoleInput.java:35) at org.prgrms.vouchermanagement.view.ConsoleInput.commandInput(ConsoleInput.java:17) - at org.prgrms.vouchermanagement.Controller.run(Controller.java:32) + at org.prgrms.vouchermanagement.controller.Controller.run(Controller.java:32) + at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:774) + ... 5 common frames omitted +20231024 13:43:37.391 [main] ERROR [SpringApplication:827] - Application run failed +java.lang.IllegalStateException: Failed to execute CommandLineRunner + at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:777) + at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:758) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:322) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309) + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298) + at org.prgrms.vouchermanagement.VoucherManagementApplication.main(VoucherManagementApplication.java:9) +Caused by: org.prgrms.vouchermanagement.exception.InvalidRangeException: PercentDiscountPolicy는 0~100 사이의 값을 가져야 합니다. + at org.prgrms.vouchermanagement.voucher.PercentDiscountVoucher.(PercentDiscountVoucher.java:14) + at org.prgrms.vouchermanagement.service.VoucherService.getDiscountPolicy(VoucherService.java:36) + at org.prgrms.vouchermanagement.service.VoucherService.createVoucher(VoucherService.java:22) + at org.prgrms.vouchermanagement.controller.Controller.createVoucher(Controller.java:50) + at org.prgrms.vouchermanagement.controller.Controller.run(Controller.java:39) at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:774) ... 5 common frames omitted diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/Customer.java b/src/main/java/org/prgrms/vouchermanagement/customer/Customer.java new file mode 100644 index 0000000000..0bdd9aa70f --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/customer/Customer.java @@ -0,0 +1,4 @@ +package org.prgrms.vouchermanagement.customer; + +public class Customer { +} From 9b2b8ea810e100f5279581b40dc691eb7cdabc54 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Tue, 24 Oct 2023 17:33:28 +0900 Subject: [PATCH 057/101] =?UTF-8?q?feat=20:=20customers=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/customer/Customers.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/customer/Customers.java diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/Customers.java b/src/main/java/org/prgrms/vouchermanagement/customer/Customers.java new file mode 100644 index 0000000000..3790bd647a --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/customer/Customers.java @@ -0,0 +1,27 @@ +package org.prgrms.vouchermanagement.customer; + +import java.util.UUID; + +public class Customers { + private final UUID userId; + private final String userName; + private final UUID voucherId; + + public Customers(UUID userId, String userName, UUID voucherId) { + this.userId = userId; + this.userName = userName; + this.voucherId = voucherId; + } + + public UUID getUserId() { + return userId; + } + + public String getUserName() { + return userName; + } + + public UUID getVoucherId() { + return voucherId; + } +} From 8de670160fa35f0e297e0b936a26c83a681d1fe8 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Tue, 24 Oct 2023 23:56:19 +0900 Subject: [PATCH 058/101] =?UTF-8?q?feat=20:=20mysql=20=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B8=8C=EB=9F=AC=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index a3ea2b55ed..ef73d62fce 100644 --- a/build.gradle +++ b/build.gradle @@ -18,6 +18,8 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter' testImplementation 'org.springframework.boot:spring-boot-starter-test' + + implementation 'mysql:mysql-connector-java:8.0.28' } tasks.named('test') { From 18f69e4aa535a37038afea647b63a29ab68302ed Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:11:15 +0900 Subject: [PATCH 059/101] =?UTF-8?q?feat=20:=20database=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index d74c444c1c..a8f8642dc0 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,3 +1,11 @@ spring: profiles: - active: local + active: database + +--- +spring: + datasource: + url: jdbc:mysql://localhost/voucher_management + username: root + password: root1234! + driver-class-name: com.mysql.cj.jdbc.Driver From 8db2d817954795f31b9c671999ea67cf7bf0cef2 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:11:37 +0900 Subject: [PATCH 060/101] =?UTF-8?q?feat=20:=20jdbc=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index ef73d62fce..0874d6727a 100644 --- a/build.gradle +++ b/build.gradle @@ -19,6 +19,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter' testImplementation 'org.springframework.boot:spring-boot-starter-test' + implementation 'org.springframework.boot:spring-boot-starter-data-jdbc:' implementation 'mysql:mysql-connector-java:8.0.28' } From dfe216ea7fbee0d4b21ce2a12889491d8923e948 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:11:55 +0900 Subject: [PATCH 061/101] =?UTF-8?q?feat=20:=20wallet=20command=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/prgrms/vouchermanagement/view/Command.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/view/Command.java b/src/main/java/org/prgrms/vouchermanagement/view/Command.java index a77b6632d4..3f9d3e45da 100644 --- a/src/main/java/org/prgrms/vouchermanagement/view/Command.java +++ b/src/main/java/org/prgrms/vouchermanagement/view/Command.java @@ -1,8 +1,13 @@ package org.prgrms.vouchermanagement.view; public enum Command { - CREATE, // 바우처 생성 - LIST, // 바우처 리스트 + CREATE, // 바우처 생성, 지갑 생성 + LIST, // 바우처 리스트, 고객의 바우처 전부 출력 + CUSTOMER, //고객 리스트 BLACKLIST, // 블랙 리스트 + UPDATE, //바우처 업데이트 + DELETE, //바우처 전부 삭제, 지갑 삭제 + WALLET, // WALLET 메뉴로 이동 + FIND, // 바우처 id로 고객 찾기 EXIT // 종료 } From 3de24dd69da2e543c664c378ee43abd3dd17f81b Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:15:07 +0900 Subject: [PATCH 062/101] =?UTF-8?q?feat=20:=20wallet=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20=EC=9E=85=EC=B6=9C=EB=A0=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/view/ConsoleInput.java | 43 ++++++- .../vouchermanagement/view/ConsoleOutput.java | 112 ++++++++++++++++++ 2 files changed, 152 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleInput.java b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleInput.java index cb4f28d0c3..3ba68f8766 100644 --- a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleInput.java +++ b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleInput.java @@ -1,10 +1,13 @@ package org.prgrms.vouchermanagement.view; -import org.prgrms.vouchermanagement.dto.VoucherInfo; +import org.prgrms.vouchermanagement.dto.VoucherCreateInfo; +import org.prgrms.vouchermanagement.dto.VoucherUpdateInfo; +import org.prgrms.vouchermanagement.dto.WalletCreateInfo; import org.prgrms.vouchermanagement.exception.InvalidInputException; import org.prgrms.vouchermanagement.voucher.PolicyStatus; import java.util.Scanner; +import java.util.UUID; public class ConsoleInput { @@ -17,7 +20,7 @@ public Command commandInput() { return validateAndConvertToCommand(inputCommand); } - public VoucherInfo createVoucherInput() { + public VoucherCreateInfo createVoucherInput() { consoleOutput.getInput(); String inputPolicy = scanner.nextLine(); PolicyStatus policy = validateAndConvertPolicy(inputPolicy); @@ -25,7 +28,41 @@ public VoucherInfo createVoucherInput() { consoleOutput.getInput(); String inputAmountOrPercent = scanner.nextLine(); long amountOrPercent = validateAndConvertAmountOrPercent(inputAmountOrPercent); - return new VoucherInfo(policy, amountOrPercent); + return new VoucherCreateInfo(policy, amountOrPercent); + } + + public VoucherUpdateInfo updateVoucherInput() { + consoleOutput.getInput(); + UUID voucherId = UUID.fromString(scanner.nextLine()); + + consoleOutput.getInput(); + String inputAmountOrPercent = scanner.nextLine(); + long amountOrPercent = validateAndConvertAmountOrPercent(inputAmountOrPercent); + return new VoucherUpdateInfo(voucherId, amountOrPercent); + } + + public WalletCreateInfo createWalletInput() { + consoleOutput.getInput(); + UUID customerId = UUID.fromString(scanner.nextLine()); + + consoleOutput.getInput(); + UUID voucherId = UUID.fromString(scanner.nextLine()); + return new WalletCreateInfo(customerId, voucherId); + } + + public UUID findAllVouchersByCustomerId() { + consoleOutput.getInput(); + return UUID.fromString(scanner.nextLine()); + } + + public UUID deleteVoucherByCustomerId() { + consoleOutput.getInput(); + return UUID.fromString(scanner.nextLine()); + } + + public UUID findCustomerByVoucherId() { + consoleOutput.getInput(); + return UUID.fromString(scanner.nextLine()); } private Command validateAndConvertToCommand(String inputCommand) { diff --git a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java index 6fb659c92d..fa42b06a0a 100644 --- a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java +++ b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java @@ -1,6 +1,7 @@ package org.prgrms.vouchermanagement.view; import org.prgrms.vouchermanagement.blackCustomer.BlackCustomer; +import org.prgrms.vouchermanagement.customer.Customer; import org.prgrms.vouchermanagement.voucher.Voucher; import java.util.List; @@ -12,7 +13,11 @@ public class ConsoleOutput { === Voucher Program === Type create to create a new voucher. Type list to list all vouchers. + Type customer to list all customers Type blacklist to list blackCustomer in blacklist + Type update to update voucher amount or percent + Type delete to delete all vouchers + Type wallet is new wallet mode Type exit to exit the program. """; @@ -33,11 +38,75 @@ select policy(fixed, percent) === VOUCHER LISTS === """; + private static final String showCustomerList = """ + + === CUSTOMER LISTS === + """; + private static final String showBlackList = """ === CUSTOMER BLACKLIST === """; + private static final String updateVoucher = """ + + === VOUCHER UPDATE === + update amount or percent by voucherId + + input voucherId(UUID) + input amount or percent + """; + + private static final String updateVoucherComplete = """ + + === COMPLETE UPDATE VOUCHER === + """; + + private static final String deleteVoucher = """ + + === VOUCHER DELETE === + """; + + private static final String wallet = """ + + === WALLET PAGE === + Type create to create a new wallet + Type list to find all vouchers by customerId + Type delete to delete voucher by customerId + Type find to find customer by voucherId + Type exit to exit the program. + """; + + private static final String createWallet = """ + + == CREATE WALLET == + + input customerId(UUID) + input voucherId(UUID) + """; + + private static final String findVoucherWallet = """ + + == FIND ALL VOUCHERS BY CUSTOMER ID == + + input customerId(UUID) + """; + + private static final String deleteVoucherWallet = """ + + == DELETE VOUCHER BY CUSTOMER ID == + + input customerId(UUID) + """; + + private static final String findCustomerWallet = """ + + == FIND CUSTOMER BY VOUCHER ID + + input voucherId(UUID) + """; + + private static final String exit = """ === Bye Bye === @@ -67,6 +136,49 @@ public void printCreateVoucherCompleteMessage() { printMessage(createVoucherComplete); } + public void printUpdateVoucherMessage() { + printMessage(updateVoucher); + } + + public void printUpdateVoucherCompleteMessage() { + printMessage(updateVoucherComplete); + } + + public void printDeleteVoucherMessage() { + printMessage(deleteVoucher); + } + + public void printWalletMessage() { + printMessage(wallet); + } + + public void printCreateWalletMessage() { + printMessage(createWallet); + } + + public void printAllVouchersByCustomerId() { + printMessage(findVoucherWallet); + } + + public void printDeleteVoucherByCustomerId() { + printMessage(deleteVoucherWallet); + } + + public void printCustomerByVoucherId() { + printMessage(findCustomerWallet); + } + + public void printCustomerList(List customerList) { + printMessage(showCustomerList); + for (Customer customer : customerList) { + printlnMessage("customerId : " + customer.getUserId() + ", name : " + customer.getUserName() + ", age : " + customer.getUserAge()); + } + } + + public void printCustomer(Customer customer) { + printlnMessage("customerId : " + customer.getUserId() + ", name : " + customer.getUserName() + ", age : " + customer.getUserAge()); + } + public void printBlackList(List blackList) { printMessage(showBlackList); for(BlackCustomer blackCustomer : blackList) { From 3dabe080fff15d9b9e79fffa47737765681be84a Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:15:24 +0900 Subject: [PATCH 063/101] =?UTF-8?q?feat=20:=20customer=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/customer/Customer.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/Customer.java b/src/main/java/org/prgrms/vouchermanagement/customer/Customer.java index 0bdd9aa70f..5d92c03714 100644 --- a/src/main/java/org/prgrms/vouchermanagement/customer/Customer.java +++ b/src/main/java/org/prgrms/vouchermanagement/customer/Customer.java @@ -1,4 +1,27 @@ package org.prgrms.vouchermanagement.customer; +import java.util.UUID; + public class Customer { + private final UUID userId; + private final String userName; + private final int userAge; + + public Customer(UUID userId, String userName, int userAge) { + this.userId = userId; + this.userName = userName; + this.userAge = userAge; + } + + public UUID getUserId() { + return userId; + } + + public String getUserName() { + return userName; + } + + public int getUserAge() { + return userAge; + } } From ba6c4a94da3302e0f7d352e894637731d09707df Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:15:46 +0900 Subject: [PATCH 064/101] =?UTF-8?q?feat=20:=20wallet=20=EA=B4=80=EB=A0=A8?= =?UTF-8?q?=20controller=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/Controller.java | 79 ++++++++++++++++++- 1 file changed, 76 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java b/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java index e405619ecd..ba62ae580d 100644 --- a/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java +++ b/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java @@ -1,17 +1,23 @@ package org.prgrms.vouchermanagement.controller; -import org.prgrms.vouchermanagement.dto.VoucherInfo; +import org.prgrms.vouchermanagement.customer.Customer; +import org.prgrms.vouchermanagement.customer.CustomerService; +import org.prgrms.vouchermanagement.dto.VoucherCreateInfo; import org.prgrms.vouchermanagement.blackCustomer.BlackCustomer; import org.prgrms.vouchermanagement.blackCustomer.BlackCustomerService; +import org.prgrms.vouchermanagement.dto.VoucherUpdateInfo; +import org.prgrms.vouchermanagement.dto.WalletCreateInfo; import org.prgrms.vouchermanagement.service.VoucherService; import org.prgrms.vouchermanagement.view.Command; import org.prgrms.vouchermanagement.view.ConsoleInput; import org.prgrms.vouchermanagement.view.ConsoleOutput; import org.prgrms.vouchermanagement.voucher.Voucher; +import org.prgrms.vouchermanagement.wallet.WalletService; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; import java.util.List; +import java.util.UUID; @Component public class Controller implements CommandLineRunner { @@ -20,11 +26,15 @@ public class Controller implements CommandLineRunner { private final ConsoleOutput consoleOutput = new ConsoleOutput(); private final VoucherService voucherService; + private final CustomerService customerService; private final BlackCustomerService blackCustomerService; + private final WalletService walletService; - public Controller(VoucherService voucherService, BlackCustomerService blackCustomerService) { + public Controller(VoucherService voucherService, CustomerService customerService, BlackCustomerService blackCustomerService, WalletService walletService) { this.voucherService = voucherService; + this.customerService = customerService; this.blackCustomerService = blackCustomerService; + this.walletService = walletService; } @Override @@ -38,7 +48,11 @@ public void run(String... args) { switch (command) { case CREATE -> createVoucher(); case LIST -> voucherLists(); + case CUSTOMER -> showCustomerList(); case BLACKLIST -> showBlackList(); + case UPDATE -> updateVoucher(); + case DELETE -> deleteVoucher(); + case WALLET -> wallet(); case EXIT -> notExitCommand = exit(); } } @@ -46,7 +60,7 @@ public void run(String... args) { private void createVoucher() { consoleOutput.printCreateVoucherMessage(); - VoucherInfo voucherInput = consoleInput.createVoucherInput(); + VoucherCreateInfo voucherInput = consoleInput.createVoucherInput(); voucherService.createVoucher(voucherInput.policy(), voucherInput.amountOrPercent()); consoleOutput.printCreateVoucherCompleteMessage(); } @@ -56,11 +70,70 @@ private void voucherLists() { consoleOutput.printVouchers(vouchers); } + private void showCustomerList() { + List customerList = customerService.showCustomerList(); + consoleOutput.printCustomerList(customerList); + } + private void showBlackList() { List blackList = blackCustomerService.getBlackList(); consoleOutput.printBlackList(blackList); } + private void updateVoucher() { + consoleOutput.printUpdateVoucherMessage(); + VoucherUpdateInfo voucherUpdateInfo = consoleInput.updateVoucherInput(); + voucherService.updateVoucher(voucherUpdateInfo.voucherId(), voucherUpdateInfo.amountOrPercent()); + consoleOutput.printUpdateVoucherCompleteMessage(); + } + + private void deleteVoucher() { + consoleOutput.printDeleteVoucherMessage(); + voucherService.deleteVoucher(); + } + + private void wallet() { + boolean notExitCommand = true; + + while (notExitCommand) { + consoleOutput.printWalletMessage(); + Command command = consoleInput.commandInput(); + + switch (command) { + case CREATE -> createWallet(); + case LIST -> findVouchersByCustomerId(); + case DELETE -> deleteVoucherByCustomerId(); + case FIND -> findCustomerByVoucherId(); + case EXIT -> notExitCommand = exit(); + } + } + } + + private void createWallet() { + consoleOutput.printCreateWalletMessage(); + WalletCreateInfo walletCreateInfo = consoleInput.createWalletInput(); + walletService.create(walletCreateInfo); + } + + private void findVouchersByCustomerId() { + consoleOutput.printAllVouchersByCustomerId(); + UUID customerId = consoleInput.findAllVouchersByCustomerId(); + List voucherList = walletService.findVouchers(customerId); + consoleOutput.printVouchers(voucherList); + } + + private void deleteVoucherByCustomerId() { + consoleOutput.printDeleteVoucherByCustomerId(); + UUID customerId = consoleInput.deleteVoucherByCustomerId(); + walletService.delete(customerId); + } + + private void findCustomerByVoucherId() { + consoleOutput.printCustomerByVoucherId(); + UUID voucherId = consoleInput.findCustomerByVoucherId(); + consoleOutput.printCustomer(walletService.findCustomer(voucherId)); + } + private boolean exit() { consoleOutput.printExitMessage(); return false; From 34d97d665068beaed412f69edc50f2f6594f2a25 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:19:00 +0900 Subject: [PATCH 065/101] =?UTF-8?q?feat=20:=20wallet=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/wallet/Wallet.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/wallet/Wallet.java diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/Wallet.java b/src/main/java/org/prgrms/vouchermanagement/wallet/Wallet.java new file mode 100644 index 0000000000..61a5051cfe --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/wallet/Wallet.java @@ -0,0 +1,21 @@ +package org.prgrms.vouchermanagement.wallet; + +import java.util.UUID; + +public class Wallet { + private final UUID customerId; + private final UUID voucherId; + + public Wallet(UUID customerId, UUID voucherId) { + this.customerId = customerId; + this.voucherId = voucherId; + } + + public UUID getCustomerId() { + return customerId; + } + + public UUID getVoucherId() { + return voucherId; + } +} From 4efcbea968f2dcb2d5e8c8dd3580acb3eb8ba813 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:19:14 +0900 Subject: [PATCH 066/101] =?UTF-8?q?feat=20:=20wallet=20repository=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wallet/WalletRepository.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/wallet/WalletRepository.java diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/WalletRepository.java b/src/main/java/org/prgrms/vouchermanagement/wallet/WalletRepository.java new file mode 100644 index 0000000000..163da0a66c --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/wallet/WalletRepository.java @@ -0,0 +1,19 @@ +package org.prgrms.vouchermanagement.wallet; + +import org.prgrms.vouchermanagement.customer.Customer; +import org.prgrms.vouchermanagement.dto.WalletCreateInfo; +import org.prgrms.vouchermanagement.voucher.Voucher; + +import java.util.List; +import java.util.UUID; + +public interface WalletRepository { + + int create(WalletCreateInfo walletCreateInfo); + + List findVouchers(UUID customerId); + + int delete(UUID customerId); + + Customer findCustomer(UUID voucherId); +} From f97029bd84dbe3d8b202753d58e0fdc0eba73da9 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:19:28 +0900 Subject: [PATCH 067/101] =?UTF-8?q?feat=20:=20wallet=20service=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wallet/WalletService.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/wallet/WalletService.java diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/WalletService.java b/src/main/java/org/prgrms/vouchermanagement/wallet/WalletService.java new file mode 100644 index 0000000000..b69335b72d --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/wallet/WalletService.java @@ -0,0 +1,36 @@ +package org.prgrms.vouchermanagement.wallet; + +import org.prgrms.vouchermanagement.customer.Customer; +import org.prgrms.vouchermanagement.dto.WalletCreateInfo; +import org.prgrms.vouchermanagement.voucher.Voucher; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.UUID; + +@Service +public class WalletService { + + private final WalletRepository walletRepository; + + public WalletService(WalletRepository walletRepository) { + this.walletRepository = walletRepository; + } + + public void create(WalletCreateInfo walletCreateInfo) { + walletRepository.create(walletCreateInfo); + } + + + public List findVouchers(UUID customerId) { + return walletRepository.findVouchers(customerId); + } + + public void delete(UUID customerId) { + walletRepository.delete(customerId); + } + + public Customer findCustomer(UUID voucherId) { + return walletRepository.findCustomer(voucherId); + } +} From 49838c31099010d2d1fa9a7479212bb41f1fa68e Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:19:56 +0900 Subject: [PATCH 068/101] =?UTF-8?q?feat=20:=20wallet=20repository=20databa?= =?UTF-8?q?se=20=EA=B5=AC=ED=98=84=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wallet/WalletDbRepository.java | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/wallet/WalletDbRepository.java diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/WalletDbRepository.java b/src/main/java/org/prgrms/vouchermanagement/wallet/WalletDbRepository.java new file mode 100644 index 0000000000..d849056cf0 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/wallet/WalletDbRepository.java @@ -0,0 +1,107 @@ +package org.prgrms.vouchermanagement.wallet; + +import org.prgrms.vouchermanagement.customer.Customer; +import org.prgrms.vouchermanagement.dto.WalletCreateInfo; +import org.prgrms.vouchermanagement.voucher.*; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + +import java.nio.ByteBuffer; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; +import java.util.UUID; + +@Repository +public class WalletDbRepository implements WalletRepository{ + + private final String CREATE = "INSERT INTO wallet(customer_id, voucher_id) VALUES(UUID_TO_BIN(?), UUID_TO_BIN(?))"; + private final String FINDVOUCHERS = "select v.voucher_id, v.discount_policy, v.amount FROM voucher v JOIN wallet w ON v.voucher_id = w.voucher_id WHERE w.customer_id = UUID_TO_BIN(?)"; + private final String DELETE = "DELETE FROM wallet WHERE customer_id = UUID_TO_BIN(?)"; + private final String FINDCUSTOMER = "SELECT c.customer_id, c.customer_name, c.customer_age FROM wallet w, customer c WHERE w.customer_id = c.customer_id AND w.voucher_id = UUID_TO_BIN(?)"; + + /* + + SELECT v.voucher_id, v.discount_policy, v.amount + FROM wallet w, voucher v + WHERE w.voucher_id = v.voucher_id and w.customer_id = UUID_TO_BIN(?) + + SELECT c.customer_id, c.customer_name, c.customer_age + FROM wallet w, customer c + WERE w.customer_id = c.customer_id AND w.voucher_id = UUID_TO_BIN(?) + + select v.voucher_id, v.discount_policy, v.amount FROM voucher v JOIN wallet w ON v.voucher_id = w.voucher_id + + */ + + private final JdbcTemplate jdbcTemplate; + + public WalletDbRepository(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + @Override + public int create(WalletCreateInfo walletCreateInfo) { + UUID customerId = walletCreateInfo.customerId(); + UUID voucherId = walletCreateInfo.voucherId(); + + return jdbcTemplate.update(CREATE, customerId.toString().getBytes(), voucherId.toString().getBytes()); + } + + @Override + public List findVouchers(UUID customerId) { + return jdbcTemplate.query(FINDVOUCHERS, new Object[]{customerId.toString().getBytes()}, new VoucherRowMapper()); + } + + @Override + public int delete(UUID customerId) { + return jdbcTemplate.update(DELETE, customerId.toString().getBytes()); + } + + @Override + public Customer findCustomer(UUID voucherId) { + return jdbcTemplate.query(FINDCUSTOMER, new Object[]{voucherId.toString().getBytes()}, new CustomerRowMapper()).get(0); + } + + private class VoucherRowMapper implements RowMapper { + @Override + public Voucher mapRow(ResultSet resultSet, int rowNum) throws SQLException { + UUID voucherId = toUUID(resultSet.getBytes("voucher_id")); + PolicyStatus policy = PolicyStatus.valueOf(resultSet.getString("discount_policy").toUpperCase()); + long amountOrPercent = resultSet.getLong("amount"); + + DiscountPolicy discountPolicy = getPolicy(policy, amountOrPercent); + + return new Voucher(voucherId, discountPolicy); + } + } + + private class CustomerRowMapper implements RowMapper { + @Override + public Customer mapRow(ResultSet resultSet, int rowNum) throws SQLException { + UUID customerId = toUUID(resultSet.getBytes("customer_id")); + String customerName = resultSet.getString("customer_name"); + int customerAge = resultSet.getInt("customer_age"); + + return new Customer(customerId, customerName, customerAge); + } + } + + private DiscountPolicy getPolicy(PolicyStatus policy, long amountOrPercent) { + DiscountPolicy discountPolicy = null; + + if (policy == PolicyStatus.FIXED) { + discountPolicy = new FixedAmountVoucher(amountOrPercent); + } else if (policy == PolicyStatus.PERCENT) { + discountPolicy = new PercentDiscountVoucher(amountOrPercent); + } + + return discountPolicy; + } + + private UUID toUUID(byte[] bytes) { + ByteBuffer wrap = ByteBuffer.wrap(bytes); + return new UUID(wrap.getLong(), wrap.getLong()); + } +} From 321c3f22f797285f9940f8e9c7e38bef7d0368d6 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:20:47 +0900 Subject: [PATCH 069/101] =?UTF-8?q?feat=20:=20wallet=20dto=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prgrms/vouchermanagement/dto/WalletCreateInfo.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/dto/WalletCreateInfo.java diff --git a/src/main/java/org/prgrms/vouchermanagement/dto/WalletCreateInfo.java b/src/main/java/org/prgrms/vouchermanagement/dto/WalletCreateInfo.java new file mode 100644 index 0000000000..4783fa3b4b --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/dto/WalletCreateInfo.java @@ -0,0 +1,8 @@ +package org.prgrms.vouchermanagement.dto; + +import java.util.UUID; + +public record WalletCreateInfo ( + UUID customerId, + UUID voucherId +) {} From ced50c37273d71b70bd5fb908270db2d76d25c67 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:21:06 +0900 Subject: [PATCH 070/101] =?UTF-8?q?feat=20:=20voucher=20dto=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prgrms/vouchermanagement/dto/VoucherUpdateInfo.java | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/dto/VoucherUpdateInfo.java diff --git a/src/main/java/org/prgrms/vouchermanagement/dto/VoucherUpdateInfo.java b/src/main/java/org/prgrms/vouchermanagement/dto/VoucherUpdateInfo.java new file mode 100644 index 0000000000..2e71792414 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/dto/VoucherUpdateInfo.java @@ -0,0 +1,8 @@ +package org.prgrms.vouchermanagement.dto; + +import java.util.UUID; + +public record VoucherUpdateInfo ( + UUID voucherId, + long amountOrPercent +) { } From 76fbde373754836a8c3c17e59763f6377812da74 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:21:37 +0900 Subject: [PATCH 071/101] =?UTF-8?q?feat=20:=20voucher=20service=20update,?= =?UTF-8?q?=20delete=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/service/VoucherService.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/service/VoucherService.java b/src/main/java/org/prgrms/vouchermanagement/service/VoucherService.java index 896c00d840..02e5a907bd 100644 --- a/src/main/java/org/prgrms/vouchermanagement/service/VoucherService.java +++ b/src/main/java/org/prgrms/vouchermanagement/service/VoucherService.java @@ -28,7 +28,17 @@ public List voucherLists() { return voucherRepository.voucherLists(); } - private static DiscountPolicy getDiscountPolicy(PolicyStatus policy, long amountOrPercent) { + public void updateVoucher(UUID voucherId, long amountOrPercent) { + voucherRepository.update(voucherId, amountOrPercent); + } + + public void deleteVoucher() { + voucherRepository.deleteAll(); + } + + + + private DiscountPolicy getDiscountPolicy(PolicyStatus policy, long amountOrPercent) { DiscountPolicy discountPolicy = null; if (policy == PolicyStatus.FIXED) { discountPolicy = new FixedAmountVoucher(amountOrPercent); From 9bf05427352a12f62844d5b60318ca8e6cac30df Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:22:04 +0900 Subject: [PATCH 072/101] Refactor : VoucherInfo -> VoucherCreateInfo --- .../dto/{VoucherInfo.java => VoucherCreateInfo.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/org/prgrms/vouchermanagement/dto/{VoucherInfo.java => VoucherCreateInfo.java} (83%) diff --git a/src/main/java/org/prgrms/vouchermanagement/dto/VoucherInfo.java b/src/main/java/org/prgrms/vouchermanagement/dto/VoucherCreateInfo.java similarity index 83% rename from src/main/java/org/prgrms/vouchermanagement/dto/VoucherInfo.java rename to src/main/java/org/prgrms/vouchermanagement/dto/VoucherCreateInfo.java index 3a02e43c0d..49634d79ae 100644 --- a/src/main/java/org/prgrms/vouchermanagement/dto/VoucherInfo.java +++ b/src/main/java/org/prgrms/vouchermanagement/dto/VoucherCreateInfo.java @@ -2,7 +2,7 @@ import org.prgrms.vouchermanagement.voucher.PolicyStatus; -public record VoucherInfo( +public record VoucherCreateInfo( PolicyStatus policy, long amountOrPercent ) { } From 9033a91293ffd67efce44a0cdca618795bf56f11 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:22:40 +0900 Subject: [PATCH 073/101] =?UTF-8?q?feat=20:=20update,=20delete=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/FileRepository.java | 22 ++++++++++++++----- .../repository/MemoryRepository.java | 22 ++++++++++++++----- .../repository/VoucherRepository.java | 10 ++++++--- 3 files changed, 41 insertions(+), 13 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java b/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java index 419d18d812..cb2160b645 100644 --- a/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java @@ -46,7 +46,7 @@ public FileRepository() { } @Override - public void create(UUID voucherId, DiscountPolicy discountPolicy) { + public int create(UUID voucherId, DiscountPolicy discountPolicy) { long amountOrPercent = discountPolicy.getAmountOrPercent(); PolicyStatus policy = discountPolicy.getPolicyStatus(); @@ -60,11 +60,8 @@ public void create(UUID voucherId, DiscountPolicy discountPolicy) { Voucher voucher = new Voucher(voucherId, discountPolicy); storage.put(voucherId, voucher); - } - @Override - public Voucher getById(UUID voucherId) { - return storage.get(voucherId); + return 0; } @Override @@ -72,4 +69,19 @@ public List voucherLists() { return storage.values().stream() .toList(); } + + @Override + public void update(UUID voucherId, long amount) { + } + + @Override + public int deleteAll() { + + return 0; + } + + @Override + public Voucher getById(UUID voucherId) { + return storage.get(voucherId); + } } diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java b/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java index ee58c49211..8d0d2187cc 100644 --- a/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java @@ -16,14 +16,11 @@ public class MemoryRepository implements VoucherRepository{ private final Map storage = new ConcurrentHashMap<>(); @Override - public void create(UUID voucherId, DiscountPolicy discountPolicy) { + public int create(UUID voucherId, DiscountPolicy discountPolicy) { Voucher voucher = new Voucher(voucherId, discountPolicy); storage.put(voucherId, voucher); - } - @Override - public Voucher getById(UUID voucherId) { - return storage.get(voucherId); + return 0; } @Override @@ -31,4 +28,19 @@ public List voucherLists() { return storage.values().stream() .toList(); } + + @Override + public void update(UUID voucherId, long amount) { + } + + @Override + public int deleteAll() { + + return 0; + } + + @Override + public Voucher getById(UUID voucherId) { + return storage.get(voucherId); + } } diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java b/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java index 5ab3db0e6e..9eba06a262 100644 --- a/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java @@ -7,9 +7,13 @@ import java.util.UUID; public interface VoucherRepository { - void create(UUID voucherId, DiscountPolicy discountPolicy); - - Voucher getById(UUID voucherId); + int create(UUID voucherId, DiscountPolicy discountPolicy); List voucherLists(); + + void update(UUID voucherId, long amount); + + int deleteAll(); + + Voucher getById(UUID voucherId); } From fb776c1803ebb48f2262e24fb65ca82e651804d6 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:23:10 +0900 Subject: [PATCH 074/101] =?UTF-8?q?feat=20:=20jdbcTemplate=EB=A5=BC=20?= =?UTF-8?q?=EC=9D=B4=EC=9A=A9=ED=95=9C=20repository=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/DatabaseRepository.java | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/repository/DatabaseRepository.java diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/DatabaseRepository.java b/src/main/java/org/prgrms/vouchermanagement/repository/DatabaseRepository.java new file mode 100644 index 0000000000..e2c77cf671 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/repository/DatabaseRepository.java @@ -0,0 +1,119 @@ +package org.prgrms.vouchermanagement.repository; + +import org.prgrms.vouchermanagement.voucher.*; +import org.springframework.context.annotation.Profile; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + +import java.nio.ByteBuffer; +import java.sql.*; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +@Repository +@Profile("database") +public class DatabaseRepository implements VoucherRepository { + + private final String LOAD = "SELECT voucher_id, discount_policy, amount FROM voucher"; + private final String CREATE = "INSERT INTO voucher(voucher_id, discount_policy, amount) VALUES(UUID_TO_BIN(?), (?), (?))"; + private final String UPDATE_AMOUNT_BY_ID = "UPDATE voucher SET amount = ? WHERE voucher_id = UUID_TO_BIN(?)"; + private final String DELETE_BY_ID = "DELETE FROM voucher"; + + private final Map storage = new ConcurrentHashMap<>(); + private final JdbcTemplate jdbcTemplate; + + public DatabaseRepository(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + + load(); + } + + //create + @Override + public int create(UUID voucherId, DiscountPolicy discountPolicy) { + String policy = String.valueOf(discountPolicy.getPolicyStatus()); + long amount = discountPolicy.getAmountOrPercent(); + + int rowsAffected = jdbcTemplate.update(CREATE, voucherId.toString().getBytes(), policy, amount); + + Voucher voucher = new Voucher(voucherId, discountPolicy); + storage.put(voucherId, voucher); + + return rowsAffected; + } + + //read + @Override + public List voucherLists() { + return storage.values().stream() + .toList(); + } + + //update + public void update(UUID voucherId, long amountOrPercent) { + jdbcTemplate.update(UPDATE_AMOUNT_BY_ID, amountOrPercent, voucherId.toString().getBytes()); + + Voucher findVoucher = storage.get(voucherId); + PolicyStatus policy = findVoucher.getDiscountPolicy().getPolicyStatus(); + + DiscountPolicy discountPolicy = getPolicy(policy, amountOrPercent); + + Voucher updateVoucher = new Voucher(voucherId, discountPolicy); + storage.put(voucherId, updateVoucher); + } + + //delete + @Override + public int deleteAll() { + int rowsAffected = jdbcTemplate.update(DELETE_BY_ID); + storage.clear(); + return rowsAffected; + } + + @Override + public Voucher getById(UUID voucherId) { + return storage.get(voucherId); + } + + private void load() { + List vouchers = jdbcTemplate.query(LOAD, new VoucherRowMapper()); + for (Voucher voucher : vouchers) { + storage.put(voucher.getVoucherId(), voucher); + } + } + + //load 역할 + //static -> toUUID때문에 x + private class VoucherRowMapper implements RowMapper { + @Override + public Voucher mapRow(ResultSet resultSet, int rowNum) throws SQLException { + UUID voucherId = toUUID(resultSet.getBytes("voucher_id")); + PolicyStatus policy = PolicyStatus.valueOf(resultSet.getString("discount_policy").toUpperCase()); + long amountOrPercent = resultSet.getLong("amount"); + + DiscountPolicy discountPolicy = getPolicy(policy, amountOrPercent); + + return new Voucher(voucherId, discountPolicy); + } + } + + private DiscountPolicy getPolicy(PolicyStatus policy, long amountOrPercent) { + DiscountPolicy discountPolicy = null; + + if (policy == PolicyStatus.FIXED) { + discountPolicy = new FixedAmountVoucher(amountOrPercent); + } else if (policy == PolicyStatus.PERCENT) { + discountPolicy = new PercentDiscountVoucher(amountOrPercent); + } + + return discountPolicy; + } + + private UUID toUUID(byte[] bytes) { + ByteBuffer wrap = ByteBuffer.wrap(bytes); + return new UUID(wrap.getLong(), wrap.getLong()); + } +} From c80a25b48d3936d05bb6b210dc409a805296be3c Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:28:23 +0900 Subject: [PATCH 075/101] =?UTF-8?q?Refactor=20:=20record=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/customer/Customers.java | 27 ------------------- 1 file changed, 27 deletions(-) delete mode 100644 src/main/java/org/prgrms/vouchermanagement/customer/Customers.java diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/Customers.java b/src/main/java/org/prgrms/vouchermanagement/customer/Customers.java deleted file mode 100644 index 3790bd647a..0000000000 --- a/src/main/java/org/prgrms/vouchermanagement/customer/Customers.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.prgrms.vouchermanagement.customer; - -import java.util.UUID; - -public class Customers { - private final UUID userId; - private final String userName; - private final UUID voucherId; - - public Customers(UUID userId, String userName, UUID voucherId) { - this.userId = userId; - this.userName = userName; - this.voucherId = voucherId; - } - - public UUID getUserId() { - return userId; - } - - public String getUserName() { - return userName; - } - - public UUID getVoucherId() { - return voucherId; - } -} From e5357db48635bbcd1313d6b54b28e13ba3084225 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:28:40 +0900 Subject: [PATCH 076/101] =?UTF-8?q?feat=20:=20customer=20service=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../customer/CustomerService.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/customer/CustomerService.java diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/CustomerService.java b/src/main/java/org/prgrms/vouchermanagement/customer/CustomerService.java new file mode 100644 index 0000000000..4716d62b28 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/customer/CustomerService.java @@ -0,0 +1,19 @@ +package org.prgrms.vouchermanagement.customer; + +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class CustomerService { + + private final CustomerRepository customerRepository; + + public CustomerService(CustomerRepository customerRepository) { + this.customerRepository = customerRepository; + } + + public List showCustomerList() { + return customerRepository.showCustomerList(); + } +} From 7f0f3c8bb3a5b9cfc1e07e47cd6625b673d6f8fb Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:29:23 +0900 Subject: [PATCH 077/101] =?UTF-8?q?feat=20:=20customer=20repository=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/customer/CustomerRepository.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/customer/CustomerRepository.java diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/CustomerRepository.java b/src/main/java/org/prgrms/vouchermanagement/customer/CustomerRepository.java new file mode 100644 index 0000000000..83677b54b7 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/customer/CustomerRepository.java @@ -0,0 +1,9 @@ +package org.prgrms.vouchermanagement.customer; + +import java.util.List; + +public interface CustomerRepository { + + List showCustomerList(); + +} From 8aa36c7c6b78f042e710526437160b1f015e9136 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:29:32 +0900 Subject: [PATCH 078/101] =?UTF-8?q?feat=20:=20customer=20repository=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../customer/CustomerDbRepository.java | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/customer/CustomerDbRepository.java diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/CustomerDbRepository.java b/src/main/java/org/prgrms/vouchermanagement/customer/CustomerDbRepository.java new file mode 100644 index 0000000000..7ebbd9090e --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/customer/CustomerDbRepository.java @@ -0,0 +1,56 @@ +package org.prgrms.vouchermanagement.customer; + +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + +import java.nio.ByteBuffer; +import java.sql.*; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +@Repository +public class CustomerDbRepository implements CustomerRepository{ + + private final String LOAD = "SELECT customer_id, customer_name, customer_age FROM customer"; + + private final Map storage = new ConcurrentHashMap<>(); + private final JdbcTemplate jdbcTemplate; + + public CustomerDbRepository(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } + + @Override + public List showCustomerList() { + load(); + + return storage.values().stream() + .toList(); + } + + private void load() { + List customers = jdbcTemplate.query(LOAD, new CustomerDbRepository.CustomerRowMapper()); + for (Customer customer : customers) { + storage.put(customer.getUserId(), customer); + } + } + + private class CustomerRowMapper implements RowMapper { + @Override + public Customer mapRow(ResultSet resultSet, int rowNum) throws SQLException { + UUID customerId = toUUID(resultSet.getBytes("customer_id")); + String customerName = resultSet.getString("customer_name"); + int customerAge = resultSet.getInt("customer_age"); + + return new Customer(customerId, customerName, customerAge); + } + } + + private UUID toUUID(byte[] bytes) { + ByteBuffer wrap = ByteBuffer.wrap(bytes); + return new UUID(wrap.getLong(), wrap.getLong()); + } +} From e2bffff4b82758a4036d9e556ef7128a70249567 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 26 Oct 2023 19:36:28 +0900 Subject: [PATCH 079/101] =?UTF-8?q?Refactor=20:=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD=20->=20domain=20?= =?UTF-8?q?=EC=9C=84=EC=A3=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blackCustomer/{ => domain}/BlackCustomer.java | 2 +- .../{ => repository}/BlackCustomerRepository.java | 3 ++- .../{ => service}/BlackCustomerService.java | 4 +++- .../vouchermanagement/controller/Controller.java | 14 +++++++------- .../customer/CustomerRepository.java | 9 --------- .../customer/{ => domain}/Customer.java | 2 +- .../{ => repository}/CustomerDbRepository.java | 3 ++- .../customer/repository/CustomerRepository.java | 11 +++++++++++ .../customer/{ => service}/CustomerService.java | 4 +++- .../vouchermanagement/dto/VoucherCreateInfo.java | 2 +- .../vouchermanagement/view/ConsoleInput.java | 2 +- .../vouchermanagement/view/ConsoleOutput.java | 6 +++--- .../voucher/{ => domain}/Voucher.java | 4 +++- .../voucher/{ => policy}/DiscountPolicy.java | 2 +- .../voucher/{ => policy}/FixedAmountVoucher.java | 2 +- .../{ => policy}/PercentDiscountVoucher.java | 2 +- .../voucher/{ => policy}/PolicyStatus.java | 2 +- .../repository/DatabaseRepository.java | 8 ++++++-- .../{ => voucher}/repository/FileRepository.java | 8 ++++++-- .../{ => voucher}/repository/MemoryRepository.java | 5 +++-- .../repository/VoucherRepository.java | 6 +++--- .../{ => voucher}/service/VoucherService.java | 12 ++++++++---- .../wallet/{ => domain}/Wallet.java | 2 +- .../{ => repository}/WalletDbRepository.java | 10 +++++++--- .../wallet/{ => repository}/WalletRepository.java | 6 +++--- .../wallet/{ => service}/WalletService.java | 7 ++++--- 26 files changed, 83 insertions(+), 55 deletions(-) rename src/main/java/org/prgrms/vouchermanagement/blackCustomer/{ => domain}/BlackCustomer.java (89%) rename src/main/java/org/prgrms/vouchermanagement/blackCustomer/{ => repository}/BlackCustomerRepository.java (90%) rename src/main/java/org/prgrms/vouchermanagement/blackCustomer/{ => service}/BlackCustomerService.java (67%) delete mode 100644 src/main/java/org/prgrms/vouchermanagement/customer/CustomerRepository.java rename src/main/java/org/prgrms/vouchermanagement/customer/{ => domain}/Customer.java (90%) rename src/main/java/org/prgrms/vouchermanagement/customer/{ => repository}/CustomerDbRepository.java (93%) create mode 100644 src/main/java/org/prgrms/vouchermanagement/customer/repository/CustomerRepository.java rename src/main/java/org/prgrms/vouchermanagement/customer/{ => service}/CustomerService.java (67%) rename src/main/java/org/prgrms/vouchermanagement/voucher/{ => domain}/Voucher.java (78%) rename src/main/java/org/prgrms/vouchermanagement/voucher/{ => policy}/DiscountPolicy.java (72%) rename src/main/java/org/prgrms/vouchermanagement/voucher/{ => policy}/FixedAmountVoucher.java (90%) rename src/main/java/org/prgrms/vouchermanagement/voucher/{ => policy}/PercentDiscountVoucher.java (93%) rename src/main/java/org/prgrms/vouchermanagement/voucher/{ => policy}/PolicyStatus.java (58%) rename src/main/java/org/prgrms/vouchermanagement/{ => voucher}/repository/DatabaseRepository.java (90%) rename src/main/java/org/prgrms/vouchermanagement/{ => voucher}/repository/FileRepository.java (87%) rename src/main/java/org/prgrms/vouchermanagement/{ => voucher}/repository/MemoryRepository.java (84%) rename src/main/java/org/prgrms/vouchermanagement/{ => voucher}/repository/VoucherRepository.java (61%) rename src/main/java/org/prgrms/vouchermanagement/{ => voucher}/service/VoucherService.java (74%) rename src/main/java/org/prgrms/vouchermanagement/wallet/{ => domain}/Wallet.java (88%) rename src/main/java/org/prgrms/vouchermanagement/wallet/{ => repository}/WalletDbRepository.java (89%) rename src/main/java/org/prgrms/vouchermanagement/wallet/{ => repository}/WalletRepository.java (64%) rename src/main/java/org/prgrms/vouchermanagement/wallet/{ => service}/WalletService.java (76%) diff --git a/src/main/java/org/prgrms/vouchermanagement/blackCustomer/BlackCustomer.java b/src/main/java/org/prgrms/vouchermanagement/blackCustomer/domain/BlackCustomer.java similarity index 89% rename from src/main/java/org/prgrms/vouchermanagement/blackCustomer/BlackCustomer.java rename to src/main/java/org/prgrms/vouchermanagement/blackCustomer/domain/BlackCustomer.java index cf6aa51698..927cb49336 100644 --- a/src/main/java/org/prgrms/vouchermanagement/blackCustomer/BlackCustomer.java +++ b/src/main/java/org/prgrms/vouchermanagement/blackCustomer/domain/BlackCustomer.java @@ -1,4 +1,4 @@ -package org.prgrms.vouchermanagement.blackCustomer; +package org.prgrms.vouchermanagement.blackCustomer.domain; import java.util.UUID; diff --git a/src/main/java/org/prgrms/vouchermanagement/blackCustomer/BlackCustomerRepository.java b/src/main/java/org/prgrms/vouchermanagement/blackCustomer/repository/BlackCustomerRepository.java similarity index 90% rename from src/main/java/org/prgrms/vouchermanagement/blackCustomer/BlackCustomerRepository.java rename to src/main/java/org/prgrms/vouchermanagement/blackCustomer/repository/BlackCustomerRepository.java index 8c8a59c18d..9b26e75ba2 100644 --- a/src/main/java/org/prgrms/vouchermanagement/blackCustomer/BlackCustomerRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/blackCustomer/repository/BlackCustomerRepository.java @@ -1,5 +1,6 @@ -package org.prgrms.vouchermanagement.blackCustomer; +package org.prgrms.vouchermanagement.blackCustomer.repository; +import org.prgrms.vouchermanagement.blackCustomer.domain.BlackCustomer; import org.prgrms.vouchermanagement.exception.LoadFailException; import org.springframework.stereotype.Repository; diff --git a/src/main/java/org/prgrms/vouchermanagement/blackCustomer/BlackCustomerService.java b/src/main/java/org/prgrms/vouchermanagement/blackCustomer/service/BlackCustomerService.java similarity index 67% rename from src/main/java/org/prgrms/vouchermanagement/blackCustomer/BlackCustomerService.java rename to src/main/java/org/prgrms/vouchermanagement/blackCustomer/service/BlackCustomerService.java index 68272a6b68..22bd7171c2 100644 --- a/src/main/java/org/prgrms/vouchermanagement/blackCustomer/BlackCustomerService.java +++ b/src/main/java/org/prgrms/vouchermanagement/blackCustomer/service/BlackCustomerService.java @@ -1,5 +1,7 @@ -package org.prgrms.vouchermanagement.blackCustomer; +package org.prgrms.vouchermanagement.blackCustomer.service; +import org.prgrms.vouchermanagement.blackCustomer.domain.BlackCustomer; +import org.prgrms.vouchermanagement.blackCustomer.repository.BlackCustomerRepository; import org.springframework.stereotype.Service; import java.util.List; diff --git a/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java b/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java index ba62ae580d..5d1096f0b2 100644 --- a/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java +++ b/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java @@ -1,18 +1,18 @@ package org.prgrms.vouchermanagement.controller; -import org.prgrms.vouchermanagement.customer.Customer; -import org.prgrms.vouchermanagement.customer.CustomerService; +import org.prgrms.vouchermanagement.customer.domain.Customer; +import org.prgrms.vouchermanagement.customer.service.CustomerService; import org.prgrms.vouchermanagement.dto.VoucherCreateInfo; -import org.prgrms.vouchermanagement.blackCustomer.BlackCustomer; -import org.prgrms.vouchermanagement.blackCustomer.BlackCustomerService; +import org.prgrms.vouchermanagement.blackCustomer.domain.BlackCustomer; +import org.prgrms.vouchermanagement.blackCustomer.service.BlackCustomerService; import org.prgrms.vouchermanagement.dto.VoucherUpdateInfo; import org.prgrms.vouchermanagement.dto.WalletCreateInfo; -import org.prgrms.vouchermanagement.service.VoucherService; +import org.prgrms.vouchermanagement.voucher.service.VoucherService; import org.prgrms.vouchermanagement.view.Command; import org.prgrms.vouchermanagement.view.ConsoleInput; import org.prgrms.vouchermanagement.view.ConsoleOutput; -import org.prgrms.vouchermanagement.voucher.Voucher; -import org.prgrms.vouchermanagement.wallet.WalletService; +import org.prgrms.vouchermanagement.voucher.domain.Voucher; +import org.prgrms.vouchermanagement.wallet.service.WalletService; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/CustomerRepository.java b/src/main/java/org/prgrms/vouchermanagement/customer/CustomerRepository.java deleted file mode 100644 index 83677b54b7..0000000000 --- a/src/main/java/org/prgrms/vouchermanagement/customer/CustomerRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.prgrms.vouchermanagement.customer; - -import java.util.List; - -public interface CustomerRepository { - - List showCustomerList(); - -} diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/Customer.java b/src/main/java/org/prgrms/vouchermanagement/customer/domain/Customer.java similarity index 90% rename from src/main/java/org/prgrms/vouchermanagement/customer/Customer.java rename to src/main/java/org/prgrms/vouchermanagement/customer/domain/Customer.java index 5d92c03714..03e38a0ef9 100644 --- a/src/main/java/org/prgrms/vouchermanagement/customer/Customer.java +++ b/src/main/java/org/prgrms/vouchermanagement/customer/domain/Customer.java @@ -1,4 +1,4 @@ -package org.prgrms.vouchermanagement.customer; +package org.prgrms.vouchermanagement.customer.domain; import java.util.UUID; diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/CustomerDbRepository.java b/src/main/java/org/prgrms/vouchermanagement/customer/repository/CustomerDbRepository.java similarity index 93% rename from src/main/java/org/prgrms/vouchermanagement/customer/CustomerDbRepository.java rename to src/main/java/org/prgrms/vouchermanagement/customer/repository/CustomerDbRepository.java index 7ebbd9090e..9fecf64f5f 100644 --- a/src/main/java/org/prgrms/vouchermanagement/customer/CustomerDbRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/customer/repository/CustomerDbRepository.java @@ -1,5 +1,6 @@ -package org.prgrms.vouchermanagement.customer; +package org.prgrms.vouchermanagement.customer.repository; +import org.prgrms.vouchermanagement.customer.domain.Customer; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/repository/CustomerRepository.java b/src/main/java/org/prgrms/vouchermanagement/customer/repository/CustomerRepository.java new file mode 100644 index 0000000000..3a76fe3f31 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/customer/repository/CustomerRepository.java @@ -0,0 +1,11 @@ +package org.prgrms.vouchermanagement.customer.repository; + +import org.prgrms.vouchermanagement.customer.domain.Customer; + +import java.util.List; + +public interface CustomerRepository { + + List showCustomerList(); + +} diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/CustomerService.java b/src/main/java/org/prgrms/vouchermanagement/customer/service/CustomerService.java similarity index 67% rename from src/main/java/org/prgrms/vouchermanagement/customer/CustomerService.java rename to src/main/java/org/prgrms/vouchermanagement/customer/service/CustomerService.java index 4716d62b28..57255ba145 100644 --- a/src/main/java/org/prgrms/vouchermanagement/customer/CustomerService.java +++ b/src/main/java/org/prgrms/vouchermanagement/customer/service/CustomerService.java @@ -1,5 +1,7 @@ -package org.prgrms.vouchermanagement.customer; +package org.prgrms.vouchermanagement.customer.service; +import org.prgrms.vouchermanagement.customer.domain.Customer; +import org.prgrms.vouchermanagement.customer.repository.CustomerRepository; import org.springframework.stereotype.Service; import java.util.List; diff --git a/src/main/java/org/prgrms/vouchermanagement/dto/VoucherCreateInfo.java b/src/main/java/org/prgrms/vouchermanagement/dto/VoucherCreateInfo.java index 49634d79ae..bc8dfecbe2 100644 --- a/src/main/java/org/prgrms/vouchermanagement/dto/VoucherCreateInfo.java +++ b/src/main/java/org/prgrms/vouchermanagement/dto/VoucherCreateInfo.java @@ -1,6 +1,6 @@ package org.prgrms.vouchermanagement.dto; -import org.prgrms.vouchermanagement.voucher.PolicyStatus; +import org.prgrms.vouchermanagement.voucher.policy.PolicyStatus; public record VoucherCreateInfo( PolicyStatus policy, diff --git a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleInput.java b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleInput.java index 3ba68f8766..5f493dad37 100644 --- a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleInput.java +++ b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleInput.java @@ -4,7 +4,7 @@ import org.prgrms.vouchermanagement.dto.VoucherUpdateInfo; import org.prgrms.vouchermanagement.dto.WalletCreateInfo; import org.prgrms.vouchermanagement.exception.InvalidInputException; -import org.prgrms.vouchermanagement.voucher.PolicyStatus; +import org.prgrms.vouchermanagement.voucher.policy.PolicyStatus; import java.util.Scanner; import java.util.UUID; diff --git a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java index fa42b06a0a..b8687e1515 100644 --- a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java +++ b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java @@ -1,8 +1,8 @@ package org.prgrms.vouchermanagement.view; -import org.prgrms.vouchermanagement.blackCustomer.BlackCustomer; -import org.prgrms.vouchermanagement.customer.Customer; -import org.prgrms.vouchermanagement.voucher.Voucher; +import org.prgrms.vouchermanagement.blackCustomer.domain.BlackCustomer; +import org.prgrms.vouchermanagement.customer.domain.Customer; +import org.prgrms.vouchermanagement.voucher.domain.Voucher; import java.util.List; diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/Voucher.java b/src/main/java/org/prgrms/vouchermanagement/voucher/domain/Voucher.java similarity index 78% rename from src/main/java/org/prgrms/vouchermanagement/voucher/Voucher.java rename to src/main/java/org/prgrms/vouchermanagement/voucher/domain/Voucher.java index c834fe54cc..8cb4b2531a 100644 --- a/src/main/java/org/prgrms/vouchermanagement/voucher/Voucher.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/domain/Voucher.java @@ -1,4 +1,6 @@ -package org.prgrms.vouchermanagement.voucher; +package org.prgrms.vouchermanagement.voucher.domain; + +import org.prgrms.vouchermanagement.voucher.policy.DiscountPolicy; import java.util.UUID; diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/DiscountPolicy.java b/src/main/java/org/prgrms/vouchermanagement/voucher/policy/DiscountPolicy.java similarity index 72% rename from src/main/java/org/prgrms/vouchermanagement/voucher/DiscountPolicy.java rename to src/main/java/org/prgrms/vouchermanagement/voucher/policy/DiscountPolicy.java index 0ce6f1b40d..6e7b6960a4 100644 --- a/src/main/java/org/prgrms/vouchermanagement/voucher/DiscountPolicy.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/policy/DiscountPolicy.java @@ -1,4 +1,4 @@ -package org.prgrms.vouchermanagement.voucher; +package org.prgrms.vouchermanagement.voucher.policy; public interface DiscountPolicy { long getAmountOrPercent(); diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/FixedAmountVoucher.java b/src/main/java/org/prgrms/vouchermanagement/voucher/policy/FixedAmountVoucher.java similarity index 90% rename from src/main/java/org/prgrms/vouchermanagement/voucher/FixedAmountVoucher.java rename to src/main/java/org/prgrms/vouchermanagement/voucher/policy/FixedAmountVoucher.java index 93ddd81b94..50b79cefc1 100644 --- a/src/main/java/org/prgrms/vouchermanagement/voucher/FixedAmountVoucher.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/policy/FixedAmountVoucher.java @@ -1,4 +1,4 @@ -package org.prgrms.vouchermanagement.voucher; +package org.prgrms.vouchermanagement.voucher.policy; public class FixedAmountVoucher implements DiscountPolicy { diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/PercentDiscountVoucher.java b/src/main/java/org/prgrms/vouchermanagement/voucher/policy/PercentDiscountVoucher.java similarity index 93% rename from src/main/java/org/prgrms/vouchermanagement/voucher/PercentDiscountVoucher.java rename to src/main/java/org/prgrms/vouchermanagement/voucher/policy/PercentDiscountVoucher.java index 99dcbb4e3f..83bdd445e0 100644 --- a/src/main/java/org/prgrms/vouchermanagement/voucher/PercentDiscountVoucher.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/policy/PercentDiscountVoucher.java @@ -1,4 +1,4 @@ -package org.prgrms.vouchermanagement.voucher; +package org.prgrms.vouchermanagement.voucher.policy; import org.prgrms.vouchermanagement.exception.InvalidRangeException; diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/PolicyStatus.java b/src/main/java/org/prgrms/vouchermanagement/voucher/policy/PolicyStatus.java similarity index 58% rename from src/main/java/org/prgrms/vouchermanagement/voucher/PolicyStatus.java rename to src/main/java/org/prgrms/vouchermanagement/voucher/policy/PolicyStatus.java index e8e740a7bf..7ae75ecdc8 100644 --- a/src/main/java/org/prgrms/vouchermanagement/voucher/PolicyStatus.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/policy/PolicyStatus.java @@ -1,4 +1,4 @@ -package org.prgrms.vouchermanagement.voucher; +package org.prgrms.vouchermanagement.voucher.policy; public enum PolicyStatus { FIXED, //고정 diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/DatabaseRepository.java b/src/main/java/org/prgrms/vouchermanagement/voucher/repository/DatabaseRepository.java similarity index 90% rename from src/main/java/org/prgrms/vouchermanagement/repository/DatabaseRepository.java rename to src/main/java/org/prgrms/vouchermanagement/voucher/repository/DatabaseRepository.java index e2c77cf671..10c928460f 100644 --- a/src/main/java/org/prgrms/vouchermanagement/repository/DatabaseRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/repository/DatabaseRepository.java @@ -1,6 +1,10 @@ -package org.prgrms.vouchermanagement.repository; +package org.prgrms.vouchermanagement.voucher.repository; -import org.prgrms.vouchermanagement.voucher.*; +import org.prgrms.vouchermanagement.voucher.domain.Voucher; +import org.prgrms.vouchermanagement.voucher.policy.DiscountPolicy; +import org.prgrms.vouchermanagement.voucher.policy.FixedAmountVoucher; +import org.prgrms.vouchermanagement.voucher.policy.PercentDiscountVoucher; +import org.prgrms.vouchermanagement.voucher.policy.PolicyStatus; import org.springframework.context.annotation.Profile; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java b/src/main/java/org/prgrms/vouchermanagement/voucher/repository/FileRepository.java similarity index 87% rename from src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java rename to src/main/java/org/prgrms/vouchermanagement/voucher/repository/FileRepository.java index cb2160b645..0ecb6e47a8 100644 --- a/src/main/java/org/prgrms/vouchermanagement/repository/FileRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/repository/FileRepository.java @@ -1,8 +1,12 @@ -package org.prgrms.vouchermanagement.repository; +package org.prgrms.vouchermanagement.voucher.repository; import org.prgrms.vouchermanagement.exception.InsertFailException; import org.prgrms.vouchermanagement.exception.LoadFailException; -import org.prgrms.vouchermanagement.voucher.*; +import org.prgrms.vouchermanagement.voucher.domain.Voucher; +import org.prgrms.vouchermanagement.voucher.policy.DiscountPolicy; +import org.prgrms.vouchermanagement.voucher.policy.FixedAmountVoucher; +import org.prgrms.vouchermanagement.voucher.policy.PercentDiscountVoucher; +import org.prgrms.vouchermanagement.voucher.policy.PolicyStatus; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java b/src/main/java/org/prgrms/vouchermanagement/voucher/repository/MemoryRepository.java similarity index 84% rename from src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java rename to src/main/java/org/prgrms/vouchermanagement/voucher/repository/MemoryRepository.java index 8d0d2187cc..db0dfcb515 100644 --- a/src/main/java/org/prgrms/vouchermanagement/repository/MemoryRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/repository/MemoryRepository.java @@ -1,6 +1,7 @@ -package org.prgrms.vouchermanagement.repository; +package org.prgrms.vouchermanagement.voucher.repository; -import org.prgrms.vouchermanagement.voucher.*; +import org.prgrms.vouchermanagement.voucher.domain.Voucher; +import org.prgrms.vouchermanagement.voucher.policy.DiscountPolicy; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; diff --git a/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java b/src/main/java/org/prgrms/vouchermanagement/voucher/repository/VoucherRepository.java similarity index 61% rename from src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java rename to src/main/java/org/prgrms/vouchermanagement/voucher/repository/VoucherRepository.java index 9eba06a262..b5a31fc815 100644 --- a/src/main/java/org/prgrms/vouchermanagement/repository/VoucherRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/repository/VoucherRepository.java @@ -1,7 +1,7 @@ -package org.prgrms.vouchermanagement.repository; +package org.prgrms.vouchermanagement.voucher.repository; -import org.prgrms.vouchermanagement.voucher.DiscountPolicy; -import org.prgrms.vouchermanagement.voucher.Voucher; +import org.prgrms.vouchermanagement.voucher.policy.DiscountPolicy; +import org.prgrms.vouchermanagement.voucher.domain.Voucher; import java.util.List; import java.util.UUID; diff --git a/src/main/java/org/prgrms/vouchermanagement/service/VoucherService.java b/src/main/java/org/prgrms/vouchermanagement/voucher/service/VoucherService.java similarity index 74% rename from src/main/java/org/prgrms/vouchermanagement/service/VoucherService.java rename to src/main/java/org/prgrms/vouchermanagement/voucher/service/VoucherService.java index 02e5a907bd..f16f45c9c6 100644 --- a/src/main/java/org/prgrms/vouchermanagement/service/VoucherService.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/service/VoucherService.java @@ -1,7 +1,11 @@ -package org.prgrms.vouchermanagement.service; - -import org.prgrms.vouchermanagement.repository.VoucherRepository; -import org.prgrms.vouchermanagement.voucher.*; +package org.prgrms.vouchermanagement.voucher.service; + +import org.prgrms.vouchermanagement.voucher.domain.Voucher; +import org.prgrms.vouchermanagement.voucher.policy.DiscountPolicy; +import org.prgrms.vouchermanagement.voucher.policy.FixedAmountVoucher; +import org.prgrms.vouchermanagement.voucher.policy.PercentDiscountVoucher; +import org.prgrms.vouchermanagement.voucher.policy.PolicyStatus; +import org.prgrms.vouchermanagement.voucher.repository.VoucherRepository; import org.springframework.stereotype.Service; import java.util.List; diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/Wallet.java b/src/main/java/org/prgrms/vouchermanagement/wallet/domain/Wallet.java similarity index 88% rename from src/main/java/org/prgrms/vouchermanagement/wallet/Wallet.java rename to src/main/java/org/prgrms/vouchermanagement/wallet/domain/Wallet.java index 61a5051cfe..f8c009885d 100644 --- a/src/main/java/org/prgrms/vouchermanagement/wallet/Wallet.java +++ b/src/main/java/org/prgrms/vouchermanagement/wallet/domain/Wallet.java @@ -1,4 +1,4 @@ -package org.prgrms.vouchermanagement.wallet; +package org.prgrms.vouchermanagement.wallet.domain; import java.util.UUID; diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/WalletDbRepository.java b/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletDbRepository.java similarity index 89% rename from src/main/java/org/prgrms/vouchermanagement/wallet/WalletDbRepository.java rename to src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletDbRepository.java index d849056cf0..f13904bdaa 100644 --- a/src/main/java/org/prgrms/vouchermanagement/wallet/WalletDbRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletDbRepository.java @@ -1,8 +1,12 @@ -package org.prgrms.vouchermanagement.wallet; +package org.prgrms.vouchermanagement.wallet.repository; -import org.prgrms.vouchermanagement.customer.Customer; +import org.prgrms.vouchermanagement.customer.domain.Customer; import org.prgrms.vouchermanagement.dto.WalletCreateInfo; -import org.prgrms.vouchermanagement.voucher.*; +import org.prgrms.vouchermanagement.voucher.domain.Voucher; +import org.prgrms.vouchermanagement.voucher.policy.DiscountPolicy; +import org.prgrms.vouchermanagement.voucher.policy.FixedAmountVoucher; +import org.prgrms.vouchermanagement.voucher.policy.PercentDiscountVoucher; +import org.prgrms.vouchermanagement.voucher.policy.PolicyStatus; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/WalletRepository.java b/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletRepository.java similarity index 64% rename from src/main/java/org/prgrms/vouchermanagement/wallet/WalletRepository.java rename to src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletRepository.java index 163da0a66c..dcb488c633 100644 --- a/src/main/java/org/prgrms/vouchermanagement/wallet/WalletRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletRepository.java @@ -1,8 +1,8 @@ -package org.prgrms.vouchermanagement.wallet; +package org.prgrms.vouchermanagement.wallet.repository; -import org.prgrms.vouchermanagement.customer.Customer; +import org.prgrms.vouchermanagement.customer.domain.Customer; import org.prgrms.vouchermanagement.dto.WalletCreateInfo; -import org.prgrms.vouchermanagement.voucher.Voucher; +import org.prgrms.vouchermanagement.voucher.domain.Voucher; import java.util.List; import java.util.UUID; diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/WalletService.java b/src/main/java/org/prgrms/vouchermanagement/wallet/service/WalletService.java similarity index 76% rename from src/main/java/org/prgrms/vouchermanagement/wallet/WalletService.java rename to src/main/java/org/prgrms/vouchermanagement/wallet/service/WalletService.java index b69335b72d..d87048d79b 100644 --- a/src/main/java/org/prgrms/vouchermanagement/wallet/WalletService.java +++ b/src/main/java/org/prgrms/vouchermanagement/wallet/service/WalletService.java @@ -1,8 +1,9 @@ -package org.prgrms.vouchermanagement.wallet; +package org.prgrms.vouchermanagement.wallet.service; -import org.prgrms.vouchermanagement.customer.Customer; +import org.prgrms.vouchermanagement.customer.domain.Customer; import org.prgrms.vouchermanagement.dto.WalletCreateInfo; -import org.prgrms.vouchermanagement.voucher.Voucher; +import org.prgrms.vouchermanagement.voucher.domain.Voucher; +import org.prgrms.vouchermanagement.wallet.repository.WalletRepository; import org.springframework.stereotype.Service; import java.util.List; From 20e1694a75c363b63d88258e5d8a2d946bd72680 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Tue, 31 Oct 2023 14:07:29 +0900 Subject: [PATCH 080/101] =?UTF-8?q?delete=20:=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=A7=80=20=EC=95=8A=EB=8A=94=20blackCustomer=20->=20?= =?UTF-8?q?Customer=EB=A1=9C=20=EC=9D=B4=EA=B4=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blacklist/blackList.csv | 4 -- .../blackCustomer/domain/BlackCustomer.java | 27 ------------ .../repository/BlackCustomerRepository.java | 44 ------------------- .../service/BlackCustomerService.java | 21 --------- 4 files changed, 96 deletions(-) delete mode 100644 blacklist/blackList.csv delete mode 100644 src/main/java/org/prgrms/vouchermanagement/blackCustomer/domain/BlackCustomer.java delete mode 100644 src/main/java/org/prgrms/vouchermanagement/blackCustomer/repository/BlackCustomerRepository.java delete mode 100644 src/main/java/org/prgrms/vouchermanagement/blackCustomer/service/BlackCustomerService.java diff --git a/blacklist/blackList.csv b/blacklist/blackList.csv deleted file mode 100644 index eae69b11a0..0000000000 --- a/blacklist/blackList.csv +++ /dev/null @@ -1,4 +0,0 @@ -b30b3c8e-ebfa-4c06-9af8-0adc86167fe2,김씨,22 -430e153a-273e-4ab5-94b5-9409f642b637,나씨,23 -30542d90-75b7-4830-bea2-b8011aff5a5b,박씨,21 -aa50802e-0eeb-444d-a6bf-5ab2dcb44bf9,이씨,24 diff --git a/src/main/java/org/prgrms/vouchermanagement/blackCustomer/domain/BlackCustomer.java b/src/main/java/org/prgrms/vouchermanagement/blackCustomer/domain/BlackCustomer.java deleted file mode 100644 index 927cb49336..0000000000 --- a/src/main/java/org/prgrms/vouchermanagement/blackCustomer/domain/BlackCustomer.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.prgrms.vouchermanagement.blackCustomer.domain; - -import java.util.UUID; - -public class BlackCustomer { - private final UUID customerId; - private final String name; - private final int age; - - public BlackCustomer(UUID customerId, String name, int age) { - this.customerId = customerId; - this.name = name; - this.age = age; - } - - public UUID getCustomerId() { - return customerId; - } - - public String getName() { - return name; - } - - public int getAge() { - return age; - } -} diff --git a/src/main/java/org/prgrms/vouchermanagement/blackCustomer/repository/BlackCustomerRepository.java b/src/main/java/org/prgrms/vouchermanagement/blackCustomer/repository/BlackCustomerRepository.java deleted file mode 100644 index 9b26e75ba2..0000000000 --- a/src/main/java/org/prgrms/vouchermanagement/blackCustomer/repository/BlackCustomerRepository.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.prgrms.vouchermanagement.blackCustomer.repository; - -import org.prgrms.vouchermanagement.blackCustomer.domain.BlackCustomer; -import org.prgrms.vouchermanagement.exception.LoadFailException; -import org.springframework.stereotype.Repository; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -@Repository -public class BlackCustomerRepository { - - private final List blackList = new ArrayList<>(); - private final String filePath = "./blacklist/blackList.csv"; - - public List load() { - if(blackList.isEmpty()) { - getFromFile(); - } - return blackList; - } - - private void getFromFile() { - try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { - String line; - while ((line = reader.readLine()) != null) { - String[] parts = line.split(","); - - UUID uuid = UUID.fromString(parts[0]); - String name = parts[1]; - int age = Integer.parseInt(parts[2]); - BlackCustomer blackCustomer = new BlackCustomer(uuid, name, age); - - blackList.add(blackCustomer); - } - } catch (IOException e) { - throw new LoadFailException("CSV 파일을 찾을 수 없습니다."); - } - } -} diff --git a/src/main/java/org/prgrms/vouchermanagement/blackCustomer/service/BlackCustomerService.java b/src/main/java/org/prgrms/vouchermanagement/blackCustomer/service/BlackCustomerService.java deleted file mode 100644 index 22bd7171c2..0000000000 --- a/src/main/java/org/prgrms/vouchermanagement/blackCustomer/service/BlackCustomerService.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.prgrms.vouchermanagement.blackCustomer.service; - -import org.prgrms.vouchermanagement.blackCustomer.domain.BlackCustomer; -import org.prgrms.vouchermanagement.blackCustomer.repository.BlackCustomerRepository; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -public class BlackCustomerService { - - private final BlackCustomerRepository blackCustomerRepository; - - public BlackCustomerService(BlackCustomerRepository blackCustomerRepository) { - this.blackCustomerRepository = blackCustomerRepository; - } - - public List getBlackList() { - return blackCustomerRepository.load(); - } -} From 59125ee34dfb0f5db79bbc939d3681ad537efebc Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Tue, 31 Oct 2023 14:08:13 +0900 Subject: [PATCH 081/101] =?UTF-8?q?Refactor=20:=20Customer=20=EB=8F=84?= =?UTF-8?q?=EB=A9=94=EC=9D=B8=EC=97=90=20blacklist=EA=B4=80=EB=A6=AC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/Controller.java | 3 ++- .../customer/domain/Customer.java | 6 ++++++ ...itory.java => CustomerJdbcRepository.java} | 21 +++++++------------ .../repository/CustomerRepository.java | 2 ++ .../customer/service/CustomerService.java | 4 ++++ .../vouchermanagement/view/ConsoleOutput.java | 7 +++---- 6 files changed, 25 insertions(+), 18 deletions(-) rename src/main/java/org/prgrms/vouchermanagement/customer/repository/{CustomerDbRepository.java => CustomerJdbcRepository.java} (66%) diff --git a/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java b/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java index 5d1096f0b2..d107a9b775 100644 --- a/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java +++ b/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java @@ -22,6 +22,7 @@ @Component public class Controller implements CommandLineRunner { + //frontcontroller 구분하여 반영하고 생각 private final ConsoleInput consoleInput = new ConsoleInput(); private final ConsoleOutput consoleOutput = new ConsoleOutput(); @@ -76,7 +77,7 @@ private void showCustomerList() { } private void showBlackList() { - List blackList = blackCustomerService.getBlackList(); + List blackList = customerService.showBlackCustomerList(); consoleOutput.printBlackList(blackList); } diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/domain/Customer.java b/src/main/java/org/prgrms/vouchermanagement/customer/domain/Customer.java index 03e38a0ef9..a64395d9bf 100644 --- a/src/main/java/org/prgrms/vouchermanagement/customer/domain/Customer.java +++ b/src/main/java/org/prgrms/vouchermanagement/customer/domain/Customer.java @@ -6,11 +6,13 @@ public class Customer { private final UUID userId; private final String userName; private final int userAge; + private final boolean isBlacked; public Customer(UUID userId, String userName, int userAge) { this.userId = userId; this.userName = userName; this.userAge = userAge; + this.isBlacked = false; } public UUID getUserId() { @@ -24,4 +26,8 @@ public String getUserName() { public int getUserAge() { return userAge; } + + public boolean isBlacked() { + return isBlacked; + } } diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/repository/CustomerDbRepository.java b/src/main/java/org/prgrms/vouchermanagement/customer/repository/CustomerJdbcRepository.java similarity index 66% rename from src/main/java/org/prgrms/vouchermanagement/customer/repository/CustomerDbRepository.java rename to src/main/java/org/prgrms/vouchermanagement/customer/repository/CustomerJdbcRepository.java index 9fecf64f5f..45ecf281d9 100644 --- a/src/main/java/org/prgrms/vouchermanagement/customer/repository/CustomerDbRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/customer/repository/CustomerJdbcRepository.java @@ -13,30 +13,25 @@ import java.util.concurrent.ConcurrentHashMap; @Repository -public class CustomerDbRepository implements CustomerRepository{ +public class CustomerJdbcRepository implements CustomerRepository{ - private final String LOAD = "SELECT customer_id, customer_name, customer_age FROM customer"; + private static final String LOAD = "SELECT customer_id, customer_name, customer_age FROM customer"; + private static final String BLACKLIST = "SELECT customer_id, customer_name, customer_age FROM customer WHERE black = true"; - private final Map storage = new ConcurrentHashMap<>(); private final JdbcTemplate jdbcTemplate; - public CustomerDbRepository(JdbcTemplate jdbcTemplate) { + public CustomerJdbcRepository(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @Override public List showCustomerList() { - load(); - - return storage.values().stream() - .toList(); + return jdbcTemplate.query(LOAD, new CustomerRowMapper()); } - private void load() { - List customers = jdbcTemplate.query(LOAD, new CustomerDbRepository.CustomerRowMapper()); - for (Customer customer : customers) { - storage.put(customer.getUserId(), customer); - } + @Override + public List showBlackCustomerList() { + return jdbcTemplate.query(BLACKLIST, new CustomerRowMapper()); } private class CustomerRowMapper implements RowMapper { diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/repository/CustomerRepository.java b/src/main/java/org/prgrms/vouchermanagement/customer/repository/CustomerRepository.java index 3a76fe3f31..3d91eb5b5e 100644 --- a/src/main/java/org/prgrms/vouchermanagement/customer/repository/CustomerRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/customer/repository/CustomerRepository.java @@ -8,4 +8,6 @@ public interface CustomerRepository { List showCustomerList(); + List showBlackCustomerList(); + } diff --git a/src/main/java/org/prgrms/vouchermanagement/customer/service/CustomerService.java b/src/main/java/org/prgrms/vouchermanagement/customer/service/CustomerService.java index 57255ba145..2c492aaf47 100644 --- a/src/main/java/org/prgrms/vouchermanagement/customer/service/CustomerService.java +++ b/src/main/java/org/prgrms/vouchermanagement/customer/service/CustomerService.java @@ -18,4 +18,8 @@ public CustomerService(CustomerRepository customerRepository) { public List showCustomerList() { return customerRepository.showCustomerList(); } + + public List showBlackCustomerList() { + return customerRepository.showBlackCustomerList(); + } } diff --git a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java index b8687e1515..9d47651089 100644 --- a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java +++ b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java @@ -1,6 +1,5 @@ package org.prgrms.vouchermanagement.view; -import org.prgrms.vouchermanagement.blackCustomer.domain.BlackCustomer; import org.prgrms.vouchermanagement.customer.domain.Customer; import org.prgrms.vouchermanagement.voucher.domain.Voucher; @@ -179,10 +178,10 @@ public void printCustomer(Customer customer) { printlnMessage("customerId : " + customer.getUserId() + ", name : " + customer.getUserName() + ", age : " + customer.getUserAge()); } - public void printBlackList(List blackList) { + public void printBlackList(List blackList) { printMessage(showBlackList); - for(BlackCustomer blackCustomer : blackList) { - printlnMessage("customerId : " + blackCustomer.getCustomerId() + ", name : " + blackCustomer.getName() + ", age : " + blackCustomer.getAge()); + for(Customer blackCustomer : blackList) { + printlnMessage("customerId : " + blackCustomer.getUserId() + ", name : " + blackCustomer.getUserName() + ", age : " + blackCustomer.getUserAge()); } } From b36f7420008f076ce0210a0bb9a742ceb184859d Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Tue, 31 Oct 2023 14:56:53 +0900 Subject: [PATCH 082/101] =?UTF-8?q?Refactor=20:=20=ED=94=84=EB=A1=A0?= =?UTF-8?q?=ED=8A=B8=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=EC=99=80=20?= =?UTF-8?q?=EA=B0=81=20=EC=BB=A8=ED=8A=B8=EB=A1=A4=EB=9F=AC=EB=A5=BC=20?= =?UTF-8?q?=EA=B5=AC=EB=B6=84=ED=95=98=EC=97=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/Controller.java | 113 +++--------------- .../controller/CustomerController.java | 55 +++++++++ .../controller/VoucherController.java | 72 +++++++++++ .../controller/WalletController.java | 73 +++++++++++ .../vouchermanagement/view/Command.java | 14 ++- .../vouchermanagement/view/ConsoleInput.java | 11 ++ .../vouchermanagement/view/ConsoleOutput.java | 49 ++++++-- 7 files changed, 276 insertions(+), 111 deletions(-) create mode 100644 src/main/java/org/prgrms/vouchermanagement/controller/CustomerController.java create mode 100644 src/main/java/org/prgrms/vouchermanagement/controller/VoucherController.java create mode 100644 src/main/java/org/prgrms/vouchermanagement/controller/WalletController.java diff --git a/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java b/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java index d107a9b775..df86a660a9 100644 --- a/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java +++ b/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java @@ -1,41 +1,26 @@ package org.prgrms.vouchermanagement.controller; -import org.prgrms.vouchermanagement.customer.domain.Customer; -import org.prgrms.vouchermanagement.customer.service.CustomerService; -import org.prgrms.vouchermanagement.dto.VoucherCreateInfo; -import org.prgrms.vouchermanagement.blackCustomer.domain.BlackCustomer; -import org.prgrms.vouchermanagement.blackCustomer.service.BlackCustomerService; -import org.prgrms.vouchermanagement.dto.VoucherUpdateInfo; -import org.prgrms.vouchermanagement.dto.WalletCreateInfo; -import org.prgrms.vouchermanagement.voucher.service.VoucherService; import org.prgrms.vouchermanagement.view.Command; import org.prgrms.vouchermanagement.view.ConsoleInput; import org.prgrms.vouchermanagement.view.ConsoleOutput; -import org.prgrms.vouchermanagement.voucher.domain.Voucher; -import org.prgrms.vouchermanagement.wallet.service.WalletService; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; -import java.util.List; -import java.util.UUID; - @Component public class Controller implements CommandLineRunner { - //frontcontroller 구분하여 반영하고 생각 private final ConsoleInput consoleInput = new ConsoleInput(); private final ConsoleOutput consoleOutput = new ConsoleOutput(); - private final VoucherService voucherService; - private final CustomerService customerService; - private final BlackCustomerService blackCustomerService; - private final WalletService walletService; + private final VoucherController voucherController; + private final CustomerController customerController; + private final WalletController walletController; + - public Controller(VoucherService voucherService, CustomerService customerService, BlackCustomerService blackCustomerService, WalletService walletService) { - this.voucherService = voucherService; - this.customerService = customerService; - this.blackCustomerService = blackCustomerService; - this.walletService = walletService; + public Controller(VoucherController voucherController, CustomerController customerController, WalletController walletController) { + this.voucherController = voucherController; + this.customerController = customerController; + this.walletController = walletController; } @Override @@ -47,92 +32,24 @@ public void run(String... args) { Command command = consoleInput.commandInput(); switch (command) { - case CREATE -> createVoucher(); - case LIST -> voucherLists(); - case CUSTOMER -> showCustomerList(); - case BLACKLIST -> showBlackList(); - case UPDATE -> updateVoucher(); - case DELETE -> deleteVoucher(); + case VOUCHER -> voucher(); + case CUSTOMER -> customer(); case WALLET -> wallet(); case EXIT -> notExitCommand = exit(); } } } - private void createVoucher() { - consoleOutput.printCreateVoucherMessage(); - VoucherCreateInfo voucherInput = consoleInput.createVoucherInput(); - voucherService.createVoucher(voucherInput.policy(), voucherInput.amountOrPercent()); - consoleOutput.printCreateVoucherCompleteMessage(); - } - - private void voucherLists() { - List vouchers = voucherService.voucherLists(); - consoleOutput.printVouchers(vouchers); - } - - private void showCustomerList() { - List customerList = customerService.showCustomerList(); - consoleOutput.printCustomerList(customerList); - } - - private void showBlackList() { - List blackList = customerService.showBlackCustomerList(); - consoleOutput.printBlackList(blackList); - } - - private void updateVoucher() { - consoleOutput.printUpdateVoucherMessage(); - VoucherUpdateInfo voucherUpdateInfo = consoleInput.updateVoucherInput(); - voucherService.updateVoucher(voucherUpdateInfo.voucherId(), voucherUpdateInfo.amountOrPercent()); - consoleOutput.printUpdateVoucherCompleteMessage(); + private void voucher() { + voucherController.voucher(); } - private void deleteVoucher() { - consoleOutput.printDeleteVoucherMessage(); - voucherService.deleteVoucher(); + private void customer() { + customerController.customer(); } private void wallet() { - boolean notExitCommand = true; - - while (notExitCommand) { - consoleOutput.printWalletMessage(); - Command command = consoleInput.commandInput(); - - switch (command) { - case CREATE -> createWallet(); - case LIST -> findVouchersByCustomerId(); - case DELETE -> deleteVoucherByCustomerId(); - case FIND -> findCustomerByVoucherId(); - case EXIT -> notExitCommand = exit(); - } - } - } - - private void createWallet() { - consoleOutput.printCreateWalletMessage(); - WalletCreateInfo walletCreateInfo = consoleInput.createWalletInput(); - walletService.create(walletCreateInfo); - } - - private void findVouchersByCustomerId() { - consoleOutput.printAllVouchersByCustomerId(); - UUID customerId = consoleInput.findAllVouchersByCustomerId(); - List voucherList = walletService.findVouchers(customerId); - consoleOutput.printVouchers(voucherList); - } - - private void deleteVoucherByCustomerId() { - consoleOutput.printDeleteVoucherByCustomerId(); - UUID customerId = consoleInput.deleteVoucherByCustomerId(); - walletService.delete(customerId); - } - - private void findCustomerByVoucherId() { - consoleOutput.printCustomerByVoucherId(); - UUID voucherId = consoleInput.findCustomerByVoucherId(); - consoleOutput.printCustomer(walletService.findCustomer(voucherId)); + walletController.wallet(); } private boolean exit() { diff --git a/src/main/java/org/prgrms/vouchermanagement/controller/CustomerController.java b/src/main/java/org/prgrms/vouchermanagement/controller/CustomerController.java new file mode 100644 index 0000000000..e4f4d42dbc --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/controller/CustomerController.java @@ -0,0 +1,55 @@ +package org.prgrms.vouchermanagement.controller; + +import org.prgrms.vouchermanagement.customer.domain.Customer; +import org.prgrms.vouchermanagement.customer.service.CustomerService; +import org.prgrms.vouchermanagement.view.Command; +import org.prgrms.vouchermanagement.view.ConsoleInput; +import org.prgrms.vouchermanagement.view.ConsoleOutput; +import org.springframework.stereotype.Controller; + +import java.util.List; + +@Controller +public class CustomerController { + + private final ConsoleOutput consoleOutput; + private final ConsoleInput consoleInput; + private final CustomerService customerService; + + public CustomerController(ConsoleOutput consoleOutput, ConsoleInput consoleInput, CustomerService customerService) { + this.consoleOutput = consoleOutput; + this.consoleInput = consoleInput; + this.customerService = customerService; + } + + public void customer() { + boolean notExitCommand = true; + + while (notExitCommand) { + consoleOutput.printCustomerOptionMessage(); + Command command = consoleInput.commandInput(); + + switch (command) { + case LIST -> showList(); + case BLACKLIST -> showBlackList(); + case EXIT -> notExitCommand = exit(); + } + } + } + + private void showList() { + List customers = customerService.showCustomerList(); + consoleOutput.printCustomerList(customers); + } + + private void showBlackList() { + List customers = customerService.showBlackCustomerList(); + consoleOutput.printBlackList(customers); + } + + + private boolean exit() { + consoleOutput.printExitMessage(); + return false; + } +} diff --git a/src/main/java/org/prgrms/vouchermanagement/controller/VoucherController.java b/src/main/java/org/prgrms/vouchermanagement/controller/VoucherController.java new file mode 100644 index 0000000000..bbac4ba327 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/controller/VoucherController.java @@ -0,0 +1,72 @@ +package org.prgrms.vouchermanagement.controller; + +import org.prgrms.vouchermanagement.dto.VoucherCreateInfo; +import org.prgrms.vouchermanagement.dto.VoucherUpdateInfo; +import org.prgrms.vouchermanagement.view.Command; +import org.prgrms.vouchermanagement.view.ConsoleInput; +import org.prgrms.vouchermanagement.view.ConsoleOutput; +import org.prgrms.vouchermanagement.voucher.domain.Voucher; +import org.prgrms.vouchermanagement.voucher.service.VoucherService; +import org.springframework.stereotype.Controller; + +import java.util.List; + +@Controller +public class VoucherController { + private final ConsoleOutput consoleOutput; + private final ConsoleInput consoleInput; + private final VoucherService voucherService; + + public VoucherController(ConsoleOutput consoleOutput, ConsoleInput consoleInput, VoucherService voucherService) { + this.consoleOutput = consoleOutput; + this.consoleInput = consoleInput; + this.voucherService = voucherService; + } + + public void voucher() { + boolean notExitCommand = true; + + while (notExitCommand) { + consoleOutput.printVoucherOptionMessage(); + Command command = consoleInput.commandInput(); + + switch (command) { + case CREATE -> createVoucher(); + case LIST -> voucherLists(); + case UPDATE -> updateVoucher(); + case DELETE -> deleteVoucher(); + case EXIT -> notExitCommand = exit(); + } + } + } + + private void createVoucher() { + consoleOutput.printCreateVoucherMessage(); + VoucherCreateInfo voucherInput = consoleInput.createVoucherInput(); + voucherService.createVoucher(voucherInput.policy(), voucherInput.amountOrPercent()); + consoleOutput.printCreateVoucherCompleteMessage(); + } + + private void voucherLists() { + List vouchers = voucherService.voucherLists(); + consoleOutput.printVouchers(vouchers); + } + + private void updateVoucher() { + consoleOutput.printUpdateVoucherMessage(); + VoucherUpdateInfo voucherUpdateInfo = consoleInput.updateVoucherInput(); + voucherService.updateVoucher(voucherUpdateInfo.voucherId(), voucherUpdateInfo.amountOrPercent()); + consoleOutput.printUpdateVoucherCompleteMessage(); + } + + private void deleteVoucher() { + consoleOutput.printDeleteVoucherMessage(); + voucherService.deleteVoucher(); + } + + + private boolean exit() { + consoleOutput.printExitMessage(); + return false; + } +} diff --git a/src/main/java/org/prgrms/vouchermanagement/controller/WalletController.java b/src/main/java/org/prgrms/vouchermanagement/controller/WalletController.java new file mode 100644 index 0000000000..3a5178f25e --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/controller/WalletController.java @@ -0,0 +1,73 @@ +package org.prgrms.vouchermanagement.controller; + +import org.prgrms.vouchermanagement.dto.WalletCreateInfo; +import org.prgrms.vouchermanagement.view.Command; +import org.prgrms.vouchermanagement.view.ConsoleInput; +import org.prgrms.vouchermanagement.view.ConsoleOutput; +import org.prgrms.vouchermanagement.voucher.domain.Voucher; +import org.prgrms.vouchermanagement.wallet.service.WalletService; +import org.springframework.stereotype.Controller; + +import java.util.List; +import java.util.UUID; + +@Controller +public class WalletController { + private final ConsoleOutput consoleOutput; + private final ConsoleInput consoleInput; + private final WalletService walletService; + + public WalletController(ConsoleOutput consoleOutput, ConsoleInput consoleInput, WalletService walletService) { + this.consoleOutput = consoleOutput; + this.consoleInput = consoleInput; + this.walletService = walletService; + } + + public void wallet() { + boolean notExitCommand = true; + + while (notExitCommand) { + consoleOutput.printWalletMessage(); + Command command = consoleInput.commandInput(); + + switch (command) { + case CREATE -> createWallet(); + case LIST -> findVouchersByCustomerId(); + case DELETE -> deleteVoucherByCustomerId(); + case FIND -> findCustomerByVoucherId(); + case EXIT -> notExitCommand = exit(); + } + } + } + + private void createWallet() { + consoleOutput.printCreateWalletMessage(); + WalletCreateInfo walletCreateInfo = consoleInput.createWalletInput(); + walletService.create(walletCreateInfo); + } + + private void findVouchersByCustomerId() { + consoleOutput.printAllVouchersByCustomerId(); + UUID customerId = consoleInput.findAllVouchersByCustomerId(); + List voucherList = walletService.findVouchers(customerId); + consoleOutput.printVouchers(voucherList); + } + + private void deleteVoucherByCustomerId() { + consoleOutput.printDeleteVoucherByCustomerId(); + UUID customerId = consoleInput.deleteVoucherByCustomerId(); + walletService.delete(customerId); + } + + private void findCustomerByVoucherId() { + consoleOutput.printCustomerByVoucherId(); + UUID voucherId = consoleInput.findCustomerByVoucherId(); + consoleOutput.printCustomer(walletService.findCustomer(voucherId)); + } + + + private boolean exit() { + consoleOutput.printExitMessage(); + return false; + } +} diff --git a/src/main/java/org/prgrms/vouchermanagement/view/Command.java b/src/main/java/org/prgrms/vouchermanagement/view/Command.java index 3f9d3e45da..52fcb0cda4 100644 --- a/src/main/java/org/prgrms/vouchermanagement/view/Command.java +++ b/src/main/java/org/prgrms/vouchermanagement/view/Command.java @@ -1,13 +1,15 @@ package org.prgrms.vouchermanagement.view; public enum Command { + VOUCHER, // VOUCHER 메뉴 + CUSTOMER, // CUSTOMER 메뉴 이동 + WALLET, // WALLET 메뉴로 이동 + EXIT, // 종료 + CREATE, // 바우처 생성, 지갑 생성 - LIST, // 바우처 리스트, 고객의 바우처 전부 출력 - CUSTOMER, //고객 리스트 - BLACKLIST, // 블랙 리스트 + LIST, // 바우처 리스트, 고객 리스트 + BLACKLIST, // 고객 블랙 리스트 UPDATE, //바우처 업데이트 DELETE, //바우처 전부 삭제, 지갑 삭제 - WALLET, // WALLET 메뉴로 이동 - FIND, // 바우처 id로 고객 찾기 - EXIT // 종료 + FIND // 바우처 id로 고객 찾기 } diff --git a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleInput.java b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleInput.java index 5f493dad37..694ee1be88 100644 --- a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleInput.java +++ b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleInput.java @@ -1,14 +1,17 @@ package org.prgrms.vouchermanagement.view; +import org.prgrms.vouchermanagement.customer.domain.Customer; import org.prgrms.vouchermanagement.dto.VoucherCreateInfo; import org.prgrms.vouchermanagement.dto.VoucherUpdateInfo; import org.prgrms.vouchermanagement.dto.WalletCreateInfo; import org.prgrms.vouchermanagement.exception.InvalidInputException; import org.prgrms.vouchermanagement.voucher.policy.PolicyStatus; +import org.springframework.stereotype.Component; import java.util.Scanner; import java.util.UUID; +@Component public class ConsoleInput { private final Scanner scanner = new Scanner(System.in); @@ -81,6 +84,14 @@ private PolicyStatus validateAndConvertPolicy(String inputPolicy) { } } + private int validateAndConvertAge(String age) { + try { + return Integer.parseInt(age); + } catch (NumberFormatException e) { + throw new InvalidInputException("잘못된 age 입력입니다."); + } + } + private long validateAndConvertAmountOrPercent(String inputAmountOrPercent) { try { return Long.parseLong(inputAmountOrPercent); diff --git a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java index 9d47651089..43f6e8f2f5 100644 --- a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java +++ b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleOutput.java @@ -2,24 +2,47 @@ import org.prgrms.vouchermanagement.customer.domain.Customer; import org.prgrms.vouchermanagement.voucher.domain.Voucher; +import org.springframework.stereotype.Component; import java.util.List; +@Component public class ConsoleOutput { private static final String welcome = """ === Voucher Program === - Type create to create a new voucher. - Type list to list all vouchers. - Type customer to list all customers - Type blacklist to list blackCustomer in blacklist - Type update to update voucher amount or percent - Type delete to delete all vouchers - Type wallet is new wallet mode + Type voucher to view voucher option. + Type customer to view customer option. + Type wallet to view wallet option. Type exit to exit the program. """; + private static final String customerOption = """ + + Type list to list all customers. + Type blacklist to list all black customers. + Type exit to exit customer option + """; + + private static final String voucherOption = """ + + Type create to create new voucher. + Type list to list all vouchers. + Type update to update voucher by voucherId. + Type delete to delete voucher by voucherId. + Type exit to exit customer option + """; + + private static final String walletOption = """ + + Type create to create new wallet. + Type list to list all wallet. + Type delete to delete wallet by customerId. + Type find to find customer by voucherId. + Type exit to exit customer option + """; + private static final String createVoucher = """ === CREATE VOUCHER === @@ -127,6 +150,18 @@ public void printWelcomeMessage() { printMessage(welcome); } + public void printCustomerOptionMessage() { + printMessage(customerOption); + } + + public void printVoucherOptionMessage() { + printMessage(voucherOption); + } + + public void printWalletOptionMessage() { + printMessage(walletOption); + } + public void printCreateVoucherMessage() { printMessage(createVoucher); } From 33fae9a3e486811b202f3f62ae3b0d91954f471e Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Tue, 31 Oct 2023 14:57:17 +0900 Subject: [PATCH 083/101] =?UTF-8?q?Refactor=20:=20sql=EC=9D=84=20=EB=8B=B4?= =?UTF-8?q?=EA=B3=A0=EC=9E=88=EB=8A=94=20=EB=AC=B8=EC=9E=90=EC=97=B4=20?= =?UTF-8?q?=EC=83=81=EC=88=98=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/DatabaseRepository.java | 9 +++--- ...ository.java => WalletJdbcRepository.java} | 29 ++++++------------- 2 files changed, 13 insertions(+), 25 deletions(-) rename src/main/java/org/prgrms/vouchermanagement/wallet/repository/{WalletDbRepository.java => WalletJdbcRepository.java} (74%) diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/repository/DatabaseRepository.java b/src/main/java/org/prgrms/vouchermanagement/voucher/repository/DatabaseRepository.java index 10c928460f..f8038bc3cc 100644 --- a/src/main/java/org/prgrms/vouchermanagement/voucher/repository/DatabaseRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/repository/DatabaseRepository.java @@ -20,11 +20,10 @@ @Repository @Profile("database") public class DatabaseRepository implements VoucherRepository { - - private final String LOAD = "SELECT voucher_id, discount_policy, amount FROM voucher"; - private final String CREATE = "INSERT INTO voucher(voucher_id, discount_policy, amount) VALUES(UUID_TO_BIN(?), (?), (?))"; - private final String UPDATE_AMOUNT_BY_ID = "UPDATE voucher SET amount = ? WHERE voucher_id = UUID_TO_BIN(?)"; - private final String DELETE_BY_ID = "DELETE FROM voucher"; + private static final String LOAD = "SELECT voucher_id, discount_policy, amount FROM voucher"; + private static final String CREATE = "INSERT INTO voucher(voucher_id, discount_policy, amount) VALUES(UUID_TO_BIN(?), (?), (?))"; + private static final String UPDATE_AMOUNT_BY_ID = "UPDATE voucher SET amount = ? WHERE voucher_id = UUID_TO_BIN(?)"; + private static final String DELETE_BY_ID = "DELETE FROM voucher"; private final Map storage = new ConcurrentHashMap<>(); private final JdbcTemplate jdbcTemplate; diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletDbRepository.java b/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletJdbcRepository.java similarity index 74% rename from src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletDbRepository.java rename to src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletJdbcRepository.java index f13904bdaa..1d9ecc45e2 100644 --- a/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletDbRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletJdbcRepository.java @@ -18,30 +18,16 @@ import java.util.UUID; @Repository -public class WalletDbRepository implements WalletRepository{ +public class WalletJdbcRepository implements WalletRepository{ - private final String CREATE = "INSERT INTO wallet(customer_id, voucher_id) VALUES(UUID_TO_BIN(?), UUID_TO_BIN(?))"; - private final String FINDVOUCHERS = "select v.voucher_id, v.discount_policy, v.amount FROM voucher v JOIN wallet w ON v.voucher_id = w.voucher_id WHERE w.customer_id = UUID_TO_BIN(?)"; - private final String DELETE = "DELETE FROM wallet WHERE customer_id = UUID_TO_BIN(?)"; - private final String FINDCUSTOMER = "SELECT c.customer_id, c.customer_name, c.customer_age FROM wallet w, customer c WHERE w.customer_id = c.customer_id AND w.voucher_id = UUID_TO_BIN(?)"; - - /* - - SELECT v.voucher_id, v.discount_policy, v.amount - FROM wallet w, voucher v - WHERE w.voucher_id = v.voucher_id and w.customer_id = UUID_TO_BIN(?) - - SELECT c.customer_id, c.customer_name, c.customer_age - FROM wallet w, customer c - WERE w.customer_id = c.customer_id AND w.voucher_id = UUID_TO_BIN(?) - - select v.voucher_id, v.discount_policy, v.amount FROM voucher v JOIN wallet w ON v.voucher_id = w.voucher_id - - */ + private static final String CREATE = "INSERT INTO wallet(customer_id, voucher_id) VALUES(UUID_TO_BIN(?), UUID_TO_BIN(?))"; + private static final String FINDVOUCHERS = "select v.voucher_id, v.discount_policy, v.amount FROM voucher v JOIN wallet w ON v.voucher_id = w.voucher_id WHERE w.customer_id = UUID_TO_BIN(?)"; + private static final String DELETE = "DELETE FROM wallet WHERE customer_id = UUID_TO_BIN(?)"; + private static final String FINDCUSTOMER = "SELECT c.customer_id, c.customer_name, c.customer_age FROM wallet w, customer c WHERE w.customer_id = c.customer_id AND w.voucher_id = UUID_TO_BIN(?)"; private final JdbcTemplate jdbcTemplate; - public WalletDbRepository(JdbcTemplate jdbcTemplate) { + public WalletJdbcRepository(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @@ -52,11 +38,13 @@ public int create(WalletCreateInfo walletCreateInfo) { return jdbcTemplate.update(CREATE, customerId.toString().getBytes(), voucherId.toString().getBytes()); } + //repository 메서드 추상화 @Override public List findVouchers(UUID customerId) { return jdbcTemplate.query(FINDVOUCHERS, new Object[]{customerId.toString().getBytes()}, new VoucherRowMapper()); } + //메서드명 자세하게 @Override public int delete(UUID customerId) { @@ -67,6 +55,7 @@ public int delete(UUID customerId) { public Customer findCustomer(UUID voucherId) { return jdbcTemplate.query(FINDCUSTOMER, new Object[]{voucherId.toString().getBytes()}, new CustomerRowMapper()).get(0); } + //null값 -> optional private class VoucherRowMapper implements RowMapper { @Override From 43ec4860d1d6b8c24936d48a3b2ab96f1a951fd9 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Tue, 31 Oct 2023 15:58:25 +0900 Subject: [PATCH 084/101] =?UTF-8?q?Refactor=20:=20wallet=EC=9D=B4=20?= =?UTF-8?q?=ED=95=98=EA=B3=A0=20=EC=9E=88=EB=8A=94=20=EC=97=AD=ED=95=A0?= =?UTF-8?q?=EC=97=90=20=EB=A7=9E=EB=8A=94=20=EB=84=A4=EC=9D=B4=EB=B0=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/WalletController.java | 16 ++--- .../wallet/domain/Wallet.java | 21 ------- .../wallet/domain/WalletMapper.java | 38 ++++++++++++ ... => WalletMapperJdbcMapperRepository.java} | 4 +- ...itory.java => WalletMapperRepository.java} | 2 +- .../wallet/service/WalletMapperService.java | 38 ++++++++++++ .../wallet/service/WalletService.java | 37 ------------ .../service/WalletMapperServiceTest.java | 60 +++++++++++++++++++ 8 files changed, 147 insertions(+), 69 deletions(-) delete mode 100644 src/main/java/org/prgrms/vouchermanagement/wallet/domain/Wallet.java create mode 100644 src/main/java/org/prgrms/vouchermanagement/wallet/domain/WalletMapper.java rename src/main/java/org/prgrms/vouchermanagement/wallet/repository/{WalletJdbcRepository.java => WalletMapperJdbcMapperRepository.java} (96%) rename src/main/java/org/prgrms/vouchermanagement/wallet/repository/{WalletRepository.java => WalletMapperRepository.java} (91%) create mode 100644 src/main/java/org/prgrms/vouchermanagement/wallet/service/WalletMapperService.java delete mode 100644 src/main/java/org/prgrms/vouchermanagement/wallet/service/WalletService.java create mode 100644 src/test/java/org/prgrms/vouchermanagement/wallet/service/WalletMapperServiceTest.java diff --git a/src/main/java/org/prgrms/vouchermanagement/controller/WalletController.java b/src/main/java/org/prgrms/vouchermanagement/controller/WalletController.java index 3a5178f25e..b71dad14eb 100644 --- a/src/main/java/org/prgrms/vouchermanagement/controller/WalletController.java +++ b/src/main/java/org/prgrms/vouchermanagement/controller/WalletController.java @@ -5,7 +5,7 @@ import org.prgrms.vouchermanagement.view.ConsoleInput; import org.prgrms.vouchermanagement.view.ConsoleOutput; import org.prgrms.vouchermanagement.voucher.domain.Voucher; -import org.prgrms.vouchermanagement.wallet.service.WalletService; +import org.prgrms.vouchermanagement.wallet.service.WalletMapperService; import org.springframework.stereotype.Controller; import java.util.List; @@ -15,12 +15,12 @@ public class WalletController { private final ConsoleOutput consoleOutput; private final ConsoleInput consoleInput; - private final WalletService walletService; + private final WalletMapperService walletMapperService; - public WalletController(ConsoleOutput consoleOutput, ConsoleInput consoleInput, WalletService walletService) { + public WalletController(ConsoleOutput consoleOutput, ConsoleInput consoleInput, WalletMapperService walletMapperService) { this.consoleOutput = consoleOutput; this.consoleInput = consoleInput; - this.walletService = walletService; + this.walletMapperService = walletMapperService; } public void wallet() { @@ -43,26 +43,26 @@ public void wallet() { private void createWallet() { consoleOutput.printCreateWalletMessage(); WalletCreateInfo walletCreateInfo = consoleInput.createWalletInput(); - walletService.create(walletCreateInfo); + walletMapperService.create(walletCreateInfo); } private void findVouchersByCustomerId() { consoleOutput.printAllVouchersByCustomerId(); UUID customerId = consoleInput.findAllVouchersByCustomerId(); - List voucherList = walletService.findVouchers(customerId); + List voucherList = walletMapperService.findVouchers(customerId); consoleOutput.printVouchers(voucherList); } private void deleteVoucherByCustomerId() { consoleOutput.printDeleteVoucherByCustomerId(); UUID customerId = consoleInput.deleteVoucherByCustomerId(); - walletService.delete(customerId); + walletMapperService.delete(customerId); } private void findCustomerByVoucherId() { consoleOutput.printCustomerByVoucherId(); UUID voucherId = consoleInput.findCustomerByVoucherId(); - consoleOutput.printCustomer(walletService.findCustomer(voucherId)); + consoleOutput.printCustomer(walletMapperService.findCustomer(voucherId)); } diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/domain/Wallet.java b/src/main/java/org/prgrms/vouchermanagement/wallet/domain/Wallet.java deleted file mode 100644 index f8c009885d..0000000000 --- a/src/main/java/org/prgrms/vouchermanagement/wallet/domain/Wallet.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.prgrms.vouchermanagement.wallet.domain; - -import java.util.UUID; - -public class Wallet { - private final UUID customerId; - private final UUID voucherId; - - public Wallet(UUID customerId, UUID voucherId) { - this.customerId = customerId; - this.voucherId = voucherId; - } - - public UUID getCustomerId() { - return customerId; - } - - public UUID getVoucherId() { - return voucherId; - } -} diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/domain/WalletMapper.java b/src/main/java/org/prgrms/vouchermanagement/wallet/domain/WalletMapper.java new file mode 100644 index 0000000000..399b0bca52 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/wallet/domain/WalletMapper.java @@ -0,0 +1,38 @@ +package org.prgrms.vouchermanagement.wallet.domain; + +import java.util.UUID; + +public class WalletMapper { + private final UUID customerId; + private final UUID voucherId; + + public WalletMapper(UUID customerId, UUID voucherId) { + this.customerId = customerId; + this.voucherId = voucherId; + } + + public UUID getCustomerId() { + return customerId; + } + + public UUID getVoucherId() { + return voucherId; + } +} + +/* + +wallet -> 클래스명을 고치자 + +dto -> pr.. + +테스트 +-> 장점 중 하나, 정상 작동을 하는 지 보장하기 위해 + +A -> B 수정이 발생해도 ㄱㅊ +구현에 의존적인 테스트 + +테스트의 이점 -> pr.. + +-> 상태 기반 테스트 행위 기반 테스트 구현에 의존적인 테스트 + */ diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletJdbcRepository.java b/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperJdbcMapperRepository.java similarity index 96% rename from src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletJdbcRepository.java rename to src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperJdbcMapperRepository.java index 1d9ecc45e2..8afc43444e 100644 --- a/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletJdbcRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperJdbcMapperRepository.java @@ -18,7 +18,7 @@ import java.util.UUID; @Repository -public class WalletJdbcRepository implements WalletRepository{ +public class WalletMapperJdbcMapperRepository implements WalletMapperRepository { private static final String CREATE = "INSERT INTO wallet(customer_id, voucher_id) VALUES(UUID_TO_BIN(?), UUID_TO_BIN(?))"; private static final String FINDVOUCHERS = "select v.voucher_id, v.discount_policy, v.amount FROM voucher v JOIN wallet w ON v.voucher_id = w.voucher_id WHERE w.customer_id = UUID_TO_BIN(?)"; @@ -27,7 +27,7 @@ public class WalletJdbcRepository implements WalletRepository{ private final JdbcTemplate jdbcTemplate; - public WalletJdbcRepository(JdbcTemplate jdbcTemplate) { + public WalletMapperJdbcMapperRepository(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletRepository.java b/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperRepository.java similarity index 91% rename from src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletRepository.java rename to src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperRepository.java index dcb488c633..9d9a021968 100644 --- a/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperRepository.java @@ -7,7 +7,7 @@ import java.util.List; import java.util.UUID; -public interface WalletRepository { +public interface WalletMapperRepository { int create(WalletCreateInfo walletCreateInfo); diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/service/WalletMapperService.java b/src/main/java/org/prgrms/vouchermanagement/wallet/service/WalletMapperService.java new file mode 100644 index 0000000000..8c32d5f57e --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/wallet/service/WalletMapperService.java @@ -0,0 +1,38 @@ +package org.prgrms.vouchermanagement.wallet.service; + +import org.prgrms.vouchermanagement.customer.domain.Customer; +import org.prgrms.vouchermanagement.dto.WalletCreateInfo; +import org.prgrms.vouchermanagement.voucher.domain.Voucher; +import org.prgrms.vouchermanagement.wallet.repository.WalletMapperRepository; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.UUID; + +@Service +public class WalletMapperService { + + private final WalletMapperRepository walletMapperRepository; + + public WalletMapperService(WalletMapperRepository walletMapperRepository) { + this.walletMapperRepository = walletMapperRepository; + } + + public WalletCreateInfo create(WalletCreateInfo walletCreateInfo) { + walletMapperRepository.create(walletCreateInfo); + return walletCreateInfo; + } + + public List findVouchers(UUID customerId) { + return walletMapperRepository.findVouchers(customerId); + } + + public UUID delete(UUID customerId) { + walletMapperRepository.delete(customerId); + return customerId; + } + + public Customer findCustomer(UUID voucherId) { + return walletMapperRepository.findCustomer(voucherId); + } +} diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/service/WalletService.java b/src/main/java/org/prgrms/vouchermanagement/wallet/service/WalletService.java deleted file mode 100644 index d87048d79b..0000000000 --- a/src/main/java/org/prgrms/vouchermanagement/wallet/service/WalletService.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.prgrms.vouchermanagement.wallet.service; - -import org.prgrms.vouchermanagement.customer.domain.Customer; -import org.prgrms.vouchermanagement.dto.WalletCreateInfo; -import org.prgrms.vouchermanagement.voucher.domain.Voucher; -import org.prgrms.vouchermanagement.wallet.repository.WalletRepository; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.UUID; - -@Service -public class WalletService { - - private final WalletRepository walletRepository; - - public WalletService(WalletRepository walletRepository) { - this.walletRepository = walletRepository; - } - - public void create(WalletCreateInfo walletCreateInfo) { - walletRepository.create(walletCreateInfo); - } - - - public List findVouchers(UUID customerId) { - return walletRepository.findVouchers(customerId); - } - - public void delete(UUID customerId) { - walletRepository.delete(customerId); - } - - public Customer findCustomer(UUID voucherId) { - return walletRepository.findCustomer(voucherId); - } -} diff --git a/src/test/java/org/prgrms/vouchermanagement/wallet/service/WalletMapperServiceTest.java b/src/test/java/org/prgrms/vouchermanagement/wallet/service/WalletMapperServiceTest.java new file mode 100644 index 0000000000..514126d776 --- /dev/null +++ b/src/test/java/org/prgrms/vouchermanagement/wallet/service/WalletMapperServiceTest.java @@ -0,0 +1,60 @@ +package org.prgrms.vouchermanagement.wallet.service; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.prgrms.vouchermanagement.customer.domain.Customer; +import org.prgrms.vouchermanagement.dto.WalletCreateInfo; +import org.prgrms.vouchermanagement.voucher.domain.Voucher; +import org.prgrms.vouchermanagement.voucher.policy.FixedAmountVoucher; +import org.prgrms.vouchermanagement.wallet.repository.WalletMapperRepository; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import java.util.UUID; + +import static org.assertj.core.api.Assertions.*; + +@SpringBootTest +@Transactional +public class WalletMapperServiceTest { + + + @InjectMocks + private WalletMapperService walletMapperService; + + @Mock + private WalletMapperRepository walletMapperRepository; + + @Test + @DisplayName("wallet 생성 테스트") + void create() { + //given + Customer customer = new Customer(UUID.randomUUID(), "gyu", 23); + UUID customerId = customer.getUserId(); + + Voucher voucher = new Voucher(UUID.randomUUID(), new FixedAmountVoucher(3000)); + UUID voucherId = voucher.getVoucherId(); + + WalletCreateInfo walletCreateInfo = new WalletCreateInfo(customerId, voucherId); + + //when + WalletCreateInfo returnCreateInfo = walletMapperService.create(walletCreateInfo); + + //then + assertThat(returnCreateInfo).isNotNull(); + } +//jpa x -> 실제로 작성하는 쿼리 기반으로는 테스트 + @Test + void findVouchers() { + } + + @Test + void delete() { + } + + @Test + void findCustomer() { + } +} From 47119fe2bd2180121cedb91024be02328ba17d48 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Tue, 31 Oct 2023 16:25:36 +0900 Subject: [PATCH 085/101] =?UTF-8?q?Refactor=20:=20wallet=20find=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20Optional=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wallet/domain/WalletMapper.java | 17 ----------------- .../WalletMapperJdbcMapperRepository.java | 10 ++++------ .../repository/WalletMapperRepository.java | 3 ++- .../wallet/service/WalletMapperService.java | 5 ++++- 4 files changed, 10 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/domain/WalletMapper.java b/src/main/java/org/prgrms/vouchermanagement/wallet/domain/WalletMapper.java index 399b0bca52..876c62f399 100644 --- a/src/main/java/org/prgrms/vouchermanagement/wallet/domain/WalletMapper.java +++ b/src/main/java/org/prgrms/vouchermanagement/wallet/domain/WalletMapper.java @@ -19,20 +19,3 @@ public UUID getVoucherId() { return voucherId; } } - -/* - -wallet -> 클래스명을 고치자 - -dto -> pr.. - -테스트 --> 장점 중 하나, 정상 작동을 하는 지 보장하기 위해 - -A -> B 수정이 발생해도 ㄱㅊ -구현에 의존적인 테스트 - -테스트의 이점 -> pr.. - --> 상태 기반 테스트 행위 기반 테스트 구현에 의존적인 테스트 - */ diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperJdbcMapperRepository.java b/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperJdbcMapperRepository.java index 8afc43444e..97123bb0e6 100644 --- a/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperJdbcMapperRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperJdbcMapperRepository.java @@ -15,6 +15,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; +import java.util.Optional; import java.util.UUID; @Repository @@ -38,24 +39,21 @@ public int create(WalletCreateInfo walletCreateInfo) { return jdbcTemplate.update(CREATE, customerId.toString().getBytes(), voucherId.toString().getBytes()); } - //repository 메서드 추상화 @Override public List findVouchers(UUID customerId) { return jdbcTemplate.query(FINDVOUCHERS, new Object[]{customerId.toString().getBytes()}, new VoucherRowMapper()); } - //메서드명 자세하게 @Override public int delete(UUID customerId) { return jdbcTemplate.update(DELETE, customerId.toString().getBytes()); } - @Override - public Customer findCustomer(UUID voucherId) { - return jdbcTemplate.query(FINDCUSTOMER, new Object[]{voucherId.toString().getBytes()}, new CustomerRowMapper()).get(0); + public Optional findCustomer(UUID voucherId) { + List customers = jdbcTemplate.query(FINDCUSTOMER, new Object[]{voucherId.toString().getBytes()}, new CustomerRowMapper()); + return customers.stream().findFirst(); } - //null값 -> optional private class VoucherRowMapper implements RowMapper { @Override diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperRepository.java b/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperRepository.java index 9d9a021968..5e6612b686 100644 --- a/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperRepository.java @@ -5,6 +5,7 @@ import org.prgrms.vouchermanagement.voucher.domain.Voucher; import java.util.List; +import java.util.Optional; import java.util.UUID; public interface WalletMapperRepository { @@ -15,5 +16,5 @@ public interface WalletMapperRepository { int delete(UUID customerId); - Customer findCustomer(UUID voucherId); + Optional findCustomer(UUID voucherId); } diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/service/WalletMapperService.java b/src/main/java/org/prgrms/vouchermanagement/wallet/service/WalletMapperService.java index 8c32d5f57e..2e8501a61a 100644 --- a/src/main/java/org/prgrms/vouchermanagement/wallet/service/WalletMapperService.java +++ b/src/main/java/org/prgrms/vouchermanagement/wallet/service/WalletMapperService.java @@ -2,6 +2,7 @@ import org.prgrms.vouchermanagement.customer.domain.Customer; import org.prgrms.vouchermanagement.dto.WalletCreateInfo; +import org.prgrms.vouchermanagement.exception.LoadFailException; import org.prgrms.vouchermanagement.voucher.domain.Voucher; import org.prgrms.vouchermanagement.wallet.repository.WalletMapperRepository; import org.springframework.stereotype.Service; @@ -33,6 +34,8 @@ public UUID delete(UUID customerId) { } public Customer findCustomer(UUID voucherId) { - return walletMapperRepository.findCustomer(voucherId); + return walletMapperRepository + .findCustomer(voucherId) + .orElseThrow(() -> new LoadFailException("찾을 수 없습니다.")); } } From ca11586784102b1f274b930eae8bb7263a8283e9 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 2 Nov 2023 15:50:47 +0900 Subject: [PATCH 086/101] =?UTF-8?q?feat=20:=20wallet=20=EC=A0=84=EC=B2=B4?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WalletController.java | 4 +-- .../WalletMapperJdbcMapperRepository.java | 16 +++++++++ .../repository/WalletMapperRepository.java | 3 ++ .../wallet/service/WalletMapperService.java | 5 +++ .../service/WalletMapperServiceTest.java | 35 +++++++++---------- 5 files changed, 42 insertions(+), 21 deletions(-) rename src/main/java/org/prgrms/vouchermanagement/{controller => consoleController}/WalletController.java (95%) diff --git a/src/main/java/org/prgrms/vouchermanagement/controller/WalletController.java b/src/main/java/org/prgrms/vouchermanagement/consoleController/WalletController.java similarity index 95% rename from src/main/java/org/prgrms/vouchermanagement/controller/WalletController.java rename to src/main/java/org/prgrms/vouchermanagement/consoleController/WalletController.java index b71dad14eb..9ebbaf59e3 100644 --- a/src/main/java/org/prgrms/vouchermanagement/controller/WalletController.java +++ b/src/main/java/org/prgrms/vouchermanagement/consoleController/WalletController.java @@ -1,4 +1,4 @@ -package org.prgrms.vouchermanagement.controller; +package org.prgrms.vouchermanagement.consoleController; import org.prgrms.vouchermanagement.dto.WalletCreateInfo; import org.prgrms.vouchermanagement.view.Command; @@ -27,7 +27,7 @@ public void wallet() { boolean notExitCommand = true; while (notExitCommand) { - consoleOutput.printWalletMessage(); + consoleOutput.printWalletOptionMessage(); Command command = consoleInput.commandInput(); switch (command) { diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperJdbcMapperRepository.java b/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperJdbcMapperRepository.java index 97123bb0e6..a59b6c72fc 100644 --- a/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperJdbcMapperRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperJdbcMapperRepository.java @@ -7,6 +7,7 @@ import org.prgrms.vouchermanagement.voucher.policy.FixedAmountVoucher; import org.prgrms.vouchermanagement.voucher.policy.PercentDiscountVoucher; import org.prgrms.vouchermanagement.voucher.policy.PolicyStatus; +import org.prgrms.vouchermanagement.wallet.domain.WalletMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; @@ -25,6 +26,7 @@ public class WalletMapperJdbcMapperRepository implements WalletMapperRepository private static final String FINDVOUCHERS = "select v.voucher_id, v.discount_policy, v.amount FROM voucher v JOIN wallet w ON v.voucher_id = w.voucher_id WHERE w.customer_id = UUID_TO_BIN(?)"; private static final String DELETE = "DELETE FROM wallet WHERE customer_id = UUID_TO_BIN(?)"; private static final String FINDCUSTOMER = "SELECT c.customer_id, c.customer_name, c.customer_age FROM wallet w, customer c WHERE w.customer_id = c.customer_id AND w.voucher_id = UUID_TO_BIN(?)"; + private static final String FINDALL = "SELECT customer_id, voucher_id FROM wallet"; private final JdbcTemplate jdbcTemplate; @@ -45,6 +47,10 @@ public List findVouchers(UUID customerId) { return jdbcTemplate.query(FINDVOUCHERS, new Object[]{customerId.toString().getBytes()}, new VoucherRowMapper()); } + public List findAll() { + return jdbcTemplate.query(FINDALL, new WalletRowMapper()); + } + @Override public int delete(UUID customerId) { return jdbcTemplate.update(DELETE, customerId.toString().getBytes()); @@ -55,6 +61,16 @@ public Optional findCustomer(UUID voucherId) { return customers.stream().findFirst(); } + private class WalletRowMapper implements RowMapper { + @Override + public WalletMapper mapRow(ResultSet resultSet, int rowNum) throws SQLException { + UUID customerId = toUUID(resultSet.getBytes("customer_id")); + UUID voucherId = toUUID(resultSet.getBytes("voucher_id")); + + return new WalletMapper(customerId, voucherId); + } + } + private class VoucherRowMapper implements RowMapper { @Override public Voucher mapRow(ResultSet resultSet, int rowNum) throws SQLException { diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperRepository.java b/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperRepository.java index 5e6612b686..0bf336469e 100644 --- a/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/wallet/repository/WalletMapperRepository.java @@ -3,6 +3,7 @@ import org.prgrms.vouchermanagement.customer.domain.Customer; import org.prgrms.vouchermanagement.dto.WalletCreateInfo; import org.prgrms.vouchermanagement.voucher.domain.Voucher; +import org.prgrms.vouchermanagement.wallet.domain.WalletMapper; import java.util.List; import java.util.Optional; @@ -16,5 +17,7 @@ public interface WalletMapperRepository { int delete(UUID customerId); + List findAll(); + Optional findCustomer(UUID voucherId); } diff --git a/src/main/java/org/prgrms/vouchermanagement/wallet/service/WalletMapperService.java b/src/main/java/org/prgrms/vouchermanagement/wallet/service/WalletMapperService.java index 2e8501a61a..416a233b5a 100644 --- a/src/main/java/org/prgrms/vouchermanagement/wallet/service/WalletMapperService.java +++ b/src/main/java/org/prgrms/vouchermanagement/wallet/service/WalletMapperService.java @@ -4,6 +4,7 @@ import org.prgrms.vouchermanagement.dto.WalletCreateInfo; import org.prgrms.vouchermanagement.exception.LoadFailException; import org.prgrms.vouchermanagement.voucher.domain.Voucher; +import org.prgrms.vouchermanagement.wallet.domain.WalletMapper; import org.prgrms.vouchermanagement.wallet.repository.WalletMapperRepository; import org.springframework.stereotype.Service; @@ -38,4 +39,8 @@ public Customer findCustomer(UUID voucherId) { .findCustomer(voucherId) .orElseThrow(() -> new LoadFailException("찾을 수 없습니다.")); } + + public List findAll() { + return walletMapperRepository.findAll(); + } } diff --git a/src/test/java/org/prgrms/vouchermanagement/wallet/service/WalletMapperServiceTest.java b/src/test/java/org/prgrms/vouchermanagement/wallet/service/WalletMapperServiceTest.java index 514126d776..71a38407c0 100644 --- a/src/test/java/org/prgrms/vouchermanagement/wallet/service/WalletMapperServiceTest.java +++ b/src/test/java/org/prgrms/vouchermanagement/wallet/service/WalletMapperServiceTest.java @@ -1,51 +1,48 @@ package org.prgrms.vouchermanagement.wallet.service; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; import org.prgrms.vouchermanagement.customer.domain.Customer; import org.prgrms.vouchermanagement.dto.WalletCreateInfo; import org.prgrms.vouchermanagement.voucher.domain.Voucher; import org.prgrms.vouchermanagement.voucher.policy.FixedAmountVoucher; import org.prgrms.vouchermanagement.wallet.repository.WalletMapperRepository; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.transaction.annotation.Transactional; +import java.util.Optional; import java.util.UUID; import static org.assertj.core.api.Assertions.*; @SpringBootTest -@Transactional public class WalletMapperServiceTest { + WalletMapperService walletMapperService; + WalletMapperRepository walletMapperRepository; - @InjectMocks - private WalletMapperService walletMapperService; - - @Mock - private WalletMapperRepository walletMapperRepository; + @BeforeEach + void setUp() { + walletMapperService = new WalletMapperService(walletMapperRepository); + } @Test @DisplayName("wallet 생성 테스트") void create() { - //given - Customer customer = new Customer(UUID.randomUUID(), "gyu", 23); - UUID customerId = customer.getUserId(); - + Customer customer = new Customer(UUID.randomUUID(), "김남규", 23); Voucher voucher = new Voucher(UUID.randomUUID(), new FixedAmountVoucher(3000)); + + UUID userId = customer.getUserId(); UUID voucherId = voucher.getVoucherId(); - WalletCreateInfo walletCreateInfo = new WalletCreateInfo(customerId, voucherId); + WalletCreateInfo walletCreateInfo = walletMapperService.create(new WalletCreateInfo(userId, voucherId)); - //when - WalletCreateInfo returnCreateInfo = walletMapperService.create(walletCreateInfo); + Optional customer1 = walletMapperRepository.findCustomer(voucherId); - //then - assertThat(returnCreateInfo).isNotNull(); + assertThat(customer1.get()).isNotNull(); } -//jpa x -> 실제로 작성하는 쿼리 기반으로는 테스트 + @Test void findVouchers() { } From deb2a16549abc61a9287167387021fa7c1f05804 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 2 Nov 2023 15:51:58 +0900 Subject: [PATCH 087/101] =?UTF-8?q?feat=20:=20wallet=20web=20controller=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webController/WalletWebController.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/webController/WalletWebController.java diff --git a/src/main/java/org/prgrms/vouchermanagement/webController/WalletWebController.java b/src/main/java/org/prgrms/vouchermanagement/webController/WalletWebController.java new file mode 100644 index 0000000000..b474305f32 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/webController/WalletWebController.java @@ -0,0 +1,62 @@ +package org.prgrms.vouchermanagement.webController; + +import org.prgrms.vouchermanagement.dto.WalletCreateInfo; +import org.prgrms.vouchermanagement.wallet.domain.WalletMapper; +import org.prgrms.vouchermanagement.wallet.service.WalletMapperService; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; +import java.util.UUID; + +@Controller +@RequestMapping("/wallet") +public class WalletWebController { + + private final WalletMapperService walletMapperService; + + public WalletWebController(WalletMapperService walletMapperService) { + this.walletMapperService = walletMapperService; + } + + @GetMapping("/wallet-home") + public String walletHome() { + return "/wallet/wallet-home"; + } + + @GetMapping("/create") + public String createWallet() { + return "wallet/create"; + } + + @PostMapping("/create") + public String createWallet(@RequestParam("customerId") String customerId, @RequestParam("voucherId") String voucherId) { + walletMapperService.create(new WalletCreateInfo(UUID.fromString(customerId), UUID.fromString(voucherId))); + + return "redirect:/wallet/create"; + } + + @GetMapping("/list") + public String voucherList(Model model) { + List wallets = walletMapperService.findAll(); + model.addAttribute("wallets", wallets); + return "wallet/list"; + } + + @GetMapping("/delete") + public String deleteWallet() { + return "wallet/delete"; + } + + @PostMapping("/delete") + public String createWallet(@RequestParam("customerId") String customerId) { + walletMapperService.delete(UUID.fromString(customerId)); + + return "redirect:/wallet/delete"; + } + +} From e18fe7fcd3a3b6315a9bf826f3541f459c275bc6 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 2 Nov 2023 15:52:12 +0900 Subject: [PATCH 088/101] =?UTF-8?q?feat=20:=20wallet=20home=20page=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templates/wallet/wallet-home.html | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/main/resources/templates/wallet/wallet-home.html diff --git a/src/main/resources/templates/wallet/wallet-home.html b/src/main/resources/templates/wallet/wallet-home.html new file mode 100644 index 0000000000..45f4b5b24b --- /dev/null +++ b/src/main/resources/templates/wallet/wallet-home.html @@ -0,0 +1,36 @@ + + + + + Wallet Home + + + + +
+

SpringBoot Basic

+

Wallet Options

+
+ +
+ + + +
+ + + + + + + From ecb33579eda19ab892cc5b6f936b552ddd90f09d Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 2 Nov 2023 15:52:26 +0900 Subject: [PATCH 089/101] =?UTF-8?q?feat=20:=20voucher=20home=20page=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templates/voucher/voucher-home.html | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/main/resources/templates/voucher/voucher-home.html diff --git a/src/main/resources/templates/voucher/voucher-home.html b/src/main/resources/templates/voucher/voucher-home.html new file mode 100644 index 0000000000..f012ff5808 --- /dev/null +++ b/src/main/resources/templates/voucher/voucher-home.html @@ -0,0 +1,39 @@ + + + + + SpringBoot Basic + + + + +
+

SpringBoot Basic

+

Voucher Options

+
+ +
+ + + +
+ + + + + + + From 0c4c11f898deed057b83e1d6ffc37bae204771d6 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 2 Nov 2023 15:52:37 +0900 Subject: [PATCH 090/101] =?UTF-8?q?feat=20:=20voucher=20web=20controller?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webController/VoucherWebController.java | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/webController/VoucherWebController.java diff --git a/src/main/java/org/prgrms/vouchermanagement/webController/VoucherWebController.java b/src/main/java/org/prgrms/vouchermanagement/webController/VoucherWebController.java new file mode 100644 index 0000000000..d9ad3bf3b5 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/webController/VoucherWebController.java @@ -0,0 +1,90 @@ +package org.prgrms.vouchermanagement.webController; + +import org.prgrms.vouchermanagement.exception.InvalidInputException; +import org.prgrms.vouchermanagement.voucher.domain.Voucher; +import org.prgrms.vouchermanagement.voucher.policy.PolicyStatus; +import org.prgrms.vouchermanagement.voucher.service.VoucherService; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.UUID; + +@Controller +@RequestMapping("/voucher") +public class VoucherWebController { + + private final VoucherService voucherService; + + public VoucherWebController(VoucherService voucherService) { + this.voucherService = voucherService; + } + + @GetMapping("/voucher-home") + public String voucherHome() { + return "voucher/voucher-home"; + } + + @GetMapping("/create") + public String createVoucher() { + return "voucher/create"; + } + + @PostMapping("/create") + public String createVoucher(@RequestParam("policy") String policy, @RequestParam("amount") long amount) { + voucherService.createVoucher(validateAndConvertPolicy(policy), validateAndConvertAmountOrPercent(String.valueOf(amount))); + + return "redirect:/voucher/create"; + } + + @GetMapping("/find") + public String findVoucher() { + return "voucher/find"; + } + + @PostMapping("/find") + public String findVoucher(@RequestParam("voucherId") String uuid, Model model) { + UUID voucherId = UUID.fromString(uuid); + Voucher voucher = voucherService.findVoucher(voucherId); + + model.addAttribute("voucher", voucher); + + return "/voucher/find-voucher"; + } + + @GetMapping("/list") + public String voucherList(Model model) { + List vouchers = voucherService.voucherLists(); + model.addAttribute("vouchers", vouchers); + return "voucher/list"; + } + + @GetMapping("/delete") + public String deleteVoucher() { + return "voucher/delete"; + } + + @PostMapping("/delete") + public String deleteVoucher(@RequestParam("voucherId") String uuid) { + UUID voucherId = UUID.fromString(uuid); + voucherService.deleteVoucher(voucherId); + return "redirect:/voucher/delete"; + } + + private PolicyStatus validateAndConvertPolicy(String inputPolicy) { + try { + return PolicyStatus.valueOf(inputPolicy.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new InvalidInputException("잘못된 policy 입력입니다."); + } + } + + private long validateAndConvertAmountOrPercent(String inputAmountOrPercent) { + try { + return Long.parseLong(inputAmountOrPercent); + } catch (NumberFormatException e) { + throw new InvalidInputException("잘못된 amountOrPercent 입력입니다."); + } + } +} From 8b5959861325e0c9e2e4705daec0b9aa68a7d5aa Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 2 Nov 2023 15:53:04 +0900 Subject: [PATCH 091/101] =?UTF-8?q?Refactor=20:=20create=EC=9D=98=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=ED=83=80=EC=9E=85=20=EA=B5=90=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../VoucherController.java | 6 ++++-- .../voucher/repository/VoucherRepository.java | 7 +++++-- .../voucher/service/VoucherService.java | 19 +++++++++++++------ 3 files changed, 22 insertions(+), 10 deletions(-) rename src/main/java/org/prgrms/vouchermanagement/{controller => consoleController}/VoucherController.java (92%) diff --git a/src/main/java/org/prgrms/vouchermanagement/controller/VoucherController.java b/src/main/java/org/prgrms/vouchermanagement/consoleController/VoucherController.java similarity index 92% rename from src/main/java/org/prgrms/vouchermanagement/controller/VoucherController.java rename to src/main/java/org/prgrms/vouchermanagement/consoleController/VoucherController.java index bbac4ba327..f427121415 100644 --- a/src/main/java/org/prgrms/vouchermanagement/controller/VoucherController.java +++ b/src/main/java/org/prgrms/vouchermanagement/consoleController/VoucherController.java @@ -1,4 +1,4 @@ -package org.prgrms.vouchermanagement.controller; +package org.prgrms.vouchermanagement.consoleController; import org.prgrms.vouchermanagement.dto.VoucherCreateInfo; import org.prgrms.vouchermanagement.dto.VoucherUpdateInfo; @@ -10,6 +10,7 @@ import org.springframework.stereotype.Controller; import java.util.List; +import java.util.UUID; @Controller public class VoucherController { @@ -61,7 +62,8 @@ private void updateVoucher() { private void deleteVoucher() { consoleOutput.printDeleteVoucherMessage(); - voucherService.deleteVoucher(); + UUID voucherId = consoleInput.deleteVoucherInput(); + voucherService.deleteVoucher(voucherId); } diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/repository/VoucherRepository.java b/src/main/java/org/prgrms/vouchermanagement/voucher/repository/VoucherRepository.java index b5a31fc815..b8b97235e9 100644 --- a/src/main/java/org/prgrms/vouchermanagement/voucher/repository/VoucherRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/repository/VoucherRepository.java @@ -2,6 +2,7 @@ import org.prgrms.vouchermanagement.voucher.policy.DiscountPolicy; import org.prgrms.vouchermanagement.voucher.domain.Voucher; +import org.prgrms.vouchermanagement.voucher.policy.PolicyStatus; import java.util.List; import java.util.UUID; @@ -13,7 +14,9 @@ public interface VoucherRepository { void update(UUID voucherId, long amount); - int deleteAll(); + int delete(UUID voucherId); - Voucher getById(UUID voucherId); + Voucher findById(UUID voucherId); + + List findVoucherByPolicy(PolicyStatus policy); } diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/service/VoucherService.java b/src/main/java/org/prgrms/vouchermanagement/voucher/service/VoucherService.java index f16f45c9c6..240ec232ba 100644 --- a/src/main/java/org/prgrms/vouchermanagement/voucher/service/VoucherService.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/service/VoucherService.java @@ -20,12 +20,15 @@ public VoucherService(VoucherRepository voucherRepository) { this.voucherRepository = voucherRepository; } - public void createVoucher(PolicyStatus policy, long amountOrPercent) { + public Voucher createVoucher(PolicyStatus policy, long amountOrPercent) { UUID voucherId = UUID.randomUUID(); - DiscountPolicy discountPolicy = getDiscountPolicy(policy, amountOrPercent); - voucherRepository.create(voucherId, discountPolicy); + return new Voucher(voucherId, discountPolicy); + } + + public Voucher findVoucher(UUID voucherId) { + return voucherRepository.findById(voucherId); } public List voucherLists() { @@ -36,11 +39,15 @@ public void updateVoucher(UUID voucherId, long amountOrPercent) { voucherRepository.update(voucherId, amountOrPercent); } - public void deleteVoucher() { - voucherRepository.deleteAll(); + public Voucher deleteVoucher(UUID voucherId) { + Voucher voucher = voucherRepository.findById(voucherId); + voucherRepository.delete(voucherId); + return voucher; } - + public List findVouchersByPolicy(PolicyStatus policy) { + return voucherRepository.findVoucherByPolicy(policy); + } private DiscountPolicy getDiscountPolicy(PolicyStatus policy, long amountOrPercent) { DiscountPolicy discountPolicy = null; From b3ffdad35955f855236f538af659ae6ca760c1f0 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 2 Nov 2023 15:53:29 +0900 Subject: [PATCH 092/101] =?UTF-8?q?feat=20:=20json=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=A5=BC=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=ED=95=98=EB=8A=94=20rest=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webController/VoucherApiController.java | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/main/java/org/prgrms/vouchermanagement/webController/VoucherApiController.java diff --git a/src/main/java/org/prgrms/vouchermanagement/webController/VoucherApiController.java b/src/main/java/org/prgrms/vouchermanagement/webController/VoucherApiController.java new file mode 100644 index 0000000000..6f6ac5f68e --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/webController/VoucherApiController.java @@ -0,0 +1,84 @@ +package org.prgrms.vouchermanagement.webController; + +import org.prgrms.vouchermanagement.dto.VoucherCreateInfo; +import org.prgrms.vouchermanagement.exception.InvalidInputException; +import org.prgrms.vouchermanagement.voucher.domain.Voucher; +import org.prgrms.vouchermanagement.voucher.policy.PolicyStatus; +import org.prgrms.vouchermanagement.voucher.service.VoucherService; +import org.springframework.web.bind.annotation.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +@RestController +@RequestMapping("/api/v1/voucher") +public class VoucherApiController { + + private final VoucherService voucherService; + + public VoucherApiController(VoucherService voucherService) { + this.voucherService = voucherService; + } + + @GetMapping("/list") + public List voucherList() { + return voucherService.voucherLists(); + } + + @PostMapping + public Voucher createVoucher(@RequestBody VoucherCreateInfo voucherCreateInfo) { + PolicyStatus policy = validateAndConvertPolicy(voucherCreateInfo.policy().toString()); + long amountOrPercent = validateAndConvertAmountOrPercent(String.valueOf(voucherCreateInfo.amountOrPercent())); + + return voucherService.createVoucher(policy, amountOrPercent); + } + + @GetMapping + public List findVouchers( + @RequestParam(name = "voucherId", required = false) String voucherId, + @RequestParam(name = "policy", required = false) String policy) { + + List vouchers = new ArrayList<>(); + + if (voucherId != null && policy != null) { + // voucherId와 policy 모두 제공된 경우 + UUID getVoucherId = UUID.fromString(voucherId); + Voucher findVoucher = voucherService.findVoucher(getVoucherId); + vouchers.add(findVoucher); + } else if (voucherId != null) { + // voucherId만 제공된 경우 + UUID getVoucherId = UUID.fromString(voucherId); + Voucher findVoucher = voucherService.findVoucher(getVoucherId); + vouchers.add(findVoucher); + } else if (policy != null) { + // policy만 제공된 경우 + PolicyStatus getPolicy = validateAndConvertPolicy(policy); + vouchers = voucherService.findVouchersByPolicy(getPolicy); + } + + return vouchers; + } + + @DeleteMapping("{voucherId}") + public Voucher deleteVoucher(@PathVariable UUID voucherId) { + return voucherService.deleteVoucher(voucherId); + } + + private PolicyStatus validateAndConvertPolicy(String inputPolicy) { + try { + return PolicyStatus.valueOf(inputPolicy.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new InvalidInputException("잘못된 policy 입력입니다."); + } + } + + private long validateAndConvertAmountOrPercent(String inputAmountOrPercent) { + try { + return Long.parseLong(inputAmountOrPercent); + } catch (NumberFormatException e) { + throw new InvalidInputException("잘못된 amountOrPercent 입력입니다."); + } + } + +} From ed2ed01172cf81b25d21ced8c6e926ec8213e688 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 2 Nov 2023 15:54:37 +0900 Subject: [PATCH 093/101] =?UTF-8?q?feat=20:=20policy=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/DatabaseRepository.java | 51 ++++++++----------- .../voucher/repository/FileRepository.java | 9 +++- .../voucher/repository/MemoryRepository.java | 10 +++- 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/repository/DatabaseRepository.java b/src/main/java/org/prgrms/vouchermanagement/voucher/repository/DatabaseRepository.java index f8038bc3cc..c63e5419ec 100644 --- a/src/main/java/org/prgrms/vouchermanagement/voucher/repository/DatabaseRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/repository/DatabaseRepository.java @@ -1,11 +1,14 @@ package org.prgrms.vouchermanagement.voucher.repository; +import org.prgrms.vouchermanagement.exception.LoadFailException; import org.prgrms.vouchermanagement.voucher.domain.Voucher; import org.prgrms.vouchermanagement.voucher.policy.DiscountPolicy; import org.prgrms.vouchermanagement.voucher.policy.FixedAmountVoucher; import org.prgrms.vouchermanagement.voucher.policy.PercentDiscountVoucher; import org.prgrms.vouchermanagement.voucher.policy.PolicyStatus; +import org.prgrms.vouchermanagement.wallet.repository.WalletMapperJdbcMapperRepository; import org.springframework.context.annotation.Profile; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.stereotype.Repository; @@ -22,16 +25,15 @@ public class DatabaseRepository implements VoucherRepository { private static final String LOAD = "SELECT voucher_id, discount_policy, amount FROM voucher"; private static final String CREATE = "INSERT INTO voucher(voucher_id, discount_policy, amount) VALUES(UUID_TO_BIN(?), (?), (?))"; + private static final String FIND_BY_ID = "SELECT voucher_id, discount_policy, amount FROM voucher WHERE voucher_id = UUID_TO_BIN(?)"; private static final String UPDATE_AMOUNT_BY_ID = "UPDATE voucher SET amount = ? WHERE voucher_id = UUID_TO_BIN(?)"; - private static final String DELETE_BY_ID = "DELETE FROM voucher"; + private static final String DELETE_BY_ID = "DELETE FROM voucher WHERE voucher_id = UUID_TO_BIN(?)"; + private static final String FIND_BY_POLICY = "SELECT voucher_id, discount_policy, amount FROM voucher WHERE discount_policy = ?"; - private final Map storage = new ConcurrentHashMap<>(); private final JdbcTemplate jdbcTemplate; public DatabaseRepository(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; - - load(); } //create @@ -40,52 +42,39 @@ public int create(UUID voucherId, DiscountPolicy discountPolicy) { String policy = String.valueOf(discountPolicy.getPolicyStatus()); long amount = discountPolicy.getAmountOrPercent(); - int rowsAffected = jdbcTemplate.update(CREATE, voucherId.toString().getBytes(), policy, amount); - - Voucher voucher = new Voucher(voucherId, discountPolicy); - storage.put(voucherId, voucher); - - return rowsAffected; + return jdbcTemplate.update(CREATE, voucherId.toString().getBytes(), policy, amount); } //read @Override public List voucherLists() { - return storage.values().stream() - .toList(); + return jdbcTemplate.query(LOAD, new VoucherRowMapper()); } //update public void update(UUID voucherId, long amountOrPercent) { jdbcTemplate.update(UPDATE_AMOUNT_BY_ID, amountOrPercent, voucherId.toString().getBytes()); - - Voucher findVoucher = storage.get(voucherId); - PolicyStatus policy = findVoucher.getDiscountPolicy().getPolicyStatus(); - - DiscountPolicy discountPolicy = getPolicy(policy, amountOrPercent); - - Voucher updateVoucher = new Voucher(voucherId, discountPolicy); - storage.put(voucherId, updateVoucher); } //delete @Override - public int deleteAll() { - int rowsAffected = jdbcTemplate.update(DELETE_BY_ID); - storage.clear(); - return rowsAffected; + public int delete(UUID voucherId) { + return jdbcTemplate.update(DELETE_BY_ID, voucherId.toString().getBytes()); } + //find @Override - public Voucher getById(UUID voucherId) { - return storage.get(voucherId); + public Voucher findById(UUID voucherId) { + try { + return jdbcTemplate.queryForObject(FIND_BY_ID, new Object[]{voucherId.toString().getBytes()}, new VoucherRowMapper()); + } catch (EmptyResultDataAccessException e) { + throw new LoadFailException("찾을 수 없습니다."); + } } - private void load() { - List vouchers = jdbcTemplate.query(LOAD, new VoucherRowMapper()); - for (Voucher voucher : vouchers) { - storage.put(voucher.getVoucherId(), voucher); - } + @Override + public List findVoucherByPolicy(PolicyStatus policy) { + return jdbcTemplate.query(FIND_BY_POLICY, new VoucherRowMapper(), policy.name()); } //load 역할 diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/repository/FileRepository.java b/src/main/java/org/prgrms/vouchermanagement/voucher/repository/FileRepository.java index 0ecb6e47a8..a7e75ccf5d 100644 --- a/src/main/java/org/prgrms/vouchermanagement/voucher/repository/FileRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/repository/FileRepository.java @@ -79,13 +79,18 @@ public void update(UUID voucherId, long amount) { } @Override - public int deleteAll() { + public int delete(UUID voucherId) { return 0; } @Override - public Voucher getById(UUID voucherId) { + public Voucher findById(UUID voucherId) { return storage.get(voucherId); } + + @Override + public List findVoucherByPolicy(PolicyStatus policy) { + return null; + } } diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/repository/MemoryRepository.java b/src/main/java/org/prgrms/vouchermanagement/voucher/repository/MemoryRepository.java index db0dfcb515..c6a4ce678c 100644 --- a/src/main/java/org/prgrms/vouchermanagement/voucher/repository/MemoryRepository.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/repository/MemoryRepository.java @@ -2,6 +2,7 @@ import org.prgrms.vouchermanagement.voucher.domain.Voucher; import org.prgrms.vouchermanagement.voucher.policy.DiscountPolicy; +import org.prgrms.vouchermanagement.voucher.policy.PolicyStatus; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; @@ -35,13 +36,18 @@ public void update(UUID voucherId, long amount) { } @Override - public int deleteAll() { + public int delete(UUID voucherId) { return 0; } @Override - public Voucher getById(UUID voucherId) { + public Voucher findById(UUID voucherId) { return storage.get(voucherId); } + + @Override + public List findVoucherByPolicy(PolicyStatus policy) { + return null; + } } From d7c1b59c37aad14f6874f162fa7a942bb3b2229c Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 2 Nov 2023 15:55:05 +0900 Subject: [PATCH 094/101] =?UTF-8?q?feat=20:=20wallet=20page=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/templates/wallet/create.html | 29 ++++++++++++++++ .../resources/templates/wallet/delete.html | 26 ++++++++++++++ src/main/resources/templates/wallet/list.html | 34 +++++++++++++++++++ 3 files changed, 89 insertions(+) create mode 100644 src/main/resources/templates/wallet/create.html create mode 100644 src/main/resources/templates/wallet/delete.html create mode 100644 src/main/resources/templates/wallet/list.html diff --git a/src/main/resources/templates/wallet/create.html b/src/main/resources/templates/wallet/create.html new file mode 100644 index 0000000000..5887521d5e --- /dev/null +++ b/src/main/resources/templates/wallet/create.html @@ -0,0 +1,29 @@ + + + + + Create Wallet + + + +

Create Wallet

+ +
+ + +
+ + + +
+ + + + + +
+ + + + + diff --git a/src/main/resources/templates/wallet/delete.html b/src/main/resources/templates/wallet/delete.html new file mode 100644 index 0000000000..eb9a9bd470 --- /dev/null +++ b/src/main/resources/templates/wallet/delete.html @@ -0,0 +1,26 @@ + + + + + Delete Wallet + + + +

Delete Wallet

+ +
+ + +
+ + + + + +
+ + + + + + diff --git a/src/main/resources/templates/wallet/list.html b/src/main/resources/templates/wallet/list.html new file mode 100644 index 0000000000..18a4e7209c --- /dev/null +++ b/src/main/resources/templates/wallet/list.html @@ -0,0 +1,34 @@ + + + + + Wallet List + + + +

Wallet List

+ + + + + + + + + + + + + + +
Customer IdVoucher Id
+ + + + + + + + + + From 6b421d59f7509dad65eaaf669d2f5a03ebac3927 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 2 Nov 2023 15:55:23 +0900 Subject: [PATCH 095/101] =?UTF-8?q?feat=20:=20voucher=20page=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../resources/templates/voucher/create.html | 31 +++++++++++++++ .../resources/templates/voucher/delete.html | 25 ++++++++++++ .../templates/voucher/find-voucher.html | 24 ++++++++++++ .../resources/templates/voucher/find.html | 27 +++++++++++++ .../resources/templates/voucher/list.html | 39 +++++++++++++++++++ 5 files changed, 146 insertions(+) create mode 100644 src/main/resources/templates/voucher/create.html create mode 100644 src/main/resources/templates/voucher/delete.html create mode 100644 src/main/resources/templates/voucher/find-voucher.html create mode 100644 src/main/resources/templates/voucher/find.html create mode 100644 src/main/resources/templates/voucher/list.html diff --git a/src/main/resources/templates/voucher/create.html b/src/main/resources/templates/voucher/create.html new file mode 100644 index 0000000000..49b61d52cf --- /dev/null +++ b/src/main/resources/templates/voucher/create.html @@ -0,0 +1,31 @@ + + + + + Create Voucher + + + +

Create Voucher

+ +
+ + +
+ + + +
+ + + + +
+ + + + + diff --git a/src/main/resources/templates/voucher/delete.html b/src/main/resources/templates/voucher/delete.html new file mode 100644 index 0000000000..b4dea51907 --- /dev/null +++ b/src/main/resources/templates/voucher/delete.html @@ -0,0 +1,25 @@ + + + + + Delete Voucher + + + +

Delete Voucher

+ +
+ + +
+ + + + + +
+ + + + + diff --git a/src/main/resources/templates/voucher/find-voucher.html b/src/main/resources/templates/voucher/find-voucher.html new file mode 100644 index 0000000000..5ba46a4fe5 --- /dev/null +++ b/src/main/resources/templates/voucher/find-voucher.html @@ -0,0 +1,24 @@ + + + + Voucher Details + + + +

Voucher Details

+

Voucher ID:

+

Discount Amount: + + +

+

Policy Status:

+ + + + + + + + + + diff --git a/src/main/resources/templates/voucher/find.html b/src/main/resources/templates/voucher/find.html new file mode 100644 index 0000000000..dd18b70293 --- /dev/null +++ b/src/main/resources/templates/voucher/find.html @@ -0,0 +1,27 @@ + + + + + View Voucher + + + +

View Voucher

+ +
+ + +
+ + + + + + +
+ + + + + + diff --git a/src/main/resources/templates/voucher/list.html b/src/main/resources/templates/voucher/list.html new file mode 100644 index 0000000000..0ec7f9a368 --- /dev/null +++ b/src/main/resources/templates/voucher/list.html @@ -0,0 +1,39 @@ + + + + + Voucher List + + + +

Voucher List

+ + + + + + + + + + + + + + + + +
Voucher IDDiscount PolicyAmount
+ + +
+ + + + + + + + + + From c0459cd6570f9735b1328a568adbb51741f54cda Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 2 Nov 2023 15:56:16 +0900 Subject: [PATCH 096/101] =?UTF-8?q?Refactor=20:=20console=EA=B3=BC=20web?= =?UTF-8?q?=20=EA=B5=AC=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controller.java | 2 +- .../CustomerController.java | 2 +- .../prgrms/vouchermanagement/view/ConsoleInput.java | 5 +++++ .../webController/HomeController.java | 12 ++++++++++++ 4 files changed, 19 insertions(+), 2 deletions(-) rename src/main/java/org/prgrms/vouchermanagement/{controller => consoleController}/Controller.java (96%) rename src/main/java/org/prgrms/vouchermanagement/{controller => consoleController}/CustomerController.java (96%) create mode 100644 src/main/java/org/prgrms/vouchermanagement/webController/HomeController.java diff --git a/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java b/src/main/java/org/prgrms/vouchermanagement/consoleController/Controller.java similarity index 96% rename from src/main/java/org/prgrms/vouchermanagement/controller/Controller.java rename to src/main/java/org/prgrms/vouchermanagement/consoleController/Controller.java index df86a660a9..78f2fbe593 100644 --- a/src/main/java/org/prgrms/vouchermanagement/controller/Controller.java +++ b/src/main/java/org/prgrms/vouchermanagement/consoleController/Controller.java @@ -1,4 +1,4 @@ -package org.prgrms.vouchermanagement.controller; +package org.prgrms.vouchermanagement.consoleController; import org.prgrms.vouchermanagement.view.Command; import org.prgrms.vouchermanagement.view.ConsoleInput; diff --git a/src/main/java/org/prgrms/vouchermanagement/controller/CustomerController.java b/src/main/java/org/prgrms/vouchermanagement/consoleController/CustomerController.java similarity index 96% rename from src/main/java/org/prgrms/vouchermanagement/controller/CustomerController.java rename to src/main/java/org/prgrms/vouchermanagement/consoleController/CustomerController.java index e4f4d42dbc..4ea487fdc4 100644 --- a/src/main/java/org/prgrms/vouchermanagement/controller/CustomerController.java +++ b/src/main/java/org/prgrms/vouchermanagement/consoleController/CustomerController.java @@ -1,4 +1,4 @@ -package org.prgrms.vouchermanagement.controller; +package org.prgrms.vouchermanagement.consoleController; import org.prgrms.vouchermanagement.customer.domain.Customer; import org.prgrms.vouchermanagement.customer.service.CustomerService; diff --git a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleInput.java b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleInput.java index 694ee1be88..f61a3b53bd 100644 --- a/src/main/java/org/prgrms/vouchermanagement/view/ConsoleInput.java +++ b/src/main/java/org/prgrms/vouchermanagement/view/ConsoleInput.java @@ -34,6 +34,11 @@ public VoucherCreateInfo createVoucherInput() { return new VoucherCreateInfo(policy, amountOrPercent); } + public UUID deleteVoucherInput() { + consoleOutput.getInput(); + return UUID.fromString(scanner.nextLine()); + } + public VoucherUpdateInfo updateVoucherInput() { consoleOutput.getInput(); UUID voucherId = UUID.fromString(scanner.nextLine()); diff --git a/src/main/java/org/prgrms/vouchermanagement/webController/HomeController.java b/src/main/java/org/prgrms/vouchermanagement/webController/HomeController.java new file mode 100644 index 0000000000..557c401c5b --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/webController/HomeController.java @@ -0,0 +1,12 @@ +package org.prgrms.vouchermanagement.webController; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +@Controller +public class HomeController { + @GetMapping("/") + public String home() { + return "home"; + } +} From 4bce56a25fd60a3a4b6e0fdf13e485870312bda8 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 2 Nov 2023 15:56:36 +0900 Subject: [PATCH 097/101] =?UTF-8?q?feat=20:=20=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/templates/home.html | 29 ++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/main/resources/templates/home.html diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html new file mode 100644 index 0000000000..68b2d841ef --- /dev/null +++ b/src/main/resources/templates/home.html @@ -0,0 +1,29 @@ + + + + + SpringBoot Basic + + + + +
+

SpringBoot Basic

+

Voucher Management Options

+
+ +
+ + + + + + + From 6718f51e9d88ef07d477ccfd84a814c0b55611c4 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sat, 4 Nov 2023 20:32:07 +0900 Subject: [PATCH 098/101] =?UTF-8?q?feat=20:=20@Profile=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vouchermanagement/consoleController/Controller.java | 2 ++ .../webController/VoucherWebController.java | 8 ++++++++ src/main/resources/application.yml | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/consoleController/Controller.java b/src/main/java/org/prgrms/vouchermanagement/consoleController/Controller.java index 78f2fbe593..6a26d68222 100644 --- a/src/main/java/org/prgrms/vouchermanagement/consoleController/Controller.java +++ b/src/main/java/org/prgrms/vouchermanagement/consoleController/Controller.java @@ -4,9 +4,11 @@ import org.prgrms.vouchermanagement.view.ConsoleInput; import org.prgrms.vouchermanagement.view.ConsoleOutput; import org.springframework.boot.CommandLineRunner; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; @Component +@Profile("console") public class Controller implements CommandLineRunner { private final ConsoleInput consoleInput = new ConsoleInput(); diff --git a/src/main/java/org/prgrms/vouchermanagement/webController/VoucherWebController.java b/src/main/java/org/prgrms/vouchermanagement/webController/VoucherWebController.java index d9ad3bf3b5..2fec9aef7e 100644 --- a/src/main/java/org/prgrms/vouchermanagement/webController/VoucherWebController.java +++ b/src/main/java/org/prgrms/vouchermanagement/webController/VoucherWebController.java @@ -4,6 +4,7 @@ import org.prgrms.vouchermanagement.voucher.domain.Voucher; import org.prgrms.vouchermanagement.voucher.policy.PolicyStatus; import org.prgrms.vouchermanagement.voucher.service.VoucherService; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.*; @@ -12,9 +13,12 @@ import java.util.UUID; @Controller +@Profile("web") @RequestMapping("/voucher") public class VoucherWebController { + //api path + private final VoucherService voucherService; public VoucherWebController(VoucherService voucherService) { @@ -43,6 +47,8 @@ public String findVoucher() { return "voucher/find"; } + //Request Param + //추가해야 할 부분 -> update 한 번 고민해보기, 유효성 검사, Rest 알아보자 @PostMapping("/find") public String findVoucher(@RequestParam("voucherId") String uuid, Model model) { UUID voucherId = UUID.fromString(uuid); @@ -72,6 +78,8 @@ public String deleteVoucher(@RequestParam("voucherId") String uuid) { return "redirect:/voucher/delete"; } + //유효성 검사(null check) + private PolicyStatus validateAndConvertPolicy(String inputPolicy) { try { return PolicyStatus.valueOf(inputPolicy.toUpperCase()); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index a8f8642dc0..a687c66ea2 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: profiles: - active: database + active: database, web --- spring: From 533ae69469e36b0f66e4242f56f2767c1a2810e9 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Sat, 4 Nov 2023 20:51:40 +0900 Subject: [PATCH 099/101] =?UTF-8?q?Refactor=20:=20voucherList=20=EC=B6=9C?= =?UTF-8?q?=EB=A0=A5=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../webController/VoucherApiController.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/webController/VoucherApiController.java b/src/main/java/org/prgrms/vouchermanagement/webController/VoucherApiController.java index 6f6ac5f68e..963b61884f 100644 --- a/src/main/java/org/prgrms/vouchermanagement/webController/VoucherApiController.java +++ b/src/main/java/org/prgrms/vouchermanagement/webController/VoucherApiController.java @@ -15,16 +15,14 @@ @RequestMapping("/api/v1/voucher") public class VoucherApiController { + // REST에 대해 알아보자 + private final VoucherService voucherService; public VoucherApiController(VoucherService voucherService) { this.voucherService = voucherService; } - @GetMapping("/list") - public List voucherList() { - return voucherService.voucherLists(); - } @PostMapping public Voucher createVoucher(@RequestBody VoucherCreateInfo voucherCreateInfo) { @@ -34,11 +32,15 @@ public Voucher createVoucher(@RequestBody VoucherCreateInfo voucherCreateInfo) { return voucherService.createVoucher(policy, amountOrPercent); } + //중계만 -> 서비스에 위임 or 동적 쿼리 @GetMapping public List findVouchers( @RequestParam(name = "voucherId", required = false) String voucherId, - @RequestParam(name = "policy", required = false) String policy) { + @RequestParam(name = "policy", required = false) String policy + ) { + //voucherCreateInfo를 사용 + //mvc와 엮어서 List vouchers = new ArrayList<>(); if (voucherId != null && policy != null) { @@ -54,7 +56,10 @@ public List findVouchers( } else if (policy != null) { // policy만 제공된 경우 PolicyStatus getPolicy = validateAndConvertPolicy(policy); - vouchers = voucherService.findVouchersByPolicy(getPolicy); + return voucherService.findVouchersByPolicy(getPolicy); + } else { + //검색 조건이 없는 경우 -> 전체 조회 + return voucherService.voucherLists(); } return vouchers; From 864313351c2b82a71afdfb30e0d0143f3fdc4b3b Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 9 Nov 2023 15:28:23 +0900 Subject: [PATCH 100/101] =?UTF-8?q?feat=20:=20update=20api=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voucher/service/VoucherService.java | 11 ++++++++++- .../webController/VoucherApiController.java | 10 ++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/prgrms/vouchermanagement/voucher/service/VoucherService.java b/src/main/java/org/prgrms/vouchermanagement/voucher/service/VoucherService.java index 240ec232ba..bf6866fb70 100644 --- a/src/main/java/org/prgrms/vouchermanagement/voucher/service/VoucherService.java +++ b/src/main/java/org/prgrms/vouchermanagement/voucher/service/VoucherService.java @@ -16,6 +16,13 @@ public class VoucherService { private final VoucherRepository voucherRepository; + /* + pr + model 비즈니스 로직 + view 뿌리기 + controller 전달 + */ + public VoucherService(VoucherRepository voucherRepository) { this.voucherRepository = voucherRepository; } @@ -35,8 +42,10 @@ public List voucherLists() { return voucherRepository.voucherLists(); } - public void updateVoucher(UUID voucherId, long amountOrPercent) { + public Voucher updateVoucher(UUID voucherId, long amountOrPercent) { voucherRepository.update(voucherId, amountOrPercent); + DiscountPolicy discountPolicy = getDiscountPolicy(findVoucher(voucherId).getDiscountPolicy().getPolicyStatus(), amountOrPercent); + return new Voucher(voucherId, discountPolicy); } public Voucher deleteVoucher(UUID voucherId) { diff --git a/src/main/java/org/prgrms/vouchermanagement/webController/VoucherApiController.java b/src/main/java/org/prgrms/vouchermanagement/webController/VoucherApiController.java index 963b61884f..081b04732c 100644 --- a/src/main/java/org/prgrms/vouchermanagement/webController/VoucherApiController.java +++ b/src/main/java/org/prgrms/vouchermanagement/webController/VoucherApiController.java @@ -15,8 +15,6 @@ @RequestMapping("/api/v1/voucher") public class VoucherApiController { - // REST에 대해 알아보자 - private final VoucherService voucherService; public VoucherApiController(VoucherService voucherService) { @@ -65,6 +63,14 @@ public List findVouchers( return vouchers; } + @PatchMapping + public Voucher updateVoucher( + @RequestParam(name = "voucherId") String voucherId, + @RequestParam(name = "amount") long amount + ) { + return voucherService.updateVoucher(UUID.fromString(voucherId), amount); + } + @DeleteMapping("{voucherId}") public Voucher deleteVoucher(@PathVariable UUID voucherId) { return voucherService.deleteVoucher(voucherId); From 1c8bacdfbaf5de18e9102f69a0df58d06bb56632 Mon Sep 17 00:00:00 2001 From: kimnamgyu Date: Thu, 9 Nov 2023 16:12:02 +0900 Subject: [PATCH 101/101] =?UTF-8?q?Refactor=20:=20ResponseDto=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=ED=95=98=EC=97=AC=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/VoucherResponseDto.java | 10 +++++ .../webController/VoucherApiController.java | 42 ++++++++++++------- 2 files changed, 36 insertions(+), 16 deletions(-) create mode 100644 src/main/java/org/prgrms/vouchermanagement/dto/VoucherResponseDto.java diff --git a/src/main/java/org/prgrms/vouchermanagement/dto/VoucherResponseDto.java b/src/main/java/org/prgrms/vouchermanagement/dto/VoucherResponseDto.java new file mode 100644 index 0000000000..200534e880 --- /dev/null +++ b/src/main/java/org/prgrms/vouchermanagement/dto/VoucherResponseDto.java @@ -0,0 +1,10 @@ +package org.prgrms.vouchermanagement.dto; + +import org.prgrms.vouchermanagement.voucher.policy.DiscountPolicy; + +import java.util.UUID; + +public record VoucherResponseDto( + UUID voucherId, + DiscountPolicy discountPolicy +) { } diff --git a/src/main/java/org/prgrms/vouchermanagement/webController/VoucherApiController.java b/src/main/java/org/prgrms/vouchermanagement/webController/VoucherApiController.java index 081b04732c..92239b9873 100644 --- a/src/main/java/org/prgrms/vouchermanagement/webController/VoucherApiController.java +++ b/src/main/java/org/prgrms/vouchermanagement/webController/VoucherApiController.java @@ -1,6 +1,7 @@ package org.prgrms.vouchermanagement.webController; import org.prgrms.vouchermanagement.dto.VoucherCreateInfo; +import org.prgrms.vouchermanagement.dto.VoucherResponseDto; import org.prgrms.vouchermanagement.exception.InvalidInputException; import org.prgrms.vouchermanagement.voucher.domain.Voucher; import org.prgrms.vouchermanagement.voucher.policy.PolicyStatus; @@ -23,57 +24,66 @@ public VoucherApiController(VoucherService voucherService) { @PostMapping - public Voucher createVoucher(@RequestBody VoucherCreateInfo voucherCreateInfo) { + public VoucherResponseDto createVoucher(@RequestBody VoucherCreateInfo voucherCreateInfo) { PolicyStatus policy = validateAndConvertPolicy(voucherCreateInfo.policy().toString()); long amountOrPercent = validateAndConvertAmountOrPercent(String.valueOf(voucherCreateInfo.amountOrPercent())); - return voucherService.createVoucher(policy, amountOrPercent); + Voucher voucher = voucherService.createVoucher(policy, amountOrPercent); + + return new VoucherResponseDto(voucher.getVoucherId(), voucher.getDiscountPolicy()); } - //중계만 -> 서비스에 위임 or 동적 쿼리 @GetMapping - public List findVouchers( + public List findVouchers( @RequestParam(name = "voucherId", required = false) String voucherId, @RequestParam(name = "policy", required = false) String policy ) { - //voucherCreateInfo를 사용 - //mvc와 엮어서 - List vouchers = new ArrayList<>(); + List vouchers = new ArrayList<>(); if (voucherId != null && policy != null) { // voucherId와 policy 모두 제공된 경우 UUID getVoucherId = UUID.fromString(voucherId); Voucher findVoucher = voucherService.findVoucher(getVoucherId); - vouchers.add(findVoucher); + vouchers.add(new VoucherResponseDto(findVoucher.getVoucherId(), findVoucher.getDiscountPolicy())); } else if (voucherId != null) { // voucherId만 제공된 경우 UUID getVoucherId = UUID.fromString(voucherId); Voucher findVoucher = voucherService.findVoucher(getVoucherId); - vouchers.add(findVoucher); + vouchers.add(new VoucherResponseDto(findVoucher.getVoucherId(), findVoucher.getDiscountPolicy())); } else if (policy != null) { // policy만 제공된 경우 PolicyStatus getPolicy = validateAndConvertPolicy(policy); - return voucherService.findVouchersByPolicy(getPolicy); + List vouchersByPolicy = voucherService.findVouchersByPolicy(getPolicy); + for (Voucher voucher : vouchersByPolicy) { + vouchers.add(new VoucherResponseDto(voucher.getVoucherId(), voucher.getDiscountPolicy())); + } } else { //검색 조건이 없는 경우 -> 전체 조회 - return voucherService.voucherLists(); + List getVouchers = voucherService.voucherLists(); + for (Voucher voucher : getVouchers) { + vouchers.add(new VoucherResponseDto(voucher.getVoucherId(), voucher.getDiscountPolicy())); + } } - return vouchers; } @PatchMapping - public Voucher updateVoucher( + public VoucherResponseDto updateVoucher( @RequestParam(name = "voucherId") String voucherId, @RequestParam(name = "amount") long amount ) { - return voucherService.updateVoucher(UUID.fromString(voucherId), amount); + + Voucher voucher = voucherService.updateVoucher(UUID.fromString(voucherId), amount); + + return new VoucherResponseDto(voucher.getVoucherId(), voucher.getDiscountPolicy()); } @DeleteMapping("{voucherId}") - public Voucher deleteVoucher(@PathVariable UUID voucherId) { - return voucherService.deleteVoucher(voucherId); + public VoucherResponseDto deleteVoucher(@PathVariable UUID voucherId) { + Voucher voucher = voucherService.deleteVoucher(voucherId); + + return new VoucherResponseDto(voucher.getVoucherId(), voucher.getDiscountPolicy()); } private PolicyStatus validateAndConvertPolicy(String inputPolicy) {