From f8a7035477cdfa61d7e4138c4f3bccc1b322b73f Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Mon, 12 Jul 2021 11:59:16 +0900 Subject: [PATCH 01/41] Add delete method to delete board [draft] --- src/main/java/com/moment/the/table/service/TableService.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/com/moment/the/table/service/TableService.java b/src/main/java/com/moment/the/table/service/TableService.java index a92c630c..502fd751 100644 --- a/src/main/java/com/moment/the/table/service/TableService.java +++ b/src/main/java/com/moment/the/table/service/TableService.java @@ -68,6 +68,11 @@ public void cancelGood(Long boardIdx) { } } + @Transactional + public void delete(long boardIdx){ + tableRepository.deleteById(boardIdx); + } + // day 수 계산하기 public static int calculateAfterDate(){ /** From ae02c9f9e9b7425c48ac03b4d41d2132af8447bd Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Mon, 12 Jul 2021 12:25:22 +0900 Subject: [PATCH 02/41] Add deleteBoard controller address [draft] --- .../com/moment/the/table/controller/TableController.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/com/moment/the/table/controller/TableController.java b/src/main/java/com/moment/the/table/controller/TableController.java index 962968dd..628e2690 100644 --- a/src/main/java/com/moment/the/table/controller/TableController.java +++ b/src/main/java/com/moment/the/table/controller/TableController.java @@ -64,4 +64,10 @@ public SingleResult amountUncomfortable(){ public SingleResult getDateSinceProjectStart(){ return responseService.getSingleResult(tableService.dateSinceProjectStart()); } + + @DeleteMapping("/uncomfortable/{boardIdx}") + public CommonResult deleteThisBoard(@PathVariable Long boardIdx){ + tableService.delete(boardIdx); + return responseService.getSuccessResult(); + } } From 1295d58fe72d09e506e45d6a5a1ebf9558f02d2b Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Mon, 12 Jul 2021 12:26:11 +0900 Subject: [PATCH 03/41] Add api address annotation --- .../java/com/moment/the/table/controller/TableController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/moment/the/table/controller/TableController.java b/src/main/java/com/moment/the/table/controller/TableController.java index 628e2690..0c1b117e 100644 --- a/src/main/java/com/moment/the/table/controller/TableController.java +++ b/src/main/java/com/moment/the/table/controller/TableController.java @@ -65,6 +65,7 @@ public SingleResult getDateSinceProjectStart(){ return responseService.getSingleResult(tableService.dateSinceProjectStart()); } + // localhost:8080/v1/uncomfortable/{boardIdx} @DeleteMapping("/uncomfortable/{boardIdx}") public CommonResult deleteThisBoard(@PathVariable Long boardIdx){ tableService.delete(boardIdx); From adfe48ffd0c801af439ff7d697d0049bc8311bb5 Mon Sep 17 00:00:00 2001 From: siwony_ Date: Sat, 28 Aug 2021 15:45:23 +0900 Subject: [PATCH 04/41] =?UTF-8?q?[UPDATE]=20queryDSL=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/pom.xml b/pom.xml index 7e64b655..ede2a209 100644 --- a/pom.xml +++ b/pom.xml @@ -158,25 +158,6 @@ - - com.mysema.maven - apt-maven-plugin - 1.1.3 - - - - process - - - target/generated-sources/java - com.querydsl.apt.jpa.JPAAnnotationProcessor - - true - - - - - com.spotify docker-maven-plugin From dfedc9b15f1eb1f4248cfef39b388cd0488ffbbc Mon Sep 17 00:00:00 2001 From: siwony_ Date: Sat, 28 Aug 2021 16:29:02 +0900 Subject: [PATCH 05/41] =?UTF-8?q?[UPDATE]=20gradle=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=9E=90=EB=8F=99=EC=83=9D=EC=84=B1=20=ED=8C=8C=EC=9D=BC=20ign?= =?UTF-8?q?ore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 9 + .../dependencies-accessors.lock | Bin 0 -> 17 bytes .../dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.bin | Bin 0 -> 19565 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .gradle/7.1.1/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/7.1.1/fileHashes/fileHashes.bin | Bin 0 -> 18697 bytes .gradle/7.1.1/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../7.1.1/fileHashes/resourceHashesCache.bin | Bin 0 -> 23529 bytes .gradle/7.1.1/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 + .gradle/buildOutputCleanup/outputFiles.bin | Bin 0 -> 18713 bytes .gradle/checksums/checksums.lock | Bin 0 -> 17 bytes .gradle/checksums/md5-checksums.bin | Bin 0 -> 33447 bytes .gradle/checksums/sha1-checksums.bin | Bin 0 -> 21521 bytes .gradle/vcs-1/gc.properties | 0 build.gradle | 58 ++++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 185 ++++++++++++++++++ gradlew.bat | 89 +++++++++ settings.gradle | 5 + 23 files changed, 353 insertions(+) create mode 100644 .gradle/7.1.1/dependencies-accessors/dependencies-accessors.lock create mode 100644 .gradle/7.1.1/dependencies-accessors/gc.properties create mode 100644 .gradle/7.1.1/executionHistory/executionHistory.bin create mode 100644 .gradle/7.1.1/executionHistory/executionHistory.lock create mode 100644 .gradle/7.1.1/fileChanges/last-build.bin create mode 100644 .gradle/7.1.1/fileHashes/fileHashes.bin create mode 100644 .gradle/7.1.1/fileHashes/fileHashes.lock create mode 100644 .gradle/7.1.1/fileHashes/resourceHashesCache.bin create mode 100644 .gradle/7.1.1/gc.properties create mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 .gradle/buildOutputCleanup/cache.properties create mode 100644 .gradle/buildOutputCleanup/outputFiles.bin create mode 100644 .gradle/checksums/checksums.lock create mode 100644 .gradle/checksums/md5-checksums.bin create mode 100644 .gradle/checksums/sha1-checksums.bin create mode 100644 .gradle/vcs-1/gc.properties 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 diff --git a/.gitignore b/.gitignore index 22efd7cc..c32fbc14 100644 --- a/.gitignore +++ b/.gitignore @@ -35,5 +35,14 @@ build/ ### log ### /logs/** +### Gradle ### +.gradle + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +### Gradle Patch ### +**/build/ + ### apllication config ### #/src/main/resources/application.yml \ No newline at end of file diff --git a/.gradle/7.1.1/dependencies-accessors/dependencies-accessors.lock b/.gradle/7.1.1/dependencies-accessors/dependencies-accessors.lock new file mode 100644 index 0000000000000000000000000000000000000000..76f377cc12129d9ed3f29fc870f032340dacbec9 GIT binary patch literal 17 TcmZSfKiGReQ1fXX0~7!NHR}XT literal 0 HcmV?d00001 diff --git a/.gradle/7.1.1/dependencies-accessors/gc.properties b/.gradle/7.1.1/dependencies-accessors/gc.properties new file mode 100644 index 00000000..e69de29b diff --git a/.gradle/7.1.1/executionHistory/executionHistory.bin b/.gradle/7.1.1/executionHistory/executionHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..8b3e89dba0bf4e0f65d8bdb1f3178bdcb3eff200 GIT binary patch literal 19565 zcmeI%Pe>F|90%|>?j9@(*FX@wM0GG|XSC8#f>72{$`aR255e|!eC#}PXU6xQu6i{j z+SRl}9{Ph3c}emRL`G1zposEN5ZECP(WP6RZDw}|4LS%GM0^Kk<}q*H@6YEAd)XKv z)sgkmK{k%6jUh%5fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2>dSs39pfz#b&Ax zmHC5;EFpEfyn$9{*7TL_Ubs`7Zf^vw^Dd(IK81x6{rjwJd6<8b^;>Lsq6(YuP)pD1-AqVkf|vx2%V z6MAp)o{TZm5md4MNZsDWj&CDVde_+6)P+4?7PW0hD9=-2T6~1HQpw66Zl#_BT~t~A z>$9i2TViM0l8Ja*ce4FlXIl`xqb=wn}jzuCyZP4 za6@B!I75C})-&d^^2b~1Iku^Mf7#{MjAZsqc; zPmI@9;VT1FoaBQ{`>>59MzHOr4ug-`i%lX;`IqyFyAzf6$EM!SYW3jhq@Q|bB^18q z3dj5A6=$+g!l%Db!bS=bnfo03nwlH3e_CoS4tmzg@oSH#;2-Yu?X8?N711xlRB8 literal 0 HcmV?d00001 diff --git a/.gradle/7.1.1/executionHistory/executionHistory.lock b/.gradle/7.1.1/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..c2351bf50d77dc389b378156fd3534bb593dd6ea GIT binary patch literal 17 TcmZP;KhpYIs!y(z0Ror-Edv9M literal 0 HcmV?d00001 diff --git a/.gradle/7.1.1/fileChanges/last-build.bin b/.gradle/7.1.1/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/.gradle/7.1.1/fileHashes/fileHashes.bin b/.gradle/7.1.1/fileHashes/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..8afb85e7bb6cb65bf7655527586026b20637249d GIT binary patch literal 18697 zcmeI%Jxjwt0LJmFFGGva7PJI6oqR*I4$>lskUV6%>&mqJ=JMk$!+W#|w9%NJlsMA6)Kuj)&xaYfK@Gn5TzmjlR~F9Rdg-fB*sr zAb4Uq@Aj{k0?4(^=HnHA4fQ!9(c&XsC( zrd6YH)ZQq*n~k;NW-~gpe_Xq~KGltsYKZ&x#%!%p-WYsbeaWs{jy?ILze+a}hkoM+ Dse^UA literal 0 HcmV?d00001 diff --git a/.gradle/7.1.1/fileHashes/fileHashes.lock b/.gradle/7.1.1/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..71fd51b685356933de7b59643833fca4ac588006 GIT binary patch literal 17 UcmZP;`oqH1yLd+q0|c-E04W&*asU7T literal 0 HcmV?d00001 diff --git a/.gradle/7.1.1/fileHashes/resourceHashesCache.bin b/.gradle/7.1.1/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000000000000000000000000000000000000..c5b71d4ae9acae91e7990d72f81c0ad6b5516b27 GIT binary patch literal 23529 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 MmW}2z?&mGz;jN4PpJB)AK=%B@ABxXDdXJ+? z`F?P=mTGTa->J-2Dr!m3-|TNKEcT7+`ElviZs{abeyYeXQpXNuSAXFHM@a54!J3 zPYi^|&HKTG?witAU$3l7`=CMhQ|WS7%GcvPQ^PNz$(c literal 0 HcmV?d00001 diff --git a/.gradle/checksums/checksums.lock b/.gradle/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..6c50e882c1e04cf250f41952f6032ae11c2ac6e3 GIT binary patch literal 17 UcmZSnC$@iK!q%3f3=m)i06e1w5C8xG literal 0 HcmV?d00001 diff --git a/.gradle/checksums/md5-checksums.bin b/.gradle/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..0d03a3d6be21be6db6a799c670078d7080bd3730 GIT binary patch literal 33447 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 DFHh^T literal 0 HcmV?d00001 diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 00000000..e69de29b diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..01a72a07 --- /dev/null +++ b/build.gradle @@ -0,0 +1,58 @@ +/* + * This file was generated by the Gradle 'init' task. + */ + +plugins { + id 'java' + id 'maven-publish' +} + +repositories { + mavenLocal() + maven { + url = uri('https://repo.maven.apache.org/maven2/') + } +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jpa:2.4.2' + implementation 'org.springframework.boot:spring-boot-starter-security:2.4.2' + implementation 'org.springframework.boot:spring-boot-starter-validation:2.4.2' + implementation 'org.springframework.boot:spring-boot-starter-web:2.4.2' + implementation 'org.springframework.boot:spring-boot-configuration-processor:2.4.2' + implementation 'org.projectlombok:lombok:1.18.16' + implementation 'org.springframework.boot:spring-boot-starter-data-redis:2.4.2' + implementation 'io.springfox:springfox-swagger-ui:2.9.1' + implementation 'io.springfox:springfox-swagger2:2.9.1' + implementation 'io.swagger:swagger-annotations:1.6.2' + implementation 'io.swagger:swagger-models:1.6.2' + implementation 'io.jsonwebtoken:jjwt-api:0.11.1' + implementation 'org.modelmapper:modelmapper:2.3.0' + implementation 'net.rakugakibox.util:yaml-resource-bundle:1.1' + implementation 'io.fabric8:docker-maven-plugin:0.30.0' + runtimeOnly 'com.h2database:h2:1.4.200' + runtimeOnly 'mysql:mysql-connector-java:8.0.22' + runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.1' + runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.1' + testImplementation 'org.springframework.boot:spring-boot-starter-test:2.4.2' + testImplementation 'org.springframework.security:spring-security-test:5.4.2' + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.4.2' + compileOnly 'org.springframework.boot:spring-boot-starter-tomcat:2.4.2' +} + +group = 'com.moment' +version = '0.0.1-SNAPSHOT' +description = 'the' +java.sourceCompatibility = JavaVersion.VERSION_1_8 + +publishing { + publications { + maven(MavenPublication) { + from(components.java) + } + } +} + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7454180f2ae8848c63b8b4dea2cb829da983f2fa GIT binary patch literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..05679dc3 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 00000000..744e882e --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + 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" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..ac1b06f9 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..be7f4eae --- /dev/null +++ b/settings.gradle @@ -0,0 +1,5 @@ +/* + * This file was generated by the Gradle 'init' task. + */ + +rootProject.name = 'the' From b351792092750d099ea84a39cd49de23b19992b6 Mon Sep 17 00:00:00 2001 From: siwony_ Date: Sat, 28 Aug 2021 16:30:50 +0900 Subject: [PATCH 06/41] =?UTF-8?q?[ADD]=20gradle=20=EC=9D=98=EC=A1=B4?= =?UTF-8?q?=EC=84=B1=20=EC=A0=81=EC=9A=A9=20=EC=99=84=EB=A3=8C(query=20dsl?= =?UTF-8?q?=20=EC=A0=9C=EC=99=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../executionHistory/executionHistory.bin | Bin 19565 -> 656977 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/7.1.1/fileHashes/fileHashes.bin | Bin 18697 -> 35097 bytes .gradle/7.1.1/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../7.1.1/fileHashes/resourceHashesCache.bin | Bin 23529 -> 26385 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .gradle/buildOutputCleanup/outputFiles.bin | Bin 18713 -> 19289 bytes .gradle/checksums/checksums.lock | Bin 17 -> 17 bytes .gradle/checksums/md5-checksums.bin | Bin 33447 -> 34497 bytes .gradle/checksums/sha1-checksums.bin | Bin 21521 -> 130805 bytes build.gradle | 63 ++++++++++-------- 11 files changed, 37 insertions(+), 26 deletions(-) diff --git a/.gradle/7.1.1/executionHistory/executionHistory.bin b/.gradle/7.1.1/executionHistory/executionHistory.bin index 8b3e89dba0bf4e0f65d8bdb1f3178bdcb3eff200..2d3835f126bfb44c63aaa8763dc874c375fe80e7 100644 GIT binary patch literal 656977 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 XZsXcsV_vS+IJmXm`Q^)%&rSJ%2O?E{ delta 73 zcmccEqw#hI;{>UVM$g43I!H{Gl#o_sG)R_?VB%dij{yuk9RH&Mps?mf!x!Qk9c}_O Lsc&}l&|v`pcjh3b diff --git a/.gradle/7.1.1/executionHistory/executionHistory.lock b/.gradle/7.1.1/executionHistory/executionHistory.lock index c2351bf50d77dc389b378156fd3534bb593dd6ea..4853476e25c2b20a3b8dbdad03e7b09ae6bc0570 100644 GIT binary patch literal 17 TcmZP;KhpYIs!y(z0Rk)lEjRk*WTCO``Y_H$7g*sDHMM8d9+aer||sG zkBdJoMqn`lixF6iz+wazBd{2O#Rx1$U@-!V5m=1CVgwc=uo!{G2rNcmF#?MbSd748 z1QsLk|Cb1ufPt{W!SJuAMSfWBN1<$Fqflsc!$bESIMKW5GyL_@8`%4U@G~i^G*&%y zgS!4TT%Rg1-Q#t!Y#KH&a~IxeU?{KoXijtkONrDvU?9(ftlqwZ(P{(E|0 z0JXQk^k_OJdbvk&?NHZt!u6IVJGQC!Ye9XVFs8?795fTQjB0`UQ2|_k5!zmyS`!L& z;|G`?Kjm&S9A0t*>fsTXo*-uLt(h^E0`;&sTt96bG~Uz91a-@Yn4Y}z_w&i5FF&E~ z&4lY!o_Abc*GEI$AsN?ad|%Bb1vEna2qw>`_)E2a9@f-_`T-H_7pZF+_^qtfv!Ncf z1k=-(+PHp^(KUp+Bi_%9mnywZ5y`Glw-&_gGmA#)n?9(ELEXXu)6ZPh(%I2gZU=Q= zNlZUW`*x{bMp72ky^1mYocLqYFs|WKPF3V~_byT2A^~-8 ze89P4X<0EdrN^P}9E92DuB%V22)ru~^?=>DepN)$?%y?GsN3-1`iE1)!As9vg?f}H zreD0T6kg<2BL($XeBLkq+d=>Akn&NqodC@KQsK_^j?oI^P1X<3Qhip4JSCEz4k1o7v2BbYa~AM1nQoK zxZbc;cRbAtU2n(nc8VrAEByBUDTnrv8kqg%_3wU7X#^@j{n%1mH@h%Y9PnZ*)D81+ zyIs2@?p^efg)lHz~g6+_+357UcJDO(V?nq^^q3OvLU+3370!p(Cvd%(#%W>S^ zU+AE$a&;us^}gf!^->?7k2}!*9LD|Lh~d7`@Q2<2+8@BUDnl z2ld0taed<5?XP0GU!d+$gXs@AxLzHJUz!Q^qj)?YIFvuR=%CO5b>Dlq{T#h6+c#z_ zsGEjhdc&a5E#c;)Xgni=F#RFFq<_x}8*ON>D~0P}I*y7z8PWV1iI3~in&64r#0zMg zLw{rTkHyATJ1a&E!FKE)8x*reV`>|2OQz=J_108S7Q{29e=OX=RR}O5)a0#Zr6krjEIerMu zlgBq>`YTn6i9U+_`x;Q+r;pjU>^oE`$isz>H=q>P&kYo0%y+Ut z`#pG`Y}>?{#n<#5ofmif+-!4v!Mney{v)*4@59<@tGXP#_4;5n+8<#|Z;w;kw#(vY z5!B7JFukLE;77dA$`GiBCS!W%vtD+$&K`8W_A6p~S5O1r*w;Hj(B3Tr*C)&Fwv@EW zLfsk9pYP62p8h+*faWE;vzUGN3g(38OU;#`ec%pUKk`+!` zNvMZf;CjY0v)JXdaZum)3D;-8XYN(ENAC~8beP^3RFc*DM6eaw?^VI|*o)zoq0z}u zx5D>V-&A>{hMyifUwU|d`Zt;vOi_n(QTSpndEgO#iSs+x+wVC7--&XZ6`nBInab zVLS1LxSql7QP*X&0_uAT|3{Z$z9iBz19g|nm_Ag`?Ugn0T@~u)O1R$oZyAFh=OEPg zWAgm>8rPE3TbR3`9_)nu;(Pl@bZz->biOQQFnyTeNa%Fs4KzPQ;rV2^V|h4TkC8fT z$3G0S|FNZ`ckI9jdftWJ$93aA{aa_m(0vhu@1vh9PF~Tnt?P&F7~<>p*JW!)-x&I3 zP&d7Swex%R+7wpfdMHy|J#l@r#7Eu|4|HDyv0(b>YN6NNRaxl}aM8f@KbwcIDAj~c zKt1*lu7BAbu)|DpJJfYHVER~ej9bW^2=sh6E5`J3)y|i@bNuz8y+;D3PbmF8m$h_D zAk_{OUHqJ#84eV_baJ)| z>LGYLe=X@Yaa3sXLOoOpYv=F8@O0m++g?yVfS-f^;;of@{L?a_9_@nJ|2vz*0_B4_Y2a81I(R-8uzE0@$WTW0{mRrJhjxb>MbU){8 znl~1r?HJ+fnW3n5qvV%eqR{>@zJD3n2Pb1sRh@^r|1GQ?MiZkNg%KSQs2gx#I+KvI zVre%mnh)dg{Lhpk^Er`Obt|;D!0)%raS}^+-w}3zx``>)4)fP8zMuQhW+>Krn9kyB zn0ftYL9EfsqABy5Gg}QAnu1`4K74qK<^_m(G#*-$s@#`NXkacUVE0?bgi!S4_3 zWyzL}nsvLNZj7%V4!vS21q(5BJ$q?k?QleQ=hevjbmjrWOXKSzbA544Y~!P?SZV(R1za4onv??V5IcJcr(+_Tzq6EaNR3epu%M{f10p z_A3gH1x}9rL-V1UBva7YEz4RCwOvNP84VKb9Z4;RMTUz^Z$CVVy$jZfGb zOqX(_wUPW_isr-Elb9|ob7i2?^A-C2+V>!?Z+q7JcmMm(uzhbOOkcOn=ml3nMLg64 zJ1~9yxeaA=ZSClDGiyAbtS>!bX4~0^&g0%(+6}e-1!^Y@5j#(g)`NqxyJTr zUNy$=dkU3}jP0SCXdW;>g0-{dhHHq$gD2=YZt?@u6+izxAC>An58HQ}#`T|D<=Wq7 zqU}U&!*r$mzXmPurv#wAIljM?BaYQZMr)$qUu;=0dzB^kT(UEc)nGckqvZc zUWF!T&kD?5l`C00_lJ%uv=36j^ldj!RyEXE+=hA_zAv`x9vO0~HFyAZ{{hTijc?6X zd66zO-}*enbam0m0nU<6^!uR2b4=gCzp3X=m~Aj@$9)~HKi}e@JHdjkhrRB&{;GfX zXAvQOXzz^A`_Ab^I@0?uFr@J zt!idng0_SAXWwZ55nHdue5fCB!R+-{X;eO{(?OpTy4m6S`o^;IY4&1hAC9-9FEjG~ z*0+weP}jA<>paHnjZZO0?qV|!gYDRF!1W6bY$x^ouC{od#J9c$k%OshAb;2N4gb?;-ky|;^f zv(G~`o_kqvy(5XnZds0#i zc}jUuchbk~oo3~ZYV9p^Lfct`>CU{N>>s|ILi72ddzkJ*b0PN9%=~3&ubYhPIVMI7 z;^Al>GZnyeS6<=C=GNnXp}ln&t~+u^Wu97%-Ycw(F#X8XSh7e{TsO2oxD?afR4yjB zw9lgX?VuX2yJ}zh%pzP1?PKxyyFFb}{rNz(Gt|wQFnf2c5{jU>1$u8Zn#T1cGtq{Zp^h=8n7QbDMx(Tpy2L`dD)! z0QN_l4%3ewVjJX%`5$bW`SUblAtpD~8 zY%7Dh9ljrZMEORx{5j4B_2V>{y-#;=L%O$K57b?JaD6&NebU@b6Y4Se`u8i5syM`% zWeRm8eBb$dR6dzmdtxWl?eO>nT8$l27CwOH`3OF&{lMaF_CnQu=(%RtitBg!+IKzw zum-jhl8)WQ)!MZY>iT&9vENfDB69F|i}hjz79+42fyD?c zMqn`lixF6iz+wazBd{2O#Rx1$U@-!V5%~XZ1U7@NBM!oA89y@$6It*l%rHN zTjs%=51OFFD28k}KGsI?Df?eSDe37&le{Pnk1i!sJ^tgRkf2kB#Me|Zk@Z3It8JF+ z*z&cpr+SKRfWIa{e9$RDf`UBlC-_k7Da?0S-DK8gV;6NXQ4YM_nZQR-zxs!0?-HNV={4P)NyzyKEXaFezYp)VmElUhY*u>C{ar$ z{w1@mxUtr!>uic+%JHLDenH{``nHi1`6~=Uuaxha{!o3m_jg(s%WJb`yp{+dP2YvS zKje%h6E!m<0@m&s2Jc#5R7$I)M?<2A3++`dnFvWxYSQ4(XspI z-7$B>N3M2g0hOR|BF`rYL|~d)$u0kh@1|?luzwT(1T1O%cDXJurxNQ;kvBpFVp&)# z!zl{=0WbT^yt?7%X;i{x0zSj0VU{Kn2KPR`Tz9-kL1goQ$w%2!)EV66G6mm)(_Bm^ z6XpKxG<_rX9Xp;y_B~)tqt0NicEljHSF~0dWFm7u#i$|XgTeiwhBSG#O)ufdLy-Q1 zV!{h5!Z_Y+a*!|iv+MG^orzwNG?)G$1Q*>u_{@}M6IlI3f=52+Q-u)EucwC2VSg^n zE(e5vln*cb>!7X1$WvZ|kA`#8aeHEmEi7L@ewN4B1)i(Z_$jL9B5i}RY8$8sM626m zmiW!PM(>wfds9x0a3Vg&&P^cun?hmnMBWe)h_tSFh4#d@TLDhFxhD`$d0Omqoqi=Kx2rd3Zm|Jx2@zrteM-%Vyrm!z)o;AleCJkjv9ip2HoMuD z1rmSI=jNP=Wa7pdJF6Cl_?>$%{EMqvuhL2-1Q^gaXbbuH-rn2##iW0`iz!b}ss)P? zAi!#OXN2Q8j68EE^osIT;)KbQK=qSy_N}isM1U9}gx7m2K`##00Fn5p&{ud<@7&wR zUAxXCoS<6`32*o;S)K{_BoY}>ZL)M?*G_2p*8JEOt`7bp0`YMaj)N|bmQ0Mcez~>g z$Y5Rqw@tCd3@><>ix6BO{~|?o6{rZ~*mKk%+OgJh^!TLK>n+dIwxh%Y#GXPMiM-V$ z5PAOWzlSO#myUWq6c4^*eFP9-2ER&BiK9zw$wZgH7rmXy5h}(`yzEDm-YB311C?ON zK1?Q(`1YL36l4EMbL4b7ecqcuNMP>-?<_!Yf4On4KPNXdi{+5^sFI2h9Eb4e4-L8s>u5e!pN=P`zw7cc$br3zInob?3*g= z)wC6rSiTu~BS9c!cH|8SdD*a4Utu&}CesP_9Fh~S?xPYyDPYwQiA_U)*X;SIxHmmL zs=UTm-wPpjxy;B=3EG)gWMXZ7e#Tcr8x!wX$K8_-%aOH<5Fj^#LbJP)Ote&9mUj^? z5#!XU-leC|qz8#<4k|%u;UW|Htz64?PbfZjn>kroAJYx?H{xURER~>nDo-Y|cl#D{ z1X^-6PsNdE9&AF1XsQp2-W@Wb zvf-g`tlgen`diH`{<)5WwF*|E025q^e1XW^6MUq&tG$W~Q+)ntI`PrPWk%p0f)ETf zR3BWk3yh74+(7tTB=52}o57n-8b332^s+?T2zD5ec=66uRrF=E z$1neEw~`srhX}EXfBrb)g2FlThD>zMvi2Azd%HC|b=^Oq!uA^y)8bTup;D7fe123U zue)DNhvN|QR4rE==r@g@)W4zQn(c35nIU(^Nu06&Vj9R=Ton?v-ghcIR{}?5~UjX#>K4 z>^yrFm5?w;NCI(Om!2`ER9rEsg0Jn}wf+x)05d44LnUaKk(neAe>1MGdDec9myf0> z_8^EDHAPvb{sssNr|OPZU=$2ip<9t*jb=(4q1|kEq}8PDr8zb zPb=nQloR=P4~~QG9hIQFw!rD6d3)dz+144F97R-kG%IMMWt$Dr{JpW#VBfRQV_r4sZW$U9m> zta5C!TX*YA|1I;9zB_zj^=(KfjzAxpAlDNKR+p9XrmHGXxqTcfD*i534hbcYA&|m> zkOUv=_G_P7=eXLmwCWtI_Dl{~6-cjAkh2MtOGrf^Ubp86`@gl{{!DM1M2T$z4??_J z;ScT(NHJKz$DH*B4QAGvU7uE{*7g+tp#=np)%Y<;#I6LN1RpydsMpB*2f2R}PNG+h z2u4q}31q|ozLiHN^7kBnFR}URS--@5WB)q#6zF5(ER~>$EfA}$;U#xgZ{gJWq_KDU zk&;|EBqm=|37#?}V-tF1FEJXVx-T`};(lM^^@qN@P#-E(f<^%BNg}aLtG~#V`REt@ z8|F#MWu-`F0MS*2S(LuUj7;=39gja@^g-mnu59^d%Vy;O0q%*D%cwpm)d6H;Bdtz! zne=B7o#k>3+gq;mL1JE(O3+L#K=4JHum8Yz?0tWQH{&(;-LX{SJjH-Y(0#Te`}laQ zguA?`dc&0-xnVn(jH@VtjF>`M(y_n|IUxNngDY#>1v4$9^-M~1;G{uv$?^~?!E&`8 zd=jF&eOT?rT*o!rjcujuZ5$)iTlm;{x&|si89^dIAmWQ!+U~f&dljhfmhj|FYd`Se zd*RScWG8|0Bmz_f!mg<7t*yL9c5d@n@4J*+8L(GNE+Y06isb^kcEfOO>d{6x}tzA{7NHq4^*W?f_=;8x)Let8*9t%rh7WbRPFj3GYwzEgX}%vw(-Hk~gT z+teEzlezcCA1MiCWL^CaK}kPNCUy?7Yp@At#yiYsG|G1E19=u9R)|r3(C%a;6CC+M z^(`B3*niuVHaS0g$N~^x&X*x=gCFIE$VB5OA<@3$>^59xob4&}wBQB}p%Nnd zc*%sK%B{hGW-5PvQ&~{JlN5R;sbvNjqADyV&y??3Lh0DnTP}PbNg&CvCoMy;-y5Afvg?_FGes z5Z+29C_jA3M6^(b+O4b1!p#=06p3p_J*12=9$Vg>jFh4$Y9kr;oo)bIrhTMFL+%a;#&hmf3z+>o=V1g{-fHAI40le_qS70>1G&b*Gn@!mZM zA@wi6n@Z3)tsoNJ>b;i`T~D@%RdUC!StNLT zo~3gu_z4M)6Oi~F13n3ai|-V9wpfaq@CKqV;m`N_mr)e}zHqbF5n&b}V{blPYb5<`U0DGLhD4zJEGK zLHVQ0$#Wc?R#%{pGIW)+2#^W!T<>R9se-MS+QYZ(+^A6kecUn!mY|5P1{Gl(w|{tU zt*K49r%aiCw)d$cuta8%4SYucg>LpYnRvx;Md9gi(V)W{8@h;0W<`Vu^vJBB5;U9( z?7?h-$|5?O-j)oF%oE1x&KOZmB`9{_+Xb;#%8#e_+k}oE=fA|3?%XpN4t<>AghbLe zGSO&Zkk61Br|lAW-g85( zGe94Q;>ZN;A2A(-LLO(Lf<*n|7FlZhp(PI8+^byw9n zr^%R29zKMOeC*s*ER~>K8YdGYSvvFIbR7Eg4hx-VG8jbGE+D2|A)$|)3WQa1nyoUY zhtEa+q$$JE&MRGDCn3a)86=8Vk%_2}b7$A2cJgoZKiMDSrsjwe=>G6pASZ5Uem7Tp z;gf)l(!ZcXedRnTu?_lY{zdjNyOL{oiYe@+YKoe(am4yjNc;tP3ltiIIWiF$oYeX8 z1=oDW;cLmObML%@#6Kx2L1%&Fc*4j<1udO84l0WkZMRCMUBZj*bAcHuL6Zya5JckE z=Z0t@t8CNkeM|P*<*(8QK0t04G=@asH8SCI)Z09E{*|ouOU`8b*b2}Kgb)BZ9x3ua zKt<@)z1XMgBessa=hS87-c4vgb`;_xf(p=x){}|vM+G@&x+Bu~iXL~o=et`437JeP zK`G}V6K_rGGNaB6i05p|S$Zh961g*g%s{UM3HIw`;!%02?=g`R-x=e6=x=!UG6)hZ zwp4-{c?U)u#}oP28k0RI+5_qRZr)wH0_1XJ9JhU-kB};+UP_d3@I-~nFtV7(^~vPPCL?zS#0N^yiUN$# ztICbFx;GoLoZZKDz5hlYNJj~nuPF4d$;1i`dAc*wZY+*c1_HwQW0((g9IUs=L_wmq z3%zsC3(Z?gp9)CRzCnGU=LbhUnXnS?ZBuG&+hk zV2elA(zvw=f9qE42XjpwIZDu6AQORB)8$><$?VHhxt}v;Kiu?XGPPzv1jHX)kw66~^dJut zi5{aPHC=zV+%j^MJM@)R!VeHZiARxrf)v&TZU9Q^ORPUmbGMXpe+b;LbtM=vO~B8k zwQZ1~F9M&0Ud{2*$x!T!Ux;R|6aIR&FCQUBSl1zQ4GP^Ps0f5$%UcTFl!H8HJ^`$}|2+;aaFP;zctq_i5dOG_Jzw>o z`TaJ|DL^1=w+8y4Lrxw-ul{^wWov%1-y!3|(Aop>`}Y2qU|C=fR&Ox9`mJ5`*8XD! z%mGgIsVH$5`d~rsSp*-QZC2tIpUs>!OZ|!x{%{7OL^;~4S~BtMz^Ty>qqkeT{n>MF z*MB$qFF^}(B+SdXH{_l}C*(vRgr6=>ZjC$5enqv%uZw@JlbHJ^Xsc;{)8*p&CW) zDDem-TFE}ddh<&zS4rwNN&UEe$HfQST&O;b5U1U+*WD}41fFc14=wW zeY__VzT>%tC!PH2e(kxu?ZwR}3MhfaYJrn8wr}eUo4~p$K9ACqnUPDuNdGgA%VZxR zl`HFC7RJAA^gYE-8<|>9AnuWg#-}Eiw|x&(aUE^YeqRu)N$AxAyam6hOiOP3FTr0AFv5J4{rSD=u*hrMLj9$e z@2#HxjuQ6~58!7LP!WluomwW=&)13_5XyeqWb=|h>>v|dCGqWQNm3y#Undz%Z))+P z!~?_w_*oBB1Rv68qr~^yoMZpN*6#T>XBZ>u5qm%wf{H+x9tu>;`r(n$KPGForrAmc z^-)I!C^Rl)Lh0vU3AT@FflXX*uZ;Qa#8x6kfSW(jNBch-?+w*gEIMVBrJc$mz&ub_ zNj>TVtTQ4J@Tgw0e*Ut@DQT12%0U6?gkCKW-Ghoe@<;mi`$qV&n-^u?#BKmstPYcX zw1h>nF0VgTZ$M~2HZI&BPSgPNK zyuDk-!O8!>eb6uPghgDvaSQJfk-rCG*v4#6(I7WuWaOZCNTFRI?_QDol)L;cXXdlZ zkGFM~hKT={pnj_$j9j)ONxy7IpyG4MC&9l@Kr_D_ zCD7bX2hLuij~CUltb!M9FW7#Tc=fDok332sXA>x_o}eQ1$~I%S@z>0b8+X|0cN@sv zwg3cj7Y#@3!OsbxA`qGBuYRgZOK#t@dE)Kr_4dF5oaaT-U@sztsSQ*FA~mu1B*$3m ztn~E63QF6)>jVPiFCxJ`vraujVf*$MtEa-Q2&a^w#2>^1@L>chf{z#pPvZ-BMRu)B z>@7@m`T?>(wO1&?48}zy+OIgrHh0EfzMNyUb8X@HCX_&S5-4;>Kt=G;!*6!+;`?Nq zM~Wpgt133%LJ8!g0c9yCs0f7TLz@TdM$b&oH_zK=Kw&3Q$ zWsjo|`F0Dlv4Zo0O8kR_0J5_PKKLCS_J|25^p?<%=yr7|j{esN%N8=BQGVgaUL{Ih z=G-@fk#qdckXT0peb9k%5q-RxrW^8P+DsBwJJ!m#GwhE-^;W(17kZ~-91jhpV{QeoQxuI8vr40^}1KwQ37N-r0|Y`iV)pj9VL6_G}k@QiQ)T|x2?bzCALxl$`UZ6MB<5Gt5}I? zhH>%hf=ctwJz$qoN3IA7`e`z;)8YLv=d)_2MB%#WktP9z z!?UkGWVHOE`!B)BK_=$dgVfn2g2tR8`_>ufx`NC`?UfSr!JqmR5p_(5s%MeJ{5< zTnJ>||LNf_2F@Sw*&r$Vm<55C=VxCbTF5D(ywyl#Ms;N$t%F~NlP z-a__bE4h_hQ$g0GMt3(ApwR1*2_7Ryl~chFU73b>_b|Sc6GDldkf2K?6Mu`tnXJu) zc;bJRIOM&I0;`+q1KiAzLchRDWC}Ps$1s)>Au%OGci_!gurH{D1|;ab!6#uH zjXSoserlmjJleSmxrHP73fZlo&}D#%KnykUu3!o4RA|qwdDcC{I*1bBQ5MP?(s{U0{#C_tPo!WLf*ENR;5KEEHpm-V8tmNZIn<4mY~qZfQmpgj6^#1Pf7SIMYdi20xT%82NJCB$%J~?z*Vh1 zMXTI4naUK_Uk7bd$ARo`P=ptVmEejwMJrK>WPkUOXsg{*W+=f230iQz6MOY6rDHF% zR%C+tOa4jg*|kh4!G#jYekY9l%>H`ae@|od3YX1kt1t0*E~z7U3?>y9>C5F@G&bR4t`oSb%dX+5-`s)V#>FqZPXk3WnOSacWgq4cd$!Y}J%Glx+K zdu?j(6O`abdo@n(m9({;qWKdamk#!@p)?QVzrUgO3Y+tOGT}0jeMEJ0vWwo6byqh# zO=8&x+ysz9+W{)V$k)BubyjEp?=e|TImIt2_i|7lV4om`VGdLT!eO1gbGo~zv$f_K zMrDtU;2R^gR}55u!W=>-9%T24&8|OkH-&2xKUa4&4N4&AA1Dl#pd$E?*&i;%vvx9% zBfBj1-aUhIltA(=C=52BA`o+i6y2XIn(8g%&1vK7rVjph9P|-nLec+E?3=4=rTov_ z&Zn*CO+yKKUNZ+joIA4BqpV&j{@3wOJ}3cBX{0bNu-X~(($|`%d=?tB z@8lH@P(Z#%A?M(4NHE8PPl6Ar_512~>aW;oSQ&`d4WCn{?Us_zNvZIVsXQ^!^$`1P{IfjOwnW?BGIiYt`BIX zI^Tgq- ztAXIWppFA%Q>4&=*b!sJGaQh2|4r1Py4`;s@VcEuZ!+slsQ`tAgG?lKmj51SoN|A9 zEm#q=m4hZBq1Gp(8g>D*DgkH@x^c1cPdf#AIO2>KWoL4VOAm1E8p+m+) zAQtEqa`(AH1^#b)g%Bl>_`mGc|0Wjb)y+?o%T|5~>*aa|7)45-t)@mde^eU!pa_%4 zQE;wQc?Zw=-8H?_8;ZwN!MOqEBYzY`fLf6AkTCLVMU9#1OU~5G#$Rx~`Fi>oBqpf$ zUHUhd49P^N8ozuvzrUkpWLkNC<$mN;L!R6e)$pnYglDpC&Eh%TT`rCCKkpCA2 zm1u$l?z6Xg4PJU;AFWPyV&g>~XNO1y@|lJ8_uSo6mF@g5!Ba*i;Lu4 zSs=G(-pPL-$5%LYN=A3PX_En5B}K9zV+&2krP%AUQ>XnWOrU zqyiL|1&Y}m9A2~$23SJccbs$lTV+(UTpyT1TO?1r2{G_ zz22B51{5Uvo!UJcNg%+vNbJ?ZK4klG4nz4zJsyt&1j*v4D3d4t+` z*qGue*XyfX8_VGFy>^B%_cHZ~UDUIH4BENl|bqdTWH}DQSi< zlmOmR_E@2M+bAWsdWccS09%Tv%A+nG5nj*>F}FY@G*de0Y;R=#A&4_AL4%YpDK~St zQU@P61&3xJa&FmBMhhcl7UJ|Qpd#&u-G1;I?=UG8V%}Fkq;x4(H`C=}lbk%nsNq0U z#t>J0b?DrQfOo;L=nSYbepo*Fa&?-EF~q$5K(!1JI~`r)`^SPS#Av^OXEMIHI~py& zAGxAp3PHvVpeNgedx&9mXvhXQL69l~W@HJZN6AywF`}Gx5cC{EYHto*9Ez9<>xMY9 z2&|DKkeUR}Bc#B@wyBEZsXXf}Ma0!w*A(l}wa%blsKws7)iL>@n^=Go7oTSMF% z4}#?>xXJ%+>?*l_0bc)%PEai$j$PO36B*eBKX^Agpr_!A`|{_=ds~@Ic+gZ2kgPz! z@g!FzvSqLELXk{fz*b1b@z=hM$`FZ~fS|_+FeXq)Lhx;Z5;M%ASh)i^75)o>lKZRuGJ77s9kQC!SbjlMf;+@%y8x9) zz$xVlZzw!8jDaA%4g?cZNotE519ukE)nRi6N!S#3U9_>*sBRdDf1#7VepnjpwfBC5)r7kp(zn1)2}Y9zoxt#hce3VWk&}D-86xwGJ!<(%eqtN-y8;;0!XYozdS~J;(!Rm=_i4u zG6hGAswx>GJ4!*&D-Ogf590hC&RNEL+`9uo_h-Ocg@Owz>Z-5Y_ZB`8XiouKg+Mxd zh7&nlFAA?4j|WI!A?C-OENU0>;aEP-{gv$^{_;D%St#*Ta@PR>ph451eeJT1~WO!|Q4aN`A#`_lZaCfTwKaKqHqIz42z_b*(Bc=!Z zt8bwVOKMbeJ#n^BJu&5J`tSF-uaadMy*@^+?pcqw#_2n-cvrWL4x*K??ip)xQb5wo zKEvi+b;WLIgPk0as-#+VJ&r(rA=jT*h&GCGn|@Jdm?ue_^S2&)wh@mu>WanspVVfq z=D2;{NN4Z~eg#9ecvi!FVZq_&<1a+{dbX&}SEHL9&b6~$43*reTQswVDZfe?ZN$k) z&1nI(;Dj?4Hx_-Yw9p1Cr1^d!BZK6sp;=<>TW7aqu#m~f>~}6^>l&t?Hcj&3ICjS` zDTv`-xn*-Qeow}yl0oHsgTZ#R@nxEP;-gNG^s&XD>1~e3?9s*!zx94=Q>xeYh<1*u z&&!nZeD8nRd~FK-bFa3wJw3ciG`ZtV%13m_PsIH} znuNB+;F7TgnL^jvpDi=_rB5EFIQ5PBQOcGS#K`KY)9-&u+=lYsw1pH?&^-^y^i$A#%4Z>~++qdH)>3X?BU(3VVIs zM$axryVij`2kiP7n?&YP#*gyPW{7>z(NfPIJ5-m{P)*_9aF#8e%1)ls@{|x#*rNEg z##++?VD5x>ASSjv$cWy}k+?~klYD51ZpG{KplNJ}9z_87MhO?3<=(BA<;LJj50t24 zO{tFxJ7le8%Ygk}{Lkin3Nr$;M}HGGket>rzJYF)PnE>eO1Gz_=e32#2S&Gmy4`pd z{M$KGL)ISVTboF4-7?Ys-n*lRV!y;dz7?~PLPS0r{qH)gtme(pun_k(4*(X-KT9Y!)PG|P|OF3UW z_&nLGV#K}4Ei<0eHY>$Ae={=gV4K9Pbv}wV21wPLQ}>M6ta`E9@hJJ>*Cpe}WGps( z!^Sj?Ics1$#r?iD+bt=`qrMc{T=vjJe0E)~u%p)dSqHR{_G#XxG9mlPwoA6bLlZRa zhw8FYNwSI#e#)+*S5wqIn}vrruP_<6E=!~jRLos!^f9hdv}z}yL+H0}Ic1xOSa3LM z(e_XKRyYc6j$q&aJaua4y|I*9ajVn9=!^pa+uqhN-5;@HjeXNuTDU&6@@jO8ep=?O zE|-AE_G%e_e?cxA&3}6m&POTZF;|^z#nP3ORyg{TZAZ$qmu#1b=7=Cd`s?}jcUnxjS9h?^dC+Ze12N7_a{Hi ztyQ=A&_;oP_sryqF`#tU z_sidtn;(m$)qIM+{AP#wYZBcmw};=UX7>eJC`%f1EUViHZS1JsLqBt-?eP(xSlcxF UpQ_Ntzn}aj$WHoq<^LJ~0}N*61poj5 delta 257 zcmXZWze@sf9L8}SY={gZqR;swJ@x!?dUQp)H8e!umS_=Lj?xnVgRiHY+V&DniUQ s*s-_h*)9`X|E(%I)iI|vMOYK+j+*)TPb3om=$l`QeYZS)x1qZ8zij+tegFUf diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 387420fa4dd7ebf5f9658dc8271ee12998b68d4b..9a5b743fc773068e75300def3af484f79a45ed0d 100644 GIT binary patch literal 17 UcmZSXTIa}Bc8+U10|Ybx04&=C3;+NC literal 17 UcmZSXTIa}Bc8+U10|f8`04!<)n*aa+ diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin index 07694ddfaf7a2e7baf98fc7e109d7466954368e5..f796efd93736ef5280f612acc53f257b96c1bbb9 100644 GIT binary patch literal 19289 zcmeI&X-HII6vpvuN|w2kGHD+qu|>sP5*3#a%xy|BNhuLDou(*U5K_@ng90@RnZzx^ zbQIH46hTAOkSImW#z9F#B(>5uFl~VfQ|~z=F<(SlAf5ro%YWW`-g|#D^GO2)L1MZ@ z4`JIOZ<2cl96CZ5Ce+iRZr`6!ay_4AL4@)JwVF-fa@s3{+>1 z%F7+7PjY|YrYBQY1$`BJsFZu}!<&Wi3GP9(uZ+8@Vp>_U^lU5j9_|x~Hv-E7-n!8I z%iJexlO9=ZNl&Huy4+utY)|SQi?gCRpSaH!H}*C8B?Qp=_uRkCxtpA_6H00RJa;4c z33XsZ$`P6~&E0rFw|z`<@g?<0?xrRAQFY4kLYi}jyTtZK+O*TjR?xqeKbeGJ;A!Q^!Nwk zb7BwKq3MquVici<^!bqdbLp=40iLsmyS%12TQO0+Ky$*mC;M0&mJj(R)Ai(Q zdd67L@V+O#bUn%3Q|CHW9W%GK(fWIu{(1A%<*o};w7#8thL>5MueVJO^?vS|4ZHNa z-JBw*=W)-fIPLG2U0+8%mOK9z1U>q0h%4|60SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2>e?Cx8?0u{xM!>AfPa*&S delta 68 zcmcaPjdA8A#tkMCj69R4N*GM$l{A=~D=9H~E0FG$l9U5Alr#FT^H0dfWg2X{a0a diff --git a/.gradle/checksums/checksums.lock b/.gradle/checksums/checksums.lock index 6c50e882c1e04cf250f41952f6032ae11c2ac6e3..c7326b4cceb0b5ac77b20561cf09964be9dd9389 100644 GIT binary patch literal 17 VcmZSnC$@iK!q%3f3}C?e4gfu21<3#a literal 17 UcmZSnC$@iK!q%3f3=m)i06e1w5C8xG diff --git a/.gradle/checksums/md5-checksums.bin b/.gradle/checksums/md5-checksums.bin index 0d03a3d6be21be6db6a799c670078d7080bd3730..9aa722f9d5d0c1f65ba4baa3363ad1992b59c045 100644 GIT binary patch delta 1401 zcmZ49%5<=oX@iLbqr+xX2|*_QeP3Exo0r5ffI*w~W?QKpi~>uqm#}wwT@QeWw*24x zR$7BmV9gg6!Fe(BS3yKur%vXToguJw-k(3IyVl%+2sSOBJXdxmzwhHNN2j?5pbCF( z)|E44;=g|^j=3nT8!C8wbEv`$W`U>NN@kVSN6R3hEwd*-RSx9OIw;I~Z2vu|SmtJ3 zl@rVYtQY0IYi~SV4-sv;x%sVn2D5;MrB{*FW<^zqX!GUCzS=W1bTf+Ht(@Zo5o2iU z{|^Paf66^_qUUah8f-rKuJ#E53up<;%USxuanGEX+2{gp$Wtwj-o); zZ}DlI_J?H@AM6z_Go1yD3XqP_=RipykN^cCnvR&oACGv%%Zdiw<>UJF=Gsz-jtC~8 zN{~I7#h6;y_D5e@=JSuc^zg*GE#~VtL9~S10#yQmN-B^*v!uc#yYXc95e7{$?$xoW zjsGAz%BO%eFbLhn)S*1_?!5Xoqm}Y3tk(A>=C)cvwM>O*;rNfKrIO*h$=@5lk{4OL z5;hL3_z2Na1+~Ob22+Q_rlzVa`&22tm3(1!?A)IqIx4?G>=3O71pt~){-l?Ob$G4U zoG!Rc?&aM2W~i2Ah!+0)m^w}-svcLhiof^I>4*58*(^{?>Y@3Gtshf|=fcx}W39Gs zsh3c$-6XDj{yM~x1{H`U9JevGEPI%8nzv7SF7Jy|S^Y+iN>Ck_AUfE+Fm+V9Z=T=x z($yqV$#cwOJ0Lh2t%z zC2#!?g$fr7e>jlbS0vWEyAY~lBSZ(=K1?0z2U54Zo#JPDR!eM~+e6951J delta 113 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

S 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 diff --git a/.gradle/checksums/sha1-checksums.bin b/.gradle/checksums/sha1-checksums.bin deleted file mode 100644 index 4bc6d3f6b84f4fb9c5000ee3dbe66ffbb599cd1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 130805 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

Ug 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 Date: Sat, 28 Aug 2021 17:20:19 +0900 Subject: [PATCH 08/41] =?UTF-8?q?[REMOVE]=20mvn=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EB=AA=A8=EB=91=90=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .mvn/wrapper/MavenWrapperDownloader.java | 117 --------- .mvn/wrapper/maven-wrapper.jar | Bin 50710 -> 0 bytes .mvn/wrapper/maven-wrapper.properties | 2 - mvnw | 310 ----------------------- mvnw.cmd | 182 ------------- pom.xml | 232 ----------------- 6 files changed, 843 deletions(-) delete mode 100644 .mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 .mvn/wrapper/maven-wrapper.jar delete mode 100644 .mvn/wrapper/maven-wrapper.properties delete mode 100755 mvnw delete mode 100644 mvnw.cmd delete mode 100644 pom.xml diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index e76d1f32..00000000 --- a/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2007-present the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import java.net.*; -import java.io.*; -import java.nio.channels.*; -import java.util.Properties; - -public class MavenWrapperDownloader { - - private static final String WRAPPER_VERSION = "0.5.6"; - /** - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. - */ - private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" - + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; - - /** - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to - * use instead of the default one. - */ - private static final String MAVEN_WRAPPER_PROPERTIES_PATH = - ".mvn/wrapper/maven-wrapper.properties"; - - /** - * Path where the maven-wrapper.jar will be saved to. - */ - private static final String MAVEN_WRAPPER_JAR_PATH = - ".mvn/wrapper/maven-wrapper.jar"; - - /** - * Name of the property which should be used to override the default download url for the wrapper. - */ - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; - - public static void main(String args[]) { - System.out.println("- Downloader started"); - File baseDirectory = new File(args[0]); - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); - String url = DEFAULT_DOWNLOAD_URL; - if(mavenWrapperPropertyFile.exists()) { - FileInputStream mavenWrapperPropertyFileInputStream = null; - try { - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); - Properties mavenWrapperProperties = new Properties(); - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); - } catch (IOException e) { - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); - } finally { - try { - if(mavenWrapperPropertyFileInputStream != null) { - mavenWrapperPropertyFileInputStream.close(); - } - } catch (IOException e) { - // Ignore ... - } - } - } - System.out.println("- Downloading from: " + url); - - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if(!outputFile.getParentFile().exists()) { - if(!outputFile.getParentFile().mkdirs()) { - System.out.println( - "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); - } - } - System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); - try { - downloadFileFromURL(url, outputFile); - System.out.println("Done"); - System.exit(0); - } catch (Throwable e) { - System.out.println("- Error downloading"); - e.printStackTrace(); - System.exit(1); - } - } - - private static void downloadFileFromURL(String urlString, File destination) throws Exception { - if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { - String username = System.getenv("MVNW_USERNAME"); - char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); - Authenticator.setDefault(new Authenticator() { - @Override - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(username, password); - } - }); - } - URL website = new URL(urlString); - ReadableByteChannel rbc; - rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(destination); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } - -} diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50710 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 EfAhh=DF6Tf diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties deleted file mode 100644 index 642d572c..00000000 --- a/.mvn/wrapper/maven-wrapper.properties +++ /dev/null @@ -1,2 +0,0 @@ -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip -wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/mvnw b/mvnw deleted file mode 100755 index a16b5431..00000000 --- a/mvnw +++ /dev/null @@ -1,310 +0,0 @@ -#!/bin/sh -# ---------------------------------------------------------------------------- -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you 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. -# ---------------------------------------------------------------------------- - -# ---------------------------------------------------------------------------- -# Maven Start Up Batch script -# -# Required ENV vars: -# ------------------ -# JAVA_HOME - location of a JDK home dir -# -# Optional ENV vars -# ----------------- -# M2_HOME - location of maven2's installed home dir -# MAVEN_OPTS - parameters passed to the Java VM when running Maven -# e.g. to debug Maven itself, use -# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -# MAVEN_SKIP_RC - flag to disable loading of mavenrc files -# ---------------------------------------------------------------------------- - -if [ -z "$MAVEN_SKIP_RC" ] ; then - - if [ -f /etc/mavenrc ] ; then - . /etc/mavenrc - fi - - if [ -f "$HOME/.mavenrc" ] ; then - . "$HOME/.mavenrc" - fi - -fi - -# OS specific support. $var _must_ be set to either true or false. -cygwin=false; -darwin=false; -mingw=false -case "`uname`" in - CYGWIN*) cygwin=true ;; - MINGW*) mingw=true;; - Darwin*) darwin=true - # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home - # See https://developer.apple.com/library/mac/qa/qa1170/_index.html - if [ -z "$JAVA_HOME" ]; then - if [ -x "/usr/libexec/java_home" ]; then - export JAVA_HOME="`/usr/libexec/java_home`" - else - export JAVA_HOME="/Library/Java/Home" - fi - fi - ;; -esac - -if [ -z "$JAVA_HOME" ] ; then - if [ -r /etc/gentoo-release ] ; then - JAVA_HOME=`java-config --jre-home` - fi -fi - -if [ -z "$M2_HOME" ] ; then - ## resolve links - $0 may be a link to maven's home - PRG="$0" - - # need this for relative symlinks - while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - 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 - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi -else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - if [ -n "$MVNW_REPOURL" ]; then - jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - else - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - fi - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - if $cygwin; then - wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` - fi - - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget "$jarUrl" -O "$wrapperJarPath" - else - wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" - fi - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl -o "$wrapperJarPath" "$jarUrl" -f - else - curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f - fi - - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - # For Cygwin, switch paths to Windows format before running javac - if $cygwin; then - javaClass=`cygpath --path --windows "$javaClass"` - fi - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" -export MAVEN_CMD_LINE_ARGS - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd deleted file mode 100644 index c8d43372..00000000 --- a/mvnw.cmd +++ /dev/null @@ -1,182 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. 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, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - -FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - if "%MVNW_VERBOSE%" == "true" ( - echo Found %WRAPPER_JAR% - ) -) else ( - if not "%MVNW_REPOURL%" == "" ( - SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" - ) - if "%MVNW_VERBOSE%" == "true" ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% - ) - - powershell -Command "&{"^ - "$webclient = new-object System.Net.WebClient;"^ - "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ - "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ - "}"^ - "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ - "}" - if "%MVNW_VERBOSE%" == "true" ( - echo Finished downloading %WRAPPER_JAR% - ) -) -@REM End of extension - -@REM Provide a "standardized" way to retrieve the CLI args that will -@REM work with both Windows and non-Windows executions. -set MAVEN_CMD_LINE_ARGS=%* - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% diff --git a/pom.xml b/pom.xml deleted file mode 100644 index ede2a209..00000000 --- a/pom.xml +++ /dev/null @@ -1,232 +0,0 @@ - - - 4.0.0 - - org.springframework.boot - spring-boot-starter-parent - 2.4.2 - - - com.moment - the - 0.0.1-SNAPSHOT - the - the_moment server - - 11 - - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - org.springframework.boot - spring-boot-starter-security - - - org.springframework.boot - spring-boot-starter-validation - - - org.springframework.boot - spring-boot-starter-web - - - com.h2database - h2 - runtime - - - org.springframework.boot - spring-boot-configuration-processor - true - - - org.springframework.boot - spring-boot-starter-tomcat - provided - - - org.projectlombok - lombok - true - compile - - - org.springframework.boot - spring-boot-starter-test - test - - - - org.springframework.boot - spring-boot-starter-data-redis - - - org.springframework.security - spring-security-test - test - - - mysql - mysql-connector-java - runtime - - - - io.springfox - springfox-swagger-ui - 2.9.1 - - - io.springfox - springfox-swagger2 - 2.9.1 - - - - io.swagger - swagger-annotations - 1.6.2 - - - - io.swagger - swagger-models - 1.6.2 - - - - io.jsonwebtoken - jjwt-api - 0.11.1 - - - io.jsonwebtoken - jjwt-impl - 0.11.1 - runtime - - - io.jsonwebtoken - jjwt-jackson - 0.11.1 - runtime - - - - org.modelmapper - modelmapper - 2.3.0 - - - - net.rakugakibox.util - yaml-resource-bundle - 1.1 - - - - - io.fabric8 - docker-maven-plugin - 0.30.0 - - - - org.junit.jupiter - junit-jupiter-params - 5.4.2 - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - com.spotify - docker-maven-plugin - 1.0.0 - - example - ${project.basedir}/src/main/resources/docker - - - / - ${project.build.directory} - ${project.build.finalName}.jar - - - - - - org.jacoco - jacoco-maven-plugin - 0.8.6 - - - - **/*com/moment/the/*Application.class - - - - - jacoco-prepare-agent - - prepare-agent - - - - jacoco-report - - report - - - - jacoco-check - - check - - - - - BUNDLE - - - INSTRUCTION - COVEREDRATIO - 0.80 - - - METHOD - - - LINE - TOTALCOUNT - 30 - - - - - - - - - - - From fb2cb22da62f5d47c454152a15447e28d20b2b6f Mon Sep 17 00:00:00 2001 From: siwony_ Date: Sat, 28 Aug 2021 17:42:55 +0900 Subject: [PATCH 09/41] =?UTF-8?q?[UPDATE]=20query=20dsl=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20=EC=84=A4=EC=A0=95'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + build.gradle | 21 ++++++ out/production/resources/application.yml | 65 +++++++++++++++++++ .../resources/i18n/exception_en.yml | 47 ++++++++++++++ .../resources/i18n/exception_ko.yml | 47 ++++++++++++++ 5 files changed, 182 insertions(+) create mode 100644 out/production/resources/application.yml create mode 100644 out/production/resources/i18n/exception_en.yml create mode 100644 out/production/resources/i18n/exception_ko.yml diff --git a/.gitignore b/.gitignore index c32fbc14..d8096e4b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,8 @@ target/ !**/src/main/**/target/ !**/src/test/**/target/ +out + ### STS ### .apt_generated .classpath diff --git a/build.gradle b/build.gradle index 376a958b..26b47559 100644 --- a/build.gradle +++ b/build.gradle @@ -6,6 +6,7 @@ plugins { id 'java' id 'org.springframework.boot' version '2.4.2' id 'io.spring.dependency-management' version '1.0.11.RELEASE' + id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" } repositories { @@ -48,9 +49,13 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' + // DB runtimeOnly 'com.h2database:h2' runtimeOnly 'mysql:mysql-connector-java' + // QueryDSL + compileOnly 'com.querydsl:querydsl-jpa' + compileOnly 'com.querydsl:querydsl-apt' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' @@ -67,3 +72,19 @@ java.sourceCompatibility = JavaVersion.VERSION_11 tasks.withType(JavaCompile) { options.encoding = 'UTF-8' } + +def querydslDir = "$buildDir/generated/querydsl" + +querydsl { + jpa = true + querydslSourcesDir = querydslDir +} +sourceSets { + main.java.srcDir querydslDir +} +configurations { + querydsl.extendsFrom compileClasspath +} +compileQuerydsl { + options.annotationProcessorPath = configurations.querydsl +} \ No newline at end of file diff --git a/out/production/resources/application.yml b/out/production/resources/application.yml new file mode 100644 index 00000000..08c551a4 --- /dev/null +++ b/out/production/resources/application.yml @@ -0,0 +1,65 @@ +server: + #포트 + port: 8080 + # UTF-8 사용 + servlet: + encoding: + charset: UTF-8 + enabled: true + force: true + +logging: + level: + com.moment.the.config.mvc.RequestResponseLoggingFilter: debug + org.hibernate.SQL: debug + org.hibernate.type: trace + charset: + console: UTF-8 + file: + name: ./logs/product.log + path: ./logs/product.log + logback: + rollingpolicy: + file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}-%i.log + max-file-size: 500MB + max-history: 1 + +spring: + #H2 DataBase + h2: + console: + enabled: true + path: /h2-console + settings: + web-allow-others: true + + #DB 설정 + datasource: + url: jdbc:h2:mem:the_moment + driver-class-name: org.h2.Driver + username: sa + + #JPA 설정 + jpa: + database-platform: org.hibernate.dialect.H2Dialect + properties: + hibernate: + show_sql: true + format_sql: true + hbm2ddl: + auto: update + show-sql: true + + #Message 설정 + messages: + basename: i18n/exception + encoding: UTF-8 + + # Redis + redis: + image: redis:latest + host: localhost + port: 6379 + + jwt: + secret: asdkfhksldjhfkajsdhfasd7df67sa8d6f87as6df86sa8d7f6a8ds6f87a9s6d8f76sad87f687ad6f8asd76f8asd6f8asd6f87sd6f87asd6f87s \ No newline at end of file diff --git a/out/production/resources/i18n/exception_en.yml b/out/production/resources/i18n/exception_en.yml new file mode 100644 index 00000000..f8e42951 --- /dev/null +++ b/out/production/resources/i18n/exception_en.yml @@ -0,0 +1,47 @@ +unKnown: + code: "-9999" + msg: "Unknown error" + +userNotFound: + code: "-1000" + msg: "User could not be found." + +userAlreadyExists: + code: "-999" + msg: "The user already exists." + +noPost: + code: "-888" + msg: "I can't find the post." + +noComment: + code: "-777" + msg: "I can't find that answer." + +answer-already-exists: + code: "-776" + msg: "Corresponding 'Inconvenient Moment' already have an answer." + +access-not-found: + code: "-775" + msg: "You do not have access to this resource." + +noImprovement: + code: "-666" + msg: "No such improvement can be found." + +method-argument-not-valid: + code: "-555" + msg: "Invalid format for request." + +goods-not-cancel: + code: "-444" + msg: "Unable to cancel recommendation." + +invalid-token: + code: "-300" + msg: "The token is not valid." + +access-token-expired: + code: "-301" + msg: "The access token has expired." \ No newline at end of file diff --git a/out/production/resources/i18n/exception_ko.yml b/out/production/resources/i18n/exception_ko.yml new file mode 100644 index 00000000..847c9515 --- /dev/null +++ b/out/production/resources/i18n/exception_ko.yml @@ -0,0 +1,47 @@ +unKnown: + code: "-9999" + msg: "알 수 없는 오류" + +userNotFound: + code: "-1000" + msg: "사용자를 찾을 수 없습니다." + +userAlreadyExists: + code: "-999" + msg: "유저가 이미 존재합니다." + +noPost: + code: "-888" + msg: "해당 게시글을 찾을 수 없습니다." + +noComment: + code: "-777" + msg: "해당 답변을 찾을 수 없습니다." + +answer-already-exists: + code: "-776" + msg: "해당 '불편한 순간' 에 대한 답변이 이미 있습니다." + +access-not-found: + code: "-775" + msg: "해당 리소스에 대한 액세스 권한이 없습니다." + +noImprovement: + code: "-666" + msg: "해당 개선 사례를 찾을 수 없습니다." + +method-argument-not-valid: + code: "-555" + msg: "요청 형식에 알맞지 않습니다." + +goods-not-cancel: + code: "-444" + msg: "추천을 취소할 수 없습니다." + +invalid-token: + code: "-300" + msg: "토큰이 올바르지 않습니다." + +access-token-expired: + code: "-301" + msg: "엑세스 토큰이 만료되었습니다." \ No newline at end of file From 151c3f38a64454c80b9109fecfc084cc3cbc8e62 Mon Sep 17 00:00:00 2001 From: siwony_ Date: Sat, 28 Aug 2021 17:43:27 +0900 Subject: [PATCH 10/41] =?UTF-8?q?[REMOVE]=20out=EB=94=94=EB=A0=89=EB=A6=AC?= =?UTF-8?q?=EA=B0=80=20ignore=EB=90=98=EC=A7=80=20=EC=95=8A=EC=95=84=20?= =?UTF-8?q?=EC=BA=90=EC=8B=9C=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 50 ---- Dockerfile | 20 -- LICENSE | 21 -- README.md | 77 ------ build.gradle | 90 ------- docker-compose-env.sh | 15 -- docker-compose.yml | 13 - gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 0 bytes gradle/wrapper/gradle-wrapper.properties | 5 - gradlew | 185 ------------- gradlew.bat | 89 ------- meterial/imgSource/the_moment_README_logo.png | Bin 11185 -> 0 bytes out/production/resources/application.yml | 65 ----- .../resources/i18n/exception_en.yml | 47 ---- .../resources/i18n/exception_ko.yml | 47 ---- settings.gradle | 5 - .../java/com/moment/the/TheApplication.java | 15 -- .../com/moment/the/admin/AdminDomain.java | 81 ------ .../the/admin/controller/AdminController.java | 61 ----- .../com/moment/the/admin/dto/AdminDto.java | 36 --- .../com/moment/the/admin/dto/SignInDto.java | 24 -- .../the/admin/repository/AdminRepository.java | 11 - .../the/admin/service/AdminService.java | 13 - .../the/admin/service/AdminServiceImpl.java | 89 ------- .../com/moment/the/answer/AnswerDomain.java | 51 ---- .../answer/controller/AnswerController.java | 57 ---- .../com/moment/the/answer/dto/AnswerDto.java | 24 -- .../moment/the/answer/dto/AnswerResDto.java | 17 -- .../answer/repository/AnswerRepository.java | 18 -- .../the/answer/service/AnswerService.java | 112 -------- .../exception/MessageConfiguration.java | 61 ----- .../config/mvc/ExceptionHandlerFilter.java | 63 ----- .../mvc/RequestResponseLoggingFilter.java | 34 --- .../the/config/mvc/WebMvcConfigurerImpl.java | 25 -- .../security/SecurityConfiguration.java | 55 ---- .../security/auth/MyUserDetailsService.java | 21 -- .../config/security/jwt/JwtRequestFilter.java | 114 -------- .../the/config/security/jwt/JwtUtil.java | 143 ---------- .../the/exceptionAdvice/ExceptionAdvice.java | 112 -------- .../controller/ExceptionController.java | 61 ----- .../exception/AccessNotFoundException.java | 13 - .../AccessTokenExpiredException.java | 14 - .../AnswerAlreadyExistsException.java | 13 - ...CustomMethodArgumentNotValidException.java | 13 - .../exception/GoodsNotCancelException.java | 13 - .../exception/InvalidTokenException.java | 13 - .../exception/NoCommentException.java | 13 - .../exception/NoGoodException.java | 13 - .../exception/NoImprovementException.java | 13 - .../exception/NoPostException.java | 13 - .../exception/UserAlreadyExistsException.java | 13 - .../exception/UserNotFoundException.java | 13 - .../handler/AccessNotFoundHandler.java | 12 - .../handler/AccessTokenExpiredHandler.java | 12 - .../handler/AnswerAlreadyExistsHandler.java | 13 - .../CustomMethodArgumentNotValidHandler.java | 12 - .../handler/GoodsNotCancelHandler.java | 12 - .../handler/InvalidTokenHandler.java | 12 - .../handler/NoCommentHandler.java | 15 -- .../handler/NoImprovementHandler.java | 15 -- .../handler/NoPostHandler.java | 15 -- .../handler/UserAlreadyExistsHandler.java | 15 -- .../handler/UserNotFoundHandler.java | 15 -- .../the/improvement/ImprovementDomain.java | 38 --- .../controller/ImprovementController.java | 60 ----- .../the/improvement/dto/ImprovementDto.java | 28 -- .../dto/ImprovementViewAllDto.java | 18 -- .../repository/ImprovementRepository.java | 19 -- .../service/ImprovementService.java | 67 ----- .../moment/the/response/ResponseService.java | 86 ------ .../the/response/result/CommonResult.java | 18 -- .../the/response/result/ListResult.java | 12 - .../the/response/result/SingleResult.java | 10 - .../com/moment/the/table/TableDomain.java | 35 --- .../the/table/controller/TableController.java | 67 ----- .../the/table/dto/AmountUncomfortableDto.java | 15 -- .../com/moment/the/table/dto/TableDto.java | 24 -- .../moment/the/table/dto/TableViewDto.java | 23 -- .../the/table/repository/TableRepository.java | 33 --- .../the/table/service/TableService.java | 85 ------ .../java/com/moment/the/util/RedisUtil.java | 36 --- src/main/resources/application.yml | 65 ----- src/main/resources/i18n/exception_en.yml | 47 ---- src/main/resources/i18n/exception_ko.yml | 47 ---- .../com/moment/the/TheApplicationTests.java | 9 - .../release/TableControllerTest.java | 237 ----------------- .../service/ImprovementServiceTest.java | 81 ------ .../the/service/AdminServiceImplTest.java | 240 ----------------- .../moment/the/service/AnswerServiceTest.java | 245 ------------------ .../the/service/ImprovementServiceTest.java | 152 ----------- .../moment/the/service/TableServiceTest.java | 189 -------------- src/test/resources/application.yml | 61 ----- 92 files changed, 4379 deletions(-) delete mode 100644 .gitignore delete mode 100644 Dockerfile delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 build.gradle delete mode 100755 docker-compose-env.sh delete mode 100644 docker-compose.yml delete mode 100644 gradle/wrapper/gradle-wrapper.jar delete mode 100644 gradle/wrapper/gradle-wrapper.properties delete mode 100755 gradlew delete mode 100644 gradlew.bat delete mode 100644 meterial/imgSource/the_moment_README_logo.png delete mode 100644 out/production/resources/application.yml delete mode 100644 out/production/resources/i18n/exception_en.yml delete mode 100644 out/production/resources/i18n/exception_ko.yml delete mode 100644 settings.gradle delete mode 100644 src/main/java/com/moment/the/TheApplication.java delete mode 100644 src/main/java/com/moment/the/admin/AdminDomain.java delete mode 100644 src/main/java/com/moment/the/admin/controller/AdminController.java delete mode 100644 src/main/java/com/moment/the/admin/dto/AdminDto.java delete mode 100644 src/main/java/com/moment/the/admin/dto/SignInDto.java delete mode 100644 src/main/java/com/moment/the/admin/repository/AdminRepository.java delete mode 100644 src/main/java/com/moment/the/admin/service/AdminService.java delete mode 100644 src/main/java/com/moment/the/admin/service/AdminServiceImpl.java delete mode 100644 src/main/java/com/moment/the/answer/AnswerDomain.java delete mode 100644 src/main/java/com/moment/the/answer/controller/AnswerController.java delete mode 100644 src/main/java/com/moment/the/answer/dto/AnswerDto.java delete mode 100644 src/main/java/com/moment/the/answer/dto/AnswerResDto.java delete mode 100644 src/main/java/com/moment/the/answer/repository/AnswerRepository.java delete mode 100644 src/main/java/com/moment/the/answer/service/AnswerService.java delete mode 100644 src/main/java/com/moment/the/config/exception/MessageConfiguration.java delete mode 100644 src/main/java/com/moment/the/config/mvc/ExceptionHandlerFilter.java delete mode 100644 src/main/java/com/moment/the/config/mvc/RequestResponseLoggingFilter.java delete mode 100644 src/main/java/com/moment/the/config/mvc/WebMvcConfigurerImpl.java delete mode 100644 src/main/java/com/moment/the/config/security/SecurityConfiguration.java delete mode 100644 src/main/java/com/moment/the/config/security/auth/MyUserDetailsService.java delete mode 100644 src/main/java/com/moment/the/config/security/jwt/JwtRequestFilter.java delete mode 100644 src/main/java/com/moment/the/config/security/jwt/JwtUtil.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/ExceptionAdvice.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/controller/ExceptionController.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/AccessNotFoundException.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/AccessTokenExpiredException.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/AnswerAlreadyExistsException.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/CustomMethodArgumentNotValidException.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/GoodsNotCancelException.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/InvalidTokenException.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/NoCommentException.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/NoGoodException.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/NoImprovementException.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/NoPostException.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/UserAlreadyExistsException.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/UserNotFoundException.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/AccessNotFoundHandler.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/AccessTokenExpiredHandler.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/AnswerAlreadyExistsHandler.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/CustomMethodArgumentNotValidHandler.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/GoodsNotCancelHandler.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/InvalidTokenHandler.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/NoCommentHandler.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/NoImprovementHandler.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/NoPostHandler.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/UserAlreadyExistsHandler.java delete mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/UserNotFoundHandler.java delete mode 100644 src/main/java/com/moment/the/improvement/ImprovementDomain.java delete mode 100644 src/main/java/com/moment/the/improvement/controller/ImprovementController.java delete mode 100644 src/main/java/com/moment/the/improvement/dto/ImprovementDto.java delete mode 100644 src/main/java/com/moment/the/improvement/dto/ImprovementViewAllDto.java delete mode 100644 src/main/java/com/moment/the/improvement/repository/ImprovementRepository.java delete mode 100644 src/main/java/com/moment/the/improvement/service/ImprovementService.java delete mode 100644 src/main/java/com/moment/the/response/ResponseService.java delete mode 100644 src/main/java/com/moment/the/response/result/CommonResult.java delete mode 100644 src/main/java/com/moment/the/response/result/ListResult.java delete mode 100644 src/main/java/com/moment/the/response/result/SingleResult.java delete mode 100644 src/main/java/com/moment/the/table/TableDomain.java delete mode 100644 src/main/java/com/moment/the/table/controller/TableController.java delete mode 100644 src/main/java/com/moment/the/table/dto/AmountUncomfortableDto.java delete mode 100644 src/main/java/com/moment/the/table/dto/TableDto.java delete mode 100644 src/main/java/com/moment/the/table/dto/TableViewDto.java delete mode 100644 src/main/java/com/moment/the/table/repository/TableRepository.java delete mode 100644 src/main/java/com/moment/the/table/service/TableService.java delete mode 100644 src/main/java/com/moment/the/util/RedisUtil.java delete mode 100644 src/main/resources/application.yml delete mode 100644 src/main/resources/i18n/exception_en.yml delete mode 100644 src/main/resources/i18n/exception_ko.yml delete mode 100644 src/test/java/com/moment/the/TheApplicationTests.java delete mode 100644 src/test/java/com/moment/the/controller/release/TableControllerTest.java delete mode 100644 src/test/java/com/moment/the/improvement/service/ImprovementServiceTest.java delete mode 100644 src/test/java/com/moment/the/service/AdminServiceImplTest.java delete mode 100644 src/test/java/com/moment/the/service/AnswerServiceTest.java delete mode 100644 src/test/java/com/moment/the/service/ImprovementServiceTest.java delete mode 100644 src/test/java/com/moment/the/service/TableServiceTest.java delete mode 100644 src/test/resources/application.yml diff --git a/.gitignore b/.gitignore deleted file mode 100644 index d8096e4b..00000000 --- a/.gitignore +++ /dev/null @@ -1,50 +0,0 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/**/target/ -!**/src/test/**/target/ - -out - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ -!**/src/main/**/build/ -!**/src/test/**/build/ - -### VS Code ### -.vscode/ - -### log ### -/logs/** - -### Gradle ### -.gradle - -# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) -!gradle-wrapper.jar - -### Gradle Patch ### -**/build/ - -### apllication config ### -#/src/main/resources/application.yml \ No newline at end of file diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index b0031a10..00000000 --- a/Dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -# docker start with a base image containing java runtime -FROM openjdk:11 - -# Add Author information -LABEL maintainer="s20062@gsm.hs.kr" - -# Add a volume to /tmp -VOLUME /tmp - -# Make port 8080 available to the world outside this container -EXPOSE 8080 - -# The application's jar file -ARG JAR_FILE=target/the-0.0.1-SNAPSHOT.jar - -# Add the application's jar to the container -ADD ${JAR_FILE} the_moment_server.jar - -# Run the jar file -ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/the_moment_server.jar"] diff --git a/LICENSE b/LICENSE deleted file mode 100644 index fb298683..00000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021 the_moment - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index f3e023ba..00000000 --- a/README.md +++ /dev/null @@ -1,77 +0,0 @@ -## - -["학교가 불편한 순간"](https://github.com/theMomentTeam/the_moment-Service)은 학교가 더욱 더 개선되기 위해 학생들 관점에서 느끼는 불편한 순간을 기록하는 공간입니다. -> "the_moment" is a space that records the uncomfortable moments felt from the perspective of students in order to improve the school even more. - -
- -#### GET start -``` -- install maven -$ sudo apt-get install maven - -- checking maven version -$ maven -version - -- docker install -$ sudo apt-get install docker.io - -- docker-compose install -$ sudo apt-get install docker-compose - -- start the_moment-server use shell! (Docker Run) -$ sudo ./docker-compose-env.sh - -- Run in the background as well (prefer) -$ sudo nohup ./docker-compose-env.sh & -``` - -#### Development -``` -* server dependency - - Java 11 (Open-JDK) - - SpringBoot - - Spring Data JPA - - H2 DataBase - - Lombok - - Validation - - Spring Security - - Spring Data Reactive Redis - -* dev tools - - IntelliJ IDEA - - Docker - - Redis - - Swagger2 - -* Deployment - - AWS EC2 - - AWS Route 53 - - AWS RDS (Mysql) -``` - -#### Our Server License -``` -MIT License - -Copyright (c) 2021 the_moment - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - -``` diff --git a/build.gradle b/build.gradle deleted file mode 100644 index 26b47559..00000000 --- a/build.gradle +++ /dev/null @@ -1,90 +0,0 @@ -/* - * This file was generated by the Gradle 'init' task. - */ - -plugins { - id 'java' - id 'org.springframework.boot' version '2.4.2' - id 'io.spring.dependency-management' version '1.0.11.RELEASE' - id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" -} - -repositories { - mavenCentral() - maven { - url = uri('https://repo.maven.apache.org/maven2/') - } -} - -dependencies { - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'org.springframework.boot:spring-boot-starter-security' - implementation 'org.springframework.boot:spring-boot-starter-validation' - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-configuration-processor' - implementation 'org.springframework.boot:spring-boot-starter-data-redis' - - // Swagger - implementation 'io.springfox:springfox-swagger-ui:2.9.1' - implementation 'io.springfox:springfox-swagger2:2.9.1' - implementation 'io.swagger:swagger-annotations:1.6.2' - implementation 'io.swagger:swagger-models:1.6.2' - - // JWT토큰 관련 의존성 - implementation 'io.jsonwebtoken:jjwt-api:0.11.1' - runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.1' - runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.1' - - // modelMapper - implementation 'org.modelmapper:modelmapper:2.3.0' - - implementation 'net.rakugakibox.util:yaml-resource-bundle:1.1' - - implementation 'io.fabric8:docker-maven-plugin:0.30.0' - - // lombok - implementation 'org.projectlombok:lombok' - compileOnly 'org.projectlombok:lombok' - testCompileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' - testAnnotationProcessor 'org.projectlombok:lombok' - - // DB - runtimeOnly 'com.h2database:h2' - runtimeOnly 'mysql:mysql-connector-java' - - // QueryDSL - compileOnly 'com.querydsl:querydsl-jpa' - compileOnly 'com.querydsl:querydsl-apt' - - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.springframework.security:spring-security-test' - testImplementation 'org.junit.jupiter:junit-jupiter-params' - - compileOnly 'org.springframework.boot:spring-boot-starter-tomcat' -} - -group = 'com.moment' -version = '0.0.1-SNAPSHOT' -description = 'the' -java.sourceCompatibility = JavaVersion.VERSION_11 - -tasks.withType(JavaCompile) { - options.encoding = 'UTF-8' -} - -def querydslDir = "$buildDir/generated/querydsl" - -querydsl { - jpa = true - querydslSourcesDir = querydslDir -} -sourceSets { - main.java.srcDir querydslDir -} -configurations { - querydsl.extendsFrom compileClasspath -} -compileQuerydsl { - options.annotationProcessorPath = configurations.querydsl -} \ No newline at end of file diff --git a/docker-compose-env.sh b/docker-compose-env.sh deleted file mode 100755 index ea5a782e..00000000 --- a/docker-compose-env.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -echo "====mvn clean======" -./mvnw clean - -echo "=====mvn compile=====" -./mvnw compile - -echo "======mvn package======" -./mvnw package - -echo "======docker-compose build======" -docker-compose build - -echo "======docker-compose up=======" -docker-compose up \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index 6960a51b..00000000 --- a/docker-compose.yml +++ /dev/null @@ -1,13 +0,0 @@ -version: '2' -services: - app: - build: . - ports: - - "5000:8080" - links: - - "db:redis" - db: - image: "redis" - hostname: redis - ports: - - "6379:6379" \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59536 zcma&NbC71ylI~qywr$(CZQJHswz}-9F59+k+g;UV+cs{`J?GrGXYR~=-ydruB3JCa zB64N^cILAcWk5iofq)<(fq;O7{th4@;QxID0)qN`mJ?GIqLY#rX8-|G{5M0pdVW5^ zzXk$-2kQTAC?_N@B`&6-N-rmVFE=$QD?>*=4<|!MJu@}isLc4AW#{m2if&A5T5g&~ ziuMQeS*U5sL6J698wOd)K@oK@1{peP5&Esut<#VH^u)gp`9H4)`uE!2$>RTctN+^u z=ASkePDZA-X8)rp%D;p*~P?*a_=*Kwc<^>QSH|^<0>o37lt^+Mj1;4YvJ(JR-Y+?%Nu}JAYj5 z_Qc5%Ao#F?q32i?ZaN2OSNhWL;2oDEw_({7ZbgUjna!Fqn3NzLM@-EWFPZVmc>(fZ z0&bF-Ch#p9C{YJT9Rcr3+Y_uR^At1^BxZ#eo>$PLJF3=;t_$2|t+_6gg5(j{TmjYU zK12c&lE?Eh+2u2&6Gf*IdKS&6?rYbSEKBN!rv{YCm|Rt=UlPcW9j`0o6{66#y5t9C zruFA2iKd=H%jHf%ypOkxLnO8#H}#Zt{8p!oi6)7#NqoF({t6|J^?1e*oxqng9Q2Cc zg%5Vu!em)}Yuj?kaP!D?b?(C*w!1;>R=j90+RTkyEXz+9CufZ$C^umX^+4|JYaO<5 zmIM3#dv`DGM;@F6;(t!WngZSYzHx?9&$xEF70D1BvfVj<%+b#)vz)2iLCrTeYzUcL z(OBnNoG6Le%M+@2oo)&jdOg=iCszzv59e zDRCeaX8l1hC=8LbBt|k5?CXgep=3r9BXx1uR8!p%Z|0+4Xro=xi0G!e{c4U~1j6!) zH6adq0}#l{%*1U(Cb%4AJ}VLWKBPi0MoKFaQH6x?^hQ!6em@993xdtS%_dmevzeNl z(o?YlOI=jl(`L9^ z0O+H9k$_@`6L13eTT8ci-V0ljDMD|0ifUw|Q-Hep$xYj0hTO@0%IS^TD4b4n6EKDG z??uM;MEx`s98KYN(K0>c!C3HZdZ{+_53DO%9k5W%pr6yJusQAv_;IA}925Y%;+!tY z%2k!YQmLLOr{rF~!s<3-WEUs)`ix_mSU|cNRBIWxOox_Yb7Z=~Q45ZNe*u|m^|)d* zog=i>`=bTe!|;8F+#H>EjIMcgWcG2ORD`w0WD;YZAy5#s{65~qfI6o$+Ty&-hyMyJ z3Ra~t>R!p=5ZpxA;QkDAoPi4sYOP6>LT+}{xp}tk+<0k^CKCFdNYG(Es>p0gqD)jP zWOeX5G;9(m@?GOG7g;e74i_|SmE?`B2i;sLYwRWKLy0RLW!Hx`=!LH3&k=FuCsM=9M4|GqzA)anEHfxkB z?2iK-u(DC_T1};KaUT@3nP~LEcENT^UgPvp!QC@Dw&PVAhaEYrPey{nkcn(ro|r7XUz z%#(=$7D8uP_uU-oPHhd>>^adbCSQetgSG`e$U|7mr!`|bU0aHl_cmL)na-5x1#OsVE#m*+k84Y^+UMeSAa zbrVZHU=mFwXEaGHtXQq`2ZtjfS!B2H{5A<3(nb-6ARVV8kEmOkx6D2x7~-6hl;*-*}2Xz;J#a8Wn;_B5=m zl3dY;%krf?i-Ok^Pal-}4F`{F@TYPTwTEhxpZK5WCpfD^UmM_iYPe}wpE!Djai6_{ z*pGO=WB47#Xjb7!n2Ma)s^yeR*1rTxp`Mt4sfA+`HwZf%!7ZqGosPkw69`Ix5Ku6G z@Pa;pjzV&dn{M=QDx89t?p?d9gna*}jBly*#1!6}5K<*xDPJ{wv4& zM$17DFd~L*Te3A%yD;Dp9UGWTjRxAvMu!j^Tbc}2v~q^59d4bz zvu#!IJCy(BcWTc`;v$9tH;J%oiSJ_i7s;2`JXZF+qd4C)vY!hyCtl)sJIC{ebI*0> z@x>;EzyBv>AI-~{D6l6{ST=em*U( z(r$nuXY-#CCi^8Z2#v#UXOt`dbYN1z5jzNF2 z411?w)whZrfA20;nl&C1Gi+gk<`JSm+{|*2o<< zqM#@z_D`Cn|0H^9$|Tah)0M_X4c37|KQ*PmoT@%xHc3L1ZY6(p(sNXHa&49Frzto& zR`c~ClHpE~4Z=uKa5S(-?M8EJ$zt0&fJk~p$M#fGN1-y$7!37hld`Uw>Urri(DxLa;=#rK0g4J)pXMC zxzraOVw1+kNWpi#P=6(qxf`zSdUC?D$i`8ZI@F>k6k zz21?d+dw7b&i*>Kv5L(LH-?J%@WnqT7j#qZ9B>|Zl+=> z^U-pV@1y_ptHo4hl^cPRWewbLQ#g6XYQ@EkiP z;(=SU!yhjHp%1&MsU`FV1Z_#K1&(|5n(7IHbx&gG28HNT)*~-BQi372@|->2Aw5It z0CBpUcMA*QvsPy)#lr!lIdCi@1k4V2m!NH)%Px(vu-r(Q)HYc!p zJ^$|)j^E#q#QOgcb^pd74^JUi7fUmMiNP_o*lvx*q%_odv49Dsv$NV;6J z9GOXKomA{2Pb{w}&+yHtH?IkJJu~}Z?{Uk++2mB8zyvh*xhHKE``99>y#TdD z&(MH^^JHf;g(Tbb^&8P*;_i*2&fS$7${3WJtV7K&&(MBV2~)2KB3%cWg#1!VE~k#C z!;A;?p$s{ihyojEZz+$I1)L}&G~ml=udD9qh>Tu(ylv)?YcJT3ihapi!zgPtWb*CP zlLLJSRCj-^w?@;RU9aL2zDZY1`I3d<&OMuW=c3$o0#STpv_p3b9Wtbql>w^bBi~u4 z3D8KyF?YE?=HcKk!xcp@Cigvzy=lnFgc^9c%(^F22BWYNAYRSho@~*~S)4%AhEttv zvq>7X!!EWKG?mOd9&n>vvH1p4VzE?HCuxT-u+F&mnsfDI^}*-d00-KAauEaXqg3k@ zy#)MGX!X;&3&0s}F3q40ZmVM$(H3CLfpdL?hB6nVqMxX)q=1b}o_PG%r~hZ4gUfSp zOH4qlEOW4OMUc)_m)fMR_rl^pCfXc{$fQbI*E&mV77}kRF z&{<06AJyJ!e863o-V>FA1a9Eemx6>^F$~9ppt()ZbPGfg_NdRXBWoZnDy2;#ODgf! zgl?iOcF7Meo|{AF>KDwTgYrJLb$L2%%BEtO>T$C?|9bAB&}s;gI?lY#^tttY&hfr# zKhC+&b-rpg_?~uVK%S@mQleU#_xCsvIPK*<`E0fHE1&!J7!xD#IB|SSPW6-PyuqGn3^M^Rz%WT{e?OI^svARX&SAdU77V(C~ zM$H{Kg59op{<|8ry9ecfP%=kFm(-!W&?U0@<%z*+!*<e0XesMxRFu9QnGqun6R_%T+B%&9Dtk?*d$Q zb~>84jEAPi@&F@3wAa^Lzc(AJz5gsfZ7J53;@D<;Klpl?sK&u@gie`~vTsbOE~Cd4 z%kr56mI|#b(Jk&;p6plVwmNB0H@0SmgdmjIn5Ne@)}7Vty(yb2t3ev@22AE^s!KaN zyQ>j+F3w=wnx7w@FVCRe+`vUH)3gW%_72fxzqX!S&!dchdkRiHbXW1FMrIIBwjsai8`CB2r4mAbwp%rrO>3B$Zw;9=%fXI9B{d(UzVap7u z6piC-FQ)>}VOEuPpuqznpY`hN4dGa_1Xz9rVg(;H$5Te^F0dDv*gz9JS<|>>U0J^# z6)(4ICh+N_Q`Ft0hF|3fSHs*?a=XC;e`sJaU9&d>X4l?1W=|fr!5ShD|nv$GK;j46@BV6+{oRbWfqOBRb!ir88XD*SbC(LF}I1h#6@dvK%Toe%@ zhDyG$93H8Eu&gCYddP58iF3oQH*zLbNI;rN@E{T9%A8!=v#JLxKyUe}e}BJpB{~uN zqgxRgo0*-@-iaHPV8bTOH(rS(huwK1Xg0u+e!`(Irzu@Bld&s5&bWgVc@m7;JgELd zimVs`>vQ}B_1(2#rv#N9O`fJpVfPc7V2nv34PC);Dzbb;p!6pqHzvy?2pD&1NE)?A zt(t-ucqy@wn9`^MN5apa7K|L=9>ISC>xoc#>{@e}m#YAAa1*8-RUMKwbm|;5p>T`Z zNf*ph@tnF{gmDa3uwwN(g=`Rh)4!&)^oOy@VJaK4lMT&5#YbXkl`q?<*XtsqD z9PRK6bqb)fJw0g-^a@nu`^?71k|m3RPRjt;pIkCo1{*pdqbVs-Yl>4E>3fZx3Sv44grW=*qdSoiZ9?X0wWyO4`yDHh2E!9I!ZFi zVL8|VtW38}BOJHW(Ax#KL_KQzarbuE{(%TA)AY)@tY4%A%P%SqIU~8~-Lp3qY;U-} z`h_Gel7;K1h}7$_5ZZT0&%$Lxxr-<89V&&TCsu}LL#!xpQ1O31jaa{U34~^le*Y%L za?7$>Jk^k^pS^_M&cDs}NgXlR>16AHkSK-4TRaJSh#h&p!-!vQY%f+bmn6x`4fwTp z$727L^y`~!exvmE^W&#@uY!NxJi`g!i#(++!)?iJ(1)2Wk;RN zFK&O4eTkP$Xn~4bB|q8y(btx$R#D`O@epi4ofcETrx!IM(kWNEe42Qh(8*KqfP(c0 zouBl6>Fc_zM+V;F3znbo{x#%!?mH3`_ANJ?y7ppxS@glg#S9^MXu|FM&ynpz3o&Qh z2ujAHLF3($pH}0jXQsa#?t--TnF1P73b?4`KeJ9^qK-USHE)4!IYgMn-7z|=ALF5SNGkrtPG@Y~niUQV2?g$vzJN3nZ{7;HZHzWAeQ;5P|@Tl3YHpyznGG4-f4=XflwSJY+58-+wf?~Fg@1p1wkzuu-RF3j2JX37SQUc? zQ4v%`V8z9ZVZVqS8h|@@RpD?n0W<=hk=3Cf8R?d^9YK&e9ZybFY%jdnA)PeHvtBe- zhMLD+SSteHBq*q)d6x{)s1UrsO!byyLS$58WK;sqip$Mk{l)Y(_6hEIBsIjCr5t>( z7CdKUrJTrW%qZ#1z^n*Lb8#VdfzPw~OIL76aC+Rhr<~;4Tl!sw?Rj6hXj4XWa#6Tp z@)kJ~qOV)^Rh*-?aG>ic2*NlC2M7&LUzc9RT6WM%Cpe78`iAowe!>(T0jo&ivn8-7 zs{Qa@cGy$rE-3AY0V(l8wjI^uB8Lchj@?L}fYal^>T9z;8juH@?rG&g-t+R2dVDBe zq!K%{e-rT5jX19`(bP23LUN4+_zh2KD~EAYzhpEO3MUG8@}uBHH@4J zd`>_(K4q&>*k82(dDuC)X6JuPrBBubOg7qZ{?x!r@{%0);*`h*^F|%o?&1wX?Wr4b z1~&cy#PUuES{C#xJ84!z<1tp9sfrR(i%Tu^jnXy;4`Xk;AQCdFC@?V%|; zySdC7qS|uQRcH}EFZH%mMB~7gi}a0utE}ZE_}8PQH8f;H%PN41Cb9R%w5Oi5el^fd z$n{3SqLCnrF##x?4sa^r!O$7NX!}&}V;0ZGQ&K&i%6$3C_dR%I7%gdQ;KT6YZiQrW zk%q<74oVBV>@}CvJ4Wj!d^?#Zwq(b$E1ze4$99DuNg?6t9H}k_|D7KWD7i0-g*EO7 z;5{hSIYE4DMOK3H%|f5Edx+S0VI0Yw!tsaRS2&Il2)ea^8R5TG72BrJue|f_{2UHa z@w;^c|K3da#$TB0P3;MPlF7RuQeXT$ zS<<|C0OF(k)>fr&wOB=gP8!Qm>F41u;3esv7_0l%QHt(~+n; zf!G6%hp;Gfa9L9=AceiZs~tK+Tf*Wof=4!u{nIO90jH@iS0l+#%8=~%ASzFv7zqSB^?!@N7)kp0t&tCGLmzXSRMRyxCmCYUD2!B`? zhs$4%KO~m=VFk3Buv9osha{v+mAEq=ik3RdK@;WWTV_g&-$U4IM{1IhGX{pAu%Z&H zFfwCpUsX%RKg);B@7OUzZ{Hn{q6Vv!3#8fAg!P$IEx<0vAx;GU%}0{VIsmFBPq_mb zpe^BChDK>sc-WLKl<6 zwbW|e&d&dv9Wu0goueyu>(JyPx1mz0v4E?cJjFuKF71Q1)AL8jHO$!fYT3(;U3Re* zPPOe%*O+@JYt1bW`!W_1!mN&=w3G9ru1XsmwfS~BJ))PhD(+_J_^N6j)sx5VwbWK| zwRyC?W<`pOCY)b#AS?rluxuuGf-AJ=D!M36l{ua?@SJ5>e!IBr3CXIxWw5xUZ@Xrw z_R@%?{>d%Ld4p}nEsiA@v*nc6Ah!MUs?GA7e5Q5lPpp0@`%5xY$C;{%rz24$;vR#* zBP=a{)K#CwIY%p} zXVdxTQ^HS@O&~eIftU+Qt^~(DGxrdi3k}DdT^I7Iy5SMOp$QuD8s;+93YQ!OY{eB24%xY7ml@|M7I(Nb@K_-?F;2?et|CKkuZK_>+>Lvg!>JE~wN`BI|_h6$qi!P)+K-1Hh(1;a`os z55)4Q{oJiA(lQM#;w#Ta%T0jDNXIPM_bgESMCDEg6rM33anEr}=|Fn6)|jBP6Y}u{ zv9@%7*#RI9;fv;Yii5CI+KrRdr0DKh=L>)eO4q$1zmcSmglsV`*N(x=&Wx`*v!!hn6X-l0 zP_m;X??O(skcj+oS$cIdKhfT%ABAzz3w^la-Ucw?yBPEC+=Pe_vU8nd-HV5YX6X8r zZih&j^eLU=%*;VzhUyoLF;#8QsEfmByk+Y~caBqSvQaaWf2a{JKB9B>V&r?l^rXaC z8)6AdR@Qy_BxQrE2Fk?ewD!SwLuMj@&d_n5RZFf7=>O>hzVE*seW3U?_p|R^CfoY`?|#x9)-*yjv#lo&zP=uI`M?J zbzC<^3x7GfXA4{FZ72{PE*-mNHyy59Q;kYG@BB~NhTd6pm2Oj=_ zizmD?MKVRkT^KmXuhsk?eRQllPo2Ubk=uCKiZ&u3Xjj~<(!M94c)Tez@9M1Gfs5JV z->@II)CDJOXTtPrQudNjE}Eltbjq>6KiwAwqvAKd^|g!exgLG3;wP+#mZYr`cy3#39e653d=jrR-ulW|h#ddHu(m9mFoW~2yE zz5?dB%6vF}+`-&-W8vy^OCxm3_{02royjvmwjlp+eQDzFVEUiyO#gLv%QdDSI#3W* z?3!lL8clTaNo-DVJw@ynq?q!%6hTQi35&^>P85G$TqNt78%9_sSJt2RThO|JzM$iL zg|wjxdMC2|Icc5rX*qPL(coL!u>-xxz-rFiC!6hD1IR%|HSRsV3>Kq~&vJ=s3M5y8SG%YBQ|{^l#LGlg!D?E>2yR*eV%9m$_J6VGQ~AIh&P$_aFbh zULr0Z$QE!QpkP=aAeR4ny<#3Fwyw@rZf4?Ewq`;mCVv}xaz+3ni+}a=k~P+yaWt^L z@w67!DqVf7D%7XtXX5xBW;Co|HvQ8WR1k?r2cZD%U;2$bsM%u8{JUJ5Z0k= zZJARv^vFkmWx15CB=rb=D4${+#DVqy5$C%bf`!T0+epLJLnh1jwCdb*zuCL}eEFvE z{rO1%gxg>1!W(I!owu*mJZ0@6FM(?C+d*CeceZRW_4id*D9p5nzMY&{mWqrJomjIZ z97ZNnZ3_%Hx8dn;H>p8m7F#^2;T%yZ3H;a&N7tm=Lvs&lgJLW{V1@h&6Vy~!+Ffbb zv(n3+v)_D$}dqd!2>Y2B)#<+o}LH#%ogGi2-?xRIH)1!SD)u-L65B&bsJTC=LiaF+YOCif2dUX6uAA|#+vNR z>U+KQekVGon)Yi<93(d!(yw1h3&X0N(PxN2{%vn}cnV?rYw z$N^}_o!XUB!mckL`yO1rnUaI4wrOeQ(+&k?2mi47hzxSD`N#-byqd1IhEoh!PGq>t z_MRy{5B0eKY>;Ao3z$RUU7U+i?iX^&r739F)itdrTpAi-NN0=?^m%?{A9Ly2pVv>Lqs6moTP?T2-AHqFD-o_ znVr|7OAS#AEH}h8SRPQ@NGG47dO}l=t07__+iK8nHw^(AHx&Wb<%jPc$$jl6_p(b$ z)!pi(0fQodCHfM)KMEMUR&UID>}m^(!{C^U7sBDOA)$VThRCI0_+2=( zV8mMq0R(#z;C|7$m>$>`tX+T|xGt(+Y48@ZYu#z;0pCgYgmMVbFb!$?%yhZqP_nhn zy4<#3P1oQ#2b51NU1mGnHP$cf0j-YOgAA}A$QoL6JVLcmExs(kU{4z;PBHJD%_=0F z>+sQV`mzijSIT7xn%PiDKHOujX;n|M&qr1T@rOxTdxtZ!&u&3HHFLYD5$RLQ=heur zb>+AFokUVQeJy-#LP*^)spt{mb@Mqe=A~-4p0b+Bt|pZ+@CY+%x}9f}izU5;4&QFE zO1bhg&A4uC1)Zb67kuowWY4xbo&J=%yoXlFB)&$d*-}kjBu|w!^zbD1YPc0-#XTJr z)pm2RDy%J3jlqSMq|o%xGS$bPwn4AqitC6&e?pqWcjWPt{3I{>CBy;hg0Umh#c;hU3RhCUX=8aR>rmd` z7Orw(5tcM{|-^J?ZAA9KP|)X6n9$-kvr#j5YDecTM6n z&07(nD^qb8hpF0B^z^pQ*%5ePYkv&FabrlI61ntiVp!!C8y^}|<2xgAd#FY=8b*y( zuQOuvy2`Ii^`VBNJB&R!0{hABYX55ooCAJSSevl4RPqEGb)iy_0H}v@vFwFzD%>#I>)3PsouQ+_Kkbqy*kKdHdfkN7NBcq%V{x^fSxgXpg7$bF& zj!6AQbDY(1u#1_A#1UO9AxiZaCVN2F0wGXdY*g@x$ByvUA?ePdide0dmr#}udE%K| z3*k}Vv2Ew2u1FXBaVA6aerI36R&rzEZeDDCl5!t0J=ug6kuNZzH>3i_VN`%BsaVB3 zQYw|Xub_SGf{)F{$ZX5`Jc!X!;eybjP+o$I{Z^Hsj@D=E{MnnL+TbC@HEU2DjG{3-LDGIbq()U87x4eS;JXnSh;lRlJ z>EL3D>wHt-+wTjQF$fGyDO$>d+(fq@bPpLBS~xA~R=3JPbS{tzN(u~m#Po!?H;IYv zE;?8%^vle|%#oux(Lj!YzBKv+Fd}*Ur-dCBoX*t{KeNM*n~ZPYJ4NNKkI^MFbz9!v z4(Bvm*Kc!-$%VFEewYJKz-CQN{`2}KX4*CeJEs+Q(!kI%hN1!1P6iOq?ovz}X0IOi z)YfWpwW@pK08^69#wSyCZkX9?uZD?C^@rw^Y?gLS_xmFKkooyx$*^5#cPqntNTtSG zlP>XLMj2!VF^0k#ole7`-c~*~+_T5ls?x4)ah(j8vo_ zwb%S8qoaZqY0-$ZI+ViIA_1~~rAH7K_+yFS{0rT@eQtTAdz#8E5VpwnW!zJ_^{Utv zlW5Iar3V5t&H4D6A=>?mq;G92;1cg9a2sf;gY9pJDVKn$DYdQlvfXq}zz8#LyPGq@ z+`YUMD;^-6w&r-82JL7mA8&M~Pj@aK!m{0+^v<|t%APYf7`}jGEhdYLqsHW-Le9TL z_hZZ1gbrz7$f9^fAzVIP30^KIz!!#+DRLL+qMszvI_BpOSmjtl$hh;&UeM{ER@INV zcI}VbiVTPoN|iSna@=7XkP&-4#06C};8ajbxJ4Gcq8(vWv4*&X8bM^T$mBk75Q92j z1v&%a;OSKc8EIrodmIiw$lOES2hzGDcjjB`kEDfJe{r}yE6`eZL zEB`9u>Cl0IsQ+t}`-cx}{6jqcANucqIB>Qmga_&<+80E2Q|VHHQ$YlAt{6`Qu`HA3 z03s0-sSlwbvgi&_R8s={6<~M^pGvBNjKOa>tWenzS8s zR>L7R5aZ=mSU{f?ib4Grx$AeFvtO5N|D>9#)ChH#Fny2maHWHOf2G=#<9Myot#+4u zWVa6d^Vseq_0=#AYS(-m$Lp;*8nC_6jXIjEM`omUmtH@QDs3|G)i4j*#_?#UYVZvJ z?YjT-?!4Q{BNun;dKBWLEw2C-VeAz`%?A>p;)PL}TAZn5j~HK>v1W&anteARlE+~+ zj>c(F;?qO3pXBb|#OZdQnm<4xWmn~;DR5SDMxt0UK_F^&eD|KZ=O;tO3vy4@4h^;2 zUL~-z`-P1aOe?|ZC1BgVsL)2^J-&vIFI%q@40w0{jjEfeVl)i9(~bt2z#2Vm)p`V_ z1;6$Ae7=YXk#=Qkd24Y23t&GvRxaOoad~NbJ+6pxqzJ>FY#Td7@`N5xp!n(c!=RE& z&<<@^a$_Ys8jqz4|5Nk#FY$~|FPC0`*a5HH!|Gssa9=~66&xG9)|=pOOJ2KE5|YrR zw!w6K2aC=J$t?L-;}5hn6mHd%hC;p8P|Dgh6D>hGnXPgi;6r+eA=?f72y9(Cf_ho{ zH6#)uD&R=73^$$NE;5piWX2bzR67fQ)`b=85o0eOLGI4c-Tb@-KNi2pz=Ke@SDcPn za$AxXib84`!Sf;Z3B@TSo`Dz7GM5Kf(@PR>Ghzi=BBxK8wRp>YQoXm+iL>H*Jo9M3 z6w&E?BC8AFTFT&Tv8zf+m9<&S&%dIaZ)Aoqkak_$r-2{$d~0g2oLETx9Y`eOAf14QXEQw3tJne;fdzl@wV#TFXSLXM2428F-Q}t+n2g%vPRMUzYPvzQ9f# zu(liiJem9P*?0%V@RwA7F53r~|I!Ty)<*AsMX3J{_4&}{6pT%Tpw>)^|DJ)>gpS~1rNEh z0$D?uO8mG?H;2BwM5a*26^7YO$XjUm40XmBsb63MoR;bJh63J;OngS5sSI+o2HA;W zdZV#8pDpC9Oez&L8loZO)MClRz!_!WD&QRtQxnazhT%Vj6Wl4G11nUk8*vSeVab@N#oJ}`KyJv+8Mo@T1-pqZ1t|?cnaVOd;1(h9 z!$DrN=jcGsVYE-0-n?oCJ^4x)F}E;UaD-LZUIzcD?W^ficqJWM%QLy6QikrM1aKZC zi{?;oKwq^Vsr|&`i{jIphA8S6G4)$KGvpULjH%9u(Dq247;R#l&I0{IhcC|oBF*Al zvLo7Xte=C{aIt*otJD}BUq)|_pdR>{zBMT< z(^1RpZv*l*m*OV^8>9&asGBo8h*_4q*)-eCv*|Pq=XNGrZE)^(SF7^{QE_~4VDB(o zVcPA_!G+2CAtLbl+`=Q~9iW`4ZRLku!uB?;tWqVjB0lEOf}2RD7dJ=BExy=<9wkb- z9&7{XFA%n#JsHYN8t5d~=T~5DcW4$B%3M+nNvC2`0!#@sckqlzo5;hhGi(D9=*A4` z5ynobawSPRtWn&CDLEs3Xf`(8^zDP=NdF~F^s&={l7(aw&EG}KWpMjtmz7j_VLO;@ zM2NVLDxZ@GIv7*gzl1 zjq78tv*8#WSY`}Su0&C;2F$Ze(q>F(@Wm^Gw!)(j;dk9Ad{STaxn)IV9FZhm*n+U} zi;4y*3v%A`_c7a__DJ8D1b@dl0Std3F||4Wtvi)fCcBRh!X9$1x!_VzUh>*S5s!oq z;qd{J_r79EL2wIeiGAqFstWtkfIJpjVh%zFo*=55B9Zq~y0=^iqHWfQl@O!Ak;(o*m!pZqe9 z%U2oDOhR)BvW8&F70L;2TpkzIutIvNQaTjjs5V#8mV4!NQ}zN=i`i@WI1z0eN-iCS z;vL-Wxc^Vc_qK<5RPh(}*8dLT{~GzE{w2o$2kMFaEl&q zP{V=>&3kW7tWaK-Exy{~`v4J0U#OZBk{a9{&)&QG18L@6=bsZ1zC_d{{pKZ-Ey>I> z;8H0t4bwyQqgu4hmO`3|4K{R*5>qnQ&gOfdy?z`XD%e5+pTDzUt3`k^u~SaL&XMe= z9*h#kT(*Q9jO#w2Hd|Mr-%DV8i_1{J1MU~XJ3!WUplhXDYBpJH><0OU`**nIvPIof z|N8@I=wA)sf45SAvx||f?Z5uB$kz1qL3Ky_{%RPdP5iN-D2!p5scq}buuC00C@jom zhfGKm3|f?Z0iQ|K$Z~!`8{nmAS1r+fp6r#YDOS8V*;K&Gs7Lc&f^$RC66O|)28oh`NHy&vq zJh+hAw8+ybTB0@VhWN^0iiTnLsCWbS_y`^gs!LX!Lw{yE``!UVzrV24tP8o;I6-65 z1MUiHw^{bB15tmrVT*7-#sj6cs~z`wk52YQJ*TG{SE;KTm#Hf#a~|<(|ImHH17nNM z`Ub{+J3dMD!)mzC8b(2tZtokKW5pAwHa?NFiso~# z1*iaNh4lQ4TS)|@G)H4dZV@l*Vd;Rw;-;odDhW2&lJ%m@jz+Panv7LQm~2Js6rOW3 z0_&2cW^b^MYW3)@o;neZ<{B4c#m48dAl$GCc=$>ErDe|?y@z`$uq3xd(%aAsX)D%l z>y*SQ%My`yDP*zof|3@_w#cjaW_YW4BdA;#Glg1RQcJGY*CJ9`H{@|D+*e~*457kd z73p<%fB^PV!Ybw@)Dr%(ZJbX}xmCStCYv#K3O32ej{$9IzM^I{6FJ8!(=azt7RWf4 z7ib0UOPqN40X!wOnFOoddd8`!_IN~9O)#HRTyjfc#&MCZ zZAMzOVB=;qwt8gV?{Y2?b=iSZG~RF~uyx18K)IDFLl})G1v@$(s{O4@RJ%OTJyF+Cpcx4jmy|F3euCnMK!P2WTDu5j z{{gD$=M*pH!GGzL%P)V2*ROm>!$Y=z|D`!_yY6e7SU$~a5q8?hZGgaYqaiLnkK%?0 zs#oI%;zOxF@g*@(V4p!$7dS1rOr6GVs6uYCTt2h)eB4?(&w8{#o)s#%gN@BBosRUe z)@P@8_Zm89pr~)b>e{tbPC~&_MR--iB{=)y;INU5#)@Gix-YpgP<-c2Ms{9zuCX|3 z!p(?VaXww&(w&uBHzoT%!A2=3HAP>SDxcljrego7rY|%hxy3XlODWffO_%g|l+7Y_ zqV(xbu)s4lV=l7M;f>vJl{`6qBm>#ZeMA}kXb97Z)?R97EkoI?x6Lp0yu1Z>PS?2{ z0QQ(8D)|lc9CO3B~e(pQM&5(1y&y=e>C^X$`)_&XuaI!IgDTVqt31wX#n+@!a_A0ZQkA zCJ2@M_4Gb5MfCrm5UPggeyh)8 zO9?`B0J#rkoCx(R0I!ko_2?iO@|oRf1;3r+i)w-2&j?=;NVIdPFsB)`|IC0zk6r9c zRrkfxWsiJ(#8QndNJj@{@WP2Ackr|r1VxV{7S&rSU(^)-M8gV>@UzOLXu9K<{6e{T zXJ6b92r$!|lwjhmgqkdswY&}c)KW4A)-ac%sU;2^fvq7gfUW4Bw$b!i@duy1CAxSn z(pyh$^Z=&O-q<{bZUP+$U}=*#M9uVc>CQVgDs4swy5&8RAHZ~$)hrTF4W zPsSa~qYv_0mJnF89RnnJTH`3}w4?~epFl=D(35$ zWa07ON$`OMBOHgCmfO(9RFc<)?$x)N}Jd2A(<*Ll7+4jrRt9w zwGxExUXd9VB#I|DwfxvJ;HZ8Q{37^wDhaZ%O!oO(HpcqfLH%#a#!~;Jl7F5>EX_=8 z{()l2NqPz>La3qJR;_v+wlK>GsHl;uRA8%j`A|yH@k5r%55S9{*Cp%uw6t`qc1!*T za2OeqtQj7sAp#Q~=5Fs&aCR9v>5V+s&RdNvo&H~6FJOjvaj--2sYYBvMq;55%z8^o z|BJDA4vzfow#DO#ZQHh;Oq_{r+qP{R9ox2TOgwQiv7Ow!zjN+A@BN;0tA2lUb#+zO z(^b89eV)D7UVE+h{mcNc6&GtpOqDn_?VAQ)Vob$hlFwW%xh>D#wml{t&Ofmm_d_+; zKDxzdr}`n2Rw`DtyIjrG)eD0vut$}dJAZ0AohZ+ZQdWXn_Z@dI_y=7t3q8x#pDI-K z2VVc&EGq445Rq-j0=U=Zx`oBaBjsefY;%)Co>J3v4l8V(T8H?49_@;K6q#r~Wwppc z4XW0(4k}cP=5ex>-Xt3oATZ~bBWKv)aw|I|Lx=9C1s~&b77idz({&q3T(Y(KbWO?+ zmcZ6?WeUsGk6>km*~234YC+2e6Zxdl~<_g2J|IE`GH%n<%PRv-50; zH{tnVts*S5*_RxFT9eM0z-pksIb^drUq4>QSww=u;UFCv2AhOuXE*V4z?MM`|ABOC4P;OfhS(M{1|c%QZ=!%rQTDFx`+}?Kdx$&FU?Y<$x;j7z=(;Lyz+?EE>ov!8vvMtSzG!nMie zsBa9t8as#2nH}n8xzN%W%U$#MHNXmDUVr@GX{?(=yI=4vks|V)!-W5jHsU|h_&+kY zS_8^kd3jlYqOoiI`ZqBVY!(UfnAGny!FowZWY_@YR0z!nG7m{{)4OS$q&YDyw6vC$ zm4!$h>*|!2LbMbxS+VM6&DIrL*X4DeMO!@#EzMVfr)e4Tagn~AQHIU8?e61TuhcKD zr!F4(kEebk(Wdk-?4oXM(rJwanS>Jc%<>R(siF+>+5*CqJLecP_we33iTFTXr6W^G z7M?LPC-qFHK;E!fxCP)`8rkxZyFk{EV;G-|kwf4b$c1k0atD?85+|4V%YATWMG|?K zLyLrws36p%Qz6{}>7b>)$pe>mR+=IWuGrX{3ZPZXF3plvuv5Huax86}KX*lbPVr}L z{C#lDjdDeHr~?l|)Vp_}T|%$qF&q#U;ClHEPVuS+Jg~NjC1RP=17=aQKGOcJ6B3mp z8?4*-fAD~}sX*=E6!}^u8)+m2j<&FSW%pYr_d|p_{28DZ#Cz0@NF=gC-o$MY?8Ca8 zr5Y8DSR^*urS~rhpX^05r30Ik#2>*dIOGxRm0#0YX@YQ%Mg5b6dXlS!4{7O_kdaW8PFSdj1=ryI-=5$fiieGK{LZ+SX(1b=MNL!q#lN zv98?fqqTUH8r8C7v(cx#BQ5P9W>- zmW93;eH6T`vuJ~rqtIBg%A6>q>gnWb3X!r0wh_q;211+Om&?nvYzL1hhtjB zK_7G3!n7PL>d!kj){HQE zE8(%J%dWLh1_k%gVXTZt zEdT09XSKAx27Ncaq|(vzL3gm83q>6CAw<$fTnMU05*xAe&rDfCiu`u^1)CD<>sx0i z*hr^N_TeN89G(nunZoLBf^81#pmM}>JgD@Nn1l*lN#a=B=9pN%tmvYFjFIoKe_(GF z-26x{(KXdfsQL7Uv6UtDuYwV`;8V3w>oT_I<`Ccz3QqK9tYT5ZQzbop{=I=!pMOCb zCU68`n?^DT%^&m>A%+-~#lvF!7`L7a{z<3JqIlk1$<||_J}vW1U9Y&eX<}l8##6i( zZcTT@2`9(Mecptm@{3A_Y(X`w9K0EwtPq~O!16bq{7c0f7#(3wn-^)h zxV&M~iiF!{-6A@>o;$RzQ5A50kxXYj!tcgme=Qjrbje~;5X2xryU;vH|6bE(8z^<7 zQ>BG7_c*JG8~K7Oe68i#0~C$v?-t@~@r3t2inUnLT(c=URpA9kA8uq9PKU(Ps(LVH zqgcqW>Gm?6oV#AldDPKVRcEyQIdTT`Qa1j~vS{<;SwyTdr&3*t?J)y=M7q*CzucZ&B0M=joT zBbj@*SY;o2^_h*>R0e({!QHF0=)0hOj^B^d*m>SnRrwq>MolNSgl^~r8GR#mDWGYEIJA8B<|{{j?-7p zVnV$zancW3&JVDtVpIlI|5djKq0(w$KxEFzEiiL=h5Jw~4Le23@s(mYyXWL9SX6Ot zmb)sZaly_P%BeX_9 zw&{yBef8tFm+%=--m*J|o~+Xg3N+$IH)t)=fqD+|fEk4AAZ&!wcN5=mi~Vvo^i`}> z#_3ahR}Ju)(Px7kev#JGcSwPXJ2id9%Qd2A#Uc@t8~egZ8;iC{e! z%=CGJOD1}j!HW_sgbi_8suYnn4#Ou}%9u)dXd3huFIb!ytlX>Denx@pCS-Nj$`VO&j@(z!kKSP0hE4;YIP#w9ta=3DO$7f*x zc9M4&NK%IrVmZAe=r@skWD`AEWH=g+r|*13Ss$+{c_R!b?>?UaGXlw*8qDmY#xlR= z<0XFbs2t?8i^G~m?b|!Hal^ZjRjt<@a? z%({Gn14b4-a|#uY^=@iiKH+k?~~wTj5K1A&hU z2^9-HTC)7zpoWK|$JXaBL6C z#qSNYtY>65T@Zs&-0cHeu|RX(Pxz6vTITdzJdYippF zC-EB+n4}#lM7`2Ry~SO>FxhKboIAF#Z{1wqxaCb{#yEFhLuX;Rx(Lz%T`Xo1+a2M}7D+@wol2)OJs$TwtRNJ={( zD@#zTUEE}#Fz#&(EoD|SV#bayvr&E0vzmb%H?o~46|FAcx?r4$N z&67W3mdip-T1RIxwSm_&(%U|+WvtGBj*}t69XVd&ebn>KOuL(7Y8cV?THd-(+9>G7*Nt%T zcH;`p={`SOjaf7hNd(=37Lz3-51;58JffzIPgGs_7xIOsB5p2t&@v1mKS$2D$*GQ6 zM(IR*j4{nri7NMK9xlDy-hJW6sW|ZiDRaFiayj%;(%51DN!ZCCCXz+0Vm#};70nOx zJ#yA0P3p^1DED;jGdPbQWo0WATN=&2(QybbVdhd=Vq*liDk`c7iZ?*AKEYC#SY&2g z&Q(Ci)MJ{mEat$ZdSwTjf6h~roanYh2?9j$CF@4hjj_f35kTKuGHvIs9}Re@iKMxS-OI*`0S z6s)fOtz}O$T?PLFVSeOjSO26$@u`e<>k(OSP!&YstH3ANh>)mzmKGNOwOawq-MPXe zy4xbeUAl6tamnx))-`Gi2uV5>9n(73yS)Ukma4*7fI8PaEwa)dWHs6QA6>$}7?(L8 ztN8M}?{Tf!Zu22J5?2@95&rQ|F7=FK-hihT-vDp!5JCcWrVogEnp;CHenAZ)+E+K5 z$Cffk5sNwD_?4+ymgcHR(5xgt20Z8M`2*;MzOM#>yhk{r3x=EyM226wb&!+j`W<%* zSc&|`8!>dn9D@!pYow~(DsY_naSx7(Z4i>cu#hA5=;IuI88}7f%)bRkuY2B;+9Uep zpXcvFWkJ!mQai63BgNXG26$5kyhZ2&*3Q_tk)Ii4M>@p~_~q_cE!|^A;_MHB;7s#9 zKzMzK{lIxotjc};k67^Xsl-gS!^*m*m6kn|sbdun`O?dUkJ{0cmI0-_2y=lTAfn*Y zKg*A-2sJq)CCJgY0LF-VQvl&6HIXZyxo2#!O&6fOhbHXC?%1cMc6y^*dOS{f$=137Ds1m01qs`>iUQ49JijsaQ( zksqV9@&?il$|4Ua%4!O15>Zy&%gBY&wgqB>XA3!EldQ%1CRSM(pp#k~-pkcCg4LAT zXE=puHbgsw)!xtc@P4r~Z}nTF=D2~j(6D%gTBw$(`Fc=OOQ0kiW$_RDd=hcO0t97h zb86S5r=>(@VGy1&#S$Kg_H@7G^;8Ue)X5Y+IWUi`o;mpvoV)`fcVk4FpcT|;EG!;? zHG^zrVVZOm>1KFaHlaogcWj(v!S)O(Aa|Vo?S|P z5|6b{qkH(USa*Z7-y_Uvty_Z1|B{rTS^qmEMLEYUSk03_Fg&!O3BMo{b^*`3SHvl0 zhnLTe^_vVIdcSHe)SQE}r~2dq)VZJ!aSKR?RS<(9lzkYo&dQ?mubnWmgMM37Nudwo z3Vz@R{=m2gENUE3V4NbIzAA$H1z0pagz94-PTJyX{b$yndsdKptmlKQKaaHj@3=ED zc7L?p@%ui|RegVYutK$64q4pe9+5sv34QUpo)u{1ci?)_7gXQd{PL>b0l(LI#rJmN zGuO+%GO`xneFOOr4EU(Wg}_%bhzUf;d@TU+V*2#}!2OLwg~%D;1FAu=Un>OgjPb3S z7l(riiCwgghC=Lm5hWGf5NdGp#01xQ59`HJcLXbUR3&n%P(+W2q$h2Qd z*6+-QXJ*&Kvk9ht0f0*rO_|FMBALen{j7T1l%=Q>gf#kma zQlg#I9+HB+z*5BMxdesMND`_W;q5|FaEURFk|~&{@qY32N$G$2B=&Po{=!)x5b!#n zxLzblkq{yj05#O7(GRuT39(06FJlalyv<#K4m}+vs>9@q-&31@1(QBv82{}Zkns~K ze{eHC_RDX0#^A*JQTwF`a=IkE6Ze@j#-8Q`tTT?k9`^ZhA~3eCZJ-Jr{~7Cx;H4A3 zcZ+Zj{mzFZbVvQ6U~n>$U2ZotGsERZ@}VKrgGh0xM;Jzt29%TX6_&CWzg+YYMozrM z`nutuS)_0dCM8UVaKRj804J4i%z2BA_8A4OJRQ$N(P9Mfn-gF;4#q788C@9XR0O3< zsoS4wIoyt046d+LnSCJOy@B@Uz*#GGd#+Ln1ek5Dv>(ZtD@tgZlPnZZJGBLr^JK+!$$?A_fA3LOrkoDRH&l7 zcMcD$Hsjko3`-{bn)jPL6E9Ds{WskMrivsUu5apD z?grQO@W7i5+%X&E&p|RBaEZ(sGLR@~(y^BI@lDMot^Ll?!`90KT!JXUhYS`ZgX3jnu@Ja^seA*M5R@f`=`ynQV4rc$uT1mvE?@tz)TN<=&H1%Z?5yjxcpO+6y_R z6EPuPKM5uxKpmZfT(WKjRRNHs@ib)F5WAP7QCADvmCSD#hPz$V10wiD&{NXyEwx5S z6NE`3z!IS^$s7m}PCwQutVQ#~w+V z=+~->DI*bR2j0^@dMr9`p>q^Ny~NrAVxrJtX2DUveic5vM%#N*XO|?YAWwNI$Q)_) zvE|L(L1jP@F%gOGtnlXtIv2&1i8q<)Xfz8O3G^Ea~e*HJsQgBxWL(yuLY+jqUK zRE~`-zklrGog(X}$9@ZVUw!8*=l`6mzYLtsg`AvBYz(cxmAhr^j0~(rzXdiOEeu_p zE$sf2(w(BPAvO5DlaN&uQ$4@p-b?fRs}d7&2UQ4Fh?1Hzu*YVjcndqJLw0#q@fR4u zJCJ}>_7-|QbvOfylj+e^_L`5Ep9gqd>XI3-O?Wp z-gt*P29f$Tx(mtS`0d05nHH=gm~Po_^OxxUwV294BDKT>PHVlC5bndncxGR!n(OOm znsNt@Q&N{TLrmsoKFw0&_M9$&+C24`sIXGWgQaz=kY;S{?w`z^Q0JXXBKFLj0w0U6P*+jPKyZHX9F#b0D1$&(- zrm8PJd?+SrVf^JlfTM^qGDK&-p2Kdfg?f>^%>1n8bu&byH(huaocL>l@f%c*QkX2i znl}VZ4R1en4S&Bcqw?$=Zi7ohqB$Jw9x`aM#>pHc0x z0$!q7iFu zZ`tryM70qBI6JWWTF9EjgG@>6SRzsd}3h+4D8d~@CR07P$LJ}MFsYi-*O%XVvD@yT|rJ+Mk zDllJ7$n0V&A!0flbOf)HE6P_afPWZmbhpliqJuw=-h+r;WGk|ntkWN(8tKlYpq5Ow z(@%s>IN8nHRaYb*^d;M(D$zGCv5C|uqmsDjwy4g=Lz>*OhO3z=)VD}C<65;`89Ye} zSCxrv#ILzIpEx1KdLPlM&%Cctf@FqTKvNPXC&`*H9=l=D3r!GLM?UV zOxa(8ZsB`&+76S-_xuj?G#wXBfDY@Z_tMpXJS7^mp z@YX&u0jYw2A+Z+bD#6sgVK5ZgdPSJV3>{K^4~%HV?rn~4D)*2H!67Y>0aOmzup`{D zzDp3c9yEbGCY$U<8biJ_gB*`jluz1ShUd!QUIQJ$*1;MXCMApJ^m*Fiv88RZ zFopLViw}{$Tyhh_{MLGIE2~sZ)t0VvoW%=8qKZ>h=adTe3QM$&$PO2lfqH@brt!9j ziePM8$!CgE9iz6B<6_wyTQj?qYa;eC^{x_0wuwV~W+^fZmFco-o%wsKSnjXFEx02V zF5C2t)T6Gw$Kf^_c;Ei3G~uC8SM-xyycmXyC2hAVi-IfXqhu$$-C=*|X?R0~hu z8`J6TdgflslhrmDZq1f?GXF7*ALeMmOEpRDg(s*H`4>_NAr`2uqF;k;JQ+8>A|_6ZNsNLECC%NNEb1Y1dP zbIEmNpK)#XagtL4R6BC{C5T(+=yA-(Z|Ap}U-AfZM#gwVpus3(gPn}Q$CExObJ5AC z)ff9Yk?wZ}dZ-^)?cbb9Fw#EjqQ8jxF4G3=L?Ra zg_)0QDMV1y^A^>HRI$x?Op@t;oj&H@1xt4SZ9(kifQ zb59B*`M99Td7@aZ3UWvj1rD0sE)d=BsBuW*KwkCds7ay(7*01_+L}b~7)VHI>F_!{ zyxg-&nCO?v#KOUec0{OOKy+sjWA;8rTE|Lv6I9H?CI?H(mUm8VXGwU$49LGpz&{nQp2}dinE1@lZ1iox6{ghN&v^GZv9J${7WaXj)<0S4g_uiJ&JCZ zr8-hsu`U%N;+9N^@&Q0^kVPB3)wY(rr}p7{p0qFHb3NUUHJb672+wRZs`gd1UjKPX z4o6zljKKA+Kkj?H>Ew63o%QjyBk&1!P22;MkD>sM0=z_s-G{mTixJCT9@_|*(p^bz zJ8?ZZ&;pzV+7#6Mn`_U-)k8Pjg?a;|Oe^us^PoPY$Va~yi8|?+&=y$f+lABT<*pZr zP}D{~Pq1Qyni+@|aP;ixO~mbEW9#c0OU#YbDZIaw=_&$K%Ep2f%hO^&P67hApZe`x zv8b`Mz@?M_7-)b!lkQKk)JXXUuT|B8kJlvqRmRpxtQDgvrHMXC1B$M@Y%Me!BSx3P z#2Eawl$HleZhhTS6Txm>lN_+I`>eV$&v9fOg)%zVn3O5mI*lAl>QcHuW6!Kixmq`X zBCZ*Ck6OYtDiK!N47>jxI&O2a9x7M|i^IagRr-fmrmikEQGgw%J7bO|)*$2FW95O4 zeBs>KR)izRG1gRVL;F*sr8A}aRHO0gc$$j&ds8CIO1=Gwq1%_~E)CWNn9pCtBE}+`Jelk4{>S)M)`Ll=!~gnn1yq^EX(+y*ik@3Ou0qU`IgYi3*doM+5&dU!cho$pZ zn%lhKeZkS72P?Cf68<#kll_6OAO26bIbueZx**j6o;I0cS^XiL`y+>{cD}gd%lux} z)3N>MaE24WBZ}s0ApfdM;5J_Ny}rfUyxfkC``Awo2#sgLnGPewK};dORuT?@I6(5~ z?kE)Qh$L&fwJXzK){iYx!l5$Tt|^D~MkGZPA}(o6f7w~O2G6Vvzdo*a;iXzk$B66$ zwF#;wM7A+(;uFG4+UAY(2`*3XXx|V$K8AYu#ECJYSl@S=uZW$ksfC$~qrrbQj4??z-)uz0QL}>k^?fPnJTPw% zGz)~?B4}u0CzOf@l^um}HZzbaIwPmb<)< zi_3@E9lc)Qe2_`*Z^HH;1CXOceL=CHpHS{HySy3T%<^NrWQ}G0i4e1xm_K3(+~oi$ zoHl9wzb?Z4j#90DtURtjtgvi7uw8DzHYmtPb;?%8vb9n@bszT=1qr)V_>R%s!92_` zfnHQPANx z<#hIjIMm#*(v*!OXtF+w8kLu`o?VZ5k7{`vw{Yc^qYclpUGIM_PBN1+c{#Vxv&E*@ zxg=W2W~JuV{IuRYw3>LSI1)a!thID@R=bU+cU@DbR^_SXY`MC7HOsCN z!dO4OKV7(E_Z8T#8MA1H`99?Z!r0)qKW_#|29X3#Jb+5+>qUidbeP1NJ@)(qi2S-X zao|f0_tl(O+$R|Qwd$H{_ig|~I1fbp_$NkI!0E;Y z6JrnU{1Ra6^on{9gUUB0mwzP3S%B#h0fjo>JvV~#+X0P~JV=IG=yHG$O+p5O3NUgG zEQ}z6BTp^Fie)Sg<){Z&I8NwPR(=mO4joTLHkJ>|Tnk23E(Bo`FSbPc05lF2-+)X? z6vV3*m~IBHTy*^E!<0nA(tCOJW2G4DsH7)BxLV8kICn5lu6@U*R`w)o9;Ro$i8=Q^V%uH8n3q=+Yf;SFRZu z!+F&PKcH#8cG?aSK_Tl@K9P#8o+jry@gdexz&d(Q=47<7nw@e@FFfIRNL9^)1i@;A z28+$Z#rjv-wj#heI|<&J_DiJ*s}xd-f!{J8jfqOHE`TiHHZVIA8CjkNQ_u;Ery^^t zl1I75&u^`1_q)crO+JT4rx|z2ToSC>)Or@-D zy3S>jW*sNIZR-EBsfyaJ+Jq4BQE4?SePtD2+jY8*%FsSLZ9MY>+wk?}}}AFAw)vr{ml)8LUG-y9>^t!{~|sgpxYc0Gnkg`&~R z-pilJZjr@y5$>B=VMdZ73svct%##v%wdX~9fz6i3Q-zOKJ9wso+h?VME7}SjL=!NUG{J?M&i!>ma`eoEa@IX`5G>B1(7;%}M*%-# zfhJ(W{y;>MRz!Ic8=S}VaBKqh;~7KdnGEHxcL$kA-6E~=!hrN*zw9N+_=odt<$_H_8dbo;0=42wcAETPCVGUr~v(`Uai zb{=D!Qc!dOEU6v)2eHSZq%5iqK?B(JlCq%T6av$Cb4Rko6onlG&?CqaX7Y_C_cOC3 zYZ;_oI(}=>_07}Oep&Ws7x7-R)cc8zfe!SYxJYP``pi$FDS)4Fvw5HH=FiU6xfVqIM!hJ;Rx8c0cB7~aPtNH(Nmm5Vh{ibAoU#J6 zImRCr?(iyu_4W_6AWo3*vxTPUw@vPwy@E0`(>1Qi=%>5eSIrp^`` zK*Y?fK_6F1W>-7UsB)RPC4>>Ps9)f+^MqM}8AUm@tZ->j%&h1M8s*s!LX5&WxQcAh z8mciQej@RPm?660%>{_D+7er>%zX_{s|$Z+;G7_sfNfBgY(zLB4Ey}J9F>zX#K0f6 z?dVNIeEh?EIShmP6>M+d|0wMM85Sa4diw1hrg|ITJ}JDg@o8y>(rF9mXk5M z2@D|NA)-7>wD&wF;S_$KS=eE84`BGw3g0?6wGxu8ys4rwI?9U=*^VF22t3%mbGeOh z`!O-OpF7#Vceu~F`${bW0nYVU9ecmk31V{tF%iv&5hWofC>I~cqAt@u6|R+|HLMMX zVxuSlMFOK_EQ86#E8&KwxIr8S9tj_goWtLv4f@!&h8;Ov41{J~496vp9vX=(LK#j! zAwi*21RAV-LD>9Cw3bV_9X(X3)Kr0-UaB*7Y>t82EQ%!)(&(XuAYtTsYy-dz+w=$ir)VJpe!_$ z6SGpX^i(af3{o=VlFPC);|J8#(=_8#vdxDe|Cok+ANhYwbE*FO`Su2m1~w+&9<_9~ z-|tTU_ACGN`~CNW5WYYBn^B#SwZ(t4%3aPp z;o)|L6Rk569KGxFLUPx@!6OOa+5OjQLK5w&nAmwxkC5rZ|m&HT8G%GVZxB_@ME z>>{rnXUqyiJrT(8GMj_ap#yN_!9-lO5e8mR3cJiK3NE{_UM&=*vIU`YkiL$1%kf+1 z4=jk@7EEj`u(jy$HnzE33ZVW_J4bj}K;vT?T91YlO(|Y0FU4r+VdbmQ97%(J5 zkK*Bed8+C}FcZ@HIgdCMioV%A<*4pw_n}l*{Cr4}a(lq|injK#O?$tyvyE`S%(1`H z_wwRvk#13ElkZvij2MFGOj`fhy?nC^8`Zyo%yVcUAfEr8x&J#A{|moUBAV_^f$hpaUuyQeY3da^ zS9iRgf87YBwfe}>BO+T&Fl%rfpZh#+AM?Dq-k$Bq`vG6G_b4z%Kbd&v>qFjow*mBl z-OylnqOpLg}or7_VNwRg2za3VBK6FUfFX{|TD z`Wt0Vm2H$vdlRWYQJqDmM?JUbVqL*ZQY|5&sY*?!&%P8qhA~5+Af<{MaGo(dl&C5t zE%t!J0 zh6jqANt4ABdPxSTrVV}fLsRQal*)l&_*rFq(Ez}ClEH6LHv{J#v?+H-BZ2)Wy{K@9 z+ovXHq~DiDvm>O~r$LJo!cOuwL+Oa--6;UFE2q@g3N8Qkw5E>ytz^(&($!O47+i~$ zKM+tkAd-RbmP{s_rh+ugTD;lriL~`Xwkad#;_aM?nQ7L_muEFI}U_4$phjvYgleK~`Fo`;GiC07&Hq1F<%p;9Q;tv5b?*QnR%8DYJH3P>Svmv47Y>*LPZJy8_{9H`g6kQpyZU{oJ`m%&p~D=K#KpfoJ@ zn-3cqmHsdtN!f?~w+(t+I`*7GQA#EQC^lUA9(i6=i1PqSAc|ha91I%X&nXzjYaM{8$s&wEx@aVkQ6M{E2 zfzId#&r(XwUNtPcq4Ngze^+XaJA1EK-%&C9j>^9(secqe{}z>hR5CFNveMsVA)m#S zk)_%SidkY-XmMWlVnQ(mNJ>)ooszQ#vaK;!rPmGKXV7am^_F!Lz>;~{VrIO$;!#30XRhE1QqO_~#+Ux;B_D{Nk=grn z8Y0oR^4RqtcYM)7a%@B(XdbZCOqnX#fD{BQTeLvRHd(irHKq=4*jq34`6@VAQR8WG z^%)@5CXnD_T#f%@-l${>y$tfb>2LPmc{~5A82|16mH)R?&r#KKLs7xpN-D`=&Cm^R zvMA6#Ahr<3X>Q7|-qfTY)}32HkAz$_mibYV!I)u>bmjK`qwBe(>za^0Kt*HnFbSdO z1>+ryKCNxmm^)*$XfiDOF2|{-v3KKB?&!(S_Y=Ht@|ir^hLd978xuI&N{k>?(*f8H z=ClxVJK_%_z1TH0eUwm2J+2To7FK4o+n_na)&#VLn1m;!+CX+~WC+qg1?PA~KdOlC zW)C@pw75_xoe=w7i|r9KGIvQ$+3K?L{7TGHwrQM{dCp=Z*D}3kX7E-@sZnup!BImw z*T#a=+WcTwL78exTgBn|iNE3#EsOorO z*kt)gDzHiPt07fmisA2LWN?AymkdqTgr?=loT7z@d`wnlr6oN}@o|&JX!yPzC*Y8d zu6kWlTzE1)ckyBn+0Y^HMN+GA$wUO_LN6W>mxCo!0?oiQvT`z$jbSEu&{UHRU0E8# z%B^wOc@S!yhMT49Y)ww(Xta^8pmPCe@eI5C*ed96)AX9<>))nKx0(sci8gwob_1}4 z0DIL&vsJ1_s%<@y%U*-eX z5rN&(zef-5G~?@r79oZGW1d!WaTqQn0F6RIOa9tJ=0(kdd{d1{<*tHT#cCvl*i>YY zH+L7jq8xZNcTUBqj(S)ztTU!TM!RQ}In*n&Gn<>(60G7}4%WQL!o>hbJqNDSGwl#H z`4k+twp0cj%PsS+NKaxslAEu9!#U3xT1|_KB6`h=PI0SW`P9GTa7caD1}vKEglV8# zjKZR`pluCW19c2fM&ZG)c3T3Um;ir3y(tSCJ7Agl6|b524dy5El{^EQBG?E61H0XY z`bqg!;zhGhyMFl&(o=JWEJ8n~z)xI}A@C0d2hQGvw7nGv)?POU@(kS1m=%`|+^ika zXl8zjS?xqW$WlO?Ewa;vF~XbybHBor$f<%I&*t$F5fynwZlTGj|IjZtVfGa7l&tK} zW>I<69w(cZLu)QIVG|M2xzW@S+70NinQzk&Y0+3WT*cC)rx~04O-^<{JohU_&HL5XdUKW!uFy|i$FB|EMu0eUyW;gsf`XfIc!Z0V zeK&*hPL}f_cX=@iv>K%S5kL;cl_$v?n(Q9f_cChk8Lq$glT|=e+T*8O4H2n<=NGmn z+2*h+v;kBvF>}&0RDS>)B{1!_*XuE8A$Y=G8w^qGMtfudDBsD5>T5SB;Qo}fSkkiV ze^K^M(UthkwrD!&*tTsu>Dacdj_q`~V%r_twr$(Ct&_dKeeXE?fA&4&yASJWJ*}~- zel=@W)tusynfC_YqH4ll>4Eg`Xjs5F7Tj>tTLz<0N3)X<1px_d2yUY>X~y>>93*$) z5PuNMQLf9Bu?AAGO~a_|J2akO1M*@VYN^VxvP0F$2>;Zb9;d5Yfd8P%oFCCoZE$ z4#N$^J8rxYjUE_6{T%Y>MmWfHgScpuGv59#4u6fpTF%~KB^Ae`t1TD_^Ud#DhL+Dm zbY^VAM#MrAmFj{3-BpVSWph2b_Y6gCnCAombVa|1S@DU)2r9W<> zT5L8BB^er3zxKt1v(y&OYk!^aoQisqU zH(g@_o)D~BufUXcPt!Ydom)e|aW{XiMnes2z&rE?og>7|G+tp7&^;q?Qz5S5^yd$i z8lWr4g5nctBHtigX%0%XzIAB8U|T6&JsC4&^hZBw^*aIcuNO47de?|pGXJ4t}BB`L^d8tD`H`i zqrP8?#J@8T#;{^B!KO6J=@OWKhAerih(phML`(Rg7N1XWf1TN>=Z3Do{l_!d~DND&)O)D>ta20}@Lt77qSnVsA7>)uZAaT9bsB>u&aUQl+7GiY2|dAEg@%Al3i316y;&IhQL^8fw_nwS>f60M_-m+!5)S_6EPM7Y)(Nq^8gL7(3 zOiot`6Wy6%vw~a_H?1hLVzIT^i1;HedHgW9-P#)}Y6vF%C=P70X0Tk^z9Te@kPILI z_(gk!k+0%CG)%!WnBjjw*kAKs_lf#=5HXC00s-}oM-Q1aXYLj)(1d!_a7 z*Gg4Fe6F$*ujVjI|79Z5+Pr`us%zW@ln++2l+0hsngv<{mJ%?OfSo_3HJXOCys{Ug z00*YR-(fv<=&%Q!j%b-_ppA$JsTm^_L4x`$k{VpfLI(FMCap%LFAyq;#ns5bR7V+x zO!o;c5y~DyBPqdVQX)8G^G&jWkBy2|oWTw>)?5u}SAsI$RjT#)lTV&Rf8;>u*qXnb z8F%Xb=7#$m)83z%`E;49)t3fHInhtc#kx4wSLLms!*~Z$V?bTyUGiS&m>1P(952(H zuHdv=;o*{;5#X-uAyon`hP}d#U{uDlV?W?_5UjJvf%11hKwe&(&9_~{W)*y1nR5f_ z!N(R74nNK`y8>B!0Bt_Vr!;nc3W>~RiKtGSBkNlsR#-t^&;$W#)f9tTlZz>n*+Fjz z3zXZ;jf(sTM(oDzJt4FJS*8c&;PLTW(IQDFs_5QPy+7yhi1syPCarvqrHFcf&yTy)^O<1EBx;Ir`5W{TIM>{8w&PB>ro4;YD<5LF^TjTb0!zAP|QijA+1Vg>{Afv^% zmrkc4o6rvBI;Q8rj4*=AZacy*n8B{&G3VJc)so4$XUoie0)vr;qzPZVbb<#Fc=j+8CGBWe$n|3K& z_@%?{l|TzKSlUEO{U{{%Fz_pVDxs7i9H#bnbCw7@4DR=}r_qV!Zo~CvD4ZI*+j3kO zW6_=|S`)(*gM0Z;;}nj`73OigF4p6_NPZQ-Od~e$c_);;4-7sR>+2u$6m$Gf%T{aq zle>e3(*Rt(TPD}03n5)!Ca8Pu!V}m6v0o1;5<1h$*|7z|^(3$Y&;KHKTT}hV056wuF0Xo@mK-52~r=6^SI1NC%c~CC?n>yX6wPTgiWYVz!Sx^atLby9YNn1Rk{g?|pJaxD4|9cUf|V1_I*w zzxK)hRh9%zOl=*$?XUjly5z8?jPMy%vEN)f%T*|WO|bp5NWv@B(K3D6LMl!-6dQg0 zXNE&O>Oyf%K@`ngCvbGPR>HRg5!1IV$_}m@3dWB7x3t&KFyOJn9pxRXCAzFr&%37wXG;z^xaO$ekR=LJG ztIHpY8F5xBP{mtQidqNRoz= z@){+N3(VO5bD+VrmS^YjG@+JO{EOIW)9=F4v_$Ed8rZtHvjpiEp{r^c4F6Ic#ChlC zJX^DtSK+v(YdCW)^EFcs=XP7S>Y!4=xgmv>{S$~@h=xW-G4FF9?I@zYN$e5oF9g$# zb!eVU#J+NjLyX;yb)%SY)xJdvGhsnE*JEkuOVo^k5PyS=o#vq!KD46UTW_%R=Y&0G zFj6bV{`Y6)YoKgqnir2&+sl+i6foAn-**Zd1{_;Zb7Ki=u394C5J{l^H@XN`_6XTKY%X1AgQM6KycJ+= zYO=&t#5oSKB^pYhNdzPgH~aEGW2=ec1O#s-KG z71}LOg@4UEFtp3GY1PBemXpNs6UK-ax*)#$J^pC_me;Z$Je(OqLoh|ZrW*mAMBFn< zHttjwC&fkVfMnQeen8`Rvy^$pNRFVaiEN4Pih*Y3@jo!T0nsClN)pdrr9AYLcZxZ| zJ5Wlj+4q~($hbtuY zVQ7hl>4-+@6g1i`1a)rvtp-;b0>^`Dloy(#{z~ytgv=j4q^Kl}wD>K_Y!l~ zp(_&7sh`vfO(1*MO!B%<6E_bx1)&s+Ae`O)a|X=J9y~XDa@UB`m)`tSG4AUhoM=5& znWoHlA-(z@3n0=l{E)R-p8sB9XkV zZ#D8wietfHL?J5X0%&fGg@MH~(rNS2`GHS4xTo7L$>TPme+Is~!|79=^}QbPF>m%J zFMkGzSndiPO|E~hrhCeo@&Ea{M(ieIgRWMf)E}qeTxT8Q#g-!Lu*x$v8W^M^>?-g= zwMJ$dThI|~M06rG$Sv@C@tWR>_YgaG&!BAbkGggVQa#KdtDB)lMLNVLN|51C@F^y8 zCRvMB^{GO@j=cHfmy}_pCGbP%xb{pNN>? z?7tBz$1^zVaP|uaatYaIN+#xEN4jBzwZ|YI_)p(4CUAz1ZEbDk>J~Y|63SZaak~#0 zoYKruYsWHoOlC1(MhTnsdUOwQfz5p6-D0}4;DO$B;7#M{3lSE^jnTT;ns`>!G%i*F?@pR1JO{QTuD0U+~SlZxcc8~>IB{)@8p`P&+nDxNj`*gh|u?yrv$phpQcW)Us)bi`kT%qLj(fi{dWRZ%Es2!=3mI~UxiW0$-v3vUl?#g{p6eF zMEUAqo5-L0Ar(s{VlR9g=j7+lt!gP!UN2ICMokAZ5(Agd>})#gkA2w|5+<%-CuEP# zqgcM}u@3(QIC^Gx<2dbLj?cFSws_f3e%f4jeR?4M^M3cx1f+Qr6ydQ>n)kz1s##2w zk}UyQc+Z5G-d-1}{WzjkLXgS-2P7auWSJ%pSnD|Uivj5u!xk0 z_^-N9r9o;(rFDt~q1PvE#iJZ_f>J3gcP$)SOqhE~pD2|$=GvpL^d!r z6u=sp-CrMoF7;)}Zd7XO4XihC4ji?>V&(t^?@3Q&t9Mx=qex6C9d%{FE6dvU6%d94 zIE;hJ1J)cCqjv?F``7I*6bc#X)JW2b4f$L^>j{*$R`%5VHFi*+Q$2;nyieduE}qdS{L8y8F08yLs?w}{>8>$3236T-VMh@B zq-nujsb_1aUv_7g#)*rf9h%sFj*^mIcImRV*k~Vmw;%;YH(&ylYpy!&UjUVqqtfG` zox3esju?`unJJA_zKXRJP)rA3nXc$m^{S&-p|v|-0x9LHJm;XIww7C#R$?00l&Yyj z=e}gKUOpsImwW?N)+E(awoF@HyP^EhL+GlNB#k?R<2>95hz!h9sF@U20DHSB3~WMa zk90+858r@-+vWwkawJ)8ougd(i#1m3GLN{iSTylYz$brAsP%=&m$mQQrH$g%3-^VR zE%B`Vi&m8f3T~&myTEK28BDWCVzfWir1I?03;pX))|kY5ClO^+bae z*7E?g=3g7EiisYOrE+lA)2?Ln6q2*HLNpZEWMB|O-JI_oaHZB%CvYB(%=tU= zE*OY%QY58fW#RG5=gm0NR#iMB=EuNF@)%oZJ}nmm=tsJ?eGjia{e{yuU0l3{d^D@)kVDt=1PE)&tf_hHC%0MB znL|CRCPC}SeuVTdf>-QV70`0(EHizc21s^sU>y%hW0t!0&y<7}Wi-wGy>m%(-jsDj zP?mF|>p_K>liZ6ZP(w5(|9Ga%>tLgb$|doDDfkdW>Z z`)>V2XC?NJT26mL^@ zf+IKr27TfM!UbZ@?zRddC7#6ss1sw%CXJ4FWC+t3lHZupzM77m^=9 z&(a?-LxIq}*nvv)y?27lZ{j zifdl9hyJudyP2LpU$-kXctshbJDKS{WfulP5Dk~xU4Le4c#h^(YjJit4#R8_khheS z|8(>2ibaHES4+J|DBM7I#QF5u-*EdN{n=Kt@4Zt?@Tv{JZA{`4 zU#kYOv{#A&gGPwT+$Ud}AXlK3K7hYzo$(fBSFjrP{QQ zeaKg--L&jh$9N}`pu{Bs>?eDFPaWY4|9|foN%}i;3%;@4{dc+iw>m}{3rELqH21G! z`8@;w-zsJ1H(N3%|1B@#ioLOjib)j`EiJqPQVSbPSPVHCj6t5J&(NcWzBrzCiDt{4 zdlPAUKldz%6x5II1H_+jv)(xVL+a;P+-1hv_pM>gMRr%04@k;DTokASSKKhU1Qms| zrWh3a!b(J3n0>-tipg{a?UaKsP7?+|@A+1WPDiQIW1Sf@qDU~M_P65_s}7(gjTn0X zucyEm)o;f8UyshMy&>^SC3I|C6jR*R_GFwGranWZe*I>K+0k}pBuET&M~ z;Odo*ZcT?ZpduHyrf8E%IBFtv;JQ!N_m>!sV6ly$_1D{(&nO~w)G~Y`7sD3#hQk%^ zp}ucDF_$!6DAz*PM8yE(&~;%|=+h(Rn-=1Wykas_-@d&z#=S}rDf`4w(rVlcF&lF! z=1)M3YVz7orwk^BXhslJ8jR);sh^knJW(Qmm(QdSgIAIdlN4Te5KJisifjr?eB{FjAX1a0AB>d?qY4Wx>BZ8&}5K0fA+d{l8 z?^s&l8#j7pR&ijD?0b%;lL9l$P_mi2^*_OL+b}4kuLR$GAf85sOo02?Y#90}CCDiS zZ%rbCw>=H~CBO=C_JVV=xgDe%b4FaEFtuS7Q1##y686r%F6I)s-~2(}PWK|Z8M+Gu zl$y~5@#0Ka%$M<&Cv%L`a8X^@tY&T7<0|(6dNT=EsRe0%kp1Qyq!^43VAKYnr*A5~ zsI%lK1ewqO;0TpLrT9v}!@vJK{QoVa_+N4FYT#h?Y8rS1S&-G+m$FNMP?(8N`MZP zels(*?kK{{^g9DOzkuZXJ2;SrOQsp9T$hwRB1(phw1c7`!Q!by?Q#YsSM#I12RhU{$Q+{xj83axHcftEc$mNJ8_T7A-BQc*k(sZ+~NsO~xAA zxnbb%dam_fZlHvW7fKXrB~F&jS<4FD2FqY?VG?ix*r~MDXCE^WQ|W|WM;gsIA4lQP zJ2hAK@CF*3*VqPr2eeg6GzWFlICi8S>nO>5HvWzyZTE)hlkdC_>pBej*>o0EOHR|) z$?};&I4+_?wvL*g#PJ9)!bc#9BJu1(*RdNEn>#Oxta(VWeM40ola<0aOe2kSS~{^P zDJBd}0L-P#O-CzX*%+$#v;(x%<*SPgAje=F{Zh-@ucd2DA(yC|N_|ocs*|-!H%wEw z@Q!>siv2W;C^^j^59OAX03&}&D*W4EjCvfi(ygcL#~t8XGa#|NPO+*M@Y-)ctFA@I z-p7npT1#5zOLo>7q?aZpCZ=iecn3QYklP;gF0bq@>oyBq94f6C=;Csw3PkZ|5q=(c zfs`aw?II0e(h=|7o&T+hq&m$; zBrE09Twxd9BJ2P+QPN}*OdZ-JZV7%av@OM7v!!NL8R;%WFq*?{9T3{ct@2EKgc8h) zMxoM$SaF#p<`65BwIDfmXG6+OiK0e)`I=!A3E`+K@61f}0e z!2a*FOaDrOe>U`q%K!QN`&=&0C~)CaL3R4VY(NDt{Xz(Xpqru5=r#uQN1L$Je1*dkdqQ*=lofQaN%lO!<5z9ZlHgxt|`THd>2 zsWfU$9=p;yLyJyM^t zS2w9w?Bpto`@H^xJpZDKR1@~^30Il6oFGfk5%g6w*C+VM)+%R@gfIwNprOV5{F^M2 zO?n3DEzpT+EoSV-%OdvZvNF+pDd-ZVZ&d8 zKeIyrrfPN=EcFRCPEDCVflX#3-)Ik_HCkL(ejmY8vzcf-MTA{oHk!R2*36`O68$7J zf}zJC+bbQk--9Xm!u#lgLvx8TXx2J258E5^*IZ(FXMpq$2LUUvhWQPs((z1+2{Op% z?J}9k5^N=z;7ja~zi8a_-exIqWUBJwohe#4QJ`|FF*$C{lM18z^#hX6!5B8KAkLUX ziP=oti-gpV(BsLD{0(3*dw}4JxK23Y7M{BeFPucw!sHpY&l%Ws4pSm`+~V7;bZ%Dx zeI)MK=4vC&5#;2MT7fS?^ch9?2;%<8Jlu-IB&N~gg8t;6S-#C@!NU{`p7M8@2iGc& zg|JPg%@gCoCQ&s6JvDU&`X2S<57f(k8nJ1wvBu{8r?;q3_kpZZ${?|( z+^)UvR33sjSd)aT!UPkA;ylO6{aE3MQa{g%Mcf$1KONcjO@&g5zPHWtzM1rYC{_K> zgQNcs<{&X{OA=cEWw5JGqpr0O>x*Tfak2PE9?FuWtz^DDNI}rwAaT0(bdo-<+SJ6A z&}S%boGMWIS0L}=S>|-#kRX;e^sUsotry(MjE|3_9duvfc|nwF#NHuM-w7ZU!5ei8 z6Mkf>2)WunY2eU@C-Uj-A zG(z0Tz2YoBk>zCz_9-)4a>T46$(~kF+Y{#sA9MWH%5z#zNoz)sdXq7ZR_+`RZ%0(q zC7&GyS_|BGHNFl8Xa%@>iWh%Gr?=J5<(!OEjauj5jyrA-QXBjn0OAhJJ9+v=!LK`` z@g(`^*84Q4jcDL`OA&ZV60djgwG`|bcD*i50O}Q{9_noRg|~?dj%VtKOnyRs$Uzqg z191aWoR^rDX#@iSq0n z?9Sg$WSRPqSeI<}&n1T3!6%Wj@5iw5`*`Btni~G=&;J+4`7g#OQTa>u`{4ZZ(c@s$ zK0y;ySOGD-UTjREKbru{QaS>HjN<2)R%Nn-TZiQ(Twe4p@-saNa3~p{?^V9Nixz@a zykPv~<@lu6-Ng9i$Lrk(xi2Tri3q=RW`BJYOPC;S0Yly%77c727Yj-d1vF!Fuk{Xh z)lMbA69y7*5ufET>P*gXQrxsW+ zz)*MbHZv*eJPEXYE<6g6_M7N%#%mR{#awV3i^PafNv(zyI)&bH?F}2s8_rR(6%!V4SOWlup`TKAb@ee>!9JKPM=&8g#BeYRH9FpFybxBXQI2|g}FGJfJ+ zY-*2hB?o{TVL;Wt_ek;AP5PBqfDR4@Z->_182W z{P@Mc27j6jE*9xG{R$>6_;i=y{qf(c`5w9fa*`rEzX6t!KJ(p1H|>J1pC-2zqWENF zmm=Z5B4u{cY2XYl(PfrInB*~WGWik3@1oRhiMOS|D;acnf-Bs(QCm#wR;@Vf!hOPJ zgjhDCfDj$HcyVLJ=AaTbQ{@vIv14LWWF$=i-BDoC11}V;2V8A`S>_x)vIq44-VB-v z*w-d}$G+Ql?En8j!~ZkCpQ$|cA0|+rrY>tiCeWxkRGPoarxlGU2?7%k#F693RHT24 z-?JsiXlT2PTqZqNb&sSc>$d;O4V@|b6VKSWQb~bUaWn1Cf0+K%`Q&Wc<>mQ>*iEGB zbZ;aYOotBZ{vH3y<0A*L0QVM|#rf*LIsGx(O*-7)r@yyBIzJnBFSKBUSl1e|8lxU* zzFL+YDVVkIuzFWeJ8AbgN&w(4-7zbiaMn{5!JQXu)SELk*CNL+Fro|2v|YO)1l15t zs(0^&EB6DPMyaqvY>=KL>)tEpsn;N5Q#yJj<9}ImL((SqErWN3Q=;tBO~ExTCs9hB z2E$7eN#5wX4<3m^5pdjm#5o>s#eS_Q^P)tm$@SawTqF*1dj_i#)3};JslbLKHXl_N z)Fxzf>FN)EK&Rz&*|6&%Hs-^f{V|+_vL1S;-1K-l$5xiC@}%uDuwHYhmsV?YcOUlk zOYkG5v2+`+UWqpn0aaaqrD3lYdh0*!L`3FAsNKu=Q!vJu?Yc8n|CoYyDo_`r0mPoo z8>XCo$W4>l(==h?2~PoRR*kEe)&IH{1sM41mO#-36`02m#nTX{r*r`Q5rZ2-sE|nA zhnn5T#s#v`52T5|?GNS`%HgS2;R(*|^egNPDzzH_z^W)-Q98~$#YAe)cEZ%vge965AS_am#DK#pjPRr-!^za8>`kksCAUj(Xr*1NW5~e zpypt_eJpD&4_bl_y?G%>^L}=>xAaV>KR6;^aBytqpiHe%!j;&MzI_>Sx7O%F%D*8s zSN}cS^<{iiK)=Ji`FpO#^zY!_|D)qeRNAtgmH)m;qC|mq^j(|hL`7uBz+ULUj37gj zksdbnU+LSVo35riSX_4z{UX=%n&}7s0{WuZYoSfwAP`8aKN9P@%e=~1`~1ASL-z%# zw>DO&ixr}c9%4InGc*_y42bdEk)ZdG7-mTu0bD@_vGAr*NcFoMW;@r?@LUhRI zCUJgHb`O?M3!w)|CPu~ej%fddw20lod?Ufp8Dmt0PbnA0J%KE^2~AIcnKP()025V> zG>noSM3$5Btmc$GZoyP^v1@Poz0FD(6YSTH@aD0}BXva?LphAiSz9f&Y(aDAzBnUh z?d2m``~{z;{}kZJ>a^wYI?ry(V9hIoh;|EFc0*-#*`$T0DRQ1;WsqInG;YPS+I4{g zJGpKk%%Sdc5xBa$Q^_I~(F97eqDO7AN3EN0u)PNBAb+n+ zWBTxQx^;O9o0`=g+Zrt_{lP!sgWZHW?8bLYS$;1a@&7w9rD9|Ge;Gb?sEjFoF9-6v z#!2)t{DMHZ2@0W*fCx;62d#;jouz`R5Y(t{BT=$N4yr^^o$ON8d{PQ=!O zX17^CrdM~7D-;ZrC!||<+FEOxI_WI3CA<35va%4v>gc zEX-@h8esj=a4szW7x{0g$hwoWRQG$yK{@3mqd-jYiVofJE!Wok1* znV7Gm&Ssq#hFuvj1sRyHg(6PFA5U*Q8Rx>-blOs=lb`qa{zFy&n4xY;sd$fE+<3EI z##W$P9M{B3c3Si9gw^jlPU-JqD~Cye;wr=XkV7BSv#6}DrsXWFJ3eUNrc%7{=^sP> zrp)BWKA9<}^R9g!0q7yWlh;gr_TEOD|#BmGq<@IV;ueg+D2}cjpp+dPf&Q(36sFU&K8}hA85U61faW&{ zlB`9HUl-WWCG|<1XANN3JVAkRYvr5U4q6;!G*MTdSUt*Mi=z_y3B1A9j-@aK{lNvx zK%p23>M&=KTCgR!Ee8c?DAO2_R?B zkaqr6^BSP!8dHXxj%N1l+V$_%vzHjqvu7p@%Nl6;>y*S}M!B=pz=aqUV#`;h%M0rU zHfcog>kv3UZAEB*g7Er@t6CF8kHDmKTjO@rejA^ULqn!`LwrEwOVmHx^;g|5PHm#B zZ+jjWgjJ!043F+&#_;D*mz%Q60=L9Ove|$gU&~As5^uz@2-BfQ!bW)Khn}G+Wyjw- z19qI#oB(RSNydn0t~;tAmK!P-d{b-@@E5|cdgOS#!>%#Rj6ynkMvaW@37E>@hJP^8 z2zk8VXx|>#R^JCcWdBCy{0nPmYFOxN55#^-rlqobe0#L6)bi?E?SPymF*a5oDDeSd zO0gx?#KMoOd&G(2O@*W)HgX6y_aa6iMCl^~`{@UR`nMQE`>n_{_aY5nA}vqU8mt8H z`oa=g0SyiLd~BxAj2~l$zRSDHxvDs;I4>+M$W`HbJ|g&P+$!U7-PHX4RAcR0szJ*( ze-417=bO2q{492SWrqDK+L3#ChUHtz*@MP)e^%@>_&#Yk^1|tv@j4%3T)diEX zATx4K*hcO`sY$jk#jN5WD<=C3nvuVsRh||qDHnc~;Kf59zr0;c7VkVSUPD%NnnJC_ zl3F^#f_rDu8l}l8qcAz0FFa)EAt32IUy_JLIhU_J^l~FRH&6-ivSpG2PRqzDdMWft>Zc(c)#tb%wgmWN%>IOPm zZi-noqS!^Ftb81pRcQi`X#UhWK70hy4tGW1mz|+vI8c*h@ zfFGJtW3r>qV>1Z0r|L>7I3un^gcep$AAWfZHRvB|E*kktY$qQP_$YG60C@X~tTQjB3%@`uz!qxtxF+LE!+=nrS^07hn` zEgAp!h|r03h7B!$#OZW#ACD+M;-5J!W+{h|6I;5cNnE(Y863%1(oH}_FTW})8zYb$7czP zg~Szk1+_NTm6SJ0MS_|oSz%e(S~P-&SFp;!k?uFayytV$8HPwuyELSXOs^27XvK-D zOx-Dl!P|28DK6iX>p#Yb%3`A&CG0X2S43FjN%IB}q(!hC$fG}yl1y9W&W&I@KTg6@ zK^kpH8=yFuP+vI^+59|3%Zqnb5lTDAykf z9S#X`3N(X^SpdMyWQGOQRjhiwlj!0W-yD<3aEj^&X%=?`6lCy~?`&WSWt z?U~EKFcCG_RJ(Qp7j=$I%H8t)Z@6VjA#>1f@EYiS8MRHZphp zMA_5`znM=pzUpBPO)pXGYpQ6gkine{6u_o!P@Q+NKJ}k!_X7u|qfpAyIJb$_#3@wJ z<1SE2Edkfk9C!0t%}8Yio09^F`YGzpaJHGk*-ffsn85@)%4@`;Fv^8q(-Wk7r=Q8p zT&hD`5(f?M{gfzGbbwh8(}G#|#fDuk7v1W)5H9wkorE0ZZjL0Q1=NRGY>zwgfm81DdoaVwNH;or{{eSyybt)m<=zXoA^RALYG-2t zouH|L*BLvmm9cdMmn+KGopyR@4*=&0&4g|FLoreZOhRmh=)R0bg~ zT2(8V_q7~42-zvb)+y959OAv!V$u(O3)%Es0M@CRFmG{5sovIq4%8Ahjk#*5w{+)+ zMWQoJI_r$HxL5km1#6(e@{lK3Udc~n0@g`g$s?VrnQJ$!oPnb?IHh-1qA`Rz$)Ai< z6w$-MJW-gKNvOhL+XMbE7&mFt`x1KY>k4(!KbbpZ`>`K@1J<(#vVbjx@Z@(6Q}MF# zMnbr-f55(cTa^q4+#)=s+ThMaV~E`B8V=|W_fZWDwiso8tNMTNse)RNBGi=gVwgg% zbOg8>mbRN%7^Um-7oj4=6`$|(K7!+t^90a{$18Z>}<#!bm%ZEFQ{X(yBZMc>lCz0f1I2w9Sq zuGh<9<=AO&g6BZte6hn>Qmvv;Rt)*cJfTr2=~EnGD8P$v3R|&1RCl&7)b+`=QGapi zPbLg_pxm`+HZurtFZ;wZ=`Vk*do~$wB zxoW&=j0OTbQ=Q%S8XJ%~qoa3Ea|au5o}_(P;=!y-AjFrERh%8la!z6Fn@lR?^E~H12D?8#ht=1F;7@o4$Q8GDj;sSC%Jfn01xgL&%F2 zwG1|5ikb^qHv&9hT8w83+yv&BQXOQyMVJSBL(Ky~p)gU3#%|blG?IR9rP^zUbs7rOA0X52Ao=GRt@C&zlyjNLv-} z9?*x{y(`509qhCV*B47f2hLrGl^<@SuRGR!KwHei?!CM10Tq*YDIoBNyRuO*>3FU? zHjipIE#B~y3FSfOsMfj~F9PNr*H?0oHyYB^G(YyNh{SxcE(Y-`x5jFMKb~HO*m+R% zrq|ic4fzJ#USpTm;X7K+E%xsT_3VHKe?*uc4-FsILUH;kL>_okY(w`VU*8+l>o>Jm ziU#?2^`>arnsl#)*R&nf_%>A+qwl%o{l(u)M?DK1^mf260_oteV3#E_>6Y4!_hhVD zM8AI6MM2V*^_M^sQ0dmHu11fy^kOqXqzpr?K$`}BKWG`=Es(9&S@K@)ZjA{lj3ea7_MBP zk(|hBFRjHVMN!sNUkrB;(cTP)T97M$0Dtc&UXSec<+q?y>5=)}S~{Z@ua;1xt@=T5 zI7{`Z=z_X*no8s>mY;>BvEXK%b`a6(DTS6t&b!vf_z#HM{Uoy_5fiB(zpkF{})ruka$iX*~pq1ZxD?q68dIo zIZSVls9kFGsTwvr4{T_LidcWtt$u{kJlW7moRaH6+A5hW&;;2O#$oKyEN8kx`LmG)Wfq4ykh+q{I3|RfVpkR&QH_x;t41Uw z`P+tft^E2B$domKT@|nNW`EHwyj>&}K;eDpe z1bNOh=fvIfk`&B61+S8ND<(KC%>y&?>opCnY*r5M+!UrWKxv0_QvTlJc>X#AaI^xo zaRXL}t5Ej_Z$y*|w*$6D+A?Lw-CO-$itm^{2Ct82-<0IW)0KMNvJHgBrdsIR0v~=H z?n6^}l{D``Me90`^o|q!olsF?UX3YSq^6Vu>Ijm>>PaZI8G@<^NGw{Cx&%|PwYrfw zR!gX_%AR=L3BFsf8LxI|K^J}deh0ZdV?$3r--FEX`#INxsOG6_=!v)DI>0q|BxT)z z-G6kzA01M?rba+G_mwNMQD1mbVbNTWmBi*{s_v_Ft9m2Avg!^78(QFu&n6mbRJ2bA zv!b;%yo{g*9l2)>tsZJOOp}U~8VUH`}$ z8p_}t*XIOehezolNa-a2x0BS})Y9}&*TPgua{Ewn-=wVrmJUeU39EKx+%w%=ixQWK zDLpwaNJs65#6o7Ln7~~X+p_o2BR1g~VCfxLzxA{HlWAI6^H;`juI=&r1jQrUv_q0Z z1Ja-tjdktrrP>GOC*#p?*xfQU5MqjMsBe!9lh(u8)w$e@Z|>aUHI5o;MGw*|Myiz3 z-f0;pHg~Q#%*Kx8MxH%AluVXjG2C$)WL-K63@Q`#y9_k_+}eR(x4~dp7oV-ek0H>I zgy8p#i4GN{>#v=pFYUQT(g&b$OeTy-X_#FDgNF8XyfGY6R!>inYn8IR2RDa&O!(6< znXs{W!bkP|s_YI*Yx%4stI`=ZO45IK6rBs`g7sP40ic}GZ58s?Mc$&i`kq_tfci>N zIHrC0H+Qpam1bNa=(`SRKjixBTtm&e`j9porEci!zdlg1RI0Jw#b(_Tb@RQK1Zxr_ z%7SUeH6=TrXt3J@js`4iDD0=IoHhK~I7^W8^Rcp~Yaf>2wVe|Hh1bUpX9A
TD#moByY57-f2Ef1TP^lBi&p5_s7WGG9|0T}dlfxOx zXvScJO1Cnq`c`~{Dp;{;l<-KkCDE+pmexJkd}zCgE{eF=)K``-qC~IT6GcRog_)!X z?fK^F8UDz$(zFUrwuR$qro5>qqn>+Z%<5>;_*3pZ8QM|yv9CAtrAx;($>4l^_$_-L z*&?(77!-=zvnCVW&kUcZMb6;2!83si518Y%R*A3JZ8Is|kUCMu`!vxDgaWjs7^0j( ziTaS4HhQ)ldR=r)_7vYFUr%THE}cPF{0H45FJ5MQW^+W>P+eEX2kLp3zzFe*-pFVA zdDZRybv?H|>`9f$AKVjFWJ=wegO7hOOIYCtd?Vj{EYLT*^gl35|HQ`R=ti+ADm{jyQE7K@kdjuqJhWVSks>b^ zxha88-h3s;%3_5b1TqFCPTxVjvuB5U>v=HyZ$?JSk+&I%)M7KE*wOg<)1-Iy)8-K! z^XpIt|0ibmk9RtMmlUd7#Ap3Q!q9N4atQy)TmrhrFhfx1DAN`^vq@Q_SRl|V z#lU<~n67$mT)NvHh`%als+G-)x1`Y%4Bp*6Un5Ri9h=_Db zA-AdP!f>f0m@~>7X#uBM?diI@)Egjuz@jXKvm zJo+==juc9_<;CqeRaU9_Mz@;3e=E4=6TK+c`|uu#pIqhSyNm`G(X)&)B`8q0RBv#> z`gGlw(Q=1Xmf55VHj%C#^1lpc>LY8kfA@|rlC1EA<1#`iuyNO z(=;irt{_&K=i4)^x%;U(Xv<)+o=dczC5H3W~+e|f~{*ucxj@{Yi-cw^MqYr3fN zF5D+~!wd$#al?UfMnz(@K#wn`_5na@rRr8XqN@&M&FGEC@`+OEv}sI1hw>Up0qAWf zL#e4~&oM;TVfjRE+10B_gFlLEP9?Q-dARr3xi6nQqnw>k-S;~b z;!0s2VS4}W8b&pGuK=7im+t(`nz@FnT#VD|!)eQNp-W6)@>aA+j~K*H{$G`y2|QHY z|Hmy+CR@#jWY4~)lr1qBJB_RfHJFfP<}pK5(#ZZGSqcpyS&}01LnTWk5fzmXMGHkJ zTP6L^B+uj;lmB_W<~4=${+v0>z31M!-_O@o-O9GyW)j_mjx}!0@br_LE-7SIuPP84 z;5=O(U*g_um0tyG|61N@d9lEuOeiRd+#NY^{nd5;-CVlw&Ap7J?qwM^?E29wvS}2d zbzar4Fz&RSR(-|s!Z6+za&Z zY#D<5q_JUktIzvL0)yq_kLWG6DO{ri=?c!y!f(Dk%G{8)k`Gym%j#!OgXVDD3;$&v@qy#ISJfp=Vm>pls@9-mapVQChAHHd-x+OGx)(*Yr zC1qDUTZ6mM(b_hi!TuFF2k#8uI2;kD70AQ&di$L*4P*Y-@p`jdm%_c3f)XhYD^6M8&#Y$ZpzQMcR|6nsH>b=*R_Von!$BTRj7yGCXokoAQ z&ANvx0-Epw`QIEPgI(^cS2f(Y85yV@ygI{ewyv5Frng)e}KCZF7JbR(&W618_dcEh(#+^zZFY;o<815<5sOHQdeax9_!PyM&;{P zkBa5xymca0#)c#tke@3KNEM8a_mT&1gm;p&&JlMGH(cL(b)BckgMQ^9&vRwj!~3@l zY?L5}=Jzr080OGKb|y`ee(+`flQg|!lo6>=H)X4`$Gz~hLmu2a%kYW_Uu8x09Pa0J zKZ`E$BKJ=2GPj_3l*TEcZ*uYRr<*J^#5pILTT;k_cgto1ZL-%slyc16J~OH-(RgDA z%;EjEnoUkZ&acS{Q8`{i6T5^nywgqQI5bDIymoa7CSZG|WWVk>GM9)zy*bNih|QIm z%0+(Nnc*a_xo;$=!HQYaapLms>J1ToyjtFByY`C2H1wT#178#4+|{H0BBqtCdd$L% z_3Hc60j@{t9~MjM@LBalR&6@>B;9?r<7J~F+WXyYu*y3?px*=8MAK@EA+jRX8{CG?GI-< z54?Dc9CAh>QTAvyOEm0^+x;r2BWX|{3$Y7)L5l*qVE*y0`7J>l2wCmW zL1?|a`pJ-l{fb_N;R(Z9UMiSj6pQjOvQ^%DvhIJF!+Th7jO2~1f1N+(-TyCFYQZYw z4)>7caf^Ki_KJ^Zx2JUb z&$3zJy!*+rCV4%jqwyuNY3j1ZEiltS0xTzd+=itTb;IPYpaf?8Y+RSdVdpacB(bVQ zC(JupLfFp8y43%PMj2}T|VS@%LVp>hv4Y!RPMF?pp8U_$xCJ)S zQx!69>bphNTIb9yn*_yfj{N%bY)t{L1cs8<8|!f$;UQ*}IN=2<6lA;x^(`8t?;+ST zh)z4qeYYgZkIy{$4x28O-pugO&gauRh3;lti9)9Pvw+^)0!h~%m&8Q!AKX%urEMnl z?yEz?g#ODn$UM`+Q#$Q!6|zsq_`dLO5YK-6bJM6ya>}H+vnW^h?o$z;V&wvuM$dR& zeEq;uUUh$XR`TWeC$$c&Jjau2it3#%J-y}Qm>nW*s?En?R&6w@sDXMEr#8~$=b(gk zwDC3)NtAP;M2BW_lL^5ShpK$D%@|BnD{=!Tq)o(5@z3i7Z){} zGr}Exom_qDO{kAVkZ*MbLNHE666Kina#D{&>Jy%~w7yX$oj;cYCd^p9zy z8*+wgSEcj$4{WxKmCF(5o7U4jqwEvO&dm1H#7z}%VXAbW&W24v-tS6N3}qrm1OnE)fUkoE8yMMn9S$?IswS88tQWm4#Oid#ckgr6 zRtHm!mfNl-`d>O*1~d7%;~n+{Rph6BBy^95zqI{K((E!iFQ+h*C3EsbxNo_aRm5gj zKYug($r*Q#W9`p%Bf{bi6;IY0v`pB^^qu)gbg9QHQ7 zWBj(a1YSu)~2RK8Pi#C>{DMlrqFb9e_RehEHyI{n?e3vL_}L>kYJC z_ly$$)zFi*SFyNrnOt(B*7E$??s67EO%DgoZL2XNk8iVx~X_)o++4oaK1M|ou73vA0K^503j@uuVmLcHH4ya-kOIDfM%5%(E z+Xpt~#7y2!KB&)PoyCA+$~DXqxPxxALy!g-O?<9+9KTk4Pgq4AIdUkl`1<1#j^cJg zgU3`0hkHj_jxV>`Y~%LAZl^3o0}`Sm@iw7kwff{M%VwtN)|~!p{AsfA6vB5UolF~d zHWS%*uBDt<9y!9v2Xe|au&1j&iR1HXCdyCjxSgG*L{wmTD4(NQ=mFjpa~xooc6kju z`~+d{j7$h-;HAB04H!Zscu^hZffL#9!p$)9>sRI|Yovm)g@F>ZnosF2EgkU3ln0bR zTA}|+E(tt)!SG)-bEJi_0m{l+(cAz^pi}`9=~n?y&;2eG;d9{M6nj>BHGn(KA2n|O zt}$=FPq!j`p&kQ8>cirSzkU0c08%8{^Qyqi-w2LoO8)^E7;;I1;HQ6B$u0nNaX2CY zSmfi)F`m94zL8>#zu;8|{aBui@RzRKBlP1&mfFxEC@%cjl?NBs`cr^nm){>;$g?rhKr$AO&6qV_Wbn^}5tfFBry^e1`%du2~o zs$~dN;S_#%iwwA_QvmMjh%Qo?0?rR~6liyN5Xmej8(*V9ym*T`xAhHih-v$7U}8=dfXi2i*aAB!xM(Xekg*ix@r|ymDw*{*s0?dlVys2e)z62u1 z+k3esbJE=-P5S$&KdFp+2H7_2e=}OKDrf( z9-207?6$@f4m4B+9E*e((Y89!q?zH|mz_vM>kp*HGXldO0Hg#!EtFhRuOm$u8e~a9 z5(roy7m$Kh+zjW6@zw{&20u?1f2uP&boD}$#Zy)4o&T;vyBoqFiF2t;*g=|1=)PxB z8eM3Mp=l_obbc?I^xyLz?4Y1YDWPa+nm;O<$Cn;@ane616`J9OO2r=rZr{I_Kizyc zP#^^WCdIEp*()rRT+*YZK>V@^Zs=ht32x>Kwe zab)@ZEffz;VM4{XA6e421^h~`ji5r%)B{wZu#hD}f3$y@L0JV9f3g{-RK!A?vBUA}${YF(vO4)@`6f1 z-A|}e#LN{)(eXloDnX4Vs7eH|<@{r#LodP@Nz--$Dg_Par%DCpu2>2jUnqy~|J?eZ zBG4FVsz_A+ibdwv>mLp>P!(t}E>$JGaK$R~;fb{O3($y1ssQQo|5M;^JqC?7qe|hg zu0ZOqeFcp?qVn&Qu7FQJ4hcFi&|nR!*j)MF#b}QO^lN%5)4p*D^H+B){n8%VPUzi! zDihoGcP71a6!ab`l^hK&*dYrVYzJ0)#}xVrp!e;lI!+x+bfCN0KXwUAPU9@#l7@0& QuEJmfE|#`Dqx|px0L@K;Y5)KL diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 05679dc3..00000000 --- a/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew deleted file mode 100755 index 744e882e..00000000 --- a/gradlew +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - 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" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat deleted file mode 100644 index ac1b06f9..00000000 --- a/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/meterial/imgSource/the_moment_README_logo.png b/meterial/imgSource/the_moment_README_logo.png deleted file mode 100644 index 2175700eeafd2e89ecad8c8fbfb58b70106fe7f7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11185 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 ^kGR|2liDPTQ^x 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 n^8Ylc)K~F&iBj+X)of3g=W!+@UT roles = new ArrayList<>(); - - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) - @Override - public Collection getAuthorities() { - return this.roles.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList()); - } - - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) - @Override - public String getPassword() { - return this.adminPwd; - } - - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) - @Override - public String getUsername() { - return this.adminId; - } - - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) - @Override - public boolean isAccountNonExpired() { - return true; - } - - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) - @Override - public boolean isAccountNonLocked() { - return true; - } - - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) - @Override - public boolean isCredentialsNonExpired() { - return true; - } - - @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) - @Override - public boolean isEnabled() { - return true; - } -} diff --git a/src/main/java/com/moment/the/admin/controller/AdminController.java b/src/main/java/com/moment/the/admin/controller/AdminController.java deleted file mode 100644 index a19841a7..00000000 --- a/src/main/java/com/moment/the/admin/controller/AdminController.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.moment.the.admin.controller; - - -import com.moment.the.admin.dto.AdminDto; -import com.moment.the.admin.dto.SignInDto; -import com.moment.the.admin.service.AdminService; -import com.moment.the.response.ResponseService; -import com.moment.the.response.result.CommonResult; -import com.moment.the.response.result.SingleResult; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import javax.validation.Valid; -import java.util.Map; - -@Slf4j -@RestController -@RequestMapping("/v1") -@RequiredArgsConstructor -@ComponentScan(basePackages = {"com.moment.the.service"}) -public class AdminController { - private final AdminService adminService; - private final ResponseService responseService; - - @PostMapping("/login") - public SingleResult> login(@Valid @RequestBody SignInDto signInDto) throws Exception { - return responseService.getSingleResult(adminService.loginUser(signInDto.getAdminId(), signInDto.getAdminPwd())); - } - - @PostMapping("/logout") - @ApiImplicitParams({ - @ApiImplicitParam(name = "Authorization", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header"), - }) - public CommonResult logout(){ - adminService.logout(); - return responseService.getSuccessResult(); - } - - @PostMapping("/signup") - public CommonResult signup(@Valid @RequestBody AdminDto adminDto) throws Exception { - adminService.signUp(adminDto); - return responseService.getSuccessResult(); - } - - @PostMapping("/withdrawal") - @ApiImplicitParams({ - @ApiImplicitParam(name = "Authorization", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header"), - @ApiImplicitParam(name = "RefreshToken", value = "로그인 성공 후 refresh_token", required = false, dataType = "String", paramType = "header") - }) - public CommonResult withdrawal(@Valid @RequestBody SignInDto signInDto) throws Exception { - adminService.withdrawal(signInDto); - return responseService.getSuccessResult(); - } -} diff --git a/src/main/java/com/moment/the/admin/dto/AdminDto.java b/src/main/java/com/moment/the/admin/dto/AdminDto.java deleted file mode 100644 index 27943b0a..00000000 --- a/src/main/java/com/moment/the/admin/dto/AdminDto.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.moment.the.admin.dto; - - -import com.moment.the.admin.AdminDomain; -import lombok.*; - -import javax.validation.constraints.Email; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Size; -import java.util.Collections; - -@Getter -@Setter -@AllArgsConstructor -@NoArgsConstructor -public class AdminDto { - @Email(message = "Email should be valid") - @NotBlank(message = "id should be valid") - private String adminId; - - @NotBlank(message = "password should be valid") - private String adminPwd; - - @NotBlank(message = "name should be valid") - @Size(min = 3, max = 30) - private String adminName; - - public AdminDomain toEntity() { - return AdminDomain.builder() - .adminId(this.getAdminId()) - .adminPwd(this.getAdminPwd()) - .adminName(this.getAdminName()) - .roles(Collections.singletonList("ROLE_ADMIN")) - .build(); - } -} diff --git a/src/main/java/com/moment/the/admin/dto/SignInDto.java b/src/main/java/com/moment/the/admin/dto/SignInDto.java deleted file mode 100644 index 10000835..00000000 --- a/src/main/java/com/moment/the/admin/dto/SignInDto.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.moment.the.admin.dto; - -import com.moment.the.admin.AdminDomain; -import lombok.*; - -import javax.validation.constraints.NotBlank; - -@Builder -@Getter @Setter -@AllArgsConstructor -@NoArgsConstructor -public class SignInDto { - @NotBlank(message = "id should be valid") - private String adminId; - @NotBlank(message = "password should be valid") - private String adminPwd; - - public AdminDomain toEntity(){ - return AdminDomain.builder() - .adminId(this.adminId) - .adminPwd(this.adminPwd) - .build(); - } -} diff --git a/src/main/java/com/moment/the/admin/repository/AdminRepository.java b/src/main/java/com/moment/the/admin/repository/AdminRepository.java deleted file mode 100644 index fc6a0bcc..00000000 --- a/src/main/java/com/moment/the/admin/repository/AdminRepository.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.moment.the.admin.repository; - -import com.moment.the.admin.AdminDomain; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface AdminRepository extends JpaRepository { - AdminDomain findByAdminId(String adminId); - AdminDomain findByAdminIdAndAdminPwd(String adminId, String password); -} diff --git a/src/main/java/com/moment/the/admin/service/AdminService.java b/src/main/java/com/moment/the/admin/service/AdminService.java deleted file mode 100644 index aad6498c..00000000 --- a/src/main/java/com/moment/the/admin/service/AdminService.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.moment.the.admin.service; - -import com.moment.the.admin.dto.AdminDto; -import com.moment.the.admin.dto.SignInDto; - -import java.util.Map; - -public interface AdminService { - void signUp(AdminDto adminDto) throws Exception; - Map loginUser(String id, String password) throws Exception; - void logout(); - void withdrawal(SignInDto SignInDto) throws Exception; -} diff --git a/src/main/java/com/moment/the/admin/service/AdminServiceImpl.java b/src/main/java/com/moment/the/admin/service/AdminServiceImpl.java deleted file mode 100644 index d4729a6d..00000000 --- a/src/main/java/com/moment/the/admin/service/AdminServiceImpl.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.moment.the.admin.service; - -import com.moment.the.admin.AdminDomain; -import com.moment.the.admin.dto.AdminDto; -import com.moment.the.admin.dto.SignInDto; -import com.moment.the.admin.repository.AdminRepository; -import com.moment.the.config.security.jwt.JwtUtil; -import com.moment.the.exceptionAdvice.exception.UserAlreadyExistsException; -import com.moment.the.exceptionAdvice.exception.UserNotFoundException; -import com.moment.the.util.RedisUtil; -import lombok.RequiredArgsConstructor; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Service; - -import java.util.HashMap; -import java.util.Map; - - -@Service -@RequiredArgsConstructor -public class AdminServiceImpl implements AdminService { - - private final AdminRepository adminRepository; - private final PasswordEncoder passwordEncoder; - private final RedisUtil redisUtil; - private final JwtUtil jwtUtil; - - @Override - public void signUp(AdminDto adminDto) { - if(adminRepository.findByAdminId(adminDto.getAdminId()) != null){ - throw new UserAlreadyExistsException(); - } - adminDto.setAdminPwd(passwordEncoder.encode(adminDto.getAdminPwd())); - adminRepository.save(adminDto.toEntity()); - } - - @Override - public Map loginUser(String id, String password) { - // 아이디 검증 - AdminDomain adminDomain = adminRepository.findByAdminId(id); - if (adminDomain == null) throw new UserNotFoundException(); - // 비밀번호 검증 - boolean passwordCheck = passwordEncoder.matches(password, adminDomain.getPassword()); - if (!passwordCheck) throw new UserNotFoundException(); - - final String accessToken = jwtUtil.generateAccessToken(adminDomain.getAdminId()); - final String refreshJwt = jwtUtil.generateRefreshToken(adminDomain.getAdminId()); - // token 만료 기간 설정 - redisUtil.setDataExpire(refreshJwt, adminDomain.getUsername(), JwtUtil.REFRESH_TOKEN_EXPIRATION_TIME); - Map map = new HashMap<>(); - map.put("id", adminDomain.getAdminId()); - map.put("accessToken", accessToken); // accessToken 반환 - map.put("refreshToken", refreshJwt); // refreshToken 반환 - - return map; - } - - // 로그아웃 - @Override - public void logout() { - String userEmail = this.getUserEmail(); - redisUtil.deleteData(userEmail); - } - - @Override - public void withdrawal(SignInDto signInDto) throws Exception { - // 로그인 된 이메일과 내가 삭제하려는 이메일이 같을 때. - if (getUserEmail().equals(signInDto.getAdminId())) { - AdminDomain adminDomain = adminRepository.findByAdminId(signInDto.getAdminId()); - adminRepository.delete(adminDomain); - } else { - throw new Exception("로그인 후 이용해주세요."); - } - } - - //현재 로그인 된 사용자의 ID를 Return - static public String getUserEmail() { - String userEmail; - Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); - if(principal instanceof UserDetails) { - userEmail = ((UserDetails) principal).getUsername(); - } else { - userEmail = principal.toString(); - } - return userEmail; - } -} diff --git a/src/main/java/com/moment/the/answer/AnswerDomain.java b/src/main/java/com/moment/the/answer/AnswerDomain.java deleted file mode 100644 index 5261cbd6..00000000 --- a/src/main/java/com/moment/the/answer/AnswerDomain.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.moment.the.answer; - - - -import com.moment.the.admin.AdminDomain; -import com.moment.the.answer.dto.AnswerDto; -import com.moment.the.table.TableDomain; -import com.sun.istack.NotNull; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import javax.persistence.*; - -import static javax.persistence.FetchType.*; - -@Table(name = "Answer") -@Entity -@Getter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class AnswerDomain { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long answerIdx; - - @Column(length = 1000, nullable = false) - @NotNull - private String answerContent; - - @OneToOne(mappedBy = "answerDomain", fetch = LAZY) - @JoinColumn(name = "boardIdx", nullable = false) - private TableDomain tableDomain; - - @ManyToOne(fetch = LAZY) - @JoinColumn(name="writer", nullable = false) - private AdminDomain adminDomain; - - // dirty checking. - public void update(AnswerDto answerDto) { - this.answerContent = answerDto.getContent(); - } - - public void updateTableDomain(TableDomain tableDomain){ - this.tableDomain = tableDomain; - this.tableDomain.updateAnswerDomain(this); - } -} diff --git a/src/main/java/com/moment/the/answer/controller/AnswerController.java b/src/main/java/com/moment/the/answer/controller/AnswerController.java deleted file mode 100644 index 3fa01da3..00000000 --- a/src/main/java/com/moment/the/answer/controller/AnswerController.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.moment.the.answer.controller; - - -import com.moment.the.answer.dto.AnswerDto; -import com.moment.the.answer.dto.AnswerResDto; -import com.moment.the.answer.service.AnswerService; -import com.moment.the.response.ResponseService; -import com.moment.the.response.result.CommonResult; -import com.moment.the.response.result.SingleResult; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - - -@RestController -@RequestMapping("/v1/top10") -@RequiredArgsConstructor -public class AnswerController { - private final AnswerService answerService; - private final ResponseService responseService; - - @PostMapping("/answer/{boardIdx}") - @ApiImplicitParams({ - @ApiImplicitParam(name = "Authorization", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header"), - @ApiImplicitParam(name = "RefreshToken", value = "로그인 성공 후 refresh_token", required = false, dataType = "String", paramType = "header") - }) - public CommonResult save(@RequestBody AnswerDto answerDto, @PathVariable Long boardIdx) throws Exception { - answerService.save(answerDto, boardIdx); - return responseService.getSuccessResult(); - } - - @PutMapping("/answer/{answerIdx}") - @ApiImplicitParams({ - @ApiImplicitParam(name = "Authorization", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header"), - @ApiImplicitParam(name = "RefreshToken", value = "로그인 성공 후 refresh_token", required = false, dataType = "String", paramType = "header") - }) - public CommonResult update(@RequestBody AnswerDto answerDto, @PathVariable Long answerIdx) throws Exception { - answerService.update(answerDto, answerIdx); - return responseService.getSuccessResult(); - } - - @GetMapping("/answer/{boardIdx}") - public SingleResult view(@PathVariable Long boardIdx) throws Exception{ - return responseService.getSingleResult(answerService.view(boardIdx)); - } - - @DeleteMapping("/answer/{answerIdx}") - @ApiImplicitParams({ - @ApiImplicitParam(name = "Authorization", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header"), - @ApiImplicitParam(name = "RefreshToken", value = "로그인 성공 후 refresh_token", required = false, dataType = "String", paramType = "header") - }) - public CommonResult delete(@PathVariable Long answerIdx) throws Exception { - answerService.delete(answerIdx); - return responseService.getSuccessResult(); - } -} diff --git a/src/main/java/com/moment/the/answer/dto/AnswerDto.java b/src/main/java/com/moment/the/answer/dto/AnswerDto.java deleted file mode 100644 index 9238db6d..00000000 --- a/src/main/java/com/moment/the/answer/dto/AnswerDto.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.moment.the.answer.dto; - -import com.fasterxml.jackson.annotation.JsonIgnore; - -import com.moment.the.admin.AdminDomain; -import com.moment.the.answer.AnswerDomain; -import lombok.*; - -@Builder -@Getter @Setter -@NoArgsConstructor @AllArgsConstructor -public class AnswerDto { - private String content; - - @JsonIgnore - private AdminDomain adminDomain; - - public AnswerDomain toEntity(){ - return AnswerDomain.builder() - .answerContent(this.content) - .adminDomain(this.adminDomain) - .build(); - } -} \ No newline at end of file diff --git a/src/main/java/com/moment/the/answer/dto/AnswerResDto.java b/src/main/java/com/moment/the/answer/dto/AnswerResDto.java deleted file mode 100644 index 5cd650ae..00000000 --- a/src/main/java/com/moment/the/answer/dto/AnswerResDto.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.moment.the.answer.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.*; - -@Builder -@Getter @Setter -@NoArgsConstructor @AllArgsConstructor -public class AnswerResDto { - - private Long answerIdx; - private String title; - @JsonProperty("answerContent") - private String content; - private String writer; - -} diff --git a/src/main/java/com/moment/the/answer/repository/AnswerRepository.java b/src/main/java/com/moment/the/answer/repository/AnswerRepository.java deleted file mode 100644 index fa519ea3..00000000 --- a/src/main/java/com/moment/the/answer/repository/AnswerRepository.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.moment.the.answer.repository; - - -import com.moment.the.admin.AdminDomain; -import com.moment.the.answer.AnswerDomain; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.Optional; - -@Repository -public interface AnswerRepository extends JpaRepository { - void deleteAllByAnswerIdx(Long answerIdx); - - Optional findByAdminDomain(AdminDomain adminDomain); - - AnswerDomain findTop1ByTableDomain_BoardIdx(Long boardIdx); -} diff --git a/src/main/java/com/moment/the/answer/service/AnswerService.java b/src/main/java/com/moment/the/answer/service/AnswerService.java deleted file mode 100644 index 83168e24..00000000 --- a/src/main/java/com/moment/the/answer/service/AnswerService.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.moment.the.answer.service; - -import com.moment.the.admin.AdminDomain; -import com.moment.the.admin.repository.AdminRepository; -import com.moment.the.admin.service.AdminServiceImpl; -import com.moment.the.answer.AnswerDomain; -import com.moment.the.answer.dto.AnswerDto; -import com.moment.the.answer.dto.AnswerResDto; -import com.moment.the.answer.repository.AnswerRepository; -import com.moment.the.exceptionAdvice.exception.*; -import com.moment.the.table.TableDomain; -import com.moment.the.table.repository.TableRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@RequiredArgsConstructor -public class AnswerService { - final private AdminRepository adminRepo; - final private AnswerRepository answerRepo; - final private TableRepository tableRepo; - - // 답변 작성하기 - public AnswerDomain save(AnswerDto answerDto, Long boardIdx) { - //예외 처리 - TableDomain tableDomain = tableFindBy(boardIdx); // table 번호로 찾고 없으면 Exception - boolean existAnswer = tableDomain.getAnswerDomain() != null ? true : false; - if(existAnswer) throw new AnswerAlreadyExistsException(); //이미 답변이 있으면 Exception - - AdminDomain adminDomain = adminRepo.findByAdminId(AdminServiceImpl.getUserEmail()); - - // AnswerDomain 생성 및 Table 과의 연관관계 맻음 - answerDto.setAdminDomain(adminDomain); - AnswerDomain saveAnswerDomain = answerDto.toEntity(); - saveAnswerDomain.updateTableDomain(tableDomain); - - AnswerDomain savedAnswerDomain = answerRepo.save(saveAnswerDomain); - - return savedAnswerDomain; - } - - // 답변 수정하기 - @Transactional - public AnswerDomain update(AnswerDto answerDto, Long answerIdx) { - AnswerDomain answerDomain = answerFindBy(answerIdx); // 해당하는 answer 찾기 - AdminDomain answerAdmin = answerDomain.getAdminDomain(); - AdminDomain loginAdmin = adminRepo.findByAdminId(AdminServiceImpl.getUserEmail()); - - answerOwnerCheck(answerAdmin, loginAdmin); // 자신이 작성한 답변인지 확인 - - // 답변 업데이트하기 - answerDomain.update(answerDto); - - return answerDomain; - } - - public AnswerResDto view(Long boardIdx) { - // 해당 boardIdx를 참조하는 answerDomain 찾기. - AnswerDomain answerDomain = answerRepo.findTop1ByTableDomain_BoardIdx(boardIdx); - - AnswerResDto answerResDto = AnswerResDto.builder() - .answerIdx(answerDomain.getAnswerIdx()) - .title(answerDomain.getTableDomain().getContent()) - .content(answerDomain.getAnswerContent()) - .writer(answerDomain.getAdminDomain().getAdminName()) - .build(); - - return answerResDto; - } - - // 답변 삭제하기 - @Transactional - public void delete(Long answerIdx) { - // 해당하는 answer 찾기 - AnswerDomain answerDomain = answerFindBy(answerIdx); - AdminDomain answerAdmin = answerDomain.getAdminDomain(); - - AdminDomain loginAdmin = adminRepo.findByAdminId(AdminServiceImpl.getUserEmail()); - answerOwnerCheck(answerAdmin, loginAdmin); // 자신이 작성한 답변인지 확인 - - // answer 삭제하기 - deleteAnswer(answerDomain); - } - - // answerIdx 로 해당 answer 찾기 - public AnswerDomain answerFindBy(Long answerId){ - return answerRepo.findById(answerId).orElseThrow(NoCommentException::new); - } - - // AdminDomain 로 해당 answer 찾기 - public AnswerDomain answerFindBy(AdminDomain adminDomain){ - return answerRepo.findByAdminDomain(adminDomain).orElseThrow(() -> new IllegalArgumentException("해당 답변은 없습니다.")); - } - - // tableIdx 로 해당 table 찾기 - public TableDomain tableFindBy(Long tableId){ - return tableRepo.findById(tableId).orElseThrow(NoPostException::new); - } - - public void deleteAnswer(AnswerDomain answerDomain){ - Long answerIdx = answerDomain.getAnswerIdx(); - answerDomain.getTableDomain().updateAnswerDomain(null); // 외래키 제약조건으로 인한 오류 해결 - answerRepo.deleteAllByAnswerIdx(answerIdx); - } - - public void answerOwnerCheck(AdminDomain answerAdmin, AdminDomain loginAdmin){ - boolean isAdminOwnerThisAnswer = answerAdmin == loginAdmin; - if(!isAdminOwnerThisAnswer) - throw new AccessNotFoundException(); - } -} diff --git a/src/main/java/com/moment/the/config/exception/MessageConfiguration.java b/src/main/java/com/moment/the/config/exception/MessageConfiguration.java deleted file mode 100644 index 9cebbbb0..00000000 --- a/src/main/java/com/moment/the/config/exception/MessageConfiguration.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.moment.the.config.exception; - -import net.rakugakibox.util.YamlResourceBundle; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.MessageSource; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.support.ResourceBundleMessageSource; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; -import org.springframework.web.servlet.i18n.SessionLocaleResolver; - -import java.util.Locale; -import java.util.MissingResourceException; -import java.util.ResourceBundle; - -@Configuration -public class MessageConfiguration implements WebMvcConfigurer { - - @Bean // 세션 지역설정 - public SessionLocaleResolver localResolver_s(){ - SessionLocaleResolver slr = new SessionLocaleResolver(); - slr.setDefaultLocale(Locale.KOREAN); - return slr; - } - - @Bean // 지역설정을 변경하는 인터셉터. - public LocaleChangeInterceptor localeChangeInterceptor(){ - LocaleChangeInterceptor lci = new LocaleChangeInterceptor(); - lci.setParamName("lang"); - return lci; - } - - @Override // 인터셉터를 시스템 레지스트리에 등록 - public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(localeChangeInterceptor()); - } - - @Bean - public MessageSource messageSource( - @Value("${spring.messages.basename}") String basename, - @Value("${spring.messages.encoding") String encoding - ){ - YamlMessageSource ms = new YamlMessageSource(); - ms.setBasename(basename); - ms.setDefaultEncoding(encoding); - ms.setAlwaysUseMessageFormat(true); - ms.setUseCodeAsDefaultMessage(true); - ms.setFallbackToSystemLocale(true); - return ms; - } - - // locale 정보에 따라 다른 yml 파일을 읽도록 처리 - private static class YamlMessageSource extends ResourceBundleMessageSource { - @Override - protected ResourceBundle doGetBundle(String basename, Locale locale) throws MissingResourceException { - return ResourceBundle.getBundle(basename, locale, YamlResourceBundle.Control.INSTANCE); - } - } -} diff --git a/src/main/java/com/moment/the/config/mvc/ExceptionHandlerFilter.java b/src/main/java/com/moment/the/config/mvc/ExceptionHandlerFilter.java deleted file mode 100644 index f3a8487f..00000000 --- a/src/main/java/com/moment/the/config/mvc/ExceptionHandlerFilter.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.moment.the.config.mvc; - -import com.moment.the.exceptionAdvice.ExceptionAdvice; -import com.moment.the.exceptionAdvice.exception.AccessTokenExpiredException; -import com.moment.the.exceptionAdvice.exception.InvalidTokenException; -import com.moment.the.exceptionAdvice.exception.UserNotFoundException; -import com.moment.the.response.ResponseService; -import com.moment.the.response.result.CommonResult; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -import javax.servlet.FilterChain; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -@Slf4j -@Component -@RequiredArgsConstructor -public class ExceptionHandlerFilter extends OncePerRequestFilter { - - private final ExceptionAdvice exceptionAdvice; - private final ResponseService resService; - - @Override - protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) { - try { - filterChain.doFilter(req, res); - }catch(InvalidTokenException e){ - setExceptionRes(HttpStatus.BAD_REQUEST, res, exceptionAdvice.invalidToken(req, e)); - }catch(AccessTokenExpiredException e){ - setExceptionRes(HttpStatus.BAD_REQUEST, res, exceptionAdvice.accessTokenExpiredException(req, e)); - }catch (UserNotFoundException e){ - setExceptionRes(HttpStatus.BAD_REQUEST, res, exceptionAdvice.userNotFoundException(req, e)); - } catch (Exception e){ - log.error("알 수 없는 에러 발생", e); - setExceptionRes(HttpStatus.INTERNAL_SERVER_ERROR, res, exceptionAdvice.defaultException(req, e)); - } - - - } - - // - public void setExceptionRes(HttpStatus status, HttpServletResponse res, CommonResult exceptionResult) { - res.setStatus(status.value()); - res.setContentType("application/json"); - - int exceptionCode = exceptionResult.getCode(); - String exceptionMsg = exceptionResult.getMsg(); - - try{ - String exceptionResultToJson = resService.getFailResultConvertString(exceptionCode, exceptionMsg); // CommonResult 에 있는 값을 json 으로 변환 - System.out.println(exceptionResultToJson); - res.getWriter().write(exceptionResultToJson); // filter 단에서 client 에 json 을 보넨다. - }catch (Exception e){ - e.printStackTrace(); - throw new UnknownError(); - } - } - -} diff --git a/src/main/java/com/moment/the/config/mvc/RequestResponseLoggingFilter.java b/src/main/java/com/moment/the/config/mvc/RequestResponseLoggingFilter.java deleted file mode 100644 index e40f2d72..00000000 --- a/src/main/java/com/moment/the/config/mvc/RequestResponseLoggingFilter.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.moment.the.config.mvc; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; -import org.springframework.web.util.ContentCachingRequestWrapper; -import org.springframework.web.util.ContentCachingResponseWrapper; -import org.springframework.web.util.WebUtils; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.UnsupportedEncodingException; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; - -@Slf4j -@Component -public class RequestResponseLoggingFilter extends OncePerRequestFilter { - - @Override - protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws ServletException, IOException { - ContentCachingResponseWrapper resWrapper = new ContentCachingResponseWrapper(res); - - log.info("[REQUEST] {} - {} {}", - req.getMethod(), req.getRequestURI(), resWrapper.getStatus() - ); - chain.doFilter(req, res); - } - -} diff --git a/src/main/java/com/moment/the/config/mvc/WebMvcConfigurerImpl.java b/src/main/java/com/moment/the/config/mvc/WebMvcConfigurerImpl.java deleted file mode 100644 index 7603eec6..00000000 --- a/src/main/java/com/moment/the/config/mvc/WebMvcConfigurerImpl.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.moment.the.config.mvc; - -import io.swagger.models.HttpMethod; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -@Configuration -public class WebMvcConfigurerImpl implements WebMvcConfigurer { - @Override - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/**") // 모든 요청에 대해서 - .allowedOrigins("https://the-moment.org", "https://www.the-moment.org", "https://server.the-moment.org") // local, docker - .allowedMethods( - HttpMethod.GET.name(), - HttpMethod.HEAD.name(), - HttpMethod.POST.name(), - HttpMethod.PUT.name(), - HttpMethod.DELETE.name(), - HttpMethod.OPTIONS.name() - ) - .maxAge(3600); - } - -} diff --git a/src/main/java/com/moment/the/config/security/SecurityConfiguration.java b/src/main/java/com/moment/the/config/security/SecurityConfiguration.java deleted file mode 100644 index da3f564b..00000000 --- a/src/main/java/com/moment/the/config/security/SecurityConfiguration.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.moment.the.config.security; - -import com.moment.the.config.mvc.ExceptionHandlerFilter; -import com.moment.the.config.security.jwt.JwtRequestFilter; -import lombok.RequiredArgsConstructor; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.builders.WebSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; -import org.springframework.security.config.http.SessionCreationPolicy; -import org.springframework.security.crypto.factory.PasswordEncoderFactories; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; - -@RequiredArgsConstructor -@EnableWebSecurity -@Configuration -public class SecurityConfiguration extends WebSecurityConfigurerAdapter { - - private final JwtRequestFilter jwtRequestFilter; - private final ExceptionHandlerFilter exceptionHandlerFilter; - - @Override - public void configure(WebSecurity web) { - web.ignoring().antMatchers("/**/api-docs", "/swagger-resources/**", - "/swagger-ui.html", "/webjars/**", "/swagger/**", "/h2-console/**", "/configuration/ui"); - } - - @Override - protected void configure(HttpSecurity http) throws Exception { - http - .cors().and() - .httpBasic().disable() - .csrf().disable() - .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) - .and() - .authorizeRequests() - .antMatchers("/v1/admin/**").authenticated() - .anyRequest().permitAll() - .and() - .exceptionHandling().accessDeniedHandler(null) //관리자 에러 - .and() - .exceptionHandling().authenticationEntryPoint(null) //로그인 에러 - .and() - .addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class) - .addFilterBefore(exceptionHandlerFilter, JwtRequestFilter.class); - } - - @Bean - public PasswordEncoder passwordEncoder(){ - return PasswordEncoderFactories.createDelegatingPasswordEncoder(); - } -} diff --git a/src/main/java/com/moment/the/config/security/auth/MyUserDetailsService.java b/src/main/java/com/moment/the/config/security/auth/MyUserDetailsService.java deleted file mode 100644 index 7151a07c..00000000 --- a/src/main/java/com/moment/the/config/security/auth/MyUserDetailsService.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.moment.the.config.security.auth; - -import com.moment.the.admin.AdminDomain; -import com.moment.the.admin.repository.AdminRepository; -import lombok.RequiredArgsConstructor; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; - -@RequiredArgsConstructor -@Service -public class MyUserDetailsService implements UserDetailsService { - private final AdminRepository adminRepository; - - @Override - public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { - AdminDomain adminDomain = adminRepository.findByAdminId(email); - return adminDomain; - } -} diff --git a/src/main/java/com/moment/the/config/security/jwt/JwtRequestFilter.java b/src/main/java/com/moment/the/config/security/jwt/JwtRequestFilter.java deleted file mode 100644 index 98ed5f9f..00000000 --- a/src/main/java/com/moment/the/config/security/jwt/JwtRequestFilter.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.moment.the.config.security.jwt; - -import com.moment.the.config.security.auth.MyUserDetailsService; -import com.moment.the.exceptionAdvice.exception.InvalidTokenException; -import com.moment.the.exceptionAdvice.exception.UserNotFoundException; -import io.jsonwebtoken.ExpiredJwtException; -import io.jsonwebtoken.MalformedJwtException; -import io.jsonwebtoken.UnsupportedJwtException; -import io.jsonwebtoken.security.SignatureException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -@Slf4j -@Component -@RequiredArgsConstructor -public class JwtRequestFilter extends OncePerRequestFilter { - private final MyUserDetailsService myUserDetailsService; - private final JwtUtil jwtUtil; - - @Override - protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) throws ServletException, IOException { - String accessToken = req.getHeader("Authorization"); - String refreshToken = req.getHeader("RefreshToken"); - - String userEmail; - - // Access Token이 null이면 검증할 필요가 없다. - if (accessToken != null) { - log.debug("=== accessToken 검증 시작 ==="); - - userEmail = accessTokenExtractEmail(accessToken); - if(userEmail != null) - registerUserInfoInSecurityContext(userEmail, req); - - // Access Token이 만료되고 Refresh Token이 존재해야지 새로운 AccessToken을 반한한다. - if(jwtUtil.isTokenExpired(accessToken) && refreshToken != null){ - log.debug("=== AccessToken 만료 ==="); - - String newAccessToken = generateNewAccessToken(refreshToken); - res.addHeader("JwtToken", newAccessToken); - - log.debug("=== AccessToken 발급 ==="); - } - } - filterChain.doFilter(req, res); - } - - /** - * accessToken에서 userEmail claim 값을 추출한다. - * - * @param accessToken Access Token - * @return userEmail - accessToken에서 정상적으로 email를 추출할때 user email을 반한한다. - * @throws InvalidTokenException - accessToken이 null이 아니고 올바르지 않을때 발생한다. - * @author 정시원 - */ - private String accessTokenExtractEmail(String accessToken) { - try { - if(jwtUtil.getTokenType(accessToken).equals(JwtUtil.TokenType.REFRESH_TOKEN.value)) - return accessToken; - else - return null; - } catch (IllegalArgumentException | ExpiredJwtException e) { - return null; - } catch (MalformedJwtException | UnsupportedJwtException | SignatureException e ) { - throw new InvalidTokenException(); - } - } - - /** - * user email로 사용자의 유무를 판단해 SecurityContext에 유저를 등록한다. - * - * @param userEmail - String - * @param req - HttpServletRequest - * @throws UserNotFoundException - 해당 사용자가 없을 경우 throw 된다. - * @author 정시원 - */ - private void registerUserInfoInSecurityContext(String userEmail, HttpServletRequest req) { - try { - UserDetails userDetails = myUserDetailsService.loadUserByUsername(userEmail); - - UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); - usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(req)); - SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken); - } catch (NullPointerException e) { - throw new UserNotFoundException(); - } - } - - /** - * @param refreshToken - 유저가 가지고 있는 refreshToken - * @return newAccessToken - 새로만든 AccessToken을 발급합니다. - * @throws InvalidTokenException RefreshToken이 올바르지 않을때 throws된다. - * @author 정시원 - */ - private String generateNewAccessToken(String refreshToken) { - try { - return jwtUtil.generateAccessToken(jwtUtil.getUserEmail(refreshToken)); - } catch (IllegalArgumentException | UnsupportedJwtException | SignatureException | MalformedJwtException | ExpiredJwtException e) { - throw new InvalidTokenException(); - } - } -} diff --git a/src/main/java/com/moment/the/config/security/jwt/JwtUtil.java b/src/main/java/com/moment/the/config/security/jwt/JwtUtil.java deleted file mode 100644 index 11e8dcde..00000000 --- a/src/main/java/com/moment/the/config/security/jwt/JwtUtil.java +++ /dev/null @@ -1,143 +0,0 @@ -package com.moment.the.config.security.jwt; - -import io.jsonwebtoken.*; -import io.jsonwebtoken.security.Keys; -import io.jsonwebtoken.security.SignatureException; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import java.nio.charset.StandardCharsets; -import java.security.Key; -import java.util.Date; - -@Component -public class JwtUtil { - @Value("${spring.jwt.secret}") - private String SECRET_KEY; - - public final static long ACCESS_TOKEN_EXPIRATION_TIME = 1000L * 3600 * 6; // milli_sec * hour * 6 = 6hour - public final static long REFRESH_TOKEN_EXPIRATION_TIME = 1000L * 3600 * 24 * 30 * 7; // milli_sec X hour X day X month * 7 = 7month - - enum TokenType{ - ACCESS_TOKEN("accessToken"), - REFRESH_TOKEN("refreshToken"); - String value; - - TokenType(String value) { this.value = value; } - } - - enum TokenClaimName{ - USER_EMAIL("userEmail"), - TOKEN_TYPE("tokenType"); - String value; - - TokenClaimName(String value) { this.value = value; } - } - - /** - * JWT에 넣을 비밀키를 인코딩하여 반환한다. - * @param secretKey 비밀키 - * @return secretKey - */ - private Key getSigningKey(String secretKey) { - byte[] keyBytes = secretKey.getBytes(StandardCharsets.UTF_8); - return Keys.hmacShaKeyFor(keyBytes); - } - - /** - * JWT에서 claims 추출하는 함수 - * @param token JWT - * @return Jwts - JwtToken의 Claims 값을 모두 추출한 Jwts객체 - * @throws ExpiredJwtException - JWT를 생성할 떄 지정한 유효기간을 초과할 때 발생힌다. - * @throws IllegalArgumentException - JWT이 비어있을때 발생한다. - * @throws MalformedJwtException - JWT가 올바르게 구성되지 않았을 떄 발생한다. - * @throws SignatureException - JWT의 기존 서명을 확인하지 못했을 때 - * @throws UnsupportedJwtException 예상하는 형식과 일치하지 않는 특정 형식이나 구성의 JWT일 때 - * @author 정시원 - */ - public Claims extractAllClaims(String token) throws ExpiredJwtException, IllegalArgumentException, MalformedJwtException, SignatureException, UnsupportedJwtException { - return Jwts.parserBuilder() - .setSigningKey(getSigningKey(SECRET_KEY)) - .build() - .parseClaimsJws(token) - .getBody(); - } - - /** - * 토큰의 userEmail claim에서 email를 추출한다. - * @param token JWT - * @return String email - * @author 정시원 - */ - public String getUserEmail(String token){ - return extractAllClaims(token).get(TokenClaimName.USER_EMAIL.value, String.class); - } - - /** - * 토큰의 tokenType claim에서 token type을 추출한다. - * @param token JWT - * @return String tokenType - * @author 정시원 - */ - public String getTokenType(String token){ - return extractAllClaims(token).get(TokenClaimName.TOKEN_TYPE.value, String.class); - } - - /** - * 토큰이 만료여부에 따라 true/false를 반환한다. - * @param token JWT - * @return true - 토큰이 만료되었을 때 - * @author 정시원 - */ - public Boolean isTokenExpired(String token) { - try{ - extractAllClaims(token).getExpiration(); - return false; - }catch(ExpiredJwtException e) { - return true; - } - } - - /** - * JWT를 만든다. - * @param userEmail JWT에 넣을 userEmail claim값 - * @param tokenType AccessToken, RefreshToken 구분 - * @param expireTime 만료시간 - * @return JWT - * @author 정시원 - */ - private String doGenerateToken(String userEmail, TokenType tokenType, long expireTime) { - final Claims claims = Jwts.claims(); - //AccessToken일 떄 TokenClaim에 UserEmail을 추가한다. - if(TokenType.ACCESS_TOKEN == tokenType) - claims.put("userEmail", userEmail); - claims.put("tokenType", tokenType.value); - return Jwts.builder() - .setClaims(claims) - .setIssuedAt(new Date(System.currentTimeMillis())) - .setExpiration(new Date(System.currentTimeMillis() + expireTime)) - .signWith(getSigningKey(SECRET_KEY), SignatureAlgorithm.HS256) - .compact(); - } - - /** - * AccessToken을 만든다. - * @param email 현재 사용자의 사용자의 email - * @return AccessToken - * @author 정시원 - */ - public String generateAccessToken(String email) { - return doGenerateToken(email, TokenType.ACCESS_TOKEN, ACCESS_TOKEN_EXPIRATION_TIME); - } - - /** - * RefreshToken을 만든다. - * @param email 현재 사용자의 email - * @return RefreshToken - * @author 정시원 - */ - public String generateRefreshToken(String email) { - return doGenerateToken(email, TokenType.REFRESH_TOKEN, REFRESH_TOKEN_EXPIRATION_TIME); - } - -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/ExceptionAdvice.java b/src/main/java/com/moment/the/exceptionAdvice/ExceptionAdvice.java deleted file mode 100644 index 87048747..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/ExceptionAdvice.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.moment.the.exceptionAdvice; - -import com.moment.the.exceptionAdvice.exception.*; -import com.moment.the.response.result.CommonResult; -import com.moment.the.response.ResponseService; -import lombok.RequiredArgsConstructor; -import org.springframework.context.MessageSource; -import org.springframework.context.i18n.LocaleContextHolder; -import org.springframework.http.HttpStatus; -import org.springframework.web.bind.MethodArgumentNotValidException; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -import javax.servlet.http.HttpServletRequest; - -@RequiredArgsConstructor -@RestControllerAdvice -public class ExceptionAdvice { - private final ResponseService responseService; - private final MessageSource messageSource; - - // code 정보에 해당하는 메시지를 조회한다. - private String getMessage(String code){ - return getMessage(code, null); - } - - // code 정보, 추가 argument로 현재 locale에 맞는 메시지를 조회합니다. - private String getMessage(String code, Object[] args){ - return messageSource.getMessage(code, args, LocaleContextHolder.getLocale()); - } - - // 예외 처리 메시지를 MessageSource 에서 가져오도록 수정 - @ExceptionHandler(Exception.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public CommonResult defaultException(HttpServletRequest request, Exception e){ - return responseService.getFailResult(Integer.valueOf(getMessage("unKnown.code")), e.getMessage()); - } - // 사용자를 찾을 수 없습니다. - @ExceptionHandler(UserNotFoundException.class) - @ResponseStatus(HttpStatus.NOT_FOUND) - public CommonResult userNotFoundException(HttpServletRequest request, UserNotFoundException e){ - return responseService.getFailResult(Integer.valueOf(getMessage("userNotFound.code")), getMessage("userNotFound.msg")); - } - // 유저가 이미 존재합니다. - @ExceptionHandler(UserAlreadyExistsException.class) - @ResponseStatus(HttpStatus.CONFLICT) - protected CommonResult userAlreadyExistsException(HttpServletRequest request, UserAlreadyExistsException e){ - return responseService.getFailResult(Integer.valueOf(getMessage("userAlreadyExists.code")), getMessage("userAlreadyExists.msg")); - } - // 해당 게시글을 찾을 수 없습니다. - @ExceptionHandler(NoPostException.class) - @ResponseStatus(HttpStatus.NOT_FOUND) - protected CommonResult noPostException(HttpServletRequest request, NoPostException e){ - return responseService.getFailResult(Integer.valueOf(getMessage("noPost.code")), getMessage("noPost.msg")); - } - // 해당 답변을 찾을 수 없습니다. - @ExceptionHandler(NoCommentException.class) - @ResponseStatus(HttpStatus.NOT_FOUND) - protected CommonResult noCommentException(HttpServletRequest request, NoCommentException e){ - return responseService.getFailResult(Integer.valueOf(getMessage("noComment.code")), getMessage("noComment.msg")); - } - // 해당 개선 사례를 찾을 수 없습니다. - @ExceptionHandler(NoImprovementException.class) - @ResponseStatus(HttpStatus.NOT_FOUND) - protected CommonResult noImprovementException(HttpServletRequest request, NoImprovementException e){ - return responseService.getFailResult(Integer.valueOf(getMessage("noImprovement.code")), getMessage("noImprovement.msg")); - } - // 요청 형식에 알맞지 않습니다.(MethodArgumentNotValidException) - @ExceptionHandler(MethodArgumentNotValidException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - protected CommonResult customMethodArgumentNotValidException(HttpServletRequest req, MethodArgumentNotValidException ex){ - return responseService.getFailResult(Integer.valueOf(getMessage("method-argument-not-valid.code")), getMessage("method-argument-not-valid.msg")); - } - // 요청 형식에 알맞지 않습니다.(CustomMethodArgumentNotValidException) - @ExceptionHandler(CustomMethodArgumentNotValidException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - protected CommonResult customMethodArgumentNotValidException(HttpServletRequest req, CustomMethodArgumentNotValidException ex){ - return responseService.getFailResult(Integer.valueOf(getMessage("method-argument-not-valid.code")), getMessage("method-argument-not-valid.msg")); - } - //추천할 수 없습니다. - @ExceptionHandler(GoodsNotCancelException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - protected CommonResult goodsNotCancelException(HttpServletRequest request, GoodsNotCancelException e){ - return responseService.getFailResult(Integer.valueOf(getMessage("goods-not-cancel.code")), getMessage("goods-not-cancel.msg")); - } - //accessToken 이 만료되었습니다. - @ExceptionHandler(AccessTokenExpiredException.class) - @ResponseStatus(HttpStatus.FORBIDDEN) - public CommonResult accessTokenExpiredException(HttpServletRequest req, AccessTokenExpiredException e){ - return responseService.getFailResult(Integer.valueOf(getMessage("access-token-expired.code")), getMessage("access-token-expired.msg")); - } - - //token(access, refresh)이 올바르지 않습니다.. - @ExceptionHandler(InvalidTokenException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public CommonResult invalidToken(HttpServletRequest req, InvalidTokenException e){ - return responseService.getFailResult(Integer.valueOf(getMessage("invalid-token.code")), getMessage("invalid-token.msg")); - } - - @ExceptionHandler(AnswerAlreadyExistsException.class) - @ResponseStatus(HttpStatus.CONFLICT) - protected CommonResult answerAlreadyExistsException(HttpServletRequest req, AnswerAlreadyExistsException e){ - return responseService.getFailResult(Integer.valueOf(getMessage("answer-already-exists.code")), getMessage("answer-already-exists.msg")); - } - - @ExceptionHandler(AccessNotFoundException.class) - @ResponseStatus(HttpStatus.FORBIDDEN) - protected CommonResult accessNotFoundException(HttpServletRequest req, AccessNotFoundException e){ - return responseService.getFailResult(Integer.valueOf(getMessage("access-not-found.code")), getMessage("access-not-found.msg")); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/controller/ExceptionController.java b/src/main/java/com/moment/the/exceptionAdvice/controller/ExceptionController.java deleted file mode 100644 index 8b000d99..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/controller/ExceptionController.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.moment.the.exceptionAdvice.controller; - -import com.moment.the.exceptionAdvice.exception.*; -import com.moment.the.response.result.CommonResult; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RequiredArgsConstructor -@RestController -@RequestMapping(value = "/exception") -public class ExceptionController { - // userNotFoundException - @GetMapping(value = "/userNotFound") - public CommonResult userNotFoundException() { - throw new UserNotFoundException(); - } - - @GetMapping(value = "/userAlreadyExists") - public CommonResult userAlreadyExistsException() { - throw new UserAlreadyExistsException(); - } - - @GetMapping(value = "/noPost") - public CommonResult noPostException() { - throw new NoPostException(); - } - - @GetMapping(value = "/noComment") - public CommonResult noCommentException() { - throw new NoCommentException(); - } - - @GetMapping(value = "/noImprovement") - public CommonResult noImprovement() { - throw new NoCommentException(); - } - - @GetMapping(value = "/method-argument-not-valid") - public CommonResult methodArgumentNotValid() { - throw new CustomMethodArgumentNotValidException(); - } - - @GetMapping(value = "/goods-not-cancel") - public CommonResult goodsNotCancel(){ - throw new GoodsNotCancelException(); - } - - @GetMapping(value = "/access-token-expired") - public CommonResult accessTokenExpired(){throw new AccessTokenExpiredException();} - - @GetMapping(value = "/invalid-token") - public CommonResult invalidToken(){throw new InvalidTokenException();} - - @GetMapping(value = "/answer-already-exists") - public CommonResult answerAlreadyExists(){throw new AnswerAlreadyExistsException();} - - @GetMapping(value = "/access-not-found") - public CommonResult accessNotFound(){throw new AccessNotFoundException();} -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/AccessNotFoundException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/AccessNotFoundException.java deleted file mode 100644 index 41c88c61..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/exception/AccessNotFoundException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.moment.the.exceptionAdvice.exception; - -public class AccessNotFoundException extends RuntimeException{ - public AccessNotFoundException(String msg, Throwable t){ - super(msg, t); - } - public AccessNotFoundException(String msg){ - super(msg); - } - public AccessNotFoundException(){ - super(); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/AccessTokenExpiredException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/AccessTokenExpiredException.java deleted file mode 100644 index 370be065..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/exception/AccessTokenExpiredException.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.moment.the.exceptionAdvice.exception; - -public class AccessTokenExpiredException extends RuntimeException{ - public AccessTokenExpiredException(String msg, Throwable t){ - super(msg, t); - } - public AccessTokenExpiredException(String msg){ - super(msg); - } - public AccessTokenExpiredException(){ - super(); - } - -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/AnswerAlreadyExistsException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/AnswerAlreadyExistsException.java deleted file mode 100644 index 8aaa8c4a..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/exception/AnswerAlreadyExistsException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.moment.the.exceptionAdvice.exception; - -public class AnswerAlreadyExistsException extends RuntimeException{ - public AnswerAlreadyExistsException(String msg, Throwable t){ - super(msg, t); - } - public AnswerAlreadyExistsException(String msg){ - super(msg); - } - public AnswerAlreadyExistsException(){ - super(); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/CustomMethodArgumentNotValidException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/CustomMethodArgumentNotValidException.java deleted file mode 100644 index 57522292..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/exception/CustomMethodArgumentNotValidException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.moment.the.exceptionAdvice.exception; - -public class CustomMethodArgumentNotValidException extends RuntimeException{ - public CustomMethodArgumentNotValidException(String msg, Throwable t){ - super(msg, t); - } - public CustomMethodArgumentNotValidException(String msg){ - super(msg); - } - public CustomMethodArgumentNotValidException(){ - super(); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/GoodsNotCancelException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/GoodsNotCancelException.java deleted file mode 100644 index 18298ed5..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/exception/GoodsNotCancelException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.moment.the.exceptionAdvice.exception; - -public class GoodsNotCancelException extends RuntimeException{ - public GoodsNotCancelException(String msg, Throwable t){ - super(msg, t); - } - public GoodsNotCancelException(String msg){ - super(msg); - } - public GoodsNotCancelException(){ - super(); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/InvalidTokenException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/InvalidTokenException.java deleted file mode 100644 index abb062c8..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/exception/InvalidTokenException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.moment.the.exceptionAdvice.exception; - -public class InvalidTokenException extends RuntimeException{ - public InvalidTokenException(String msg, Throwable t){ - super(msg, t); - } - public InvalidTokenException(String msg){ - super(msg); - } - public InvalidTokenException(){ - super(); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/NoCommentException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/NoCommentException.java deleted file mode 100644 index 205cf0a0..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/exception/NoCommentException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.moment.the.exceptionAdvice.exception; - -public class NoCommentException extends RuntimeException{ - public NoCommentException(String msg, Throwable t){ - super(msg, t); - } - public NoCommentException(String msg){ - super(msg); - } - public NoCommentException(){ - super(); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/NoGoodException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/NoGoodException.java deleted file mode 100644 index 8e393e6b..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/exception/NoGoodException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.moment.the.exceptionAdvice.exception; - -public class NoGoodException extends RuntimeException{ - public NoGoodException(String msg, Throwable t){ - super(msg, t); - } - public NoGoodException(String msg){ - super(msg); - } - public NoGoodException(){ - super(); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/NoImprovementException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/NoImprovementException.java deleted file mode 100644 index e63b5dbf..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/exception/NoImprovementException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.moment.the.exceptionAdvice.exception; - -public class NoImprovementException extends RuntimeException{ - public NoImprovementException(String msg, Throwable t){ - super(msg, t); - } - public NoImprovementException(String msg){ - super(msg); - } - public NoImprovementException(){ - super(); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/NoPostException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/NoPostException.java deleted file mode 100644 index d5f78315..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/exception/NoPostException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.moment.the.exceptionAdvice.exception; - -public class NoPostException extends RuntimeException{ - public NoPostException(String msg, Throwable t){ - super(msg, t); - } - public NoPostException(String msg){ - super(msg); - } - public NoPostException(){ - super(); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/UserAlreadyExistsException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/UserAlreadyExistsException.java deleted file mode 100644 index f4580879..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/exception/UserAlreadyExistsException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.moment.the.exceptionAdvice.exception; - -public class UserAlreadyExistsException extends RuntimeException{ - public UserAlreadyExistsException(String msg, Throwable t){ - super(msg, t); - } - public UserAlreadyExistsException(String msg){ - super(msg); - } - public UserAlreadyExistsException(){ - super(); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/UserNotFoundException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/UserNotFoundException.java deleted file mode 100644 index b1a55e09..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/exception/UserNotFoundException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.moment.the.exceptionAdvice.exception; - -public class UserNotFoundException extends RuntimeException{ - public UserNotFoundException(String msg, Throwable t){ - super(msg, t); - } - public UserNotFoundException(String msg){ - super(msg); - } - public UserNotFoundException(){ - super(); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/AccessNotFoundHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/AccessNotFoundHandler.java deleted file mode 100644 index 5cf2362b..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/handler/AccessNotFoundHandler.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.moment.the.exceptionAdvice.handler; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -public class AccessNotFoundHandler { - public void handle(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { - res.sendRedirect("/exception/access-not-found"); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/AccessTokenExpiredHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/AccessTokenExpiredHandler.java deleted file mode 100644 index 9a3de6a0..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/handler/AccessTokenExpiredHandler.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.moment.the.exceptionAdvice.handler; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -public class AccessTokenExpiredHandler { - public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - response.sendRedirect("/exception/access-token-expired"); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/AnswerAlreadyExistsHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/AnswerAlreadyExistsHandler.java deleted file mode 100644 index deaa2233..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/handler/AnswerAlreadyExistsHandler.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.moment.the.exceptionAdvice.handler; - - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -public class AnswerAlreadyExistsHandler { - public void handle(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { - res.sendRedirect("/exception/answer-already-exists"); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/CustomMethodArgumentNotValidHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/CustomMethodArgumentNotValidHandler.java deleted file mode 100644 index d1a965fc..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/handler/CustomMethodArgumentNotValidHandler.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.moment.the.exceptionAdvice.handler; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -public class CustomMethodArgumentNotValidHandler { - public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - response.sendRedirect("/exception/methodArgumentNotValid"); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/GoodsNotCancelHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/GoodsNotCancelHandler.java deleted file mode 100644 index 489e930b..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/handler/GoodsNotCancelHandler.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.moment.the.exceptionAdvice.handler; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -public class GoodsNotCancelHandler { - public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - response.sendRedirect("/exception/goods-not-cancel"); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/InvalidTokenHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/InvalidTokenHandler.java deleted file mode 100644 index 457dff73..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/handler/InvalidTokenHandler.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.moment.the.exceptionAdvice.handler; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -public class InvalidTokenHandler { - public void handle(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { - res.sendRedirect("/exception/invalid-token"); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/NoCommentHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/NoCommentHandler.java deleted file mode 100644 index afca8f2d..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/handler/NoCommentHandler.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.moment.the.exceptionAdvice.handler; - -import lombok.extern.slf4j.Slf4j; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -@Slf4j -public class NoCommentHandler { - public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - response.sendRedirect("/exception/noComment"); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/NoImprovementHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/NoImprovementHandler.java deleted file mode 100644 index ae8a1ea1..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/handler/NoImprovementHandler.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.moment.the.exceptionAdvice.handler; - -import lombok.extern.slf4j.Slf4j; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -@Slf4j -public class NoImprovementHandler { - public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - response.sendRedirect("/exception/noImprovement"); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/NoPostHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/NoPostHandler.java deleted file mode 100644 index 02a82b6f..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/handler/NoPostHandler.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.moment.the.exceptionAdvice.handler; - -import lombok.extern.slf4j.Slf4j; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -@Slf4j -public class NoPostHandler { - public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - response.sendRedirect("/exception/noPost"); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/UserAlreadyExistsHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/UserAlreadyExistsHandler.java deleted file mode 100644 index 46e46bca..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/handler/UserAlreadyExistsHandler.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.moment.the.exceptionAdvice.handler; - -import lombok.extern.slf4j.Slf4j; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -@Slf4j -public class UserAlreadyExistsHandler { - public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - response.sendRedirect("/exception/userNotFound"); - } -} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/UserNotFoundHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/UserNotFoundHandler.java deleted file mode 100644 index e9acb2ba..00000000 --- a/src/main/java/com/moment/the/exceptionAdvice/handler/UserNotFoundHandler.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.moment.the.exceptionAdvice.handler; - -import lombok.extern.slf4j.Slf4j; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -@Slf4j -public class UserNotFoundHandler { - public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { - response.sendRedirect("/exception/userAlreadyExists"); - } -} diff --git a/src/main/java/com/moment/the/improvement/ImprovementDomain.java b/src/main/java/com/moment/the/improvement/ImprovementDomain.java deleted file mode 100644 index c2a09c8b..00000000 --- a/src/main/java/com/moment/the/improvement/ImprovementDomain.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.moment.the.improvement; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.moment.the.admin.AdminDomain; -import com.moment.the.improvement.dto.ImprovementDto; -import lombok.*; - -import javax.persistence.*; - -@Table(name = "Improvement") -@Entity -@NoArgsConstructor -@AllArgsConstructor -@Getter -@Builder -// No setter!! -public class ImprovementDomain { - @Id - @Column - @GeneratedValue(strategy = GenerationType.IDENTITY) - @JsonIgnore - private Long improveIdx; - @Column - private String improveHeader; - @Column - private String improveContent; - - // 쿼리한번으로 improvement 정보만 가져오는 방법. - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name="adminIdx") - private AdminDomain adminDomain; - - // dirty checking. - public void update(ImprovementDto improvementDto) { - this.improveHeader = improvementDto.getImproveHeader(); - this.improveContent = improvementDto.getImproveContent(); - } -} diff --git a/src/main/java/com/moment/the/improvement/controller/ImprovementController.java b/src/main/java/com/moment/the/improvement/controller/ImprovementController.java deleted file mode 100644 index bbce1a57..00000000 --- a/src/main/java/com/moment/the/improvement/controller/ImprovementController.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.moment.the.improvement.controller; - -import com.moment.the.improvement.dto.ImprovementDto; -import com.moment.the.improvement.dto.ImprovementViewAllDto; -import com.moment.the.improvement.service.ImprovementService; -import com.moment.the.response.ResponseService; -import com.moment.the.response.result.CommonResult; -import com.moment.the.response.result.ListResult; -import io.swagger.annotations.ApiImplicitParam; -import io.swagger.annotations.ApiImplicitParams; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -@RestController -@RequestMapping("/v1") -@RequiredArgsConstructor -public class ImprovementController { - private final ImprovementService improvementService; - private final ResponseService responseService; - - // 개선사례작성 - @PostMapping("/solved") - @ApiImplicitParams({ - @ApiImplicitParam(name = "Authorization", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header"), - @ApiImplicitParam(name = "RefreshToken", value = "로그인 성공 후 refresh_token", required = false, dataType = "String", paramType = "header") - }) - public CommonResult save(@Valid @RequestBody ImprovementDto improvementDto){ - improvementService.save(improvementDto); - return responseService.getSuccessResult(); - } - - // 개선사례보기 - @GetMapping("/solved") - public ListResult view(){ - return responseService.getListResult(improvementService.read()); - } - - // 개선사례수정 - @PutMapping("/solved/{improveIdx}") - @ApiImplicitParams({ - @ApiImplicitParam(name = "Authorization", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header"), - @ApiImplicitParam(name = "RefreshToken", value = "로그인 성공 후 refresh_token", required = false, dataType = "String", paramType = "header") - }) - public CommonResult update(@RequestBody ImprovementDto improvementDto, @PathVariable Long improveIdx) { - improvementService.update(improvementDto, improveIdx); - return responseService.getSuccessResult(); - } - - // 개선사례삭제 - @DeleteMapping("/solved/{improveIdx}") - @ApiImplicitParams({ - @ApiImplicitParam(name = "Authorization", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header") - }) - public CommonResult delete(@PathVariable Long improveIdx) { - improvementService.delete(improveIdx); - return responseService.getSuccessResult(); - } -} diff --git a/src/main/java/com/moment/the/improvement/dto/ImprovementDto.java b/src/main/java/com/moment/the/improvement/dto/ImprovementDto.java deleted file mode 100644 index c165fcbe..00000000 --- a/src/main/java/com/moment/the/improvement/dto/ImprovementDto.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.moment.the.improvement.dto; - -import com.moment.the.admin.AdminDomain; -import com.moment.the.improvement.ImprovementDomain; -import lombok.*; - -import javax.validation.constraints.NotBlank; - - -@Getter -@Setter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class ImprovementDto { - @NotBlank - private String improveHeader; - @NotBlank - private String improveContent; - - public ImprovementDomain ToEntity(AdminDomain adminDomain){ - return ImprovementDomain.builder() - .improveHeader(this.getImproveHeader()) - .improveContent(this.getImproveContent()) - .adminDomain(adminDomain) - .build(); - } -} diff --git a/src/main/java/com/moment/the/improvement/dto/ImprovementViewAllDto.java b/src/main/java/com/moment/the/improvement/dto/ImprovementViewAllDto.java deleted file mode 100644 index 01147af1..00000000 --- a/src/main/java/com/moment/the/improvement/dto/ImprovementViewAllDto.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.moment.the.improvement.dto; - -import lombok.*; - -import javax.validation.constraints.NotBlank; - -@Getter @Setter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class ImprovementViewAllDto { - @NotBlank - private String improveIdx; - @NotBlank - private String improveHeader; - @NotBlank - private String improveContent; -} diff --git a/src/main/java/com/moment/the/improvement/repository/ImprovementRepository.java b/src/main/java/com/moment/the/improvement/repository/ImprovementRepository.java deleted file mode 100644 index 72405c63..00000000 --- a/src/main/java/com/moment/the/improvement/repository/ImprovementRepository.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.moment.the.improvement.repository; - -import com.moment.the.improvement.ImprovementDomain; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.List; - -@Repository -public interface ImprovementRepository extends JpaRepository { - // 해당 idx 찾기. - ImprovementDomain findByImproveIdx(Long improveIdx); - // 개시글 제목으로 찾기. - ImprovementDomain findByImproveContent(String content); - // 해당 idx 삭제하기. - void deleteAllByImproveIdx(Long improveIdx); - // 모든 idx 최신순으로 조회하기. - List findAllByOrderByImproveIdxDesc(); -} \ No newline at end of file diff --git a/src/main/java/com/moment/the/improvement/service/ImprovementService.java b/src/main/java/com/moment/the/improvement/service/ImprovementService.java deleted file mode 100644 index e72ce6a8..00000000 --- a/src/main/java/com/moment/the/improvement/service/ImprovementService.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.moment.the.improvement.service; - -import com.moment.the.admin.AdminDomain; -import com.moment.the.admin.repository.AdminRepository; -import com.moment.the.admin.service.AdminServiceImpl; -import com.moment.the.exceptionAdvice.exception.AccessNotFoundException; -import com.moment.the.exceptionAdvice.exception.UserNotFoundException; -import com.moment.the.improvement.ImprovementDomain; -import com.moment.the.improvement.dto.ImprovementDto; -import com.moment.the.improvement.dto.ImprovementViewAllDto; -import com.moment.the.improvement.repository.ImprovementRepository; -import lombok.RequiredArgsConstructor; -import org.modelmapper.ModelMapper; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; -import java.util.stream.Collectors; - -@Service -@RequiredArgsConstructor -public class ImprovementService { - private final ImprovementRepository improvementRepository; - private final AdminRepository adminRepository; - - // Create improvement. - @Transactional - public ImprovementDomain save(ImprovementDto improvementDto){ - try { - AdminDomain adminDomain = adminRepository.findByAdminId(AdminServiceImpl.getUserEmail()); - return improvementRepository.save(improvementDto.ToEntity(adminDomain)); - } catch (UserNotFoundException e){ - throw new UserNotFoundException(); - } - } - - // Read improvement. - public List read(){ - ModelMapper modelMapper = new ModelMapper(); - return improvementRepository.findAllByOrderByImproveIdxDesc().stream() - .map(m -> modelMapper.map(m, ImprovementViewAllDto.class)) - .collect(Collectors.toList()); - } - - // Update improvement. - @Transactional - public void update(ImprovementDto improvementDto, Long improveIdx){ - // 개선 사례 가져오기 - ImprovementDomain improvementDomain = improvementRepository.findByImproveIdx(improveIdx); - if(improvementDomain.getAdminDomain().getAdminId().equals(AdminServiceImpl.getUserEmail())){ - improvementDomain.update(improvementDto); - } else { - throw new AccessNotFoundException(); - } - } - - // Delete improvement. - @Transactional - public void delete(Long improveIdx){ - ImprovementDomain selectImprove = improvementRepository.findByImproveIdx(improveIdx); - if(selectImprove.getAdminDomain().getAdminId().equals(AdminServiceImpl.getUserEmail())){ - improvementRepository.delete(selectImprove); - } else { - throw new AccessNotFoundException(); - } - } -} diff --git a/src/main/java/com/moment/the/response/ResponseService.java b/src/main/java/com/moment/the/response/ResponseService.java deleted file mode 100644 index 9d2c922d..00000000 --- a/src/main/java/com/moment/the/response/ResponseService.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.moment.the.response; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.moment.the.response.result.CommonResult; -import com.moment.the.response.result.ListResult; -import com.moment.the.response.result.SingleResult; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.List; - -@Service -@RequiredArgsConstructor -public class ResponseService { - - public final ObjectMapper mapper; - - public enum CommonResponse{ - SUCCESS(200, "성공하였습니다"), - FAIL(-1, "실패하였습니다"); - - int code; - String msg; - - CommonResponse(int code, String msg) { - this.code = code; - this.msg = msg; - } - - public int getCode(){ - return code; - } - - public String getMsg(){ - return msg; - } - } - - // 단일건 결과를 처리하는 메소드 - public SingleResult getSingleResult(T data) { - SingleResult result = new SingleResult<>(); - result.setData(data); - setSuccessResult(result); - return result; - } - // 다중건 결과를 처리하는 메소드 - public ListResult getListResult(List list) { - ListResult result = new ListResult<>(); - result.setList(list); - setSuccessResult(result); - return result; - } - // 성공 결과만 처리하는 메소드 - public CommonResult getSuccessResult() { - CommonResult result = new CommonResult(); - setSuccessResult(result); - return result; - } - // 실패 결과만 처리하는 메소드 - public CommonResult getFailResult() { - CommonResult result = new CommonResult(); - result.setSuccess(false); - result.setCode(CommonResponse.FAIL.getCode()); - result.setMsg(CommonResponse.FAIL.getMsg()); - return result; - } - // 결과 모델에 api 요청 성공 데이터를 세팅해주는 메소드 - private void setSuccessResult(CommonResult result) { - result.setSuccess(true); - result.setCode(CommonResponse.SUCCESS.getCode()); - result.setMsg(CommonResponse.SUCCESS.getMsg()); - } - //getFailResult 메소드가 code, msg를 받을수 있도록 수정 - public CommonResult getFailResult(int code, String msg) { - CommonResult result = new CommonResult(); - result.setSuccess(false); - result.setCode(code); - result.setMsg(msg); - return result; - } - - public String getFailResultConvertString(int code, String msg) throws JsonProcessingException { - return mapper.writeValueAsString(getFailResult(code, msg)); - } -} diff --git a/src/main/java/com/moment/the/response/result/CommonResult.java b/src/main/java/com/moment/the/response/result/CommonResult.java deleted file mode 100644 index 2c8e165e..00000000 --- a/src/main/java/com/moment/the/response/result/CommonResult.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.moment.the.response.result; - -import io.swagger.annotations.ApiModelProperty; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class CommonResult { - @ApiModelProperty(value = "응답 성공여부") - private boolean success; - - @ApiModelProperty(value = "응답 코드 번호") - private int code; - - @ApiModelProperty(value = "응답 메시지") - private String msg; -} diff --git a/src/main/java/com/moment/the/response/result/ListResult.java b/src/main/java/com/moment/the/response/result/ListResult.java deleted file mode 100644 index d46b3809..00000000 --- a/src/main/java/com/moment/the/response/result/ListResult.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.moment.the.response.result; - -import lombok.Getter; -import lombok.Setter; - -import java.util.List; - -@Getter -@Setter -public class ListResult extends CommonResult { - private List list; -} \ No newline at end of file diff --git a/src/main/java/com/moment/the/response/result/SingleResult.java b/src/main/java/com/moment/the/response/result/SingleResult.java deleted file mode 100644 index e99a5031..00000000 --- a/src/main/java/com/moment/the/response/result/SingleResult.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.moment.the.response.result; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class SingleResult extends CommonResult { - private T data; -} diff --git a/src/main/java/com/moment/the/table/TableDomain.java b/src/main/java/com/moment/the/table/TableDomain.java deleted file mode 100644 index 782267c3..00000000 --- a/src/main/java/com/moment/the/table/TableDomain.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.moment.the.table; - -import com.moment.the.answer.AnswerDomain; -import lombok.*; - -import javax.persistence.*; - -import static javax.persistence.FetchType.*; - -@Table(name = "Board") -@Entity -@Getter -@NoArgsConstructor -@AllArgsConstructor -@Builder -public class TableDomain { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long boardIdx; - @Column - private String content; - @Column - private int goods; - - @OneToOne(fetch = LAZY, cascade = CascadeType.ALL) - private AnswerDomain answerDomain; - - public void updateGoods(int goods){ - this.goods = goods; - } - - public void updateAnswerDomain(AnswerDomain answerDomain){ - this.answerDomain = answerDomain; - } -} diff --git a/src/main/java/com/moment/the/table/controller/TableController.java b/src/main/java/com/moment/the/table/controller/TableController.java deleted file mode 100644 index 962968dd..00000000 --- a/src/main/java/com/moment/the/table/controller/TableController.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.moment.the.table.controller; - -import com.moment.the.response.ResponseService; -import com.moment.the.response.result.CommonResult; -import com.moment.the.response.result.ListResult; -import com.moment.the.response.result.SingleResult; -import com.moment.the.table.dto.TableDto; -import com.moment.the.table.dto.TableViewDto; -import com.moment.the.table.service.TableService; -import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -@RestController -@RequiredArgsConstructor -@RequestMapping("/v1") -public class TableController { - //Dependency Injection - private final TableService tableService; - private final ResponseService responseService; - - // localhost:8080/v1/uncomfortable - @PostMapping("/uncomfortable") - public CommonResult write(@Valid @RequestBody TableDto tableDto){ - tableService.write(tableDto); - return responseService.getSuccessResult(); - } - - // localhost:8080/v1/uncomfortable/top30 - @GetMapping("/uncomfortable/top30") - public ListResult top10(){ - return responseService.getListResult(tableService.top30View()); - } - - // localhost:8080/v1/uncomfortable - @GetMapping("/uncomfortable") - public ListResult viewAll(){ - return responseService.getListResult(tableService.viewAll()); - } - - // localhost:8080/v1/uncomfortable/{boardIdx} - @PutMapping("/uncomfortable/{boardIdx}") - public CommonResult goods(@PathVariable Long boardIdx){ - tableService.goods(boardIdx); - return responseService.getSuccessResult(); - } - - // localhost:8080/v1/uncomfortable/cancel/{boardIdx} - @PutMapping("/uncomfortable/cancel/{boardIdx}") - public CommonResult cancelGood(@PathVariable Long boardIdx){ - tableService.cancelGood(boardIdx); - return responseService.getSuccessResult(); - } - - // localhost:8080/v1/uncomfortable/amount - @GetMapping("/uncomfortable/amount") - public SingleResult amountUncomfortable(){ - return responseService.getSingleResult(tableService.amountUncomfortableView()); - } - - // localhost:8080/v1/uncomfortable/dateSinceProjectStart - @GetMapping("/uncomfortable/dateSinceProjectStart") - public SingleResult getDateSinceProjectStart(){ - return responseService.getSingleResult(tableService.dateSinceProjectStart()); - } -} diff --git a/src/main/java/com/moment/the/table/dto/AmountUncomfortableDto.java b/src/main/java/com/moment/the/table/dto/AmountUncomfortableDto.java deleted file mode 100644 index cabe21ff..00000000 --- a/src/main/java/com/moment/the/table/dto/AmountUncomfortableDto.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.moment.the.table.dto; - - -import lombok.*; - -import javax.validation.constraints.NotBlank; - -@Getter @Setter -@Builder -@AllArgsConstructor -@NoArgsConstructor -public class AmountUncomfortableDto { - @NotBlank - private Long boardIdx; -} diff --git a/src/main/java/com/moment/the/table/dto/TableDto.java b/src/main/java/com/moment/the/table/dto/TableDto.java deleted file mode 100644 index 74a071bf..00000000 --- a/src/main/java/com/moment/the/table/dto/TableDto.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.moment.the.table.dto; - -import com.moment.the.table.TableDomain; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import javax.validation.constraints.NotBlank; - - -@Getter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class TableDto { - @NotBlank - private String content; - - public TableDomain toEntity(){ - return TableDomain.builder() - .content(this.content) - .build(); - } -} diff --git a/src/main/java/com/moment/the/table/dto/TableViewDto.java b/src/main/java/com/moment/the/table/dto/TableViewDto.java deleted file mode 100644 index 32e92d0a..00000000 --- a/src/main/java/com/moment/the/table/dto/TableViewDto.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.moment.the.table.dto; - -import com.moment.the.answer.AnswerDomain; -import lombok.*; - -@Builder -@Getter @Setter -@NoArgsConstructor @AllArgsConstructor -public class TableViewDto { - - private Long boardIdx; - private String content; - private int goods; - private boolean isAnswer; - - public TableViewDto(Long boardIdx, String content, int goods, AnswerDomain answer){ - this.boardIdx = boardIdx; - this.content = content; - this.goods = goods; - this.isAnswer = answer != null; - } - -} diff --git a/src/main/java/com/moment/the/table/repository/TableRepository.java b/src/main/java/com/moment/the/table/repository/TableRepository.java deleted file mode 100644 index 7404b930..00000000 --- a/src/main/java/com/moment/the/table/repository/TableRepository.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.moment.the.table.repository; - -import com.moment.the.table.TableDomain; -import com.moment.the.table.dto.TableViewDto; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; - -@Repository -public interface TableRepository extends JpaRepository{ - // idx로 table 찾기. - Optional findByBoardIdx(Long boardIdx); - - @Query(value = "SELECT COUNT(table.boardIdx) " + - "FROM TableDomain table" ) - Long amountUncomfortable(); - - @Query("SELECT new com.moment.the.table.dto.TableViewDto(table.boardIdx, table.content, table.goods, answer)" + - "FROM TableDomain table LEFT JOIN table.answerDomain answer " + - "ORDER BY table.boardIdx DESC " - ) - List tableViewAll(); - - @Query("SELECT new com.moment.the.table.dto.TableViewDto(table.boardIdx, table.content, table.goods, answer)" + - "FROM TableDomain table LEFT JOIN table.answerDomain answer " + - "ORDER BY table.goods DESC " - ) - List tableViewTopBy(Pageable p); -} diff --git a/src/main/java/com/moment/the/table/service/TableService.java b/src/main/java/com/moment/the/table/service/TableService.java deleted file mode 100644 index a92c630c..00000000 --- a/src/main/java/com/moment/the/table/service/TableService.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.moment.the.table.service; - -import com.moment.the.exceptionAdvice.exception.GoodsNotCancelException; -import com.moment.the.exceptionAdvice.exception.NoPostException; -import com.moment.the.table.TableDomain; -import com.moment.the.table.dto.TableDto; -import com.moment.the.table.dto.TableViewDto; -import com.moment.the.table.repository.TableRepository; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.PageRequest; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDate; -import java.time.temporal.ChronoUnit; -import java.util.List; - -@Slf4j -@RequiredArgsConstructor -@Service -public class TableService { - private final TableRepository tableRepository; - - // 작성하기. - @Transactional - public TableDomain write(TableDto tableDto){ - return tableRepository.save(tableDto.toEntity()); - } - - // Top 30 보여주기. - public List top30View() { - return tableRepository.tableViewTopBy(PageRequest.of(0,30)); - } - - // 전체 페이지 보여주기. - public List viewAll(){ - return tableRepository.tableViewAll(); - } - - // 전체 게시물 개수 보여주기. - public Long amountUncomfortableView(){ - return tableRepository.amountUncomfortable(); - } - - // 프로젝트 시작 이후 날짜 보여주기. - public int dateSinceProjectStart(){ - return calculateAfterDate(); - } - - // 좋아요 수 증가. - @Transactional - public void goods(Long boardIdx){ - TableDomain tableDomain = tableRepository.findByBoardIdx(boardIdx).orElseThrow(NoPostException::new); - tableDomain.updateGoods(tableDomain.getGoods()+1); - } - - // 좋아요 수 감소. - @Transactional - public void cancelGood(Long boardIdx) { - TableDomain tableDomain = tableRepository.findByBoardIdx(boardIdx).orElseThrow(NoPostException::new); - int goodsResult = tableDomain.getGoods() - 1; - - if(goodsResult > -1) {//좋야요가 양수일때 - tableDomain.updateGoods(goodsResult); - }else{ - throw new GoodsNotCancelException(); - } - } - - // day 수 계산하기 - public static int calculateAfterDate(){ - /** - * today: 오늘 날짜 - * theMomentStart: the-moment 시작 날짜 - */ - LocalDate today = LocalDate.now(); - LocalDate theMomentStart = LocalDate.of(2021, 6, 7); - - // the_moment 프로젝트를 시작한 날짜 by 오늘의 날짜 - int period = (int) theMomentStart.until(today, ChronoUnit.DAYS); - - return period; - } -} diff --git a/src/main/java/com/moment/the/util/RedisUtil.java b/src/main/java/com/moment/the/util/RedisUtil.java deleted file mode 100644 index 6fd1d93b..00000000 --- a/src/main/java/com/moment/the/util/RedisUtil.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.moment.the.util; - - -import lombok.RequiredArgsConstructor; -import org.springframework.data.redis.core.StringRedisTemplate; -import org.springframework.data.redis.core.ValueOperations; -import org.springframework.stereotype.Component; - -import java.time.Duration; - -@RequiredArgsConstructor -@Component -public class RedisUtil { - - private final StringRedisTemplate stringRedisTemplate; - - public String getData(String key){ - ValueOperations valueOperations = stringRedisTemplate.opsForValue(); - return valueOperations.get(key); - } - - public void setData(String key, String value){ - ValueOperations valueOperations = stringRedisTemplate.opsForValue(); - valueOperations.set(key,value); - } - - public void setDataExpire(String key,String value,long duration){ - ValueOperations valueOperations = stringRedisTemplate.opsForValue(); - Duration expireDuration = Duration.ofSeconds(duration); - valueOperations.set(key, value, expireDuration); - } - - public void deleteData(String key){ - stringRedisTemplate.delete(key); - } -} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml deleted file mode 100644 index 08c551a4..00000000 --- a/src/main/resources/application.yml +++ /dev/null @@ -1,65 +0,0 @@ -server: - #포트 - port: 8080 - # UTF-8 사용 - servlet: - encoding: - charset: UTF-8 - enabled: true - force: true - -logging: - level: - com.moment.the.config.mvc.RequestResponseLoggingFilter: debug - org.hibernate.SQL: debug - org.hibernate.type: trace - charset: - console: UTF-8 - file: - name: ./logs/product.log - path: ./logs/product.log - logback: - rollingpolicy: - file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}-%i.log - max-file-size: 500MB - max-history: 1 - -spring: - #H2 DataBase - h2: - console: - enabled: true - path: /h2-console - settings: - web-allow-others: true - - #DB 설정 - datasource: - url: jdbc:h2:mem:the_moment - driver-class-name: org.h2.Driver - username: sa - - #JPA 설정 - jpa: - database-platform: org.hibernate.dialect.H2Dialect - properties: - hibernate: - show_sql: true - format_sql: true - hbm2ddl: - auto: update - show-sql: true - - #Message 설정 - messages: - basename: i18n/exception - encoding: UTF-8 - - # Redis - redis: - image: redis:latest - host: localhost - port: 6379 - - jwt: - secret: asdkfhksldjhfkajsdhfasd7df67sa8d6f87as6df86sa8d7f6a8ds6f87a9s6d8f76sad87f687ad6f8asd76f8asd6f8asd6f87sd6f87asd6f87s \ No newline at end of file diff --git a/src/main/resources/i18n/exception_en.yml b/src/main/resources/i18n/exception_en.yml deleted file mode 100644 index f8e42951..00000000 --- a/src/main/resources/i18n/exception_en.yml +++ /dev/null @@ -1,47 +0,0 @@ -unKnown: - code: "-9999" - msg: "Unknown error" - -userNotFound: - code: "-1000" - msg: "User could not be found." - -userAlreadyExists: - code: "-999" - msg: "The user already exists." - -noPost: - code: "-888" - msg: "I can't find the post." - -noComment: - code: "-777" - msg: "I can't find that answer." - -answer-already-exists: - code: "-776" - msg: "Corresponding 'Inconvenient Moment' already have an answer." - -access-not-found: - code: "-775" - msg: "You do not have access to this resource." - -noImprovement: - code: "-666" - msg: "No such improvement can be found." - -method-argument-not-valid: - code: "-555" - msg: "Invalid format for request." - -goods-not-cancel: - code: "-444" - msg: "Unable to cancel recommendation." - -invalid-token: - code: "-300" - msg: "The token is not valid." - -access-token-expired: - code: "-301" - msg: "The access token has expired." \ No newline at end of file diff --git a/src/main/resources/i18n/exception_ko.yml b/src/main/resources/i18n/exception_ko.yml deleted file mode 100644 index 847c9515..00000000 --- a/src/main/resources/i18n/exception_ko.yml +++ /dev/null @@ -1,47 +0,0 @@ -unKnown: - code: "-9999" - msg: "알 수 없는 오류" - -userNotFound: - code: "-1000" - msg: "사용자를 찾을 수 없습니다." - -userAlreadyExists: - code: "-999" - msg: "유저가 이미 존재합니다." - -noPost: - code: "-888" - msg: "해당 게시글을 찾을 수 없습니다." - -noComment: - code: "-777" - msg: "해당 답변을 찾을 수 없습니다." - -answer-already-exists: - code: "-776" - msg: "해당 '불편한 순간' 에 대한 답변이 이미 있습니다." - -access-not-found: - code: "-775" - msg: "해당 리소스에 대한 액세스 권한이 없습니다." - -noImprovement: - code: "-666" - msg: "해당 개선 사례를 찾을 수 없습니다." - -method-argument-not-valid: - code: "-555" - msg: "요청 형식에 알맞지 않습니다." - -goods-not-cancel: - code: "-444" - msg: "추천을 취소할 수 없습니다." - -invalid-token: - code: "-300" - msg: "토큰이 올바르지 않습니다." - -access-token-expired: - code: "-301" - msg: "엑세스 토큰이 만료되었습니다." \ No newline at end of file diff --git a/src/test/java/com/moment/the/TheApplicationTests.java b/src/test/java/com/moment/the/TheApplicationTests.java deleted file mode 100644 index 973ca70f..00000000 --- a/src/test/java/com/moment/the/TheApplicationTests.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.moment.the; - -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.transaction.annotation.Transactional; - -@SpringBootTest -@Transactional -class TheApplicationTests { -} \ No newline at end of file diff --git a/src/test/java/com/moment/the/controller/release/TableControllerTest.java b/src/test/java/com/moment/the/controller/release/TableControllerTest.java deleted file mode 100644 index 3bfdba89..00000000 --- a/src/test/java/com/moment/the/controller/release/TableControllerTest.java +++ /dev/null @@ -1,237 +0,0 @@ -package com.moment.the.controller.release; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.moment.the.table.controller.TableController; -import com.moment.the.table.TableDomain; -import com.moment.the.response.ResponseService; -import com.moment.the.table.dto.TableDto; -import com.moment.the.table.dto.TableViewDto; -import com.moment.the.table.repository.TableRepository; -import com.moment.the.table.service.TableService; -import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.RandomStringUtils; -import org.junit.jupiter.api.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.filter.CharacterEncodingFilter; - -import java.time.LocalDate; -import java.time.Period; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static org.hamcrest.core.StringContains.containsString; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; - - -@SpringBootTest -@DisplayName("TableController 테스트") -@Transactional -@Slf4j -class TableControllerTest { - - MockMvc mockMvc; - ResultActions resultActions; - @Autowired - TableController tableController; - @Autowired ResponseService resService; - @Autowired TableRepository tableRepo; - @Autowired TableService tableService; - - @BeforeEach - void setUp() { - mockMvc = MockMvcBuilders.standaloneSetup(tableController) - .addFilters(new CharacterEncodingFilter("UTF-8", true)) // utf-8 필터 추가 - .build(); - } - - @AfterEach - void showRequestResponse() throws Exception { - log.info("Request Response result"); - resultActions.andDo(print()); - resultActions = null; - } - - String objectToJson(Object object) throws JsonProcessingException { - return new ObjectMapper().writeValueAsString(object); - } - - @Test @DisplayName("[POST]/v1/uncomfortable write 검증") - void write_검증() throws Exception { - // Given - TableDto tableDto = new TableDto("학교가 밥이 너무 맛이 없어요"); - String tableDtoConvertJson = objectToJson(tableDto); - - // When - resultActions = mockMvc.perform( - post("/v1/uncomfortable") - .content(tableDtoConvertJson) - .contentType(MediaType.APPLICATION_JSON) - ); - - // Then - String successMsg = objectToJson(resService.getSuccessResult()); - resultActions - .andExpect(status().is2xxSuccessful()) - .andExpect(content().string(successMsg)) - ; - } - - @Test @DisplayName("[GET]/v1/uncomfortable viewAll 검증") - void viewAll_검증() throws Exception { - // Given - // 랜덤한 문자열 생성 - final List TABLE_CONTENTS = Stream.generate( - () -> RandomStringUtils.randomAlphabetic(15)) - .limit(3) - .collect(Collectors.toList()); - - AtomicInteger i = new AtomicInteger(0); - List tableDomains = Stream.generate( - () -> TableDomain.builder() - .goods(0) - .content(TABLE_CONTENTS.get(i.getAndIncrement())) - .build() - ).limit(3).collect(Collectors.toList()); - tableRepo.saveAll(tableDomains); - - // When - resultActions = mockMvc.perform( - get("/v1/uncomfortable") - .contentType(MediaType.APPLICATION_JSON) - ); - - // Than - resultActions - .andExpect(status().is2xxSuccessful()) - .andExpect(content().string(containsString(TABLE_CONTENTS.get(0)))) - .andExpect(content().string(containsString(TABLE_CONTENTS.get(1)))) - .andExpect(content().string(containsString(TABLE_CONTENTS.get(2)))) - ; - } - - @Test @DisplayName("[GET]/uncomfortable/top30 top30 검증") - void top30_검증() throws Exception { - //Given - AtomicInteger i = new AtomicInteger(1); - List tableDomains = Stream.generate( - () -> TableDomain.builder() - .goods(i.getAndIncrement()) - .content(RandomStringUtils.randomAlphabetic(15)) - .build() - ).limit(40).collect(Collectors.toList()); - - tableRepo.saveAll(tableDomains); - List tableViewDtos = tableService.top30View(); - String top30Data = objectToJson(tableViewDtos); - - //When - resultActions = mockMvc.perform( - get("/v1/uncomfortable/top30") - .contentType(MediaType.APPLICATION_JSON) - ); - - //Then - resultActions - .andExpect(status().is2xxSuccessful()) - .andExpect(content().string(containsString(top30Data))) - ; - } - @Test @DisplayName("[PUT]/v1/uncomfortable/{boardIdx} goods 추가") - void goods_검증() throws Exception { - //Given - TableDomain tableDomain = TableDomain.builder() - .content("학교 급식이 맛이 없어요") - .build(); - Long tableIdx = tableRepo.save(tableDomain).getBoardIdx(); - - //When - resultActions = mockMvc.perform( - put("/v1/uncomfortable/" + tableIdx.longValue()) - .contentType(MediaType.APPLICATION_JSON) - ); - - //Than - resultActions - .andExpect(status().is2xxSuccessful()) - .andExpect(content().string(objectToJson(resService.getSuccessResult()))) - ; - } - - @Test @DisplayName("[PUT]/v1/uncomfortable/cancel/{boardIdx} goods 감소") - void goodCancel_검증() throws Exception { - //Given - TableDomain tableDomain = TableDomain.builder() - .content("학교 급식이 맛이 없어요") - .goods(1) - .build(); - Long tableIdx = tableRepo.save(tableDomain).getBoardIdx(); - - //When - resultActions = mockMvc.perform( - put("/v1/uncomfortable/cancel/" + tableIdx.longValue()) - .contentType(MediaType.APPLICATION_JSON) - ); - - //Than - resultActions - .andExpect(status().is2xxSuccessful()) - .andExpect(content().string(objectToJson(resService.getSuccessResult()))) - ; - } - - @Test @DisplayName("[GET]/v1/uncomfortable/amount ") - void amountUncomfortable_검증() throws Exception { - //Given - List tableDomains = Stream.generate( - () -> TableDomain.builder() - .content(RandomStringUtils.randomAlphabetic(15)) - .build() - ).limit(8).collect(Collectors.toList()); - tableRepo.saveAll(tableDomains); - - //When - resultActions = mockMvc.perform( - get("/v1/uncomfortable/amount") - .contentType(MediaType.APPLICATION_JSON) - ); - - //Then - resultActions - .andExpect(status().is2xxSuccessful()) - .andExpect(jsonPath("$.data").value(8)) - ; - } - - @Disabled - @Test @DisplayName("[GET]/v1/uncomfortable/dateSinceProjectStart") - void dateSinceProjectStart_검증() throws Exception { - //Given - LocalDate startTheMoment = LocalDate.of(2021,6,7); - LocalDate currentDate = LocalDate.now(); - - Period period = startTheMoment.until(currentDate); - - int dateSinceProjectStart = period.getDays()+1; - - //When - resultActions = mockMvc.perform( - get("/v1/uncomfortable/dateSinceProjectStart") - .contentType(MediaType.APPLICATION_JSON) - ); - - //Then - resultActions - .andExpect(jsonPath("$.data").value(dateSinceProjectStart)); - } -} \ No newline at end of file diff --git a/src/test/java/com/moment/the/improvement/service/ImprovementServiceTest.java b/src/test/java/com/moment/the/improvement/service/ImprovementServiceTest.java deleted file mode 100644 index 388dd29b..00000000 --- a/src/test/java/com/moment/the/improvement/service/ImprovementServiceTest.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.moment.the.improvement.service; - -import com.moment.the.admin.AdminDomain; -import com.moment.the.admin.dto.AdminDto; -import com.moment.the.admin.repository.AdminRepository; -import com.moment.the.admin.service.AdminService; -import com.moment.the.improvement.dto.ImprovementDto; -import com.moment.the.improvement.repository.ImprovementRepository; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.transaction.annotation.Transactional; - -import java.awt.*; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -@SpringBootTest -@Transactional -class ImprovementServiceTest { - @Autowired - private ImprovementRepository improvementRepository; - @Autowired - private ImprovementService improvementService; - @Autowired - private AdminService adminService; - @Autowired - private AdminRepository adminRepository; - @AfterEach - void deleteData(){ - improvementRepository.deleteAll(); - } - - // test 편의를 위한 회원가입 매서드 - void adminSignUp(String adminId, String password, String adminName) throws Exception { - AdminDto adminDto = new AdminDto(adminId, password, adminName); - adminService.signUp(adminDto); - } - - // test 편의를 위한 로그인 매서드 - AdminDomain adminLogin(String adminId, String password) throws Exception { - AdminDomain adminDomain = adminRepository.findByAdminId(adminId); - UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( - adminDomain.getAdminId(), - adminDomain.getAdminPwd(), - List.of(new SimpleGrantedAuthority("ROLE_USER"))); - SecurityContext context = SecurityContextHolder.getContext(); - context.setAuthentication(token); - - return adminDomain; - } - - @Test - void 실제개선사례작성() throws Exception { - //Given admin - String email = "asdf@gsm"; - String pw = "1234"; - String name = "jihwan"; - adminSignUp(email, pw, name); - adminLogin(email, pw); - - //Given improvement - ImprovementDto improvementDto = new ImprovementDto(); - improvementDto.setImproveContent("Hello world"); - improvementDto.setImproveContent("it's jihwan"); - - //when - improvementService.save(improvementDto); - - //then - assertEquals(false, improvementRepository.findByImproveContent("it's jihwan") == null); - assertEquals(true, improvementRepository.findByImproveContent("it's jihwan").getAdminDomain().getAdminId().equals("asdf@gsm")); - } - -} \ No newline at end of file diff --git a/src/test/java/com/moment/the/service/AdminServiceImplTest.java b/src/test/java/com/moment/the/service/AdminServiceImplTest.java deleted file mode 100644 index dc399b78..00000000 --- a/src/test/java/com/moment/the/service/AdminServiceImplTest.java +++ /dev/null @@ -1,240 +0,0 @@ -package com.moment.the.service; - -import com.moment.the.admin.dto.AdminDto; -import com.moment.the.admin.dto.SignInDto; -import com.moment.the.admin.repository.AdminRepository; -import com.moment.the.admin.service.AdminService; -import com.moment.the.admin.service.AdminServiceImpl; -import com.moment.the.exceptionAdvice.exception.UserNotFoundException; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.crypto.password.PasswordEncoder; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; - -@SpringBootTest -public class AdminServiceImplTest { - @AfterEach - public void dataClean(){ - adminRepository.deleteAll(); - } - @Autowired - private PasswordEncoder passwordEncoder; - @Autowired - private AdminRepository adminRepository; - @Autowired - private AdminService adminService; - @Autowired - private AdminServiceImpl adminServiceImpl; - - @Test - void 회원가입(){ - //Given - AdminDto adminDto = new AdminDto(); - String email = "s20062@gsm.hs.kr"; - String adminName = "jihwan"; - String pw = "1234"; - - //when - adminDto.setAdminPwd(passwordEncoder.encode(pw)); - adminDto.setAdminId(email); - adminDto.setAdminName(adminName); - adminRepository.save(adminDto.toEntity()); - - //then - assertEquals(adminDto.getAdminId(), email); - assertEquals(passwordEncoder.matches(pw,adminDto.getAdminPwd()), true); - assertEquals(adminDto.getAdminName(), "jihwan"); - } - - @Test - void 이_사용자가_있나요(){ - //Given - AdminDto adminDto = new AdminDto(); - String alreadyEmail = "asdf@asdf"; - String email = "asdf@asdf"; - adminDto.setAdminId(alreadyEmail); - - //when - adminRepository.save(adminDto.toEntity()); - - //then - assertEquals(adminRepository.findByAdminId(email) == null , false); - - } - - @Test - void 로그인_하겠습니다(){ - //Given - AdminDto adminDto = new AdminDto(); - - String id = "s20062@gsm"; - adminDto.setAdminId(id); - - String pw = "1234"; - adminDto.setAdminPwd(passwordEncoder.encode(pw)); - - adminRepository.save(adminDto.toEntity()); - - //when - if(adminRepository.findByAdminId(id) == null){ - throw new UserNotFoundException(); - } else { - // then - assertEquals(passwordEncoder.matches(pw, adminDto.getAdminPwd()), true); - } - } - - @Test - void GetUserEmail(){ - //Given - AdminDto adminDto = new AdminDto(); - String userEmail = "s20062@gsm"; - String pw = "1234"; - adminDto.setAdminId(userEmail); - adminDto.setAdminPwd(passwordEncoder.encode(pw)); - adminRepository.save(adminDto.toEntity()); - System.out.println("======== saved ========="); - - // when login session 발급 - UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( - adminDto.getAdminId(), - adminDto.getAdminPwd(), - List.of(new SimpleGrantedAuthority("ROLE_USER"))); - SecurityContext context = SecurityContextHolder.getContext(); - context.setAuthentication(token); - System.out.println("================================="); - System.out.println(context); - - //then - String currentUserEmail = adminServiceImpl.getUserEmail(); - assertEquals(currentUserEmail, "s20062@gsm"); - } - - @Test - void 서비스_회원가입() throws Exception { - //Given - AdminDto adminDto = new AdminDto(); - adminDto.setAdminId("s20062@gsm"); - adminDto.setAdminPwd("1234"); - adminDto.setAdminName("jihwan"); - - //when - adminService.signUp(adminDto); - - //then - assertEquals(adminRepository.findByAdminId("s20062@gsm") != null, true); - } - - @Test @Disabled - void 서비스_로그인() throws Exception { - //Given - AdminDto adminDto = new AdminDto(); - adminDto.setAdminId("s20062@gsmasdf"); - adminDto.setAdminPwd(passwordEncoder.encode("1234")); - adminDto.setAdminName("jihwan"); - - //when - adminRepository.save(adminDto.toEntity()); - - //then - assertEquals(adminService.loginUser("s20062@gsmasdf","1234") == null, false); - } - - @Test - void 회원탈퇴() throws Exception { - // Given 회원가입 - AdminDto adminDto = new AdminDto(); - adminDto.setAdminName("jihwan"); - adminDto.setAdminId("s20062@gsm"); - adminDto.setAdminPwd(passwordEncoder.encode("1234")); - adminRepository.save(adminDto.toEntity()); - System.out.println("=========is saved========="); - - // Given SignInDto - SignInDto signInDto = new SignInDto(); - signInDto.setAdminId("s20062@gsm"); - signInDto.setAdminPwd("1234"); - System.out.println("======== is set ========"); - - // when login session 발급 - UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( - adminDto.getAdminId(), - adminDto.getAdminPwd(), - List.of(new SimpleGrantedAuthority("ROLE_USER"))); - SecurityContext context = SecurityContextHolder.getContext(); - context.setAuthentication(token); - System.out.println("================================="); - System.out.println(context); - // when 회원탈퇴를 실행 했을 때. - adminService.withdrawal(signInDto); - } - - @Test - void 시원이가_안믿는_매치스(){ - //Given - String pw = "1234"; - //when - String encodePw = passwordEncoder.encode(pw); - System.out.println("===================="); - System.out.println(encodePw); - //then - assertEquals(passwordEncoder.matches(pw, encodePw), true); - } - - @Test - void 서비스_토큰_발급(){ - //Given - boolean exceptionCatched = false; - - AdminDto adminDto = new AdminDto(); - adminDto.setAdminId("admin@admin"); - adminDto.setAdminPwd(passwordEncoder.encode("1234")); - adminRepository.save(adminDto.toEntity()); - - //When - try { - adminServiceImpl.loginUser("admin@admin", "134"); - } catch (UserNotFoundException e) { - exceptionCatched = true; - } - - //Then - assertTrue(exceptionCatched); - } - - @Test @Disabled - void 로그아웃(){ - //Given - AdminDto adminDto = new AdminDto(); - String userEmail = "s20062@gsm"; - String pw = "1234"; - adminDto.setAdminId(userEmail); - adminDto.setAdminPwd(passwordEncoder.encode(pw)); - adminRepository.save(adminDto.toEntity()); - System.out.println("======== saved ========="); - - // when login session 발급 - UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( - adminDto.getAdminId(), - adminDto.getAdminPwd(), - List.of(new SimpleGrantedAuthority("ROLE_USER"))); - SecurityContext context = SecurityContextHolder.getContext(); - context.setAuthentication(token); - System.out.println("================================="); - System.out.println(context); - - // When logout - adminServiceImpl.logout(); - } -} diff --git a/src/test/java/com/moment/the/service/AnswerServiceTest.java b/src/test/java/com/moment/the/service/AnswerServiceTest.java deleted file mode 100644 index d1b6e4e7..00000000 --- a/src/test/java/com/moment/the/service/AnswerServiceTest.java +++ /dev/null @@ -1,245 +0,0 @@ -package com.moment.the.service; - -import com.moment.the.exceptionAdvice.exception.AccessNotFoundException; -import com.moment.the.exceptionAdvice.exception.AnswerAlreadyExistsException; -import com.moment.the.answer.*; -import com.moment.the.answer.dto.AnswerDto; -import com.moment.the.answer.dto.AnswerResDto; -import com.moment.the.answer.repository.AnswerRepository; -import com.moment.the.answer.service.AnswerService; -import com.moment.the.config.security.auth.MyUserDetailsService; -import com.moment.the.admin.AdminDomain; -import com.moment.the.table.TableDomain; -import com.moment.the.admin.dto.AdminDto; -import com.moment.the.table.dto.TableDto; -import com.moment.the.admin.repository.AdminRepository; -import com.moment.the.table.service.TableService; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.transaction.annotation.Transactional; - -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; - -@Transactional -@SpringBootTest -class AnswerServiceTest { - - @Autowired AdminRepository adminRepo; - @Autowired - AnswerService answerService; - @Autowired - AnswerRepository answerRepo; - @Autowired - TableService tableService; - @Autowired MyUserDetailsService userDetailsService; - - final String USER_ID = "adminID"; - final String USER_PASSWORD = "adminPW"; - final String USER_NAME = "admin"; - - // test 편의를 위한 회원가입 매서드 - void adminSignUp(String adminId, String password, String adminName) throws Exception { - AdminDto adminDto = new AdminDto(adminId, password, adminName); - adminRepo.save(adminDto.toEntity()); - } - - //test 편의를 위한 로그인 매서드 - AdminDomain adminLogin(String adminId, String password) { - AdminDomain adminDomain = adminRepo.findByAdminIdAndAdminPwd(adminId, password); - UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( - adminDomain.getAdminId(), - adminDomain.getAdminPwd(), - List.of(new SimpleGrantedAuthority("ROLE_USER"))); - SecurityContext context = SecurityContextHolder.getContext(); - context.setAuthentication(token); - - return adminDomain; - } - - //test 편의를 위한 Table 생성 메서드 - TableDomain createTable(){ - String TABLE_CONTENT = "급식이 맛이 없어요 급식에 질을 높여주세요!"; - TableDto tableDto = new TableDto(TABLE_CONTENT); - TableDomain tableDomain = tableService.write(tableDto); - return tableDomain; - } - - @Test @DisplayName("답변 작성하기 (save) 검증") - void save_검증() throws Exception { - // Given - //회원가입 - adminSignUp(USER_ID, USER_PASSWORD, USER_NAME); - - //로그인 - AdminDomain adminDomain = adminLogin(USER_ID, USER_PASSWORD); - - //Table 등록 - TableDomain tableDomain = createTable(); - - //answer 입력 - String ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; - AnswerDto answerDto = new AnswerDto(ANSWER_CONTENT, null); - - // When - AnswerDomain savedAnswer = answerService.save(answerDto, tableDomain.getBoardIdx()); - - // Then - assertEquals(savedAnswer.getAnswerContent(), ANSWER_CONTENT); - assertEquals(savedAnswer.getTableDomain(), tableDomain); - assertEquals(savedAnswer.getAdminDomain(), adminDomain); - } - - @Test @DisplayName("답변 작성하기 (save) 답변이 이미 있을경우 AnswerAlreadyExistsException 검증") - void save_AnswerAlreadyExistsException_검증() throws Exception { - // Given - //회원가입 - adminSignUp(USER_ID, USER_PASSWORD, USER_NAME); - - //로그인 - AdminDomain adminDomain = adminLogin(USER_ID, USER_PASSWORD); - - //Table 등록 - TableDomain tableDomain = createTable(); - - //answer 추가 - String ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; - AnswerDto answerDto = new AnswerDto(ANSWER_CONTENT, null); - answerService.save(answerDto, tableDomain.getBoardIdx()); - - // When - String ONCE_MORE_ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; - AnswerDto onceMoreAnswerDto = new AnswerDto(ONCE_MORE_ANSWER_CONTENT, null); - AnswerAlreadyExistsException throwAtSaveMethod = - assertThrows(AnswerAlreadyExistsException.class, - () -> answerService.save(onceMoreAnswerDto, tableDomain.getBoardIdx()) - ); - - // then - assertEquals(throwAtSaveMethod.getClass(), AnswerAlreadyExistsException.class); - } - - @Test @DisplayName("답변 수정하기 (update) 검증") - void update_검증() throws Exception { - // Given - //회원가입 - adminSignUp(USER_ID, USER_PASSWORD, USER_NAME); - - //로그인 - adminLogin(USER_ID, USER_PASSWORD); - TableDomain tableDomain = createTable(); - - // 답변 등록 - String ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; - AnswerDto answerDto = new AnswerDto(ANSWER_CONTENT, null); - AnswerDomain savedAnswer = answerService.save(answerDto, tableDomain.getBoardIdx()); - System.out.println("savedAnswer.getAnswerContent() = " + savedAnswer.getAnswerContent()); - - // When - String CHANGE_ANSWER_CONTENT = "그냥 드세요 요구하는게 있으면 잃는것도 있어야지!"; - AnswerDto changeAnswerDto = new AnswerDto(CHANGE_ANSWER_CONTENT, null); - answerService.update(changeAnswerDto, savedAnswer.getAnswerIdx()); - System.out.println("savedAnswer.getAnswerContent() = " + savedAnswer.getAnswerContent()); - - // Than - assertEquals(savedAnswer.getAnswerContent(), CHANGE_ANSWER_CONTENT); - } - - @Test @DisplayName("답변 보기 (view) 검증") - void view_검증() throws Exception { - // Given - TableDomain tableDomain = createTable(); - - // 답변 등록 - adminSignUp(USER_ID, USER_PASSWORD, USER_NAME); // 답변 등록을 위한 회원가입 - adminLogin(USER_ID, USER_PASSWORD); // 답변 등록을 위한 로그인 - - String ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; - AnswerDto answerDto = new AnswerDto(ANSWER_CONTENT, null); - AnswerDomain savedAnswer = answerService.save(answerDto, tableDomain.getBoardIdx()); - System.out.println("savedAnswer.getAnswerContent() = " + savedAnswer.getAnswerContent()); - - // When - AnswerResDto answerResDto = answerService.view(tableDomain.getBoardIdx()); - - //than - assertEquals(answerResDto.getAnswerIdx(), savedAnswer.getAnswerIdx()); - assertEquals(answerResDto.getTitle(), savedAnswer.getTableDomain().getContent()); - assertEquals(answerResDto.getWriter(), savedAnswer.getAdminDomain().getAdminName()); - assertEquals(answerResDto.getContent(), savedAnswer.getAnswerContent()); - } - - @Test @DisplayName("답변 삭제 (delete) 검증") - void delete_검증() throws Exception { - // Given - //회원가입 - String USER_ID = "adminID"; - String USER_PASSWORD = "adminPW"; - String USER_NAME = "admin"; - - adminSignUp(USER_ID, USER_PASSWORD, USER_NAME); - - //로그인 - adminLogin(USER_ID, USER_PASSWORD); - TableDomain tableDomain = createTable(); - - // 답변 등록 - String ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; - AnswerDto answerDto = new AnswerDto(ANSWER_CONTENT, null); - AnswerDomain savedAnswer = answerService.save(answerDto, tableDomain.getBoardIdx()); - - // When - answerService.delete(savedAnswer.getAnswerIdx()); - IllegalArgumentException deleteSuccessException = assertThrows(IllegalArgumentException.class, - () -> answerRepo.findById(savedAnswer.getAnswerIdx()) - .orElseThrow(() -> new IllegalArgumentException("AnswerDomain을 찾을 수 없으므로 테스트 성공.")) - ); - - // Then - assertEquals(deleteSuccessException.getClass(), IllegalArgumentException.class); - } - - - @Test @DisplayName("답변 삭제 (delete) 다른사람의 답변을 삭제할 경우 AccessNotFoundException 검증") - void 다른사람의_답변을_삭제할경우_AccessNotFoundException_검증() throws Exception { - // Given - //회원가입 - final String ADMIN_A_ID = "adminAID"; - final String ADMIN_A_PW = "adminAPW"; - final String ADMIN_A_NAME = "adminA"; - - final String ADMIN_B_ID = "adminBID"; - final String ADMIN_B_PW = "adminBPW"; - final String ADMIN_B_NAME = "adminB"; - - adminSignUp(ADMIN_A_ID, ADMIN_A_PW, ADMIN_A_NAME); - adminSignUp(ADMIN_B_ID, ADMIN_B_PW, ADMIN_B_NAME); - - //로그인 - adminLogin(ADMIN_A_ID, ADMIN_A_PW); - - adminSignUp("adminB", "adminB_PW", "adminB"); - - TableDomain tableDomain = createTable(); - - // 답변 등록 - String ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; - AnswerDto answerDto = new AnswerDto(ANSWER_CONTENT, null); - AnswerDomain savedAnswer = answerService.save(answerDto, tableDomain.getBoardIdx()); - - // When - adminLogin(ADMIN_B_ID, ADMIN_B_PW); - AccessNotFoundException deleteFailException = assertThrows(AccessNotFoundException.class - , () -> answerService.delete(savedAnswer.getAnswerIdx())); - - // Than - assertEquals(deleteFailException.getClass(), AccessNotFoundException.class); - } -} \ No newline at end of file diff --git a/src/test/java/com/moment/the/service/ImprovementServiceTest.java b/src/test/java/com/moment/the/service/ImprovementServiceTest.java deleted file mode 100644 index 619c7c0c..00000000 --- a/src/test/java/com/moment/the/service/ImprovementServiceTest.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.moment.the.service; - -import com.moment.the.admin.AdminDomain; -import com.moment.the.admin.service.AdminService; -import com.moment.the.improvement.ImprovementDomain; -import com.moment.the.admin.dto.AdminDto; -import com.moment.the.improvement.dto.ImprovementDto; -import com.moment.the.admin.repository.AdminRepository; -import com.moment.the.improvement.repository.ImprovementRepository; -import com.moment.the.improvement.service.ImprovementService; -import org.junit.jupiter.api.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.authority.SimpleGrantedAuthority; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -@SpringBootTest -@Transactional -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) -public class ImprovementServiceTest { - - // 데이터 섞임 방지 한개의 테스트가 끝날떄마다 DB의 저장내용을 삭제한다. - @AfterEach - public void cleanUp(){ - improvementRepository.deleteAll(); - } - - @Autowired - private AdminService adminService; - @Autowired - private AdminRepository adminRepository; - @Autowired - private ImprovementService improvementService; - @Autowired - private ImprovementRepository improvementRepository; - - // test 편의를 위한 회원가입 매서드 - void adminSignUp(String adminId, String password, String adminName) throws Exception { - AdminDto adminDto = new AdminDto(adminId, password, adminName); - adminService.signUp(adminDto); - } - - - // test 편의를 위한 로그인 매서드 - AdminDomain adminLogin(String adminId, String password) throws Exception { - AdminDomain adminDomain = adminRepository.findByAdminId(adminId); - UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( - adminDomain.getAdminId(), - adminDomain.getAdminPwd(), - List.of(new SimpleGrantedAuthority("ROLE_USER"))); - SecurityContext context = SecurityContextHolder.getContext(); - context.setAuthentication(token); - - return adminDomain; - } - - // test 편의를 위한 save 로직 - void saveImprovement(String header , String content) throws Exception { - ImprovementDto improvementDto = new ImprovementDto(); - improvementDto.setImproveHeader(header); - improvementDto.setImproveContent(content); - - //when - adminSignUp("s20062", "1234", "jihwan"); - System.out.println("========= saved ========="); - adminLogin("s20062", "1234"); - improvementService.save(improvementDto); - } - - @Test - @Order(1) - void 개선사례_작성() throws Exception { - //Given - ImprovementDto improvementDto = new ImprovementDto(); - improvementDto.setImproveHeader("hello world"); - improvementDto.setImproveContent("this is content"); - - //when - adminSignUp("s20062", "1234", "jihwan"); - System.out.println("========= saved ========="); - adminLogin("s20062", "1234"); - improvementService.save(improvementDto); - - //Then - assertEquals(improvementRepository.findByImproveContent("this is content")==null, false); - } - - @Test - @Order(2) - void 개선사레_조회(){ - //Given - List improvementDomains = Stream.generate( - () -> ImprovementDomain.builder() - .improveHeader("hello header") - .improveContent("hello content") - .build() - ).limit(20).collect(Collectors.toList()); - - improvementRepository.saveAll(improvementDomains); - - //when - improvementService.read(); - - //then - assertEquals(20, improvementService.read().size()); - } - - @Test - @Order(3) - void 개선사례_수정() throws Exception { - //Given - saveImprovement("hello", "it's me"); - System.out.println("======== save 완료 =========="); - Long currentIdx = improvementRepository.findByImproveContent("it's me").getImproveIdx(); - - //Given - ImprovementDto improvementDto = new ImprovementDto(); - improvementDto.setImproveHeader("이걸로 바꿀게용"); - improvementDto.setImproveContent("이걸로 한다고용"); - - //When - improvementService.update(improvementDto, currentIdx); - System.out.println("============= 업데이트 완료 ============"); - - //Then - assertEquals(false, improvementRepository.findByImproveContent("이걸로 한다고용") == null); - } - - @Test - @Order(4) - void 개선사례_삭제() throws Exception { - //Given - saveImprovement("hello", "world"); - System.out.println("========save 완료=========="); - Long delIdx = improvementRepository.findByImproveContent("world").getImproveIdx(); - - //When - improvementService.delete(delIdx); - System.out.println("==========삭제 완료==========="); - - //Then - assertEquals(true, improvementRepository.findByImproveContent("world") == null); - } -} diff --git a/src/test/java/com/moment/the/service/TableServiceTest.java b/src/test/java/com/moment/the/service/TableServiceTest.java deleted file mode 100644 index c59ff1bd..00000000 --- a/src/test/java/com/moment/the/service/TableServiceTest.java +++ /dev/null @@ -1,189 +0,0 @@ -package com.moment.the.service; - -import com.moment.the.exceptionAdvice.exception.GoodsNotCancelException; -import com.moment.the.table.*; -import com.moment.the.table.dto.TableDto; -import com.moment.the.table.dto.TableViewDto; -import com.moment.the.table.repository.TableRepository; -import com.moment.the.table.service.TableService; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.time.LocalDate; -import java.time.Period; -import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static org.junit.jupiter.api.Assertions.*; - -@SpringBootTest -class TableServiceTest { - - @Autowired - TableRepository tableRepo; - @Autowired - TableService tableService; - - - // 데이터 섞임 방지 한개의 테스트가 끝날떄마다 DB의 저장내용을 삭제한다. - @AfterEach - public void cleanUp(){ - tableRepo.deleteAll(); - } - - @Test - @DisplayName("TableService write 로직 검증") - void TableService_write_로직검증(){ - // given - TableDto tableDto = TableDto.builder() - .content("TableService write 로직 검증") - .build(); - - // when - TableDomain writeTable = tableService.write(tableDto); - TableDomain savedTable = tableRepo.findByBoardIdx(writeTable.getBoardIdx()).orElseThrow(() -> new IllegalArgumentException("Table을 찾을 수 없습니다. (테스트실패)")); - tableRepo.delete(savedTable); - - // then - assertEquals(tableDto.getContent(), savedTable.getContent()); - } - - @Test - @DisplayName("TableService top30 보여주기(top30View) 검증") - void TableService_top30View_검증(){ - // Given - AtomicInteger i = new AtomicInteger(1); - List TableDomains = Stream.generate( - () -> TableDomain.builder() - .goods(i.getAndIncrement()) - .content("TableService top30 보여주기 테스트") - .build() - ).limit(40).collect(Collectors.toList()); - - // When - tableRepo.saveAll(TableDomains); - List viewTop30 = tableService.top30View(); - - // Then - assertEquals(viewTop30.size(), 30); - AtomicInteger j = new AtomicInteger(40); - // TableService 의 top30View 로직이 올바르게 적용되면 j.get을 했을떄 값이 10이 나와야 한다. - // 저장된Table - top30 = 40 - 30 = 10 - for(TableViewDto v : viewTop30 ) { - assertEquals(v.getGoods(), j.getAndDecrement()); - } - assertEquals(j.get(), 10); - } - - @Test - @DisplayName("TableService viewAll 검증") - void TableService_viewAll_검증(){ - // Given - List tableDomains = Stream.generate( - () -> TableDomain.builder() - .content("TableService viewAll 검증") - .build() - ).limit(10).collect(Collectors.toList()); - - // When - tableRepo.saveAll(tableDomains); - List tableViewAll = tableService.viewAll(); - - // Then - assertEquals(tableViewAll.size(), 10); // 10개를 저장했으므로 tableViewAll 의 개수는 10개여야 한다. - tableViewAll.stream().forEach( t -> System.out.println(t.getContent())); - - } - - @Test - @DisplayName("TableService 전체 개시글 수 보여주기 (amountUncomfortableView)검증") - void TableService_amountUncomfortableView_검증(){ - // Given - List tableDomains = Stream.generate( - () -> TableDomain.builder() - .content("TableService amountUncomfortableView 검증") - .build() - ).limit(10).collect(Collectors.toList()); - - // When - tableRepo.saveAll(tableDomains); - Long amountUncomfortable = tableService.amountUncomfortableView(); - - // then - assertEquals(amountUncomfortable, 10); - } - - @Disabled - @Test @DisplayName("TableService 프로젝트 시작 이후 날짜 보여주기 (dateSinceProjectStart) 검증") - void TableService_dateSinceProjectStart_검증(){ - // Given - LocalDate startTheMoment = LocalDate.of(2021,6,7); - LocalDate currentDate = LocalDate.now(); - - // When - Period period = startTheMoment.until(currentDate); - - // Then - assertEquals(tableService.dateSinceProjectStart(), period.getDays()+1);; - } - - @Test - @DisplayName("TableService 좋아요 수 증가 로직 (goods) 검증") - void TableService_goods_검증(){ - // Given - TableDomain tableDomain = TableDomain.builder() - .content("TableService_goods_검증") - .build(); - - // When - TableDomain savedTableDomain = tableRepo.save(tableDomain); - tableService.goods(savedTableDomain.getBoardIdx()); - TableDomain savedGoodsTableDomain = tableRepo.findByBoardIdx(savedTableDomain.getBoardIdx()).orElseThrow(() -> new IllegalArgumentException("좋아요를 받은 TableEntity를 찾을 수 없습니다.")); - - // Then - assertEquals(savedGoodsTableDomain.getGoods(), 1); - } - - @Test - @DisplayName("TableService 좋아요 수 감소 로직 (cancelGood) 검증") - void TableService_cancelGood_검증(){ - // Given - TableDomain tableDomain = TableDomain.builder() - .content("TableService_goods_검증") - .goods(1) // 좋아요 한개 지급 - .build(); - - // When - TableDomain savedTableDomain = tableRepo.save(tableDomain); - tableService.cancelGood(savedTableDomain.getBoardIdx()); - TableDomain savedCancelGoodTableDomain = tableRepo.findByBoardIdx(savedTableDomain.getBoardIdx()).orElseThrow(() -> new IllegalArgumentException("좋아요를 취소한 TableEntity를 찾을 수 없습니다.")); - - // Given - assertEquals(savedCancelGoodTableDomain.getGoods(), 0); - } - - @Test - @DisplayName("TableService 좋아요 수 감소 로직 (cancelGood) 음수가 될경우 exception 검증") - void TableService_cancelGood_exception_검증() throws Exception { - // Given - TableDomain tableDomain = TableDomain.builder() - .content("TableService_goods_검증") - .goods(0) // 좋아요 0개 - .build(); - - // When - TableDomain savedTableDomain = tableRepo.save(tableDomain); - System.out.println(savedTableDomain.getBoardIdx()); - - assertThrows(GoodsNotCancelException.class, () ->{ - tableService.cancelGood(savedTableDomain.getBoardIdx()); - }); - - } -} \ No newline at end of file diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml deleted file mode 100644 index a66c4f2c..00000000 --- a/src/test/resources/application.yml +++ /dev/null @@ -1,61 +0,0 @@ -server: - #포트 - port: 8080 - # UTF-8 사용 - servlet: - encoding: - charset: UTF-8 - enabled: true - force: true - -logging: - level: - com.moment.the.config.mvc.RequestResponseLoggingFilter: debug - org.hibernate.SQL: debug - # org.hibernate.type: trace - charset: - console: UTF-8 - file: - name: ./logs/product.log - path: ./logs/product.log - logback: - rollingpolicy: - file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}-%i.log - max-file-size: 500MB - max-history: 1 - -spring: - #H2 DataBase - h2: - console: - enabled: true - path: /h2-console - settings: - web-allow-others: true - # Mysql RDB 설정 - datasource: - url: jdbc:h2:mem:test - username: sa - password: - driver-class-name: org.h2.Driver - - jpa: - hibernate: - ddl-auto: create - properties: - hibernate: - format_sql: true - - #Message 설정 - messages: - basename: i18n/exception - encoding: UTF-8 - - # Redis - redis: - image: redis:latest - host: redis - port: 6379 - - jwt: - secret: asdkfhksldjhfkajsdhfasd7df67sa8d6f87as6df86sa8d7f6a8ds6f87a9s6d8f76sad87f687ad6f8asd76f8asd6f8asd6f87sd6f87asd6f87s \ No newline at end of file From 77a2863748b7c22566f7707e50cd6abb0626e127 Mon Sep 17 00:00:00 2001 From: siwony_ Date: Sat, 28 Aug 2021 17:43:48 +0900 Subject: [PATCH 11/41] =?UTF-8?q?[REMOVE]=20out=EB=94=94=EB=A0=89=EB=A6=AC?= =?UTF-8?q?=EA=B0=80=20ignore=EB=90=98=EC=A7=80=20=EC=95=8A=EC=95=84=20?= =?UTF-8?q?=EC=BA=90=EC=8B=9C=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 50 ++++ Dockerfile | 20 ++ LICENSE | 21 ++ README.md | 77 ++++++ build.gradle | 90 +++++++ docker-compose-env.sh | 15 ++ docker-compose.yml | 13 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes gradle/wrapper/gradle-wrapper.properties | 5 + gradlew | 185 +++++++++++++ gradlew.bat | 89 +++++++ meterial/imgSource/the_moment_README_logo.png | Bin 0 -> 11185 bytes settings.gradle | 5 + .../java/com/moment/the/TheApplication.java | 15 ++ .../com/moment/the/admin/AdminDomain.java | 81 ++++++ .../the/admin/controller/AdminController.java | 61 +++++ .../com/moment/the/admin/dto/AdminDto.java | 36 +++ .../com/moment/the/admin/dto/SignInDto.java | 24 ++ .../the/admin/repository/AdminRepository.java | 11 + .../the/admin/service/AdminService.java | 13 + .../the/admin/service/AdminServiceImpl.java | 89 +++++++ .../com/moment/the/answer/AnswerDomain.java | 51 ++++ .../answer/controller/AnswerController.java | 57 ++++ .../com/moment/the/answer/dto/AnswerDto.java | 24 ++ .../moment/the/answer/dto/AnswerResDto.java | 17 ++ .../answer/repository/AnswerRepository.java | 18 ++ .../the/answer/service/AnswerService.java | 112 ++++++++ .../exception/MessageConfiguration.java | 61 +++++ .../config/mvc/ExceptionHandlerFilter.java | 63 +++++ .../mvc/RequestResponseLoggingFilter.java | 34 +++ .../the/config/mvc/WebMvcConfigurerImpl.java | 25 ++ .../security/SecurityConfiguration.java | 55 ++++ .../security/auth/MyUserDetailsService.java | 21 ++ .../config/security/jwt/JwtRequestFilter.java | 114 ++++++++ .../the/config/security/jwt/JwtUtil.java | 143 ++++++++++ .../the/exceptionAdvice/ExceptionAdvice.java | 112 ++++++++ .../controller/ExceptionController.java | 61 +++++ .../exception/AccessNotFoundException.java | 13 + .../AccessTokenExpiredException.java | 14 + .../AnswerAlreadyExistsException.java | 13 + ...CustomMethodArgumentNotValidException.java | 13 + .../exception/GoodsNotCancelException.java | 13 + .../exception/InvalidTokenException.java | 13 + .../exception/NoCommentException.java | 13 + .../exception/NoGoodException.java | 13 + .../exception/NoImprovementException.java | 13 + .../exception/NoPostException.java | 13 + .../exception/UserAlreadyExistsException.java | 13 + .../exception/UserNotFoundException.java | 13 + .../handler/AccessNotFoundHandler.java | 12 + .../handler/AccessTokenExpiredHandler.java | 12 + .../handler/AnswerAlreadyExistsHandler.java | 13 + .../CustomMethodArgumentNotValidHandler.java | 12 + .../handler/GoodsNotCancelHandler.java | 12 + .../handler/InvalidTokenHandler.java | 12 + .../handler/NoCommentHandler.java | 15 ++ .../handler/NoImprovementHandler.java | 15 ++ .../handler/NoPostHandler.java | 15 ++ .../handler/UserAlreadyExistsHandler.java | 15 ++ .../handler/UserNotFoundHandler.java | 15 ++ .../the/improvement/ImprovementDomain.java | 38 +++ .../controller/ImprovementController.java | 60 +++++ .../the/improvement/dto/ImprovementDto.java | 28 ++ .../dto/ImprovementViewAllDto.java | 18 ++ .../repository/ImprovementRepository.java | 19 ++ .../service/ImprovementService.java | 67 +++++ .../moment/the/response/ResponseService.java | 86 ++++++ .../the/response/result/CommonResult.java | 18 ++ .../the/response/result/ListResult.java | 12 + .../the/response/result/SingleResult.java | 10 + .../com/moment/the/table/TableDomain.java | 35 +++ .../the/table/controller/TableController.java | 67 +++++ .../the/table/dto/AmountUncomfortableDto.java | 15 ++ .../com/moment/the/table/dto/TableDto.java | 24 ++ .../moment/the/table/dto/TableViewDto.java | 23 ++ .../the/table/repository/TableRepository.java | 33 +++ .../the/table/service/TableService.java | 85 ++++++ .../java/com/moment/the/util/RedisUtil.java | 36 +++ src/main/resources/application.yml | 65 +++++ src/main/resources/i18n/exception_en.yml | 47 ++++ src/main/resources/i18n/exception_ko.yml | 47 ++++ .../com/moment/the/TheApplicationTests.java | 9 + .../release/TableControllerTest.java | 237 +++++++++++++++++ .../service/ImprovementServiceTest.java | 81 ++++++ .../the/service/AdminServiceImplTest.java | 240 +++++++++++++++++ .../moment/the/service/AnswerServiceTest.java | 245 ++++++++++++++++++ .../the/service/ImprovementServiceTest.java | 152 +++++++++++ .../moment/the/service/TableServiceTest.java | 189 ++++++++++++++ src/test/resources/application.yml | 61 +++++ 89 files changed, 4220 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 build.gradle create mode 100755 docker-compose-env.sh create mode 100644 docker-compose.yml 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 meterial/imgSource/the_moment_README_logo.png create mode 100644 settings.gradle create mode 100644 src/main/java/com/moment/the/TheApplication.java create mode 100644 src/main/java/com/moment/the/admin/AdminDomain.java create mode 100644 src/main/java/com/moment/the/admin/controller/AdminController.java create mode 100644 src/main/java/com/moment/the/admin/dto/AdminDto.java create mode 100644 src/main/java/com/moment/the/admin/dto/SignInDto.java create mode 100644 src/main/java/com/moment/the/admin/repository/AdminRepository.java create mode 100644 src/main/java/com/moment/the/admin/service/AdminService.java create mode 100644 src/main/java/com/moment/the/admin/service/AdminServiceImpl.java create mode 100644 src/main/java/com/moment/the/answer/AnswerDomain.java create mode 100644 src/main/java/com/moment/the/answer/controller/AnswerController.java create mode 100644 src/main/java/com/moment/the/answer/dto/AnswerDto.java create mode 100644 src/main/java/com/moment/the/answer/dto/AnswerResDto.java create mode 100644 src/main/java/com/moment/the/answer/repository/AnswerRepository.java create mode 100644 src/main/java/com/moment/the/answer/service/AnswerService.java create mode 100644 src/main/java/com/moment/the/config/exception/MessageConfiguration.java create mode 100644 src/main/java/com/moment/the/config/mvc/ExceptionHandlerFilter.java create mode 100644 src/main/java/com/moment/the/config/mvc/RequestResponseLoggingFilter.java create mode 100644 src/main/java/com/moment/the/config/mvc/WebMvcConfigurerImpl.java create mode 100644 src/main/java/com/moment/the/config/security/SecurityConfiguration.java create mode 100644 src/main/java/com/moment/the/config/security/auth/MyUserDetailsService.java create mode 100644 src/main/java/com/moment/the/config/security/jwt/JwtRequestFilter.java create mode 100644 src/main/java/com/moment/the/config/security/jwt/JwtUtil.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/ExceptionAdvice.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/controller/ExceptionController.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/AccessNotFoundException.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/AccessTokenExpiredException.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/AnswerAlreadyExistsException.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/CustomMethodArgumentNotValidException.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/GoodsNotCancelException.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/InvalidTokenException.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/NoCommentException.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/NoGoodException.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/NoImprovementException.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/NoPostException.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/UserAlreadyExistsException.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/exception/UserNotFoundException.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/AccessNotFoundHandler.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/AccessTokenExpiredHandler.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/AnswerAlreadyExistsHandler.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/CustomMethodArgumentNotValidHandler.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/GoodsNotCancelHandler.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/InvalidTokenHandler.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/NoCommentHandler.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/NoImprovementHandler.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/NoPostHandler.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/UserAlreadyExistsHandler.java create mode 100644 src/main/java/com/moment/the/exceptionAdvice/handler/UserNotFoundHandler.java create mode 100644 src/main/java/com/moment/the/improvement/ImprovementDomain.java create mode 100644 src/main/java/com/moment/the/improvement/controller/ImprovementController.java create mode 100644 src/main/java/com/moment/the/improvement/dto/ImprovementDto.java create mode 100644 src/main/java/com/moment/the/improvement/dto/ImprovementViewAllDto.java create mode 100644 src/main/java/com/moment/the/improvement/repository/ImprovementRepository.java create mode 100644 src/main/java/com/moment/the/improvement/service/ImprovementService.java create mode 100644 src/main/java/com/moment/the/response/ResponseService.java create mode 100644 src/main/java/com/moment/the/response/result/CommonResult.java create mode 100644 src/main/java/com/moment/the/response/result/ListResult.java create mode 100644 src/main/java/com/moment/the/response/result/SingleResult.java create mode 100644 src/main/java/com/moment/the/table/TableDomain.java create mode 100644 src/main/java/com/moment/the/table/controller/TableController.java create mode 100644 src/main/java/com/moment/the/table/dto/AmountUncomfortableDto.java create mode 100644 src/main/java/com/moment/the/table/dto/TableDto.java create mode 100644 src/main/java/com/moment/the/table/dto/TableViewDto.java create mode 100644 src/main/java/com/moment/the/table/repository/TableRepository.java create mode 100644 src/main/java/com/moment/the/table/service/TableService.java create mode 100644 src/main/java/com/moment/the/util/RedisUtil.java create mode 100644 src/main/resources/application.yml create mode 100644 src/main/resources/i18n/exception_en.yml create mode 100644 src/main/resources/i18n/exception_ko.yml create mode 100644 src/test/java/com/moment/the/TheApplicationTests.java create mode 100644 src/test/java/com/moment/the/controller/release/TableControllerTest.java create mode 100644 src/test/java/com/moment/the/improvement/service/ImprovementServiceTest.java create mode 100644 src/test/java/com/moment/the/service/AdminServiceImplTest.java create mode 100644 src/test/java/com/moment/the/service/AnswerServiceTest.java create mode 100644 src/test/java/com/moment/the/service/ImprovementServiceTest.java create mode 100644 src/test/java/com/moment/the/service/TableServiceTest.java create mode 100644 src/test/resources/application.yml diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..d8096e4b --- /dev/null +++ b/.gitignore @@ -0,0 +1,50 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +out + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + +### log ### +/logs/** + +### Gradle ### +.gradle + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar + +### Gradle Patch ### +**/build/ + +### apllication config ### +#/src/main/resources/application.yml \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..b0031a10 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,20 @@ +# docker start with a base image containing java runtime +FROM openjdk:11 + +# Add Author information +LABEL maintainer="s20062@gsm.hs.kr" + +# Add a volume to /tmp +VOLUME /tmp + +# Make port 8080 available to the world outside this container +EXPOSE 8080 + +# The application's jar file +ARG JAR_FILE=target/the-0.0.1-SNAPSHOT.jar + +# Add the application's jar to the container +ADD ${JAR_FILE} the_moment_server.jar + +# Run the jar file +ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/the_moment_server.jar"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..fb298683 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 the_moment + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 00000000..f3e023ba --- /dev/null +++ b/README.md @@ -0,0 +1,77 @@ +## + +["학교가 불편한 순간"](https://github.com/theMomentTeam/the_moment-Service)은 학교가 더욱 더 개선되기 위해 학생들 관점에서 느끼는 불편한 순간을 기록하는 공간입니다. +> "the_moment" is a space that records the uncomfortable moments felt from the perspective of students in order to improve the school even more. + +
+ +#### GET start +``` +- install maven +$ sudo apt-get install maven + +- checking maven version +$ maven -version + +- docker install +$ sudo apt-get install docker.io + +- docker-compose install +$ sudo apt-get install docker-compose + +- start the_moment-server use shell! (Docker Run) +$ sudo ./docker-compose-env.sh + +- Run in the background as well (prefer) +$ sudo nohup ./docker-compose-env.sh & +``` + +#### Development +``` +* server dependency + - Java 11 (Open-JDK) + - SpringBoot + - Spring Data JPA + - H2 DataBase + - Lombok + - Validation + - Spring Security + - Spring Data Reactive Redis + +* dev tools + - IntelliJ IDEA + - Docker + - Redis + - Swagger2 + +* Deployment + - AWS EC2 + - AWS Route 53 + - AWS RDS (Mysql) +``` + +#### Our Server License +``` +MIT License + +Copyright (c) 2021 the_moment + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +``` diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..26b47559 --- /dev/null +++ b/build.gradle @@ -0,0 +1,90 @@ +/* + * This file was generated by the Gradle 'init' task. + */ + +plugins { + id 'java' + id 'org.springframework.boot' version '2.4.2' + id 'io.spring.dependency-management' version '1.0.11.RELEASE' + id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" +} + +repositories { + mavenCentral() + maven { + url = uri('https://repo.maven.apache.org/maven2/') + } +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-security' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-configuration-processor' + implementation 'org.springframework.boot:spring-boot-starter-data-redis' + + // Swagger + implementation 'io.springfox:springfox-swagger-ui:2.9.1' + implementation 'io.springfox:springfox-swagger2:2.9.1' + implementation 'io.swagger:swagger-annotations:1.6.2' + implementation 'io.swagger:swagger-models:1.6.2' + + // JWT토큰 관련 의존성 + implementation 'io.jsonwebtoken:jjwt-api:0.11.1' + runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.1' + runtimeOnly 'io.jsonwebtoken:jjwt-jackson:0.11.1' + + // modelMapper + implementation 'org.modelmapper:modelmapper:2.3.0' + + implementation 'net.rakugakibox.util:yaml-resource-bundle:1.1' + + implementation 'io.fabric8:docker-maven-plugin:0.30.0' + + // lombok + implementation 'org.projectlombok:lombok' + compileOnly 'org.projectlombok:lombok' + testCompileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + testAnnotationProcessor 'org.projectlombok:lombok' + + // DB + runtimeOnly 'com.h2database:h2' + runtimeOnly 'mysql:mysql-connector-java' + + // QueryDSL + compileOnly 'com.querydsl:querydsl-jpa' + compileOnly 'com.querydsl:querydsl-apt' + + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.security:spring-security-test' + testImplementation 'org.junit.jupiter:junit-jupiter-params' + + compileOnly 'org.springframework.boot:spring-boot-starter-tomcat' +} + +group = 'com.moment' +version = '0.0.1-SNAPSHOT' +description = 'the' +java.sourceCompatibility = JavaVersion.VERSION_11 + +tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' +} + +def querydslDir = "$buildDir/generated/querydsl" + +querydsl { + jpa = true + querydslSourcesDir = querydslDir +} +sourceSets { + main.java.srcDir querydslDir +} +configurations { + querydsl.extendsFrom compileClasspath +} +compileQuerydsl { + options.annotationProcessorPath = configurations.querydsl +} \ No newline at end of file diff --git a/docker-compose-env.sh b/docker-compose-env.sh new file mode 100755 index 00000000..ea5a782e --- /dev/null +++ b/docker-compose-env.sh @@ -0,0 +1,15 @@ +#!/bin/bash +echo "====mvn clean======" +./mvnw clean + +echo "=====mvn compile=====" +./mvnw compile + +echo "======mvn package======" +./mvnw package + +echo "======docker-compose build======" +docker-compose build + +echo "======docker-compose up=======" +docker-compose up \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..6960a51b --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,13 @@ +version: '2' +services: + app: + build: . + ports: + - "5000:8080" + links: + - "db:redis" + db: + image: "redis" + hostname: redis + ports: + - "6379:6379" \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7454180f2ae8848c63b8b4dea2cb829da983f2fa GIT binary patch literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..05679dc3 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 00000000..744e882e --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + 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" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..ac1b06f9 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/meterial/imgSource/the_moment_README_logo.png b/meterial/imgSource/the_moment_README_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2175700eeafd2e89ecad8c8fbfb58b70106fe7f7 GIT binary patch literal 11185 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 ^kGR|2liDPTQ^x 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 n^8Ylc)K~F&iBj+X)of3g=W!+@UT roles = new ArrayList<>(); + + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + @Override + public Collection getAuthorities() { + return this.roles.stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList()); + } + + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + @Override + public String getPassword() { + return this.adminPwd; + } + + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + @Override + public String getUsername() { + return this.adminId; + } + + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + @Override + public boolean isAccountNonExpired() { + return true; + } + + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + @Override + public boolean isAccountNonLocked() { + return true; + } + + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @JsonProperty(access = JsonProperty.Access.WRITE_ONLY) + @Override + public boolean isEnabled() { + return true; + } +} diff --git a/src/main/java/com/moment/the/admin/controller/AdminController.java b/src/main/java/com/moment/the/admin/controller/AdminController.java new file mode 100644 index 00000000..a19841a7 --- /dev/null +++ b/src/main/java/com/moment/the/admin/controller/AdminController.java @@ -0,0 +1,61 @@ +package com.moment.the.admin.controller; + + +import com.moment.the.admin.dto.AdminDto; +import com.moment.the.admin.dto.SignInDto; +import com.moment.the.admin.service.AdminService; +import com.moment.the.response.ResponseService; +import com.moment.the.response.result.CommonResult; +import com.moment.the.response.result.SingleResult; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.validation.Valid; +import java.util.Map; + +@Slf4j +@RestController +@RequestMapping("/v1") +@RequiredArgsConstructor +@ComponentScan(basePackages = {"com.moment.the.service"}) +public class AdminController { + private final AdminService adminService; + private final ResponseService responseService; + + @PostMapping("/login") + public SingleResult> login(@Valid @RequestBody SignInDto signInDto) throws Exception { + return responseService.getSingleResult(adminService.loginUser(signInDto.getAdminId(), signInDto.getAdminPwd())); + } + + @PostMapping("/logout") + @ApiImplicitParams({ + @ApiImplicitParam(name = "Authorization", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header"), + }) + public CommonResult logout(){ + adminService.logout(); + return responseService.getSuccessResult(); + } + + @PostMapping("/signup") + public CommonResult signup(@Valid @RequestBody AdminDto adminDto) throws Exception { + adminService.signUp(adminDto); + return responseService.getSuccessResult(); + } + + @PostMapping("/withdrawal") + @ApiImplicitParams({ + @ApiImplicitParam(name = "Authorization", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header"), + @ApiImplicitParam(name = "RefreshToken", value = "로그인 성공 후 refresh_token", required = false, dataType = "String", paramType = "header") + }) + public CommonResult withdrawal(@Valid @RequestBody SignInDto signInDto) throws Exception { + adminService.withdrawal(signInDto); + return responseService.getSuccessResult(); + } +} diff --git a/src/main/java/com/moment/the/admin/dto/AdminDto.java b/src/main/java/com/moment/the/admin/dto/AdminDto.java new file mode 100644 index 00000000..27943b0a --- /dev/null +++ b/src/main/java/com/moment/the/admin/dto/AdminDto.java @@ -0,0 +1,36 @@ +package com.moment.the.admin.dto; + + +import com.moment.the.admin.AdminDomain; +import lombok.*; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.util.Collections; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class AdminDto { + @Email(message = "Email should be valid") + @NotBlank(message = "id should be valid") + private String adminId; + + @NotBlank(message = "password should be valid") + private String adminPwd; + + @NotBlank(message = "name should be valid") + @Size(min = 3, max = 30) + private String adminName; + + public AdminDomain toEntity() { + return AdminDomain.builder() + .adminId(this.getAdminId()) + .adminPwd(this.getAdminPwd()) + .adminName(this.getAdminName()) + .roles(Collections.singletonList("ROLE_ADMIN")) + .build(); + } +} diff --git a/src/main/java/com/moment/the/admin/dto/SignInDto.java b/src/main/java/com/moment/the/admin/dto/SignInDto.java new file mode 100644 index 00000000..10000835 --- /dev/null +++ b/src/main/java/com/moment/the/admin/dto/SignInDto.java @@ -0,0 +1,24 @@ +package com.moment.the.admin.dto; + +import com.moment.the.admin.AdminDomain; +import lombok.*; + +import javax.validation.constraints.NotBlank; + +@Builder +@Getter @Setter +@AllArgsConstructor +@NoArgsConstructor +public class SignInDto { + @NotBlank(message = "id should be valid") + private String adminId; + @NotBlank(message = "password should be valid") + private String adminPwd; + + public AdminDomain toEntity(){ + return AdminDomain.builder() + .adminId(this.adminId) + .adminPwd(this.adminPwd) + .build(); + } +} diff --git a/src/main/java/com/moment/the/admin/repository/AdminRepository.java b/src/main/java/com/moment/the/admin/repository/AdminRepository.java new file mode 100644 index 00000000..fc6a0bcc --- /dev/null +++ b/src/main/java/com/moment/the/admin/repository/AdminRepository.java @@ -0,0 +1,11 @@ +package com.moment.the.admin.repository; + +import com.moment.the.admin.AdminDomain; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface AdminRepository extends JpaRepository { + AdminDomain findByAdminId(String adminId); + AdminDomain findByAdminIdAndAdminPwd(String adminId, String password); +} diff --git a/src/main/java/com/moment/the/admin/service/AdminService.java b/src/main/java/com/moment/the/admin/service/AdminService.java new file mode 100644 index 00000000..aad6498c --- /dev/null +++ b/src/main/java/com/moment/the/admin/service/AdminService.java @@ -0,0 +1,13 @@ +package com.moment.the.admin.service; + +import com.moment.the.admin.dto.AdminDto; +import com.moment.the.admin.dto.SignInDto; + +import java.util.Map; + +public interface AdminService { + void signUp(AdminDto adminDto) throws Exception; + Map loginUser(String id, String password) throws Exception; + void logout(); + void withdrawal(SignInDto SignInDto) throws Exception; +} diff --git a/src/main/java/com/moment/the/admin/service/AdminServiceImpl.java b/src/main/java/com/moment/the/admin/service/AdminServiceImpl.java new file mode 100644 index 00000000..d4729a6d --- /dev/null +++ b/src/main/java/com/moment/the/admin/service/AdminServiceImpl.java @@ -0,0 +1,89 @@ +package com.moment.the.admin.service; + +import com.moment.the.admin.AdminDomain; +import com.moment.the.admin.dto.AdminDto; +import com.moment.the.admin.dto.SignInDto; +import com.moment.the.admin.repository.AdminRepository; +import com.moment.the.config.security.jwt.JwtUtil; +import com.moment.the.exceptionAdvice.exception.UserAlreadyExistsException; +import com.moment.the.exceptionAdvice.exception.UserNotFoundException; +import com.moment.the.util.RedisUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; + + +@Service +@RequiredArgsConstructor +public class AdminServiceImpl implements AdminService { + + private final AdminRepository adminRepository; + private final PasswordEncoder passwordEncoder; + private final RedisUtil redisUtil; + private final JwtUtil jwtUtil; + + @Override + public void signUp(AdminDto adminDto) { + if(adminRepository.findByAdminId(adminDto.getAdminId()) != null){ + throw new UserAlreadyExistsException(); + } + adminDto.setAdminPwd(passwordEncoder.encode(adminDto.getAdminPwd())); + adminRepository.save(adminDto.toEntity()); + } + + @Override + public Map loginUser(String id, String password) { + // 아이디 검증 + AdminDomain adminDomain = adminRepository.findByAdminId(id); + if (adminDomain == null) throw new UserNotFoundException(); + // 비밀번호 검증 + boolean passwordCheck = passwordEncoder.matches(password, adminDomain.getPassword()); + if (!passwordCheck) throw new UserNotFoundException(); + + final String accessToken = jwtUtil.generateAccessToken(adminDomain.getAdminId()); + final String refreshJwt = jwtUtil.generateRefreshToken(adminDomain.getAdminId()); + // token 만료 기간 설정 + redisUtil.setDataExpire(refreshJwt, adminDomain.getUsername(), JwtUtil.REFRESH_TOKEN_EXPIRATION_TIME); + Map map = new HashMap<>(); + map.put("id", adminDomain.getAdminId()); + map.put("accessToken", accessToken); // accessToken 반환 + map.put("refreshToken", refreshJwt); // refreshToken 반환 + + return map; + } + + // 로그아웃 + @Override + public void logout() { + String userEmail = this.getUserEmail(); + redisUtil.deleteData(userEmail); + } + + @Override + public void withdrawal(SignInDto signInDto) throws Exception { + // 로그인 된 이메일과 내가 삭제하려는 이메일이 같을 때. + if (getUserEmail().equals(signInDto.getAdminId())) { + AdminDomain adminDomain = adminRepository.findByAdminId(signInDto.getAdminId()); + adminRepository.delete(adminDomain); + } else { + throw new Exception("로그인 후 이용해주세요."); + } + } + + //현재 로그인 된 사용자의 ID를 Return + static public String getUserEmail() { + String userEmail; + Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + if(principal instanceof UserDetails) { + userEmail = ((UserDetails) principal).getUsername(); + } else { + userEmail = principal.toString(); + } + return userEmail; + } +} diff --git a/src/main/java/com/moment/the/answer/AnswerDomain.java b/src/main/java/com/moment/the/answer/AnswerDomain.java new file mode 100644 index 00000000..5261cbd6 --- /dev/null +++ b/src/main/java/com/moment/the/answer/AnswerDomain.java @@ -0,0 +1,51 @@ +package com.moment.the.answer; + + + +import com.moment.the.admin.AdminDomain; +import com.moment.the.answer.dto.AnswerDto; +import com.moment.the.table.TableDomain; +import com.sun.istack.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +import static javax.persistence.FetchType.*; + +@Table(name = "Answer") +@Entity +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class AnswerDomain { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long answerIdx; + + @Column(length = 1000, nullable = false) + @NotNull + private String answerContent; + + @OneToOne(mappedBy = "answerDomain", fetch = LAZY) + @JoinColumn(name = "boardIdx", nullable = false) + private TableDomain tableDomain; + + @ManyToOne(fetch = LAZY) + @JoinColumn(name="writer", nullable = false) + private AdminDomain adminDomain; + + // dirty checking. + public void update(AnswerDto answerDto) { + this.answerContent = answerDto.getContent(); + } + + public void updateTableDomain(TableDomain tableDomain){ + this.tableDomain = tableDomain; + this.tableDomain.updateAnswerDomain(this); + } +} diff --git a/src/main/java/com/moment/the/answer/controller/AnswerController.java b/src/main/java/com/moment/the/answer/controller/AnswerController.java new file mode 100644 index 00000000..3fa01da3 --- /dev/null +++ b/src/main/java/com/moment/the/answer/controller/AnswerController.java @@ -0,0 +1,57 @@ +package com.moment.the.answer.controller; + + +import com.moment.the.answer.dto.AnswerDto; +import com.moment.the.answer.dto.AnswerResDto; +import com.moment.the.answer.service.AnswerService; +import com.moment.the.response.ResponseService; +import com.moment.the.response.result.CommonResult; +import com.moment.the.response.result.SingleResult; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + + +@RestController +@RequestMapping("/v1/top10") +@RequiredArgsConstructor +public class AnswerController { + private final AnswerService answerService; + private final ResponseService responseService; + + @PostMapping("/answer/{boardIdx}") + @ApiImplicitParams({ + @ApiImplicitParam(name = "Authorization", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header"), + @ApiImplicitParam(name = "RefreshToken", value = "로그인 성공 후 refresh_token", required = false, dataType = "String", paramType = "header") + }) + public CommonResult save(@RequestBody AnswerDto answerDto, @PathVariable Long boardIdx) throws Exception { + answerService.save(answerDto, boardIdx); + return responseService.getSuccessResult(); + } + + @PutMapping("/answer/{answerIdx}") + @ApiImplicitParams({ + @ApiImplicitParam(name = "Authorization", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header"), + @ApiImplicitParam(name = "RefreshToken", value = "로그인 성공 후 refresh_token", required = false, dataType = "String", paramType = "header") + }) + public CommonResult update(@RequestBody AnswerDto answerDto, @PathVariable Long answerIdx) throws Exception { + answerService.update(answerDto, answerIdx); + return responseService.getSuccessResult(); + } + + @GetMapping("/answer/{boardIdx}") + public SingleResult view(@PathVariable Long boardIdx) throws Exception{ + return responseService.getSingleResult(answerService.view(boardIdx)); + } + + @DeleteMapping("/answer/{answerIdx}") + @ApiImplicitParams({ + @ApiImplicitParam(name = "Authorization", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header"), + @ApiImplicitParam(name = "RefreshToken", value = "로그인 성공 후 refresh_token", required = false, dataType = "String", paramType = "header") + }) + public CommonResult delete(@PathVariable Long answerIdx) throws Exception { + answerService.delete(answerIdx); + return responseService.getSuccessResult(); + } +} diff --git a/src/main/java/com/moment/the/answer/dto/AnswerDto.java b/src/main/java/com/moment/the/answer/dto/AnswerDto.java new file mode 100644 index 00000000..9238db6d --- /dev/null +++ b/src/main/java/com/moment/the/answer/dto/AnswerDto.java @@ -0,0 +1,24 @@ +package com.moment.the.answer.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; + +import com.moment.the.admin.AdminDomain; +import com.moment.the.answer.AnswerDomain; +import lombok.*; + +@Builder +@Getter @Setter +@NoArgsConstructor @AllArgsConstructor +public class AnswerDto { + private String content; + + @JsonIgnore + private AdminDomain adminDomain; + + public AnswerDomain toEntity(){ + return AnswerDomain.builder() + .answerContent(this.content) + .adminDomain(this.adminDomain) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/moment/the/answer/dto/AnswerResDto.java b/src/main/java/com/moment/the/answer/dto/AnswerResDto.java new file mode 100644 index 00000000..5cd650ae --- /dev/null +++ b/src/main/java/com/moment/the/answer/dto/AnswerResDto.java @@ -0,0 +1,17 @@ +package com.moment.the.answer.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.*; + +@Builder +@Getter @Setter +@NoArgsConstructor @AllArgsConstructor +public class AnswerResDto { + + private Long answerIdx; + private String title; + @JsonProperty("answerContent") + private String content; + private String writer; + +} diff --git a/src/main/java/com/moment/the/answer/repository/AnswerRepository.java b/src/main/java/com/moment/the/answer/repository/AnswerRepository.java new file mode 100644 index 00000000..fa519ea3 --- /dev/null +++ b/src/main/java/com/moment/the/answer/repository/AnswerRepository.java @@ -0,0 +1,18 @@ +package com.moment.the.answer.repository; + + +import com.moment.the.admin.AdminDomain; +import com.moment.the.answer.AnswerDomain; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface AnswerRepository extends JpaRepository { + void deleteAllByAnswerIdx(Long answerIdx); + + Optional findByAdminDomain(AdminDomain adminDomain); + + AnswerDomain findTop1ByTableDomain_BoardIdx(Long boardIdx); +} diff --git a/src/main/java/com/moment/the/answer/service/AnswerService.java b/src/main/java/com/moment/the/answer/service/AnswerService.java new file mode 100644 index 00000000..83168e24 --- /dev/null +++ b/src/main/java/com/moment/the/answer/service/AnswerService.java @@ -0,0 +1,112 @@ +package com.moment.the.answer.service; + +import com.moment.the.admin.AdminDomain; +import com.moment.the.admin.repository.AdminRepository; +import com.moment.the.admin.service.AdminServiceImpl; +import com.moment.the.answer.AnswerDomain; +import com.moment.the.answer.dto.AnswerDto; +import com.moment.the.answer.dto.AnswerResDto; +import com.moment.the.answer.repository.AnswerRepository; +import com.moment.the.exceptionAdvice.exception.*; +import com.moment.the.table.TableDomain; +import com.moment.the.table.repository.TableRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class AnswerService { + final private AdminRepository adminRepo; + final private AnswerRepository answerRepo; + final private TableRepository tableRepo; + + // 답변 작성하기 + public AnswerDomain save(AnswerDto answerDto, Long boardIdx) { + //예외 처리 + TableDomain tableDomain = tableFindBy(boardIdx); // table 번호로 찾고 없으면 Exception + boolean existAnswer = tableDomain.getAnswerDomain() != null ? true : false; + if(existAnswer) throw new AnswerAlreadyExistsException(); //이미 답변이 있으면 Exception + + AdminDomain adminDomain = adminRepo.findByAdminId(AdminServiceImpl.getUserEmail()); + + // AnswerDomain 생성 및 Table 과의 연관관계 맻음 + answerDto.setAdminDomain(adminDomain); + AnswerDomain saveAnswerDomain = answerDto.toEntity(); + saveAnswerDomain.updateTableDomain(tableDomain); + + AnswerDomain savedAnswerDomain = answerRepo.save(saveAnswerDomain); + + return savedAnswerDomain; + } + + // 답변 수정하기 + @Transactional + public AnswerDomain update(AnswerDto answerDto, Long answerIdx) { + AnswerDomain answerDomain = answerFindBy(answerIdx); // 해당하는 answer 찾기 + AdminDomain answerAdmin = answerDomain.getAdminDomain(); + AdminDomain loginAdmin = adminRepo.findByAdminId(AdminServiceImpl.getUserEmail()); + + answerOwnerCheck(answerAdmin, loginAdmin); // 자신이 작성한 답변인지 확인 + + // 답변 업데이트하기 + answerDomain.update(answerDto); + + return answerDomain; + } + + public AnswerResDto view(Long boardIdx) { + // 해당 boardIdx를 참조하는 answerDomain 찾기. + AnswerDomain answerDomain = answerRepo.findTop1ByTableDomain_BoardIdx(boardIdx); + + AnswerResDto answerResDto = AnswerResDto.builder() + .answerIdx(answerDomain.getAnswerIdx()) + .title(answerDomain.getTableDomain().getContent()) + .content(answerDomain.getAnswerContent()) + .writer(answerDomain.getAdminDomain().getAdminName()) + .build(); + + return answerResDto; + } + + // 답변 삭제하기 + @Transactional + public void delete(Long answerIdx) { + // 해당하는 answer 찾기 + AnswerDomain answerDomain = answerFindBy(answerIdx); + AdminDomain answerAdmin = answerDomain.getAdminDomain(); + + AdminDomain loginAdmin = adminRepo.findByAdminId(AdminServiceImpl.getUserEmail()); + answerOwnerCheck(answerAdmin, loginAdmin); // 자신이 작성한 답변인지 확인 + + // answer 삭제하기 + deleteAnswer(answerDomain); + } + + // answerIdx 로 해당 answer 찾기 + public AnswerDomain answerFindBy(Long answerId){ + return answerRepo.findById(answerId).orElseThrow(NoCommentException::new); + } + + // AdminDomain 로 해당 answer 찾기 + public AnswerDomain answerFindBy(AdminDomain adminDomain){ + return answerRepo.findByAdminDomain(adminDomain).orElseThrow(() -> new IllegalArgumentException("해당 답변은 없습니다.")); + } + + // tableIdx 로 해당 table 찾기 + public TableDomain tableFindBy(Long tableId){ + return tableRepo.findById(tableId).orElseThrow(NoPostException::new); + } + + public void deleteAnswer(AnswerDomain answerDomain){ + Long answerIdx = answerDomain.getAnswerIdx(); + answerDomain.getTableDomain().updateAnswerDomain(null); // 외래키 제약조건으로 인한 오류 해결 + answerRepo.deleteAllByAnswerIdx(answerIdx); + } + + public void answerOwnerCheck(AdminDomain answerAdmin, AdminDomain loginAdmin){ + boolean isAdminOwnerThisAnswer = answerAdmin == loginAdmin; + if(!isAdminOwnerThisAnswer) + throw new AccessNotFoundException(); + } +} diff --git a/src/main/java/com/moment/the/config/exception/MessageConfiguration.java b/src/main/java/com/moment/the/config/exception/MessageConfiguration.java new file mode 100644 index 00000000..9cebbbb0 --- /dev/null +++ b/src/main/java/com/moment/the/config/exception/MessageConfiguration.java @@ -0,0 +1,61 @@ +package com.moment.the.config.exception; + +import net.rakugakibox.util.YamlResourceBundle; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.MessageSource; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.support.ResourceBundleMessageSource; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; +import org.springframework.web.servlet.i18n.SessionLocaleResolver; + +import java.util.Locale; +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +@Configuration +public class MessageConfiguration implements WebMvcConfigurer { + + @Bean // 세션 지역설정 + public SessionLocaleResolver localResolver_s(){ + SessionLocaleResolver slr = new SessionLocaleResolver(); + slr.setDefaultLocale(Locale.KOREAN); + return slr; + } + + @Bean // 지역설정을 변경하는 인터셉터. + public LocaleChangeInterceptor localeChangeInterceptor(){ + LocaleChangeInterceptor lci = new LocaleChangeInterceptor(); + lci.setParamName("lang"); + return lci; + } + + @Override // 인터셉터를 시스템 레지스트리에 등록 + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(localeChangeInterceptor()); + } + + @Bean + public MessageSource messageSource( + @Value("${spring.messages.basename}") String basename, + @Value("${spring.messages.encoding") String encoding + ){ + YamlMessageSource ms = new YamlMessageSource(); + ms.setBasename(basename); + ms.setDefaultEncoding(encoding); + ms.setAlwaysUseMessageFormat(true); + ms.setUseCodeAsDefaultMessage(true); + ms.setFallbackToSystemLocale(true); + return ms; + } + + // locale 정보에 따라 다른 yml 파일을 읽도록 처리 + private static class YamlMessageSource extends ResourceBundleMessageSource { + @Override + protected ResourceBundle doGetBundle(String basename, Locale locale) throws MissingResourceException { + return ResourceBundle.getBundle(basename, locale, YamlResourceBundle.Control.INSTANCE); + } + } +} diff --git a/src/main/java/com/moment/the/config/mvc/ExceptionHandlerFilter.java b/src/main/java/com/moment/the/config/mvc/ExceptionHandlerFilter.java new file mode 100644 index 00000000..f3a8487f --- /dev/null +++ b/src/main/java/com/moment/the/config/mvc/ExceptionHandlerFilter.java @@ -0,0 +1,63 @@ +package com.moment.the.config.mvc; + +import com.moment.the.exceptionAdvice.ExceptionAdvice; +import com.moment.the.exceptionAdvice.exception.AccessTokenExpiredException; +import com.moment.the.exceptionAdvice.exception.InvalidTokenException; +import com.moment.the.exceptionAdvice.exception.UserNotFoundException; +import com.moment.the.response.ResponseService; +import com.moment.the.response.result.CommonResult; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Slf4j +@Component +@RequiredArgsConstructor +public class ExceptionHandlerFilter extends OncePerRequestFilter { + + private final ExceptionAdvice exceptionAdvice; + private final ResponseService resService; + + @Override + protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) { + try { + filterChain.doFilter(req, res); + }catch(InvalidTokenException e){ + setExceptionRes(HttpStatus.BAD_REQUEST, res, exceptionAdvice.invalidToken(req, e)); + }catch(AccessTokenExpiredException e){ + setExceptionRes(HttpStatus.BAD_REQUEST, res, exceptionAdvice.accessTokenExpiredException(req, e)); + }catch (UserNotFoundException e){ + setExceptionRes(HttpStatus.BAD_REQUEST, res, exceptionAdvice.userNotFoundException(req, e)); + } catch (Exception e){ + log.error("알 수 없는 에러 발생", e); + setExceptionRes(HttpStatus.INTERNAL_SERVER_ERROR, res, exceptionAdvice.defaultException(req, e)); + } + + + } + + // + public void setExceptionRes(HttpStatus status, HttpServletResponse res, CommonResult exceptionResult) { + res.setStatus(status.value()); + res.setContentType("application/json"); + + int exceptionCode = exceptionResult.getCode(); + String exceptionMsg = exceptionResult.getMsg(); + + try{ + String exceptionResultToJson = resService.getFailResultConvertString(exceptionCode, exceptionMsg); // CommonResult 에 있는 값을 json 으로 변환 + System.out.println(exceptionResultToJson); + res.getWriter().write(exceptionResultToJson); // filter 단에서 client 에 json 을 보넨다. + }catch (Exception e){ + e.printStackTrace(); + throw new UnknownError(); + } + } + +} diff --git a/src/main/java/com/moment/the/config/mvc/RequestResponseLoggingFilter.java b/src/main/java/com/moment/the/config/mvc/RequestResponseLoggingFilter.java new file mode 100644 index 00000000..e40f2d72 --- /dev/null +++ b/src/main/java/com/moment/the/config/mvc/RequestResponseLoggingFilter.java @@ -0,0 +1,34 @@ +package com.moment.the.config.mvc; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; +import org.springframework.web.util.ContentCachingRequestWrapper; +import org.springframework.web.util.ContentCachingResponseWrapper; +import org.springframework.web.util.WebUtils; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@Component +public class RequestResponseLoggingFilter extends OncePerRequestFilter { + + @Override + protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws ServletException, IOException { + ContentCachingResponseWrapper resWrapper = new ContentCachingResponseWrapper(res); + + log.info("[REQUEST] {} - {} {}", + req.getMethod(), req.getRequestURI(), resWrapper.getStatus() + ); + chain.doFilter(req, res); + } + +} diff --git a/src/main/java/com/moment/the/config/mvc/WebMvcConfigurerImpl.java b/src/main/java/com/moment/the/config/mvc/WebMvcConfigurerImpl.java new file mode 100644 index 00000000..7603eec6 --- /dev/null +++ b/src/main/java/com/moment/the/config/mvc/WebMvcConfigurerImpl.java @@ -0,0 +1,25 @@ +package com.moment.the.config.mvc; + +import io.swagger.models.HttpMethod; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebMvcConfigurerImpl implements WebMvcConfigurer { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") // 모든 요청에 대해서 + .allowedOrigins("https://the-moment.org", "https://www.the-moment.org", "https://server.the-moment.org") // local, docker + .allowedMethods( + HttpMethod.GET.name(), + HttpMethod.HEAD.name(), + HttpMethod.POST.name(), + HttpMethod.PUT.name(), + HttpMethod.DELETE.name(), + HttpMethod.OPTIONS.name() + ) + .maxAge(3600); + } + +} diff --git a/src/main/java/com/moment/the/config/security/SecurityConfiguration.java b/src/main/java/com/moment/the/config/security/SecurityConfiguration.java new file mode 100644 index 00000000..da3f564b --- /dev/null +++ b/src/main/java/com/moment/the/config/security/SecurityConfiguration.java @@ -0,0 +1,55 @@ +package com.moment.the.config.security; + +import com.moment.the.config.mvc.ExceptionHandlerFilter; +import com.moment.the.config.security.jwt.JwtRequestFilter; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.factory.PasswordEncoderFactories; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +@RequiredArgsConstructor +@EnableWebSecurity +@Configuration +public class SecurityConfiguration extends WebSecurityConfigurerAdapter { + + private final JwtRequestFilter jwtRequestFilter; + private final ExceptionHandlerFilter exceptionHandlerFilter; + + @Override + public void configure(WebSecurity web) { + web.ignoring().antMatchers("/**/api-docs", "/swagger-resources/**", + "/swagger-ui.html", "/webjars/**", "/swagger/**", "/h2-console/**", "/configuration/ui"); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .cors().and() + .httpBasic().disable() + .csrf().disable() + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .and() + .authorizeRequests() + .antMatchers("/v1/admin/**").authenticated() + .anyRequest().permitAll() + .and() + .exceptionHandling().accessDeniedHandler(null) //관리자 에러 + .and() + .exceptionHandling().authenticationEntryPoint(null) //로그인 에러 + .and() + .addFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class) + .addFilterBefore(exceptionHandlerFilter, JwtRequestFilter.class); + } + + @Bean + public PasswordEncoder passwordEncoder(){ + return PasswordEncoderFactories.createDelegatingPasswordEncoder(); + } +} diff --git a/src/main/java/com/moment/the/config/security/auth/MyUserDetailsService.java b/src/main/java/com/moment/the/config/security/auth/MyUserDetailsService.java new file mode 100644 index 00000000..7151a07c --- /dev/null +++ b/src/main/java/com/moment/the/config/security/auth/MyUserDetailsService.java @@ -0,0 +1,21 @@ +package com.moment.the.config.security.auth; + +import com.moment.the.admin.AdminDomain; +import com.moment.the.admin.repository.AdminRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class MyUserDetailsService implements UserDetailsService { + private final AdminRepository adminRepository; + + @Override + public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { + AdminDomain adminDomain = adminRepository.findByAdminId(email); + return adminDomain; + } +} diff --git a/src/main/java/com/moment/the/config/security/jwt/JwtRequestFilter.java b/src/main/java/com/moment/the/config/security/jwt/JwtRequestFilter.java new file mode 100644 index 00000000..98ed5f9f --- /dev/null +++ b/src/main/java/com/moment/the/config/security/jwt/JwtRequestFilter.java @@ -0,0 +1,114 @@ +package com.moment.the.config.security.jwt; + +import com.moment.the.config.security.auth.MyUserDetailsService; +import com.moment.the.exceptionAdvice.exception.InvalidTokenException; +import com.moment.the.exceptionAdvice.exception.UserNotFoundException; +import io.jsonwebtoken.ExpiredJwtException; +import io.jsonwebtoken.MalformedJwtException; +import io.jsonwebtoken.UnsupportedJwtException; +import io.jsonwebtoken.security.SignatureException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@Slf4j +@Component +@RequiredArgsConstructor +public class JwtRequestFilter extends OncePerRequestFilter { + private final MyUserDetailsService myUserDetailsService; + private final JwtUtil jwtUtil; + + @Override + protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) throws ServletException, IOException { + String accessToken = req.getHeader("Authorization"); + String refreshToken = req.getHeader("RefreshToken"); + + String userEmail; + + // Access Token이 null이면 검증할 필요가 없다. + if (accessToken != null) { + log.debug("=== accessToken 검증 시작 ==="); + + userEmail = accessTokenExtractEmail(accessToken); + if(userEmail != null) + registerUserInfoInSecurityContext(userEmail, req); + + // Access Token이 만료되고 Refresh Token이 존재해야지 새로운 AccessToken을 반한한다. + if(jwtUtil.isTokenExpired(accessToken) && refreshToken != null){ + log.debug("=== AccessToken 만료 ==="); + + String newAccessToken = generateNewAccessToken(refreshToken); + res.addHeader("JwtToken", newAccessToken); + + log.debug("=== AccessToken 발급 ==="); + } + } + filterChain.doFilter(req, res); + } + + /** + * accessToken에서 userEmail claim 값을 추출한다. + * + * @param accessToken Access Token + * @return userEmail - accessToken에서 정상적으로 email를 추출할때 user email을 반한한다. + * @throws InvalidTokenException - accessToken이 null이 아니고 올바르지 않을때 발생한다. + * @author 정시원 + */ + private String accessTokenExtractEmail(String accessToken) { + try { + if(jwtUtil.getTokenType(accessToken).equals(JwtUtil.TokenType.REFRESH_TOKEN.value)) + return accessToken; + else + return null; + } catch (IllegalArgumentException | ExpiredJwtException e) { + return null; + } catch (MalformedJwtException | UnsupportedJwtException | SignatureException e ) { + throw new InvalidTokenException(); + } + } + + /** + * user email로 사용자의 유무를 판단해 SecurityContext에 유저를 등록한다. + * + * @param userEmail - String + * @param req - HttpServletRequest + * @throws UserNotFoundException - 해당 사용자가 없을 경우 throw 된다. + * @author 정시원 + */ + private void registerUserInfoInSecurityContext(String userEmail, HttpServletRequest req) { + try { + UserDetails userDetails = myUserDetailsService.loadUserByUsername(userEmail); + + UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); + usernamePasswordAuthenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(req)); + SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken); + } catch (NullPointerException e) { + throw new UserNotFoundException(); + } + } + + /** + * @param refreshToken - 유저가 가지고 있는 refreshToken + * @return newAccessToken - 새로만든 AccessToken을 발급합니다. + * @throws InvalidTokenException RefreshToken이 올바르지 않을때 throws된다. + * @author 정시원 + */ + private String generateNewAccessToken(String refreshToken) { + try { + return jwtUtil.generateAccessToken(jwtUtil.getUserEmail(refreshToken)); + } catch (IllegalArgumentException | UnsupportedJwtException | SignatureException | MalformedJwtException | ExpiredJwtException e) { + throw new InvalidTokenException(); + } + } +} diff --git a/src/main/java/com/moment/the/config/security/jwt/JwtUtil.java b/src/main/java/com/moment/the/config/security/jwt/JwtUtil.java new file mode 100644 index 00000000..11e8dcde --- /dev/null +++ b/src/main/java/com/moment/the/config/security/jwt/JwtUtil.java @@ -0,0 +1,143 @@ +package com.moment.the.config.security.jwt; + +import io.jsonwebtoken.*; +import io.jsonwebtoken.security.Keys; +import io.jsonwebtoken.security.SignatureException; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.nio.charset.StandardCharsets; +import java.security.Key; +import java.util.Date; + +@Component +public class JwtUtil { + @Value("${spring.jwt.secret}") + private String SECRET_KEY; + + public final static long ACCESS_TOKEN_EXPIRATION_TIME = 1000L * 3600 * 6; // milli_sec * hour * 6 = 6hour + public final static long REFRESH_TOKEN_EXPIRATION_TIME = 1000L * 3600 * 24 * 30 * 7; // milli_sec X hour X day X month * 7 = 7month + + enum TokenType{ + ACCESS_TOKEN("accessToken"), + REFRESH_TOKEN("refreshToken"); + String value; + + TokenType(String value) { this.value = value; } + } + + enum TokenClaimName{ + USER_EMAIL("userEmail"), + TOKEN_TYPE("tokenType"); + String value; + + TokenClaimName(String value) { this.value = value; } + } + + /** + * JWT에 넣을 비밀키를 인코딩하여 반환한다. + * @param secretKey 비밀키 + * @return secretKey + */ + private Key getSigningKey(String secretKey) { + byte[] keyBytes = secretKey.getBytes(StandardCharsets.UTF_8); + return Keys.hmacShaKeyFor(keyBytes); + } + + /** + * JWT에서 claims 추출하는 함수 + * @param token JWT + * @return Jwts - JwtToken의 Claims 값을 모두 추출한 Jwts객체 + * @throws ExpiredJwtException - JWT를 생성할 떄 지정한 유효기간을 초과할 때 발생힌다. + * @throws IllegalArgumentException - JWT이 비어있을때 발생한다. + * @throws MalformedJwtException - JWT가 올바르게 구성되지 않았을 떄 발생한다. + * @throws SignatureException - JWT의 기존 서명을 확인하지 못했을 때 + * @throws UnsupportedJwtException 예상하는 형식과 일치하지 않는 특정 형식이나 구성의 JWT일 때 + * @author 정시원 + */ + public Claims extractAllClaims(String token) throws ExpiredJwtException, IllegalArgumentException, MalformedJwtException, SignatureException, UnsupportedJwtException { + return Jwts.parserBuilder() + .setSigningKey(getSigningKey(SECRET_KEY)) + .build() + .parseClaimsJws(token) + .getBody(); + } + + /** + * 토큰의 userEmail claim에서 email를 추출한다. + * @param token JWT + * @return String email + * @author 정시원 + */ + public String getUserEmail(String token){ + return extractAllClaims(token).get(TokenClaimName.USER_EMAIL.value, String.class); + } + + /** + * 토큰의 tokenType claim에서 token type을 추출한다. + * @param token JWT + * @return String tokenType + * @author 정시원 + */ + public String getTokenType(String token){ + return extractAllClaims(token).get(TokenClaimName.TOKEN_TYPE.value, String.class); + } + + /** + * 토큰이 만료여부에 따라 true/false를 반환한다. + * @param token JWT + * @return true - 토큰이 만료되었을 때 + * @author 정시원 + */ + public Boolean isTokenExpired(String token) { + try{ + extractAllClaims(token).getExpiration(); + return false; + }catch(ExpiredJwtException e) { + return true; + } + } + + /** + * JWT를 만든다. + * @param userEmail JWT에 넣을 userEmail claim값 + * @param tokenType AccessToken, RefreshToken 구분 + * @param expireTime 만료시간 + * @return JWT + * @author 정시원 + */ + private String doGenerateToken(String userEmail, TokenType tokenType, long expireTime) { + final Claims claims = Jwts.claims(); + //AccessToken일 떄 TokenClaim에 UserEmail을 추가한다. + if(TokenType.ACCESS_TOKEN == tokenType) + claims.put("userEmail", userEmail); + claims.put("tokenType", tokenType.value); + return Jwts.builder() + .setClaims(claims) + .setIssuedAt(new Date(System.currentTimeMillis())) + .setExpiration(new Date(System.currentTimeMillis() + expireTime)) + .signWith(getSigningKey(SECRET_KEY), SignatureAlgorithm.HS256) + .compact(); + } + + /** + * AccessToken을 만든다. + * @param email 현재 사용자의 사용자의 email + * @return AccessToken + * @author 정시원 + */ + public String generateAccessToken(String email) { + return doGenerateToken(email, TokenType.ACCESS_TOKEN, ACCESS_TOKEN_EXPIRATION_TIME); + } + + /** + * RefreshToken을 만든다. + * @param email 현재 사용자의 email + * @return RefreshToken + * @author 정시원 + */ + public String generateRefreshToken(String email) { + return doGenerateToken(email, TokenType.REFRESH_TOKEN, REFRESH_TOKEN_EXPIRATION_TIME); + } + +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/ExceptionAdvice.java b/src/main/java/com/moment/the/exceptionAdvice/ExceptionAdvice.java new file mode 100644 index 00000000..87048747 --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/ExceptionAdvice.java @@ -0,0 +1,112 @@ +package com.moment.the.exceptionAdvice; + +import com.moment.the.exceptionAdvice.exception.*; +import com.moment.the.response.result.CommonResult; +import com.moment.the.response.ResponseService; +import lombok.RequiredArgsConstructor; +import org.springframework.context.MessageSource; +import org.springframework.context.i18n.LocaleContextHolder; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import javax.servlet.http.HttpServletRequest; + +@RequiredArgsConstructor +@RestControllerAdvice +public class ExceptionAdvice { + private final ResponseService responseService; + private final MessageSource messageSource; + + // code 정보에 해당하는 메시지를 조회한다. + private String getMessage(String code){ + return getMessage(code, null); + } + + // code 정보, 추가 argument로 현재 locale에 맞는 메시지를 조회합니다. + private String getMessage(String code, Object[] args){ + return messageSource.getMessage(code, args, LocaleContextHolder.getLocale()); + } + + // 예외 처리 메시지를 MessageSource 에서 가져오도록 수정 + @ExceptionHandler(Exception.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public CommonResult defaultException(HttpServletRequest request, Exception e){ + return responseService.getFailResult(Integer.valueOf(getMessage("unKnown.code")), e.getMessage()); + } + // 사용자를 찾을 수 없습니다. + @ExceptionHandler(UserNotFoundException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + public CommonResult userNotFoundException(HttpServletRequest request, UserNotFoundException e){ + return responseService.getFailResult(Integer.valueOf(getMessage("userNotFound.code")), getMessage("userNotFound.msg")); + } + // 유저가 이미 존재합니다. + @ExceptionHandler(UserAlreadyExistsException.class) + @ResponseStatus(HttpStatus.CONFLICT) + protected CommonResult userAlreadyExistsException(HttpServletRequest request, UserAlreadyExistsException e){ + return responseService.getFailResult(Integer.valueOf(getMessage("userAlreadyExists.code")), getMessage("userAlreadyExists.msg")); + } + // 해당 게시글을 찾을 수 없습니다. + @ExceptionHandler(NoPostException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + protected CommonResult noPostException(HttpServletRequest request, NoPostException e){ + return responseService.getFailResult(Integer.valueOf(getMessage("noPost.code")), getMessage("noPost.msg")); + } + // 해당 답변을 찾을 수 없습니다. + @ExceptionHandler(NoCommentException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + protected CommonResult noCommentException(HttpServletRequest request, NoCommentException e){ + return responseService.getFailResult(Integer.valueOf(getMessage("noComment.code")), getMessage("noComment.msg")); + } + // 해당 개선 사례를 찾을 수 없습니다. + @ExceptionHandler(NoImprovementException.class) + @ResponseStatus(HttpStatus.NOT_FOUND) + protected CommonResult noImprovementException(HttpServletRequest request, NoImprovementException e){ + return responseService.getFailResult(Integer.valueOf(getMessage("noImprovement.code")), getMessage("noImprovement.msg")); + } + // 요청 형식에 알맞지 않습니다.(MethodArgumentNotValidException) + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + protected CommonResult customMethodArgumentNotValidException(HttpServletRequest req, MethodArgumentNotValidException ex){ + return responseService.getFailResult(Integer.valueOf(getMessage("method-argument-not-valid.code")), getMessage("method-argument-not-valid.msg")); + } + // 요청 형식에 알맞지 않습니다.(CustomMethodArgumentNotValidException) + @ExceptionHandler(CustomMethodArgumentNotValidException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + protected CommonResult customMethodArgumentNotValidException(HttpServletRequest req, CustomMethodArgumentNotValidException ex){ + return responseService.getFailResult(Integer.valueOf(getMessage("method-argument-not-valid.code")), getMessage("method-argument-not-valid.msg")); + } + //추천할 수 없습니다. + @ExceptionHandler(GoodsNotCancelException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + protected CommonResult goodsNotCancelException(HttpServletRequest request, GoodsNotCancelException e){ + return responseService.getFailResult(Integer.valueOf(getMessage("goods-not-cancel.code")), getMessage("goods-not-cancel.msg")); + } + //accessToken 이 만료되었습니다. + @ExceptionHandler(AccessTokenExpiredException.class) + @ResponseStatus(HttpStatus.FORBIDDEN) + public CommonResult accessTokenExpiredException(HttpServletRequest req, AccessTokenExpiredException e){ + return responseService.getFailResult(Integer.valueOf(getMessage("access-token-expired.code")), getMessage("access-token-expired.msg")); + } + + //token(access, refresh)이 올바르지 않습니다.. + @ExceptionHandler(InvalidTokenException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public CommonResult invalidToken(HttpServletRequest req, InvalidTokenException e){ + return responseService.getFailResult(Integer.valueOf(getMessage("invalid-token.code")), getMessage("invalid-token.msg")); + } + + @ExceptionHandler(AnswerAlreadyExistsException.class) + @ResponseStatus(HttpStatus.CONFLICT) + protected CommonResult answerAlreadyExistsException(HttpServletRequest req, AnswerAlreadyExistsException e){ + return responseService.getFailResult(Integer.valueOf(getMessage("answer-already-exists.code")), getMessage("answer-already-exists.msg")); + } + + @ExceptionHandler(AccessNotFoundException.class) + @ResponseStatus(HttpStatus.FORBIDDEN) + protected CommonResult accessNotFoundException(HttpServletRequest req, AccessNotFoundException e){ + return responseService.getFailResult(Integer.valueOf(getMessage("access-not-found.code")), getMessage("access-not-found.msg")); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/controller/ExceptionController.java b/src/main/java/com/moment/the/exceptionAdvice/controller/ExceptionController.java new file mode 100644 index 00000000..8b000d99 --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/controller/ExceptionController.java @@ -0,0 +1,61 @@ +package com.moment.the.exceptionAdvice.controller; + +import com.moment.the.exceptionAdvice.exception.*; +import com.moment.the.response.result.CommonResult; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RequiredArgsConstructor +@RestController +@RequestMapping(value = "/exception") +public class ExceptionController { + // userNotFoundException + @GetMapping(value = "/userNotFound") + public CommonResult userNotFoundException() { + throw new UserNotFoundException(); + } + + @GetMapping(value = "/userAlreadyExists") + public CommonResult userAlreadyExistsException() { + throw new UserAlreadyExistsException(); + } + + @GetMapping(value = "/noPost") + public CommonResult noPostException() { + throw new NoPostException(); + } + + @GetMapping(value = "/noComment") + public CommonResult noCommentException() { + throw new NoCommentException(); + } + + @GetMapping(value = "/noImprovement") + public CommonResult noImprovement() { + throw new NoCommentException(); + } + + @GetMapping(value = "/method-argument-not-valid") + public CommonResult methodArgumentNotValid() { + throw new CustomMethodArgumentNotValidException(); + } + + @GetMapping(value = "/goods-not-cancel") + public CommonResult goodsNotCancel(){ + throw new GoodsNotCancelException(); + } + + @GetMapping(value = "/access-token-expired") + public CommonResult accessTokenExpired(){throw new AccessTokenExpiredException();} + + @GetMapping(value = "/invalid-token") + public CommonResult invalidToken(){throw new InvalidTokenException();} + + @GetMapping(value = "/answer-already-exists") + public CommonResult answerAlreadyExists(){throw new AnswerAlreadyExistsException();} + + @GetMapping(value = "/access-not-found") + public CommonResult accessNotFound(){throw new AccessNotFoundException();} +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/AccessNotFoundException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/AccessNotFoundException.java new file mode 100644 index 00000000..41c88c61 --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/exception/AccessNotFoundException.java @@ -0,0 +1,13 @@ +package com.moment.the.exceptionAdvice.exception; + +public class AccessNotFoundException extends RuntimeException{ + public AccessNotFoundException(String msg, Throwable t){ + super(msg, t); + } + public AccessNotFoundException(String msg){ + super(msg); + } + public AccessNotFoundException(){ + super(); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/AccessTokenExpiredException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/AccessTokenExpiredException.java new file mode 100644 index 00000000..370be065 --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/exception/AccessTokenExpiredException.java @@ -0,0 +1,14 @@ +package com.moment.the.exceptionAdvice.exception; + +public class AccessTokenExpiredException extends RuntimeException{ + public AccessTokenExpiredException(String msg, Throwable t){ + super(msg, t); + } + public AccessTokenExpiredException(String msg){ + super(msg); + } + public AccessTokenExpiredException(){ + super(); + } + +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/AnswerAlreadyExistsException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/AnswerAlreadyExistsException.java new file mode 100644 index 00000000..8aaa8c4a --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/exception/AnswerAlreadyExistsException.java @@ -0,0 +1,13 @@ +package com.moment.the.exceptionAdvice.exception; + +public class AnswerAlreadyExistsException extends RuntimeException{ + public AnswerAlreadyExistsException(String msg, Throwable t){ + super(msg, t); + } + public AnswerAlreadyExistsException(String msg){ + super(msg); + } + public AnswerAlreadyExistsException(){ + super(); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/CustomMethodArgumentNotValidException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/CustomMethodArgumentNotValidException.java new file mode 100644 index 00000000..57522292 --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/exception/CustomMethodArgumentNotValidException.java @@ -0,0 +1,13 @@ +package com.moment.the.exceptionAdvice.exception; + +public class CustomMethodArgumentNotValidException extends RuntimeException{ + public CustomMethodArgumentNotValidException(String msg, Throwable t){ + super(msg, t); + } + public CustomMethodArgumentNotValidException(String msg){ + super(msg); + } + public CustomMethodArgumentNotValidException(){ + super(); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/GoodsNotCancelException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/GoodsNotCancelException.java new file mode 100644 index 00000000..18298ed5 --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/exception/GoodsNotCancelException.java @@ -0,0 +1,13 @@ +package com.moment.the.exceptionAdvice.exception; + +public class GoodsNotCancelException extends RuntimeException{ + public GoodsNotCancelException(String msg, Throwable t){ + super(msg, t); + } + public GoodsNotCancelException(String msg){ + super(msg); + } + public GoodsNotCancelException(){ + super(); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/InvalidTokenException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/InvalidTokenException.java new file mode 100644 index 00000000..abb062c8 --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/exception/InvalidTokenException.java @@ -0,0 +1,13 @@ +package com.moment.the.exceptionAdvice.exception; + +public class InvalidTokenException extends RuntimeException{ + public InvalidTokenException(String msg, Throwable t){ + super(msg, t); + } + public InvalidTokenException(String msg){ + super(msg); + } + public InvalidTokenException(){ + super(); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/NoCommentException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/NoCommentException.java new file mode 100644 index 00000000..205cf0a0 --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/exception/NoCommentException.java @@ -0,0 +1,13 @@ +package com.moment.the.exceptionAdvice.exception; + +public class NoCommentException extends RuntimeException{ + public NoCommentException(String msg, Throwable t){ + super(msg, t); + } + public NoCommentException(String msg){ + super(msg); + } + public NoCommentException(){ + super(); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/NoGoodException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/NoGoodException.java new file mode 100644 index 00000000..8e393e6b --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/exception/NoGoodException.java @@ -0,0 +1,13 @@ +package com.moment.the.exceptionAdvice.exception; + +public class NoGoodException extends RuntimeException{ + public NoGoodException(String msg, Throwable t){ + super(msg, t); + } + public NoGoodException(String msg){ + super(msg); + } + public NoGoodException(){ + super(); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/NoImprovementException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/NoImprovementException.java new file mode 100644 index 00000000..e63b5dbf --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/exception/NoImprovementException.java @@ -0,0 +1,13 @@ +package com.moment.the.exceptionAdvice.exception; + +public class NoImprovementException extends RuntimeException{ + public NoImprovementException(String msg, Throwable t){ + super(msg, t); + } + public NoImprovementException(String msg){ + super(msg); + } + public NoImprovementException(){ + super(); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/NoPostException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/NoPostException.java new file mode 100644 index 00000000..d5f78315 --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/exception/NoPostException.java @@ -0,0 +1,13 @@ +package com.moment.the.exceptionAdvice.exception; + +public class NoPostException extends RuntimeException{ + public NoPostException(String msg, Throwable t){ + super(msg, t); + } + public NoPostException(String msg){ + super(msg); + } + public NoPostException(){ + super(); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/UserAlreadyExistsException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/UserAlreadyExistsException.java new file mode 100644 index 00000000..f4580879 --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/exception/UserAlreadyExistsException.java @@ -0,0 +1,13 @@ +package com.moment.the.exceptionAdvice.exception; + +public class UserAlreadyExistsException extends RuntimeException{ + public UserAlreadyExistsException(String msg, Throwable t){ + super(msg, t); + } + public UserAlreadyExistsException(String msg){ + super(msg); + } + public UserAlreadyExistsException(){ + super(); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/exception/UserNotFoundException.java b/src/main/java/com/moment/the/exceptionAdvice/exception/UserNotFoundException.java new file mode 100644 index 00000000..b1a55e09 --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/exception/UserNotFoundException.java @@ -0,0 +1,13 @@ +package com.moment.the.exceptionAdvice.exception; + +public class UserNotFoundException extends RuntimeException{ + public UserNotFoundException(String msg, Throwable t){ + super(msg, t); + } + public UserNotFoundException(String msg){ + super(msg); + } + public UserNotFoundException(){ + super(); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/AccessNotFoundHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/AccessNotFoundHandler.java new file mode 100644 index 00000000..5cf2362b --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/handler/AccessNotFoundHandler.java @@ -0,0 +1,12 @@ +package com.moment.the.exceptionAdvice.handler; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class AccessNotFoundHandler { + public void handle(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + res.sendRedirect("/exception/access-not-found"); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/AccessTokenExpiredHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/AccessTokenExpiredHandler.java new file mode 100644 index 00000000..9a3de6a0 --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/handler/AccessTokenExpiredHandler.java @@ -0,0 +1,12 @@ +package com.moment.the.exceptionAdvice.handler; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class AccessTokenExpiredHandler { + public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + response.sendRedirect("/exception/access-token-expired"); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/AnswerAlreadyExistsHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/AnswerAlreadyExistsHandler.java new file mode 100644 index 00000000..deaa2233 --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/handler/AnswerAlreadyExistsHandler.java @@ -0,0 +1,13 @@ +package com.moment.the.exceptionAdvice.handler; + + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class AnswerAlreadyExistsHandler { + public void handle(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + res.sendRedirect("/exception/answer-already-exists"); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/CustomMethodArgumentNotValidHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/CustomMethodArgumentNotValidHandler.java new file mode 100644 index 00000000..d1a965fc --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/handler/CustomMethodArgumentNotValidHandler.java @@ -0,0 +1,12 @@ +package com.moment.the.exceptionAdvice.handler; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class CustomMethodArgumentNotValidHandler { + public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + response.sendRedirect("/exception/methodArgumentNotValid"); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/GoodsNotCancelHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/GoodsNotCancelHandler.java new file mode 100644 index 00000000..489e930b --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/handler/GoodsNotCancelHandler.java @@ -0,0 +1,12 @@ +package com.moment.the.exceptionAdvice.handler; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class GoodsNotCancelHandler { + public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + response.sendRedirect("/exception/goods-not-cancel"); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/InvalidTokenHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/InvalidTokenHandler.java new file mode 100644 index 00000000..457dff73 --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/handler/InvalidTokenHandler.java @@ -0,0 +1,12 @@ +package com.moment.the.exceptionAdvice.handler; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class InvalidTokenHandler { + public void handle(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { + res.sendRedirect("/exception/invalid-token"); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/NoCommentHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/NoCommentHandler.java new file mode 100644 index 00000000..afca8f2d --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/handler/NoCommentHandler.java @@ -0,0 +1,15 @@ +package com.moment.the.exceptionAdvice.handler; + +import lombok.extern.slf4j.Slf4j; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@Slf4j +public class NoCommentHandler { + public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + response.sendRedirect("/exception/noComment"); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/NoImprovementHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/NoImprovementHandler.java new file mode 100644 index 00000000..ae8a1ea1 --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/handler/NoImprovementHandler.java @@ -0,0 +1,15 @@ +package com.moment.the.exceptionAdvice.handler; + +import lombok.extern.slf4j.Slf4j; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@Slf4j +public class NoImprovementHandler { + public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + response.sendRedirect("/exception/noImprovement"); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/NoPostHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/NoPostHandler.java new file mode 100644 index 00000000..02a82b6f --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/handler/NoPostHandler.java @@ -0,0 +1,15 @@ +package com.moment.the.exceptionAdvice.handler; + +import lombok.extern.slf4j.Slf4j; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@Slf4j +public class NoPostHandler { + public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + response.sendRedirect("/exception/noPost"); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/UserAlreadyExistsHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/UserAlreadyExistsHandler.java new file mode 100644 index 00000000..46e46bca --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/handler/UserAlreadyExistsHandler.java @@ -0,0 +1,15 @@ +package com.moment.the.exceptionAdvice.handler; + +import lombok.extern.slf4j.Slf4j; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@Slf4j +public class UserAlreadyExistsHandler { + public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + response.sendRedirect("/exception/userNotFound"); + } +} diff --git a/src/main/java/com/moment/the/exceptionAdvice/handler/UserNotFoundHandler.java b/src/main/java/com/moment/the/exceptionAdvice/handler/UserNotFoundHandler.java new file mode 100644 index 00000000..e9acb2ba --- /dev/null +++ b/src/main/java/com/moment/the/exceptionAdvice/handler/UserNotFoundHandler.java @@ -0,0 +1,15 @@ +package com.moment.the.exceptionAdvice.handler; + +import lombok.extern.slf4j.Slf4j; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@Slf4j +public class UserNotFoundHandler { + public void handle(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { + response.sendRedirect("/exception/userAlreadyExists"); + } +} diff --git a/src/main/java/com/moment/the/improvement/ImprovementDomain.java b/src/main/java/com/moment/the/improvement/ImprovementDomain.java new file mode 100644 index 00000000..c2a09c8b --- /dev/null +++ b/src/main/java/com/moment/the/improvement/ImprovementDomain.java @@ -0,0 +1,38 @@ +package com.moment.the.improvement; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.moment.the.admin.AdminDomain; +import com.moment.the.improvement.dto.ImprovementDto; +import lombok.*; + +import javax.persistence.*; + +@Table(name = "Improvement") +@Entity +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Builder +// No setter!! +public class ImprovementDomain { + @Id + @Column + @GeneratedValue(strategy = GenerationType.IDENTITY) + @JsonIgnore + private Long improveIdx; + @Column + private String improveHeader; + @Column + private String improveContent; + + // 쿼리한번으로 improvement 정보만 가져오는 방법. + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name="adminIdx") + private AdminDomain adminDomain; + + // dirty checking. + public void update(ImprovementDto improvementDto) { + this.improveHeader = improvementDto.getImproveHeader(); + this.improveContent = improvementDto.getImproveContent(); + } +} diff --git a/src/main/java/com/moment/the/improvement/controller/ImprovementController.java b/src/main/java/com/moment/the/improvement/controller/ImprovementController.java new file mode 100644 index 00000000..bbce1a57 --- /dev/null +++ b/src/main/java/com/moment/the/improvement/controller/ImprovementController.java @@ -0,0 +1,60 @@ +package com.moment.the.improvement.controller; + +import com.moment.the.improvement.dto.ImprovementDto; +import com.moment.the.improvement.dto.ImprovementViewAllDto; +import com.moment.the.improvement.service.ImprovementService; +import com.moment.the.response.ResponseService; +import com.moment.the.response.result.CommonResult; +import com.moment.the.response.result.ListResult; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +@RestController +@RequestMapping("/v1") +@RequiredArgsConstructor +public class ImprovementController { + private final ImprovementService improvementService; + private final ResponseService responseService; + + // 개선사례작성 + @PostMapping("/solved") + @ApiImplicitParams({ + @ApiImplicitParam(name = "Authorization", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header"), + @ApiImplicitParam(name = "RefreshToken", value = "로그인 성공 후 refresh_token", required = false, dataType = "String", paramType = "header") + }) + public CommonResult save(@Valid @RequestBody ImprovementDto improvementDto){ + improvementService.save(improvementDto); + return responseService.getSuccessResult(); + } + + // 개선사례보기 + @GetMapping("/solved") + public ListResult view(){ + return responseService.getListResult(improvementService.read()); + } + + // 개선사례수정 + @PutMapping("/solved/{improveIdx}") + @ApiImplicitParams({ + @ApiImplicitParam(name = "Authorization", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header"), + @ApiImplicitParam(name = "RefreshToken", value = "로그인 성공 후 refresh_token", required = false, dataType = "String", paramType = "header") + }) + public CommonResult update(@RequestBody ImprovementDto improvementDto, @PathVariable Long improveIdx) { + improvementService.update(improvementDto, improveIdx); + return responseService.getSuccessResult(); + } + + // 개선사례삭제 + @DeleteMapping("/solved/{improveIdx}") + @ApiImplicitParams({ + @ApiImplicitParam(name = "Authorization", value = "로그인 성공 후 access_token", required = true, dataType = "String", paramType = "header") + }) + public CommonResult delete(@PathVariable Long improveIdx) { + improvementService.delete(improveIdx); + return responseService.getSuccessResult(); + } +} diff --git a/src/main/java/com/moment/the/improvement/dto/ImprovementDto.java b/src/main/java/com/moment/the/improvement/dto/ImprovementDto.java new file mode 100644 index 00000000..c165fcbe --- /dev/null +++ b/src/main/java/com/moment/the/improvement/dto/ImprovementDto.java @@ -0,0 +1,28 @@ +package com.moment.the.improvement.dto; + +import com.moment.the.admin.AdminDomain; +import com.moment.the.improvement.ImprovementDomain; +import lombok.*; + +import javax.validation.constraints.NotBlank; + + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ImprovementDto { + @NotBlank + private String improveHeader; + @NotBlank + private String improveContent; + + public ImprovementDomain ToEntity(AdminDomain adminDomain){ + return ImprovementDomain.builder() + .improveHeader(this.getImproveHeader()) + .improveContent(this.getImproveContent()) + .adminDomain(adminDomain) + .build(); + } +} diff --git a/src/main/java/com/moment/the/improvement/dto/ImprovementViewAllDto.java b/src/main/java/com/moment/the/improvement/dto/ImprovementViewAllDto.java new file mode 100644 index 00000000..01147af1 --- /dev/null +++ b/src/main/java/com/moment/the/improvement/dto/ImprovementViewAllDto.java @@ -0,0 +1,18 @@ +package com.moment.the.improvement.dto; + +import lombok.*; + +import javax.validation.constraints.NotBlank; + +@Getter @Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ImprovementViewAllDto { + @NotBlank + private String improveIdx; + @NotBlank + private String improveHeader; + @NotBlank + private String improveContent; +} diff --git a/src/main/java/com/moment/the/improvement/repository/ImprovementRepository.java b/src/main/java/com/moment/the/improvement/repository/ImprovementRepository.java new file mode 100644 index 00000000..72405c63 --- /dev/null +++ b/src/main/java/com/moment/the/improvement/repository/ImprovementRepository.java @@ -0,0 +1,19 @@ +package com.moment.the.improvement.repository; + +import com.moment.the.improvement.ImprovementDomain; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface ImprovementRepository extends JpaRepository { + // 해당 idx 찾기. + ImprovementDomain findByImproveIdx(Long improveIdx); + // 개시글 제목으로 찾기. + ImprovementDomain findByImproveContent(String content); + // 해당 idx 삭제하기. + void deleteAllByImproveIdx(Long improveIdx); + // 모든 idx 최신순으로 조회하기. + List findAllByOrderByImproveIdxDesc(); +} \ No newline at end of file diff --git a/src/main/java/com/moment/the/improvement/service/ImprovementService.java b/src/main/java/com/moment/the/improvement/service/ImprovementService.java new file mode 100644 index 00000000..e72ce6a8 --- /dev/null +++ b/src/main/java/com/moment/the/improvement/service/ImprovementService.java @@ -0,0 +1,67 @@ +package com.moment.the.improvement.service; + +import com.moment.the.admin.AdminDomain; +import com.moment.the.admin.repository.AdminRepository; +import com.moment.the.admin.service.AdminServiceImpl; +import com.moment.the.exceptionAdvice.exception.AccessNotFoundException; +import com.moment.the.exceptionAdvice.exception.UserNotFoundException; +import com.moment.the.improvement.ImprovementDomain; +import com.moment.the.improvement.dto.ImprovementDto; +import com.moment.the.improvement.dto.ImprovementViewAllDto; +import com.moment.the.improvement.repository.ImprovementRepository; +import lombok.RequiredArgsConstructor; +import org.modelmapper.ModelMapper; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class ImprovementService { + private final ImprovementRepository improvementRepository; + private final AdminRepository adminRepository; + + // Create improvement. + @Transactional + public ImprovementDomain save(ImprovementDto improvementDto){ + try { + AdminDomain adminDomain = adminRepository.findByAdminId(AdminServiceImpl.getUserEmail()); + return improvementRepository.save(improvementDto.ToEntity(adminDomain)); + } catch (UserNotFoundException e){ + throw new UserNotFoundException(); + } + } + + // Read improvement. + public List read(){ + ModelMapper modelMapper = new ModelMapper(); + return improvementRepository.findAllByOrderByImproveIdxDesc().stream() + .map(m -> modelMapper.map(m, ImprovementViewAllDto.class)) + .collect(Collectors.toList()); + } + + // Update improvement. + @Transactional + public void update(ImprovementDto improvementDto, Long improveIdx){ + // 개선 사례 가져오기 + ImprovementDomain improvementDomain = improvementRepository.findByImproveIdx(improveIdx); + if(improvementDomain.getAdminDomain().getAdminId().equals(AdminServiceImpl.getUserEmail())){ + improvementDomain.update(improvementDto); + } else { + throw new AccessNotFoundException(); + } + } + + // Delete improvement. + @Transactional + public void delete(Long improveIdx){ + ImprovementDomain selectImprove = improvementRepository.findByImproveIdx(improveIdx); + if(selectImprove.getAdminDomain().getAdminId().equals(AdminServiceImpl.getUserEmail())){ + improvementRepository.delete(selectImprove); + } else { + throw new AccessNotFoundException(); + } + } +} diff --git a/src/main/java/com/moment/the/response/ResponseService.java b/src/main/java/com/moment/the/response/ResponseService.java new file mode 100644 index 00000000..9d2c922d --- /dev/null +++ b/src/main/java/com/moment/the/response/ResponseService.java @@ -0,0 +1,86 @@ +package com.moment.the.response; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.moment.the.response.result.CommonResult; +import com.moment.the.response.result.ListResult; +import com.moment.the.response.result.SingleResult; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class ResponseService { + + public final ObjectMapper mapper; + + public enum CommonResponse{ + SUCCESS(200, "성공하였습니다"), + FAIL(-1, "실패하였습니다"); + + int code; + String msg; + + CommonResponse(int code, String msg) { + this.code = code; + this.msg = msg; + } + + public int getCode(){ + return code; + } + + public String getMsg(){ + return msg; + } + } + + // 단일건 결과를 처리하는 메소드 + public SingleResult getSingleResult(T data) { + SingleResult result = new SingleResult<>(); + result.setData(data); + setSuccessResult(result); + return result; + } + // 다중건 결과를 처리하는 메소드 + public ListResult getListResult(List list) { + ListResult result = new ListResult<>(); + result.setList(list); + setSuccessResult(result); + return result; + } + // 성공 결과만 처리하는 메소드 + public CommonResult getSuccessResult() { + CommonResult result = new CommonResult(); + setSuccessResult(result); + return result; + } + // 실패 결과만 처리하는 메소드 + public CommonResult getFailResult() { + CommonResult result = new CommonResult(); + result.setSuccess(false); + result.setCode(CommonResponse.FAIL.getCode()); + result.setMsg(CommonResponse.FAIL.getMsg()); + return result; + } + // 결과 모델에 api 요청 성공 데이터를 세팅해주는 메소드 + private void setSuccessResult(CommonResult result) { + result.setSuccess(true); + result.setCode(CommonResponse.SUCCESS.getCode()); + result.setMsg(CommonResponse.SUCCESS.getMsg()); + } + //getFailResult 메소드가 code, msg를 받을수 있도록 수정 + public CommonResult getFailResult(int code, String msg) { + CommonResult result = new CommonResult(); + result.setSuccess(false); + result.setCode(code); + result.setMsg(msg); + return result; + } + + public String getFailResultConvertString(int code, String msg) throws JsonProcessingException { + return mapper.writeValueAsString(getFailResult(code, msg)); + } +} diff --git a/src/main/java/com/moment/the/response/result/CommonResult.java b/src/main/java/com/moment/the/response/result/CommonResult.java new file mode 100644 index 00000000..2c8e165e --- /dev/null +++ b/src/main/java/com/moment/the/response/result/CommonResult.java @@ -0,0 +1,18 @@ +package com.moment.the.response.result; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class CommonResult { + @ApiModelProperty(value = "응답 성공여부") + private boolean success; + + @ApiModelProperty(value = "응답 코드 번호") + private int code; + + @ApiModelProperty(value = "응답 메시지") + private String msg; +} diff --git a/src/main/java/com/moment/the/response/result/ListResult.java b/src/main/java/com/moment/the/response/result/ListResult.java new file mode 100644 index 00000000..d46b3809 --- /dev/null +++ b/src/main/java/com/moment/the/response/result/ListResult.java @@ -0,0 +1,12 @@ +package com.moment.the.response.result; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class ListResult extends CommonResult { + private List list; +} \ No newline at end of file diff --git a/src/main/java/com/moment/the/response/result/SingleResult.java b/src/main/java/com/moment/the/response/result/SingleResult.java new file mode 100644 index 00000000..e99a5031 --- /dev/null +++ b/src/main/java/com/moment/the/response/result/SingleResult.java @@ -0,0 +1,10 @@ +package com.moment.the.response.result; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class SingleResult extends CommonResult { + private T data; +} diff --git a/src/main/java/com/moment/the/table/TableDomain.java b/src/main/java/com/moment/the/table/TableDomain.java new file mode 100644 index 00000000..782267c3 --- /dev/null +++ b/src/main/java/com/moment/the/table/TableDomain.java @@ -0,0 +1,35 @@ +package com.moment.the.table; + +import com.moment.the.answer.AnswerDomain; +import lombok.*; + +import javax.persistence.*; + +import static javax.persistence.FetchType.*; + +@Table(name = "Board") +@Entity +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class TableDomain { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long boardIdx; + @Column + private String content; + @Column + private int goods; + + @OneToOne(fetch = LAZY, cascade = CascadeType.ALL) + private AnswerDomain answerDomain; + + public void updateGoods(int goods){ + this.goods = goods; + } + + public void updateAnswerDomain(AnswerDomain answerDomain){ + this.answerDomain = answerDomain; + } +} diff --git a/src/main/java/com/moment/the/table/controller/TableController.java b/src/main/java/com/moment/the/table/controller/TableController.java new file mode 100644 index 00000000..962968dd --- /dev/null +++ b/src/main/java/com/moment/the/table/controller/TableController.java @@ -0,0 +1,67 @@ +package com.moment.the.table.controller; + +import com.moment.the.response.ResponseService; +import com.moment.the.response.result.CommonResult; +import com.moment.the.response.result.ListResult; +import com.moment.the.response.result.SingleResult; +import com.moment.the.table.dto.TableDto; +import com.moment.the.table.dto.TableViewDto; +import com.moment.the.table.service.TableService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/v1") +public class TableController { + //Dependency Injection + private final TableService tableService; + private final ResponseService responseService; + + // localhost:8080/v1/uncomfortable + @PostMapping("/uncomfortable") + public CommonResult write(@Valid @RequestBody TableDto tableDto){ + tableService.write(tableDto); + return responseService.getSuccessResult(); + } + + // localhost:8080/v1/uncomfortable/top30 + @GetMapping("/uncomfortable/top30") + public ListResult top10(){ + return responseService.getListResult(tableService.top30View()); + } + + // localhost:8080/v1/uncomfortable + @GetMapping("/uncomfortable") + public ListResult viewAll(){ + return responseService.getListResult(tableService.viewAll()); + } + + // localhost:8080/v1/uncomfortable/{boardIdx} + @PutMapping("/uncomfortable/{boardIdx}") + public CommonResult goods(@PathVariable Long boardIdx){ + tableService.goods(boardIdx); + return responseService.getSuccessResult(); + } + + // localhost:8080/v1/uncomfortable/cancel/{boardIdx} + @PutMapping("/uncomfortable/cancel/{boardIdx}") + public CommonResult cancelGood(@PathVariable Long boardIdx){ + tableService.cancelGood(boardIdx); + return responseService.getSuccessResult(); + } + + // localhost:8080/v1/uncomfortable/amount + @GetMapping("/uncomfortable/amount") + public SingleResult amountUncomfortable(){ + return responseService.getSingleResult(tableService.amountUncomfortableView()); + } + + // localhost:8080/v1/uncomfortable/dateSinceProjectStart + @GetMapping("/uncomfortable/dateSinceProjectStart") + public SingleResult getDateSinceProjectStart(){ + return responseService.getSingleResult(tableService.dateSinceProjectStart()); + } +} diff --git a/src/main/java/com/moment/the/table/dto/AmountUncomfortableDto.java b/src/main/java/com/moment/the/table/dto/AmountUncomfortableDto.java new file mode 100644 index 00000000..cabe21ff --- /dev/null +++ b/src/main/java/com/moment/the/table/dto/AmountUncomfortableDto.java @@ -0,0 +1,15 @@ +package com.moment.the.table.dto; + + +import lombok.*; + +import javax.validation.constraints.NotBlank; + +@Getter @Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AmountUncomfortableDto { + @NotBlank + private Long boardIdx; +} diff --git a/src/main/java/com/moment/the/table/dto/TableDto.java b/src/main/java/com/moment/the/table/dto/TableDto.java new file mode 100644 index 00000000..74a071bf --- /dev/null +++ b/src/main/java/com/moment/the/table/dto/TableDto.java @@ -0,0 +1,24 @@ +package com.moment.the.table.dto; + +import com.moment.the.table.TableDomain; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import javax.validation.constraints.NotBlank; + + +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class TableDto { + @NotBlank + private String content; + + public TableDomain toEntity(){ + return TableDomain.builder() + .content(this.content) + .build(); + } +} diff --git a/src/main/java/com/moment/the/table/dto/TableViewDto.java b/src/main/java/com/moment/the/table/dto/TableViewDto.java new file mode 100644 index 00000000..32e92d0a --- /dev/null +++ b/src/main/java/com/moment/the/table/dto/TableViewDto.java @@ -0,0 +1,23 @@ +package com.moment.the.table.dto; + +import com.moment.the.answer.AnswerDomain; +import lombok.*; + +@Builder +@Getter @Setter +@NoArgsConstructor @AllArgsConstructor +public class TableViewDto { + + private Long boardIdx; + private String content; + private int goods; + private boolean isAnswer; + + public TableViewDto(Long boardIdx, String content, int goods, AnswerDomain answer){ + this.boardIdx = boardIdx; + this.content = content; + this.goods = goods; + this.isAnswer = answer != null; + } + +} diff --git a/src/main/java/com/moment/the/table/repository/TableRepository.java b/src/main/java/com/moment/the/table/repository/TableRepository.java new file mode 100644 index 00000000..7404b930 --- /dev/null +++ b/src/main/java/com/moment/the/table/repository/TableRepository.java @@ -0,0 +1,33 @@ +package com.moment.the.table.repository; + +import com.moment.the.table.TableDomain; +import com.moment.the.table.dto.TableViewDto; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; + +@Repository +public interface TableRepository extends JpaRepository{ + // idx로 table 찾기. + Optional findByBoardIdx(Long boardIdx); + + @Query(value = "SELECT COUNT(table.boardIdx) " + + "FROM TableDomain table" ) + Long amountUncomfortable(); + + @Query("SELECT new com.moment.the.table.dto.TableViewDto(table.boardIdx, table.content, table.goods, answer)" + + "FROM TableDomain table LEFT JOIN table.answerDomain answer " + + "ORDER BY table.boardIdx DESC " + ) + List tableViewAll(); + + @Query("SELECT new com.moment.the.table.dto.TableViewDto(table.boardIdx, table.content, table.goods, answer)" + + "FROM TableDomain table LEFT JOIN table.answerDomain answer " + + "ORDER BY table.goods DESC " + ) + List tableViewTopBy(Pageable p); +} diff --git a/src/main/java/com/moment/the/table/service/TableService.java b/src/main/java/com/moment/the/table/service/TableService.java new file mode 100644 index 00000000..a92c630c --- /dev/null +++ b/src/main/java/com/moment/the/table/service/TableService.java @@ -0,0 +1,85 @@ +package com.moment.the.table.service; + +import com.moment.the.exceptionAdvice.exception.GoodsNotCancelException; +import com.moment.the.exceptionAdvice.exception.NoPostException; +import com.moment.the.table.TableDomain; +import com.moment.the.table.dto.TableDto; +import com.moment.the.table.dto.TableViewDto; +import com.moment.the.table.repository.TableRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; +import java.util.List; + +@Slf4j +@RequiredArgsConstructor +@Service +public class TableService { + private final TableRepository tableRepository; + + // 작성하기. + @Transactional + public TableDomain write(TableDto tableDto){ + return tableRepository.save(tableDto.toEntity()); + } + + // Top 30 보여주기. + public List top30View() { + return tableRepository.tableViewTopBy(PageRequest.of(0,30)); + } + + // 전체 페이지 보여주기. + public List viewAll(){ + return tableRepository.tableViewAll(); + } + + // 전체 게시물 개수 보여주기. + public Long amountUncomfortableView(){ + return tableRepository.amountUncomfortable(); + } + + // 프로젝트 시작 이후 날짜 보여주기. + public int dateSinceProjectStart(){ + return calculateAfterDate(); + } + + // 좋아요 수 증가. + @Transactional + public void goods(Long boardIdx){ + TableDomain tableDomain = tableRepository.findByBoardIdx(boardIdx).orElseThrow(NoPostException::new); + tableDomain.updateGoods(tableDomain.getGoods()+1); + } + + // 좋아요 수 감소. + @Transactional + public void cancelGood(Long boardIdx) { + TableDomain tableDomain = tableRepository.findByBoardIdx(boardIdx).orElseThrow(NoPostException::new); + int goodsResult = tableDomain.getGoods() - 1; + + if(goodsResult > -1) {//좋야요가 양수일때 + tableDomain.updateGoods(goodsResult); + }else{ + throw new GoodsNotCancelException(); + } + } + + // day 수 계산하기 + public static int calculateAfterDate(){ + /** + * today: 오늘 날짜 + * theMomentStart: the-moment 시작 날짜 + */ + LocalDate today = LocalDate.now(); + LocalDate theMomentStart = LocalDate.of(2021, 6, 7); + + // the_moment 프로젝트를 시작한 날짜 by 오늘의 날짜 + int period = (int) theMomentStart.until(today, ChronoUnit.DAYS); + + return period; + } +} diff --git a/src/main/java/com/moment/the/util/RedisUtil.java b/src/main/java/com/moment/the/util/RedisUtil.java new file mode 100644 index 00000000..6fd1d93b --- /dev/null +++ b/src/main/java/com/moment/the/util/RedisUtil.java @@ -0,0 +1,36 @@ +package com.moment.the.util; + + +import lombok.RequiredArgsConstructor; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.stereotype.Component; + +import java.time.Duration; + +@RequiredArgsConstructor +@Component +public class RedisUtil { + + private final StringRedisTemplate stringRedisTemplate; + + public String getData(String key){ + ValueOperations valueOperations = stringRedisTemplate.opsForValue(); + return valueOperations.get(key); + } + + public void setData(String key, String value){ + ValueOperations valueOperations = stringRedisTemplate.opsForValue(); + valueOperations.set(key,value); + } + + public void setDataExpire(String key,String value,long duration){ + ValueOperations valueOperations = stringRedisTemplate.opsForValue(); + Duration expireDuration = Duration.ofSeconds(duration); + valueOperations.set(key, value, expireDuration); + } + + public void deleteData(String key){ + stringRedisTemplate.delete(key); + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 00000000..08c551a4 --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,65 @@ +server: + #포트 + port: 8080 + # UTF-8 사용 + servlet: + encoding: + charset: UTF-8 + enabled: true + force: true + +logging: + level: + com.moment.the.config.mvc.RequestResponseLoggingFilter: debug + org.hibernate.SQL: debug + org.hibernate.type: trace + charset: + console: UTF-8 + file: + name: ./logs/product.log + path: ./logs/product.log + logback: + rollingpolicy: + file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}-%i.log + max-file-size: 500MB + max-history: 1 + +spring: + #H2 DataBase + h2: + console: + enabled: true + path: /h2-console + settings: + web-allow-others: true + + #DB 설정 + datasource: + url: jdbc:h2:mem:the_moment + driver-class-name: org.h2.Driver + username: sa + + #JPA 설정 + jpa: + database-platform: org.hibernate.dialect.H2Dialect + properties: + hibernate: + show_sql: true + format_sql: true + hbm2ddl: + auto: update + show-sql: true + + #Message 설정 + messages: + basename: i18n/exception + encoding: UTF-8 + + # Redis + redis: + image: redis:latest + host: localhost + port: 6379 + + jwt: + secret: asdkfhksldjhfkajsdhfasd7df67sa8d6f87as6df86sa8d7f6a8ds6f87a9s6d8f76sad87f687ad6f8asd76f8asd6f8asd6f87sd6f87asd6f87s \ No newline at end of file diff --git a/src/main/resources/i18n/exception_en.yml b/src/main/resources/i18n/exception_en.yml new file mode 100644 index 00000000..f8e42951 --- /dev/null +++ b/src/main/resources/i18n/exception_en.yml @@ -0,0 +1,47 @@ +unKnown: + code: "-9999" + msg: "Unknown error" + +userNotFound: + code: "-1000" + msg: "User could not be found." + +userAlreadyExists: + code: "-999" + msg: "The user already exists." + +noPost: + code: "-888" + msg: "I can't find the post." + +noComment: + code: "-777" + msg: "I can't find that answer." + +answer-already-exists: + code: "-776" + msg: "Corresponding 'Inconvenient Moment' already have an answer." + +access-not-found: + code: "-775" + msg: "You do not have access to this resource." + +noImprovement: + code: "-666" + msg: "No such improvement can be found." + +method-argument-not-valid: + code: "-555" + msg: "Invalid format for request." + +goods-not-cancel: + code: "-444" + msg: "Unable to cancel recommendation." + +invalid-token: + code: "-300" + msg: "The token is not valid." + +access-token-expired: + code: "-301" + msg: "The access token has expired." \ No newline at end of file diff --git a/src/main/resources/i18n/exception_ko.yml b/src/main/resources/i18n/exception_ko.yml new file mode 100644 index 00000000..847c9515 --- /dev/null +++ b/src/main/resources/i18n/exception_ko.yml @@ -0,0 +1,47 @@ +unKnown: + code: "-9999" + msg: "알 수 없는 오류" + +userNotFound: + code: "-1000" + msg: "사용자를 찾을 수 없습니다." + +userAlreadyExists: + code: "-999" + msg: "유저가 이미 존재합니다." + +noPost: + code: "-888" + msg: "해당 게시글을 찾을 수 없습니다." + +noComment: + code: "-777" + msg: "해당 답변을 찾을 수 없습니다." + +answer-already-exists: + code: "-776" + msg: "해당 '불편한 순간' 에 대한 답변이 이미 있습니다." + +access-not-found: + code: "-775" + msg: "해당 리소스에 대한 액세스 권한이 없습니다." + +noImprovement: + code: "-666" + msg: "해당 개선 사례를 찾을 수 없습니다." + +method-argument-not-valid: + code: "-555" + msg: "요청 형식에 알맞지 않습니다." + +goods-not-cancel: + code: "-444" + msg: "추천을 취소할 수 없습니다." + +invalid-token: + code: "-300" + msg: "토큰이 올바르지 않습니다." + +access-token-expired: + code: "-301" + msg: "엑세스 토큰이 만료되었습니다." \ No newline at end of file diff --git a/src/test/java/com/moment/the/TheApplicationTests.java b/src/test/java/com/moment/the/TheApplicationTests.java new file mode 100644 index 00000000..973ca70f --- /dev/null +++ b/src/test/java/com/moment/the/TheApplicationTests.java @@ -0,0 +1,9 @@ +package com.moment.the; + +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +@SpringBootTest +@Transactional +class TheApplicationTests { +} \ No newline at end of file diff --git a/src/test/java/com/moment/the/controller/release/TableControllerTest.java b/src/test/java/com/moment/the/controller/release/TableControllerTest.java new file mode 100644 index 00000000..3bfdba89 --- /dev/null +++ b/src/test/java/com/moment/the/controller/release/TableControllerTest.java @@ -0,0 +1,237 @@ +package com.moment.the.controller.release; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.moment.the.table.controller.TableController; +import com.moment.the.table.TableDomain; +import com.moment.the.response.ResponseService; +import com.moment.the.table.dto.TableDto; +import com.moment.the.table.dto.TableViewDto; +import com.moment.the.table.repository.TableRepository; +import com.moment.the.table.service.TableService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.filter.CharacterEncodingFilter; + +import java.time.LocalDate; +import java.time.Period; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.hamcrest.core.StringContains.containsString; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + + +@SpringBootTest +@DisplayName("TableController 테스트") +@Transactional +@Slf4j +class TableControllerTest { + + MockMvc mockMvc; + ResultActions resultActions; + @Autowired + TableController tableController; + @Autowired ResponseService resService; + @Autowired TableRepository tableRepo; + @Autowired TableService tableService; + + @BeforeEach + void setUp() { + mockMvc = MockMvcBuilders.standaloneSetup(tableController) + .addFilters(new CharacterEncodingFilter("UTF-8", true)) // utf-8 필터 추가 + .build(); + } + + @AfterEach + void showRequestResponse() throws Exception { + log.info("Request Response result"); + resultActions.andDo(print()); + resultActions = null; + } + + String objectToJson(Object object) throws JsonProcessingException { + return new ObjectMapper().writeValueAsString(object); + } + + @Test @DisplayName("[POST]/v1/uncomfortable write 검증") + void write_검증() throws Exception { + // Given + TableDto tableDto = new TableDto("학교가 밥이 너무 맛이 없어요"); + String tableDtoConvertJson = objectToJson(tableDto); + + // When + resultActions = mockMvc.perform( + post("/v1/uncomfortable") + .content(tableDtoConvertJson) + .contentType(MediaType.APPLICATION_JSON) + ); + + // Then + String successMsg = objectToJson(resService.getSuccessResult()); + resultActions + .andExpect(status().is2xxSuccessful()) + .andExpect(content().string(successMsg)) + ; + } + + @Test @DisplayName("[GET]/v1/uncomfortable viewAll 검증") + void viewAll_검증() throws Exception { + // Given + // 랜덤한 문자열 생성 + final List TABLE_CONTENTS = Stream.generate( + () -> RandomStringUtils.randomAlphabetic(15)) + .limit(3) + .collect(Collectors.toList()); + + AtomicInteger i = new AtomicInteger(0); + List tableDomains = Stream.generate( + () -> TableDomain.builder() + .goods(0) + .content(TABLE_CONTENTS.get(i.getAndIncrement())) + .build() + ).limit(3).collect(Collectors.toList()); + tableRepo.saveAll(tableDomains); + + // When + resultActions = mockMvc.perform( + get("/v1/uncomfortable") + .contentType(MediaType.APPLICATION_JSON) + ); + + // Than + resultActions + .andExpect(status().is2xxSuccessful()) + .andExpect(content().string(containsString(TABLE_CONTENTS.get(0)))) + .andExpect(content().string(containsString(TABLE_CONTENTS.get(1)))) + .andExpect(content().string(containsString(TABLE_CONTENTS.get(2)))) + ; + } + + @Test @DisplayName("[GET]/uncomfortable/top30 top30 검증") + void top30_검증() throws Exception { + //Given + AtomicInteger i = new AtomicInteger(1); + List tableDomains = Stream.generate( + () -> TableDomain.builder() + .goods(i.getAndIncrement()) + .content(RandomStringUtils.randomAlphabetic(15)) + .build() + ).limit(40).collect(Collectors.toList()); + + tableRepo.saveAll(tableDomains); + List tableViewDtos = tableService.top30View(); + String top30Data = objectToJson(tableViewDtos); + + //When + resultActions = mockMvc.perform( + get("/v1/uncomfortable/top30") + .contentType(MediaType.APPLICATION_JSON) + ); + + //Then + resultActions + .andExpect(status().is2xxSuccessful()) + .andExpect(content().string(containsString(top30Data))) + ; + } + @Test @DisplayName("[PUT]/v1/uncomfortable/{boardIdx} goods 추가") + void goods_검증() throws Exception { + //Given + TableDomain tableDomain = TableDomain.builder() + .content("학교 급식이 맛이 없어요") + .build(); + Long tableIdx = tableRepo.save(tableDomain).getBoardIdx(); + + //When + resultActions = mockMvc.perform( + put("/v1/uncomfortable/" + tableIdx.longValue()) + .contentType(MediaType.APPLICATION_JSON) + ); + + //Than + resultActions + .andExpect(status().is2xxSuccessful()) + .andExpect(content().string(objectToJson(resService.getSuccessResult()))) + ; + } + + @Test @DisplayName("[PUT]/v1/uncomfortable/cancel/{boardIdx} goods 감소") + void goodCancel_검증() throws Exception { + //Given + TableDomain tableDomain = TableDomain.builder() + .content("학교 급식이 맛이 없어요") + .goods(1) + .build(); + Long tableIdx = tableRepo.save(tableDomain).getBoardIdx(); + + //When + resultActions = mockMvc.perform( + put("/v1/uncomfortable/cancel/" + tableIdx.longValue()) + .contentType(MediaType.APPLICATION_JSON) + ); + + //Than + resultActions + .andExpect(status().is2xxSuccessful()) + .andExpect(content().string(objectToJson(resService.getSuccessResult()))) + ; + } + + @Test @DisplayName("[GET]/v1/uncomfortable/amount ") + void amountUncomfortable_검증() throws Exception { + //Given + List tableDomains = Stream.generate( + () -> TableDomain.builder() + .content(RandomStringUtils.randomAlphabetic(15)) + .build() + ).limit(8).collect(Collectors.toList()); + tableRepo.saveAll(tableDomains); + + //When + resultActions = mockMvc.perform( + get("/v1/uncomfortable/amount") + .contentType(MediaType.APPLICATION_JSON) + ); + + //Then + resultActions + .andExpect(status().is2xxSuccessful()) + .andExpect(jsonPath("$.data").value(8)) + ; + } + + @Disabled + @Test @DisplayName("[GET]/v1/uncomfortable/dateSinceProjectStart") + void dateSinceProjectStart_검증() throws Exception { + //Given + LocalDate startTheMoment = LocalDate.of(2021,6,7); + LocalDate currentDate = LocalDate.now(); + + Period period = startTheMoment.until(currentDate); + + int dateSinceProjectStart = period.getDays()+1; + + //When + resultActions = mockMvc.perform( + get("/v1/uncomfortable/dateSinceProjectStart") + .contentType(MediaType.APPLICATION_JSON) + ); + + //Then + resultActions + .andExpect(jsonPath("$.data").value(dateSinceProjectStart)); + } +} \ No newline at end of file diff --git a/src/test/java/com/moment/the/improvement/service/ImprovementServiceTest.java b/src/test/java/com/moment/the/improvement/service/ImprovementServiceTest.java new file mode 100644 index 00000000..388dd29b --- /dev/null +++ b/src/test/java/com/moment/the/improvement/service/ImprovementServiceTest.java @@ -0,0 +1,81 @@ +package com.moment.the.improvement.service; + +import com.moment.the.admin.AdminDomain; +import com.moment.the.admin.dto.AdminDto; +import com.moment.the.admin.repository.AdminRepository; +import com.moment.the.admin.service.AdminService; +import com.moment.the.improvement.dto.ImprovementDto; +import com.moment.the.improvement.repository.ImprovementRepository; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.transaction.annotation.Transactional; + +import java.awt.*; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +@Transactional +class ImprovementServiceTest { + @Autowired + private ImprovementRepository improvementRepository; + @Autowired + private ImprovementService improvementService; + @Autowired + private AdminService adminService; + @Autowired + private AdminRepository adminRepository; + @AfterEach + void deleteData(){ + improvementRepository.deleteAll(); + } + + // test 편의를 위한 회원가입 매서드 + void adminSignUp(String adminId, String password, String adminName) throws Exception { + AdminDto adminDto = new AdminDto(adminId, password, adminName); + adminService.signUp(adminDto); + } + + // test 편의를 위한 로그인 매서드 + AdminDomain adminLogin(String adminId, String password) throws Exception { + AdminDomain adminDomain = adminRepository.findByAdminId(adminId); + UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( + adminDomain.getAdminId(), + adminDomain.getAdminPwd(), + List.of(new SimpleGrantedAuthority("ROLE_USER"))); + SecurityContext context = SecurityContextHolder.getContext(); + context.setAuthentication(token); + + return adminDomain; + } + + @Test + void 실제개선사례작성() throws Exception { + //Given admin + String email = "asdf@gsm"; + String pw = "1234"; + String name = "jihwan"; + adminSignUp(email, pw, name); + adminLogin(email, pw); + + //Given improvement + ImprovementDto improvementDto = new ImprovementDto(); + improvementDto.setImproveContent("Hello world"); + improvementDto.setImproveContent("it's jihwan"); + + //when + improvementService.save(improvementDto); + + //then + assertEquals(false, improvementRepository.findByImproveContent("it's jihwan") == null); + assertEquals(true, improvementRepository.findByImproveContent("it's jihwan").getAdminDomain().getAdminId().equals("asdf@gsm")); + } + +} \ No newline at end of file diff --git a/src/test/java/com/moment/the/service/AdminServiceImplTest.java b/src/test/java/com/moment/the/service/AdminServiceImplTest.java new file mode 100644 index 00000000..dc399b78 --- /dev/null +++ b/src/test/java/com/moment/the/service/AdminServiceImplTest.java @@ -0,0 +1,240 @@ +package com.moment.the.service; + +import com.moment.the.admin.dto.AdminDto; +import com.moment.the.admin.dto.SignInDto; +import com.moment.the.admin.repository.AdminRepository; +import com.moment.the.admin.service.AdminService; +import com.moment.the.admin.service.AdminServiceImpl; +import com.moment.the.exceptionAdvice.exception.UserNotFoundException; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.crypto.password.PasswordEncoder; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +@SpringBootTest +public class AdminServiceImplTest { + @AfterEach + public void dataClean(){ + adminRepository.deleteAll(); + } + @Autowired + private PasswordEncoder passwordEncoder; + @Autowired + private AdminRepository adminRepository; + @Autowired + private AdminService adminService; + @Autowired + private AdminServiceImpl adminServiceImpl; + + @Test + void 회원가입(){ + //Given + AdminDto adminDto = new AdminDto(); + String email = "s20062@gsm.hs.kr"; + String adminName = "jihwan"; + String pw = "1234"; + + //when + adminDto.setAdminPwd(passwordEncoder.encode(pw)); + adminDto.setAdminId(email); + adminDto.setAdminName(adminName); + adminRepository.save(adminDto.toEntity()); + + //then + assertEquals(adminDto.getAdminId(), email); + assertEquals(passwordEncoder.matches(pw,adminDto.getAdminPwd()), true); + assertEquals(adminDto.getAdminName(), "jihwan"); + } + + @Test + void 이_사용자가_있나요(){ + //Given + AdminDto adminDto = new AdminDto(); + String alreadyEmail = "asdf@asdf"; + String email = "asdf@asdf"; + adminDto.setAdminId(alreadyEmail); + + //when + adminRepository.save(adminDto.toEntity()); + + //then + assertEquals(adminRepository.findByAdminId(email) == null , false); + + } + + @Test + void 로그인_하겠습니다(){ + //Given + AdminDto adminDto = new AdminDto(); + + String id = "s20062@gsm"; + adminDto.setAdminId(id); + + String pw = "1234"; + adminDto.setAdminPwd(passwordEncoder.encode(pw)); + + adminRepository.save(adminDto.toEntity()); + + //when + if(adminRepository.findByAdminId(id) == null){ + throw new UserNotFoundException(); + } else { + // then + assertEquals(passwordEncoder.matches(pw, adminDto.getAdminPwd()), true); + } + } + + @Test + void GetUserEmail(){ + //Given + AdminDto adminDto = new AdminDto(); + String userEmail = "s20062@gsm"; + String pw = "1234"; + adminDto.setAdminId(userEmail); + adminDto.setAdminPwd(passwordEncoder.encode(pw)); + adminRepository.save(adminDto.toEntity()); + System.out.println("======== saved ========="); + + // when login session 발급 + UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( + adminDto.getAdminId(), + adminDto.getAdminPwd(), + List.of(new SimpleGrantedAuthority("ROLE_USER"))); + SecurityContext context = SecurityContextHolder.getContext(); + context.setAuthentication(token); + System.out.println("================================="); + System.out.println(context); + + //then + String currentUserEmail = adminServiceImpl.getUserEmail(); + assertEquals(currentUserEmail, "s20062@gsm"); + } + + @Test + void 서비스_회원가입() throws Exception { + //Given + AdminDto adminDto = new AdminDto(); + adminDto.setAdminId("s20062@gsm"); + adminDto.setAdminPwd("1234"); + adminDto.setAdminName("jihwan"); + + //when + adminService.signUp(adminDto); + + //then + assertEquals(adminRepository.findByAdminId("s20062@gsm") != null, true); + } + + @Test @Disabled + void 서비스_로그인() throws Exception { + //Given + AdminDto adminDto = new AdminDto(); + adminDto.setAdminId("s20062@gsmasdf"); + adminDto.setAdminPwd(passwordEncoder.encode("1234")); + adminDto.setAdminName("jihwan"); + + //when + adminRepository.save(adminDto.toEntity()); + + //then + assertEquals(adminService.loginUser("s20062@gsmasdf","1234") == null, false); + } + + @Test + void 회원탈퇴() throws Exception { + // Given 회원가입 + AdminDto adminDto = new AdminDto(); + adminDto.setAdminName("jihwan"); + adminDto.setAdminId("s20062@gsm"); + adminDto.setAdminPwd(passwordEncoder.encode("1234")); + adminRepository.save(adminDto.toEntity()); + System.out.println("=========is saved========="); + + // Given SignInDto + SignInDto signInDto = new SignInDto(); + signInDto.setAdminId("s20062@gsm"); + signInDto.setAdminPwd("1234"); + System.out.println("======== is set ========"); + + // when login session 발급 + UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( + adminDto.getAdminId(), + adminDto.getAdminPwd(), + List.of(new SimpleGrantedAuthority("ROLE_USER"))); + SecurityContext context = SecurityContextHolder.getContext(); + context.setAuthentication(token); + System.out.println("================================="); + System.out.println(context); + // when 회원탈퇴를 실행 했을 때. + adminService.withdrawal(signInDto); + } + + @Test + void 시원이가_안믿는_매치스(){ + //Given + String pw = "1234"; + //when + String encodePw = passwordEncoder.encode(pw); + System.out.println("===================="); + System.out.println(encodePw); + //then + assertEquals(passwordEncoder.matches(pw, encodePw), true); + } + + @Test + void 서비스_토큰_발급(){ + //Given + boolean exceptionCatched = false; + + AdminDto adminDto = new AdminDto(); + adminDto.setAdminId("admin@admin"); + adminDto.setAdminPwd(passwordEncoder.encode("1234")); + adminRepository.save(adminDto.toEntity()); + + //When + try { + adminServiceImpl.loginUser("admin@admin", "134"); + } catch (UserNotFoundException e) { + exceptionCatched = true; + } + + //Then + assertTrue(exceptionCatched); + } + + @Test @Disabled + void 로그아웃(){ + //Given + AdminDto adminDto = new AdminDto(); + String userEmail = "s20062@gsm"; + String pw = "1234"; + adminDto.setAdminId(userEmail); + adminDto.setAdminPwd(passwordEncoder.encode(pw)); + adminRepository.save(adminDto.toEntity()); + System.out.println("======== saved ========="); + + // when login session 발급 + UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( + adminDto.getAdminId(), + adminDto.getAdminPwd(), + List.of(new SimpleGrantedAuthority("ROLE_USER"))); + SecurityContext context = SecurityContextHolder.getContext(); + context.setAuthentication(token); + System.out.println("================================="); + System.out.println(context); + + // When logout + adminServiceImpl.logout(); + } +} diff --git a/src/test/java/com/moment/the/service/AnswerServiceTest.java b/src/test/java/com/moment/the/service/AnswerServiceTest.java new file mode 100644 index 00000000..d1b6e4e7 --- /dev/null +++ b/src/test/java/com/moment/the/service/AnswerServiceTest.java @@ -0,0 +1,245 @@ +package com.moment.the.service; + +import com.moment.the.exceptionAdvice.exception.AccessNotFoundException; +import com.moment.the.exceptionAdvice.exception.AnswerAlreadyExistsException; +import com.moment.the.answer.*; +import com.moment.the.answer.dto.AnswerDto; +import com.moment.the.answer.dto.AnswerResDto; +import com.moment.the.answer.repository.AnswerRepository; +import com.moment.the.answer.service.AnswerService; +import com.moment.the.config.security.auth.MyUserDetailsService; +import com.moment.the.admin.AdminDomain; +import com.moment.the.table.TableDomain; +import com.moment.the.admin.dto.AdminDto; +import com.moment.the.table.dto.TableDto; +import com.moment.the.admin.repository.AdminRepository; +import com.moment.the.table.service.TableService; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@Transactional +@SpringBootTest +class AnswerServiceTest { + + @Autowired AdminRepository adminRepo; + @Autowired + AnswerService answerService; + @Autowired + AnswerRepository answerRepo; + @Autowired + TableService tableService; + @Autowired MyUserDetailsService userDetailsService; + + final String USER_ID = "adminID"; + final String USER_PASSWORD = "adminPW"; + final String USER_NAME = "admin"; + + // test 편의를 위한 회원가입 매서드 + void adminSignUp(String adminId, String password, String adminName) throws Exception { + AdminDto adminDto = new AdminDto(adminId, password, adminName); + adminRepo.save(adminDto.toEntity()); + } + + //test 편의를 위한 로그인 매서드 + AdminDomain adminLogin(String adminId, String password) { + AdminDomain adminDomain = adminRepo.findByAdminIdAndAdminPwd(adminId, password); + UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( + adminDomain.getAdminId(), + adminDomain.getAdminPwd(), + List.of(new SimpleGrantedAuthority("ROLE_USER"))); + SecurityContext context = SecurityContextHolder.getContext(); + context.setAuthentication(token); + + return adminDomain; + } + + //test 편의를 위한 Table 생성 메서드 + TableDomain createTable(){ + String TABLE_CONTENT = "급식이 맛이 없어요 급식에 질을 높여주세요!"; + TableDto tableDto = new TableDto(TABLE_CONTENT); + TableDomain tableDomain = tableService.write(tableDto); + return tableDomain; + } + + @Test @DisplayName("답변 작성하기 (save) 검증") + void save_검증() throws Exception { + // Given + //회원가입 + adminSignUp(USER_ID, USER_PASSWORD, USER_NAME); + + //로그인 + AdminDomain adminDomain = adminLogin(USER_ID, USER_PASSWORD); + + //Table 등록 + TableDomain tableDomain = createTable(); + + //answer 입력 + String ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; + AnswerDto answerDto = new AnswerDto(ANSWER_CONTENT, null); + + // When + AnswerDomain savedAnswer = answerService.save(answerDto, tableDomain.getBoardIdx()); + + // Then + assertEquals(savedAnswer.getAnswerContent(), ANSWER_CONTENT); + assertEquals(savedAnswer.getTableDomain(), tableDomain); + assertEquals(savedAnswer.getAdminDomain(), adminDomain); + } + + @Test @DisplayName("답변 작성하기 (save) 답변이 이미 있을경우 AnswerAlreadyExistsException 검증") + void save_AnswerAlreadyExistsException_검증() throws Exception { + // Given + //회원가입 + adminSignUp(USER_ID, USER_PASSWORD, USER_NAME); + + //로그인 + AdminDomain adminDomain = adminLogin(USER_ID, USER_PASSWORD); + + //Table 등록 + TableDomain tableDomain = createTable(); + + //answer 추가 + String ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; + AnswerDto answerDto = new AnswerDto(ANSWER_CONTENT, null); + answerService.save(answerDto, tableDomain.getBoardIdx()); + + // When + String ONCE_MORE_ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; + AnswerDto onceMoreAnswerDto = new AnswerDto(ONCE_MORE_ANSWER_CONTENT, null); + AnswerAlreadyExistsException throwAtSaveMethod = + assertThrows(AnswerAlreadyExistsException.class, + () -> answerService.save(onceMoreAnswerDto, tableDomain.getBoardIdx()) + ); + + // then + assertEquals(throwAtSaveMethod.getClass(), AnswerAlreadyExistsException.class); + } + + @Test @DisplayName("답변 수정하기 (update) 검증") + void update_검증() throws Exception { + // Given + //회원가입 + adminSignUp(USER_ID, USER_PASSWORD, USER_NAME); + + //로그인 + adminLogin(USER_ID, USER_PASSWORD); + TableDomain tableDomain = createTable(); + + // 답변 등록 + String ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; + AnswerDto answerDto = new AnswerDto(ANSWER_CONTENT, null); + AnswerDomain savedAnswer = answerService.save(answerDto, tableDomain.getBoardIdx()); + System.out.println("savedAnswer.getAnswerContent() = " + savedAnswer.getAnswerContent()); + + // When + String CHANGE_ANSWER_CONTENT = "그냥 드세요 요구하는게 있으면 잃는것도 있어야지!"; + AnswerDto changeAnswerDto = new AnswerDto(CHANGE_ANSWER_CONTENT, null); + answerService.update(changeAnswerDto, savedAnswer.getAnswerIdx()); + System.out.println("savedAnswer.getAnswerContent() = " + savedAnswer.getAnswerContent()); + + // Than + assertEquals(savedAnswer.getAnswerContent(), CHANGE_ANSWER_CONTENT); + } + + @Test @DisplayName("답변 보기 (view) 검증") + void view_검증() throws Exception { + // Given + TableDomain tableDomain = createTable(); + + // 답변 등록 + adminSignUp(USER_ID, USER_PASSWORD, USER_NAME); // 답변 등록을 위한 회원가입 + adminLogin(USER_ID, USER_PASSWORD); // 답변 등록을 위한 로그인 + + String ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; + AnswerDto answerDto = new AnswerDto(ANSWER_CONTENT, null); + AnswerDomain savedAnswer = answerService.save(answerDto, tableDomain.getBoardIdx()); + System.out.println("savedAnswer.getAnswerContent() = " + savedAnswer.getAnswerContent()); + + // When + AnswerResDto answerResDto = answerService.view(tableDomain.getBoardIdx()); + + //than + assertEquals(answerResDto.getAnswerIdx(), savedAnswer.getAnswerIdx()); + assertEquals(answerResDto.getTitle(), savedAnswer.getTableDomain().getContent()); + assertEquals(answerResDto.getWriter(), savedAnswer.getAdminDomain().getAdminName()); + assertEquals(answerResDto.getContent(), savedAnswer.getAnswerContent()); + } + + @Test @DisplayName("답변 삭제 (delete) 검증") + void delete_검증() throws Exception { + // Given + //회원가입 + String USER_ID = "adminID"; + String USER_PASSWORD = "adminPW"; + String USER_NAME = "admin"; + + adminSignUp(USER_ID, USER_PASSWORD, USER_NAME); + + //로그인 + adminLogin(USER_ID, USER_PASSWORD); + TableDomain tableDomain = createTable(); + + // 답변 등록 + String ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; + AnswerDto answerDto = new AnswerDto(ANSWER_CONTENT, null); + AnswerDomain savedAnswer = answerService.save(answerDto, tableDomain.getBoardIdx()); + + // When + answerService.delete(savedAnswer.getAnswerIdx()); + IllegalArgumentException deleteSuccessException = assertThrows(IllegalArgumentException.class, + () -> answerRepo.findById(savedAnswer.getAnswerIdx()) + .orElseThrow(() -> new IllegalArgumentException("AnswerDomain을 찾을 수 없으므로 테스트 성공.")) + ); + + // Then + assertEquals(deleteSuccessException.getClass(), IllegalArgumentException.class); + } + + + @Test @DisplayName("답변 삭제 (delete) 다른사람의 답변을 삭제할 경우 AccessNotFoundException 검증") + void 다른사람의_답변을_삭제할경우_AccessNotFoundException_검증() throws Exception { + // Given + //회원가입 + final String ADMIN_A_ID = "adminAID"; + final String ADMIN_A_PW = "adminAPW"; + final String ADMIN_A_NAME = "adminA"; + + final String ADMIN_B_ID = "adminBID"; + final String ADMIN_B_PW = "adminBPW"; + final String ADMIN_B_NAME = "adminB"; + + adminSignUp(ADMIN_A_ID, ADMIN_A_PW, ADMIN_A_NAME); + adminSignUp(ADMIN_B_ID, ADMIN_B_PW, ADMIN_B_NAME); + + //로그인 + adminLogin(ADMIN_A_ID, ADMIN_A_PW); + + adminSignUp("adminB", "adminB_PW", "adminB"); + + TableDomain tableDomain = createTable(); + + // 답변 등록 + String ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; + AnswerDto answerDto = new AnswerDto(ANSWER_CONTENT, null); + AnswerDomain savedAnswer = answerService.save(answerDto, tableDomain.getBoardIdx()); + + // When + adminLogin(ADMIN_B_ID, ADMIN_B_PW); + AccessNotFoundException deleteFailException = assertThrows(AccessNotFoundException.class + , () -> answerService.delete(savedAnswer.getAnswerIdx())); + + // Than + assertEquals(deleteFailException.getClass(), AccessNotFoundException.class); + } +} \ No newline at end of file diff --git a/src/test/java/com/moment/the/service/ImprovementServiceTest.java b/src/test/java/com/moment/the/service/ImprovementServiceTest.java new file mode 100644 index 00000000..619c7c0c --- /dev/null +++ b/src/test/java/com/moment/the/service/ImprovementServiceTest.java @@ -0,0 +1,152 @@ +package com.moment.the.service; + +import com.moment.the.admin.AdminDomain; +import com.moment.the.admin.service.AdminService; +import com.moment.the.improvement.ImprovementDomain; +import com.moment.the.admin.dto.AdminDto; +import com.moment.the.improvement.dto.ImprovementDto; +import com.moment.the.admin.repository.AdminRepository; +import com.moment.the.improvement.repository.ImprovementRepository; +import com.moment.the.improvement.service.ImprovementService; +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.transaction.annotation.Transactional; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +@SpringBootTest +@Transactional +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +public class ImprovementServiceTest { + + // 데이터 섞임 방지 한개의 테스트가 끝날떄마다 DB의 저장내용을 삭제한다. + @AfterEach + public void cleanUp(){ + improvementRepository.deleteAll(); + } + + @Autowired + private AdminService adminService; + @Autowired + private AdminRepository adminRepository; + @Autowired + private ImprovementService improvementService; + @Autowired + private ImprovementRepository improvementRepository; + + // test 편의를 위한 회원가입 매서드 + void adminSignUp(String adminId, String password, String adminName) throws Exception { + AdminDto adminDto = new AdminDto(adminId, password, adminName); + adminService.signUp(adminDto); + } + + + // test 편의를 위한 로그인 매서드 + AdminDomain adminLogin(String adminId, String password) throws Exception { + AdminDomain adminDomain = adminRepository.findByAdminId(adminId); + UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( + adminDomain.getAdminId(), + adminDomain.getAdminPwd(), + List.of(new SimpleGrantedAuthority("ROLE_USER"))); + SecurityContext context = SecurityContextHolder.getContext(); + context.setAuthentication(token); + + return adminDomain; + } + + // test 편의를 위한 save 로직 + void saveImprovement(String header , String content) throws Exception { + ImprovementDto improvementDto = new ImprovementDto(); + improvementDto.setImproveHeader(header); + improvementDto.setImproveContent(content); + + //when + adminSignUp("s20062", "1234", "jihwan"); + System.out.println("========= saved ========="); + adminLogin("s20062", "1234"); + improvementService.save(improvementDto); + } + + @Test + @Order(1) + void 개선사례_작성() throws Exception { + //Given + ImprovementDto improvementDto = new ImprovementDto(); + improvementDto.setImproveHeader("hello world"); + improvementDto.setImproveContent("this is content"); + + //when + adminSignUp("s20062", "1234", "jihwan"); + System.out.println("========= saved ========="); + adminLogin("s20062", "1234"); + improvementService.save(improvementDto); + + //Then + assertEquals(improvementRepository.findByImproveContent("this is content")==null, false); + } + + @Test + @Order(2) + void 개선사레_조회(){ + //Given + List improvementDomains = Stream.generate( + () -> ImprovementDomain.builder() + .improveHeader("hello header") + .improveContent("hello content") + .build() + ).limit(20).collect(Collectors.toList()); + + improvementRepository.saveAll(improvementDomains); + + //when + improvementService.read(); + + //then + assertEquals(20, improvementService.read().size()); + } + + @Test + @Order(3) + void 개선사례_수정() throws Exception { + //Given + saveImprovement("hello", "it's me"); + System.out.println("======== save 완료 =========="); + Long currentIdx = improvementRepository.findByImproveContent("it's me").getImproveIdx(); + + //Given + ImprovementDto improvementDto = new ImprovementDto(); + improvementDto.setImproveHeader("이걸로 바꿀게용"); + improvementDto.setImproveContent("이걸로 한다고용"); + + //When + improvementService.update(improvementDto, currentIdx); + System.out.println("============= 업데이트 완료 ============"); + + //Then + assertEquals(false, improvementRepository.findByImproveContent("이걸로 한다고용") == null); + } + + @Test + @Order(4) + void 개선사례_삭제() throws Exception { + //Given + saveImprovement("hello", "world"); + System.out.println("========save 완료=========="); + Long delIdx = improvementRepository.findByImproveContent("world").getImproveIdx(); + + //When + improvementService.delete(delIdx); + System.out.println("==========삭제 완료==========="); + + //Then + assertEquals(true, improvementRepository.findByImproveContent("world") == null); + } +} diff --git a/src/test/java/com/moment/the/service/TableServiceTest.java b/src/test/java/com/moment/the/service/TableServiceTest.java new file mode 100644 index 00000000..c59ff1bd --- /dev/null +++ b/src/test/java/com/moment/the/service/TableServiceTest.java @@ -0,0 +1,189 @@ +package com.moment.the.service; + +import com.moment.the.exceptionAdvice.exception.GoodsNotCancelException; +import com.moment.the.table.*; +import com.moment.the.table.dto.TableDto; +import com.moment.the.table.dto.TableViewDto; +import com.moment.the.table.repository.TableRepository; +import com.moment.the.table.service.TableService; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.time.LocalDate; +import java.time.Period; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +class TableServiceTest { + + @Autowired + TableRepository tableRepo; + @Autowired + TableService tableService; + + + // 데이터 섞임 방지 한개의 테스트가 끝날떄마다 DB의 저장내용을 삭제한다. + @AfterEach + public void cleanUp(){ + tableRepo.deleteAll(); + } + + @Test + @DisplayName("TableService write 로직 검증") + void TableService_write_로직검증(){ + // given + TableDto tableDto = TableDto.builder() + .content("TableService write 로직 검증") + .build(); + + // when + TableDomain writeTable = tableService.write(tableDto); + TableDomain savedTable = tableRepo.findByBoardIdx(writeTable.getBoardIdx()).orElseThrow(() -> new IllegalArgumentException("Table을 찾을 수 없습니다. (테스트실패)")); + tableRepo.delete(savedTable); + + // then + assertEquals(tableDto.getContent(), savedTable.getContent()); + } + + @Test + @DisplayName("TableService top30 보여주기(top30View) 검증") + void TableService_top30View_검증(){ + // Given + AtomicInteger i = new AtomicInteger(1); + List TableDomains = Stream.generate( + () -> TableDomain.builder() + .goods(i.getAndIncrement()) + .content("TableService top30 보여주기 테스트") + .build() + ).limit(40).collect(Collectors.toList()); + + // When + tableRepo.saveAll(TableDomains); + List viewTop30 = tableService.top30View(); + + // Then + assertEquals(viewTop30.size(), 30); + AtomicInteger j = new AtomicInteger(40); + // TableService 의 top30View 로직이 올바르게 적용되면 j.get을 했을떄 값이 10이 나와야 한다. + // 저장된Table - top30 = 40 - 30 = 10 + for(TableViewDto v : viewTop30 ) { + assertEquals(v.getGoods(), j.getAndDecrement()); + } + assertEquals(j.get(), 10); + } + + @Test + @DisplayName("TableService viewAll 검증") + void TableService_viewAll_검증(){ + // Given + List tableDomains = Stream.generate( + () -> TableDomain.builder() + .content("TableService viewAll 검증") + .build() + ).limit(10).collect(Collectors.toList()); + + // When + tableRepo.saveAll(tableDomains); + List tableViewAll = tableService.viewAll(); + + // Then + assertEquals(tableViewAll.size(), 10); // 10개를 저장했으므로 tableViewAll 의 개수는 10개여야 한다. + tableViewAll.stream().forEach( t -> System.out.println(t.getContent())); + + } + + @Test + @DisplayName("TableService 전체 개시글 수 보여주기 (amountUncomfortableView)검증") + void TableService_amountUncomfortableView_검증(){ + // Given + List tableDomains = Stream.generate( + () -> TableDomain.builder() + .content("TableService amountUncomfortableView 검증") + .build() + ).limit(10).collect(Collectors.toList()); + + // When + tableRepo.saveAll(tableDomains); + Long amountUncomfortable = tableService.amountUncomfortableView(); + + // then + assertEquals(amountUncomfortable, 10); + } + + @Disabled + @Test @DisplayName("TableService 프로젝트 시작 이후 날짜 보여주기 (dateSinceProjectStart) 검증") + void TableService_dateSinceProjectStart_검증(){ + // Given + LocalDate startTheMoment = LocalDate.of(2021,6,7); + LocalDate currentDate = LocalDate.now(); + + // When + Period period = startTheMoment.until(currentDate); + + // Then + assertEquals(tableService.dateSinceProjectStart(), period.getDays()+1);; + } + + @Test + @DisplayName("TableService 좋아요 수 증가 로직 (goods) 검증") + void TableService_goods_검증(){ + // Given + TableDomain tableDomain = TableDomain.builder() + .content("TableService_goods_검증") + .build(); + + // When + TableDomain savedTableDomain = tableRepo.save(tableDomain); + tableService.goods(savedTableDomain.getBoardIdx()); + TableDomain savedGoodsTableDomain = tableRepo.findByBoardIdx(savedTableDomain.getBoardIdx()).orElseThrow(() -> new IllegalArgumentException("좋아요를 받은 TableEntity를 찾을 수 없습니다.")); + + // Then + assertEquals(savedGoodsTableDomain.getGoods(), 1); + } + + @Test + @DisplayName("TableService 좋아요 수 감소 로직 (cancelGood) 검증") + void TableService_cancelGood_검증(){ + // Given + TableDomain tableDomain = TableDomain.builder() + .content("TableService_goods_검증") + .goods(1) // 좋아요 한개 지급 + .build(); + + // When + TableDomain savedTableDomain = tableRepo.save(tableDomain); + tableService.cancelGood(savedTableDomain.getBoardIdx()); + TableDomain savedCancelGoodTableDomain = tableRepo.findByBoardIdx(savedTableDomain.getBoardIdx()).orElseThrow(() -> new IllegalArgumentException("좋아요를 취소한 TableEntity를 찾을 수 없습니다.")); + + // Given + assertEquals(savedCancelGoodTableDomain.getGoods(), 0); + } + + @Test + @DisplayName("TableService 좋아요 수 감소 로직 (cancelGood) 음수가 될경우 exception 검증") + void TableService_cancelGood_exception_검증() throws Exception { + // Given + TableDomain tableDomain = TableDomain.builder() + .content("TableService_goods_검증") + .goods(0) // 좋아요 0개 + .build(); + + // When + TableDomain savedTableDomain = tableRepo.save(tableDomain); + System.out.println(savedTableDomain.getBoardIdx()); + + assertThrows(GoodsNotCancelException.class, () ->{ + tableService.cancelGood(savedTableDomain.getBoardIdx()); + }); + + } +} \ No newline at end of file diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml new file mode 100644 index 00000000..a66c4f2c --- /dev/null +++ b/src/test/resources/application.yml @@ -0,0 +1,61 @@ +server: + #포트 + port: 8080 + # UTF-8 사용 + servlet: + encoding: + charset: UTF-8 + enabled: true + force: true + +logging: + level: + com.moment.the.config.mvc.RequestResponseLoggingFilter: debug + org.hibernate.SQL: debug + # org.hibernate.type: trace + charset: + console: UTF-8 + file: + name: ./logs/product.log + path: ./logs/product.log + logback: + rollingpolicy: + file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}-%i.log + max-file-size: 500MB + max-history: 1 + +spring: + #H2 DataBase + h2: + console: + enabled: true + path: /h2-console + settings: + web-allow-others: true + # Mysql RDB 설정 + datasource: + url: jdbc:h2:mem:test + username: sa + password: + driver-class-name: org.h2.Driver + + jpa: + hibernate: + ddl-auto: create + properties: + hibernate: + format_sql: true + + #Message 설정 + messages: + basename: i18n/exception + encoding: UTF-8 + + # Redis + redis: + image: redis:latest + host: redis + port: 6379 + + jwt: + secret: asdkfhksldjhfkajsdhfasd7df67sa8d6f87as6df86sa8d7f6a8ds6f87a9s6d8f76sad87f687ad6f8asd76f8asd6f8asd6f87sd6f87asd6f87s \ No newline at end of file From dc5d4b1bd959b6779f998b8e024c0ffb0520e8f1 Mon Sep 17 00:00:00 2001 From: siwony_ Date: Sat, 28 Aug 2021 18:54:55 +0900 Subject: [PATCH 12/41] =?UTF-8?q?[UPDATE]=20jacoco=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 74 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 70 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 26b47559..bb2babc8 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,7 @@ plugins { id 'org.springframework.boot' version '2.4.2' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" + id 'jacoco' } repositories { @@ -16,6 +17,11 @@ repositories { } } +group = 'com.moment' +version = '0.0.1-SNAPSHOT' +description = 'the' +java.sourceCompatibility = JavaVersion.VERSION_11 + dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-security' @@ -64,10 +70,70 @@ dependencies { compileOnly 'org.springframework.boot:spring-boot-starter-tomcat' } -group = 'com.moment' -version = '0.0.1-SNAPSHOT' -description = 'the' -java.sourceCompatibility = JavaVersion.VERSION_11 +test { + jacoco { + enabled = true + destinationFile = file("$buildDir/jacoco/${name}.exec") + includes = [] + excludes = [] + excludeClassLoaders = [] + includeNoLocationClasses = false + sessionId = "" + dumpOnExit = true + classDumpDir = null + output = JacocoTaskExtension.Output.FILE + address = "localhost" + port = 6300 + jmx = false + } + useJUnitPlatform() + finalizedBy 'jacocoTestReport' +} + +jacoco { + toolVersion = '0.8.7' +} + +jacocoTestReport { + reports { + html.enabled true + csv.enabled false + xml.enabled false + } + afterEvaluate { + classDirectories.from = files(classDirectories.files.collect { + fileTree(dir: it, exclude: [ + '**/exception/**' + ,'**/dto/**' + ,'**/repository/**' // DAO(repository) + ,'**/embeddedTypes/**' //embeddedTypes 제거 + ,'**/the/TheApplication*' + ,'**/the/**/*Test*' + ,'**/the/**/Q*' // Q class 제거 + ]) + }) + } + finalizedBy 'jacocoTestCoverageVerification' +} + +jacocoTestCoverageVerification { + violationRules { + rule { + // 룰을 키고 끌 수 있다. + enabled = false + + // 룰을 체크할 단위 + element = 'BUNDLE' + + // Java 바이트코드 를 통한 코드실행 + limit { + counter = 'INSTRUCTION' + value = 'COVEREDRATIO' + minimum = 0.50 + } + } + } +} tasks.withType(JavaCompile) { options.encoding = 'UTF-8' From 1486cd46b63d40d0db9d595f139a6f9e0ff48925 Mon Sep 17 00:00:00 2001 From: siwony_ Date: Sun, 29 Aug 2021 17:05:51 +0900 Subject: [PATCH 13/41] =?UTF-8?q?[UPDATE]=20build.gradle=20=EB=AC=B8?= =?UTF-8?q?=EC=9E=90=EC=97=B4=20=EB=AA=A8=EB=91=90=20=EC=9E=91=EC=9D=80?= =?UTF-8?q?=EB=94=B0=EC=9D=8C=ED=91=9C=EB=A1=9C=20=EA=B0=90=EC=8C=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index bb2babc8..1a5647df 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ plugins { id 'java' id 'org.springframework.boot' version '2.4.2' id 'io.spring.dependency-management' version '1.0.11.RELEASE' - id "com.ewerk.gradle.plugins.querydsl" version "1.0.10" + id "com.ewerk.gradle.plugins.querydsl" version '1.0.10' id 'jacoco' } From ad479a12bdd74f8d2901cd27a9911dd347d29035 Mon Sep 17 00:00:00 2001 From: siwony_ Date: Sun, 29 Aug 2021 17:44:12 +0900 Subject: [PATCH 14/41] =?UTF-8?q?[FIX]=20answer,=20improvement=EC=97=90?= =?UTF-8?q?=EC=84=9C=20admin=EC=9D=B4=20=EC=A0=80=EC=9E=A5=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=98=A4=EB=A5=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/security/jwt/JwtRequestFilter.java | 30 +++++-------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/moment/the/config/security/jwt/JwtRequestFilter.java b/src/main/java/com/moment/the/config/security/jwt/JwtRequestFilter.java index 98ed5f9f..83f188fc 100644 --- a/src/main/java/com/moment/the/config/security/jwt/JwtRequestFilter.java +++ b/src/main/java/com/moment/the/config/security/jwt/JwtRequestFilter.java @@ -3,10 +3,7 @@ import com.moment.the.config.security.auth.MyUserDetailsService; import com.moment.the.exceptionAdvice.exception.InvalidTokenException; import com.moment.the.exceptionAdvice.exception.UserNotFoundException; -import io.jsonwebtoken.ExpiredJwtException; -import io.jsonwebtoken.MalformedJwtException; -import io.jsonwebtoken.UnsupportedJwtException; -import io.jsonwebtoken.security.SignatureException; +import io.jsonwebtoken.JwtException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -34,24 +31,15 @@ protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, String accessToken = req.getHeader("Authorization"); String refreshToken = req.getHeader("RefreshToken"); - String userEmail; - // Access Token이 null이면 검증할 필요가 없다. if (accessToken != null) { - log.debug("=== accessToken 검증 시작 ==="); - - userEmail = accessTokenExtractEmail(accessToken); - if(userEmail != null) - registerUserInfoInSecurityContext(userEmail, req); + String userEmail = accessTokenExtractEmail(accessToken); + if(userEmail != null) registerUserinfoInSecurityContext(userEmail, req); // Access Token이 만료되고 Refresh Token이 존재해야지 새로운 AccessToken을 반한한다. if(jwtUtil.isTokenExpired(accessToken) && refreshToken != null){ - log.debug("=== AccessToken 만료 ==="); - String newAccessToken = generateNewAccessToken(refreshToken); res.addHeader("JwtToken", newAccessToken); - - log.debug("=== AccessToken 발급 ==="); } } filterChain.doFilter(req, res); @@ -67,13 +55,11 @@ protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, */ private String accessTokenExtractEmail(String accessToken) { try { - if(jwtUtil.getTokenType(accessToken).equals(JwtUtil.TokenType.REFRESH_TOKEN.value)) - return accessToken; + if(jwtUtil.getTokenType(accessToken).equals(JwtUtil.TokenType.ACCESS_TOKEN.value)) + return jwtUtil.getUserEmail(accessToken); else return null; - } catch (IllegalArgumentException | ExpiredJwtException e) { - return null; - } catch (MalformedJwtException | UnsupportedJwtException | SignatureException e ) { + } catch (JwtException | IllegalArgumentException e ) { throw new InvalidTokenException(); } } @@ -86,7 +72,7 @@ private String accessTokenExtractEmail(String accessToken) { * @throws UserNotFoundException - 해당 사용자가 없을 경우 throw 된다. * @author 정시원 */ - private void registerUserInfoInSecurityContext(String userEmail, HttpServletRequest req) { + private void registerUserinfoInSecurityContext(String userEmail, HttpServletRequest req) { try { UserDetails userDetails = myUserDetailsService.loadUserByUsername(userEmail); @@ -107,7 +93,7 @@ private void registerUserInfoInSecurityContext(String userEmail, HttpServletRequ private String generateNewAccessToken(String refreshToken) { try { return jwtUtil.generateAccessToken(jwtUtil.getUserEmail(refreshToken)); - } catch (IllegalArgumentException | UnsupportedJwtException | SignatureException | MalformedJwtException | ExpiredJwtException e) { + } catch (JwtException | IllegalArgumentException e) { throw new InvalidTokenException(); } } From 5a9de2d6765ca9023b2a33cce54b7cd1e6847c0c Mon Sep 17 00:00:00 2001 From: siwony_ Date: Sun, 29 Aug 2021 17:44:43 +0900 Subject: [PATCH 15/41] =?UTF-8?q?[UPDATE]=20method=EB=A5=BC=20=ED=95=9C?= =?UTF-8?q?=EC=A4=84=EB=A1=9C=20=EC=A4=84=EC=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../the/config/security/auth/MyUserDetailsService.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/moment/the/config/security/auth/MyUserDetailsService.java b/src/main/java/com/moment/the/config/security/auth/MyUserDetailsService.java index 7151a07c..43b58d03 100644 --- a/src/main/java/com/moment/the/config/security/auth/MyUserDetailsService.java +++ b/src/main/java/com/moment/the/config/security/auth/MyUserDetailsService.java @@ -1,11 +1,9 @@ package com.moment.the.config.security.auth; -import com.moment.the.admin.AdminDomain; import com.moment.the.admin.repository.AdminRepository; import lombok.RequiredArgsConstructor; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; @RequiredArgsConstructor @@ -14,8 +12,7 @@ public class MyUserDetailsService implements UserDetailsService { private final AdminRepository adminRepository; @Override - public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { - AdminDomain adminDomain = adminRepository.findByAdminId(email); - return adminDomain; + public UserDetails loadUserByUsername(String email) { + return adminRepository.findByAdminId(email); } } From 6754ae44bb1ea0907b5bcbbb3b3957f552b48db3 Mon Sep 17 00:00:00 2001 From: siwony_ Date: Sun, 29 Aug 2021 18:00:17 +0900 Subject: [PATCH 16/41] =?UTF-8?q?[UPDATE]=20=ED=95=84=EC=9A=94=EC=97=86?= =?UTF-8?q?=EB=8A=94=20if=EB=AC=B8=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/moment/the/config/security/jwt/JwtRequestFilter.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/com/moment/the/config/security/jwt/JwtRequestFilter.java b/src/main/java/com/moment/the/config/security/jwt/JwtRequestFilter.java index 83f188fc..705452ec 100644 --- a/src/main/java/com/moment/the/config/security/jwt/JwtRequestFilter.java +++ b/src/main/java/com/moment/the/config/security/jwt/JwtRequestFilter.java @@ -55,10 +55,7 @@ protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, */ private String accessTokenExtractEmail(String accessToken) { try { - if(jwtUtil.getTokenType(accessToken).equals(JwtUtil.TokenType.ACCESS_TOKEN.value)) - return jwtUtil.getUserEmail(accessToken); - else - return null; + return jwtUtil.getUserEmail(accessToken); } catch (JwtException | IllegalArgumentException e ) { throw new InvalidTokenException(); } From f24594402ff17f6e66750ed65dad15c78ec9a10c Mon Sep 17 00:00:00 2001 From: siwony_ Date: Fri, 3 Sep 2021 12:03:19 +0900 Subject: [PATCH 17/41] [ADD] swagger config --- src/main/java/com/moment/the/config/swagger/SwaggerConfig.java | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/main/java/com/moment/the/config/swagger/SwaggerConfig.java diff --git a/src/main/java/com/moment/the/config/swagger/SwaggerConfig.java b/src/main/java/com/moment/the/config/swagger/SwaggerConfig.java new file mode 100644 index 00000000..b17e4a36 --- /dev/null +++ b/src/main/java/com/moment/the/config/swagger/SwaggerConfig.java @@ -0,0 +1,2 @@ +package com.moment.the.config.swagger;public class SwaggerConfig { +} From 3bc09d7221e0b9d6e5a000adeb376b5b4dfce3a0 Mon Sep 17 00:00:00 2001 From: siwony_ Date: Fri, 3 Sep 2021 12:28:38 +0900 Subject: [PATCH 18/41] [ADD] swagger config --- .../the/config/swagger/SwaggerConfig.java | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/moment/the/config/swagger/SwaggerConfig.java b/src/main/java/com/moment/the/config/swagger/SwaggerConfig.java index b17e4a36..93985f41 100644 --- a/src/main/java/com/moment/the/config/swagger/SwaggerConfig.java +++ b/src/main/java/com/moment/the/config/swagger/SwaggerConfig.java @@ -1,2 +1,37 @@ -package com.moment.the.config.swagger;public class SwaggerConfig { +package com.moment.the.config.swagger; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@Configuration +@EnableSwagger2 +@Profile("Dev") +public class SwaggerConfig { + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("the_moment") + .description("the_moment") + .build(); + } + + @Bean + public Docket api() { + return new Docket(DocumentationType.SWAGGER_2) + .groupName("EZY") + .apiInfo(this.apiInfo()) + .select() + .apis(RequestHandlerSelectors + .basePackage("com.moment.the")) + .paths(PathSelectors.ant("/v1/**")) + .build(); + } } From 330fb80f8ff50cfc64ba505698be0dfac61653d3 Mon Sep 17 00:00:00 2001 From: siwony_ Date: Fri, 3 Sep 2021 13:32:28 +0900 Subject: [PATCH 19/41] =?UTF-8?q?[UPDATE]=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EB=B9=8C=EB=93=9C=ED=8C=8C=EC=9D=BC=20=EA=B2=BD?= =?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 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index b0031a10..7ba271df 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ VOLUME /tmp EXPOSE 8080 # The application's jar file -ARG JAR_FILE=target/the-0.0.1-SNAPSHOT.jar +ARG JAR_FILE=build/libs/the-0.0.1-SNAPSHOT.jar # Add the application's jar to the container ADD ${JAR_FILE} the_moment_server.jar From 39daa0b8f5c5b2f129e4792d1bbe28946c5ecbfb Mon Sep 17 00:00:00 2001 From: siwony_ Date: Fri, 3 Sep 2021 13:32:45 +0900 Subject: [PATCH 20/41] =?UTF-8?q?[UPDATE]=20maven=20=EC=8B=A4=ED=96=89=20?= =?UTF-8?q?=EC=9D=84=20gradle=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 --- docker-compose-env.sh | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/docker-compose-env.sh b/docker-compose-env.sh index ea5a782e..3ba9c9a0 100755 --- a/docker-compose-env.sh +++ b/docker-compose-env.sh @@ -1,15 +1,6 @@ #!/bin/bash -echo "====mvn clean======" -./mvnw clean - -echo "=====mvn compile=====" -./mvnw compile - -echo "======mvn package======" -./mvnw package - -echo "======docker-compose build======" -docker-compose build +echo "====gradle clean build======" +./gradlew clean build echo "======docker-compose up=======" docker-compose up \ No newline at end of file From 33c34ee26b2ab449fbcb232489bebc6b103a8681 Mon Sep 17 00:00:00 2001 From: siwony_ Date: Mon, 6 Sep 2021 11:01:24 +0900 Subject: [PATCH 21/41] =?UTF-8?q?Update=20gradle=20=EB=B9=8C=EB=93=9C=20?= =?UTF-8?q?=ED=88=B4=EC=97=90=20=EB=94=B0=EB=9D=BC=20readme=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 --- README.md | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index f3e023ba..b1d72819 100644 --- a/README.md +++ b/README.md @@ -5,24 +5,18 @@
-#### GET start -``` -- install maven -$ sudo apt-get install maven - -- checking maven version -$ maven -version - -- docker install +#### GET start - ubuntu +```shell +# docker install $ sudo apt-get install docker.io -- docker-compose install +# docker-compose install $ sudo apt-get install docker-compose -- start the_moment-server use shell! (Docker Run) +# start the_moment-server use shell! (Docker Run) $ sudo ./docker-compose-env.sh -- Run in the background as well (prefer) +# Run in the background as well (prefer) $ sudo nohup ./docker-compose-env.sh & ``` @@ -37,6 +31,11 @@ $ sudo nohup ./docker-compose-env.sh & - Validation - Spring Security - Spring Data Reactive Redis + - Querydsl + +* plugin + - Dependency Management - 1.0.11.RELEASE + - Jacoco * dev tools - IntelliJ IDEA From f3fcd15a65df77057ebcf2f2dde875bc8316ffcc Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Mon, 6 Sep 2021 11:07:07 +0900 Subject: [PATCH 22/41] Rename table package to uncomfortable --- .../java/com/moment/the/answer/AnswerDomain.java | 2 +- .../com/moment/the/answer/service/AnswerService.java | 4 ++-- .../the/{table => uncomfortable}/TableDomain.java | 2 +- .../controller/TableController.java | 8 ++++---- .../dto/AmountUncomfortableDto.java | 2 +- .../the/{table => uncomfortable}/dto/TableDto.java | 4 ++-- .../{table => uncomfortable}/dto/TableViewDto.java | 2 +- .../repository/TableRepository.java | 10 +++++----- .../service/TableService.java | 10 +++++----- .../the/controller/release/TableControllerTest.java | 12 ++++++------ .../com/moment/the/service/AnswerServiceTest.java | 6 +++--- .../com/moment/the/service/TableServiceTest.java | 10 +++++----- 12 files changed, 36 insertions(+), 36 deletions(-) rename src/main/java/com/moment/the/{table => uncomfortable}/TableDomain.java (94%) rename src/main/java/com/moment/the/{table => uncomfortable}/controller/TableController.java (92%) rename src/main/java/com/moment/the/{table => uncomfortable}/dto/AmountUncomfortableDto.java (83%) rename src/main/java/com/moment/the/{table => uncomfortable}/dto/TableDto.java (82%) rename src/main/java/com/moment/the/{table => uncomfortable}/dto/TableViewDto.java (92%) rename src/main/java/com/moment/the/{table => uncomfortable}/repository/TableRepository.java (69%) rename src/main/java/com/moment/the/{table => uncomfortable}/service/TableService.java (90%) diff --git a/src/main/java/com/moment/the/answer/AnswerDomain.java b/src/main/java/com/moment/the/answer/AnswerDomain.java index 5261cbd6..20496829 100644 --- a/src/main/java/com/moment/the/answer/AnswerDomain.java +++ b/src/main/java/com/moment/the/answer/AnswerDomain.java @@ -4,7 +4,7 @@ import com.moment.the.admin.AdminDomain; import com.moment.the.answer.dto.AnswerDto; -import com.moment.the.table.TableDomain; +import com.moment.the.uncomfortable.TableDomain; import com.sun.istack.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/com/moment/the/answer/service/AnswerService.java b/src/main/java/com/moment/the/answer/service/AnswerService.java index 83168e24..cd7c48e9 100644 --- a/src/main/java/com/moment/the/answer/service/AnswerService.java +++ b/src/main/java/com/moment/the/answer/service/AnswerService.java @@ -8,8 +8,8 @@ import com.moment.the.answer.dto.AnswerResDto; import com.moment.the.answer.repository.AnswerRepository; import com.moment.the.exceptionAdvice.exception.*; -import com.moment.the.table.TableDomain; -import com.moment.the.table.repository.TableRepository; +import com.moment.the.uncomfortable.TableDomain; +import com.moment.the.uncomfortable.repository.TableRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/com/moment/the/table/TableDomain.java b/src/main/java/com/moment/the/uncomfortable/TableDomain.java similarity index 94% rename from src/main/java/com/moment/the/table/TableDomain.java rename to src/main/java/com/moment/the/uncomfortable/TableDomain.java index 782267c3..cdabdea4 100644 --- a/src/main/java/com/moment/the/table/TableDomain.java +++ b/src/main/java/com/moment/the/uncomfortable/TableDomain.java @@ -1,4 +1,4 @@ -package com.moment.the.table; +package com.moment.the.uncomfortable; import com.moment.the.answer.AnswerDomain; import lombok.*; diff --git a/src/main/java/com/moment/the/table/controller/TableController.java b/src/main/java/com/moment/the/uncomfortable/controller/TableController.java similarity index 92% rename from src/main/java/com/moment/the/table/controller/TableController.java rename to src/main/java/com/moment/the/uncomfortable/controller/TableController.java index 0c1b117e..fcaad888 100644 --- a/src/main/java/com/moment/the/table/controller/TableController.java +++ b/src/main/java/com/moment/the/uncomfortable/controller/TableController.java @@ -1,12 +1,12 @@ -package com.moment.the.table.controller; +package com.moment.the.uncomfortable.controller; import com.moment.the.response.ResponseService; import com.moment.the.response.result.CommonResult; import com.moment.the.response.result.ListResult; import com.moment.the.response.result.SingleResult; -import com.moment.the.table.dto.TableDto; -import com.moment.the.table.dto.TableViewDto; -import com.moment.the.table.service.TableService; +import com.moment.the.uncomfortable.dto.TableDto; +import com.moment.the.uncomfortable.dto.TableViewDto; +import com.moment.the.uncomfortable.service.TableService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/com/moment/the/table/dto/AmountUncomfortableDto.java b/src/main/java/com/moment/the/uncomfortable/dto/AmountUncomfortableDto.java similarity index 83% rename from src/main/java/com/moment/the/table/dto/AmountUncomfortableDto.java rename to src/main/java/com/moment/the/uncomfortable/dto/AmountUncomfortableDto.java index cabe21ff..54fa29c1 100644 --- a/src/main/java/com/moment/the/table/dto/AmountUncomfortableDto.java +++ b/src/main/java/com/moment/the/uncomfortable/dto/AmountUncomfortableDto.java @@ -1,4 +1,4 @@ -package com.moment.the.table.dto; +package com.moment.the.uncomfortable.dto; import lombok.*; diff --git a/src/main/java/com/moment/the/table/dto/TableDto.java b/src/main/java/com/moment/the/uncomfortable/dto/TableDto.java similarity index 82% rename from src/main/java/com/moment/the/table/dto/TableDto.java rename to src/main/java/com/moment/the/uncomfortable/dto/TableDto.java index 74a071bf..99efc1be 100644 --- a/src/main/java/com/moment/the/table/dto/TableDto.java +++ b/src/main/java/com/moment/the/uncomfortable/dto/TableDto.java @@ -1,6 +1,6 @@ -package com.moment.the.table.dto; +package com.moment.the.uncomfortable.dto; -import com.moment.the.table.TableDomain; +import com.moment.the.uncomfortable.TableDomain; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/com/moment/the/table/dto/TableViewDto.java b/src/main/java/com/moment/the/uncomfortable/dto/TableViewDto.java similarity index 92% rename from src/main/java/com/moment/the/table/dto/TableViewDto.java rename to src/main/java/com/moment/the/uncomfortable/dto/TableViewDto.java index 32e92d0a..0c5c1ce2 100644 --- a/src/main/java/com/moment/the/table/dto/TableViewDto.java +++ b/src/main/java/com/moment/the/uncomfortable/dto/TableViewDto.java @@ -1,4 +1,4 @@ -package com.moment.the.table.dto; +package com.moment.the.uncomfortable.dto; import com.moment.the.answer.AnswerDomain; import lombok.*; diff --git a/src/main/java/com/moment/the/table/repository/TableRepository.java b/src/main/java/com/moment/the/uncomfortable/repository/TableRepository.java similarity index 69% rename from src/main/java/com/moment/the/table/repository/TableRepository.java rename to src/main/java/com/moment/the/uncomfortable/repository/TableRepository.java index 7404b930..d1be48cf 100644 --- a/src/main/java/com/moment/the/table/repository/TableRepository.java +++ b/src/main/java/com/moment/the/uncomfortable/repository/TableRepository.java @@ -1,7 +1,7 @@ -package com.moment.the.table.repository; +package com.moment.the.uncomfortable.repository; -import com.moment.the.table.TableDomain; -import com.moment.the.table.dto.TableViewDto; +import com.moment.the.uncomfortable.TableDomain; +import com.moment.the.uncomfortable.dto.TableViewDto; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -19,13 +19,13 @@ public interface TableRepository extends JpaRepository{ "FROM TableDomain table" ) Long amountUncomfortable(); - @Query("SELECT new com.moment.the.table.dto.TableViewDto(table.boardIdx, table.content, table.goods, answer)" + + @Query("SELECT new com.moment.the.uncomfortable.dto.TableViewDto(table.boardIdx, table.content, table.goods, answer)" + "FROM TableDomain table LEFT JOIN table.answerDomain answer " + "ORDER BY table.boardIdx DESC " ) List tableViewAll(); - @Query("SELECT new com.moment.the.table.dto.TableViewDto(table.boardIdx, table.content, table.goods, answer)" + + @Query("SELECT new com.moment.the.uncomfortable.dto.TableViewDto(table.boardIdx, table.content, table.goods, answer)" + "FROM TableDomain table LEFT JOIN table.answerDomain answer " + "ORDER BY table.goods DESC " ) diff --git a/src/main/java/com/moment/the/table/service/TableService.java b/src/main/java/com/moment/the/uncomfortable/service/TableService.java similarity index 90% rename from src/main/java/com/moment/the/table/service/TableService.java rename to src/main/java/com/moment/the/uncomfortable/service/TableService.java index 502fd751..94143c77 100644 --- a/src/main/java/com/moment/the/table/service/TableService.java +++ b/src/main/java/com/moment/the/uncomfortable/service/TableService.java @@ -1,11 +1,11 @@ -package com.moment.the.table.service; +package com.moment.the.uncomfortable.service; import com.moment.the.exceptionAdvice.exception.GoodsNotCancelException; import com.moment.the.exceptionAdvice.exception.NoPostException; -import com.moment.the.table.TableDomain; -import com.moment.the.table.dto.TableDto; -import com.moment.the.table.dto.TableViewDto; -import com.moment.the.table.repository.TableRepository; +import com.moment.the.uncomfortable.TableDomain; +import com.moment.the.uncomfortable.dto.TableDto; +import com.moment.the.uncomfortable.dto.TableViewDto; +import com.moment.the.uncomfortable.repository.TableRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; diff --git a/src/test/java/com/moment/the/controller/release/TableControllerTest.java b/src/test/java/com/moment/the/controller/release/TableControllerTest.java index 3bfdba89..43d05e04 100644 --- a/src/test/java/com/moment/the/controller/release/TableControllerTest.java +++ b/src/test/java/com/moment/the/controller/release/TableControllerTest.java @@ -2,13 +2,13 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.moment.the.table.controller.TableController; -import com.moment.the.table.TableDomain; +import com.moment.the.uncomfortable.controller.TableController; +import com.moment.the.uncomfortable.TableDomain; import com.moment.the.response.ResponseService; -import com.moment.the.table.dto.TableDto; -import com.moment.the.table.dto.TableViewDto; -import com.moment.the.table.repository.TableRepository; -import com.moment.the.table.service.TableService; +import com.moment.the.uncomfortable.dto.TableDto; +import com.moment.the.uncomfortable.dto.TableViewDto; +import com.moment.the.uncomfortable.repository.TableRepository; +import com.moment.the.uncomfortable.service.TableService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomStringUtils; import org.junit.jupiter.api.*; diff --git a/src/test/java/com/moment/the/service/AnswerServiceTest.java b/src/test/java/com/moment/the/service/AnswerServiceTest.java index d1b6e4e7..9f39eb6c 100644 --- a/src/test/java/com/moment/the/service/AnswerServiceTest.java +++ b/src/test/java/com/moment/the/service/AnswerServiceTest.java @@ -9,11 +9,11 @@ import com.moment.the.answer.service.AnswerService; import com.moment.the.config.security.auth.MyUserDetailsService; import com.moment.the.admin.AdminDomain; -import com.moment.the.table.TableDomain; +import com.moment.the.uncomfortable.TableDomain; import com.moment.the.admin.dto.AdminDto; -import com.moment.the.table.dto.TableDto; +import com.moment.the.uncomfortable.dto.TableDto; import com.moment.the.admin.repository.AdminRepository; -import com.moment.the.table.service.TableService; +import com.moment.the.uncomfortable.service.TableService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/test/java/com/moment/the/service/TableServiceTest.java b/src/test/java/com/moment/the/service/TableServiceTest.java index c59ff1bd..73206ad8 100644 --- a/src/test/java/com/moment/the/service/TableServiceTest.java +++ b/src/test/java/com/moment/the/service/TableServiceTest.java @@ -1,11 +1,11 @@ package com.moment.the.service; import com.moment.the.exceptionAdvice.exception.GoodsNotCancelException; -import com.moment.the.table.*; -import com.moment.the.table.dto.TableDto; -import com.moment.the.table.dto.TableViewDto; -import com.moment.the.table.repository.TableRepository; -import com.moment.the.table.service.TableService; +import com.moment.the.uncomfortable.*; +import com.moment.the.uncomfortable.dto.TableDto; +import com.moment.the.uncomfortable.dto.TableViewDto; +import com.moment.the.uncomfortable.repository.TableRepository; +import com.moment.the.uncomfortable.service.TableService; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayName; From 900a9bddde1101662b1f9e6918a162bd0084b6d2 Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Mon, 6 Sep 2021 11:08:54 +0900 Subject: [PATCH 23/41] Rename TableDomain to UncomfortableEntity --- .../com/moment/the/answer/AnswerDomain.java | 10 ++-- .../the/answer/service/AnswerService.java | 14 +++--- ...leDomain.java => UncomfortableEntity.java} | 2 +- .../the/uncomfortable/dto/TableDto.java | 6 +-- .../repository/TableRepository.java | 12 ++--- .../uncomfortable/service/TableService.java | 14 +++--- .../release/TableControllerTest.java | 28 +++++------ .../moment/the/service/AnswerServiceTest.java | 40 +++++++-------- .../moment/the/service/TableServiceTest.java | 50 +++++++++---------- 9 files changed, 88 insertions(+), 88 deletions(-) rename src/main/java/com/moment/the/uncomfortable/{TableDomain.java => UncomfortableEntity.java} (95%) diff --git a/src/main/java/com/moment/the/answer/AnswerDomain.java b/src/main/java/com/moment/the/answer/AnswerDomain.java index 20496829..9cc4835b 100644 --- a/src/main/java/com/moment/the/answer/AnswerDomain.java +++ b/src/main/java/com/moment/the/answer/AnswerDomain.java @@ -4,7 +4,7 @@ import com.moment.the.admin.AdminDomain; import com.moment.the.answer.dto.AnswerDto; -import com.moment.the.uncomfortable.TableDomain; +import com.moment.the.uncomfortable.UncomfortableEntity; import com.sun.istack.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; @@ -33,7 +33,7 @@ public class AnswerDomain { @OneToOne(mappedBy = "answerDomain", fetch = LAZY) @JoinColumn(name = "boardIdx", nullable = false) - private TableDomain tableDomain; + private UncomfortableEntity uncomfortableEntity; @ManyToOne(fetch = LAZY) @JoinColumn(name="writer", nullable = false) @@ -44,8 +44,8 @@ public void update(AnswerDto answerDto) { this.answerContent = answerDto.getContent(); } - public void updateTableDomain(TableDomain tableDomain){ - this.tableDomain = tableDomain; - this.tableDomain.updateAnswerDomain(this); + public void updateTableDomain(UncomfortableEntity uncomfortableEntity){ + this.uncomfortableEntity = uncomfortableEntity; + this.uncomfortableEntity.updateAnswerDomain(this); } } diff --git a/src/main/java/com/moment/the/answer/service/AnswerService.java b/src/main/java/com/moment/the/answer/service/AnswerService.java index cd7c48e9..4283db3d 100644 --- a/src/main/java/com/moment/the/answer/service/AnswerService.java +++ b/src/main/java/com/moment/the/answer/service/AnswerService.java @@ -8,7 +8,7 @@ import com.moment.the.answer.dto.AnswerResDto; import com.moment.the.answer.repository.AnswerRepository; import com.moment.the.exceptionAdvice.exception.*; -import com.moment.the.uncomfortable.TableDomain; +import com.moment.the.uncomfortable.UncomfortableEntity; import com.moment.the.uncomfortable.repository.TableRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -24,8 +24,8 @@ public class AnswerService { // 답변 작성하기 public AnswerDomain save(AnswerDto answerDto, Long boardIdx) { //예외 처리 - TableDomain tableDomain = tableFindBy(boardIdx); // table 번호로 찾고 없으면 Exception - boolean existAnswer = tableDomain.getAnswerDomain() != null ? true : false; + UncomfortableEntity uncomfortableEntity = tableFindBy(boardIdx); // table 번호로 찾고 없으면 Exception + boolean existAnswer = uncomfortableEntity.getAnswerDomain() != null ? true : false; if(existAnswer) throw new AnswerAlreadyExistsException(); //이미 답변이 있으면 Exception AdminDomain adminDomain = adminRepo.findByAdminId(AdminServiceImpl.getUserEmail()); @@ -33,7 +33,7 @@ public AnswerDomain save(AnswerDto answerDto, Long boardIdx) { // AnswerDomain 생성 및 Table 과의 연관관계 맻음 answerDto.setAdminDomain(adminDomain); AnswerDomain saveAnswerDomain = answerDto.toEntity(); - saveAnswerDomain.updateTableDomain(tableDomain); + saveAnswerDomain.updateTableDomain(uncomfortableEntity); AnswerDomain savedAnswerDomain = answerRepo.save(saveAnswerDomain); @@ -61,7 +61,7 @@ public AnswerResDto view(Long boardIdx) { AnswerResDto answerResDto = AnswerResDto.builder() .answerIdx(answerDomain.getAnswerIdx()) - .title(answerDomain.getTableDomain().getContent()) + .title(answerDomain.getUncomfortableEntity().getContent()) .content(answerDomain.getAnswerContent()) .writer(answerDomain.getAdminDomain().getAdminName()) .build(); @@ -94,13 +94,13 @@ public AnswerDomain answerFindBy(AdminDomain adminDomain){ } // tableIdx 로 해당 table 찾기 - public TableDomain tableFindBy(Long tableId){ + public UncomfortableEntity tableFindBy(Long tableId){ return tableRepo.findById(tableId).orElseThrow(NoPostException::new); } public void deleteAnswer(AnswerDomain answerDomain){ Long answerIdx = answerDomain.getAnswerIdx(); - answerDomain.getTableDomain().updateAnswerDomain(null); // 외래키 제약조건으로 인한 오류 해결 + answerDomain.getUncomfortableEntity().updateAnswerDomain(null); // 외래키 제약조건으로 인한 오류 해결 answerRepo.deleteAllByAnswerIdx(answerIdx); } diff --git a/src/main/java/com/moment/the/uncomfortable/TableDomain.java b/src/main/java/com/moment/the/uncomfortable/UncomfortableEntity.java similarity index 95% rename from src/main/java/com/moment/the/uncomfortable/TableDomain.java rename to src/main/java/com/moment/the/uncomfortable/UncomfortableEntity.java index cdabdea4..f308c156 100644 --- a/src/main/java/com/moment/the/uncomfortable/TableDomain.java +++ b/src/main/java/com/moment/the/uncomfortable/UncomfortableEntity.java @@ -13,7 +13,7 @@ @NoArgsConstructor @AllArgsConstructor @Builder -public class TableDomain { +public class UncomfortableEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long boardIdx; diff --git a/src/main/java/com/moment/the/uncomfortable/dto/TableDto.java b/src/main/java/com/moment/the/uncomfortable/dto/TableDto.java index 99efc1be..7231c6d5 100644 --- a/src/main/java/com/moment/the/uncomfortable/dto/TableDto.java +++ b/src/main/java/com/moment/the/uncomfortable/dto/TableDto.java @@ -1,6 +1,6 @@ package com.moment.the.uncomfortable.dto; -import com.moment.the.uncomfortable.TableDomain; +import com.moment.the.uncomfortable.UncomfortableEntity; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -16,8 +16,8 @@ public class TableDto { @NotBlank private String content; - public TableDomain toEntity(){ - return TableDomain.builder() + public UncomfortableEntity toEntity(){ + return UncomfortableEntity.builder() .content(this.content) .build(); } diff --git a/src/main/java/com/moment/the/uncomfortable/repository/TableRepository.java b/src/main/java/com/moment/the/uncomfortable/repository/TableRepository.java index d1be48cf..3d342878 100644 --- a/src/main/java/com/moment/the/uncomfortable/repository/TableRepository.java +++ b/src/main/java/com/moment/the/uncomfortable/repository/TableRepository.java @@ -1,6 +1,6 @@ package com.moment.the.uncomfortable.repository; -import com.moment.the.uncomfortable.TableDomain; +import com.moment.the.uncomfortable.UncomfortableEntity; import com.moment.the.uncomfortable.dto.TableViewDto; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -11,22 +11,22 @@ import java.util.Optional; @Repository -public interface TableRepository extends JpaRepository{ +public interface TableRepository extends JpaRepository{ // idx로 table 찾기. - Optional findByBoardIdx(Long boardIdx); + Optional findByBoardIdx(Long boardIdx); @Query(value = "SELECT COUNT(table.boardIdx) " + - "FROM TableDomain table" ) + "FROM UncomfortableEntity table" ) Long amountUncomfortable(); @Query("SELECT new com.moment.the.uncomfortable.dto.TableViewDto(table.boardIdx, table.content, table.goods, answer)" + - "FROM TableDomain table LEFT JOIN table.answerDomain answer " + + "FROM UncomfortableEntity table LEFT JOIN table.answerDomain answer " + "ORDER BY table.boardIdx DESC " ) List tableViewAll(); @Query("SELECT new com.moment.the.uncomfortable.dto.TableViewDto(table.boardIdx, table.content, table.goods, answer)" + - "FROM TableDomain table LEFT JOIN table.answerDomain answer " + + "FROM UncomfortableEntity table LEFT JOIN table.answerDomain answer " + "ORDER BY table.goods DESC " ) List tableViewTopBy(Pageable p); diff --git a/src/main/java/com/moment/the/uncomfortable/service/TableService.java b/src/main/java/com/moment/the/uncomfortable/service/TableService.java index 94143c77..926599b9 100644 --- a/src/main/java/com/moment/the/uncomfortable/service/TableService.java +++ b/src/main/java/com/moment/the/uncomfortable/service/TableService.java @@ -2,7 +2,7 @@ import com.moment.the.exceptionAdvice.exception.GoodsNotCancelException; import com.moment.the.exceptionAdvice.exception.NoPostException; -import com.moment.the.uncomfortable.TableDomain; +import com.moment.the.uncomfortable.UncomfortableEntity; import com.moment.the.uncomfortable.dto.TableDto; import com.moment.the.uncomfortable.dto.TableViewDto; import com.moment.the.uncomfortable.repository.TableRepository; @@ -24,7 +24,7 @@ public class TableService { // 작성하기. @Transactional - public TableDomain write(TableDto tableDto){ + public UncomfortableEntity write(TableDto tableDto){ return tableRepository.save(tableDto.toEntity()); } @@ -51,18 +51,18 @@ public int dateSinceProjectStart(){ // 좋아요 수 증가. @Transactional public void goods(Long boardIdx){ - TableDomain tableDomain = tableRepository.findByBoardIdx(boardIdx).orElseThrow(NoPostException::new); - tableDomain.updateGoods(tableDomain.getGoods()+1); + UncomfortableEntity uncomfortableEntity = tableRepository.findByBoardIdx(boardIdx).orElseThrow(NoPostException::new); + uncomfortableEntity.updateGoods(uncomfortableEntity.getGoods()+1); } // 좋아요 수 감소. @Transactional public void cancelGood(Long boardIdx) { - TableDomain tableDomain = tableRepository.findByBoardIdx(boardIdx).orElseThrow(NoPostException::new); - int goodsResult = tableDomain.getGoods() - 1; + UncomfortableEntity uncomfortableEntity = tableRepository.findByBoardIdx(boardIdx).orElseThrow(NoPostException::new); + int goodsResult = uncomfortableEntity.getGoods() - 1; if(goodsResult > -1) {//좋야요가 양수일때 - tableDomain.updateGoods(goodsResult); + uncomfortableEntity.updateGoods(goodsResult); }else{ throw new GoodsNotCancelException(); } diff --git a/src/test/java/com/moment/the/controller/release/TableControllerTest.java b/src/test/java/com/moment/the/controller/release/TableControllerTest.java index 43d05e04..8db5a556 100644 --- a/src/test/java/com/moment/the/controller/release/TableControllerTest.java +++ b/src/test/java/com/moment/the/controller/release/TableControllerTest.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.moment.the.uncomfortable.controller.TableController; -import com.moment.the.uncomfortable.TableDomain; +import com.moment.the.uncomfortable.UncomfortableEntity; import com.moment.the.response.ResponseService; import com.moment.the.uncomfortable.dto.TableDto; import com.moment.the.uncomfortable.dto.TableViewDto; @@ -97,13 +97,13 @@ String objectToJson(Object object) throws JsonProcessingException { .collect(Collectors.toList()); AtomicInteger i = new AtomicInteger(0); - List tableDomains = Stream.generate( - () -> TableDomain.builder() + List uncomfortableEntities = Stream.generate( + () -> UncomfortableEntity.builder() .goods(0) .content(TABLE_CONTENTS.get(i.getAndIncrement())) .build() ).limit(3).collect(Collectors.toList()); - tableRepo.saveAll(tableDomains); + tableRepo.saveAll(uncomfortableEntities); // When resultActions = mockMvc.perform( @@ -124,14 +124,14 @@ String objectToJson(Object object) throws JsonProcessingException { void top30_검증() throws Exception { //Given AtomicInteger i = new AtomicInteger(1); - List tableDomains = Stream.generate( - () -> TableDomain.builder() + List uncomfortableEntities = Stream.generate( + () -> UncomfortableEntity.builder() .goods(i.getAndIncrement()) .content(RandomStringUtils.randomAlphabetic(15)) .build() ).limit(40).collect(Collectors.toList()); - tableRepo.saveAll(tableDomains); + tableRepo.saveAll(uncomfortableEntities); List tableViewDtos = tableService.top30View(); String top30Data = objectToJson(tableViewDtos); @@ -150,10 +150,10 @@ String objectToJson(Object object) throws JsonProcessingException { @Test @DisplayName("[PUT]/v1/uncomfortable/{boardIdx} goods 추가") void goods_검증() throws Exception { //Given - TableDomain tableDomain = TableDomain.builder() + UncomfortableEntity uncomfortableEntity = UncomfortableEntity.builder() .content("학교 급식이 맛이 없어요") .build(); - Long tableIdx = tableRepo.save(tableDomain).getBoardIdx(); + Long tableIdx = tableRepo.save(uncomfortableEntity).getBoardIdx(); //When resultActions = mockMvc.perform( @@ -171,11 +171,11 @@ String objectToJson(Object object) throws JsonProcessingException { @Test @DisplayName("[PUT]/v1/uncomfortable/cancel/{boardIdx} goods 감소") void goodCancel_검증() throws Exception { //Given - TableDomain tableDomain = TableDomain.builder() + UncomfortableEntity uncomfortableEntity = UncomfortableEntity.builder() .content("학교 급식이 맛이 없어요") .goods(1) .build(); - Long tableIdx = tableRepo.save(tableDomain).getBoardIdx(); + Long tableIdx = tableRepo.save(uncomfortableEntity).getBoardIdx(); //When resultActions = mockMvc.perform( @@ -193,12 +193,12 @@ String objectToJson(Object object) throws JsonProcessingException { @Test @DisplayName("[GET]/v1/uncomfortable/amount ") void amountUncomfortable_검증() throws Exception { //Given - List tableDomains = Stream.generate( - () -> TableDomain.builder() + List uncomfortableEntities = Stream.generate( + () -> UncomfortableEntity.builder() .content(RandomStringUtils.randomAlphabetic(15)) .build() ).limit(8).collect(Collectors.toList()); - tableRepo.saveAll(tableDomains); + tableRepo.saveAll(uncomfortableEntities); //When resultActions = mockMvc.perform( diff --git a/src/test/java/com/moment/the/service/AnswerServiceTest.java b/src/test/java/com/moment/the/service/AnswerServiceTest.java index 9f39eb6c..49cd6e52 100644 --- a/src/test/java/com/moment/the/service/AnswerServiceTest.java +++ b/src/test/java/com/moment/the/service/AnswerServiceTest.java @@ -9,7 +9,7 @@ import com.moment.the.answer.service.AnswerService; import com.moment.the.config.security.auth.MyUserDetailsService; import com.moment.the.admin.AdminDomain; -import com.moment.the.uncomfortable.TableDomain; +import com.moment.the.uncomfortable.UncomfortableEntity; import com.moment.the.admin.dto.AdminDto; import com.moment.the.uncomfortable.dto.TableDto; import com.moment.the.admin.repository.AdminRepository; @@ -65,11 +65,11 @@ AdminDomain adminLogin(String adminId, String password) { } //test 편의를 위한 Table 생성 메서드 - TableDomain createTable(){ + UncomfortableEntity createTable(){ String TABLE_CONTENT = "급식이 맛이 없어요 급식에 질을 높여주세요!"; TableDto tableDto = new TableDto(TABLE_CONTENT); - TableDomain tableDomain = tableService.write(tableDto); - return tableDomain; + UncomfortableEntity uncomfortableEntity = tableService.write(tableDto); + return uncomfortableEntity; } @Test @DisplayName("답변 작성하기 (save) 검증") @@ -82,18 +82,18 @@ TableDomain createTable(){ AdminDomain adminDomain = adminLogin(USER_ID, USER_PASSWORD); //Table 등록 - TableDomain tableDomain = createTable(); + UncomfortableEntity uncomfortableEntity = createTable(); //answer 입력 String ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; AnswerDto answerDto = new AnswerDto(ANSWER_CONTENT, null); // When - AnswerDomain savedAnswer = answerService.save(answerDto, tableDomain.getBoardIdx()); + AnswerDomain savedAnswer = answerService.save(answerDto, uncomfortableEntity.getBoardIdx()); // Then assertEquals(savedAnswer.getAnswerContent(), ANSWER_CONTENT); - assertEquals(savedAnswer.getTableDomain(), tableDomain); + assertEquals(savedAnswer.getUncomfortableEntity(), uncomfortableEntity); assertEquals(savedAnswer.getAdminDomain(), adminDomain); } @@ -107,19 +107,19 @@ TableDomain createTable(){ AdminDomain adminDomain = adminLogin(USER_ID, USER_PASSWORD); //Table 등록 - TableDomain tableDomain = createTable(); + UncomfortableEntity uncomfortableEntity = createTable(); //answer 추가 String ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; AnswerDto answerDto = new AnswerDto(ANSWER_CONTENT, null); - answerService.save(answerDto, tableDomain.getBoardIdx()); + answerService.save(answerDto, uncomfortableEntity.getBoardIdx()); // When String ONCE_MORE_ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; AnswerDto onceMoreAnswerDto = new AnswerDto(ONCE_MORE_ANSWER_CONTENT, null); AnswerAlreadyExistsException throwAtSaveMethod = assertThrows(AnswerAlreadyExistsException.class, - () -> answerService.save(onceMoreAnswerDto, tableDomain.getBoardIdx()) + () -> answerService.save(onceMoreAnswerDto, uncomfortableEntity.getBoardIdx()) ); // then @@ -134,12 +134,12 @@ TableDomain createTable(){ //로그인 adminLogin(USER_ID, USER_PASSWORD); - TableDomain tableDomain = createTable(); + UncomfortableEntity uncomfortableEntity = createTable(); // 답변 등록 String ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; AnswerDto answerDto = new AnswerDto(ANSWER_CONTENT, null); - AnswerDomain savedAnswer = answerService.save(answerDto, tableDomain.getBoardIdx()); + AnswerDomain savedAnswer = answerService.save(answerDto, uncomfortableEntity.getBoardIdx()); System.out.println("savedAnswer.getAnswerContent() = " + savedAnswer.getAnswerContent()); // When @@ -155,7 +155,7 @@ TableDomain createTable(){ @Test @DisplayName("답변 보기 (view) 검증") void view_검증() throws Exception { // Given - TableDomain tableDomain = createTable(); + UncomfortableEntity uncomfortableEntity = createTable(); // 답변 등록 adminSignUp(USER_ID, USER_PASSWORD, USER_NAME); // 답변 등록을 위한 회원가입 @@ -163,15 +163,15 @@ TableDomain createTable(){ String ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; AnswerDto answerDto = new AnswerDto(ANSWER_CONTENT, null); - AnswerDomain savedAnswer = answerService.save(answerDto, tableDomain.getBoardIdx()); + AnswerDomain savedAnswer = answerService.save(answerDto, uncomfortableEntity.getBoardIdx()); System.out.println("savedAnswer.getAnswerContent() = " + savedAnswer.getAnswerContent()); // When - AnswerResDto answerResDto = answerService.view(tableDomain.getBoardIdx()); + AnswerResDto answerResDto = answerService.view(uncomfortableEntity.getBoardIdx()); //than assertEquals(answerResDto.getAnswerIdx(), savedAnswer.getAnswerIdx()); - assertEquals(answerResDto.getTitle(), savedAnswer.getTableDomain().getContent()); + assertEquals(answerResDto.getTitle(), savedAnswer.getUncomfortableEntity().getContent()); assertEquals(answerResDto.getWriter(), savedAnswer.getAdminDomain().getAdminName()); assertEquals(answerResDto.getContent(), savedAnswer.getAnswerContent()); } @@ -188,12 +188,12 @@ TableDomain createTable(){ //로그인 adminLogin(USER_ID, USER_PASSWORD); - TableDomain tableDomain = createTable(); + UncomfortableEntity uncomfortableEntity = createTable(); // 답변 등록 String ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; AnswerDto answerDto = new AnswerDto(ANSWER_CONTENT, null); - AnswerDomain savedAnswer = answerService.save(answerDto, tableDomain.getBoardIdx()); + AnswerDomain savedAnswer = answerService.save(answerDto, uncomfortableEntity.getBoardIdx()); // When answerService.delete(savedAnswer.getAnswerIdx()); @@ -227,12 +227,12 @@ TableDomain createTable(){ adminSignUp("adminB", "adminB_PW", "adminB"); - TableDomain tableDomain = createTable(); + UncomfortableEntity uncomfortableEntity = createTable(); // 답변 등록 String ANSWER_CONTENT = "급식이 맛이 없는 이유는 삼식이라 어쩔수 없어요~"; AnswerDto answerDto = new AnswerDto(ANSWER_CONTENT, null); - AnswerDomain savedAnswer = answerService.save(answerDto, tableDomain.getBoardIdx()); + AnswerDomain savedAnswer = answerService.save(answerDto, uncomfortableEntity.getBoardIdx()); // When adminLogin(ADMIN_B_ID, ADMIN_B_PW); diff --git a/src/test/java/com/moment/the/service/TableServiceTest.java b/src/test/java/com/moment/the/service/TableServiceTest.java index 73206ad8..5dfabb5c 100644 --- a/src/test/java/com/moment/the/service/TableServiceTest.java +++ b/src/test/java/com/moment/the/service/TableServiceTest.java @@ -46,8 +46,8 @@ public void cleanUp(){ .build(); // when - TableDomain writeTable = tableService.write(tableDto); - TableDomain savedTable = tableRepo.findByBoardIdx(writeTable.getBoardIdx()).orElseThrow(() -> new IllegalArgumentException("Table을 찾을 수 없습니다. (테스트실패)")); + UncomfortableEntity writeTable = tableService.write(tableDto); + UncomfortableEntity savedTable = tableRepo.findByBoardIdx(writeTable.getBoardIdx()).orElseThrow(() -> new IllegalArgumentException("Table을 찾을 수 없습니다. (테스트실패)")); tableRepo.delete(savedTable); // then @@ -59,15 +59,15 @@ public void cleanUp(){ void TableService_top30View_검증(){ // Given AtomicInteger i = new AtomicInteger(1); - List TableDomains = Stream.generate( - () -> TableDomain.builder() + List uncomfortableEntities = Stream.generate( + () -> UncomfortableEntity.builder() .goods(i.getAndIncrement()) .content("TableService top30 보여주기 테스트") .build() ).limit(40).collect(Collectors.toList()); // When - tableRepo.saveAll(TableDomains); + tableRepo.saveAll(uncomfortableEntities); List viewTop30 = tableService.top30View(); // Then @@ -85,14 +85,14 @@ public void cleanUp(){ @DisplayName("TableService viewAll 검증") void TableService_viewAll_검증(){ // Given - List tableDomains = Stream.generate( - () -> TableDomain.builder() + List uncomfortableEntities = Stream.generate( + () -> UncomfortableEntity.builder() .content("TableService viewAll 검증") .build() ).limit(10).collect(Collectors.toList()); // When - tableRepo.saveAll(tableDomains); + tableRepo.saveAll(uncomfortableEntities); List tableViewAll = tableService.viewAll(); // Then @@ -105,14 +105,14 @@ public void cleanUp(){ @DisplayName("TableService 전체 개시글 수 보여주기 (amountUncomfortableView)검증") void TableService_amountUncomfortableView_검증(){ // Given - List tableDomains = Stream.generate( - () -> TableDomain.builder() + List uncomfortableEntities = Stream.generate( + () -> UncomfortableEntity.builder() .content("TableService amountUncomfortableView 검증") .build() ).limit(10).collect(Collectors.toList()); // When - tableRepo.saveAll(tableDomains); + tableRepo.saveAll(uncomfortableEntities); Long amountUncomfortable = tableService.amountUncomfortableView(); // then @@ -137,52 +137,52 @@ public void cleanUp(){ @DisplayName("TableService 좋아요 수 증가 로직 (goods) 검증") void TableService_goods_검증(){ // Given - TableDomain tableDomain = TableDomain.builder() + UncomfortableEntity uncomfortableEntity = UncomfortableEntity.builder() .content("TableService_goods_검증") .build(); // When - TableDomain savedTableDomain = tableRepo.save(tableDomain); - tableService.goods(savedTableDomain.getBoardIdx()); - TableDomain savedGoodsTableDomain = tableRepo.findByBoardIdx(savedTableDomain.getBoardIdx()).orElseThrow(() -> new IllegalArgumentException("좋아요를 받은 TableEntity를 찾을 수 없습니다.")); + UncomfortableEntity savedUncomfortableEntity = tableRepo.save(uncomfortableEntity); + tableService.goods(savedUncomfortableEntity.getBoardIdx()); + UncomfortableEntity savedGoodsUncomfortableEntity = tableRepo.findByBoardIdx(savedUncomfortableEntity.getBoardIdx()).orElseThrow(() -> new IllegalArgumentException("좋아요를 받은 TableEntity를 찾을 수 없습니다.")); // Then - assertEquals(savedGoodsTableDomain.getGoods(), 1); + assertEquals(savedGoodsUncomfortableEntity.getGoods(), 1); } @Test @DisplayName("TableService 좋아요 수 감소 로직 (cancelGood) 검증") void TableService_cancelGood_검증(){ // Given - TableDomain tableDomain = TableDomain.builder() + UncomfortableEntity uncomfortableEntity = UncomfortableEntity.builder() .content("TableService_goods_검증") .goods(1) // 좋아요 한개 지급 .build(); // When - TableDomain savedTableDomain = tableRepo.save(tableDomain); - tableService.cancelGood(savedTableDomain.getBoardIdx()); - TableDomain savedCancelGoodTableDomain = tableRepo.findByBoardIdx(savedTableDomain.getBoardIdx()).orElseThrow(() -> new IllegalArgumentException("좋아요를 취소한 TableEntity를 찾을 수 없습니다.")); + UncomfortableEntity savedUncomfortableEntity = tableRepo.save(uncomfortableEntity); + tableService.cancelGood(savedUncomfortableEntity.getBoardIdx()); + UncomfortableEntity savedCancelGoodUncomfortableEntity = tableRepo.findByBoardIdx(savedUncomfortableEntity.getBoardIdx()).orElseThrow(() -> new IllegalArgumentException("좋아요를 취소한 TableEntity를 찾을 수 없습니다.")); // Given - assertEquals(savedCancelGoodTableDomain.getGoods(), 0); + assertEquals(savedCancelGoodUncomfortableEntity.getGoods(), 0); } @Test @DisplayName("TableService 좋아요 수 감소 로직 (cancelGood) 음수가 될경우 exception 검증") void TableService_cancelGood_exception_검증() throws Exception { // Given - TableDomain tableDomain = TableDomain.builder() + UncomfortableEntity uncomfortableEntity = UncomfortableEntity.builder() .content("TableService_goods_검증") .goods(0) // 좋아요 0개 .build(); // When - TableDomain savedTableDomain = tableRepo.save(tableDomain); - System.out.println(savedTableDomain.getBoardIdx()); + UncomfortableEntity savedUncomfortableEntity = tableRepo.save(uncomfortableEntity); + System.out.println(savedUncomfortableEntity.getBoardIdx()); assertThrows(GoodsNotCancelException.class, () ->{ - tableService.cancelGood(savedTableDomain.getBoardIdx()); + tableService.cancelGood(savedUncomfortableEntity.getBoardIdx()); }); } From b5334a91223e2aa61b7851a90b71ef5f0c3c0c74 Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Mon, 6 Sep 2021 11:09:54 +0900 Subject: [PATCH 24/41] Rename TableRepository to UncomfortableRepository --- .../the/answer/service/AnswerService.java | 4 ++-- ...itory.java => UncomfortableRepository.java} | 2 +- .../uncomfortable/service/TableService.java | 18 +++++++++--------- .../release/TableControllerTest.java | 5 +++-- .../moment/the/service/TableServiceTest.java | 4 ++-- 5 files changed, 17 insertions(+), 16 deletions(-) rename src/main/java/com/moment/the/uncomfortable/repository/{TableRepository.java => UncomfortableRepository.java} (93%) diff --git a/src/main/java/com/moment/the/answer/service/AnswerService.java b/src/main/java/com/moment/the/answer/service/AnswerService.java index 4283db3d..44305ee8 100644 --- a/src/main/java/com/moment/the/answer/service/AnswerService.java +++ b/src/main/java/com/moment/the/answer/service/AnswerService.java @@ -9,7 +9,7 @@ import com.moment.the.answer.repository.AnswerRepository; import com.moment.the.exceptionAdvice.exception.*; import com.moment.the.uncomfortable.UncomfortableEntity; -import com.moment.the.uncomfortable.repository.TableRepository; +import com.moment.the.uncomfortable.repository.UncomfortableRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -19,7 +19,7 @@ public class AnswerService { final private AdminRepository adminRepo; final private AnswerRepository answerRepo; - final private TableRepository tableRepo; + final private UncomfortableRepository tableRepo; // 답변 작성하기 public AnswerDomain save(AnswerDto answerDto, Long boardIdx) { diff --git a/src/main/java/com/moment/the/uncomfortable/repository/TableRepository.java b/src/main/java/com/moment/the/uncomfortable/repository/UncomfortableRepository.java similarity index 93% rename from src/main/java/com/moment/the/uncomfortable/repository/TableRepository.java rename to src/main/java/com/moment/the/uncomfortable/repository/UncomfortableRepository.java index 3d342878..2e189253 100644 --- a/src/main/java/com/moment/the/uncomfortable/repository/TableRepository.java +++ b/src/main/java/com/moment/the/uncomfortable/repository/UncomfortableRepository.java @@ -11,7 +11,7 @@ import java.util.Optional; @Repository -public interface TableRepository extends JpaRepository{ +public interface UncomfortableRepository extends JpaRepository{ // idx로 table 찾기. Optional findByBoardIdx(Long boardIdx); diff --git a/src/main/java/com/moment/the/uncomfortable/service/TableService.java b/src/main/java/com/moment/the/uncomfortable/service/TableService.java index 926599b9..3d7a8e87 100644 --- a/src/main/java/com/moment/the/uncomfortable/service/TableService.java +++ b/src/main/java/com/moment/the/uncomfortable/service/TableService.java @@ -5,7 +5,7 @@ import com.moment.the.uncomfortable.UncomfortableEntity; import com.moment.the.uncomfortable.dto.TableDto; import com.moment.the.uncomfortable.dto.TableViewDto; -import com.moment.the.uncomfortable.repository.TableRepository; +import com.moment.the.uncomfortable.repository.UncomfortableRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; @@ -20,27 +20,27 @@ @RequiredArgsConstructor @Service public class TableService { - private final TableRepository tableRepository; + private final UncomfortableRepository uncomfortableRepository; // 작성하기. @Transactional public UncomfortableEntity write(TableDto tableDto){ - return tableRepository.save(tableDto.toEntity()); + return uncomfortableRepository.save(tableDto.toEntity()); } // Top 30 보여주기. public List top30View() { - return tableRepository.tableViewTopBy(PageRequest.of(0,30)); + return uncomfortableRepository.tableViewTopBy(PageRequest.of(0,30)); } // 전체 페이지 보여주기. public List viewAll(){ - return tableRepository.tableViewAll(); + return uncomfortableRepository.tableViewAll(); } // 전체 게시물 개수 보여주기. public Long amountUncomfortableView(){ - return tableRepository.amountUncomfortable(); + return uncomfortableRepository.amountUncomfortable(); } // 프로젝트 시작 이후 날짜 보여주기. @@ -51,14 +51,14 @@ public int dateSinceProjectStart(){ // 좋아요 수 증가. @Transactional public void goods(Long boardIdx){ - UncomfortableEntity uncomfortableEntity = tableRepository.findByBoardIdx(boardIdx).orElseThrow(NoPostException::new); + UncomfortableEntity uncomfortableEntity = uncomfortableRepository.findByBoardIdx(boardIdx).orElseThrow(NoPostException::new); uncomfortableEntity.updateGoods(uncomfortableEntity.getGoods()+1); } // 좋아요 수 감소. @Transactional public void cancelGood(Long boardIdx) { - UncomfortableEntity uncomfortableEntity = tableRepository.findByBoardIdx(boardIdx).orElseThrow(NoPostException::new); + UncomfortableEntity uncomfortableEntity = uncomfortableRepository.findByBoardIdx(boardIdx).orElseThrow(NoPostException::new); int goodsResult = uncomfortableEntity.getGoods() - 1; if(goodsResult > -1) {//좋야요가 양수일때 @@ -70,7 +70,7 @@ public void cancelGood(Long boardIdx) { @Transactional public void delete(long boardIdx){ - tableRepository.deleteById(boardIdx); + uncomfortableRepository.deleteById(boardIdx); } // day 수 계산하기 diff --git a/src/test/java/com/moment/the/controller/release/TableControllerTest.java b/src/test/java/com/moment/the/controller/release/TableControllerTest.java index 8db5a556..3fbef223 100644 --- a/src/test/java/com/moment/the/controller/release/TableControllerTest.java +++ b/src/test/java/com/moment/the/controller/release/TableControllerTest.java @@ -7,7 +7,7 @@ import com.moment.the.response.ResponseService; import com.moment.the.uncomfortable.dto.TableDto; import com.moment.the.uncomfortable.dto.TableViewDto; -import com.moment.the.uncomfortable.repository.TableRepository; +import com.moment.the.uncomfortable.repository.UncomfortableRepository; import com.moment.the.uncomfortable.service.TableService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomStringUtils; @@ -45,7 +45,8 @@ class TableControllerTest { @Autowired TableController tableController; @Autowired ResponseService resService; - @Autowired TableRepository tableRepo; + @Autowired + UncomfortableRepository tableRepo; @Autowired TableService tableService; @BeforeEach diff --git a/src/test/java/com/moment/the/service/TableServiceTest.java b/src/test/java/com/moment/the/service/TableServiceTest.java index 5dfabb5c..855b3a03 100644 --- a/src/test/java/com/moment/the/service/TableServiceTest.java +++ b/src/test/java/com/moment/the/service/TableServiceTest.java @@ -4,7 +4,7 @@ import com.moment.the.uncomfortable.*; import com.moment.the.uncomfortable.dto.TableDto; import com.moment.the.uncomfortable.dto.TableViewDto; -import com.moment.the.uncomfortable.repository.TableRepository; +import com.moment.the.uncomfortable.repository.UncomfortableRepository; import com.moment.the.uncomfortable.service.TableService; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Disabled; @@ -26,7 +26,7 @@ class TableServiceTest { @Autowired - TableRepository tableRepo; + UncomfortableRepository tableRepo; @Autowired TableService tableService; From b3cebb55ea96658070f0e3b0ea5255f483883599 Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Mon, 6 Sep 2021 11:10:53 +0900 Subject: [PATCH 25/41] Rename TableViewDto to UncomfortableGetDto --- .../the/uncomfortable/controller/TableController.java | 6 +++--- .../{TableViewDto.java => UncomfortableGetDto.java} | 4 ++-- .../repository/UncomfortableRepository.java | 10 +++++----- .../moment/the/uncomfortable/service/TableService.java | 6 +++--- .../the/controller/release/TableControllerTest.java | 6 +++--- .../java/com/moment/the/service/TableServiceTest.java | 8 ++++---- 6 files changed, 20 insertions(+), 20 deletions(-) rename src/main/java/com/moment/the/uncomfortable/dto/{TableViewDto.java => UncomfortableGetDto.java} (76%) diff --git a/src/main/java/com/moment/the/uncomfortable/controller/TableController.java b/src/main/java/com/moment/the/uncomfortable/controller/TableController.java index fcaad888..043e7e0c 100644 --- a/src/main/java/com/moment/the/uncomfortable/controller/TableController.java +++ b/src/main/java/com/moment/the/uncomfortable/controller/TableController.java @@ -5,7 +5,7 @@ import com.moment.the.response.result.ListResult; import com.moment.the.response.result.SingleResult; import com.moment.the.uncomfortable.dto.TableDto; -import com.moment.the.uncomfortable.dto.TableViewDto; +import com.moment.the.uncomfortable.dto.UncomfortableGetDto; import com.moment.the.uncomfortable.service.TableService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -29,13 +29,13 @@ public CommonResult write(@Valid @RequestBody TableDto tableDto){ // localhost:8080/v1/uncomfortable/top30 @GetMapping("/uncomfortable/top30") - public ListResult top10(){ + public ListResult top10(){ return responseService.getListResult(tableService.top30View()); } // localhost:8080/v1/uncomfortable @GetMapping("/uncomfortable") - public ListResult viewAll(){ + public ListResult viewAll(){ return responseService.getListResult(tableService.viewAll()); } diff --git a/src/main/java/com/moment/the/uncomfortable/dto/TableViewDto.java b/src/main/java/com/moment/the/uncomfortable/dto/UncomfortableGetDto.java similarity index 76% rename from src/main/java/com/moment/the/uncomfortable/dto/TableViewDto.java rename to src/main/java/com/moment/the/uncomfortable/dto/UncomfortableGetDto.java index 0c5c1ce2..012953dc 100644 --- a/src/main/java/com/moment/the/uncomfortable/dto/TableViewDto.java +++ b/src/main/java/com/moment/the/uncomfortable/dto/UncomfortableGetDto.java @@ -6,14 +6,14 @@ @Builder @Getter @Setter @NoArgsConstructor @AllArgsConstructor -public class TableViewDto { +public class UncomfortableGetDto { private Long boardIdx; private String content; private int goods; private boolean isAnswer; - public TableViewDto(Long boardIdx, String content, int goods, AnswerDomain answer){ + public UncomfortableGetDto(Long boardIdx, String content, int goods, AnswerDomain answer){ this.boardIdx = boardIdx; this.content = content; this.goods = goods; diff --git a/src/main/java/com/moment/the/uncomfortable/repository/UncomfortableRepository.java b/src/main/java/com/moment/the/uncomfortable/repository/UncomfortableRepository.java index 2e189253..ef04661c 100644 --- a/src/main/java/com/moment/the/uncomfortable/repository/UncomfortableRepository.java +++ b/src/main/java/com/moment/the/uncomfortable/repository/UncomfortableRepository.java @@ -1,7 +1,7 @@ package com.moment.the.uncomfortable.repository; import com.moment.the.uncomfortable.UncomfortableEntity; -import com.moment.the.uncomfortable.dto.TableViewDto; +import com.moment.the.uncomfortable.dto.UncomfortableGetDto; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -19,15 +19,15 @@ public interface UncomfortableRepository extends JpaRepository tableViewAll(); + List tableViewAll(); - @Query("SELECT new com.moment.the.uncomfortable.dto.TableViewDto(table.boardIdx, table.content, table.goods, answer)" + + @Query("SELECT new com.moment.the.uncomfortable.dto.UncomfortableGetDto(table.boardIdx, table.content, table.goods, answer)" + "FROM UncomfortableEntity table LEFT JOIN table.answerDomain answer " + "ORDER BY table.goods DESC " ) - List tableViewTopBy(Pageable p); + List tableViewTopBy(Pageable p); } diff --git a/src/main/java/com/moment/the/uncomfortable/service/TableService.java b/src/main/java/com/moment/the/uncomfortable/service/TableService.java index 3d7a8e87..0c48597f 100644 --- a/src/main/java/com/moment/the/uncomfortable/service/TableService.java +++ b/src/main/java/com/moment/the/uncomfortable/service/TableService.java @@ -4,7 +4,7 @@ import com.moment.the.exceptionAdvice.exception.NoPostException; import com.moment.the.uncomfortable.UncomfortableEntity; import com.moment.the.uncomfortable.dto.TableDto; -import com.moment.the.uncomfortable.dto.TableViewDto; +import com.moment.the.uncomfortable.dto.UncomfortableGetDto; import com.moment.the.uncomfortable.repository.UncomfortableRepository; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -29,12 +29,12 @@ public UncomfortableEntity write(TableDto tableDto){ } // Top 30 보여주기. - public List top30View() { + public List top30View() { return uncomfortableRepository.tableViewTopBy(PageRequest.of(0,30)); } // 전체 페이지 보여주기. - public List viewAll(){ + public List viewAll(){ return uncomfortableRepository.tableViewAll(); } diff --git a/src/test/java/com/moment/the/controller/release/TableControllerTest.java b/src/test/java/com/moment/the/controller/release/TableControllerTest.java index 3fbef223..e81147c2 100644 --- a/src/test/java/com/moment/the/controller/release/TableControllerTest.java +++ b/src/test/java/com/moment/the/controller/release/TableControllerTest.java @@ -6,7 +6,7 @@ import com.moment.the.uncomfortable.UncomfortableEntity; import com.moment.the.response.ResponseService; import com.moment.the.uncomfortable.dto.TableDto; -import com.moment.the.uncomfortable.dto.TableViewDto; +import com.moment.the.uncomfortable.dto.UncomfortableGetDto; import com.moment.the.uncomfortable.repository.UncomfortableRepository; import com.moment.the.uncomfortable.service.TableService; import lombok.extern.slf4j.Slf4j; @@ -133,8 +133,8 @@ String objectToJson(Object object) throws JsonProcessingException { ).limit(40).collect(Collectors.toList()); tableRepo.saveAll(uncomfortableEntities); - List tableViewDtos = tableService.top30View(); - String top30Data = objectToJson(tableViewDtos); + List uncomfortableGetDtos = tableService.top30View(); + String top30Data = objectToJson(uncomfortableGetDtos); //When resultActions = mockMvc.perform( diff --git a/src/test/java/com/moment/the/service/TableServiceTest.java b/src/test/java/com/moment/the/service/TableServiceTest.java index 855b3a03..32737b48 100644 --- a/src/test/java/com/moment/the/service/TableServiceTest.java +++ b/src/test/java/com/moment/the/service/TableServiceTest.java @@ -3,7 +3,7 @@ import com.moment.the.exceptionAdvice.exception.GoodsNotCancelException; import com.moment.the.uncomfortable.*; import com.moment.the.uncomfortable.dto.TableDto; -import com.moment.the.uncomfortable.dto.TableViewDto; +import com.moment.the.uncomfortable.dto.UncomfortableGetDto; import com.moment.the.uncomfortable.repository.UncomfortableRepository; import com.moment.the.uncomfortable.service.TableService; import org.junit.jupiter.api.AfterEach; @@ -68,14 +68,14 @@ public void cleanUp(){ // When tableRepo.saveAll(uncomfortableEntities); - List viewTop30 = tableService.top30View(); + List viewTop30 = tableService.top30View(); // Then assertEquals(viewTop30.size(), 30); AtomicInteger j = new AtomicInteger(40); // TableService 의 top30View 로직이 올바르게 적용되면 j.get을 했을떄 값이 10이 나와야 한다. // 저장된Table - top30 = 40 - 30 = 10 - for(TableViewDto v : viewTop30 ) { + for(UncomfortableGetDto v : viewTop30 ) { assertEquals(v.getGoods(), j.getAndDecrement()); } assertEquals(j.get(), 10); @@ -93,7 +93,7 @@ public void cleanUp(){ // When tableRepo.saveAll(uncomfortableEntities); - List tableViewAll = tableService.viewAll(); + List tableViewAll = tableService.viewAll(); // Then assertEquals(tableViewAll.size(), 10); // 10개를 저장했으므로 tableViewAll 의 개수는 10개여야 한다. From fb93a728659fff0a256d8d694436ef41cea66649 Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Mon, 6 Sep 2021 11:11:43 +0900 Subject: [PATCH 26/41] Rename TableDto to UncomfortableSetDto --- .../the/uncomfortable/controller/TableController.java | 6 +++--- .../dto/{TableDto.java => UncomfortableSetDto.java} | 2 +- .../moment/the/uncomfortable/service/TableService.java | 6 +++--- .../the/controller/release/TableControllerTest.java | 6 +++--- .../java/com/moment/the/service/AnswerServiceTest.java | 6 +++--- .../java/com/moment/the/service/TableServiceTest.java | 8 ++++---- 6 files changed, 17 insertions(+), 17 deletions(-) rename src/main/java/com/moment/the/uncomfortable/dto/{TableDto.java => UncomfortableSetDto.java} (93%) diff --git a/src/main/java/com/moment/the/uncomfortable/controller/TableController.java b/src/main/java/com/moment/the/uncomfortable/controller/TableController.java index 043e7e0c..05c0113d 100644 --- a/src/main/java/com/moment/the/uncomfortable/controller/TableController.java +++ b/src/main/java/com/moment/the/uncomfortable/controller/TableController.java @@ -4,7 +4,7 @@ import com.moment.the.response.result.CommonResult; import com.moment.the.response.result.ListResult; import com.moment.the.response.result.SingleResult; -import com.moment.the.uncomfortable.dto.TableDto; +import com.moment.the.uncomfortable.dto.UncomfortableSetDto; import com.moment.the.uncomfortable.dto.UncomfortableGetDto; import com.moment.the.uncomfortable.service.TableService; import lombok.RequiredArgsConstructor; @@ -22,8 +22,8 @@ public class TableController { // localhost:8080/v1/uncomfortable @PostMapping("/uncomfortable") - public CommonResult write(@Valid @RequestBody TableDto tableDto){ - tableService.write(tableDto); + public CommonResult write(@Valid @RequestBody UncomfortableSetDto uncomfortableSetDto){ + tableService.write(uncomfortableSetDto); return responseService.getSuccessResult(); } diff --git a/src/main/java/com/moment/the/uncomfortable/dto/TableDto.java b/src/main/java/com/moment/the/uncomfortable/dto/UncomfortableSetDto.java similarity index 93% rename from src/main/java/com/moment/the/uncomfortable/dto/TableDto.java rename to src/main/java/com/moment/the/uncomfortable/dto/UncomfortableSetDto.java index 7231c6d5..230aafe4 100644 --- a/src/main/java/com/moment/the/uncomfortable/dto/TableDto.java +++ b/src/main/java/com/moment/the/uncomfortable/dto/UncomfortableSetDto.java @@ -12,7 +12,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class TableDto { +public class UncomfortableSetDto { @NotBlank private String content; diff --git a/src/main/java/com/moment/the/uncomfortable/service/TableService.java b/src/main/java/com/moment/the/uncomfortable/service/TableService.java index 0c48597f..7dba7f96 100644 --- a/src/main/java/com/moment/the/uncomfortable/service/TableService.java +++ b/src/main/java/com/moment/the/uncomfortable/service/TableService.java @@ -3,7 +3,7 @@ import com.moment.the.exceptionAdvice.exception.GoodsNotCancelException; import com.moment.the.exceptionAdvice.exception.NoPostException; import com.moment.the.uncomfortable.UncomfortableEntity; -import com.moment.the.uncomfortable.dto.TableDto; +import com.moment.the.uncomfortable.dto.UncomfortableSetDto; import com.moment.the.uncomfortable.dto.UncomfortableGetDto; import com.moment.the.uncomfortable.repository.UncomfortableRepository; import lombok.RequiredArgsConstructor; @@ -24,8 +24,8 @@ public class TableService { // 작성하기. @Transactional - public UncomfortableEntity write(TableDto tableDto){ - return uncomfortableRepository.save(tableDto.toEntity()); + public UncomfortableEntity write(UncomfortableSetDto uncomfortableSetDto){ + return uncomfortableRepository.save(uncomfortableSetDto.toEntity()); } // Top 30 보여주기. diff --git a/src/test/java/com/moment/the/controller/release/TableControllerTest.java b/src/test/java/com/moment/the/controller/release/TableControllerTest.java index e81147c2..a0810c04 100644 --- a/src/test/java/com/moment/the/controller/release/TableControllerTest.java +++ b/src/test/java/com/moment/the/controller/release/TableControllerTest.java @@ -5,7 +5,7 @@ import com.moment.the.uncomfortable.controller.TableController; import com.moment.the.uncomfortable.UncomfortableEntity; import com.moment.the.response.ResponseService; -import com.moment.the.uncomfortable.dto.TableDto; +import com.moment.the.uncomfortable.dto.UncomfortableSetDto; import com.moment.the.uncomfortable.dto.UncomfortableGetDto; import com.moment.the.uncomfortable.repository.UncomfortableRepository; import com.moment.the.uncomfortable.service.TableService; @@ -70,8 +70,8 @@ String objectToJson(Object object) throws JsonProcessingException { @Test @DisplayName("[POST]/v1/uncomfortable write 검증") void write_검증() throws Exception { // Given - TableDto tableDto = new TableDto("학교가 밥이 너무 맛이 없어요"); - String tableDtoConvertJson = objectToJson(tableDto); + UncomfortableSetDto uncomfortableSetDto = new UncomfortableSetDto("학교가 밥이 너무 맛이 없어요"); + String tableDtoConvertJson = objectToJson(uncomfortableSetDto); // When resultActions = mockMvc.perform( diff --git a/src/test/java/com/moment/the/service/AnswerServiceTest.java b/src/test/java/com/moment/the/service/AnswerServiceTest.java index 49cd6e52..92524899 100644 --- a/src/test/java/com/moment/the/service/AnswerServiceTest.java +++ b/src/test/java/com/moment/the/service/AnswerServiceTest.java @@ -11,7 +11,7 @@ import com.moment.the.admin.AdminDomain; import com.moment.the.uncomfortable.UncomfortableEntity; import com.moment.the.admin.dto.AdminDto; -import com.moment.the.uncomfortable.dto.TableDto; +import com.moment.the.uncomfortable.dto.UncomfortableSetDto; import com.moment.the.admin.repository.AdminRepository; import com.moment.the.uncomfortable.service.TableService; import org.junit.jupiter.api.DisplayName; @@ -67,8 +67,8 @@ AdminDomain adminLogin(String adminId, String password) { //test 편의를 위한 Table 생성 메서드 UncomfortableEntity createTable(){ String TABLE_CONTENT = "급식이 맛이 없어요 급식에 질을 높여주세요!"; - TableDto tableDto = new TableDto(TABLE_CONTENT); - UncomfortableEntity uncomfortableEntity = tableService.write(tableDto); + UncomfortableSetDto uncomfortableSetDto = new UncomfortableSetDto(TABLE_CONTENT); + UncomfortableEntity uncomfortableEntity = tableService.write(uncomfortableSetDto); return uncomfortableEntity; } diff --git a/src/test/java/com/moment/the/service/TableServiceTest.java b/src/test/java/com/moment/the/service/TableServiceTest.java index 32737b48..8ff0556a 100644 --- a/src/test/java/com/moment/the/service/TableServiceTest.java +++ b/src/test/java/com/moment/the/service/TableServiceTest.java @@ -2,7 +2,7 @@ import com.moment.the.exceptionAdvice.exception.GoodsNotCancelException; import com.moment.the.uncomfortable.*; -import com.moment.the.uncomfortable.dto.TableDto; +import com.moment.the.uncomfortable.dto.UncomfortableSetDto; import com.moment.the.uncomfortable.dto.UncomfortableGetDto; import com.moment.the.uncomfortable.repository.UncomfortableRepository; import com.moment.the.uncomfortable.service.TableService; @@ -41,17 +41,17 @@ public void cleanUp(){ @DisplayName("TableService write 로직 검증") void TableService_write_로직검증(){ // given - TableDto tableDto = TableDto.builder() + UncomfortableSetDto uncomfortableSetDto = UncomfortableSetDto.builder() .content("TableService write 로직 검증") .build(); // when - UncomfortableEntity writeTable = tableService.write(tableDto); + UncomfortableEntity writeTable = tableService.write(uncomfortableSetDto); UncomfortableEntity savedTable = tableRepo.findByBoardIdx(writeTable.getBoardIdx()).orElseThrow(() -> new IllegalArgumentException("Table을 찾을 수 없습니다. (테스트실패)")); tableRepo.delete(savedTable); // then - assertEquals(tableDto.getContent(), savedTable.getContent()); + assertEquals(uncomfortableSetDto.getContent(), savedTable.getContent()); } @Test From 6719de10ef6df19a7384a416958e4eaa0f025444 Mon Sep 17 00:00:00 2001 From: siwony_ Date: Mon, 6 Sep 2021 11:12:05 +0900 Subject: [PATCH 27/41] =?UTF-8?q?Update=20gradle=20=EB=B9=8C=EB=93=9C=20?= =?UTF-8?q?=ED=88=B4=EC=97=90=20=EB=94=B0=EB=9D=BC=20readme=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 --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index b1d72819..8f096ff5 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,9 @@ $ sudo nohup ./docker-compose-env.sh & - Querydsl * plugin + - Spring Boot - 2.4.2 - Dependency Management - 1.0.11.RELEASE + - Querydsl - 1.0.10 - Jacoco * dev tools @@ -44,9 +46,9 @@ $ sudo nohup ./docker-compose-env.sh & - Swagger2 * Deployment - - AWS EC2 - - AWS Route 53 - - AWS RDS (Mysql) + - AWS EC2 + - AWS Route 53 + - AWS RDS (Mysql) ``` #### Our Server License From fabaa26b1d297d3bda01f05f8d50d879e4518631 Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Mon, 6 Sep 2021 11:12:32 +0900 Subject: [PATCH 28/41] Rename TableService to UncomfortableService --- .../controller/TableController.java | 20 ++++++++--------- ...Service.java => UncomfortableService.java} | 2 +- .../release/TableControllerTest.java | 7 +++--- .../moment/the/service/AnswerServiceTest.java | 6 ++--- ...est.java => UncomfortableServiceTest.java} | 22 +++++++++---------- 5 files changed, 29 insertions(+), 28 deletions(-) rename src/main/java/com/moment/the/uncomfortable/service/{TableService.java => UncomfortableService.java} (98%) rename src/test/java/com/moment/the/service/{TableServiceTest.java => UncomfortableServiceTest.java} (89%) diff --git a/src/main/java/com/moment/the/uncomfortable/controller/TableController.java b/src/main/java/com/moment/the/uncomfortable/controller/TableController.java index 05c0113d..ac9524e1 100644 --- a/src/main/java/com/moment/the/uncomfortable/controller/TableController.java +++ b/src/main/java/com/moment/the/uncomfortable/controller/TableController.java @@ -6,7 +6,7 @@ import com.moment.the.response.result.SingleResult; import com.moment.the.uncomfortable.dto.UncomfortableSetDto; import com.moment.the.uncomfortable.dto.UncomfortableGetDto; -import com.moment.the.uncomfortable.service.TableService; +import com.moment.the.uncomfortable.service.UncomfortableService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -17,58 +17,58 @@ @RequestMapping("/v1") public class TableController { //Dependency Injection - private final TableService tableService; + private final UncomfortableService uncomfortableService; private final ResponseService responseService; // localhost:8080/v1/uncomfortable @PostMapping("/uncomfortable") public CommonResult write(@Valid @RequestBody UncomfortableSetDto uncomfortableSetDto){ - tableService.write(uncomfortableSetDto); + uncomfortableService.write(uncomfortableSetDto); return responseService.getSuccessResult(); } // localhost:8080/v1/uncomfortable/top30 @GetMapping("/uncomfortable/top30") public ListResult top10(){ - return responseService.getListResult(tableService.top30View()); + return responseService.getListResult(uncomfortableService.top30View()); } // localhost:8080/v1/uncomfortable @GetMapping("/uncomfortable") public ListResult viewAll(){ - return responseService.getListResult(tableService.viewAll()); + return responseService.getListResult(uncomfortableService.viewAll()); } // localhost:8080/v1/uncomfortable/{boardIdx} @PutMapping("/uncomfortable/{boardIdx}") public CommonResult goods(@PathVariable Long boardIdx){ - tableService.goods(boardIdx); + uncomfortableService.goods(boardIdx); return responseService.getSuccessResult(); } // localhost:8080/v1/uncomfortable/cancel/{boardIdx} @PutMapping("/uncomfortable/cancel/{boardIdx}") public CommonResult cancelGood(@PathVariable Long boardIdx){ - tableService.cancelGood(boardIdx); + uncomfortableService.cancelGood(boardIdx); return responseService.getSuccessResult(); } // localhost:8080/v1/uncomfortable/amount @GetMapping("/uncomfortable/amount") public SingleResult amountUncomfortable(){ - return responseService.getSingleResult(tableService.amountUncomfortableView()); + return responseService.getSingleResult(uncomfortableService.amountUncomfortableView()); } // localhost:8080/v1/uncomfortable/dateSinceProjectStart @GetMapping("/uncomfortable/dateSinceProjectStart") public SingleResult getDateSinceProjectStart(){ - return responseService.getSingleResult(tableService.dateSinceProjectStart()); + return responseService.getSingleResult(uncomfortableService.dateSinceProjectStart()); } // localhost:8080/v1/uncomfortable/{boardIdx} @DeleteMapping("/uncomfortable/{boardIdx}") public CommonResult deleteThisBoard(@PathVariable Long boardIdx){ - tableService.delete(boardIdx); + uncomfortableService.delete(boardIdx); return responseService.getSuccessResult(); } } diff --git a/src/main/java/com/moment/the/uncomfortable/service/TableService.java b/src/main/java/com/moment/the/uncomfortable/service/UncomfortableService.java similarity index 98% rename from src/main/java/com/moment/the/uncomfortable/service/TableService.java rename to src/main/java/com/moment/the/uncomfortable/service/UncomfortableService.java index 7dba7f96..9466bfd9 100644 --- a/src/main/java/com/moment/the/uncomfortable/service/TableService.java +++ b/src/main/java/com/moment/the/uncomfortable/service/UncomfortableService.java @@ -19,7 +19,7 @@ @Slf4j @RequiredArgsConstructor @Service -public class TableService { +public class UncomfortableService { private final UncomfortableRepository uncomfortableRepository; // 작성하기. diff --git a/src/test/java/com/moment/the/controller/release/TableControllerTest.java b/src/test/java/com/moment/the/controller/release/TableControllerTest.java index a0810c04..fee077c6 100644 --- a/src/test/java/com/moment/the/controller/release/TableControllerTest.java +++ b/src/test/java/com/moment/the/controller/release/TableControllerTest.java @@ -8,7 +8,7 @@ import com.moment.the.uncomfortable.dto.UncomfortableSetDto; import com.moment.the.uncomfortable.dto.UncomfortableGetDto; import com.moment.the.uncomfortable.repository.UncomfortableRepository; -import com.moment.the.uncomfortable.service.TableService; +import com.moment.the.uncomfortable.service.UncomfortableService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomStringUtils; import org.junit.jupiter.api.*; @@ -47,7 +47,8 @@ class TableControllerTest { @Autowired ResponseService resService; @Autowired UncomfortableRepository tableRepo; - @Autowired TableService tableService; + @Autowired + UncomfortableService uncomfortableService; @BeforeEach void setUp() { @@ -133,7 +134,7 @@ String objectToJson(Object object) throws JsonProcessingException { ).limit(40).collect(Collectors.toList()); tableRepo.saveAll(uncomfortableEntities); - List uncomfortableGetDtos = tableService.top30View(); + List uncomfortableGetDtos = uncomfortableService.top30View(); String top30Data = objectToJson(uncomfortableGetDtos); //When diff --git a/src/test/java/com/moment/the/service/AnswerServiceTest.java b/src/test/java/com/moment/the/service/AnswerServiceTest.java index 92524899..556f053b 100644 --- a/src/test/java/com/moment/the/service/AnswerServiceTest.java +++ b/src/test/java/com/moment/the/service/AnswerServiceTest.java @@ -13,7 +13,7 @@ import com.moment.the.admin.dto.AdminDto; import com.moment.the.uncomfortable.dto.UncomfortableSetDto; import com.moment.the.admin.repository.AdminRepository; -import com.moment.the.uncomfortable.service.TableService; +import com.moment.the.uncomfortable.service.UncomfortableService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -38,7 +38,7 @@ class AnswerServiceTest { @Autowired AnswerRepository answerRepo; @Autowired - TableService tableService; + UncomfortableService uncomfortableService; @Autowired MyUserDetailsService userDetailsService; final String USER_ID = "adminID"; @@ -68,7 +68,7 @@ AdminDomain adminLogin(String adminId, String password) { UncomfortableEntity createTable(){ String TABLE_CONTENT = "급식이 맛이 없어요 급식에 질을 높여주세요!"; UncomfortableSetDto uncomfortableSetDto = new UncomfortableSetDto(TABLE_CONTENT); - UncomfortableEntity uncomfortableEntity = tableService.write(uncomfortableSetDto); + UncomfortableEntity uncomfortableEntity = uncomfortableService.write(uncomfortableSetDto); return uncomfortableEntity; } diff --git a/src/test/java/com/moment/the/service/TableServiceTest.java b/src/test/java/com/moment/the/service/UncomfortableServiceTest.java similarity index 89% rename from src/test/java/com/moment/the/service/TableServiceTest.java rename to src/test/java/com/moment/the/service/UncomfortableServiceTest.java index 8ff0556a..0c8e49cd 100644 --- a/src/test/java/com/moment/the/service/TableServiceTest.java +++ b/src/test/java/com/moment/the/service/UncomfortableServiceTest.java @@ -5,7 +5,7 @@ import com.moment.the.uncomfortable.dto.UncomfortableSetDto; import com.moment.the.uncomfortable.dto.UncomfortableGetDto; import com.moment.the.uncomfortable.repository.UncomfortableRepository; -import com.moment.the.uncomfortable.service.TableService; +import com.moment.the.uncomfortable.service.UncomfortableService; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayName; @@ -23,12 +23,12 @@ import static org.junit.jupiter.api.Assertions.*; @SpringBootTest -class TableServiceTest { +class UncomfortableServiceTest { @Autowired UncomfortableRepository tableRepo; @Autowired - TableService tableService; + UncomfortableService uncomfortableService; // 데이터 섞임 방지 한개의 테스트가 끝날떄마다 DB의 저장내용을 삭제한다. @@ -46,7 +46,7 @@ public void cleanUp(){ .build(); // when - UncomfortableEntity writeTable = tableService.write(uncomfortableSetDto); + UncomfortableEntity writeTable = uncomfortableService.write(uncomfortableSetDto); UncomfortableEntity savedTable = tableRepo.findByBoardIdx(writeTable.getBoardIdx()).orElseThrow(() -> new IllegalArgumentException("Table을 찾을 수 없습니다. (테스트실패)")); tableRepo.delete(savedTable); @@ -68,7 +68,7 @@ public void cleanUp(){ // When tableRepo.saveAll(uncomfortableEntities); - List viewTop30 = tableService.top30View(); + List viewTop30 = uncomfortableService.top30View(); // Then assertEquals(viewTop30.size(), 30); @@ -93,7 +93,7 @@ public void cleanUp(){ // When tableRepo.saveAll(uncomfortableEntities); - List tableViewAll = tableService.viewAll(); + List tableViewAll = uncomfortableService.viewAll(); // Then assertEquals(tableViewAll.size(), 10); // 10개를 저장했으므로 tableViewAll 의 개수는 10개여야 한다. @@ -113,7 +113,7 @@ public void cleanUp(){ // When tableRepo.saveAll(uncomfortableEntities); - Long amountUncomfortable = tableService.amountUncomfortableView(); + Long amountUncomfortable = uncomfortableService.amountUncomfortableView(); // then assertEquals(amountUncomfortable, 10); @@ -130,7 +130,7 @@ public void cleanUp(){ Period period = startTheMoment.until(currentDate); // Then - assertEquals(tableService.dateSinceProjectStart(), period.getDays()+1);; + assertEquals(uncomfortableService.dateSinceProjectStart(), period.getDays()+1);; } @Test @@ -143,7 +143,7 @@ public void cleanUp(){ // When UncomfortableEntity savedUncomfortableEntity = tableRepo.save(uncomfortableEntity); - tableService.goods(savedUncomfortableEntity.getBoardIdx()); + uncomfortableService.goods(savedUncomfortableEntity.getBoardIdx()); UncomfortableEntity savedGoodsUncomfortableEntity = tableRepo.findByBoardIdx(savedUncomfortableEntity.getBoardIdx()).orElseThrow(() -> new IllegalArgumentException("좋아요를 받은 TableEntity를 찾을 수 없습니다.")); // Then @@ -161,7 +161,7 @@ public void cleanUp(){ // When UncomfortableEntity savedUncomfortableEntity = tableRepo.save(uncomfortableEntity); - tableService.cancelGood(savedUncomfortableEntity.getBoardIdx()); + uncomfortableService.cancelGood(savedUncomfortableEntity.getBoardIdx()); UncomfortableEntity savedCancelGoodUncomfortableEntity = tableRepo.findByBoardIdx(savedUncomfortableEntity.getBoardIdx()).orElseThrow(() -> new IllegalArgumentException("좋아요를 취소한 TableEntity를 찾을 수 없습니다.")); // Given @@ -182,7 +182,7 @@ public void cleanUp(){ System.out.println(savedUncomfortableEntity.getBoardIdx()); assertThrows(GoodsNotCancelException.class, () ->{ - tableService.cancelGood(savedUncomfortableEntity.getBoardIdx()); + uncomfortableService.cancelGood(savedUncomfortableEntity.getBoardIdx()); }); } From 86e9eb11e8c60ee58bcb844b621cf081102bea5d Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Mon, 6 Sep 2021 11:13:20 +0900 Subject: [PATCH 29/41] Rename TableController to UncomfortableController --- ...{TableController.java => UncomfortableController.java} | 2 +- ...ntrollerTest.java => UncomfortableControllerTest.java} | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) rename src/main/java/com/moment/the/uncomfortable/controller/{TableController.java => UncomfortableController.java} (98%) rename src/test/java/com/moment/the/controller/release/{TableControllerTest.java => UncomfortableControllerTest.java} (97%) diff --git a/src/main/java/com/moment/the/uncomfortable/controller/TableController.java b/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java similarity index 98% rename from src/main/java/com/moment/the/uncomfortable/controller/TableController.java rename to src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java index ac9524e1..ee41a804 100644 --- a/src/main/java/com/moment/the/uncomfortable/controller/TableController.java +++ b/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java @@ -15,7 +15,7 @@ @RestController @RequiredArgsConstructor @RequestMapping("/v1") -public class TableController { +public class UncomfortableController { //Dependency Injection private final UncomfortableService uncomfortableService; private final ResponseService responseService; diff --git a/src/test/java/com/moment/the/controller/release/TableControllerTest.java b/src/test/java/com/moment/the/controller/release/UncomfortableControllerTest.java similarity index 97% rename from src/test/java/com/moment/the/controller/release/TableControllerTest.java rename to src/test/java/com/moment/the/controller/release/UncomfortableControllerTest.java index fee077c6..b4026918 100644 --- a/src/test/java/com/moment/the/controller/release/TableControllerTest.java +++ b/src/test/java/com/moment/the/controller/release/UncomfortableControllerTest.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; -import com.moment.the.uncomfortable.controller.TableController; +import com.moment.the.uncomfortable.controller.UncomfortableController; import com.moment.the.uncomfortable.UncomfortableEntity; import com.moment.the.response.ResponseService; import com.moment.the.uncomfortable.dto.UncomfortableSetDto; @@ -38,12 +38,12 @@ @DisplayName("TableController 테스트") @Transactional @Slf4j -class TableControllerTest { +class UncomfortableControllerTest { MockMvc mockMvc; ResultActions resultActions; @Autowired - TableController tableController; + UncomfortableController uncomfortableController; @Autowired ResponseService resService; @Autowired UncomfortableRepository tableRepo; @@ -52,7 +52,7 @@ class TableControllerTest { @BeforeEach void setUp() { - mockMvc = MockMvcBuilders.standaloneSetup(tableController) + mockMvc = MockMvcBuilders.standaloneSetup(uncomfortableController) .addFilters(new CharacterEncodingFilter("UTF-8", true)) // utf-8 필터 추가 .build(); } From 06e58c577fc2ec0ba6bb35a7b4434229d19fdc01 Mon Sep 17 00:00:00 2001 From: siwony_ Date: Mon, 6 Sep 2021 11:42:14 +0900 Subject: [PATCH 30/41] =?UTF-8?q?Fix=20TagleDomain=EB=A5=BC=20Uncomfortabl?= =?UTF-8?q?eEntity=EB=A1=9C=20=EB=B3=80=EA=B2=BD=ED=95=98=EB=A9=B4?= =?UTF-8?q?=EC=84=9C=20=EC=83=9D=EA=B8=B4=20=EB=AC=B8=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/moment/the/answer/repository/AnswerRepository.java | 2 +- .../java/com/moment/the/answer/service/AnswerService.java | 2 +- .../uncomfortable/repository/UncomfortableRepository.java | 6 +++--- .../the/uncomfortable/service/UncomfortableService.java | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/moment/the/answer/repository/AnswerRepository.java b/src/main/java/com/moment/the/answer/repository/AnswerRepository.java index fa519ea3..a1c7c8e9 100644 --- a/src/main/java/com/moment/the/answer/repository/AnswerRepository.java +++ b/src/main/java/com/moment/the/answer/repository/AnswerRepository.java @@ -14,5 +14,5 @@ public interface AnswerRepository extends JpaRepository { Optional findByAdminDomain(AdminDomain adminDomain); - AnswerDomain findTop1ByTableDomain_BoardIdx(Long boardIdx); + AnswerDomain findTop1ByUncomfortableEntity_BoardIdx(Long boardIdx); } diff --git a/src/main/java/com/moment/the/answer/service/AnswerService.java b/src/main/java/com/moment/the/answer/service/AnswerService.java index 44305ee8..fe177592 100644 --- a/src/main/java/com/moment/the/answer/service/AnswerService.java +++ b/src/main/java/com/moment/the/answer/service/AnswerService.java @@ -57,7 +57,7 @@ public AnswerDomain update(AnswerDto answerDto, Long answerIdx) { public AnswerResDto view(Long boardIdx) { // 해당 boardIdx를 참조하는 answerDomain 찾기. - AnswerDomain answerDomain = answerRepo.findTop1ByTableDomain_BoardIdx(boardIdx); + AnswerDomain answerDomain = answerRepo.findTop1ByUncomfortableEntity_BoardIdx(boardIdx); AnswerResDto answerResDto = AnswerResDto.builder() .answerIdx(answerDomain.getAnswerIdx()) diff --git a/src/main/java/com/moment/the/uncomfortable/repository/UncomfortableRepository.java b/src/main/java/com/moment/the/uncomfortable/repository/UncomfortableRepository.java index ef04661c..cc3f5d5b 100644 --- a/src/main/java/com/moment/the/uncomfortable/repository/UncomfortableRepository.java +++ b/src/main/java/com/moment/the/uncomfortable/repository/UncomfortableRepository.java @@ -12,7 +12,7 @@ @Repository public interface UncomfortableRepository extends JpaRepository{ - // idx로 table 찾기. + // idx로 uncomfortable 찾기. Optional findByBoardIdx(Long boardIdx); @Query(value = "SELECT COUNT(table.boardIdx) " + @@ -23,11 +23,11 @@ public interface UncomfortableRepository extends JpaRepository tableViewAll(); + List uncomfortableViewAll(); @Query("SELECT new com.moment.the.uncomfortable.dto.UncomfortableGetDto(table.boardIdx, table.content, table.goods, answer)" + "FROM UncomfortableEntity table LEFT JOIN table.answerDomain answer " + "ORDER BY table.goods DESC " ) - List tableViewTopBy(Pageable p); + List uncomfortableViewTopBy(Pageable p); } diff --git a/src/main/java/com/moment/the/uncomfortable/service/UncomfortableService.java b/src/main/java/com/moment/the/uncomfortable/service/UncomfortableService.java index 9466bfd9..030ad8c0 100644 --- a/src/main/java/com/moment/the/uncomfortable/service/UncomfortableService.java +++ b/src/main/java/com/moment/the/uncomfortable/service/UncomfortableService.java @@ -30,12 +30,12 @@ public UncomfortableEntity write(UncomfortableSetDto uncomfortableSetDto){ // Top 30 보여주기. public List top30View() { - return uncomfortableRepository.tableViewTopBy(PageRequest.of(0,30)); + return uncomfortableRepository.uncomfortableViewTopBy(PageRequest.of(0,30)); } // 전체 페이지 보여주기. public List viewAll(){ - return uncomfortableRepository.tableViewAll(); + return uncomfortableRepository.uncomfortableViewAll(); } // 전체 게시물 개수 보여주기. From ca9cfc1315a10d3d78c60af373be99110eff0d1f Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Mon, 6 Sep 2021 13:56:55 +0900 Subject: [PATCH 31/41] Update uncomfortable bussiness logic method naming --- .../controller/UncomfortableController.java | 16 ++++++++-------- .../repository/UncomfortableRepository.java | 2 +- .../service/UncomfortableService.java | 16 ++++++++-------- .../release/UncomfortableControllerTest.java | 2 +- .../moment/the/service/AnswerServiceTest.java | 2 +- .../the/service/UncomfortableServiceTest.java | 16 ++++++++-------- 6 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java b/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java index ee41a804..9857e436 100644 --- a/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java +++ b/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java @@ -23,52 +23,52 @@ public class UncomfortableController { // localhost:8080/v1/uncomfortable @PostMapping("/uncomfortable") public CommonResult write(@Valid @RequestBody UncomfortableSetDto uncomfortableSetDto){ - uncomfortableService.write(uncomfortableSetDto); + uncomfortableService.addUncomfortable(uncomfortableSetDto); return responseService.getSuccessResult(); } // localhost:8080/v1/uncomfortable/top30 @GetMapping("/uncomfortable/top30") public ListResult top10(){ - return responseService.getListResult(uncomfortableService.top30View()); + return responseService.getListResult(uncomfortableService.getTop30()); } // localhost:8080/v1/uncomfortable @GetMapping("/uncomfortable") public ListResult viewAll(){ - return responseService.getListResult(uncomfortableService.viewAll()); + return responseService.getListResult(uncomfortableService.getAllUncomfortable()); } // localhost:8080/v1/uncomfortable/{boardIdx} @PutMapping("/uncomfortable/{boardIdx}") public CommonResult goods(@PathVariable Long boardIdx){ - uncomfortableService.goods(boardIdx); + uncomfortableService.increaseLike(boardIdx); return responseService.getSuccessResult(); } // localhost:8080/v1/uncomfortable/cancel/{boardIdx} @PutMapping("/uncomfortable/cancel/{boardIdx}") public CommonResult cancelGood(@PathVariable Long boardIdx){ - uncomfortableService.cancelGood(boardIdx); + uncomfortableService.decreaseLike(boardIdx); return responseService.getSuccessResult(); } // localhost:8080/v1/uncomfortable/amount @GetMapping("/uncomfortable/amount") public SingleResult amountUncomfortable(){ - return responseService.getSingleResult(uncomfortableService.amountUncomfortableView()); + return responseService.getSingleResult(uncomfortableService.getNumberOfUncomfortable()); } // localhost:8080/v1/uncomfortable/dateSinceProjectStart @GetMapping("/uncomfortable/dateSinceProjectStart") public SingleResult getDateSinceProjectStart(){ - return responseService.getSingleResult(uncomfortableService.dateSinceProjectStart()); + return responseService.getSingleResult(uncomfortableService.getDateSinceProjectStart()); } // localhost:8080/v1/uncomfortable/{boardIdx} @DeleteMapping("/uncomfortable/{boardIdx}") public CommonResult deleteThisBoard(@PathVariable Long boardIdx){ - uncomfortableService.delete(boardIdx); + uncomfortableService.deleteUncomfortable(boardIdx); return responseService.getSuccessResult(); } } diff --git a/src/main/java/com/moment/the/uncomfortable/repository/UncomfortableRepository.java b/src/main/java/com/moment/the/uncomfortable/repository/UncomfortableRepository.java index cc3f5d5b..af10c0ee 100644 --- a/src/main/java/com/moment/the/uncomfortable/repository/UncomfortableRepository.java +++ b/src/main/java/com/moment/the/uncomfortable/repository/UncomfortableRepository.java @@ -12,7 +12,7 @@ @Repository public interface UncomfortableRepository extends JpaRepository{ - // idx로 uncomfortable 찾기. + Optional findByBoardIdx(Long boardIdx); @Query(value = "SELECT COUNT(table.boardIdx) " + diff --git a/src/main/java/com/moment/the/uncomfortable/service/UncomfortableService.java b/src/main/java/com/moment/the/uncomfortable/service/UncomfortableService.java index 030ad8c0..632d2f6b 100644 --- a/src/main/java/com/moment/the/uncomfortable/service/UncomfortableService.java +++ b/src/main/java/com/moment/the/uncomfortable/service/UncomfortableService.java @@ -24,40 +24,40 @@ public class UncomfortableService { // 작성하기. @Transactional - public UncomfortableEntity write(UncomfortableSetDto uncomfortableSetDto){ + public UncomfortableEntity addUncomfortable(UncomfortableSetDto uncomfortableSetDto){ return uncomfortableRepository.save(uncomfortableSetDto.toEntity()); } // Top 30 보여주기. - public List top30View() { + public List getTop30() { return uncomfortableRepository.uncomfortableViewTopBy(PageRequest.of(0,30)); } // 전체 페이지 보여주기. - public List viewAll(){ + public List getAllUncomfortable(){ return uncomfortableRepository.uncomfortableViewAll(); } // 전체 게시물 개수 보여주기. - public Long amountUncomfortableView(){ + public Long getNumberOfUncomfortable(){ return uncomfortableRepository.amountUncomfortable(); } // 프로젝트 시작 이후 날짜 보여주기. - public int dateSinceProjectStart(){ + public int getDateSinceProjectStart(){ return calculateAfterDate(); } // 좋아요 수 증가. @Transactional - public void goods(Long boardIdx){ + public void increaseLike(Long boardIdx){ UncomfortableEntity uncomfortableEntity = uncomfortableRepository.findByBoardIdx(boardIdx).orElseThrow(NoPostException::new); uncomfortableEntity.updateGoods(uncomfortableEntity.getGoods()+1); } // 좋아요 수 감소. @Transactional - public void cancelGood(Long boardIdx) { + public void decreaseLike(Long boardIdx) { UncomfortableEntity uncomfortableEntity = uncomfortableRepository.findByBoardIdx(boardIdx).orElseThrow(NoPostException::new); int goodsResult = uncomfortableEntity.getGoods() - 1; @@ -69,7 +69,7 @@ public void cancelGood(Long boardIdx) { } @Transactional - public void delete(long boardIdx){ + public void deleteUncomfortable(long boardIdx){ uncomfortableRepository.deleteById(boardIdx); } diff --git a/src/test/java/com/moment/the/controller/release/UncomfortableControllerTest.java b/src/test/java/com/moment/the/controller/release/UncomfortableControllerTest.java index b4026918..635e953b 100644 --- a/src/test/java/com/moment/the/controller/release/UncomfortableControllerTest.java +++ b/src/test/java/com/moment/the/controller/release/UncomfortableControllerTest.java @@ -134,7 +134,7 @@ String objectToJson(Object object) throws JsonProcessingException { ).limit(40).collect(Collectors.toList()); tableRepo.saveAll(uncomfortableEntities); - List uncomfortableGetDtos = uncomfortableService.top30View(); + List uncomfortableGetDtos = uncomfortableService.getTop30(); String top30Data = objectToJson(uncomfortableGetDtos); //When diff --git a/src/test/java/com/moment/the/service/AnswerServiceTest.java b/src/test/java/com/moment/the/service/AnswerServiceTest.java index 556f053b..710ccafe 100644 --- a/src/test/java/com/moment/the/service/AnswerServiceTest.java +++ b/src/test/java/com/moment/the/service/AnswerServiceTest.java @@ -68,7 +68,7 @@ AdminDomain adminLogin(String adminId, String password) { UncomfortableEntity createTable(){ String TABLE_CONTENT = "급식이 맛이 없어요 급식에 질을 높여주세요!"; UncomfortableSetDto uncomfortableSetDto = new UncomfortableSetDto(TABLE_CONTENT); - UncomfortableEntity uncomfortableEntity = uncomfortableService.write(uncomfortableSetDto); + UncomfortableEntity uncomfortableEntity = uncomfortableService.addUncomfortable(uncomfortableSetDto); return uncomfortableEntity; } diff --git a/src/test/java/com/moment/the/service/UncomfortableServiceTest.java b/src/test/java/com/moment/the/service/UncomfortableServiceTest.java index 0c8e49cd..18f3b1e7 100644 --- a/src/test/java/com/moment/the/service/UncomfortableServiceTest.java +++ b/src/test/java/com/moment/the/service/UncomfortableServiceTest.java @@ -46,7 +46,7 @@ public void cleanUp(){ .build(); // when - UncomfortableEntity writeTable = uncomfortableService.write(uncomfortableSetDto); + UncomfortableEntity writeTable = uncomfortableService.addUncomfortable(uncomfortableSetDto); UncomfortableEntity savedTable = tableRepo.findByBoardIdx(writeTable.getBoardIdx()).orElseThrow(() -> new IllegalArgumentException("Table을 찾을 수 없습니다. (테스트실패)")); tableRepo.delete(savedTable); @@ -68,7 +68,7 @@ public void cleanUp(){ // When tableRepo.saveAll(uncomfortableEntities); - List viewTop30 = uncomfortableService.top30View(); + List viewTop30 = uncomfortableService.getTop30(); // Then assertEquals(viewTop30.size(), 30); @@ -93,7 +93,7 @@ public void cleanUp(){ // When tableRepo.saveAll(uncomfortableEntities); - List tableViewAll = uncomfortableService.viewAll(); + List tableViewAll = uncomfortableService.getAllUncomfortable(); // Then assertEquals(tableViewAll.size(), 10); // 10개를 저장했으므로 tableViewAll 의 개수는 10개여야 한다. @@ -113,7 +113,7 @@ public void cleanUp(){ // When tableRepo.saveAll(uncomfortableEntities); - Long amountUncomfortable = uncomfortableService.amountUncomfortableView(); + Long amountUncomfortable = uncomfortableService.getNumberOfUncomfortable(); // then assertEquals(amountUncomfortable, 10); @@ -130,7 +130,7 @@ public void cleanUp(){ Period period = startTheMoment.until(currentDate); // Then - assertEquals(uncomfortableService.dateSinceProjectStart(), period.getDays()+1);; + assertEquals(uncomfortableService.getDateSinceProjectStart(), period.getDays()+1);; } @Test @@ -143,7 +143,7 @@ public void cleanUp(){ // When UncomfortableEntity savedUncomfortableEntity = tableRepo.save(uncomfortableEntity); - uncomfortableService.goods(savedUncomfortableEntity.getBoardIdx()); + uncomfortableService.increaseLike(savedUncomfortableEntity.getBoardIdx()); UncomfortableEntity savedGoodsUncomfortableEntity = tableRepo.findByBoardIdx(savedUncomfortableEntity.getBoardIdx()).orElseThrow(() -> new IllegalArgumentException("좋아요를 받은 TableEntity를 찾을 수 없습니다.")); // Then @@ -161,7 +161,7 @@ public void cleanUp(){ // When UncomfortableEntity savedUncomfortableEntity = tableRepo.save(uncomfortableEntity); - uncomfortableService.cancelGood(savedUncomfortableEntity.getBoardIdx()); + uncomfortableService.decreaseLike(savedUncomfortableEntity.getBoardIdx()); UncomfortableEntity savedCancelGoodUncomfortableEntity = tableRepo.findByBoardIdx(savedUncomfortableEntity.getBoardIdx()).orElseThrow(() -> new IllegalArgumentException("좋아요를 취소한 TableEntity를 찾을 수 없습니다.")); // Given @@ -182,7 +182,7 @@ public void cleanUp(){ System.out.println(savedUncomfortableEntity.getBoardIdx()); assertThrows(GoodsNotCancelException.class, () ->{ - uncomfortableService.cancelGood(savedUncomfortableEntity.getBoardIdx()); + uncomfortableService.decreaseLike(savedUncomfortableEntity.getBoardIdx()); }); } From c2456f02a69a4dc56c686e42f8e3d13933a08a34 Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Mon, 6 Sep 2021 13:59:28 +0900 Subject: [PATCH 32/41] =?UTF-8?q?Update=20=EC=93=B8=EB=8D=B0=EC=97=86?= =?UTF-8?q?=EB=8A=94=20=EC=A3=BC=EC=84=9D=20=EC=82=AD=EC=A0=9C=20=EB=B0=8F?= =?UTF-8?q?=20top10=20->=20top30=20=EC=9C=BC=EB=A1=9C=20rename?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/UncomfortableController.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java b/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java index 9857e436..a687612c 100644 --- a/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java +++ b/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java @@ -16,20 +16,29 @@ @RequiredArgsConstructor @RequestMapping("/v1") public class UncomfortableController { - //Dependency Injection + private final UncomfortableService uncomfortableService; private final ResponseService responseService; - // localhost:8080/v1/uncomfortable + /** + * 학교의 불편함을 작성합니다. + * @param uncomfortableSetDto + * @return getSuccessResult + * @author 전지환, 정시원 + */ @PostMapping("/uncomfortable") public CommonResult write(@Valid @RequestBody UncomfortableSetDto uncomfortableSetDto){ uncomfortableService.addUncomfortable(uncomfortableSetDto); return responseService.getSuccessResult(); } - // localhost:8080/v1/uncomfortable/top30 + /** + * 많은 학생들이 공감한 글 상위 30개를 선별하여 가져옵니다. + * @return getListResult + * @author 전지환, 정시원 + */ @GetMapping("/uncomfortable/top30") - public ListResult top10(){ + public ListResult top30(){ return responseService.getListResult(uncomfortableService.getTop30()); } From 72e6fa5c2e0b896bb3e75937d7e8c8e2749cad8b Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Mon, 6 Sep 2021 14:02:05 +0900 Subject: [PATCH 33/41] Update api address and method order change --- .../controller/UncomfortableController.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java b/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java index a687612c..df58bed6 100644 --- a/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java +++ b/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java @@ -49,19 +49,26 @@ public ListResult viewAll(){ } // localhost:8080/v1/uncomfortable/{boardIdx} - @PutMapping("/uncomfortable/{boardIdx}") + @PutMapping("/uncomfortable/like/increase/{boardIdx}") public CommonResult goods(@PathVariable Long boardIdx){ uncomfortableService.increaseLike(boardIdx); return responseService.getSuccessResult(); } // localhost:8080/v1/uncomfortable/cancel/{boardIdx} - @PutMapping("/uncomfortable/cancel/{boardIdx}") + @PutMapping("/uncomfortable/like/decrease/{boardIdx}") public CommonResult cancelGood(@PathVariable Long boardIdx){ uncomfortableService.decreaseLike(boardIdx); return responseService.getSuccessResult(); } + // localhost:8080/v1/uncomfortable/{boardIdx} + @DeleteMapping("/uncomfortable/{boardIdx}") + public CommonResult deleteThisBoard(@PathVariable Long boardIdx){ + uncomfortableService.deleteUncomfortable(boardIdx); + return responseService.getSuccessResult(); + } + // localhost:8080/v1/uncomfortable/amount @GetMapping("/uncomfortable/amount") public SingleResult amountUncomfortable(){ @@ -73,11 +80,4 @@ public SingleResult amountUncomfortable(){ public SingleResult getDateSinceProjectStart(){ return responseService.getSingleResult(uncomfortableService.getDateSinceProjectStart()); } - - // localhost:8080/v1/uncomfortable/{boardIdx} - @DeleteMapping("/uncomfortable/{boardIdx}") - public CommonResult deleteThisBoard(@PathVariable Long boardIdx){ - uncomfortableService.deleteUncomfortable(boardIdx); - return responseService.getSuccessResult(); - } } From 8f3bb1c3136c0ec73682ee5f0884514ca716d326 Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Mon, 6 Sep 2021 14:02:41 +0900 Subject: [PATCH 34/41] =?UTF-8?q?Delete=20=EC=A3=BC=EC=84=9D=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uncomfortable/controller/UncomfortableController.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java b/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java index df58bed6..1ae23346 100644 --- a/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java +++ b/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java @@ -42,40 +42,34 @@ public ListResult top30(){ return responseService.getListResult(uncomfortableService.getTop30()); } - // localhost:8080/v1/uncomfortable @GetMapping("/uncomfortable") public ListResult viewAll(){ return responseService.getListResult(uncomfortableService.getAllUncomfortable()); } - // localhost:8080/v1/uncomfortable/{boardIdx} @PutMapping("/uncomfortable/like/increase/{boardIdx}") public CommonResult goods(@PathVariable Long boardIdx){ uncomfortableService.increaseLike(boardIdx); return responseService.getSuccessResult(); } - // localhost:8080/v1/uncomfortable/cancel/{boardIdx} @PutMapping("/uncomfortable/like/decrease/{boardIdx}") public CommonResult cancelGood(@PathVariable Long boardIdx){ uncomfortableService.decreaseLike(boardIdx); return responseService.getSuccessResult(); } - // localhost:8080/v1/uncomfortable/{boardIdx} @DeleteMapping("/uncomfortable/{boardIdx}") public CommonResult deleteThisBoard(@PathVariable Long boardIdx){ uncomfortableService.deleteUncomfortable(boardIdx); return responseService.getSuccessResult(); } - // localhost:8080/v1/uncomfortable/amount @GetMapping("/uncomfortable/amount") public SingleResult amountUncomfortable(){ return responseService.getSingleResult(uncomfortableService.getNumberOfUncomfortable()); } - // localhost:8080/v1/uncomfortable/dateSinceProjectStart @GetMapping("/uncomfortable/dateSinceProjectStart") public SingleResult getDateSinceProjectStart(){ return responseService.getSingleResult(uncomfortableService.getDateSinceProjectStart()); From a6ab8db54503c01bae8c5dfb78c3738b3ead2b02 Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Mon, 6 Sep 2021 14:06:42 +0900 Subject: [PATCH 35/41] Update uncomfortable controller method rename --- .../controller/UncomfortableController.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java b/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java index 1ae23346..4e066261 100644 --- a/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java +++ b/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java @@ -27,7 +27,7 @@ public class UncomfortableController { * @author 전지환, 정시원 */ @PostMapping("/uncomfortable") - public CommonResult write(@Valid @RequestBody UncomfortableSetDto uncomfortableSetDto){ + public CommonResult addUncomfortable(@Valid @RequestBody UncomfortableSetDto uncomfortableSetDto){ uncomfortableService.addUncomfortable(uncomfortableSetDto); return responseService.getSuccessResult(); } @@ -38,35 +38,35 @@ public CommonResult write(@Valid @RequestBody UncomfortableSetDto uncomfortableS * @author 전지환, 정시원 */ @GetMapping("/uncomfortable/top30") - public ListResult top30(){ + public ListResult getTop30(){ return responseService.getListResult(uncomfortableService.getTop30()); } @GetMapping("/uncomfortable") - public ListResult viewAll(){ + public ListResult getAllUncomfortable(){ return responseService.getListResult(uncomfortableService.getAllUncomfortable()); } @PutMapping("/uncomfortable/like/increase/{boardIdx}") - public CommonResult goods(@PathVariable Long boardIdx){ + public CommonResult increaseLike(@PathVariable Long boardIdx){ uncomfortableService.increaseLike(boardIdx); return responseService.getSuccessResult(); } @PutMapping("/uncomfortable/like/decrease/{boardIdx}") - public CommonResult cancelGood(@PathVariable Long boardIdx){ + public CommonResult decreaseLike(@PathVariable Long boardIdx){ uncomfortableService.decreaseLike(boardIdx); return responseService.getSuccessResult(); } @DeleteMapping("/uncomfortable/{boardIdx}") - public CommonResult deleteThisBoard(@PathVariable Long boardIdx){ + public CommonResult deleteUncomfortable(@PathVariable Long boardIdx){ uncomfortableService.deleteUncomfortable(boardIdx); return responseService.getSuccessResult(); } @GetMapping("/uncomfortable/amount") - public SingleResult amountUncomfortable(){ + public SingleResult getNumberOfUncomfortable(){ return responseService.getSingleResult(uncomfortableService.getNumberOfUncomfortable()); } From 83046ab6a77ab8092bd505e219ae59694bac343f Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Mon, 6 Sep 2021 14:10:44 +0900 Subject: [PATCH 36/41] =?UTF-8?q?Add=20=EC=A3=BC=EC=84=9D=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 --- .../controller/UncomfortableController.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java b/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java index 4e066261..6aa82654 100644 --- a/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java +++ b/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java @@ -42,34 +42,67 @@ public ListResult getTop30(){ return responseService.getListResult(uncomfortableService.getTop30()); } + /** + * 학교의 불편함 전체를 가져옵니다. + * @return getListResult + * @author 전지환, 정시원 + */ @GetMapping("/uncomfortable") public ListResult getAllUncomfortable(){ return responseService.getListResult(uncomfortableService.getAllUncomfortable()); } + /** + * 해당 불편함의 좋아요를 증가시킵니다. + * @param boardIdx + * @return getSuccessResult + * @author 전지환, 정시원 + */ @PutMapping("/uncomfortable/like/increase/{boardIdx}") public CommonResult increaseLike(@PathVariable Long boardIdx){ uncomfortableService.increaseLike(boardIdx); return responseService.getSuccessResult(); } + /** + * 해당 불편함의 좋아요를 감소시킵니다. + * @param boardIdx + * @return getSuccessResult + * @author 전지환, 정시원 + */ @PutMapping("/uncomfortable/like/decrease/{boardIdx}") public CommonResult decreaseLike(@PathVariable Long boardIdx){ uncomfortableService.decreaseLike(boardIdx); return responseService.getSuccessResult(); } + /** + * 해당 불편함을 삭제합니다. + * @param boardIdx + * @return getSuccessResult + * @author 전지환, 정시원 + */ @DeleteMapping("/uncomfortable/{boardIdx}") public CommonResult deleteUncomfortable(@PathVariable Long boardIdx){ uncomfortableService.deleteUncomfortable(boardIdx); return responseService.getSuccessResult(); } + /** + * 불편함의 개수를 세어 가져옵니다. + * @return getSingleResult + * @author 전지환, 정시원 + */ @GetMapping("/uncomfortable/amount") public SingleResult getNumberOfUncomfortable(){ return responseService.getSingleResult(uncomfortableService.getNumberOfUncomfortable()); } + /** + * 프로젝트 D-day를 세어 가져옵니다. + * @return getSingleResult + * @author 전지환, 정시원 + */ @GetMapping("/uncomfortable/dateSinceProjectStart") public SingleResult getDateSinceProjectStart(){ return responseService.getSingleResult(uncomfortableService.getDateSinceProjectStart()); From 741457a8a719b738bac347894c2ca29dba523ea6 Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Mon, 6 Sep 2021 14:12:59 +0900 Subject: [PATCH 37/41] Update entity field layout --- .../java/com/moment/the/uncomfortable/UncomfortableEntity.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/moment/the/uncomfortable/UncomfortableEntity.java b/src/main/java/com/moment/the/uncomfortable/UncomfortableEntity.java index f308c156..a1c1c052 100644 --- a/src/main/java/com/moment/the/uncomfortable/UncomfortableEntity.java +++ b/src/main/java/com/moment/the/uncomfortable/UncomfortableEntity.java @@ -21,7 +21,6 @@ public class UncomfortableEntity { private String content; @Column private int goods; - @OneToOne(fetch = LAZY, cascade = CascadeType.ALL) private AnswerDomain answerDomain; From 62b41ae16efd64dc1aaa0fb745330b183bb19d8f Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Mon, 6 Sep 2021 14:21:02 +0900 Subject: [PATCH 38/41] =?UTF-8?q?Add=20uncomfortable=20service=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/UncomfortableService.java | 61 ++++++++++++++----- 1 file changed, 45 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/moment/the/uncomfortable/service/UncomfortableService.java b/src/main/java/com/moment/the/uncomfortable/service/UncomfortableService.java index 632d2f6b..a6f0ef1c 100644 --- a/src/main/java/com/moment/the/uncomfortable/service/UncomfortableService.java +++ b/src/main/java/com/moment/the/uncomfortable/service/UncomfortableService.java @@ -22,40 +22,46 @@ public class UncomfortableService { private final UncomfortableRepository uncomfortableRepository; - // 작성하기. + /** + * 학교의 불편함을 작성합니다. + * @param uncomfortableSetDto + * @return UncomfortableEntity + */ @Transactional public UncomfortableEntity addUncomfortable(UncomfortableSetDto uncomfortableSetDto){ return uncomfortableRepository.save(uncomfortableSetDto.toEntity()); } - // Top 30 보여주기. + /** + * 많은 학생들이 공감한 글 상위 30개를 선별하여 가져옵니다. + * @return List + */ public List getTop30() { return uncomfortableRepository.uncomfortableViewTopBy(PageRequest.of(0,30)); } - // 전체 페이지 보여주기. + /** + * 학교의 불편함 전체를 가져옵니다. + * @return List + */ public List getAllUncomfortable(){ return uncomfortableRepository.uncomfortableViewAll(); } - // 전체 게시물 개수 보여주기. - public Long getNumberOfUncomfortable(){ - return uncomfortableRepository.amountUncomfortable(); - } - - // 프로젝트 시작 이후 날짜 보여주기. - public int getDateSinceProjectStart(){ - return calculateAfterDate(); - } - - // 좋아요 수 증가. + /** + * 해당 불편함의 좋아요를 증가시킵니다. + * @param boardIdx + */ @Transactional public void increaseLike(Long boardIdx){ UncomfortableEntity uncomfortableEntity = uncomfortableRepository.findByBoardIdx(boardIdx).orElseThrow(NoPostException::new); uncomfortableEntity.updateGoods(uncomfortableEntity.getGoods()+1); } - // 좋아요 수 감소. + /** + * 해당 불편함의 좋아요를 감소시킵니다. + * @param boardIdx + */ @Transactional public void decreaseLike(Long boardIdx) { UncomfortableEntity uncomfortableEntity = uncomfortableRepository.findByBoardIdx(boardIdx).orElseThrow(NoPostException::new); @@ -68,12 +74,35 @@ public void decreaseLike(Long boardIdx) { } } + /** + * 해당 불편함을 삭제합니다. + * @param boardIdx + */ @Transactional public void deleteUncomfortable(long boardIdx){ uncomfortableRepository.deleteById(boardIdx); } - // day 수 계산하기 + /** + * 불편함의 개수를 세어 가져옵니다. + * @return Long + */ + public Long getNumberOfUncomfortable(){ + return uncomfortableRepository.amountUncomfortable(); + } + + /** + * 프로젝트 D-day를 세어 가져옵니다. + * @return int + */ + public int getDateSinceProjectStart(){ + return calculateAfterDate(); + } + + /** + * D-day를 계산하는 메서드. + * @return int + */ public static int calculateAfterDate(){ /** * today: 오늘 날짜 From 34d1e742172ebe523b8d5ff1b89b31453c7ebf01 Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Mon, 6 Sep 2021 14:25:48 +0900 Subject: [PATCH 39/41] =?UTF-8?q?Update=20=EC=A3=BC=EC=84=9D=20statement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../the/uncomfortable/service/UncomfortableService.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/moment/the/uncomfortable/service/UncomfortableService.java b/src/main/java/com/moment/the/uncomfortable/service/UncomfortableService.java index a6f0ef1c..68d6e159 100644 --- a/src/main/java/com/moment/the/uncomfortable/service/UncomfortableService.java +++ b/src/main/java/com/moment/the/uncomfortable/service/UncomfortableService.java @@ -104,10 +104,8 @@ public int getDateSinceProjectStart(){ * @return int */ public static int calculateAfterDate(){ - /** - * today: 오늘 날짜 - * theMomentStart: the-moment 시작 날짜 - */ + // today: 오늘 날짜 + // theMomentStart: the-moment 시작 날짜 LocalDate today = LocalDate.now(); LocalDate theMomentStart = LocalDate.of(2021, 6, 7); From 27292384197f785f4b11f9c509b4a34b00c88311 Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Mon, 6 Sep 2021 14:48:34 +0900 Subject: [PATCH 40/41] =?UTF-8?q?Update=20api=20url=20=EC=9D=B4=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=EB=90=A8=EC=97=90=20=EB=94=B0=EB=9D=BC=20tes?= =?UTF-8?q?tcode=20=EC=97=90=20=EB=B0=98=EC=98=81=20=ED=9B=84=20build=20su?= =?UTF-8?q?ccess?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../the/controller/release/UncomfortableControllerTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/moment/the/controller/release/UncomfortableControllerTest.java b/src/test/java/com/moment/the/controller/release/UncomfortableControllerTest.java index 635e953b..6c584993 100644 --- a/src/test/java/com/moment/the/controller/release/UncomfortableControllerTest.java +++ b/src/test/java/com/moment/the/controller/release/UncomfortableControllerTest.java @@ -159,7 +159,7 @@ String objectToJson(Object object) throws JsonProcessingException { //When resultActions = mockMvc.perform( - put("/v1/uncomfortable/" + tableIdx.longValue()) + put("/v1/uncomfortable/like/increase/" + tableIdx.longValue()) .contentType(MediaType.APPLICATION_JSON) ); @@ -181,7 +181,7 @@ String objectToJson(Object object) throws JsonProcessingException { //When resultActions = mockMvc.perform( - put("/v1/uncomfortable/cancel/" + tableIdx.longValue()) + put("/v1/uncomfortable/like/decrease/" + tableIdx.longValue()) .contentType(MediaType.APPLICATION_JSON) ); From e65fd085050e5ed60973153d6dea7049079aeb19 Mon Sep 17 00:00:00 2001 From: johnjihwan Date: Tue, 7 Sep 2021 09:14:00 +0900 Subject: [PATCH 41/41] Fix api url /top30 -> /rank --- .../the/uncomfortable/controller/UncomfortableController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java b/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java index 6aa82654..6bbd2a29 100644 --- a/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java +++ b/src/main/java/com/moment/the/uncomfortable/controller/UncomfortableController.java @@ -37,7 +37,7 @@ public CommonResult addUncomfortable(@Valid @RequestBody UncomfortableSetDto unc * @return getListResult * @author 전지환, 정시원 */ - @GetMapping("/uncomfortable/top30") + @GetMapping("/uncomfortable/rank") public ListResult getTop30(){ return responseService.getListResult(uncomfortableService.getTop30()); }

Ug zkvNu!_UZiDcfs->!u*tX40|yg*BPKgdML1*unET697#%9#XHlo3!UT$9L)=pKVChE zElkDNjiX4l~$Vlcnv@OLB|U|fm# z%(H{NO-$|8`4LoWr+@uTs>6>h5A9DTCd|r0DhaG&q-|ZN9+r)$ZmZH9eD$sNRDb(P z!H={1Z+wQ-{Q(?=*#+Juh+}>G-L-ANUDUyYxpVYomc}{DTwUai1N1Ns?n*498Yy*Y zt>TRE*(L2CgGXNVhiiN~nk4fAQnC2GEV)jsn#jhjHUqZm{6~*Dd$0-iShJdML?~|7 z7x+3)&p{f??Sn@!<)yO65BWB_snn#6$(^a#1F4rt^#pCb)f=MKdy2K{@Q)5Y>*&>% z3a`b|duJfkVFW2UWEB(57t=t3#>C=puh2~PPJJr+a>d=QuMz6O$qTuV;<6*9K3auj zRBIll;I=C_TNt^;op`Bq1X7OmkYcSMrQ}8)C*LV^&wVarYx%j=w!PUn#}uKIZ6_Qc z#SleG3C_-u+X&e%oLS(tF*Me2{%n*Q2dT*nNKt{CI`O!ExxJp6ldL)X#p8qPK?b_` zoewl{^QCM%a}H0%Ag#CBNa_{<87HH+NUKx29i9z;3xO!o9W zBOA}!&>nD>)~VJ*#67MLP~bjqpofDnd`M4;sDpOx*Y`2*e*GdZRM_3WoR)FBhzF$f zcR`A+n3TG~6BWK$=_Q@V?_Yfpzmf#_tX(Nia_0SpBCPGEF*j7E7C7 ziA&vewUgEJ!mTLpV|?0lI59*IZDOmec=G7y#$k7V#4kLP-~HK86`l91zA}{ z<9g9zwOcw(Pin0F*7bRgnzO^=k%w1)jU@99{9)h669OqaT}aUzkW!UTsjKIYF=PGS z(uH-e+~9Z7Y{1j|7 zl$vSyrt143w?(UCLwA>s#WxD+N^r^{)CF-!;eNG|Xk3;7tq)Hy*uUxD#N@55#PxRI zgxGsX*-}Ev$CWhJ1M3gfhZW?5e_QOV<&gDd&wOzPoN`Dkn>Uc!K2A!N8?xT$-S}W) zvlGqu$yiP{uee39cab-aZ5+3erh)G))v)CAy>Vh-Eg;m`QAja^ zJwQBPUYvUj1H7(>7V)W6-|96GU7Gbsg;Xv#r1%F(spkqIRgVHT3tx*=6;O~nl(jiv z#S9r&lF^niNXbf&Qc@pGdoQn^=8!#G8pe?$Fr`Z&p@XAL22bKBEX`$7YJzR=fv`{K zN@z`=?0S8A<&@!Rei7KiS0EQ%Xfa@M@RZeQ6^f3I^HWE{yxGnj3p z9h?LYqFK&3`Sr8^Po8U1;j$c>pDaB4vUl)8>TNQ@fKN;7tlkh?wW7(;*^Bv|`>s9P zpe7jqI|)>3B-R^4NNrREKZ#=f&@&qm$Q^Sr+AEZ{FYV(DZ3|P&?v0CLcri*M1qS@uV zeh%tY6j*57KxP?agYdVB1tRwjq8`?%Hz^&}ki3qmO?rNs+2^X6dG#o6T*mFlS_e&X zomp+c#IB=0|vc9??) z5!H6Eh2GyI+)hQW?U#%1P*gD|T-q*S8c;`fx2sT0Sqoc6vFG{pV; zmj`%{L?}~9NHGB~#IfkEoU;~s#d-I{GPi`3pcpBoHER?X$yQcY z8F5Lq=geW?T}d3G>{^5C#6P{_OitwRHU2uuXy#@|B;s zhphIom>`;`#&70kd_Hxreh#}3R1IU3?4+3=3%$vj0>CW9G#Y3e~!wZ{`O@t7*hW7IB4A* zvYzSPl}Q)Rbh(GO^HcFdj>4^q6p-@U04YweONnD$R;!VdZn$LJe0Pt@B^m8oT|2VD zc#vILodBubFGwk|AeNlax4iuJI%-wsr}kW@SUQOG5Ky(`kfIePr7k}x_ij&n^m+q% zPFV!ih+qC;6=X#LDyt7qF_BVMDIZvyw5NVx`LeYdw&%(!z8o=tR0()rK^pZV@F2?J zMfxW%BQDfwUn~ic~`@5{u7EeD;6rJqX5wye~f}#z7e2b-rS47xVSv zObTq`NVgXYGrzAAcTal(m^9diAjd$QCi!^#rM~KIDQrB*1{M#L4X-$I) zu?E@5x<2uPkZK{U!)#K@eW60THi&|icckxX10VeEhl~D$BkhQ{a?C zs66~xNsX*xA}URWV~L|8_$BYopTn<3wtb?kX9p_@d84=c31iW%bHaX4t?^oH-9v5v z+SpI`a3Gaz(^UaTIUI!)^)u2~Kgm|#ZHr!D{ht4>|G+Wxbbb0~;55Lx=_^PgCo5<) zNaZH#A*Xd$V`ZK8&?{frdjc3%JrUvDeuPrCo%(`jC2NRh9Td6u=0HdB#3-B+Uzi}8cM7@=FH3Ct66`LG zBp@~O15##;q*U!Uwgl1rJzv`!sV^#a_e`GIu-61q)A+ir0kZIlX-uz@8S)8?cJABrG1&Nm8xua0GjkZL^+DT)A6%6T-HC%@Jq^3*wV4%TdT5&ObT z_;-iR9*`0PtC_fmmK_<6*AitM+?}5fN*=u7xUi3WKZpe~zwrj7OzKIgeXqFOKYn z6xU%Gi)x*UeK<2Q!(->o?Ls%{^#j-sQSDck$b{4uBzK@~MsDatD{8fEOvRdUc4a@$ z*PE#=!{cXK)qX>YN)ZQP7)D8{m)~rUw_a=NX%#&?@pi@0*O!|GtRQ3^e(;18<1i_8 zmb+g-PD(-`*8laZ3o6u^%;}iZkm^LvW6(H|Gn1%?ZW4>k*E32~T4p3)F?g%r78s}M zgjC;m9E8yZZ#%@4tZ>Aq3nu1ln;MS=Zy)H4EKZ4$gVZPdjfk;{l&U>%y7>9*@s(Ut zvzEBbx80kYklziA%opKrjg$j#AjGlwE;dS=2Uk3pKkzI%=bA;VDWhH=q+EBv9zNJW zN*zynE>U!nnZh}wNzeC9dtGO8hX#%^y%Py3Ca~X#WBu&VJM@OlIq!$3q)~8l&xZxM zPVlW9^w2cY0#b~cq*QCWdb!P@P|pXY&X$e7&%CDk%)kmlsOT_AZILCVZbb}j^BrlX zyzw@l*WccHsCdxwDI8aFIHY8FNh#HO5t-fxRM*vX0`BB{&c^e2gepVo!9GaMZ6l?8 z4l(T6@{{JQd4m)MYbfhfW7l_Zmq9Y0Fbye*aZ<`pBeD8QBJ=hu9jX*@)L(TWO`PZ>N``{U2NgYY{!PAR#f)mSW`!0PQsRuX6o>(q^f4_-eDOfzz~ zk6)>+uxt)V?V7y}sUfh6k+!8BJcwdlXPS)9G%X3X3KqySdVc;1*`d4mIzLi_Fc=Ku zIyb$KInrX~mldDzUmRZJs=|CDXW>*rVqJ9%274N5v~A!)6sz%8s=|p=*=&wH6vL~w ztepT#D_Ra#X^=&O6KQGHP*;a49co&XztLT^c!!9Zc*>a^OdJQyLE~lOP}@&QsKyb7qkQ1;6XI5Xye&=Wv`35-TpLx zHZ(5`DU{eEl?}uS!{1Wa-jPzW4>tA{atS!*oC@3V&^y5};oRfbfC9J5%&Wi}G^#z| zK@=;t;?OqnV$DtFyS=X!ny(pQrzeL11>T7ceZfJPW7kNjN()c&V;1&_OS%k#RH_2qW|rI*Y?}q z+p?rcT3uhscs3nv1u2DlklH~-O0~b+ME_C0{pDivZJrVRXhqR3-f~FE;opg*kQz*s zjhW~Z&-1=pR#G0#&eLNT+14b>g3K})mvS?VMZV5^EQg7#Q5QY&s{fH?03qe0C zG+pXcHU~w~ILj5^XzMx)dzcXcDT+W+$|}cQuUqjv?|lpLblW5QZbeG5Jp&Y|8~Ig` z+PzK=e|mIU#{c1tr{147`i`c$vNn|qtZ^h8eIS=e<6WnU&XqIgzB|5DFzESq{!+wa zZpUXHU{;Y>MTwANb^||&#^oL3oHISc#3q&LeV{~At4iXXOb?_A@hgf7soX?VRy(hE zTTPc1-KMQe_q~m-rCY~=oq@zELGJOOQSSv0B5J4e5Y2;aVKEk2!j6SkueR-#&jcqA zLX{&Y5NOm$y(gk<2Dmm}I@CP=i>7LKM!m$3yBO0jNR_eRAPn^`QfkZPvbjnct|kZF zkB98PbvQ0IyBvnpvtB&4&aT{+mL=qI=&-?H{G%}Tem|}BvqJ`usx*PrdcTJ=^0P5- zj0u-GtN5kR7IW2O-=ZS$Q9j=k(h`Cwr9j3K1hC?G}!=8u@NO=Y$&x%50m=zWFv z8>{w>nUZf3AjSR_Qq)MTB8qjI4@*D&#&^o(#6XYV#?Qbi+cben$&X>xN zl0i-d&^SfFgNWj?)Jpdm7zj^!U9;()@TYwyTUu-&rGOxyZE^q)B8sXUqa``grUl<|u?9E4F?r?NG>+gWeErM5$h zf;?@BqOs~2k5B-ly0DPi5z)!KUx~v}Cf~peAdLyRClY18!B*!Kefo(_*T^MqB^X|($?OY8?%1Ht_aOH|&=|pf zBc?iMg;R!(UZ@Kve^E*8k#$u>KZFBPU41wRLpDiDF`YePobG4r60_f$o7bKyR#{db zoTx~w0Z%J`?hS~(R=%=L4P_=+NHOQf9_I@0MIrxf{GVvXi zJHyYqNiLs^!*c0aUuTA)6Qu6qtIg(hzHihY-W}3zlxXKvS>zSrJem=gPVLb5;Uxl!jJD|WU58s9q6S8B7vXR-b|4(~NfrQxR z^Y#iizQ5?CiQkNiWh6ZcsV!EdRN-K8r}d3S<&G3pf9KJ5p^cO0E<@_rLr6*Jl2T;Y zLuW_6Uvm)&PoMkBn!dI-^j;REWVb+S(;reQB&0PZsfj0~;1qvO%6|Q`#)((pTegWL zh>0|2AuI-KKppb znxWcHD(sNxRE--LJu=Hbk+UDP^}c@pjCjIYSpQmW9+Rg3wH1@)vJwhz|41yUFOU+F z0zZj*Xzo7Q>-b-mwtTA)w7v6eTmxunf*EFCF{Mc0lsT z^RK^FPsY_VDLIfd^5n|2OLYt%r|Bmo}(9z|zt9J} z5m_4t7jYfL(5zDdLK(F~dbbY*OMKPnbCO>)3EX=A6QICe9-M#_l{4wM=A)}#e)7Dr zw@)U|Y0Xc(*S=N$1famXUQY_77}uc&x%{Grt^_82IX5;FnMOw5W!H$D4q(mG=tGJf z+!u*+cp=3wC(NbH0y{0S^LWjGRY_bss7+Xp`4Ld6aE&^ilv+K0So{3StMo2;$im95KC#bv{2 z15(jIlLWDesU2%Uabm@#I=(^~N@Niy-J`}tz!?H^Xykbw2Vr(0m76G*09{}mO-Zu2 zZv$u1?tL~6NzHvikn+ISUP&`jO6!a3dpp?|2_KJDJv6l9)rqlwas*Oe*kLRayT(>N6dBW(TRSemDq2kKF5tD0a?P<;FAC+OAKN48DxhoLqQrx&uwu)(rDMI zHo~X$rJm|<=DS%<^Mqe4nu%)VzasqDqzbo_0gm20;|qyjBL|I#8$5_&MKPZ^ zGTtQ>f$3d8_HKY`C+b*qn+uYSp zO&15O8h+lqzu&oL}$Z8*@eT%!{;!{r(Du zoLeDf@g5fnBg95ZN!@ZSWqz6&o}qj8(_}#lPw1AHV0MvMbM27gJxfZlzujJ&GrJwz z>-$I5WH$2U!@=zbA@vi#zmCq5Qor((vfu2{KlQeMPMdx7U@oKJ_Z~>icfeR1Uy@Q0 z6M4^hMk|*(jyT1|@wJ-ytFD$nYUu%_XpvhOQ8pY_yW>Ah^+fm=3i?<$Q|oW=NB+yM z$hf+ZjDseEyyXy4M}D8K%bz=;?|T5_6CSB!Qy$9(-)@W&0FAWuc1p=hCzaBK{T^Oi zPvJk;jO`M7 zL%$<;Y!K^J4FX}vEZo79DApO!V zv^i+$^AnM31A5qe8%J?4@{&?J=^4eB9GHsvYw6!IDrH_X)8s(v2B2Dy+60<`J$Ml1 zkaK0>>45^#_=^*t8-58Nm^{Kn26}{}kR1Zro^|R*kk#d0c~_1@%M}-8V<%rwCtc!F zgw#9yHzF!!fD*-G_#+#X=OcZ^+j*C>6%YMH%t=EEJcU#lu$5zxI}Q=0PhD*3b41*RW&lYvdri^Zl>-Q-6SO9EI#F(9A#uC+?wA{kEm6b`}qGWCmXR z_~7Hr#4-a`D~?*mL1e4iq!bHze}`jbhyUAt2~Yb&0Xe$eN&1lL0`mqMT|qV}mAEIp zaKGkQ#y3hC3jJFx_P?;g+aT4=hoh)M*I9=@k4@Qj#1yKlEf)PLReQ0a>T{3)p8A2K z$n!f%WBIi9%A`assfn-+d@$OxbnNTlx8U}VjO*iG93^$6oRq>`ka<)0shN}o zJo}FUEHPj$;3&8&sg8aprGjXd4`!Gv%Znr?+0`R|tkwALuD)G=uA$DdpxlmvubCzjTMZ+q#oSzbivrArDfY zPvWR;vyI><(K<9cm%luCUM23!Jei8Wzv;3R1r}rh>EY*}I0_>Q{y#CL8Z#e!Ek$0q zhazv3Auqq?g@AE4r1~px6vY`wF zo@&EUnCq`dsXNMcp#wv_S(GoNpJnN5Mo#a+@zLj4HkLrdAXS7M=WTAT^PIqqggF zlTv^AZsQperG&pZtoPmKFK^j^I)>b>L0j)F`!Dx-ghJ{&XzSflay=k|bC#fpT7hl3y-k~@M zqq|N8_)8CwY#`?rXpHOh@Gsf;uhcr(_{+HdEA>Ag7edX!9N=A7>%%yT%oN-th;wKuk|mf>$sF|gXxq@!_v5~sV+z9&O4)XC9!Fu5 z*V&bSp^zS~{GIws5C220+e1eh?aQV2q}fV8Tm86GI*N^7xP{ySz}on68W#)07(zO( zzfef5)xT4iQnoaOTfPmgH6xek7&NUP|E4#Gv1Yg9sTZWN7;UMaoKCfN%ssWG1tZd4 zE!i++jia`2K+Y1-*4veTp+FB$Nc^4pOAr4mwN4Ld2W4JhB@B;T_#_jg$*b^;q45%O z2LOBd6B9lb@*YOCzto&%ZIq=)v&^9oAyG&r6qPB3jF~gf^Bg5I7BWNwl0;Ex zKt-CPfeH;YsicxphA4h(-D~gre6BrQ*E#R&`}?o;$9B%M*JC|j_v>EMz1jTU@vkYE z;b!`jo}p>HhQ`83+pWP5cAb=zWzh=eKrM)T1+ztRfs5)>KIxi08sg?Z7uE;?S2 zf+q&>!B$#c!k#(&`BwE=%wKxPCfe%HPH!GO4QnVZ%H)Vq#7;i&l_JC2g+D8&58teD zet1AEhwIU;)Gq($7$x$N8KamFgIP*R(eZ*Af)gKT|HTVZ85l*=>-c-q*OszEM^c+Z z8kQ(`hz}I@g1sO9PN&i%7)6lQ0bePuiw*_7_R*)r-l4S zp;xK#X*4z@_QA1F;nn1FP`i3a!tC1<_LIU6_u^Vx7s>((%#`2gq{n8rftq3tm56xa z{Kg@Ve{XD0<3L38@T;pBb%;qDWyo9iuPJz4a4!Lk7DXq+e<+$68Yr{%&3lvWAlaXz z!zb`L*~*7Y99BbG4OQA~38sJ-aiFX&Z(Q8e!t9WO|s6D&=yH&*jLt?~C>aC}gs+GTQC>Vm=67pNNJ zq3F6&;mS=>4LTI`f@f>cXi?A41-|*ZXi_v@pzj9H1HoPKIl`|{HG$b|R7%WtGPu;aIp5P+Zq-e&3f}AK&PXIOl5El?}v2aq#{? z*Y(R6qX_2UPW(#>W=J}V(xT{O2&qx}8D{e;aycxz*yVb==r6@o(df9Ot=Dsyn1x=pdgv`Z0z;=CwHF-$H2;88m@Da(tfPhcMdjgcFk-ToZ~GgPKe(a8`}OE8LNhH)b5^E@-oCPie9 zuha?H|1g5{6c~44Wjn;~hEZ(uw^L_Ghk{-!=u_PcT2ZdOj2gKd8Q)xn(u2G$^NL|L zN{wsL{1ROgPVJ=~XJ&Es%F$5K=)z^ES8CoH+7@pBC@`XG-eX?uYiy_~hRs6d`f^K~ zxGYynMvuCVc57(4qwC^Dr%HKy=t)s|I$rR);7JI)&qm9O&UHa*Ek@D2E;<=PY8^(= z%y1y!`H>Tmm8K4w9SSUS1z(8?dso8iiVZA7`xoyS@c)$8MTdf3=xjri>c1wc)4(nI zX0{`fU+=}`&7y3w(^w5lrcpHr58=v9QA0Wu^a3j!Y_zBp=as)RQ*!3-GP1vQODkvV zSMRJI;05N_6gV}5#&ML!Nw1IZ>7!Z(x21*=U%t8IE#b6f>cf+Ka_;?`y51GjZoHi5@Y_ z+%mPMwF1sB@RNiMN*F~*|MjmanBf`v6rBtqRfkbDGbH$EUh2KspyBDb_lhBplfZcu zlT9E)c*X|L&7d(lEC#O>HGI@j=(Kx*-{CLMxDzLS$_l<7@`QT|ST{J!AVeT+hiB4% zN5Kq9XEs_Coeck>Xl7W&C$daHIdN~-{&!htJ6PR$vYNr}4XVqbi%r2g2uBnFzIz3}L)XUzUMcPu9SV94(WkPmJBK}2mryKH%N=_tsH6DE zR}xel?q3Jd36_ur?gXV59SV3EYhhkAshULH_mwx+jSUQTmvi@du5^o-H-TMO$t0X1 zpf$&U7mDkmLqRXJo71Ew&r9F1wNc1PN)XfxzT04KHq2IpYRHp-S+SqKO6^r&^Nk_R zV!rW(bIc)m_qtjVMjls^D!&Dz7(akh3uT6MD3~F7yrD_a$q-Uty$6kEhC$O?Sz7J+ z#XlWkjkzDOGik%}_wYOWU=^LbfKd#aVO1zrU5Wo4PKFs2hDN67k2Qs9N-yIP(gUAY$5 z(`tV1U}lN#tXbwd#MY^jTuHP$8xAAp9jP&T6xZdBi zb^Mq=Bc>C5hj4x3%db}t8bgpSSWeb|S6AwG{iyLq{n*LidiyQ&9@SoBq`URtdgm>V z$z?6z(`cX(r}vWeKio0qeLJ^Hp!h9uxV}B{MuKtbaTLED&vRDI-D)ROeKm^T>`acI zU6;;nBAfaJ#V@>$>nR7SHoV+ig5qsI$2t+(fi1k;1GuE z{ij@7h6nkuaN;TzvOdS3{cOc?8~BMZ&{BxFzCg=C^ieG*CKFA?aeYhrvkmLj(PxZ^ z(gV1jR_XoXSDFKgSNnnM2TgZxyvu;jXWu>o!x%Vp06Zhq!JNIQ41i*@sA9 zhL3YX&&ounVZ&XRPH@-92J`qbCsV3{h#n<1RkXbQ>`k9aCLv(8!99h0^ z1M0_*haAtaDdpaa_KFr1ztbGo(<|cVJ`~+V@s%5KJ$tyPU0)mhb_XIpjpi6~IT@Rd zNZdmGD30RsknQwiGsY+TWt-(Cjc+ET>lK=Z>j6tdc4=(zLh+gHxPIU; zp;DuIAJX^Z>jO(Mapis{X3~eX^cUgrCr2_Rjy^=|Ga*nL*Do(6eB?afgZjxE!S%6B z$MmOsqz`gAd69Kiwzvg%ee%F(NpHufn@T04k#2{NTeg%U!W%s^ zEu=dOYFv-pT3GjW7g|q0kKU9$NhtmZKHfMi1Kh2&7_yOWp@jFd=aKTKWWiHNujIq^v;)#d z9F3GPoj7p`*C)Krj0I?-Pi+##i^w|Xiv9hioBgh!_}_S*oT~?F8(rUANBY)(;>~{F zaN57J7wH!GxaHh_Si|m6GiiMmslfa9m$eY$i&aMPn~AvIaw7YO)e0Vx??3SmE=iki zjU}BE)*d3qa|v}G3cfak#t-pxHm=)*@h#6euaEUZNXFM~uDgqt>(<@-g!Hm!c>LJ5 z-9{Z3(0w6Jo#spwpR|}9&%Kt#;rH(nwC@u`@O6xPePWlyy5;*(KNk3WkLoQUfqHMQS@O?q8vWodFnFvjO%pEp?K{{vM;YlbKALlKIKRcv%z(VUirts8{WBs6=}~z9ybamgI}KV%``{UT{o(C1b+{4Y1V1|r))Nu@{_@U_i@iHJ zOB%QP1jxR81jn8kB`q{h3DysBU0235NblAnS2PX@^`m5+Kknmi!4>^zz7tMt!}T+TRjLch zN#mz5nXC&anTPo=+eSL?+2i|~K&h;|j@r3ZD4%*;JpS?SRm2=KCZtE>brVdS4Pn(* z-h=XtGb6_f=H4*-D)ojF>3Mkl1rG^5t!3^FKzi7DJpSB=cO@V8R-^va3&^_AisV{ob-& zV$2+*b9)%R-U`d8ou3&^FGBqc;p0%az{R?;X0j6XW44#vkMO&uAIB7x3{kx0MzSu# z_p&Er&690NcfjwX$m5Wg{AmjVojq3g6XmlXubY_IXNAm5R;(y~@&GwrtmRYrvtLH& z`HN^MN7ltT92bdgc;SlTznb8BWRPU2aIZb;zZ5@5i6?ahhS?ON^_;MG9FOnPxjYed zo*DIHhp)F1ZZ~WtOas57e#(c)@e*-A<4Z2-cOX6NGp^UUMy`E6Ulr*&ct4Umioyc6 zE2Hx#ag!)HUUGbSefRxiawt9!pVtdmpJf!7uW80~qU&;U{DK7u3&)>Ch@ki#=D2?H zv&ZT1g-cL;*mYdLd~VZco;kFh5Eb6w`qc=5R3-(|bH|RmxPEJqzLo!nHK_ksc3khv z%E?<{*^c_(l!EK8B67;O7oqiyIHiH>zhX`gx%BTv{aE4qvJ}@>?kw9j1Eg;sA;(KC zj<*k8RE^I0M4td$*D#&Uy0VrF`KsW)QXXBVZ(H?yP(Ss}czkd`QQz543ltxH1lMn` z^FQ$*0_~4Pcf4*=lZnT+|9r%c;y2)RmR=<@y-L1j1nD05bxE(wm=~OU`ZDr88$s@0 zy5Y@<9T850C|0yYm~_3W<+!dQRMU9L*&oF(TaW8T zRSj2LK9TO1TP?1Kwp<;*AA-)?L~&PKe|(c&T=WuYy{f_Im&|zPm8Fx9$5H>G0_6CG z>m4$bvWlM~eIyLmcUI1G+O$~>(+SabWPMRsxC2|m3_AZ4WASx+(b4>uOLDHPMEzI} z8@ux@+Fx4!1Yn{Xbr(Jb4Ab1&h1#d zTX;?$#ec@v0flFWj-_((ke)*$g~;)WKGOr9S}L9>PuoOXf0ARDJ#IgV^u3m3eTmC} z{71jIVAOvsKJS)4nu5Y_J7-#5^jC>c$;JS5VsOGQCDx^=|#r5OIc8rfKUyXF@)nt7s zb7#P+iI1f9RzwTeQ?(3F7nq`Tk0`$g*RO_2ZM6C+iTW|c$N$o4`|BQum!kVl*pHt# zmj3yvrdrK)5XJwHBln}q@p%4+?z*#>PAFie3lf6AU4uSflu z;OnHSqMA$Wr_X3!5Qj4Hel$)k)>2NAMe*P9eNc5X_jR@%oE)hC?Yr>!DCS3-Vh^(; zy&B)&Rr4SJFz6b%g!JhBc>GiOuWETWNaIi%ujewx;?MWy7Le*J`-&XDY_GuY)~m-C zqJG>;alQ18MN7VbA*K`c@%47u4Le4j&o57*_-#^n{LACV&+Y8?L-7;e$+}w9&C`jk zufL=CSbScnJ)gI@)iUQ6igyMm`|xqD{wQi^ z$GcF{x)hI(TlL<~50Wz)4^cm>@O5l?bjgJj-E|>Iuir=Re|bV@@8!&OC{NfQYa!d9+xVIeXk@&u; zap&&P_ooFYe}Xe!e@*q8k?KgX3@o0w310^^H;Bvl{k~p^`f11|_pce3DXo^!f!?nm zINT8)d4ZV|EKUFPhv& z@ngwkePz7B~frULcjiO=_yJuki*7EOFX zy52=R{$mw8(Zh>$uKP8QtZRp#KbzS1k(AGSZCtOI+0y-TN)-8)5pn%qu$dpxl~kYk zd&&B$U7?qE?=jec;_GhW`eEs#lB~pC}Hmh6#s{ZtgjX^ygR~1`pv$?&oa2Kp2Myjxnu(6V@#IkR%<2Kag=jk zM7l#Y`5#vAd)jiGEvOOc<`uYpT-p4*=*{cM_uFG!f3QR@V`LBMd8#sjtgqQMw>ng{ zL>%?A|2kRM2{~M_bw-u6f9*a)*4K*r^NXAgL-UTPgs&UqeNRCT&E z+0e8O^)bUHdj;Q&yD!T2)*Rf2?ux1ru7giIMm?G0Iwe z(!uS53+mq;zhB1Ux1V?ViCSguy7tB`OMe!@}`)e}%Exai>2XqhQt|xF{BDW+%^eCyzDvpBb7qBG4-LHxH$(l{ z;QOQ5!_@&@wtto(-5Z}@n-}Mf6f5mzM*SFz;2b^|dKpN7|Y^RN1@%F~IRtZx&O*V?n_Iy!F|1N<24Lq04Ho>5-qoQ3(MS(qB*)vUaK1=+{+2W^5>s&9tYsyO+X(5LEWaPu1D2Lu9r==j`dK|d z)*XCq^4`%Mm_xelFI*3un#_#!BR%KZ+K~0_jLXI~9y@%-;t82jxNf}U?19M0D%6h> zJ`Nq{1&duUaUrcs#*XB8N2gttT^`>mQ9s)zasBl!r@2!OsLsTt2XKAp=k7-<<$k01 z5d0kCB$)eA*C`s^U&6ssa=erD(@uu-2`VU`CHVMpTFo#dBD66X>DE!ZIznmq$`lc&wltRAYGURyYw)2bRec|6!fXx9PZ_eGFv(|@1N&AAQ1|I+I?1#&2 zM-HR-)FHC&qP%|9S7ry&c`WfeuCGYvONp6WiNzBYlW|>t`h#h}19bi*t~rnE7fugx zvG9kdpf9YzI=rZ`G%|FdR4eB zQRWZnd3hCHf7cF`@7DejMWj6Oec83IVtvc!x-z84-NyUrd(Uz7jT7m)PZa9h zXb5HUk0A`j2B=!!DSTJuWnzJ zCc=cy8-&PLxZZhhzf#Ppd8nWDr^vcHOJxPOW|0KaH{kiWZ{(Yj4s+l}{=XgCmaycRtt5{|6L_5PWg+9yYqQJ(&iWPOK#x*A(koH+8;#Mi?e zVLm$^MqGb};*Xrc<748L^2eNSpm+m(oOrBJ2qzqn{DtC;@b$sN>~Nb(#+f7(FF8!^ z$K&Xx7Ybhs$54DBejh!Tr0w3%yXydokGe^Y_f(afFW0)!AI0y*^Y_$0Gqb=z{0J%D z4v+VB8j_y(l@xD@uVbF!sh0yib4llRTYP?bEk1C&>YEcyu zKadaCZIx0q&t^{`UE`nl2>Wg3ndOwZ0J_7IOL(f8!x*A5* z&w5>4|GYKv$5=-$rW5LB$htTG5j$xyS2?6_#p~d$lU|oywqhLhqrDA}_g9jWt(-*X zD}whGTo20&=!=tOK=CW$a6P?|_4GGCJ=Fhc9b7L6*4($ubT86t@Va>y{3x`%5k^`E zqVaQ%cmGV4wwksX>OW47+>a0OXzH=)xhm98i8-!|P2N4kcmzGi5zO#BePry5N;LG- zQ9qvZ@c1L!EScq!Nc%$La$G+-*46D&D1_qu@$u}_ekytODVHb6*B{?EeLV$}3-cE4 zL-7mR$^G~y^Y?gZ6T zzqyL~*?J$>r+#Kj-QP<(r=7s}JAeCD*ZdyK1QhQeM2`0lKA7=T#q$lO6Sm;{g@0k@ z{P{e-`6%9=6_0hBX9nIfo4>Ueu5rAFwgBOj}Rg1?k3qxNaG) zk}Y_bG=ClO@e>g4Q><-F`uQ1xJ6_L#tX1(=Jp80{-~#-*0;Qwfx$nu4&K27DeGELm zRq34Q$~NTdrcd?_94S2$-+sja={^-?JxDU;A=l~bW0+3xeTM6SK@N%1v84GPCWGrK z1?OxIpF&A zYQftcQ>1mt9KY|OT6x_&A3jCre}WgDf9TpU*=X07T&VvTHF7_pjyDCH3dfFOI?)`@ zKQ#Q)dU30kUKF2$?^B^W1+8Q!2-D3w`7F+F6vdkd;PKb5zEV8>^&Zl9 z4wCh7HY09>drnNKAFUU-uK(7#y&yIb>C156@SIZFPtT^SQ9owlc>Gz0*HxS=XBl|{&S6tK9 zM!FZien!bOP1%%QN9Q+!OEbBjsFkMqOj+t`D1PZ(T(^wu|K^jah;)%>xL%`p-jTn^ z2I-Osxc;WptM5=NDbHh)WIb9t|Hv_0skJD6ofobLUbr=_kg*Qa3AH0+J;r2?=xoZ) zjN*f&$a<{pg#(AO)k*75)C{is-W6W7&rS;U6M)w(_K<7FO^1#~)K73R9$&4qL!vo~ z^uED@OkDrj7aH&*@ht0@Qi$MJteJ95!Rv)=k z*p!RbJwgy(|HR+%IgbrDkk0=#+2nZgSMWyy_?Cmt;KYZA206j&nr$vT22B}1tnZw3 z8a19;c-9x}((tbm%%SXwQ*afc_^SkTDELldOnjd?#>~^tOsBCF>=qloyUr~LI zpc3#ewf*7)9-ws#fENlcIu!KUia|7~S-T{+7Y_?gA8m=+!;|`GPVTAHHsA&SS`g{3 zl*84V!i($K{g=Admn^nCjkmH>W$L_U&Ir~Rj8Y|eiBeN^ykLgt34!n*y#5c>O~b3~ zi1Mb#3eM6&XWC}Dx47o*8J3ZU_bWEA@I00wkst0d6xT(Ef?m$_sm9^lqq+9SCnLmH zwOGH?l*lRJevDOPyHy58@wZG;do5ID&Sh>;%2_ku>R|CCKXcbon;<}eyF6Kpyl$`f z*A&dqgFZzkLrA$}6wM4bI_Ece+m=7^`3A40j>wKX^e3?ZGs?97}Z!q>B4w znr#M+5;=Bw+}<($1XdpW74Ha_ zA!qN8&?`2uI25CpuEBFGg;!s*X3&!jp$%Vm%3@E%Zk?jVM)>lez9`2r1!PBmbL z?=UZ#)u59hq|nLrzhw9iMKiVd+7M(lsH@?~ zfBSpDmp79kmvchz%(5gLwP*u(6|PYeUf6XJ*_KdKbi81Oa2*7VmY2nto_L^G)(v9H zbMN;z1;0tf#)9)H*i#(OE<)5TxDrs@ul?UYv^zep&KQ{DaEuwe_jzkV(_54w{JVUh z5jS3-rs!N3%y0@(w62RzhW}86|BxZ1ejzVf8BUa5Rld6SL)ZfINe89JgF7?&I3nP6 zl^X9>!YIP@Ve0FmLjf-nHu{t_pQwsisH!ASn?O*DslBw5@#I3_1^yZr6X_kC*KjqZ zs5~7CdWm9QL|WAGwMBd%w}go#Fx6|NDVfCBh;V-cUf?g#g{fiG3RX*MuMaKTpR_%F zNmyk6OLJ&qZNug#njbLAvECk|2r?jJ$_(jHFhe+ML8C<#OPn1Zjol#`-MzGYpNyL9 zZ0`_QbK%N1htBK#(~kg3QH`_a9xXcAtCq^W6b#k55$d2JH&}>j$OYC9&={UcP*W~n zJA;Hyy^!!&^^~LKbkLi$#@QMYwI8Dx|9q#W=wt}5OC6*BONNlr!YG;b~XiPcz!L{V`6DDN^I3VJ2cr-b<5+X%>|m@v;Q z`2FTZ#P0_^>(jBjTrzEoQG{w~@Redj(V?IhIuX&NYQ&TYH6P!#B(uFK)(a7Dws7Fp z0bXE!aig7x!4;kpDZJ=V&?_0skS6uApMlZ5>35&2qowT}%%n~GXKn)-v20=zEmFBruXai7|Y4h6l6=u^4; zX^bJy=F;}Pkxg-bmGr6e%T6%X;nmf~XzvxiV3(QV>l>Um4$06SPcfI@g#rtuO;vMUzn=lmq z9na?&#aLSczEXJ6p`h0p`qYEp)iI}5`lLPC;*h*ySwO+>)dS!(39d_&`4UD6{8>Tm zrD&>Ax7($a#pTJnmZLlLl=fJ1Zblh$X<`&Z%I|+o!3@vSr|$0eCWLp}w|)@dSm>?m z?3i(XS_sQfWcmt5F`2{hNKp+s6!f}CpQ2L@NP!sx8qI377v1sydRr}%e^1+t(fM`q z9Z`CWuo~bQwi%-c?v3CpMTT@J=mlp8Xtbys9@chwALaG<8P;UVa_@?Gt5Jh0U-IV- z25}rp179h;6f8cxcD_`=8gw;xqC1*LYX6`U56BRl*)E4;6r<{ze@(#*hv`#vGK3U* z3ZR)`dxemCf?TToFvp2AMTrb?8b9+Q(1_wx#=M9!3#c=sLqRXJ+R&sXdPmEK1;ylgm@ zfxHOl48T}R#2EKgfb`IQK=(Pns-4OUeO)078OJBUOzb&E0UM6_>M`oL938Q@nqPC*B zOk5E|O_{7b^JtZRs5e*pdZCVyuB2xR-+@&IdRc4)(V+2XfftGlpZRU;-(h>zO>;A`sMX?cBsd&X_*1BonWZHUS#sq zaYSu{=M3G zw`FahA7g{doh~B_hKnB+%zk?!SM>4X5iP! z#K)iKBGW&95kQoSBj#mlMdRJMmmfD<1a|l;+#Rr&a5>k+R{y7c8=_n}F^cgzjTQUg zg1*9tSLO%vgd~5oK71gk`}{Nui9#nmLJTu?hV1c;k*v3i6h8&k_*^`o?DwHSxd%~h z>o6~_Avn({t}ANhYj@z57PaoR?dwf02)rt98E_?0-!O_T7G_F8edO?rUF=lku3RX@ zCef(w2)^oMT~(9IqLkLg7JYt_rq;(=nvH&=Vpz7kCeX zl6r4aDdnLTQe-gNdDcm2zf*!jEjTw}6gs7FJJQ%IZ-=+#23dJusqX3OpS{7UTro1j z3#ceXhDTszfyTN=jM|G11v2!89(1T&1wKtrrJMtPt_O4uJybqb%h<_^GW0>~2GPiX z+RO9giH6E$euHi*S98=-+h@K@l~$7|cp?XD@1YQC%KXaWpX@^L-MC9|ac%byEc5xC{vQ&VcASIynMQxaz; z1#Tpe*7?8y%uCp~h?+8}p3-rsi7vmfoK=smukGz)WT}Wq=smYIz7d?&V1~iyltRpdGzB$vP$BV=aI3Ja=BWOf z*vbtz(yxReDx?WSgT_zeiQ}b%%B8-0Y@hDNEAH%VRd0>E>j+hVnw*hvid>R=v$sCV2ner zuma4As0QC1p}4NMe@5o6sxbU;@?pF&ra!!>`(`HCSs@j!fKdbq@MJ|vozC3fFDk!( zP%B&K){`?E-Sw}n0p})2Md)D^@0x4WRQKC!8((?LvUuglPQDUTN}7G!cA7-Jz$oGp z8spII_wv?ORj!a!J@uM%rHt1qX;21cA{@lJc&%9ZTuY1H@1GMeV}JO^9bxA81)3B7+h)GWi{1N&bSL5 zu@z~VzlbH5ip!2JT7{@+FXUyu8+@gxyhPXr_W_QjKAPGx^QM-6b`I<;0vSOscpwLj zHE;^NQc#N3zke)DyYH2$)fif|F?CX{d3QI7DuWP#^Q|s;rJ!0XC5NO8UbHJ-sM9g? z<2!ls{v>$rf?ly27)AIB)+|bj!R~WE_wnjm9L=JO6yxl*#APi=Ua_|k)dWT}CDk?C z%jo6N`~G0h!~5^-I|ZKo@K}Jn;^4^@G+S%%LXqKx6p@#ci~F1Momo~V8L3FD$teP7 zHJD-CXAC0j>Y%11miYG@i7;EAG<_;`Na8^2u?a6CqT&+~b#x^)m0K>n_=IcwxZm=Fp6ja?m8u9 zByO(Ym@6hI)^S;C_lbRymqN2^5w#P%(+L_w1H1ziUV*{KL{AQuG$@?0$aQj?jH~G= z1Y;alV`mRWv1H{?Q(dYaFVjblIDTgedMm!nWN>xeqFzKL!gC?`&vCeZPvYh!`u5t5efbUoDKpOzl>}!9fxxGGoSHgtQK~40fxo1_;NGRLVcCzLhP99~OhVOQ zHU(pa(o0^DQ`a{^Qh9Ip&6>L`(=UxVlfeoNuWOe!v?37hfcK0jsYRzd?)CIH?dDiL z)Db*%{e54OCO?T9z##UYDb!S3aY2PjTk?Hbi^1!n5zE(~V|yKesNLWzXpB~HZ=tBh z7M%#8-n%m&g)bIdFAf&T4{f{5hNxt?_Y(*_%C^+h5jls~gg#5jYz=mYAN($SX?j;h zNYpq+5p)Boss4pI2^!~3a!O3X)V93I38>mrL0U!kWMUMt`w}&^;5Y9Q{--SkCu+F^ zqr0@l+lcZcDg~S_L1R7*_h*XhI=rM~ZQYwkk1j3JW;@WT#1rC~%ZoBhX~HOm@ltB) z(xskor?$sF*J5^DxBJxs%yB|e{b5Tt{@*b&JA6&yX^KsboNkzG|6^XixQG{t4*Cmo+)}vpYp?A&d zl*Gtpe%+^MDwiQD%>sF4U8MHnI>WfiI9}`A$+@* zzpLHt+&y-F&kHc0V1}7$7{$a4?*IkWv{on0r-jkfpy_PG^2^MeT+G5C2%~Oc6fq6F z`$I|HDW3Ce^yiuqY%C6Nd{*PPVULV5qOx2tijYrZL|sw-eP$-{)0f-sGP%~eexGy4 z;O8BoSJrn#Rpe89$;V8KY^!S(+w|^>kHV+f1bOi>a5{lhb}B|Oeg&%!WrhqpO%uDU zFIDnIIf|WWtI|`r%O!=VePDLNrUrHA1_M#+Z1{?`=nDgvtxXf!G23%_K(@8W!w^VTY)aDTYe z-uapE^aZ{bz>dyQ#5{OHr>F)U3VM}eUNkAu<&HKzW>(&uuk4S_=H1sHzpwZeRipSi zMsZ9-n!;;llwntyhU4RD&EtXrG4sFn4l}(%ROw=j5>|RbO~nQ@?S91O5MrtINrr8D ze%6K)$%7>7E=CdG!gB|OSMB_9#@v7twpZekZ0FalRt#GE35*3;`NK*W#bFA1`Ii)^ zM!6Y%iZ$qh;dk~(Y2DLhan0wp>TPB>2m)U4JCCRu47b3JOX=0%yi({!dn!j5(}J*7 zf@NAq2sgmF5X%s(i=Z*ouuxNK7Tp%lbNxHdhB&8BPKEunbgKn-7g9N-{Y#|pUsLe9 z&?$vLi=uN~kV=OM68_6|K?AF2{_`pbl*H!oqyDs9Mi_{r9zae<+75He_DxlnMn5^5a z8l%ySs0y&tf<}Bo;~YiD3ubs5QUAdUQg`TkEfPGKbNvESB-4rAH98xGBn`O5r%{H7 z+c1hCKx0eJax4fcT)HKU;6x8tI77NhhZ@uGJy0EUHuxkDC~I&gprq({!3;YQMayemS!ULQxV9WkhGX`t z=C68dvEHTtWw?(KqX=CzMlYQVp%>cqXl6*q3sU##dzle8pDt8C94x$betk-Kk;jAA zHKf(144rKla?1csQA0Wu^g{a=P3mUed4l|*KZ7oXJH&~LGLpAU)qtyqV?G=1$Dl=6 zf)@%eIu!JR=R(kEQ35|_d0gJgNEqEruX^udKc3VZ=uW!J=oyytIDEI5!b@6~A@|&O z^Vx%eh8r@a#MTInT#rW?9#O=sG_1_2DLP&-!>1TU)2pUTK4~DY();-0%yS&aPb_nG zUwRdJ9pu9(Bd$tnFFF}Quh$qwGebIFkeZ|KwduRcr@G{mudYWqCUceca#tR@1ZE?= zU&X~3MZkXYj-rNyutL4?Tn*)S)5~7wjn>=NUi5Q7R8}iS5qoG=geeGv`o27>1vpQEMw5ERWael1c9F_}<+OFXBj(lSwQ~;`JvZEG zDuVY5cvY{!D257sYN}%Q?W_t1S?<+o=X&=|q#0{kt9?UM4JSqsrG8OU!R#I7A>F-a zc!JnpjX9UvY?42oL!w$RiXaTvdy27fXO6W_u70njMD=oCiQyvGtg}t?5p@cj>p>$j zMpILUcmG`W^Q-FI-n}OHaqXSJ%bJbOh&p`&qZr`(+LT_Wc6~jxuPJM{U$y$?!biK# zwHC-4BB~ah%o(Y|a|Z?09$5L%G?S&@{rx45U)8&_9{4*ENmL_7 z5qRO*je=5i+uFvYxaWmJ@jg@Wx5`fP_FUj}0`GDIsv+x#RB9@GqP>0PC&kqJvu@2B z%lLLla;I}H@*@4tK1PKIYD)86Lv(Yh)j^J}gMkyA zBEAtjAA?grtl`Cv$ZH6m!YHb7M{6)g_gmb?B>hR(T*pY0gF_3L5!G}6QM%yNLP_zd zjvIu3|7QA7V9(v9+JA0(e!Jv^sOBt;;u&b5rVg7#207VfYk!JN$-ZYFsI$MaBN0(8 z;0}OB?0iE_9gO>`8(;GJnrO?%rE6wcwb(jqYY}w`zRLsFLk4)aDXxp9UsO5qz!wqA z$$559PxSxVd``g=P+H$rWVTqJ9(en8LtH_}7!R77_6VKNSEeBL|%u;1k4T1=mZ~u~t%go<4 zgk?yRij-fH^IZG&*ZZe8u=q%hWQ6NPC?PME8;FXNq4uIf0WWKC-(dTHM`cdd7fv?y zEzGy}s%$p8QhTQU7no0A^yb^>ATL=D@Rg#5X)XzR6CQy#o{fAy_w-`kvb;*klZdhf zD*$o}3!b{KYHTzg3 z1%^%Bn?IVM3RY-%T@KTTdMZs#Iq3#sQ%%Wv~NFGh}$;14})g` z1;*hz(wU91@?TTny4>=y42iU;-4%NE3(6{;9Je;sZOdUaG|BuSjWYDSfKe(IG*%m) zi$&2xdbtLFp4{*Ba(b@T7%5zes3_z`;2)sQuFk?ehJX(7R3ts-eqUKGDR$tii_(HgvKs#z^}ki)f2(}H+?DsPPW_jj_AF%NX4`jRk-aY3EAtc4yQu^g zc31#@*l4_)+N_!BoEXe?{Mpp)`t&o* zXZe0`kZPFp2-T3)nA+=G@{Q9xO^vsjdM+sU=r3HjZ$cTpo0^||6QhV68>uOW#GKy; z+tiuw$S*u=DLSFaVsHgKyTTEbiq?6e7>%)U&nNPJPs_s^fI}X5qoui{ytHmLZMBNK z7Tb73v>d!g3B7WHFp6gl{7O-IrB>!L){cc=zK!Ut=A4)HEYvOJ8lrMPV-)j3xK>e6 zzwP8I<~@I%cv!fSrIha&LE=iuIHC&Ss3j2Qv(Q)%%Whl{$r7C(GG2K=hUNXWiP}OY zT|^y%yEyp1c_k-!rSQuAoP2G|9nZAkJtFG1hi5C8<>T!T)c~KnK;v)%FBH^3j6>3u zN?l`-(Gx#Z-S>GU<*KqEs&N4Z5!gnksWVCnj4gFjjaN@S;;8Y}tSrl11S$<{*oZPD zu+XT+x7QZJy3y-C++9{4l5p~H)z+v_V7-9U`Q6Bi);N3~*mHnX3kPZdBF2c+}qeZ9gximuKeknS2 zPApg?aBidG#_~osy@f68?`268I6;8Mv2HtfrN~f#XwNfN-TK7amq#)?w_uzrglVK)4(Y1-;&f+ zMCL2Lsk#%rvddpiW`-NR6`8GZMbvdPE169$Q&UbEJ$4he5BSEXPI70c-jlAmE=gK# zZv4T#*!#iyNSWco^G}@GxSsd79bwE+Pngma7E5DAUbhxw6hj)kZxq)h(Bh@Ibomdy znc!6o;%AoMW#ixc08zKm8pVDDJWEhg#wGziONICNmg(Y7WK+$V8)|n$yGU%P5tRB0_T*9cfxm50p)TS zQ6p~PE5&tHzq0<;7h(C%XXYN~_J+Z;lB;EB5#@FfqZo8SbttK*2)60cwTvAzYor=J zSM*m1|Evdh6?*Le>mqDy=fMkw*V6SH^77+6y~Hdpeo0H%;+=g<{0yQz{4t0yyMvla zt2ovvbVI<}%I!gQskFG)DkrsIm;Mobu(8A?C2>il9?ur31ysz> z_a6H(iuGa4zox)-d0(ebc{)nWtLv1%CBwCMu{VKJf9FmMa7u>N@CEY>GzKoPPg7Q7 z?f7CJ=D{Gdq;0cn&R)3}!8muv5l~=kO!Z?Ffi3)BQ^3m)t}>v}qO^*2?yz>qt*Y4A zn(kdz7ZNADEq>F$%%Gh2pvb`cLKPF$@<5Y%jYK%do7_y=EaCy@29J z=P1TT_%uL4(eVNq2Ee=f-@G6tf+$*E+-!z2@kXq>Wf^mq^zP2y$0_FqpB=#OS%U9a zfHr@&9=uXycxL6$jjrEe*Vf*Twpt(T@aL;T4%ihSCEScr3SUg9DLP&t!=PUn^Rl9_5=37P8k=^WL-&W)t*6w-3%ZOE8g!EhBi6=~{Go(WSukd%67fs54Gn=Wp zp+*Uli_(Q8@!9Yc$KNW=up5bY8!p3_VUq)Q>mTf<D zS$_ReL)Ue{2~mP~sJ-Y=z$?avKDBgA`)Fi&X1xEtR_@K_)1NQQ7w17<`F9buu87); z4h6j8NM5w4k@VO`1JQ|&C#NoUb6!{TS4db5Y6ojL`5bw9!g)q94(U+9D`63RinHzR z!daW;B9XHv7Tr_(7B`FEt!qO^D`c|S1BuJ^gCZ<&8}{pu>#c=U8r zk__fFY%5=b7YeWRZ&OucVpjZ49B(F<`VVY5FR>S#2jP0SrxP*+!U7uW;hf*mqk7lW zHKt+>&bb#mY^?3b24ezJd*>m_9(q!EZBq?PDNbfoC>zbXJeHR*5){gH9IJ){6Fe7! zW?Tqf{v8Fp(sD6~CUtOb;FPx;b9^ep&+c{V>pRK=mw>wp?y>``9ij|qoO|g|z$?Rw zKJ}^S7ISM1&Ey77c+jg@2T==+sJ-Y= zz^e$(E6`|B){M2e_w-+^xbY~gtbga??A6kf@GJ@{FIThry0xwZ9MDdJKd(okQS4jtbYE_@Fiq@OZ3pd<)Sv(6D zKmW4~{)8P|HxA!J6kiFo*A|`~Q?a$VA#~uhR0Y@hO{Wh+E%NZn~K!#u^U`JJ}#=*#Z(1OUGRP_0;>*e zf|=lj!ix?Cyei;{0W?}vRQ0mfHwyhd+Ix>Q{2mK?;dZnGtQXKr7M*(u95lWcK!*Ze zm83m|7L_e%AImSd-@|_-=0&8&yu_sOD6pczv2hZ5fW{2Z9TeB~!n@LQ;Y^|Z;OF1z zca5HHS=Ct%R%%F9lkOMSN^0tAX4kZ6yxq3Fwl}Xu_E-h+e`p3zpBRPCq68KiW4`=G zq=dRkW)&jsrR z^g2a4>9I^vQ)u3fh`?0W}`BWX834UItK`2b!hyyO`}AAB@h(|W4N z_Vc2{?uXs@2NRIj>1qrjuwSI6wxsvAO^aOrW`E;@>jSp)O8IwIg3$^ytPMpJCyfl< zYSOk`Uuk+N`|Q5PNrSTig(^zd5LG9OC^qOxk)gGVn&;KeevQWm5B@A3NolG|8U|-; z=v7A=8?5ksDGExbblyONlw#oN&HE&dB^`?<&8AzRpLSC#2)KqwBbHd}wiVkMR z(@i<7?{}YBWz>eKvkMW$AwW%uoodYJ`KYARCBFEBrq0>O)^zg=Bn)15JUvoUl5Rkn#PjEVP>1LzfNtq+)y|0o6 zu)@K{#s^*~su7SAoD<2$nm1Hc!M5TD`-pcW{OK@QjRw-L#|EF9DJYJ^d*m~}KV^`2 z{atzcT&Q(LP|Qh0HIg!9KTA!mOU`=T;V=BiXMXvL9lQQiwT$NPK-4)!5Dl6HT&pO& z8s41i^-Q_Fp{Lv=Ie6%?(!4Jo;UuaDg9yvv*r%W#^xyu;HCQ9uV3cg|en|D&aJv{7 z6Y#pu??hCtKQ(pc!25MftNE^;o=jh>Xe*TWQL;7*Q5TjVik-$dOo~0-6|Y}!WwJH- zH@}hlann!Y;0X$PUFbs;{7E&+47ZIX%g1YHgm7p1$q1!bCeYa3Q_ z+*MSq?ni4-OjU%9TC~w+q90`05YX2P-068Fon_PS)T9jciw>c*Xe~ojH4sI}25hY& zQ=RBsqf;9CXLF*=L0`Me{7MX}FR>aM-HD1MfJzkG)&DmY+QVm|ORLyDQ;=x-r&e!& zjUDT3|JQxNJsO{1#r#0Ufz30rSli}GKPe|Q=xB3h*Kqw{Yi$(9o+!cg6yFy>#gA>V z|CF5VptR+-vtdjefW^vU< z?RBhG_wPL|-d?=Uoxhx+m+8X;5GzsusF**Z-(<0tP@%D&yDqJwd#sSFP`BoUQ&R|Q zw+>rU#Vs!lG#09Qfvp#4+u@CVki`nnDN~ZK^tY-@7Pj_RFgn||@y=gdg;o$)+fs#o zkg0Y=v*pLW6A+d79-g| zLI+eY8GvfB^-wx}!|<`%rUxzUj_)~qOZ+i4%f`_KG ztP)G+Bur{w|3a^-v22u~*AQ4!;XpsgRPvUyg$hDxHl@1Pr1@7F3O%x+ssyTXdZGy7 zM8_q$O8Ck%?bA$(TnX;ssTb&^>S=wd@d~yaTRqXngRXSss^I337#jbg+cyQ*25XgN zeOEFmL1#YJ!&m4^fVIW;lxt;<%?%~hm!8ek_&sjCJ(wtzH3n1__zFPZgi6Vd%YUK7 zM9dC-gz+9M&b?_0=vl>LRh}h=LZs0hmt3V&+QM#sb=ENZYS;XHbxQZXPR7GP zRV58ntI@Mgt}2VKVR8BFrYp2p-6w=|YlkztJ$n6*#j3(8aWYqGh!c+9@VzFx102R|8O4WX2kFP_630Cq4%u9AuD#pL+ zl0>UWqUteF(cPg`9hoXIDvzdS7wGQ_trT3N$6Qap8mM05Glg-H`Q;bn7I^i6b{)^Q zQqxgxxx2Bne+WSJ232EiT{ikbmcw&~ANANvn&dC(Rxy0Hjs19H@S9?xv2`p@!R_kYq4RPWKs z2y5&m=m(iftvhHh>lHmoC5ysGHkopoWBtjiP!;+wC;Q+Ptc2qKtU}LM1NvJm))rG0 zeezQ=Gj~+nHmJaiCiJ4gDtT;Swq=7Ir*nTTHc1+J4tC-(jo1 z-WJX0oT_Kn3VWh^KNc$pt*5X?v&io@OQ_ITjm}G}np-^<(ziXH$yr?}rP9s1FNrN{ zABYuA)zx>uk*dF!@*SD!J!h4Ui3+clF$1xVOo3Rmr_pb+ z94?{4Vihf|5+8WHWqd&Im9dq~dF7D1sx30X-$ATU4WMFJNf~Pi6&kC_cWKp~{=(*~ zqngUvB3p~u;#A)0m+Z%?6!d(B;lF(?HkX%Bp|P6(FDrnsytTdOdClhD`iH}h)X#l+ z6~03OjfJVObr5Z|2hb0)94htSPERO0a`%O(n`3u_TT`7?K3AT7-{IKx z!y)+rNtJ?jw0+Vqwq4m_31YQw!6G3DYZv-Krn*37pmy>2J4O?EdP3rg1oy7Hw*^oY z`u2pOn?w;pw_ARt6rh4X-r=scW%+<3qbDSpO=KR_Zwdh#KVvXQC(JFL( zB=6x8Dl}GG1Thq{nCeQFw-nRtaBs6|?VD8!+HQ^hSiykB`l$j`^uv^~mQbOw+R@b% zYm2G2j{l-^5p|m~nG$fZu+sPGw!C!(WWF7%PS8e+o^|r$;&E=PdH%}i>+49x%OVK7 zskqqP9-!(7CyJ2ujg+d!+)FkwKGd;%1An$S2ip8Jt5UiIR3EV`D73N8pdVysSve`^ zn`f+V&Jz}0<`VV%TRK8-3V`a9Hc^DIW2+9CYD@07o?6NfH7((6Oq zMYWuATAE{cW!|L=RLn0ZRV5qEh4 z-f5bOoaYJ4QCy>`kQ!}&kr$mASP#4J6Gez{2Bqqu$KH&v9hd5)wnVFz_Q@?)l zegs2lS;C2U1GXAmRS8sl>69v`{3E9As;&Z89VD~eRJNau-^q#Y`PgywdI8mzMSiI` zn&gu|I>yYoGxzAO$I^zSQtuTyfa(igInc&Y#>#6FINDg&X1JPxW$x-x%ZO~}EAMgD z2M~*H8>PzSGw)h|*}9<_`qC{q6;cz)hz(vxeLaDzHdCrL`Fy3nvEf3JL!OxTgV4~% zZOXams)-#}pB%2*PN`ZSQ1t6LJ#Vd-@h4f&!4~h?I$zY9sQQAd&?^u`5-mQqqstFr zvr<@NpR2?bSMVS838a@!DGf#Goo<%FLmh@M&r%wjd35J#19|{xBgn#+a4F3R3-xJ5 zNds=OlH^Bu-OfxkCxi8X!*~5HD6{xnvA=gY0dS2Q&|X`jah*fxMZoQ9Aon?cKz^Ei z2ykEMe-Ho6SEk$TKLFq2PqN>0!**?RgFIe5o_$E-Dn=zQI=njYMKp0UF)@u0tLz9l20M4F&~4s0s4dGKX}g=}!Xtv={&JoBBG+571$OHiB9&iL0*B-5(ua z%LMFiQ9-_5QUBH{zDK}bm>zNk{y&B6q(=$NO(8!k5ivE~iVy95@FjPujag<76EE!m zemLOE`_wk6u6&=yi67TFcmmXHd>0sa=dr~WZHZMR|7t!eSF?_FqL)2bvyOv2EG74B z_!sO_3q39iMaZM`cnJ-k(4rROZt!JuY85wlKiAD#0d5Fiy0>@Yh+>by8GMUyogn#9 zU$@&ynB^!o=}t8cD_j9)pITBC-?Ty6!7`AQ!;|jU23;F#Yzb4#Is{lW| z@a1vp#dq37isd+gA8(j{_3o0mjdNlf0MGR$`O#q1+tuPVgm2MWC6MdA5aYS52?|d_ zKlGzvG8FfE;kOR(^9a5iP~(1}U~hbd66lX2KlIZsxK{d$FX$(dYE9yrv^8_5Or~Rj zz2<7j&&bdr?TzDrORGcvq`qTd0KpgIGy}-T@(jAB+`+siSdNhRzU`BWAFo-Ui#XP@ zc_Giqzj0Ds=N{lGe@R?xMffo@ulwCZP7sGLv(pm0S8lvt2U}Xv^Q9yK?E{*2=6<3E zmkxxWr;wi)%C&TOVn?(`9D^ZG5p*s&t)@oggi$!&_H$M99=-eoD~-@r2h6&kc=$4+3c4A(Io-I!0D7pIH?pXMO>*ST=o(0G`1YdsA1QV05NrsdjI47dOs&w69_ch~P1!2NGBCHdDEAM3t9*oJL( zXv?&Rd^aNOH-Fp^aP2n86~2ju&u82LJQBW4Q-AMEFB*w&cwAi(lKp{QD%8Fg`oTOR z2+l+9yleG`h_|4aC5XZG`9RgzLd&Q>_kOV9Lz5y1D;2NN!sTX32f-Tj``tzPqH^;*3rBsY=rN3&hU5*b3{Em z#D>7SjhL>4_CF3OsO;aX3F0Qh`C_y|P{!ESeHQRba33@}ofGsoBrKoE3G7}ZKSsAs z^4Gh)Spd8rj(?;3v5$6p)8gxcxIVOhr@d8+=Pka!cuYY)_)J}`=hFy?n+C_#!HrU- zB_~Jl{G`LU2X~jap1fe34C0!>{oJp~Opa=Zh!2Q~oQ*hU*%@yb+5ZVZGjwE~IQ~~>`Rd?)&9EnaL zaT7NM=^sOb_&ha$$7@p6Blp!b!Ix-H5Uhgs?KQvD-`>a92R|(mH&qN^3^B0;`#WJq z2=aZ8BDc3`6aqhvC6MbpoE-dq=N;Z3I4?|1K13EAP230g0|997lu=;!x=@+-6D`oR9k4iYz`vwZWajuXA?K^tN0 zKOXORe?;&PzMuM(L;JEvFOM9?|M7LirGUiEscbnjq9fiC{UAQDE;Z+QmG-!*57Y^S zokq}}_p0}Y$zc3P0uy+?%$1Hld{C8u{`iQsOD@pfm{02cdqj(f2?zi4Z&z>qGAkF< zb%X*1Xy3fARo;&o-$%TtNZf+ZOuc=#R2uLzdlW{(aTuuvTrduDuWjjNBf}Q~m+vBROSh`^waQ)id^GzFx!>%}xgZZPuL)+R zByL5ueQIZu%|` z`3B^C?Qd5+J}M6UZ-wL8Mt;QrJF6zB+X*H)&_3bEe6#pCUe9pAb-;GxPxly6Oif`2QUO`OC+f1>Gm`_0tm03){xG|4dRj@cq$wC$t|c{Pvvg`ZeJH z^Z<$5iK)r`Txsb9c*Hp5(lLxtAv3!{T#=KItIU1V@v3(RT;Va~Px1%W(5%C+NA%T6 z+@5>ysQ}>~FwP0#@I2ZJJ&?;#oyGT&!IjWn_%y=eT2KS}b6y;BXG;ma=P&3$+yHnU z?PFhUr?oln3HUf%C+%|r%n1B{xdE4h=h6O+__&GZ#uUIsoLtz(M!KPr8 zQVGXCjSEV$?*I-Z;d_?xBhq{un(>x z**i;cvk8=Hg7Jf#f&F(@DVXQk%XJ;MH;4A_HUoTXf8zE=aJ_X7IQ`t)Ilcneo5A_( zB9vH@GiC$UB?9M5k{_4tH{~sabLD`&HzVX`qERx1vD1L>{Lennv$5jCPrObRhx@F{ zWrv($mP~tKuNDaXd~4aHeeX6E&XpnmVGuF#>rFh7BlqS>+?DCNIUlFJ0N@5N53Y(a z_hQqfr+^<>V`%RwDzGJM2GpyF>kG*J6TI5OwyXg5(qWLtJfzJZ^VkFY=PN><dDL{H~ z{-G4)xxX43?UGr6y(b+1Zsm7Q%HOeTCUV3R)(P&;EGLr_HeCSrJmn-m?kAaATy`ZJ z0sG()$P+4M7+U;59gAG~3VHJyw`WttKmSMToTG4^aUW!-Nyzx}0Qk9h2-;8hZ#eiY zEDFT6=pk_r^LK^tpVtUECS_*%oaF;6CM!FwWZG=m}QUlm?sFUoyH2uN9C7b}d~4_0CvUDC1NP%EZ-=d{gL-6pdH|ozfcD;pEhG3s@pZ|cAM&Uqsrdo} zGhna#7V`7n35{<~;PoM^8su4*J)hMEfjl60wIQF1UR$+yIt27H1MZuL7j`PDmmS6H z!z8%A`B)y1W-5@Q1#yQWNPc|Eg{llU$bxx?*ea8_Z~Q^loNFU|z`w5}!F3$s0*}j2$$!fc`|dTsf5;A!A3tMzrrk&g zzK;FlhTOV}r6~CqUZ3m3F@LG98yXw< z@$0_7Fc1F93Ar6%9;3jIz8CaUQPv}p|MMN-$G(zy0G$@Y-gh?C!2hmKkgI&LEl&!K z0DL>_Pk@GXo}0~4JnqzgelFhFGSo4b2mI@DK|im>TX!ox1p6tn56+8#{+@$sy6CH* zh%FkfOM&)wUJ9-e0f77PlKcdgE76zk_R1h~f;X%yf>QFQZhS5Sbp>IdoMa!=HaaN% zN>&!wyTJV=n7?S&^hO1!lM%aTB>UjqI+v)=OYQ*n+g?L%6x2E9c1{Fv_72EBL}d({ z%kcAZtOWAgB9E<^QcQt8_fg1uZ@9Fjmg2{C6OOkdvX`#kG~>nBb5$3T{Sogc)pNpU zRf&F(yCaY%aC;v2mQMx#|K2C@5bXtmtq%Q4zz_41c&OQv#MD^HOMnN@L+<{1!{!U- zyuiN~%ztRA{n;wZHxGfm&lPB&r|7itS#UVuJm(-E){2v=O9AtXFenfCWSgJYM8s?0 zKM&Top)-x;GXX010Y9iovJac3W)EPD`3tzOIEja+T^Noo4ci8|_hAx0x?`va!}A#NC;VcQx(0q7cRQA3Px?j>F0eNMhs&SK8CcH1at4+&u$+PA3@m40IRncX zSkAz529`6hoPp&GEN5Uj1Irm$&cJd8{=dk86xs{yh6{GHS%76jR-R~xtekmoYUTy5 zo)d=Ic3;t7HnBe?=#K~8UF^@0+QAG2NN%%_W&`~H+i6!DQcF~UCms+6?2a~>DosSI!dIDQU&+5e^=vL< zl`;Ga=|D9A?%N^jvFBUJRA1gaeU)i(U$tc1J={y{c9rr6}-5ycAQfF)G?=&I~Qa%_sP-%D{L==&1O1_WjNmZ=ZIefU zZ58kA%VDJccDT-kOyb#_btzZ{A(#dJJAMhKtB>xpcN1`>_)TW4>p#B%~-K(=B zU3u_)ZurmsR`;f9lYyhaPeBv3?|r#S(Z!em{Di{uQprb`zLGWJL+{nl1S7p=%7Pt&I`zo z(ApJv78(Jrzzlh!Sd)WIIzDcV7$I-!kG~eTy$RTx{vh!h)>npiBq#8jmH9o8bBpVg zRb&4)8QKVaDUfdq?iu0Rj^6~d-T`^$lyoj*=09Nn4cjd+|l_IDB~Ejqo|aLj~KMi2Whhz=tm0>{u7McJqm3 z&`&Ms|Bd7}cdMlGn}FN)lH$IR9*eQnbi>EV`S*}(H7*=?evB<~Xdb@9@$hziyLa0g z(jUcW7m)1VZaL}nSDqgqhY#H#-+Og9GkWzg5I2Yxa(hDMuFdxNc~^z!j_ZJLZY1${Yge9;) z0Ow2Hy%p)9T=m}p_k-iPens^e>Xg!Hz+DVTe(H5|0YPV~+x)=KNw{7$vRLqp87<)Jn`(+;rRIw*iMMp@&-zR)DSTeAPPIN0|Q z_e^MSXm+^L#Z>{=pLz>%+pYJ;^Y4(E6Kiv#qC*VWqAzI z9tl;3-1!ZgVO`l5;Af*OJtDzFbxhP=2!NZ42w6x0Me zxG%R1=B2XH{R8ukzzrXUY58?uJkx>-JUoWv!Fk%szRmlCwhO2q5PxQp|5m9q`h~7` zybdw#g8YoKqK4(qY|x(#Nsy;qrV@W>bp-I>&5-9`t^Ip48_%c62FUAY*0Ap|x&)5b z<~rm}v|=eoIMB-{tYyG;xV1+tGMyvt84(k_;c>NzRhDGcXifsY7y55AyzMjA{RLb| z5!7o){@X^bZ?@>KN+Q}LR!>R1UCeM(6=Nh=X9$5kklW-ZT+n{`9FKbx@{25vJ+Ybi zx}gW>b$i~=)dC*j_(hckT*umLyViTQcisbWv(J(IbZp9$s^-0@0eHrJ$c^{r>8;Db z^QNE$x$VPd4b7E$pg%tEArCGy>Qk5n{s}U0Ja-hZmv1a*!|RYOdC1lhu1mFf#yt`rtbMG0{ufw4xH^nP3XX?Z;OI;j2Qc zdx8B{IA1<7>BYY4+uRQPyL*xRf0B56qp4Ud4e%hChfWbCw}NY3_<8q*`$E?yi_WRq zBPqcD5S$lXim{)Ig(t26?p#3f-*uw&iAPPA;?5*H>(rvkL_Cfe3FyE0dxc+q8M|QQYb1MRI6@EbfL6XuR zkh*=q&&e~8C)JvrUbg}~v_@cq`&5rUzfrgpE55%J$S*y)b=GtDUtq5V`}z50 zcvw!C#SXv)jzjy}*qWyBrw4(bTc03*t!qEU)Ex!vCEt>GFTd?8lRb}}fxSTtO(W^&2jmjezS5f-5|~eS#hX5rI4L`b0+!+V3w;twL(Rc_AFi zfc(H4O}Qp35zzmCa6I%`#7XCdva*7>H;thE&7Gqkw7IaKo6ves57s$-4d#qb=)6_| zeh7|-zK)*bF`IvWAadk(1<6nU%E@n!gzlaN+zsx_{i|lP84lmd0e*H5Li^R5WJ1EK zf&e#y^SYmn|7t(C8b00%>7jjW&c5ayyqv)QEx7*o$1D1A96a|4`1z#^?X$TgWVi)? z1N+>SB>oNg^|fQX9E?LG=?>(Iqt|<>9^3- zug62+dH?p=cEc`(3;6n<0N0-Z_j2Zy)i1k2KaJo%J`g&W|8C~eW5DNO+=0k_qkIbQ zW&oG`kDoVR`1rG`jK~qY4Wxb!8jjukG{FY0j}R|=$fMcBQbzIhfuK?a`7Ieu)t}j` zf&cAmNqlH^iOy{aHhaJoe?u;Pd#JbY5?IHO^H(50JZb)T?OMD}P9@=mAJh?>6DwBX zc{q2D^dElEbmnW#y}LxamOLfJPD@wyszhVEGHq3*j5w$A=w$at;|% z#RL06IIoBM`#<}7B!csT=o*mxjLzU`D?`48*8P&fYJ8s!f%9(kz-+I6$F&yVCteZS`;317>}&U# z$O)?d`S;UIyY(mz)B{K^JTIf?-xM|FOP2#bf$+L=G{=@ED2kc^@Ozt~|GVtJ997?x z0&ZUed9{+hu=JmofO`x;{`IX=^B>~}L{8ZH7xEtgol`v*ssNw$fP7)Eluc_ZSZ@(6 z4iXv=3Zu5qCf_FgqzaNSC9N+kIim#!a@c<8SQ z;(EdLYTW#_^``koP;V24en9)QO2L%8>G$BcPQmqa{Ga>&UTK~qz>fDy6%rtdK3!0|Inb!P6@>Tk8c{wp`h&#VVC{UcEkFg}qixWCU{ubB)A z3&VdOwuAkdO*@<9oWo84{k-`S`nmCJvhPRZIlzypkT~fZeg6$!V*!ih&*cm(XJ9!4 z%NbbCz;XtbGq9Y2gKAn$bTc807$cTZP>nAp5h0XGRsd`;RJbjj;1( zFFW=%?n#h0`s@!;^$Ms~WB2~ZRMmrSnhg=P9Sst8Ki>WIj*R4EL+>zSsxfzfW3r6G>!<1M>??Otv&XWJ)U^Gq z$5r@UE~z0(l^tJ?h|*3ek(85fUb}12<+5fY20-=83&i4nM5$5~yV&V&ZO_S2qaMTY zxi$V#MiQDctcMdkK*fapGEbI`Gs+pg>g5yjlU`!)m3Ve4J^Yt~{_ajx;rE#svHRd; zDrP$stLzh2zDY99d;*@dDH@7qv_Lf(4q{1}P^w~?jLv=J_#7kkO~31~@~rh47S~Ro zni2*oS|3W)bc?C%TTY*Q6JgSpF?AiyQ%bG7a22Y?8WZ*;7+DV+nslGJ^on*gtF_jz zjVuly>9UOms_9&!2w9Jg6>^nzbEvftvQ8$lc}bf!>0>va_({r z1(ugM)}6c6HhvygO#;>WCQ4Oz z)#o<5rjaqfg#1Y_5!$cox4l-=&z<2)*Bq#R}X5R6f{!F0xol zsL)s|z}I1EJH=;!YONh=jkb+<&<`@z;P18#pN~j*g|M~`ROjg* za=dGd#=v5&!{!zGf0=YBRUA7a!+Fxq)N*Hg?zmuoRV(_0U;$7urV>>MH#TF)V)d67 z55LtdtvW{^&|T8_@IXl2zGFbed=049pldO?%EkD2x;jsO@6X`+5)W@|qeylr8KeRuEhco=jYzgS$h8rN(=IfNP z*cLvyjKp`ehhCD~A@oreX;-M_1}YAGRx)F1vL2QXa$b{=>G;-EL+7X3-Z5;la+@_! zaS4K0jQo_UNX4r6GX2z5x6bBe^3Tj?w92}mB@=eOxN(&&6QycGnYSTH^|e*&CKo;l z)?^dzBK1Bi8btNi;L zYKs0Dau@oIHAW5e<9}13J>1$x6fLUC+5fHkAL#M zIw9z=C{S(3dnojrQdRNbgGO-H^rg>kMf?mYiMi*m3!`-t)%OYRF${n|jO3YMB>J)ZMetA0%SHRDm;^CCmE=y}3a3V1DQWJamdOnV{q za6c=x&$(LD$hS?eTGLzfflBEfh{cRO$wSt|7G~OP zgRXE`JFo@)AX6#Kar5qA&Sj413=4IcSbwLq`6haChN)D+m`C`sDOFjf2C9xF&DkGE z=k&CZN`sYA=>?wDB#n6S)p%-<^4X;pt!#*K=c?@W7w9t6Wjlk;&8*HbfC! zLp}OU*25)KXe`ZDORGZ9PkMG-e|mVu!<{X1cQ=WvK3BnxE0~XimY%5ENqnUaS*#^g zSgekvRh1sD*@gqb6Ys>CytMpr#u zFFLv^Ai#$)Kyr)22}Ka=Ay(m`#q!rhs>&r)XsrF9`dU(z;v^|ouCYd=hU(g0#T$7_J& z==w+=YY7z^OWTDQ3t3cUxGlLrr^{CUgGAR~v7J0U>3%CftkQI%iuz*mBC!@%p|NzZ zETEZROvS+CjVX@k-yhU-?cU2Vrz*h-ByIx6&oOw~7F{zusGqHWUSUcRygi^ycI z6U;zmjP5O1qsNYqOm&5GhGuI~#QjDWsuYFBI2wByYIJ$QdT2aN6d|h?Im?Nx`&5S7 z6k^v0`Fd2pOliJzMl%VhOfrCK^B&4rUjN!tn@2h>o_w(Nn1c_U*~*jAc)ekY#Xy_5 z4EjOVLm~E7-lzvOUHd}|#H`GpJ~-5$o(E!?;#Y{)ew3=aHTxzQdL+!|&)PEc-j43F z`C9A&RAzV&*DNwqSQ|GRPP*Ow*IDcL*{O2+^i>(JaG)~R!up3GYdp~pvK~I)Y4-fA zOl=hP*i;MWK<-nWgppueHBJ;Es~IR&nJh}W_xyJ~_sh+D^PwyzIOq0X8lbYc3RG*3 zQL4<0ZaSW${(U?lsI0IR4Q;E%(GN0JVc`Cm zUbn39TI+i+>&47HS`yi#Q5E`YPdAnYvG&t+1KiyPjW0 zTm!rBGHv~d?&8>SS$_wrwbkf1S*&@%QfqaWs*If`udmHyo``V>6XF0Wn_ED&%AZp8 zMQuma3MvQ zY6g#$O{wbTJ(2h|@XYluhrW-+XRV-W^QfT(Dm#4t;#y>1_PcZ0VOS%a@v!E*GfqM6 zN4U<+h5?lW8WU^$eCP*RHVnT6eeh7My7o!E^rnTAz`-Qv`zk=?gsxRsvtDEza=qgy z&mZR?e2kpewjPhKzS+yM8>pN?MTG3d#y(lB^n}U*N8L2Sfuu);N$Fo+-uB&X093A= z#88NiIi)kgCAFr4(OpnEM=@M zgncf3KA&V&KN;N*)mkyhZ*7wcVuel;RrC#5F3Ea$ykPAsfog-^UQ1D zfhrtS4opA#C{@p$-^q}=mJDBMOMJ{9Z3e1d zI!aZ@+iOv+zTxlPJ)9+FA1QSYeqf0Pv5q+rRdly8HCZ;sFQgwWRQ*%M-zpcF({(0^ zd*Sy^po(xHs%Ol90n z7;eci=l3vHP5sPnu5o5snFXjKLx?KG6RWk!R0;9LRqTx;gSIi8J3{30{W+ha%ONpV zR$n+s-~kbm(R>5#yobk+5LL)xzhV{Na`f4;FLm$7mfAJ` zOgpP(`1Bk>tm9Ke)rx=E^$J-J Date: Sat, 28 Aug 2021 16:31:37 +0900 Subject: [PATCH 07/41] =?UTF-8?q?[REMOVE]=20ignore=EA=B0=80=20=ED=99=9C?= =?UTF-8?q?=EC=84=B1=ED=99=94=20=EB=90=98=EC=A7=80=20=EC=95=8A=EC=95=84=20?= =?UTF-8?q?cache=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dependencies-accessors.lock | Bin 17 -> 0 bytes .../7.1.1/dependencies-accessors/gc.properties | 0 .../executionHistory/executionHistory.bin | Bin 656977 -> 0 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 0 bytes .gradle/7.1.1/fileChanges/last-build.bin | Bin 1 -> 0 bytes .gradle/7.1.1/fileHashes/fileHashes.bin | Bin 35097 -> 0 bytes .gradle/7.1.1/fileHashes/fileHashes.lock | Bin 17 -> 0 bytes .../7.1.1/fileHashes/resourceHashesCache.bin | Bin 26385 -> 0 bytes .gradle/7.1.1/gc.properties | 0 .../buildOutputCleanup/buildOutputCleanup.lock | Bin 17 -> 0 bytes .gradle/buildOutputCleanup/cache.properties | 2 -- .gradle/buildOutputCleanup/outputFiles.bin | Bin 19289 -> 0 bytes .gradle/checksums/checksums.lock | Bin 17 -> 0 bytes .gradle/checksums/md5-checksums.bin | Bin 34497 -> 0 bytes .gradle/checksums/sha1-checksums.bin | Bin 130805 -> 0 bytes .gradle/vcs-1/gc.properties | 0 16 files changed, 2 deletions(-) delete mode 100644 .gradle/7.1.1/dependencies-accessors/dependencies-accessors.lock delete mode 100644 .gradle/7.1.1/dependencies-accessors/gc.properties delete mode 100644 .gradle/7.1.1/executionHistory/executionHistory.bin delete mode 100644 .gradle/7.1.1/executionHistory/executionHistory.lock delete mode 100644 .gradle/7.1.1/fileChanges/last-build.bin delete mode 100644 .gradle/7.1.1/fileHashes/fileHashes.bin delete mode 100644 .gradle/7.1.1/fileHashes/fileHashes.lock delete mode 100644 .gradle/7.1.1/fileHashes/resourceHashesCache.bin delete mode 100644 .gradle/7.1.1/gc.properties delete mode 100644 .gradle/buildOutputCleanup/buildOutputCleanup.lock delete mode 100644 .gradle/buildOutputCleanup/cache.properties delete mode 100644 .gradle/buildOutputCleanup/outputFiles.bin delete mode 100644 .gradle/checksums/checksums.lock delete mode 100644 .gradle/checksums/md5-checksums.bin delete mode 100644 .gradle/checksums/sha1-checksums.bin delete mode 100644 .gradle/vcs-1/gc.properties diff --git a/.gradle/7.1.1/dependencies-accessors/dependencies-accessors.lock b/.gradle/7.1.1/dependencies-accessors/dependencies-accessors.lock deleted file mode 100644 index 76f377cc12129d9ed3f29fc870f032340dacbec9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 TcmZSfKiGReQ1fXX0~7!NHR}XT diff --git a/.gradle/7.1.1/dependencies-accessors/gc.properties b/.gradle/7.1.1/dependencies-accessors/gc.properties deleted file mode 100644 index e69de29b..00000000 diff --git a/.gradle/7.1.1/executionHistory/executionHistory.bin b/.gradle/7.1.1/executionHistory/executionHistory.bin deleted file mode 100644 index 2d3835f126bfb44c63aaa8763dc874c375fe80e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 656977 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 XZsXcsV_vS+IJmXm`Q^)%&rSJ%2O?E{ diff --git a/.gradle/7.1.1/executionHistory/executionHistory.lock b/.gradle/7.1.1/executionHistory/executionHistory.lock deleted file mode 100644 index 4853476e25c2b20a3b8dbdad03e7b09ae6bc0570..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 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 diff --git a/.gradle/7.1.1/gc.properties b/.gradle/7.1.1/gc.properties deleted file mode 100644 index e69de29b..00000000 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100644 index 9a5b743fc773068e75300def3af484f79a45ed0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 UcmZSXTIa}Bc8+U10|Ybx04&=C3;+NC diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index 68fcc92e..00000000 --- a/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Sat Aug 28 15:47:04 KST 2021 -gradle.version=7.1.1 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin deleted file mode 100644 index f796efd93736ef5280f612acc53f257b96c1bbb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19289 zcmeI&X-HII6vpvuN|w2kGHD+qu|>sP5*3#a%xy|BNhuLDou(*U5K_@ng90@RnZzx^ zbQIH46hTAOkSImW#z9F#B(>5uFl~VfQ|~z=F<(SlAf5ro%YWW`-g|#D^GO2)L1MZ@ z4`JIOZ<2cl96CZ5Ce+iRZr`6!ay_4AL4@)JwVF-fa@s3{+>1 z%F7+7PjY|YrYBQY1$`BJsFZu}!<&Wi3GP9(uZ+8@Vp>_U^lU5j9_|x~Hv-E7-n!8I z%iJexlO9=ZNl&Huy4+utY)|SQi?gCRpSaH!H}*C8B?Qp=_uRkCxtpA_6H00RJa;4c z33XsZ$`P6~&E0rFw|z`<@g?<0?xrRAQFY4kLYi}jyTtZK+O*TjR?xqeKbeGJ;A!Q^!Nwk zb7BwKq3MquVici<^!bqdbLp=40iLsmyS%12TQO0+Ky$*mC;M0&mJj(R)Ai(Q zdd67L@V+O#bUn%3Q|CHW9W%GK(fWIu{(1A%<*o};w7#8thL>5MueVJO^?vS|4ZHNa z-JBw*=W)-fIPLG2U0+8%mOK9z1U>q0h%4|60SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2>e?Cx8?0u{xM!>AfPa*&S diff --git a/.gradle/checksums/checksums.lock b/.gradle/checksums/checksums.lock deleted file mode 100644 index c7326b4cceb0b5ac77b20561cf09964be9dd9389..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17 VcmZSnC$@iK!q%3f3}C?e4gfu21<3#a diff --git a/.gradle/checksums/md5-checksums.bin b/.gradle/checksums/md5-checksums.bin deleted file mode 100644 index 9aa722f9d5d0c1f65ba4baa3363ad1992b59c045..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34497 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