From 9c1dde632e205f34894e394c1336a7f78398f679 Mon Sep 17 00:00:00 2001 From: HAERYN Date: Sun, 26 Feb 2023 00:20:28 +0900 Subject: [PATCH 01/20] =?UTF-8?q?chore:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EC=84=A4=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 33 +++ gradlew | 240 ++++++++++++++++++ gradlew.bat | 91 +++++++ settings.gradle | 1 + .../controller/RestaurantController.java | 4 + .../dto/RestaurantCreateRequest.java | 4 + .../dto/RestaurantUpdateRequest.java | 4 + .../domain/restaurant/entity/Restaurant.java | 4 + .../repository/RestaurantRepository.java | 4 + .../restaurant/service/RestaurantService.java | 4 + .../review/controller/ReviewController.java | 4 + .../review/dto/ReviewCreateRequest.java | 4 + .../review/dto/ReviewUpdateRequest.java | 4 + .../domain/review/entity/Review.java | 4 + .../review/repository/ReviewRepository.java | 4 + .../review/service/RestaurantService.java | 4 + src/test/HELP.md | 27 ++ .../controller/RestaurantController.java | 4 + .../dto/RestaurantCreateRequest.java | 4 + .../dto/RestaurantUpdateRequest.java | 4 + .../domain/restaurant/entity/Restaurant.java | 4 + .../repository/RestaurantRepository.java | 4 + .../restaurant/service/RestaurantService.java | 4 + .../review/controller/ReviewController.java | 4 + .../review/dto/ReviewCreateRequest.java | 4 + .../review/dto/ReviewUpdateRequest.java | 4 + .../domain/review/entity/Review.java | 4 + .../review/repository/ReviewRepository.java | 4 + .../review/service/RestaurantService.java | 4 + 29 files changed, 488 insertions(+) create mode 100644 build.gradle create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java create mode 100644 src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java create mode 100644 src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java create mode 100644 src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java create mode 100644 src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java create mode 100644 src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java create mode 100644 src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java create mode 100644 src/main/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java create mode 100644 src/main/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java create mode 100644 src/main/java/com/project/hackathon/domain/review/entity/Review.java create mode 100644 src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java create mode 100644 src/main/java/com/project/hackathon/domain/review/service/RestaurantService.java create mode 100644 src/test/HELP.md create mode 100644 src/test/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java create mode 100644 src/test/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java create mode 100644 src/test/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java create mode 100644 src/test/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java create mode 100644 src/test/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java create mode 100644 src/test/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java create mode 100644 src/test/java/com/project/hackathon/domain/review/controller/ReviewController.java create mode 100644 src/test/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java create mode 100644 src/test/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java create mode 100644 src/test/java/com/project/hackathon/domain/review/entity/Review.java create mode 100644 src/test/java/com/project/hackathon/domain/review/repository/ReviewRepository.java create mode 100644 src/test/java/com/project/hackathon/domain/review/service/RestaurantService.java diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..7c971573 --- /dev/null +++ b/build.gradle @@ -0,0 +1,33 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '2.7.9' + id 'io.spring.dependency-management' version '1.0.15.RELEASE' +} + +group = 'com.example' +version = '0.0.1-SNAPSHOT' +sourceCompatibility = '11' + +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'org.springframework.boot:spring-boot-starter-web' + compileOnly 'org.projectlombok:lombok' + runtimeOnly 'com.mysql:mysql-connector-j' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git a/gradlew b/gradlew new file mode 100755 index 00000000..a69d9cb6 --- /dev/null +++ b/gradlew @@ -0,0 +1,240 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${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 "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + 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" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..53a6b238 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,91 @@ +@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% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..682509ee --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'project' diff --git a/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java b/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java new file mode 100644 index 00000000..c2457869 --- /dev/null +++ b/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.restaurant.controller; + +public class RestaurantController { +} \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java new file mode 100644 index 00000000..d1043238 --- /dev/null +++ b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.restaurant.dto; + +public class RestaurantCreateRequest { +} \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java new file mode 100644 index 00000000..6846d293 --- /dev/null +++ b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.restaurant.dto; + +public class RestaurantUpdateRequest { +} \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java b/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java new file mode 100644 index 00000000..edda91b8 --- /dev/null +++ b/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.restaurant.entity; + +public class Restaurant { +} \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java b/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java new file mode 100644 index 00000000..77b0e095 --- /dev/null +++ b/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.restaurant.repository; + +public class RestaurantRepository { +} \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java b/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java new file mode 100644 index 00000000..5b344b61 --- /dev/null +++ b/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.restaurant.service; + +public class RestaurantService { +} \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java b/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java new file mode 100644 index 00000000..efc5dbaf --- /dev/null +++ b/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.review.controller; + +public class ReviewController { +} diff --git a/src/main/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java b/src/main/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java new file mode 100644 index 00000000..ec1d4055 --- /dev/null +++ b/src/main/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.review.dto; + +public class ReviewCreateRequest { +} \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java b/src/main/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java new file mode 100644 index 00000000..e844508c --- /dev/null +++ b/src/main/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.review.dto; + +public class ReviewUpdateRequest { +} \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/review/entity/Review.java b/src/main/java/com/project/hackathon/domain/review/entity/Review.java new file mode 100644 index 00000000..4d6ff9dd --- /dev/null +++ b/src/main/java/com/project/hackathon/domain/review/entity/Review.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.review.entity; + +public class Review { +} \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java b/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java new file mode 100644 index 00000000..5be3c77b --- /dev/null +++ b/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.review.repository; + +public class ReviewRepository { +} \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/review/service/RestaurantService.java b/src/main/java/com/project/hackathon/domain/review/service/RestaurantService.java new file mode 100644 index 00000000..57d01d78 --- /dev/null +++ b/src/main/java/com/project/hackathon/domain/review/service/RestaurantService.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.review.service; + +public class RestaurantService { +} \ No newline at end of file diff --git a/src/test/HELP.md b/src/test/HELP.md new file mode 100644 index 00000000..14640c8c --- /dev/null +++ b/src/test/HELP.md @@ -0,0 +1,27 @@ +# Getting Started + +### Reference Documentation +For further reference, please consider the following sections: + +* [Official Gradle documentation](https://docs.gradle.org) +* [Spring Boot Gradle Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.7.9/gradle-plugin/reference/html/) +* [Create an OCI image](https://docs.spring.io/spring-boot/docs/2.7.9/gradle-plugin/reference/html/#build-image) +* [Validation](https://docs.spring.io/spring-boot/docs/2.7.9/reference/htmlsingle/#io.validation) +* [Spring Web](https://docs.spring.io/spring-boot/docs/2.7.9/reference/htmlsingle/#web) +* [Spring Data JPA](https://docs.spring.io/spring-boot/docs/2.7.9/reference/htmlsingle/#data.sql.jpa-and-spring-data) + +### Guides +The following guides illustrate how to use some features concretely: + +* [Validation](https://spring.io/guides/gs/validating-form-input/) +* [Accessing data with MySQL](https://spring.io/guides/gs/accessing-data-mysql/) +* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/) +* [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/) +* [Building REST services with Spring](https://spring.io/guides/tutorials/rest/) +* [Accessing Data with JPA](https://spring.io/guides/gs/accessing-data-jpa/) + +### Additional Links +These additional references should also help you: + +* [Gradle Build Scans – insights for your project's build](https://scans.gradle.com#gradle) + diff --git a/src/test/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java b/src/test/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java new file mode 100644 index 00000000..c2457869 --- /dev/null +++ b/src/test/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.restaurant.controller; + +public class RestaurantController { +} \ No newline at end of file diff --git a/src/test/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java b/src/test/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java new file mode 100644 index 00000000..d1043238 --- /dev/null +++ b/src/test/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.restaurant.dto; + +public class RestaurantCreateRequest { +} \ No newline at end of file diff --git a/src/test/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java b/src/test/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java new file mode 100644 index 00000000..6846d293 --- /dev/null +++ b/src/test/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.restaurant.dto; + +public class RestaurantUpdateRequest { +} \ No newline at end of file diff --git a/src/test/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java b/src/test/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java new file mode 100644 index 00000000..edda91b8 --- /dev/null +++ b/src/test/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.restaurant.entity; + +public class Restaurant { +} \ No newline at end of file diff --git a/src/test/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java b/src/test/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java new file mode 100644 index 00000000..77b0e095 --- /dev/null +++ b/src/test/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.restaurant.repository; + +public class RestaurantRepository { +} \ No newline at end of file diff --git a/src/test/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java b/src/test/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java new file mode 100644 index 00000000..5b344b61 --- /dev/null +++ b/src/test/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.restaurant.service; + +public class RestaurantService { +} \ No newline at end of file diff --git a/src/test/java/com/project/hackathon/domain/review/controller/ReviewController.java b/src/test/java/com/project/hackathon/domain/review/controller/ReviewController.java new file mode 100644 index 00000000..efc5dbaf --- /dev/null +++ b/src/test/java/com/project/hackathon/domain/review/controller/ReviewController.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.review.controller; + +public class ReviewController { +} diff --git a/src/test/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java b/src/test/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java new file mode 100644 index 00000000..ec1d4055 --- /dev/null +++ b/src/test/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.review.dto; + +public class ReviewCreateRequest { +} \ No newline at end of file diff --git a/src/test/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java b/src/test/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java new file mode 100644 index 00000000..e844508c --- /dev/null +++ b/src/test/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.review.dto; + +public class ReviewUpdateRequest { +} \ No newline at end of file diff --git a/src/test/java/com/project/hackathon/domain/review/entity/Review.java b/src/test/java/com/project/hackathon/domain/review/entity/Review.java new file mode 100644 index 00000000..4d6ff9dd --- /dev/null +++ b/src/test/java/com/project/hackathon/domain/review/entity/Review.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.review.entity; + +public class Review { +} \ No newline at end of file diff --git a/src/test/java/com/project/hackathon/domain/review/repository/ReviewRepository.java b/src/test/java/com/project/hackathon/domain/review/repository/ReviewRepository.java new file mode 100644 index 00000000..5be3c77b --- /dev/null +++ b/src/test/java/com/project/hackathon/domain/review/repository/ReviewRepository.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.review.repository; + +public class ReviewRepository { +} \ No newline at end of file diff --git a/src/test/java/com/project/hackathon/domain/review/service/RestaurantService.java b/src/test/java/com/project/hackathon/domain/review/service/RestaurantService.java new file mode 100644 index 00000000..57d01d78 --- /dev/null +++ b/src/test/java/com/project/hackathon/domain/review/service/RestaurantService.java @@ -0,0 +1,4 @@ +package com.project.hackathon.domain.review.service; + +public class RestaurantService { +} \ No newline at end of file From ad7b15a0d5a7d04fdfe5f1530c5d8a60ff4296a1 Mon Sep 17 00:00:00 2001 From: HAERYN Date: Sun, 26 Feb 2023 00:21:28 +0900 Subject: [PATCH 02/20] =?UTF-8?q?chore:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EC=84=A4=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gradle/7.6/checksums/checksums.lock | Bin 0 -> 17 bytes .gradle/7.6/checksums/md5-checksums.bin | Bin 0 -> 24797 bytes .gradle/7.6/checksums/sha1-checksums.bin | Bin 0 -> 36803 bytes .../dependencies-accessors.lock | Bin 0 -> 17 bytes .../7.6/dependencies-accessors/gc.properties | 0 .../7.6/executionHistory/executionHistory.bin | Bin 0 -> 80987 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .gradle/7.6/fileChanges/last-build.bin | Bin 0 -> 1 bytes .gradle/7.6/fileHashes/fileHashes.bin | Bin 0 -> 19697 bytes .gradle/7.6/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../7.6/fileHashes/resourceHashesCache.bin | Bin 0 -> 18973 bytes .gradle/7.6/gc.properties | 0 .../com/example/demo/DemoApplication.class | Bin 0 -> 733 bytes .../example/demo/DemoApplicationTests.class | Bin 0 -> 531 bytes .../resources/main/application.properties | 1 + .../compileJava/previous-compilation-data.bin | Bin 0 -> 29030 bytes .../previous-compilation-data.bin | Bin 0 -> 26160 bytes .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .gradle/buildOutputCleanup/cache.properties | 2 + .gradle/buildOutputCleanup/outputFiles.bin | Bin 0 -> 18983 bytes .gradle/file-system.probe | Bin 0 -> 8 bytes .gradle/vcs-1/gc.properties | 0 .idea/.gitignore | 8 ++ .idea/.name | 1 + .idea/compiler.xml | 15 +++ .idea/dataSources.xml | 12 ++ .idea/gradle.xml | 18 +++ .idea/jarRepositories.xml | 20 +++ .idea/misc.xml | 10 ++ .idea/modules.xml | 8 ++ .idea/modules/project.main.iml | 8 ++ .idea/uiDesigner.xml | 124 ++++++++++++++++++ .idea/vcs.xml | 6 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 60756 bytes gradle/wrapper/gradle-wrapper.properties | 5 + .../project/hackathon/DemoApplication.java | 13 ++ src/main/resources/application.properties | 1 + .../hackathon/DemoApplicationTests.java | 13 ++ 38 files changed, 265 insertions(+) create mode 100644 .gradle/7.6/checksums/checksums.lock create mode 100644 .gradle/7.6/checksums/md5-checksums.bin create mode 100644 .gradle/7.6/checksums/sha1-checksums.bin create mode 100644 .gradle/7.6/dependencies-accessors/dependencies-accessors.lock create mode 100644 .gradle/7.6/dependencies-accessors/gc.properties create mode 100644 .gradle/7.6/executionHistory/executionHistory.bin create mode 100644 .gradle/7.6/executionHistory/executionHistory.lock create mode 100644 .gradle/7.6/fileChanges/last-build.bin create mode 100644 .gradle/7.6/fileHashes/fileHashes.bin create mode 100644 .gradle/7.6/fileHashes/fileHashes.lock create mode 100644 .gradle/7.6/fileHashes/resourceHashesCache.bin create mode 100644 .gradle/7.6/gc.properties create mode 100644 .gradle/build/classes/java/main/com/example/demo/DemoApplication.class create mode 100644 .gradle/build/classes/java/test/com/example/demo/DemoApplicationTests.class create mode 100644 .gradle/build/resources/main/application.properties create mode 100644 .gradle/build/tmp/compileJava/previous-compilation-data.bin create mode 100644 .gradle/build/tmp/compileTestJava/previous-compilation-data.bin 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/file-system.probe create mode 100644 .gradle/vcs-1/gc.properties create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/compiler.xml create mode 100644 .idea/dataSources.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/modules/project.main.iml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 src/main/java/com/project/hackathon/DemoApplication.java create mode 100644 src/main/resources/application.properties create mode 100644 src/test/java/com/project/hackathon/DemoApplicationTests.java diff --git a/.gradle/7.6/checksums/checksums.lock b/.gradle/7.6/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..1da07123aadbe2e707b706a2d094b66d60b62ee3 GIT binary patch literal 17 VcmZSPO^w=9%5t}o0Sp*#0stu81T_Ev literal 0 HcmV?d00001 diff --git a/.gradle/7.6/checksums/md5-checksums.bin b/.gradle/7.6/checksums/md5-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..ce5941d69dd4fe9888a83fd52732f23115ec33f4 GIT binary patch literal 24797 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 T{QetMX4X7FH6@x7>plM;y#t(* literal 0 HcmV?d00001 diff --git a/.gradle/7.6/checksums/sha1-checksums.bin b/.gradle/7.6/checksums/sha1-checksums.bin new file mode 100644 index 0000000000000000000000000000000000000000..2aa3e1bd482b2b41a0173b8d10fb2768737f04e8 GIT binary patch literal 36803 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 Y)k_j=H$&ha)r0qeGynhq literal 0 HcmV?d00001 diff --git a/.gradle/7.6/dependencies-accessors/dependencies-accessors.lock b/.gradle/7.6/dependencies-accessors/dependencies-accessors.lock new file mode 100644 index 0000000000000000000000000000000000000000..66bab6af2aabb812294e99796d4901153dec5cf5 GIT binary patch literal 17 TcmZQJ)N=T;@8IUY3{U_7HpB$N literal 0 HcmV?d00001 diff --git a/.gradle/7.6/dependencies-accessors/gc.properties b/.gradle/7.6/dependencies-accessors/gc.properties new file mode 100644 index 00000000..e69de29b diff --git a/.gradle/7.6/executionHistory/executionHistory.bin b/.gradle/7.6/executionHistory/executionHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..fe023b8e34436e193276f7c7517fad8e8ec1f0b2 GIT binary patch literal 80987 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 GlKuhv17Jr0 literal 0 HcmV?d00001 diff --git a/.gradle/7.6/fileHashes/fileHashes.lock b/.gradle/7.6/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..1e7f47be4bd5473bd8bd02f9ad9d7a533f8167b1 GIT binary patch literal 17 UcmZQhIDR4ZmDNi>1_&?*06X&p@&Et; literal 0 HcmV?d00001 diff --git a/.gradle/7.6/fileHashes/resourceHashesCache.bin b/.gradle/7.6/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000000000000000000000000000000000000..35dd187eb521fbf1e64e133d75e6d07564904f2c GIT binary patch literal 18973 zcmeI%T}V@50LJm-Bw}N8D|0HAVu-di+h|6KQ7*J?gy6tQ<DKLrWb=v5F|7k~l`waUI|x7k0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*#k7Xf|vL3q)JNs@6Q zH^Ku9qu_^c;?7o?2gJua-O;bLI{N=Xk8!$wYPfhg=>ppOudgpUq{(uUZlgUY*s-}m zEV>u%nqJz!s645n*0y-Eze)Q%%a6vs&lMXZOEgv+ zH+jit?m9Kv(cJ5`uL{T1zZcfDqwdTa#mh$pOU9p{c_3jg#P^d6FZ34rc(K7gheuz{ zUR+du$Tyb+c!Q4xuE{3Dij>=R?1g$vGQ=Cs{$5r-=+r%v zkFgiu?qpa5gU2#zr*gLj3}yp+k@N0ayyMnF?>I*?quG+~VlPaK`yU2Qx3^dP$_lPc rafH~5lP#aP&esiZ&)Y{$+WiV6d!ZbX&G%0~RV6BC)zTQt(#YZuj^aFQ literal 0 HcmV?d00001 diff --git a/.gradle/7.6/gc.properties b/.gradle/7.6/gc.properties new file mode 100644 index 00000000..e69de29b diff --git a/.gradle/build/classes/java/main/com/example/demo/DemoApplication.class b/.gradle/build/classes/java/main/com/example/demo/DemoApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..37bc981b9d251caccd10c67df17cb8418fd29438 GIT binary patch literal 733 zcmah{%TC)s6g?9X9NbW7pio{?=_+K=+0jKRBuLejX{!c>1*@?$F+=T{XgsF;R#&Z9 z@Bw@j;*LQ|RHdpV->dsP=giFg!|fe_57-M)$LjzaAvWoTu zGm;D|k<#)@na9$ei8!N7J2HvLhQcZzKPT(%QWXsEqQvA}-iUmXNj{Rf;h)GHPbQg4 zgi}WMXmc)wBr4%H>cMidY|OZCu5N=8qy{Q(jCwfw5ov)7T$8HpX#LI+GYZ zR%vM^A5<+TRG1aiLIaBoZ~vz}z;+8e*d+~9*?7St9vFriNdW8Dv?aV&Rn0BbmGWj3J1P zc5?1QBPK-b-xu1cRE|}yNOhpKaaBLnwnJm5d{)qQWHaTY|p&=fY7H>zB& z|JS(VnRpfqCzVc~S*52BR;2R9*e4ztXfW*l>tzhxau`p9 zp7OhBCS!*kc=XTZ@#vBm=(8!}<{9 literal 0 HcmV?d00001 diff --git a/.gradle/build/resources/main/application.properties b/.gradle/build/resources/main/application.properties new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/.gradle/build/resources/main/application.properties @@ -0,0 +1 @@ + diff --git a/.gradle/build/tmp/compileJava/previous-compilation-data.bin b/.gradle/build/tmp/compileJava/previous-compilation-data.bin new file mode 100644 index 0000000000000000000000000000000000000000..7cea29c132c782d2da6cb3a52880b5bbf0008eb7 GIT binary patch literal 29030 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 U7=ac9xS-1sOddqe`IWDX`PZ*6A5M z4@7}msDhus-%dIqxufCFBHqW3CLLBw>*=%oQcXrRWK>IVp$-U;fE?;UJSK!^>wk9%aCYG1y;m1ZxCo(_J-*mC({@RnaaXVVb=oJ}E=QX@;E)ohIoq2fJmmgUr zMNIVRj(X`Kh5Od6WYk7R?PTIFu8 z0~HXPSO`oVY=C8OjxrzXO}P@MpIe6)NVcm7RQHilKN)=oH!%R~+B%y206M_)m|7CT z=iw`FjaohhS;qaQ|xNZ88rRZvUZNaX~g@zH7^~ z0=Z_JVKN#44Uy&Hk8VbfZAw+#sZ$bkp+RQT?%!lI3Yz-|_JXMG2u{fytkmnNWC5lE9|}YlJAr7@A^5`o5o&Cob9K9qt`#XoPVMV>PHLJT1^H7@00pUE zrjWcK+}lY4VJTw=OB+)Ggtr*gDQSY}s+giX*Yrn!P5cu?L02d!n1ZB3D5L<12%<9) zZ-sWD6e6%s#$GtfQ={G6yW}HQXou!1%|B9hKa7IHDJX)1A}Q!9ynGGlwiTLKN5S6~ z5{Z2@h2%|yBY`NC!oxe?#vYzOeEmkSrj#_bLia%o1;tX3I1VU0?H~|=92qh0>;K_c z=wb)B$4|WZo)S+%2^4glf)XhxiGs|pkZ({(?vAp_@QN+)!e%WGKkn_h_IZukfxowv zjZGrg)}~POQYnUM6#XP}I>9Qj(8iH(Y$He^X8;F8LPtyB0G_h)L#WTtvu?SE;m?j7 zX(`L3C}vT#Z&H-9DQFjV3)l)7%58W-AmJ1GkOO>>NJNiW+Gp}8w8yuV_$=BCz) zlkK{ZxfFDVg7Sa?%XE489;auIz8^D}D!O0TEm>Y#lutng6jTTjz6c;ztza#}w6a3aX%h zV|YTG%+3+3q(EBeXekof5y9o@zk~so@O8IZubvuuuem3sFt9Ukg<^Z5-AGy_0RO%^8 z4HWd80uI?3IQxPSiWw0mK)rBg$YIUvl>6=Z%fe^XDP4?wNzrMfpeA6YCk1N;E;-oP z5YodJM)j(#&aK*RFP%*Pc06Q$3kAI*Hhm2TGBLH};eyd6YFZzQ+fK-tZDB2o{M$-F zZNvj$sK1}Ae)r2F=3``&8{& z0~GXwf__raAaL;)JZuT+r^tbj^AP2~Xk#Osj5fotIi&fZewHRY+@mx)uPUtae9Gz0 zdefG>gCi95n}S9u=npIuMHvG{B@z#lajG+eKXEcr|3M>Ue<9UyAAk z#lVG%T&c*7ii~E=#Fo2LNxuI}hVeaV+KoHsX?Ij7H2m)4>UVokktY>`k{6Za=_IxR z7G9Km{cCc&>W$;rBG#&XQR}^_;Fo#0RR74*p+1Y)*=rhyO#kWA@S!4KDsp%WjQw8C zE8gL7b62U#RBM@($6x%YD*jZZ0IJMos!kwPCy0u!P?1_Nl@wq%sZ5i(J{AHy3JAwU zC3(PqV_{U1n{zl7ByPrsfQ3JItsPT~UGTx%;`f2@<4!ISR1`@CPF$r2wT{q zxw$~r;CJ(dlgmv{-^1r$qoOD(il(9%Dw2++lH46E37?RVb$^c=9!b?pZ4TVs`6nTc zisGp#fr`|xQ%OFi&P2vwk_emX(fY^Ui8@y5lpL6i$#`}(i;%Gf_^wCtRavD`nKOGkQU+$LyPybt0;&x`k zAF=TwyMQ*PIMY-uGn0z4s1PlI&Q;`hH4hrHdUiCNPFwnMmGVt0;`4Bo9YK4Raj7Mg z+jf@{UdfBF7u%R#GqG+RD&Ve%pR8&X>wY>|kgHDR=Eg(DP;eSQ~ zjmbKGC-!_;denGHNm&t9t(dA*LcT>wq2jaLi<-YC$F4Pf81?D9&5?cgsLCZ&pij?1SD}_W^MXpcVlNPhEg?CB{GC{ahp!9Dz2~qu zLtXNh5@Y=(*zP42HBwO%yw(g<5j7xR(gGVpG!qad4-a2KJCx6THKRwj4t-f{#SDF@R<$m+Y_d9SN-+~d(vum zprVJ0K2Xs|D%yC3P(&w3B~6=kXR{J~BkHCmdc6KbMW3nY3l)8Z1N8zQ_(FRR3Z%JD zmQMRsDZTVn=dqrvyQEL!->9e$b|m+MT>;`_E3^X_`SbeT&8Y|1$_Os`#467IP5Dkm z161?_mih^9zzXt0*m7ok>K#%0@Ak+5%J1aN!_x-A^MG8*L!d{1QdpW<{)-MlbrVaS z->~V_K-4>h9rM5Cj1N=M25dqL;!nc35AI!1dvLyB8--DoQAG$jw3j3-UU zi>BjELq0U*OM{efUoaJ%UnmtkUN{w>5|BRq3-VgtF4t^kyhf; z9C6;@)&p}hm-^Gt1|EJkE&5hPO~H9Z=a~(9mTXG7hAXyd)M7j(B*7xCdVs z>14WpuurQ#JTxkZW_X1LDiurvX%HogP?SQ(t;YK&3f~FKJkKmN!z;44gwRkZ4Weln zjpSh?H0I&6ZC=lDo)dJE|Fk_JyY1Vya2krBp-392^HmzuR}Qwu0?{?t7Q`zc@pfgFM_% zbauJg_nRN&nm;%1kc*jnod)p>>OQqno0pvzQ%=05Js*CNF+Gunl4wxC-+|BK@kA}p z^QtZlds3OY>-PS-K~qbnf$vEHsW^yXCn&W=;GlwUzRkLN+9)-a=-SWNrz>Ki_G*kvBc>vGw9f+!n zD5OKg6T;y8r?jOdUp`MvTuOgPGk8SPdrZ?Vr<8+y{#~j9G({u??t=TWqjVJ z)@xFf6P$1Q(l1i$XsDjhPb;XHhXt50XM`rAt~6bAGZQWBz9n)qHLS{$(qnW1GLQ{H0 zQ+`cTY@oElQ5_`0GnOL3Q_5t3dN!al)Ododgl}i9`Dg$7&^DSu1EqaZ9qa{o<)ZrY z-LG^E>s#FzXTSDK-q2774Rz9x`dbjPso*~xRcHtPb-%I2>k{oedzz-8^i=B6&UZA` zF502@G?_VAHw~ab<4OuXnxR%1td(ae%Ct-M3g}+cLsR)cQ)!@l1Qin418NCT%J~!V zkAGJditw=feV05pm}$fxSt+_)PS^WPLth9kda-Et8fgA9q1KfEZesqmGt$lepBsBZQ z5Dg8}0B-;$9Cb0=_-FLtdrDVi(hr$%`UnmE1`Vf-63Qxo;#CX*_{sV7zTl@%$ic&@ zof`dv=l{^q7!4`C2J!toSv)8CQsIoe;V2Kas^o9u#MYpd2M4ywO`MAj-1kAnJi|u* zFHL!Zrc_FGp_6<8?}x0NZ=XTMb+650haZ2%(p8jNMDGi5bfs&!(N)^0?sSs7&^DBe zFMR%`Gq>DGe|6gw?^zd>mwV8WCmnnxQ2ywE=e_=*wB7P5Mign&KaE~=z@H$`du;S~ zp0&>r*U#Se-95K|c+-&&9c}cble~ee7DDifIx7M?Rt8TsN@R(?EkB2D`OyIw@(0R@ za+rWW@lKP#=W>qkQs(jJaZCReT?n9~%XAb-N7AxEbV7`_M9*OoPG1nX#=s^+XH(*( zSEDm$H~C+oADW;A(*eAYSm4|~xzMK6hx#iY*(hzFRxJskD~Hli7#+&9t5htUV8 z24#Esz^*6JjY(1?$Z&#obhSvj;#E4JUf4A{fF_oFaTLK85pJTwm_0aeWbKwd zduB1I=5aJ#JBF?tOE)Z~&d#95!Abdc0E~$6u}5hdX3~itGt6g=B^6bd*R()060=0O<6XJMcxOmVCQe_!7@sR~j~+51Y|) zW6bg8(8?QhluSn{bf_7kDMV>pcBj3EH`v=fwW=_xYb>cUm97>-hZu2Y$Iu8lpJaMd zBU##S)n4Z`I!dR5d&-#Pp^eS|Ou=`Kf$0xVy26Jknf1IM$BQ!QP*DR+Mq)je>bqjM zl4Psq8I!1xMc2GZ*UP3W-lC)HbPRsspQjtC200e|?C9GhM}3&@c$==ALszY*z%Fx>!ybXU0Kkep zh8-aSnLeW9Uk`lIE*YHG$Y%wUXQ}MDSWZV3bg20O7Bc)Z>t1NY`VPat2e$NuuAKdZ zuAfG&q)&p*HjrxL*yp2-BaTz@9j>+EX8(Ea#;&84j@m%L6d#by^@x!q-8`Rd7NOUE z=vF6E+v(^H9Ws@UNpmK0B_7V)T(I$ktB1_SrhiV<=l?b7B+OYJ-)(1Se`CZXFvKnR z(50t=i{8==-qDr2=*sWusGG1rU96n?j?zWJ!_LZdXlRan=kDMBT2^#WzK5>)fevW{ z_7Rw5XX0QCfTW!{K5}*Qip3pSO{cSO>CNQ-NcuzvKgq-A`22jMO_Gk;=U~u|%ac7n z)6o|~!rnlB%Z0F*S;^0(3mWD6=!>qnf2E^dLboBG9&Oa1DF5R%`@+MpJr&C{7~klq zj}Cy!CLUgs|MjebwU69=`mw^<&buvi>fmlfT~XnlV5} zKj1JlU(mJ59al^TY<6qYl9-i!|B}{-L8WIvS@VpWp8g0+WnUCV<3M9=t=+sVuKJMcfn;?a?&{xePuD8IzB!} zy06gtXnaTGhX9omfeaMHKn_@HVWu;~Z!{jPnYU%>HHK0YLphpZ7{gGEWk9Kh z#ld-viSTM7fmjgFfC~S=a0`hiK4ZHN?!9Iw|5#|(exrX{2L+oPuU3d7D7++v{H45Xd| z#MujlAcT`A#C5mV1o-cHm6+fw*`%DyKzA6BOpU?mYIVHy6wfM-sNacLI`#6EHF*q_ z&p?tauuseNFElL*4~AVmY%kEM`gNgz0f-t8Ut&IX)}^WXOM&!ZlJ9J5?Lr2+%Rog8 zz@#5iih&Q4**9d6mlho*kL?}LcxKQ%{I}No9s`vy(8f~GC!&pIPoz$3DebWvr?dwz z|8->9v2Ew>Gf)`=eCl7Y*TCP-0|6ls!pQRppR<~N=RaU5J!B|9Vi-PVsKheDiC`Yj z!0APsG;HWiCG~W6li=x;v2u_Z0}z=fgnl^~Pqx^2c#f;j2CA%BwQ7;>yw1m|_LU6u zl!2ZxAVxo&jL|HGcXw|rD0#i+;p_vfN86`YF;F!F>h~HT_TSuQ}e5YgT+{i#p3@AV#GN$c)zx_m+bxTV3jWe7_UQe4DsD%OL zXCClfSUm|gvz{w!$6nJ8cN{{%KlCpcF#6jt1c6) ziDQSR9n+Y?N1tt)sqp={diT zHky0t{xHxO105R&juOK_fc(Dd-Sg(m1{ApB{7TWTZJ~d`F;FLfdO$0{v21&@Aj+Z4 z*~;pR;ofbp>Mpo2VWa?nB6;nl^lsIa7q*gI-VUVJ~%#3+u_AT)4iD_ ze~=@LC5R=^rn;N4Ci(B>rQCw^OM_f`8t(Zpm3*1Xb0*F3muYI=s^t$7cNhtWT;v*0 z`7x0{69q6K5?!VQf<9Sw6b6j@F%+z{J&1C!w#46=K=xw^+`eVwBU~bc# zkq{;dWr9v$0fubrTjO$EVbiKkiORtuud(=7bX?tB{Hg4Q-3x#FT$MNL6$-`Yh9uo-(;7E+Wn^&%VcCJgs zti_fi3deSpU1OpsCbUYrVPAn(dcoYy<0sCVUbNnJvv6iK6U8vWWMY{Fx&=7MuJ)45 z(c%m(s|D=v{c{dl$1zbnK?T4IKdgIlXK_yqS{LMpu3cTRCY6GV=T^nWu)0U*K-PDoK z1gMyBRDI? z{odyFrA)p1Ov5s!%me13hfKpqOoJryV=xYwm;nIn?7!XPayUHHb8XOjvf5t;~X zpfpJ7bv*cZbltO0*EJmL>TiCkVxnp$(isJtb?|WBDelV)q0Qb|a^OI_MGX_xGEp59 zN!J6vP5D9)q+C?D?)2s`w_>Zy19so$?`>eB=L9PV2!54LPk;Y{y}#sje`+}h6!8~K z^pXicXd`Hg0LlT=Cg#6A7HHKAB>3%-N?mCsix``maW9S9$LP&W)WQVd!yQa;my8jn zQ&2Ut<*Lo1<5#3Ny<#fG&>`OTx1e1f>*QZ^$)`M4s~qlq%|xw)A8Lb@`3_FdW8)JI zeO>Kq`(>r-(u~r0{d107v~FjjUBG{gnL8hBPX5PI)1Z@6^R@6;soTUi={y4O8NBEXc-@+AC{32`=dYI?~6T-?z z!l@AxR77S$O!CdilAHFYB<%ZC>sKFrS*apfFd$cKm17#rTnEw1GjIT*|cqm zyPV3DLu#wIFQ=(|XQ~V^4LhI`_(a41ww;!D4)zXX(B6njUU6UiV4|N)$T&bvp0TGN zSZ2EY{_eaOIVn=)=Rqd=1wv$m0^5I?95}V_#PB$K?gyFCgoOu(m}r;@5Df^vI_)n% z^vX23q`0D^=C&Nw5hnW0gfL&igyuraOoeCC4oiyY@9sK3Ip#FVM1R1=kuxBVO3PyP z4m@3cC+GJ5Th4pbzl<@_I1?E`I$D;dZ*SzMWqNk-_x96q!w!F$s#%myD(-7OIz>VK z(fJ=CM#mf`tYap?NwHueEEx{1d-re}nHQ)uZ|jj$M=#&_=*j{I203A)?>)D@&V&3F zTO|wTSRQd>A$Jz?V1fUCORIwimO5SfQtcki=%3iK{A|-tc~2JdV!QE!g##8Nfo9Sr8I{Z>P+?o}**`D9c!Az8;Hr)(d2zAQsfG zS6DEj1XCW9^CU36@hS4gMxEHXtSZ!G8?_e;W+{iTR6|*YVJt=ca2Ojl1KpY(0VFvI zOki+SXg9#X8Q#{N(=DA>sTPgp$cES}MzYXV7I@5SESL^61ES|E$N##0c=h)~+h?4n zI^|I^nYiTdA2$=7Hy@f`YTp`)4BQ&U(k-P&!v-QE$kW@_sTrS)$v>U8Rr256!yzB%?+AEKlL^p*bF+IAL0{$+5NMB>+9JwG(B(c%YYqOD2oL~ zdlO{vf78&}@DDz~+2GKfz&3-nrrLK4wI|Spd6zfHr=PpULbq8c2e#S-pIS#JJe7U* zbXmYEt?3btcgJ#B=ne~-rFkrp|NpfzwgL)8aj_m2lzUjKs!Z8~l(O?#sDK4oF4*Do zOVY74mLz#bsejy3_RyL_7P<=xONEc5#130?$5+}v9{4H!^Y;2@MJ!azLiga)|LTQR zA8I+8+yKh5)`go*GEJgOSg4eRjDfJ^mNVG=WxfC06S*);92w{CvmgNTaK&d_dicko zRVjl-s^4Yjd6uybJz%NoKV*@-h#?8nU^*^)d;9LPT(7JR9^vfa$|{*hEWO7p)pC|% z1q;j^e!&b_MNVk# zP(2F(J2=!}urg&MMR&`Z z?0LB7A(JQ9s7m6uFQ1>(y14jsD+{%;kP_@Q>(dUkZgh&zDt}VerGI~4J4@{iOQ(Yc zqeGp9a@vJb-@-Zs8X(3`t@GH|e`o*JpOi-x8Pl%~y<-`4u@rAIIoV8{rIm58-uiCp zvN?54_l-4wzGvx`(YwKD0T{;5h#G4WA1mExpN!_aA6e)V3w>sxjnR}Zz<2TghEuC3hpgPBJs#91ofDtew+#GF!!J^=Qr5Ms z++yaju4}Kg$)>L?#a@PKzl{YjXmpcJE-^!T1Uq9Zu!na1HdH^*2Y=u^J?dvi%<6y zl&YwZgMYBlPr~-UK%jWIP!xBi?+J@p8E@0NajxSV7QS4xczN?bJcMy)=w0`m_GOS| z_zRB9Lc=UH!a~!26Ed{nONdE=eyTh+3g?7^V6y#Jk$R@x^T?vlC-nUF>9@-(|F8^N zsbe4l0IO{I_<>7DoUN4{?P}7WqG8Uw592KKmjxY=30UI4NhBW5sb<}n`|NRnwzkZH zq!6Z~3#Q_V8Mt9G?$|yLOvMv3@WKEy#Fl$wARh_ehxp6M7+_&vjN~p6;&(2r?%#Vy zDqm2k`}u5H?O{I*`D1_wgS`GYee14vT)mF|FrjPrj8jel7`lu>Sc0&yW=;Farj3s$ zc3yPZqjsI=5{RK745{CO@Nc+x?7`Xe7a=kAFCNZy%Qm=zK^kR`56!i_sO=ltR=GXhhN#FVdMhSxBeC`>;ZlZnCfV=>J* zOgkO}AB!bmkj4>Bn(G)Kua3fh#}X1TkOy4&farlG{ol`~*bR*2CQODWh5u_M06@uF zk{F<-Yt`o6sWlebAudkAv{EtESb7924PJ$`h{(S1yf3qNmi76qd01_zoUK|QmyR9G zz!Wnvn2O25h@^~|D8A#_c2Sk!NK8eT{X2yjIwD~Is9Bq;|_K(50gp9 zuov`X2ClK>PfK8jDz_p*ICmz!+9MxB1sJ5At{^Ti?L{Xp+|f7OzQM5M)b*=9g_z=9 zOwSAJW))%3MBv*);Kmcup3r>QOTxG2hWl;Ms5UCb4DMmt6|53?1dJB!z7!7d?^wE) z>v6+jiHsSRg*j<+?MNh-Gl9x8aC(60}MUHAjf$G?@rFx zLR)4Esh}ph{C7>-qp6=Zc?UnnwEW2BunQqBXitSp`z0TxKjlp1d4XDB-90u^50B<<@ zFEMjNri`n9nlY^kRtr30X(ljnHi0S6ny0}&lJ8o}pFWs*ZCY`3Ut#DqhPJf=D^2(gCKf^f6*`|8zrlYNO&Op}|G0Q->QuZxX2L0ITM=pH zX9vnh!{?rD1hZhg^6Lh@Q_E{6P(tpqV_%eO+A-xfm}(!RgYYFL7LYByUp|X1-+NX% zWqaWq(;iM=Cx+f)fJD9n4JV)?p_v&Jt@oENGuhw#Y1Y1sA@?KuOuI0}_ZV~`y9s;z z--V`d1|Aa~Jpb}bzWS|en_s>;S~0T+Lmx1t<_(m*sEd8uQpC3RxEquBG%Tw2BZfX< z=raaYS`(9~DpnqE)G&~5s9!R*r$@5jWa$?SeTCmtkT{)H(S2yaUHrIB;);a5vSqy( z`i4Pq01|H$^Yyyq`Lz!W^SiT=Yh)jW`ay%Je;|ldhT9lt+WfBEyQI2jN3R3vJB9`@ zC?TVrX2Bf8^O?T z42=?J&;`G1`XxWn%|7`^jfinL?BLVqe=z7Vti`|ArzRirt+~6&?57s5^v1<842=^9 z_zRXLwgv133Lv)>8};~{s+$|*#P4sfnm>Ud7dBW4;j$ame^*;En48e0wN~~j4au%- z=)IDew<9%&-CD^dCCtEd))q#Qh`(F5;Sni6& z)cK?-1GkU*v5`L;(zO8C`HXMEGE(qM`uu(7@g|H!;^d-u{ zV|Q@+q4JUwJL8+K)|8KSyk+87V}qv{%Ees_G;d$M`|DqFC>uf@4>$L|6sOQz%1xyEnAGh#a@68gI2%O}gu~LD`$ZgB!e zNVZlEd4hpoNLAlCSMAQ1Hb1XU?FWtOSJ~(q8^GyqP_jDz7HmZO%oNrE8~au{Ze0`` zMYEw{_Y*$r>`ngi>w|o4p8jczUUGe23>(F=(XnMb{I;Ee`-XC{>w8S_vv#9aKpY#z zvylTRw9OLikabSZ>AhZ$^W}z49Zp~yTxSCqS3!G1!%Z6kcK(SH&uvM_3Hw+~ZB1nB zb-*XMFk2=t+Tp-H!^695-z=CeNn&fKmgl!xqZxZ6gi=Q3;Az!?rB6YzYRhI8yHXGdnjiv%1$XIdIcQz86C~2SGw>o!c z(PIie?a`@K#tRozK8txc_wKg~8n@Z{IqZYEY#6J>?hxmLTpoZDNJh?%zj(Y0Ts%ZqhwfK{|dZ1k87v$5sCN$78w z5@^qQZIz^v9mc#Oz+;=A+Z!q(8e-%SLr_+J7<7c+Uy*jT(eIMAwhB^htj@0XF ze5*`ki$hyjNByw_dzw&-+bg!J{%bh$|3>x2IK|_1 z*mSR$TW3D?UGnNkXm4esw#m1_m#ot_PYN^n(U$+y(LeZC^M-aX3UI$qBpc6_UKk$T zcAh)+hV1CpH*D0whN#vFVz(Ds38DTqsfzt`arj-KV9X}`w84_MZ1j$eByd3c!*RLE z3D=f9cX{9@tGw}K7vY7Vj{ek@7S0@h8DBa~d6d0$)_XSUWJ_sa(osfrsYMAAlJlUXQ)wHcC+>fJIFPP9z z`#BA>(FnLynh6gt{eJDbf3cC>H0vER$o!Gw-=OD&*Z2d>HZdlQ!C|(kvcu^s^|42G zMD6XqEI-CZf2J+Cq``;qmytY(U|_6U3L>aq1)Q^|9ohTMg3^ zCfLY@1G9{-9Jv2v0WA`!3;=`64D0p(c;NTE9u27~w?#+XIB?~Ghx3*m)1=3|(3$r< z`3&hw)^&Fd^5CGu5K2f_dV)g2F`w)@j+RsZ$zo3q^5TF4@#es#T4Nz`l`;L*%Vv4^ z^7F-&P1_=@DW`lm$d?1$04M0NV~b_)9Nk5!{?AkHzm#3<$3gxar2Yuw;d_m*Y3>t; zNSB$94Oe4Z>;pLZmpOWY9Q_~;*dW|8y~2Su^W@!iaEOgQ%?k2fp$E+5$KIIy{KOn) z;oChT_h?oe+TXc1u_|M=)b?Nw3gMto4sv+G2;;!zXnRYz0P#-l`;s>6kfqid^-(JZ ztiw5)5gg@mRt7ba1NW$4zLn?`KzZ?O91jT5y0-4r+#R`EPXejGFx(uMQE)ype;`mR z_@UCm3F)gG=r%)NZh^4Xg6X#VpV8Q^=l4vbuW?Wm2bvtwz!4D)SpY{E^UlfpT=2?u z7O7C5Cq}G};hf^cd6*gr;G)y>+8hRbnoQ7QvQftE zFZ6g0^oo2LxMqHc|AYf`uIrsuE*X9E;}SUNItOs!M35>>TM`2p&>gNyRIa_D5o+%* zg?W$sQ7lX1pc@<*MC$-|F#~br7fmtOtXp!vyf}5{%Vds9DLn;VhndsK$rXGg)I?T8 zxAt1g`Q6KIY~Q>mm4nhaFwwadOfT#%_1cVkx>W_M>VquL@zXg-hll4rQ}Vs=bFJHs zn)LE*_S^e2fLJyNX;7`QeZlC|UxHiChn73pwq$Z3|Ar}T8-ACuy}Lo_qBR{CGd8$p zanMcBOrmpjV}IPax>@4|eZ3sT`%5l8%jTe4#O~l#_{H@L&7%HJ5eRR75;li^xD5y5 zAn9BX+y6Vv%)^&y8>JnzeYKMt`Y2O{e$?j<2dxI5k9Wz}7oJtzznXpg;|h)OJPyj| zAY)k81vRN#PkdgH?z=5px_L);0S6UwkoYyoAgzqDGy1#Y;rFlap|S?w7k4@O#aKE8 zr#K#ezu4sa&@=Ji$I#`!Vv9Jc#T>Zz$!kqley5Z+!L{4@ zfP)@#(5gqUuz2zcIS(H{v+yN05>m=@GaV>jXYKTugUUe;V4O3*%nsW*1y6m_7vR)= zRrYKQ9hbN$=N8O!l~yzm>#aQ*#jfC>Cmis{Mc^VTuPn~!h}e-IXW7fjT0kDG!oR4gN%|Wdkvk$ z1de7qiFV0!rp4)1bgA~dOECQ|n^XLTW6;4d=;UbTlHYPjo_6*Ql6Sz1$rnm7Tx$%ZI#0k=>7u~0B)%NgA{1yvu?x;bbY4}UEr9i3kx zpkIm}GjhJT-?xW@K5!t>0rI@$^qa)8SAVO%iHv5AMn!()piiKZpTQF0M*Jjh0geN0 zjtiyk4|?RGo92-3kotvlFp&wRJj>qq+wT?6Zkq4j>b-XbU;iry^%7G32Gl|*6*$3g z3IExN#89TES^J$C=L!~R^nn|N04aOz;GcUVCh?C$?0Y^KAenv+TwViwyw0qQRx=}D zpUK-PDu=iizjI)ukB1)^JknBLd;9o0kJZPp&q|yD4kYcsiMPoe^?C@(Z z)+LbfQ*y59i;%V0JS22(<*r=O4~Pojd%>uk=eS3%QLKGxb8dWe@U-5Z7CIggyz5x5 z%CBdGb$2h-&P$v(2wo3jz^RjNn-(4WeDHwG)s=mf)S6##EYQ<^=eylrm;RBL85og& zo4Cz+h@&#hQ5xaM{O0J4a&-Q1&=^D^#{cg+OcX9_U;RsPw0OP7g!Upo*>Mgsf(F_8 z4yUSl)A9o}ovR9GWQYCbpb3a;vM}ZB+cVwx6XPOF5K|q;U%LbsTtcA zN9FoYO^tIeE_3A~H!h4Nv;ixn)oQPsJNNCEDms_>ZDePbI~RFyVN~M@1m$a*Mnfr0 zJ&aY^Uw2b{tL}Spkrx*dNpCL68(Q1&eGTxaWjgY5wNNChf?(kmy_{al)!~14EVL_ep6^I zGi@pt^;x@IjI4FM&P9n_$oP_ABS54GJP?kI$(}A(6mhPVZn`b6WikH-S1*~Xm%>%6 zhYNe8!tD42tZ>7pWGqvFDHm{rU^Jmz<*s-$b!ScU1xhR_pS^6z5DTw$sod0){ z2uc#ODbHiSg?DUN%-T%vsOi5AvV-5$L=Mb)mR%2&SNgqIX~6Sp->&CtbGgv%0=Frg zb?D;I(20%ybvI@Q87ki4qC75Sbl@`TbfS;K^xSkK{|s_th7Zc;LK@1$-{&n#_N=

9+z<;htXmrt{}9T##&3nO=~38Xaginxl!T*G_Z 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 literal 0 HcmV?d00001 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 0000000000000000000000000000000000000000..c1b014ebecdc6ad133ee4ef78c833c17695706f0 GIT binary patch literal 17 UcmZP$cJnpe`{Bc11_;mu05%T<;s5{u literal 0 HcmV?d00001 diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 00000000..7c0a2cae --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Sat Feb 25 23:27:14 KST 2023 +gradle.version=7.6 diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000000000000000000000000000000000000..d4878867095928f30dcc222a5b53a823ec3a6a34 GIT binary patch literal 18983 zcmeI%T}V@L7{~FW2GT5Dg)$ZD#*1Y`1QooQI0)MY6)7&rB6cAvqBun7R2&9@`G#Ul zh89l67jgp=B=Eulu@qExAt?E;vi*bi#*7;3PVPfnrtut~bwTR7a_-K#fmru%e=5!AaCfC^H$9!%Vbr_0 zf6P+Gc&y77+Gp;lueKZSmf9WE)!b*4cWxA0p3pN9eHizpE_*^_>U6g>uaD;Lb9AV7 zWWV0f_iDKN)8vNvmZy`ne=PSsWs&oOySkpbpZm|m#+C9wcM0`X?pIxrrZQWbhW6j% zuCl#Ny8cCXh2}fCr&O#ZJR9lzM)NPYtMk|OiqDz|n!nH8Fxp&vuV7}8<|nxqJWOx8 z{8;{o=8fD7zuG>8 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 00000000..ce412026 --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,12 @@ + + + + + mysql.8 + true + com.mysql.cj.jdbc.Driver + jdbc:mysql://localhost:3306 + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 00000000..32703c56 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 00000000..fdc392fe --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..5d982561 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..8b463067 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/modules/project.main.iml b/.idea/modules/project.main.iml new file mode 100644 index 00000000..9cc36c92 --- /dev/null +++ b/.idea/modules/project.main.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 00000000..2b63946d --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..35eb1ddf --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ 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..249e5832f090a2944b7473328c07c9755baa3196 GIT binary patch literal 60756 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 Date: Sun, 26 Feb 2023 01:07:02 +0900 Subject: [PATCH 03/20] =?UTF-8?q?feat:=20entity=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/restaurant/entity/Restaurant.java | 49 ++++++++++++++++- .../restaurant/entity/RestaurantCategory.java | 7 +++ .../domain/review/entity/Review.java | 52 ++++++++++++++++++- 3 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/project/hackathon/domain/restaurant/entity/RestaurantCategory.java diff --git a/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java b/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java index edda91b8..482d0705 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java @@ -1,4 +1,51 @@ package com.project.hackathon.domain.restaurant.entity; -public class Restaurant { +import lombok.*; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@Getter +@Entity +@AllArgsConstructor +@NoArgsConstructor +@Table(name = "restaurant") +public class Restaurant{ + + @Id // 이 멤버변수는 primary key라는 것을 나타내며 없으면 에러남 + @GeneratedValue(strategy = GenerationType.IDENTITY) // id를 autoincrement로 설정 + private Long id; + + // 레스토랑 명 + @Column(name = "title", nullable = false) + private String title; + + // 레스토랑 카테고리 + @Column(name = "restaurant_category", nullable = false) + @Enumerated(EnumType.STRING) + private RestaurantCategory restaurantCategory; + + // 음식점 생성일자 + @Column(name = "created_at", nullable = false) + private LocalDateTime createdAt; + + @Column(name = "is_removed", nullable = false) + private boolean isRemoved; + + + @Builder + public Restaurant( + String title, + RestaurantCategory restaurantCategory, + LocalDateTime createdAt) { + this.title = title; + this.restaurantCategory = restaurantCategory; + this.createdAt = createdAt; + this.isRemoved = false; + } + + public void deleteRestaurant() { //soft delete + this.isRemoved = true; + } + } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/restaurant/entity/RestaurantCategory.java b/src/main/java/com/project/hackathon/domain/restaurant/entity/RestaurantCategory.java new file mode 100644 index 00000000..ef925ab1 --- /dev/null +++ b/src/main/java/com/project/hackathon/domain/restaurant/entity/RestaurantCategory.java @@ -0,0 +1,7 @@ +package com.project.hackathon.domain.restaurant.entity; + +public enum RestaurantCategory { + 한식, + 중식, + 일식 +} diff --git a/src/main/java/com/project/hackathon/domain/review/entity/Review.java b/src/main/java/com/project/hackathon/domain/review/entity/Review.java index 4d6ff9dd..b44d69d9 100644 --- a/src/main/java/com/project/hackathon/domain/review/entity/Review.java +++ b/src/main/java/com/project/hackathon/domain/review/entity/Review.java @@ -1,4 +1,54 @@ package com.project.hackathon.domain.review.entity; -public class Review { +import com.project.hackathon.domain.restaurant.entity.RestaurantCategory; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.time.LocalDateTime; + +@Getter +@Entity +@AllArgsConstructor +@NoArgsConstructor +@Table(name = "review") +public class Review{ + + @Id // 이 멤버변수는 primary key라는 것을 나타내며 없으면 에러남 + @GeneratedValue(strategy = GenerationType.IDENTITY) // id를 autoincrement로 설정 + private Long id; + + // 리뷰 제목 + @Column(name = "title", nullable = false) + private String title; + + // 리뷰 내용 + @Lob // 엄청나게 긴 text + @Column(name = "content", nullable = false) + private String content; + + // 특정 레스토랑명 + @Column(name = "restaurant", nullable = false) + private String restaurant; + + @Column(name = "is_removed", nullable = false) + private boolean isRemoved; + + @Builder + public Review( + String title, + String content, + String restaurant) { + this.title = title; + this.content = content; + this.restaurant = restaurant; + this.isRemoved = false; + } + + public void deleteRestaurant() { //soft delete + this.isRemoved = true; + } + } \ No newline at end of file From 0280812f01de6da2cc0d72d8f49d83c73c51d3ee Mon Sep 17 00:00:00 2001 From: HAERYN Date: Sun, 26 Feb 2023 01:32:42 +0900 Subject: [PATCH 04/20] =?UTF-8?q?feat:=20repository=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/restaurant/entity/Restaurant.java | 1 - .../repository/RestaurantRepository.java | 24 ++++++++++++++++- .../review/repository/ReviewRepository.java | 27 ++++++++++++++++++- 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java b/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java index 482d0705..59ed95b1 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java @@ -11,7 +11,6 @@ @NoArgsConstructor @Table(name = "restaurant") public class Restaurant{ - @Id // 이 멤버변수는 primary key라는 것을 나타내며 없으면 에러남 @GeneratedValue(strategy = GenerationType.IDENTITY) // id를 autoincrement로 설정 private Long id; diff --git a/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java b/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java index 77b0e095..6ce342f2 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java @@ -1,4 +1,26 @@ package com.project.hackathon.domain.restaurant.repository; -public class RestaurantRepository { +import com.project.hackathon.domain.restaurant.entity.Restaurant; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.Optional; + +public interface RestaurantRepository extends JpaRepository { + + @Query("select p from Restaurant p where p.id = :id") + Optional findRestaurantById(@Param("id") Long id); + + @Query("select u from Restaurant u where u.restaurantCategory = :restaurantCategory") + Optional findRestaurantByCategory(@Param("restaurantCategory") String restaurantCategory); + + @Query("select p from Restaurant p") + Page findRestaurantWithPagination(Pageable pageable); + + @Query("select p from Restaurant p where p.title like %:keyword%") + Page findContainingTitleRestaurantWithPagination( + Pageable pageable, @Param("keyword") String keyword); } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java b/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java index 5be3c77b..b1eede6c 100644 --- a/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java +++ b/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java @@ -1,4 +1,29 @@ package com.project.hackathon.domain.review.repository; -public class ReviewRepository { +import com.project.hackathon.domain.restaurant.entity.Restaurant; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.Optional; + +public interface ReviewRepository extends JpaRepository { + + @Query("select p from Review p where p.id = :id") + Optional findReviewById(@Param("id") Long id); + + @Query("select u from Review u where u.title = :title") + Optional findReviewByTitle(@Param("title") String title); + + @Query("select u from Review u where u.content = :content") + Optional findReviewByContent(@Param("content") String content); + + @Query("select p from Review p") + Page findReviewWithPagination(Pageable pageable); + + @Query("select p from Review p where p.title like %:keyword%") + Page findContainingTitleReviewWithPagination( + Pageable pageable, @Param("keyword") String keyword); } \ No newline at end of file From 5d32d009562e2f6ff61a555cbb47f64d00b481b8 Mon Sep 17 00:00:00 2001 From: HAERYN Date: Sun, 26 Feb 2023 01:56:13 +0900 Subject: [PATCH 05/20] =?UTF-8?q?feat:=20dto=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/RestaurantCreateRequest.java | 21 +++++++++++++++++++ .../dto/RestaurantUpdateRequest.java | 21 +++++++++++++++++++ .../review/dto/ReviewCreateRequest.java | 20 ++++++++++++++++++ .../review/dto/ReviewUpdateRequest.java | 20 ++++++++++++++++++ .../review/service/RestaurantService.java | 4 ---- .../domain/review/service/ReviewService.java | 15 +++++++++++++ 6 files changed, 97 insertions(+), 4 deletions(-) delete mode 100644 src/main/java/com/project/hackathon/domain/review/service/RestaurantService.java create mode 100644 src/main/java/com/project/hackathon/domain/review/service/ReviewService.java diff --git a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java index d1043238..5a57c974 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java @@ -1,4 +1,25 @@ package com.project.hackathon.domain.restaurant.dto; +import com.project.hackathon.domain.restaurant.entity.RestaurantCategory; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Getter +@Builder +@AllArgsConstructor public class RestaurantCreateRequest { + @NotNull(message = "레스토랑 Id는 공백이 올 수 없습니다.") + private final String id; + + @NotBlank(message = "레스토랑 제목은 빈칸일 수 없습니다.") + private final String title; + + @NotNull(message = "레스토랑 카테고리는 공백이 올 수 없습니다.") + private final RestaurantCategory restaurantCategory; + + private final LocalDateTime createdAt; } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java index 6846d293..16113cb6 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java @@ -1,4 +1,25 @@ package com.project.hackathon.domain.restaurant.dto; +import com.project.hackathon.domain.restaurant.entity.RestaurantCategory; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Getter +@Builder +@AllArgsConstructor public class RestaurantUpdateRequest { + @NotNull(message = "레스토랑 Id는 공백이 올 수 없습니다.") + private final String id; + + @NotBlank(message = "레스토랑 제목은 빈칸일 수 없습니다.") + private final String title; + + @NotNull(message = "레스토랑 카테고리는 공백이 올 수 없습니다.") + private final RestaurantCategory restaurantCategory; + + private final LocalDateTime createdAt; } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java b/src/main/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java index ec1d4055..e4094fb8 100644 --- a/src/main/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java +++ b/src/main/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java @@ -1,4 +1,24 @@ package com.project.hackathon.domain.review.dto; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Getter +@Builder +@AllArgsConstructor public class ReviewCreateRequest { + @NotNull(message = "리뷰 Id는 공백이 올 수 없습니다.") + private final String id; + + @NotBlank(message = "리뷰 제목은 빈칸일 수 없습니다.") + private final String title; + + @NotBlank(message = "리뷰 내용은 빈칸일 수 없습니다.") + private final String context; + + @NotBlank(message = "리뷰 레스토랑은 빈칸일 수 없습니다.") + private final String restaurant; } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java b/src/main/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java index e844508c..8fe72d4e 100644 --- a/src/main/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java +++ b/src/main/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java @@ -1,4 +1,24 @@ package com.project.hackathon.domain.review.dto; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Getter +@Builder +@AllArgsConstructor public class ReviewUpdateRequest { + @NotNull(message = "리뷰 Id는 공백이 올 수 없습니다.") + private final String id; + + @NotBlank(message = "리뷰 제목은 빈칸일 수 없습니다.") + private final String title; + + @NotBlank(message = "리뷰 내용은 빈칸일 수 없습니다.") + private final String context; + + @NotBlank(message = "리뷰 레스토랑은 빈칸일 수 없습니다.") + private final String restaurant; } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/review/service/RestaurantService.java b/src/main/java/com/project/hackathon/domain/review/service/RestaurantService.java deleted file mode 100644 index 57d01d78..00000000 --- a/src/main/java/com/project/hackathon/domain/review/service/RestaurantService.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.project.hackathon.domain.review.service; - -public class RestaurantService { -} \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java b/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java new file mode 100644 index 00000000..94f0d7af --- /dev/null +++ b/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java @@ -0,0 +1,15 @@ +package com.project.hackathon.domain.review.service; + +import com.project.hackathon.domain.review.repository.ReviewRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +@Slf4j +public class ReviewService { + private final ReviewRepository reviewRepository; + + +} \ No newline at end of file From 14573448921c862b70f2df8e3730d88d59710971 Mon Sep 17 00:00:00 2001 From: HAERYN Date: Sun, 26 Feb 2023 02:53:02 +0900 Subject: [PATCH 06/20] =?UTF-8?q?feat:=20global=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...lication.java => HackatonApplication.java} | 4 +- .../dto/RestaurantCreateRequest.java | 4 +- .../dto/RestaurantUpdateRequest.java | 4 +- ...{RestaurantCategory.java => Category.java} | 2 +- .../domain/restaurant/entity/Restaurant.java | 18 ++++++--- .../domain/review/entity/Review.java | 16 ++++---- .../config/JpaAuditingConfiguration.java | 8 ++++ .../hackathon/global/dto/ErrorResponse.java | 23 +++++++++++ .../hackathon/global/dto/ResultResponse.java | 23 +++++++++++ .../hackathon/global/entity/BaseEntity.java | 39 +++++++++++++++++++ 10 files changed, 121 insertions(+), 20 deletions(-) rename src/main/java/com/project/hackathon/{DemoApplication.java => HackatonApplication.java} (70%) rename src/main/java/com/project/hackathon/domain/restaurant/entity/{RestaurantCategory.java => Category.java} (72%) create mode 100644 src/main/java/com/project/hackathon/global/config/JpaAuditingConfiguration.java create mode 100644 src/main/java/com/project/hackathon/global/dto/ErrorResponse.java create mode 100644 src/main/java/com/project/hackathon/global/dto/ResultResponse.java create mode 100644 src/main/java/com/project/hackathon/global/entity/BaseEntity.java diff --git a/src/main/java/com/project/hackathon/DemoApplication.java b/src/main/java/com/project/hackathon/HackatonApplication.java similarity index 70% rename from src/main/java/com/project/hackathon/DemoApplication.java rename to src/main/java/com/project/hackathon/HackatonApplication.java index 1011dbc1..3d38755a 100644 --- a/src/main/java/com/project/hackathon/DemoApplication.java +++ b/src/main/java/com/project/hackathon/HackatonApplication.java @@ -4,10 +4,10 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class DemoApplication { +public class HackatonApplication { public static void main(String[] args) { - SpringApplication.run(DemoApplication.class, args); + SpringApplication.run(HackatonApplication.class, args); } } diff --git a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java index 5a57c974..f10c89e6 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java @@ -1,6 +1,6 @@ package com.project.hackathon.domain.restaurant.dto; -import com.project.hackathon.domain.restaurant.entity.RestaurantCategory; +import com.project.hackathon.domain.restaurant.entity.Category; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -19,7 +19,7 @@ public class RestaurantCreateRequest { private final String title; @NotNull(message = "레스토랑 카테고리는 공백이 올 수 없습니다.") - private final RestaurantCategory restaurantCategory; + private final Category category; private final LocalDateTime createdAt; } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java index 16113cb6..ee63238e 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java @@ -1,6 +1,6 @@ package com.project.hackathon.domain.restaurant.dto; -import com.project.hackathon.domain.restaurant.entity.RestaurantCategory; +import com.project.hackathon.domain.restaurant.entity.Category; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -19,7 +19,7 @@ public class RestaurantUpdateRequest { private final String title; @NotNull(message = "레스토랑 카테고리는 공백이 올 수 없습니다.") - private final RestaurantCategory restaurantCategory; + private final Category restaurantCategory; private final LocalDateTime createdAt; } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/restaurant/entity/RestaurantCategory.java b/src/main/java/com/project/hackathon/domain/restaurant/entity/Category.java similarity index 72% rename from src/main/java/com/project/hackathon/domain/restaurant/entity/RestaurantCategory.java rename to src/main/java/com/project/hackathon/domain/restaurant/entity/Category.java index ef925ab1..46746795 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/entity/RestaurantCategory.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/entity/Category.java @@ -1,6 +1,6 @@ package com.project.hackathon.domain.restaurant.entity; -public enum RestaurantCategory { +public enum Category { 한식, 중식, 일식 diff --git a/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java b/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java index 59ed95b1..30958894 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java @@ -4,6 +4,7 @@ import javax.persistence.*; import java.time.LocalDateTime; +import java.util.ArrayList; @Getter @Entity @@ -11,18 +12,23 @@ @NoArgsConstructor @Table(name = "restaurant") public class Restaurant{ - @Id // 이 멤버변수는 primary key라는 것을 나타내며 없으면 에러남 - @GeneratedValue(strategy = GenerationType.IDENTITY) // id를 autoincrement로 설정 + @Id + @GeneratedValue + @Column(name = "id") private Long id; // 레스토랑 명 +// @OneToMany(fetch=FetchType.EAGER, cascade = CascadeType.ALL) // (1) +// @JoinColumn(name="title") +// private List title = new ArrayList<>(); + @Column(name = "title", nullable = false) private String title; // 레스토랑 카테고리 - @Column(name = "restaurant_category", nullable = false) + @Column(name = "category", nullable = false) @Enumerated(EnumType.STRING) - private RestaurantCategory restaurantCategory; + private Category category; // 음식점 생성일자 @Column(name = "created_at", nullable = false) @@ -35,10 +41,10 @@ public class Restaurant{ @Builder public Restaurant( String title, - RestaurantCategory restaurantCategory, + Category category, LocalDateTime createdAt) { this.title = title; - this.restaurantCategory = restaurantCategory; + this.category = category; this.createdAt = createdAt; this.isRemoved = false; } diff --git a/src/main/java/com/project/hackathon/domain/review/entity/Review.java b/src/main/java/com/project/hackathon/domain/review/entity/Review.java index b44d69d9..fd6a65d1 100644 --- a/src/main/java/com/project/hackathon/domain/review/entity/Review.java +++ b/src/main/java/com/project/hackathon/domain/review/entity/Review.java @@ -1,13 +1,13 @@ package com.project.hackathon.domain.review.entity; -import com.project.hackathon.domain.restaurant.entity.RestaurantCategory; +import com.project.hackathon.domain.restaurant.entity.Restaurant; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; - import javax.persistence.*; -import java.time.LocalDateTime; +import java.util.ArrayList; +import static javax.persistence.FetchType.LAZY; @Getter @Entity @@ -17,7 +17,8 @@ public class Review{ @Id // 이 멤버변수는 primary key라는 것을 나타내며 없으면 에러남 - @GeneratedValue(strategy = GenerationType.IDENTITY) // id를 autoincrement로 설정 + @GeneratedValue + @Column(name = "id") private Long id; // 리뷰 제목 @@ -30,8 +31,9 @@ public class Review{ private String content; // 특정 레스토랑명 - @Column(name = "restaurant", nullable = false) - private String restaurant; + @ManyToOne(fetch = LAZY) + @JoinColumn(name = "restaurant", nullable = false) + private Restaurant restaurant; @Column(name = "is_removed", nullable = false) private boolean isRemoved; @@ -40,7 +42,7 @@ public class Review{ public Review( String title, String content, - String restaurant) { + Restaurant restaurant) { this.title = title; this.content = content; this.restaurant = restaurant; diff --git a/src/main/java/com/project/hackathon/global/config/JpaAuditingConfiguration.java b/src/main/java/com/project/hackathon/global/config/JpaAuditingConfiguration.java new file mode 100644 index 00000000..95125f41 --- /dev/null +++ b/src/main/java/com/project/hackathon/global/config/JpaAuditingConfiguration.java @@ -0,0 +1,8 @@ +package com.project.hackathon.global.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; + +@EnableJpaAuditing +@Configuration +public class JpaAuditingConfiguration {} diff --git a/src/main/java/com/project/hackathon/global/dto/ErrorResponse.java b/src/main/java/com/project/hackathon/global/dto/ErrorResponse.java new file mode 100644 index 00000000..fb873ab0 --- /dev/null +++ b/src/main/java/com/project/hackathon/global/dto/ErrorResponse.java @@ -0,0 +1,23 @@ +package com.project.hackathon.global.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ErrorResponse { + // Global + INTERNAL_SERVER_ERROR(500, "G001", "서버 오류"), + + // Restaurant + RESTAURANT_NOT_FOUND(400, "RT001", "레스토랑을 찾을 수 없습니다."), + + // Review + REVIEW_NOT_FOUND(400, "RV001", "리뷰를 찾을 수 없습니다."), + CANT_DELETE_REVIEW(400, "RV003", "이미 삭제된 이미지입니다.") + ; + + private final int status; + private final String code; + private final String message; +} diff --git a/src/main/java/com/project/hackathon/global/dto/ResultResponse.java b/src/main/java/com/project/hackathon/global/dto/ResultResponse.java new file mode 100644 index 00000000..b64df8ab --- /dev/null +++ b/src/main/java/com/project/hackathon/global/dto/ResultResponse.java @@ -0,0 +1,23 @@ +package com.project.hackathon.global.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ResultResponse { + + // restaurant + RESTAURANT_CREATE_SUCCESS("RT001", "레스토랑 등록 성공"), + + // review + REVIEW_CREATE_SUCCESS("RV001", "리뷰 업로드 성공"), + REVIEW_GET_SUCCESS("RV002", "리뷰 조회 성공"), + BOARD_DELETE_SUCCESS("RV003", "리뷰 삭제 성공"), + REVIEW_LIST_PAGE_GET_SUCCESS("RV005", "리뷰 리스트 페이징 조회 성공"), + REVIEW_LIST_PAGE_SEARCH_SUCCESS("RV006", "리뷰 검색 성공"), + ; + + private final String code; + private final String message; +} \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/global/entity/BaseEntity.java b/src/main/java/com/project/hackathon/global/entity/BaseEntity.java new file mode 100644 index 00000000..0779b658 --- /dev/null +++ b/src/main/java/com/project/hackathon/global/entity/BaseEntity.java @@ -0,0 +1,39 @@ +package com.project.hackathon.global.entity; + +import java.time.LocalDateTime; +import javax.persistence.Column; +import javax.persistence.EntityListeners; +import javax.persistence.MappedSuperclass; +import javax.persistence.PrePersist; +import lombok.Getter; +import org.hibernate.annotations.DynamicInsert; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +@MappedSuperclass +@EntityListeners(value = {AuditingEntityListener.class}) +@Getter +@DynamicInsert + +public abstract class BaseEntity { + @CreatedDate + @Column(name = "created_at", updatable = false) + private LocalDateTime createdAt; + + @LastModifiedDate + @Column(name = "updated_at") + private LocalDateTime updatedAt; + + @Column(name = "is_active", nullable = false) + private Boolean isActive; + + @PrePersist + public void prePersist() { + this.isActive = this.isActive == null ? true : this.isActive; + } + + protected void delete() { + this.isActive = false; + } +} From 60a0501d014b3fa15aabf4b077798fdb6db34801 Mon Sep 17 00:00:00 2001 From: HAERYN Date: Sun, 26 Feb 2023 03:19:33 +0900 Subject: [PATCH 07/20] =?UTF-8?q?fix:=20global=20entity=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EC=84=A4=EC=A0=95=20=ED=9B=84=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/restaurant/entity/Restaurant.java | 17 +++++++------- .../repository/RestaurantRepository.java | 10 ++++---- .../domain/review/entity/Review.java | 3 ++- .../review/repository/ReviewRepository.java | 23 ++++++++++--------- 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java b/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java index 30958894..e07d97e2 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java @@ -1,5 +1,7 @@ package com.project.hackathon.domain.restaurant.entity; +import com.project.hackathon.domain.review.entity.Review; +import com.project.hackathon.global.entity.BaseEntity; import lombok.*; import javax.persistence.*; @@ -11,19 +13,16 @@ @AllArgsConstructor @NoArgsConstructor @Table(name = "restaurant") -public class Restaurant{ +public class Restaurant extends BaseEntity{ @Id @GeneratedValue @Column(name = "id") private Long id; - // 레스토랑 명 -// @OneToMany(fetch=FetchType.EAGER, cascade = CascadeType.ALL) // (1) -// @JoinColumn(name="title") -// private List title = new ArrayList<>(); - - @Column(name = "title", nullable = false) - private String title; + // 레스토랑명 + @OneToMany(fetch=FetchType.EAGER, cascade = CascadeType.ALL) // (1) + @JoinColumn(name="title") + private ArrayList title = new ArrayList<>(); // 레스토랑 카테고리 @Column(name = "category", nullable = false) @@ -40,7 +39,7 @@ public class Restaurant{ @Builder public Restaurant( - String title, + ArrayList title, Category category, LocalDateTime createdAt) { this.title = title; diff --git a/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java b/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java index 6ce342f2..afac5374 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java @@ -11,16 +11,16 @@ public interface RestaurantRepository extends JpaRepository { - @Query("select p from Restaurant p where p.id = :id") + @Query("select r from Restaurant r where r.id = :id and r.isActive = true") Optional findRestaurantById(@Param("id") Long id); - @Query("select u from Restaurant u where u.restaurantCategory = :restaurantCategory") - Optional findRestaurantByCategory(@Param("restaurantCategory") String restaurantCategory); + @Query("select r from Restaurant r where r.category = :category and r.isActive is true") + Optional findRestaurantByCategory(@Param("category") String restaurantCategory); - @Query("select p from Restaurant p") + @Query("select r from Restaurant r where r.isActive is true") Page findRestaurantWithPagination(Pageable pageable); - @Query("select p from Restaurant p where p.title like %:keyword%") + @Query("select r from Restaurant r where r.isActive is true and r.title like %:keyword%") Page findContainingTitleRestaurantWithPagination( Pageable pageable, @Param("keyword") String keyword); } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/review/entity/Review.java b/src/main/java/com/project/hackathon/domain/review/entity/Review.java index fd6a65d1..f128ffd0 100644 --- a/src/main/java/com/project/hackathon/domain/review/entity/Review.java +++ b/src/main/java/com/project/hackathon/domain/review/entity/Review.java @@ -1,6 +1,7 @@ package com.project.hackathon.domain.review.entity; import com.project.hackathon.domain.restaurant.entity.Restaurant; +import com.project.hackathon.global.entity.BaseEntity; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -14,7 +15,7 @@ @AllArgsConstructor @NoArgsConstructor @Table(name = "review") -public class Review{ +public class Review extends BaseEntity { @Id // 이 멤버변수는 primary key라는 것을 나타내며 없으면 에러남 @GeneratedValue diff --git a/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java b/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java index b1eede6c..61f76c7f 100644 --- a/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java +++ b/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java @@ -1,6 +1,7 @@ package com.project.hackathon.domain.review.repository; import com.project.hackathon.domain.restaurant.entity.Restaurant; +import com.project.hackathon.domain.review.entity.Review; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -9,21 +10,21 @@ import java.util.Optional; -public interface ReviewRepository extends JpaRepository { +public interface ReviewRepository extends JpaRepository { - @Query("select p from Review p where p.id = :id") - Optional findReviewById(@Param("id") Long id); + @Query("select r from Review r where r.id = :id and r.isActive = true") + Optional findReviewById(@Param("id") Long id); - @Query("select u from Review u where u.title = :title") - Optional findReviewByTitle(@Param("title") String title); + @Query("select r from Review r where r.title like :title and r.isActive = true") + Optional findReviewByTitle(@Param("title") String title); - @Query("select u from Review u where u.content = :content") - Optional findReviewByContent(@Param("content") String content); + @Query("select r from Review r where r.content like :content and r.isActive = true") + Optional findReviewByContent(@Param("content") String content); - @Query("select p from Review p") - Page findReviewWithPagination(Pageable pageable); + @Query("select r from Review r where r.isActive = true") + Page findReviewWithPagination(Pageable pageable); - @Query("select p from Review p where p.title like %:keyword%") - Page findContainingTitleReviewWithPagination( + @Query("select r from Review r where r.isActive = true and r.title like %:keyword%") + Page findContainingTitleReviewWithPagination( Pageable pageable, @Param("keyword") String keyword); } \ No newline at end of file From b69f501a385bb3540da582994c078169fa0c0e16 Mon Sep 17 00:00:00 2001 From: HAERYN Date: Sun, 26 Feb 2023 08:02:53 +0900 Subject: [PATCH 08/20] =?UTF-8?q?feat:=20create=20=EC=84=B1=EA=B3=B5!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gradle/7.6/checksums/checksums.lock | Bin 17 -> 17 bytes .gradle/7.6/checksums/md5-checksums.bin | Bin 24797 -> 24947 bytes .gradle/7.6/checksums/sha1-checksums.bin | Bin 36803 -> 37289 bytes .../7.6/executionHistory/executionHistory.bin | Bin 80987 -> 298760 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/7.6/fileHashes/fileHashes.bin | Bin 19697 -> 23447 bytes .gradle/7.6/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../7.6/fileHashes/resourceHashesCache.bin | Bin 18973 -> 22135 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .gradle/buildOutputCleanup/outputFiles.bin | Bin 18983 -> 19091 bytes .gradle/file-system.probe | Bin 8 -> 8 bytes .idea/modules/project.main.iml | 4 +- build.gradle | 4 +- .../controller/RestaurantController.java | 72 +++++++++++++ .../dto/RestaurantCreateRequest.java | 17 ++- .../dto/RestaurantDetailResponse.java | 21 ++++ .../domain/restaurant/dto/RestaurantInfo.java | 28 +++++ .../dto/RestaurantUpdateRequest.java | 2 +- .../domain/restaurant/entity/Restaurant.java | 28 ++--- .../restaurant/service/RestaurantService.java | 75 ++++++++++++++ .../domain/review/service/ReviewService.java | 97 +++++++++++++++--- .../global/config/DataSourceConfig.java | 17 +++ src/main/resources/application.properties | 8 +- src/test/java/dbTest/MySQLConnectionTest.java | 28 +++++ 24 files changed, 358 insertions(+), 43 deletions(-) create mode 100644 src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantDetailResponse.java create mode 100644 src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantInfo.java create mode 100644 src/main/java/com/project/hackathon/global/config/DataSourceConfig.java create mode 100644 src/test/java/dbTest/MySQLConnectionTest.java diff --git a/.gradle/7.6/checksums/checksums.lock b/.gradle/7.6/checksums/checksums.lock index 1da07123aadbe2e707b706a2d094b66d60b62ee3..8c5abd2b00ed28af8e0cbdaff76297c98129d86e 100644 GIT binary patch literal 17 VcmZSPO^w=9%5t}o0Sp-50stuS1W5n@ literal 17 VcmZSPO^w=9%5t}o0Sp*#0stu81T_Ev diff --git a/.gradle/7.6/checksums/md5-checksums.bin b/.gradle/7.6/checksums/md5-checksums.bin index ce5941d69dd4fe9888a83fd52732f23115ec33f4..6c18002e1c8c4d2fa131dc883d47436035ee2ac9 100644 GIT binary patch delta 247 zcmcb6kn!^&#tkMCjE$R3B|ft8*Dh49Ivl)!0SprEPL`Fo5a5fbn4>1IwiqIq=(yQe zUV}v-pRaPu5r4K~s3`yBT;)YfJenI7e~521_`to{(PNH8y)jT$6NnW-SfFFcg~shk zdFQA3oxK-)>uDha17lm4yWa<>5zm0M9;yzD9nEu}dkV*Sc-ln-%n$tr(c!NS(ZTA0 jsbgNG>%66$D$DC*(key7We;b8wGA@~=uFgOgeK}eh! Dqks`p diff --git a/.gradle/7.6/checksums/sha1-checksums.bin b/.gradle/7.6/checksums/sha1-checksums.bin index 2aa3e1bd482b2b41a0173b8d10fb2768737f04e8..d8c27169dd327b946ba844e66c603e0bfbb5756f 100644 GIT binary patch delta 694 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 delta 539 zcmbQfo$=#L#tkMCf)Z`%O2@tK?Mz?*1JB&atda_oZ6zfp=Sq4^?v*l_d{s(fvaGbk zWM3dwm64d-3dDbbSXb6ya;luf?%ZFOtrlQi=)}Ol*w)GUFB;;4!ZaYQXAC4XfmjiQ z1zxk)KDp<y^s+Sv{$OxBH(lE5YjG_D>bIoZ=wgaxcJ(bEUJO16L( zK$UuvKYPmIQt%q2fTfcy;QeHOA1MWXz5a;5+j^b_RDbXA>p$%ccE51{W1v$(z;^P* zNHvyDZUZxr>dE&#MVZ+G9)j82-YH-{&jSs(9M1!De5SsD7z#6$E#MPO=VTurS*U3S zV6oXgB2Jxxk5@u;FbM-`v~c{AbNY1m#z(c&ZoSPA5^8)6cDdj)Xvn7-fOG%=C1~6dC0suTJ1t$Oi literal 17 UcmZQhIDR4ZmDNi>1_&?*06X&p@&Et; diff --git a/.gradle/7.6/fileHashes/resourceHashesCache.bin b/.gradle/7.6/fileHashes/resourceHashesCache.bin index 35dd187eb521fbf1e64e133d75e6d07564904f2c..ff0a40068bd005c64aa8ff3114ae9a1bdfb313f5 100644 GIT binary patch literal 22135 zcmeI(c{EjR-v@9>rc9+|DnuDeLP(hs=a^>^5k-cOq0CegNkoPW6_HyRqe$GOLAXsJ z^N=AKQjU4JdGGUF`#R5h&$ib4-@DfHtnH6F>(h7r_TJyK&pz8~U#b)o>?|9|55>QK zcK`b&_6lnNYXEBiYXEBiYXEBiYXEBiYXEBiYXEBiYXEBiYXEBiYXEBiYXEBiYv8}7 z0pouTgdQ9WyBH<$1@kouiX#mFyl@J(mOEOHTd@WItThJz{~)+(Xmo0UMiB9*(61B9 z&0}Ny3xOMNfgUkk(bXVZ+X~#M0(vCpL(^01tpULGBcb1$RHD)lw|W6wa~XQ9O=uI_ z&HOjO@%qr?*;)N4TBYZK8#<8usanTj1Ib3jw?a?yc9TA~f9x%AeL<2(dUEOHX!9VB zhyI9QbLPkw7a`zArqCbnQYe33BybA2)=82-x42~TG5QK{-B#%7SJM*An)$teYj!}- zqv({Z395SqTt}YdeC7S77cOQa`B>=1)7>vqrrjif8?i!vt#fYX^7w)dGKT|tS!W2B z9o`qtc?G?KUyH}IW@ZuOb%mieR49A)<1T z$ad49zvn;2sZ#3~0bKJC^bdc@usukmNe8Z>2)zcEGp!aJl@DBh8_9DnXV1mWIs-ST zgx(-T+p;tM0yl7NQRs~?6}A0vf@#3qxpMETZ)0}4MXqFV1C>@h%W-JWd*%A zy317}zx5$-6G`Yp3>Uty&+ozmH~vL(;S7xq-q%-=IoC-p%dC)QE20Hl<2>|H`w)l$z|40CUB;T05?>JK6TvSbFq{h z+-?o@U&i&wvE5_1Ou33`~o@!%UXX;@81^@KMkGo zp+of?fBYrj+KbSsuDRPhzZS%W!-CEaQrHCIx)F8@fRZ6z;U+Fw>MgA zIh$`J0XOo2&S1K>ddKFrBybaBl4o~anHm1r2VCnT$#Xc|2$4!GNPY*&KabFbk8d~w z$K8U?sNXdZ?j`UMxG_I;CTY>1V(v1?^-cFObQa;#CpVNiLqJ};9r|t-?Y;79sw=?t zouIQ>W{%n(F+{FcI-}6pHMJCb&s#8pyv}=)$G(cTD5MAiZg>DXH*4(~`-yZq;Ck<% z?{huLXebzhTpx@Ep!3u2Ot!n^v;p!4X3&Mc?FL`qrAX1_ClA; zoS#4RKm$47^jn}yvBm0z?{`M7{{}K7&kea$zLw<<=4fj}mlanl_7LoG18$HC{rI0t zzr=a=BFC$%30>uw+KsFT%iqYHB9iM>k6kLa5C*Or1^twY?_4I|%yuO23SF&?zuQ7Q z7df8|c0S^E_c$pj*fI47gF$Am2>u8~RdIkBDx z^ef1H5iSe5x93h@hQ)5AAH6-${mgXl#wfQSb95}B2R#!dgp`XR@0Z?V=mCz`bq8S&-7a-|4OVdzJN}oOO7dp z8V%E{AFW}inX_R=C!$Rv&4$lkA+Y<-=f$`GF^NvNcp6=9s*00wa=6f@bTB>{o!A}t zWqqra5YHPa*?EOa{;$vp<~F?M?_Kg2OP4&&4|DzLgifeW3%ApE9-1{f+mfdLReTzq zn5h(qWNf)E;J7SjIcy$kj!sC8=CCG~?W`eC3a{cU_+FqBKHQD(!#G4Drwr%`?cYoZFsVy6PyvHlU1kW z6bYT75-;bhi6;-)ew=6FJsCQ;Mtif}`Ci*J(;0Na>9oReu5_jLLd}x|TfBz>I*~Ph zzp2F{a}giG?zH#Va5Fmb^{bR%cJ>jE1CP50%5u6}(FvWz^(j?8S+l(rp6xvcWQeN= z$o4dWef9d6lUdD2X}xR=7vfH$6W?ghH7zGZPPNrhQZq(l1wbX>^->8j2q6XIb~2%X@M!`L$sGMdDM@WXCe8 z&8*<_LyCK-SiOJR)Jp)JaJ$>ca!tO`D;UE3{(41K)^Sj@19$T&n=Vf>C%gLCY(VLB?bG| zZaaGYB(7*8ODMP;e^thj!NIH7l^z+!*nmzrlyUbAFCM@@XwGn+W-ks#C+M^sZKNWc z?)XMMZwV8o;zB2+ZgqGV^;4hdYz^!P=u_R~D%IcbV61C$S>~*<&!`~JSSfmjWwX7@ zVm+mm4qj70bbmDo~DVm<}hSl5c&4U~3Z!*w{I+2PN8HS2o8LQjpSoo?V(21Nx z+=3@3TVp^~Vn);A6<>5BS7XD{uvnDI{n{V{4cpaCuIm&GS#@E5>gHAoji;ZHbR(c= zjJT-@h@PPP^jOJ$$Bp0u;*;ED?~8jzeG#)&c5S5NZP(ImeNpH{ec3txnTun(mBCRd z*@roc(1{t>8xgHqO^pGy1*;2hQ;6$`$hML_A;dT<%T?E#&1Fz&ha)~IPnKBVNG|sH z%{C%3{Mm@Q%yyHbWh&ryu&XnCewRLsE!3;g3q3=liQ$h>839fijXL}J;3Q6T0xxU8 zGbTj)Y&1Vu^Aj)KCRfXIi+LRuTO0e>UAd`B%AJX8-pKa!yXhcJ-mwpSo-vuP?0a-K z`P}9fOL6txGH33SnjXrtnmUA@VcS2uoTXS=lCWS{J!EA)h)%G1zPxLtE|DoZm^&X( z@cuD6A$7}ru;kO;-wTjMW)W7%83 zIvaJN!tJa(RWAiRuY-f+{qr>chFD>4KNxu`%2f zH_(Zm>eb3Ebk`20#zYxA+Xyb96Wxp5Iu!@_s_RuLuh6#GJwPYQsab6HEcFzQQd+q! zkMQ0{C&Wz7?)mC*a;H3X&7@r59#3>a!h46G#~-@(9Q*on-SJn6YkA0y)=em2T27!V zB4x@VZa6YMkyjJvwc<2~^2s#mJKIXDbDaUh&`&Wrk>1l6t zB9TryNc^(6Yk`BNOXrwm7dqjs>a=n(Cyjf5ONOz+{GK#);_W`+-a2ESiys`Q1|-;N ziK}VI_B4JxKYXauNHoq z>c19jTwp5gh({-iYNh%N6mLFbvt^qLEKqunPMrTytXs!k9(1Z#u_SOn=3kxu4=4@& ArT_o{ delta 97 zcmeyqhH>r`#tkMCf_#&c+RlqLuiwc42A+YFRizXrzm<}hd{kOuGOvupjEMFnOth#AH)NAYV~}=RXuMFfb-=RQw^n(O`$zW=D@Zi~z!6CK><$ diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index c1b014ebecdc6ad133ee4ef78c833c17695706f0..80fea2ab781279865b786ee0d4d2084b5b45f6bc 100644 GIT binary patch literal 17 UcmZP$cJnpe`{Bc11_<~G05;zRvH$=8 literal 17 UcmZP$cJnpe`{Bc11_;mu05%T<;s5{u diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin index d4878867095928f30dcc222a5b53a823ec3a6a34..561320a3086d12827c12a9a883741d9b240784e8 100644 GIT binary patch delta 176 zcmZ2Jg>mv!#tkMCjEa*@B@8rX{Ga9?ur~Vw0~mPa|A&HwfA_tYHDs@ZihECvm6##0 zyKG9`E?=)>P{GE@ZzWC$aPI#dW0$?^8dOky@>w)e0kAX}0UMJw7%-ES7?6`a8Nibj8c36M8ZeW+8kzzEnXw`G7qKva J6|+G|<^j?@5`F*x diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe index 7f88231150dee447a472c5ae12a4a6792b6a1f27..2924547ee898453213f8a4c0098fa8ef797eea16 100644 GIT binary patch literal 8 PcmZQzU~KDZx;GO52(JSR literal 8 PcmZQzU~KE;e5(Zj2JZqf diff --git a/.idea/modules/project.main.iml b/.idea/modules/project.main.iml index 9cc36c92..ec81b538 100644 --- a/.idea/modules/project.main.iml +++ b/.idea/modules/project.main.iml @@ -1,8 +1,8 @@ - - + + \ No newline at end of file diff --git a/build.gradle b/build.gradle index 7c971573..ccc1d68a 100644 --- a/build.gradle +++ b/build.gradle @@ -22,8 +22,10 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-web' + testImplementation 'junit:junit:4.13.1' + testImplementation 'org.springframework.boot:spring-boot-starter-test' compileOnly 'org.projectlombok:lombok' - runtimeOnly 'com.mysql:mysql-connector-j' + runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' } diff --git a/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java b/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java index c2457869..b0c18a5f 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java @@ -1,4 +1,76 @@ package com.project.hackathon.domain.restaurant.controller; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import javax.validation.executable.ValidateOnExecution; + +import com.project.hackathon.domain.restaurant.dto.RestaurantCreateRequest; +import com.project.hackathon.domain.restaurant.dto.RestaurantDetailResponse; +import com.project.hackathon.domain.restaurant.service.RestaurantService; +import com.project.hackathon.global.dto.ResultResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +@RequestMapping("/api/v1/restaurant") +@RequiredArgsConstructor +@RestController public class RestaurantController { + + private final RestaurantService restaurantService; + + @PostMapping("/create") + public ResponseEntity createRestaurant( + @Validated @RequestBody RestaurantCreateRequest request + ) { + RestaurantDetailResponse restaurantDetailResponse = restaurantService.create(request); + return ResponseEntity.ok(restaurantDetailResponse); + } +// +// @GetMapping("/{boardId}") +// public ResponseEntity getBoardDetail(@PathVariable Long boardId) { +// BoardDetailResponse response = boardService.getBoardDetail(boardId); +// +// return ResponseEntity.ok(ResultResponse.of(ResultCode.BOARD_DETAIL_GET_SUCCESS, response)); +// } +// +// @GetMapping("/list/{page}") +// public ResponseEntity getBoardListPage( +// @PathVariable int page, +// @RequestParam(required = false, defaultValue = "10") int size, +// @RequestParam(defaultValue = "false", required = false) boolean isTimeReversed) { +// BoardListResponse response = boardService.getBoardListPage(page, size, isTimeReversed); +// +// return ResponseEntity.ok(ResultResponse.of(ResultCode.BOARD_LIST_PAGE_GET_SUCCESS, response)); +// } +// +// @GetMapping("/search/{page}") +// public ResponseEntity searchBoardWithTitleOrContent( +// @PathVariable int page, +// @RequestParam(required = false) int size, +// @RequestParam(defaultValue = "false", required = false) boolean isTimeReversed, +// @RequestParam String search) { +// BoardListResponse response = +// boardService.searchBoardWithTitleOrContent(page, size, isTimeReversed, search); +// +// return ResponseEntity.ok( +// ResultResponse.of(ResultCode.BOARD_LIST_PAGE_SEARCH_SUCCESS, response)); +// } +// +// @PutMapping +// public ResponseEntity updateBoardDetail(@Valid BoardUpdateRequest request) { +// BoardDetailResponse response = boardService.updateBoard(request); +// +// return ResponseEntity.ok(ResultResponse.of(ResultCode.BOARD_DETAIL_UPDATE_SUCCESS, response)); +// } +// +// @DeleteMapping("/{boardId}") +// public ResponseEntity deleteBoard( +// @PathVariable Long boardId, @RequestParam Long userId) { +// boardService.deleteBoard(boardId, userId); +// +// return ResponseEntity.ok(ResultResponse.of(ResultCode.BOARD_DELETE_SUCCESS, new Object())); +// } } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java index f10c89e6..e27889a2 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java @@ -1,25 +1,24 @@ package com.project.hackathon.domain.restaurant.dto; import com.project.hackathon.domain.restaurant.entity.Category; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; +import lombok.*; + import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import java.time.LocalDateTime; @Getter @Builder -@AllArgsConstructor +@Data public class RestaurantCreateRequest { - @NotNull(message = "레스토랑 Id는 공백이 올 수 없습니다.") - private final String id; +// @NotNull(message = "레스토랑 Id는 공백이 올 수 없습니다.") +// private final String id; @NotBlank(message = "레스토랑 제목은 빈칸일 수 없습니다.") - private final String title; + private String title; @NotNull(message = "레스토랑 카테고리는 공백이 올 수 없습니다.") - private final Category category; + private Category category; - private final LocalDateTime createdAt; +// private final LocalDateTime createdAt; } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantDetailResponse.java b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantDetailResponse.java new file mode 100644 index 00000000..d5711d69 --- /dev/null +++ b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantDetailResponse.java @@ -0,0 +1,21 @@ +package com.project.hackathon.domain.restaurant.dto; + +import java.time.LocalDateTime; + +import com.project.hackathon.domain.restaurant.entity.Category; +import lombok.*; + +@Setter +@Builder +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class RestaurantDetailResponse { + + // 레스토랑 이름 + private String title; + // 레스토랑 카테고리 + private Category category; + // 레스토랑 생성일자 + private LocalDateTime createdAt; +} diff --git a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantInfo.java b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantInfo.java new file mode 100644 index 00000000..f283a639 --- /dev/null +++ b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantInfo.java @@ -0,0 +1,28 @@ +package com.project.hackathon.domain.restaurant.dto; + +import java.time.LocalDateTime; +import lombok.*; + +@Setter +@Getter +@NoArgsConstructor +public class RestaurantInfo { + + // 게시판 제목 + private String title; + // 게시글 작성자 이름 + private String userName; + // 게시판 작성 일시 + private LocalDateTime createdDate; + // 이미지 첨부 여부 + private boolean hasImages; + + @Builder + public RestaurantInfo( + String title, String userName, LocalDateTime createdDate, boolean hasImages) { + this.title = title; + this.userName = userName; + this.createdDate = createdDate; + this.hasImages = hasImages; + } +} diff --git a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java index ee63238e..5eb81cba 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java @@ -13,7 +13,7 @@ @AllArgsConstructor public class RestaurantUpdateRequest { @NotNull(message = "레스토랑 Id는 공백이 올 수 없습니다.") - private final String id; + private final Long id; @NotBlank(message = "레스토랑 제목은 빈칸일 수 없습니다.") private final String title; diff --git a/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java b/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java index e07d97e2..b6ad0e53 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java @@ -3,6 +3,7 @@ import com.project.hackathon.domain.review.entity.Review; import com.project.hackathon.global.entity.BaseEntity; import lombok.*; +import org.hibernate.annotations.CreationTimestamp; import javax.persistence.*; import java.time.LocalDateTime; @@ -10,46 +11,45 @@ @Getter @Entity -@AllArgsConstructor -@NoArgsConstructor @Table(name = "restaurant") +@NoArgsConstructor public class Restaurant extends BaseEntity{ @Id - @GeneratedValue + @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "id") private Long id; // 레스토랑명 - @OneToMany(fetch=FetchType.EAGER, cascade = CascadeType.ALL) // (1) - @JoinColumn(name="title") - private ArrayList title = new ArrayList<>(); +// @OneToMany(fetch=FetchType.EAGER, cascade = CascadeType.ALL) // (1) +// @JoinColumn(name="title") +// private ArrayList title = new ArrayList<>(); + @Column(name = "title", nullable = false) + private String title; // 레스토랑 카테고리 @Column(name = "category", nullable = false) @Enumerated(EnumType.STRING) private Category category; - // 음식점 생성일자 - @Column(name = "created_at", nullable = false) + // 레스토랑 생성일자 +// @Column(name = "created_at") + @CreationTimestamp private LocalDateTime createdAt; @Column(name = "is_removed", nullable = false) private boolean isRemoved; - @Builder public Restaurant( - ArrayList title, - Category category, - LocalDateTime createdAt) { + String title, + Category category + ) { this.title = title; this.category = category; - this.createdAt = createdAt; this.isRemoved = false; } public void deleteRestaurant() { //soft delete this.isRemoved = true; } - } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java b/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java index 5b344b61..7a9c5909 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java @@ -1,4 +1,79 @@ package com.project.hackathon.domain.restaurant.service; +import com.project.hackathon.domain.restaurant.dto.RestaurantCreateRequest; +import com.project.hackathon.domain.restaurant.dto.RestaurantDetailResponse; +import com.project.hackathon.domain.restaurant.dto.RestaurantInfo; +import com.project.hackathon.domain.restaurant.dto.RestaurantUpdateRequest; +import com.project.hackathon.domain.restaurant.entity.Restaurant; +import com.project.hackathon.domain.restaurant.repository.RestaurantRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor public class RestaurantService { + private final RestaurantRepository restaurantRepository; + + public RestaurantDetailResponse create(RestaurantCreateRequest restaurantCreateRequest) { + Restaurant newRestaurant = + Restaurant.builder() + .title(restaurantCreateRequest.getTitle()) + .category(restaurantCreateRequest.getCategory()) +// .createdAt(restaurantCreateRequest.getCreatedAt()) + .build(); + + restaurantRepository.save(newRestaurant); + + return RestaurantDetailResponse.builder() + .title(newRestaurant.getTitle()) + .category(newRestaurant.getCategory()) + .createdAt(newRestaurant.getCreatedAt()) + .build(); + } + +// public RestaurantDetailResponse getRestaurantDetail(Long restaurantId) { +// Restaurant restaurant = +// RestaurantRepository.findRestaurantById(restaurantId).orElseThrow(null); +// return RestaurantDetailResponse.builder() +// .title(restaurant.getTitle()) +// .category(restaurant.getCategory()) +// .createdAt(restaurant.getCreatedAt()) +// .build(); +// } + + public List restaurantInfoList = new ArrayList<>(); + public RestaurantDetailResponse getBoardListPage(int page, int size) { + final Pageable pageable = PageRequest.of(page, size); + Page restaurantPageInfoList = + restaurantRepository.findRestaurantWithPagination(pageable); + return new RestaurantDetailResponse(); + } + + @Transactional + public RestaurantDetailResponse updateRestaurant(RestaurantUpdateRequest restaurantUpdateRequest) { + Long id = restaurantUpdateRequest.getId(); + Restaurant restaurant = + restaurantRepository.findRestaurantById(id).orElseThrow(null); + + return RestaurantDetailResponse.builder() + .title(restaurant.getTitle()) + .category(restaurant.getCategory()) + .createdAt(restaurant.getCreatedAt()) + .build(); + } + +// public void deleteRestaurant(Long restaurantId) { +// Restaurant restaurant = RestaurantRepository.findRestaurantById(restaurantId).orElseThrow(null); +// restaurant.deleteRestaurant(); +// restaurantRepository.save(restaurant); +// } } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java b/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java index 94f0d7af..5c8ef220 100644 --- a/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java +++ b/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java @@ -1,15 +1,82 @@ -package com.project.hackathon.domain.review.service; - -import com.project.hackathon.domain.review.repository.ReviewRepository; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; - -@RequiredArgsConstructor -@Service -@Slf4j -public class ReviewService { - private final ReviewRepository reviewRepository; - - -} \ No newline at end of file +//package com.project.hackathon.domain.review.service; +// +//import com.project.hackathon.domain.restaurant.dto.RestaurantCreateRequest; +//import com.project.hackathon.domain.restaurant.dto.RestaurantDetailResponse; +//import com.project.hackathon.domain.restaurant.dto.RestaurantInfo; +//import com.project.hackathon.domain.restaurant.dto.RestaurantUpdateRequest; +//import com.project.hackathon.domain.restaurant.entity.Restaurant; +//import com.project.hackathon.domain.restaurant.repository.RestaurantRepository; +//import com.project.hackathon.domain.review.repository.ReviewRepository; +//import lombok.RequiredArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.springframework.data.domain.Page; +//import org.springframework.data.domain.PageRequest; +//import org.springframework.data.domain.Pageable; +//import org.springframework.stereotype.Service; +//import org.springframework.transaction.annotation.Transactional; +// +//import java.util.ArrayList; +//import java.util.List; +// +//@RequiredArgsConstructor +//@Service +//@Slf4j +//public class ReviewService { +// private final ReviewRepository reviewRepository; +// +// @Transactional +// public RestaurantDetailResponse create(RestaurantCreateRequest restaurantCreateRequest) { +// +// final Restaurant newReview = +// Restaurant.builder() +// .title(restaurantCreateRequest.getTitle()) +// .category(restaurantCreateRequest.getCategory()) +// .createdAt(restaurantCreateRequest.getCreatedAt()) +// .build(); +// +// reviewRepository.save(newReview); +// +// return RestaurantDetailResponse.builder() +// .title(newReview.getTitle()) +// .category(newReview.getCategory()) +// .createdAt(newReview.getCreatedAt()) +// .build(); +// } +// +// public RestaurantDetailResponse getRestaurantDetail(Long restaurantId) { +// Restaurant restaurant = +// RestaurantRepository.findRestaurantById(restaurantId); +// return RestaurantDetailResponse.builder() +// .title(restaurant.getTitle()) +// .category(restaurant.getCategory()) +// .createdAt(restaurant.getCreatedAt()) +// .build(); +// } +// +// public List restaurantInfoList = new ArrayList<>(); +// public RestaurantDetailResponse getBoardListPage(int page, int size) { +// final Pageable pageable = PageRequest.of(page, size); +// Page restaurantPageInfoList = +// restaurantRepository.findRestaurantWithPagination(pageable); +// return new RestaurantDetailResponse(); +// } +// +// @Transactional +// public RestaurantDetailResponse updateRestaurant(RestaurantUpdateRequest restaurantUpdateRequest) { +// Long id = restaurantUpdateRequest.getId(); +// Restaurant restaurant = +// restaurantRepository.findRestaurantById(id).orElseThrow(null); +// +// return RestaurantDetailResponse.builder() +// .title(restaurant.getTitle()) +// .category(restaurant.getCategory()) +// .createdAt(restaurant.getCreatedAt()) +// .build(); +// } +// +// public void deleteRestaurant(Long restaurantId) { +// Restaurant restaurant = RestaurantRepository.findRestaurantById(restaurantId); +// restaurant.deleteRestaurant(); +// restaurantRepository.save(restaurant); +// } +//} \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/global/config/DataSourceConfig.java b/src/main/java/com/project/hackathon/global/config/DataSourceConfig.java new file mode 100644 index 00000000..4aaa81e4 --- /dev/null +++ b/src/main/java/com/project/hackathon/global/config/DataSourceConfig.java @@ -0,0 +1,17 @@ +//package com.project.hackathon.global.config; +// +//import org.springframework.boot.context.properties.ConfigurationProperties; +//import org.springframework.boot.jdbc.DataSourceBuilder; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +// +//import javax.sql.DataSource; +// +//@Configuration +//public class DataSourceConfig { +// @ConfigurationProperties(prefix = "spring.datasource") +// @Bean +// public DataSource dataSource() { +// return DataSourceBuilder.create().build(); +// } +//} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b137891..f83ed709 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,7 @@ - +spring.h2.console.enabled=true +spring.h2.console.path=/h2-console +spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.username=sa +spring.datasource.password= +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/src/test/java/dbTest/MySQLConnectionTest.java b/src/test/java/dbTest/MySQLConnectionTest.java new file mode 100644 index 00000000..153c87e3 --- /dev/null +++ b/src/test/java/dbTest/MySQLConnectionTest.java @@ -0,0 +1,28 @@ +package dbTest; + +import org.junit.Test; + +import java.sql.Connection; +import java.sql.DriverManager; + +public class MySQLConnectionTest { + + // MySQL Connector 의 클래스. DB 연결 드라이버 정의 + private static final String DRIVER = "com.mysql.cj.jdbc.Driver"; + // DB 경로 + private static final String URL = "jdbc:mysql://localhost:3306/데이터베이스?serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false"; + private static final String USER = "유저 ID"; + private static final String PASSWORD = "비밀번호"; + + @Test + public void testConnection() throws Exception { + // DBMS에게 DB 연결 드라이버의 위치를 알려주기 위한 메소드 + Class.forName(DRIVER); + try { + Connection connection = DriverManager.getConnection(URL, USER, PASSWORD); + System.out.println(connection); + } catch (Exception e) { + e.printStackTrace(); + } + } +} From 2ef3ee38b8cba9477c422a6ff91eeded63b0b1c0 Mon Sep 17 00:00:00 2001 From: HAERYN Date: Sun, 26 Feb 2023 10:21:32 +0900 Subject: [PATCH 09/20] feat: review create --- .../7.6/executionHistory/executionHistory.bin | Bin 298760 -> 394800 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/7.6/fileHashes/fileHashes.bin | Bin 23447 -> 23647 bytes .gradle/7.6/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../7.6/fileHashes/resourceHashesCache.bin | Bin 22135 -> 23563 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .../controller/RestaurantController.java | 1 - .../restaurant/service/RestaurantService.java | 1 - .../review/controller/ReviewController.java | 29 +++++- .../review/dto/ReviewCreateRequest.java | 13 +-- .../review/dto/ReviewDetailResponse.java | 22 +++++ .../review/dto/ReviewUpdateRequest.java | 6 +- .../domain/review/entity/Review.java | 4 +- .../domain/review/service/ReviewService.java | 88 +++++++++--------- 14 files changed, 101 insertions(+), 63 deletions(-) create mode 100644 src/main/java/com/project/hackathon/domain/review/dto/ReviewDetailResponse.java diff --git a/.gradle/7.6/executionHistory/executionHistory.bin b/.gradle/7.6/executionHistory/executionHistory.bin index 7425bb61b85ed02abaf430e3cce8057323699611..4c9aade3aec1ec579247e61475744a35beb3bc72 100644 GIT binary patch delta 2877 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 ZD=e^!wcz6-A5*XnHtTl~OE`@{IshnhI$i(( delta 741 zcmcb=gK_$H#tkMCjLDNtB@8ClO03vyE4hPpGq3zc#?99hgcunkH!A)R-)L}vZ?dCD zkwQUa#gj?P7A?9MnEt$Gb4)n{17lm)v8jp-Aix+MKAAB{c(R12=;q%ZNv!n&?`OGB zX)Au_>{@wPXpV*|SoQkT2f?Ztcm;v9o-vTn1Y(d8iUM(bGvn;bt0yRZ>023gSoaIW z{7G3rNg&__DMr&F%GLTn?jqACme*IBW7mAz4bsusu%;fU(j17HE@5ghTO=$#!_ZHy zi*;$m&1>c>pjv8xDuICM(qv(O7lql^>>JMPFLvQ_WJ!Lfd26^EoB&Hr@d{JK}^pL^1Eq&A0uhF-v?&n&!6Sui&;P zhOv&PC$t8FRUMo1d2(m4kHoEyiL(RbyjQ9D7q|*rg}#MK{+#?aSSqMPS8?^CLZdlX zygKKeQ?fb?G5Qk6>p*qf25SK707X<_+w>bz zM}?0aZkAehP9Qc2RSmlUrm4C@+V|LRS^a3$eWkR;;^`Gscd!dg-W#IE({*ghZ>Tj% zlN}?3Co_c#g9QIV1lj*jKIknh?;}4i{ol))S5?-x6wX@Q1eT*vt>5!_!Za2xAf3i QU9f4>4)AZD7{$g20Fm?S*Z=?k diff --git a/.gradle/7.6/fileHashes/fileHashes.lock b/.gradle/7.6/fileHashes/fileHashes.lock index f2fa64ba1ebd2f27d33b42450a1560b5aa79a8ec..8838838d8da735679df3aa9a050ab63648165b3c 100644 GIT binary patch literal 17 VcmZQhIDR4ZmDNi>1~6bY1pqtu1oHp@ literal 17 VcmZQhIDR4ZmDNi>1~6dC0suTJ1t$Oi diff --git a/.gradle/7.6/fileHashes/resourceHashesCache.bin b/.gradle/7.6/fileHashes/resourceHashesCache.bin index ff0a40068bd005c64aa8ff3114ae9a1bdfb313f5..a02e7abbac17f6303b1103f424007f2663511eb9 100644 GIT binary patch delta 2302 zcmZvcdo+}39LGm3VpsE)+qljQ(V&aUwaK7Nnk^bJ#u&M-YpN;D=90#wQHf1GJ6R+5 zW`{O~&c+g(tRj+DC`H61C540>S$bcc*4ul|^Uvpee&6@^T*oiVoGz0oGQ-ITfjMp+ zHj5vpDXzg`K7XtLup37p9S<+$oVlJC07Flg8RQcTuQthmg7zR>2)H;pl#(1?Zewb7 z4ul{sD91Pj|vwdkb5?9(>BBF-@wvi;_p9~{{n)89aHhPmfsAgfJ> zKKM60jaO$|A_;-ONt*yo_Bp@)9j8(ZLzVypYV)z)QTl=H#xD?Y%e78zNCr}2cp36* z*UBK7Q$VU?1*w%_#4mMzD1@O$Dp1v>L)r!X3Ox_0ACdY3uv?cvA`0{a`Njhwh`DaQ zRlRyzzHE}c6B1hrxVl7ax(UIpad;8JB0%yi3oQ08T$?p&$8A1_B1{PLNd9a zQnwDWej$B?rJ3*$(H6ww2@siEUDdJi-!(|$S|G&JAu8j!6ysmI6e)iKI`LKz?P~A+ z=zXzP2>c5u5v(Am7B9S_@pvE%S+9W&feyL&2!%tMf8T_mrxFkltg+_J>5B^;k&fJF zz@LQQAm1FI-Y{$~3yW+qpc3h%u&rKC?H+b4*u1CohE?ABiU zqa}PKmH7sUi3HNVT(hnT9iv_(pkh8?|M?x$IpJ2w!DZEhN@C)or3%Hw3H4%ANb#Ee zHjAaa4YO4mvt!xZfT$%~7!M{Sq808XsTScuHM3Cn|3)Zj3JObaAJWdLxHnW_p@%ly zqquE-Sq5_1%TzPe3#2Y+g9N=>fAC=F3X|6|yj`NYm$7IiG2V87v8TEssa7o3{4r~8 z#TGO&NlM(7b$k`>>S$_%VwRo{+OXb~(T&+W8d1hkX`yb3P(d51D|w8FB>jI%dV1C; zc8t*Oq7_oT42C%vO)eiTi1H%R<}TQRM(oTBL~^A(-%u>Gjy{=3K^vL@1)d&L(io`+ zwbaSQQu!-`hb;UW7qY}h*V>m98I#*!ytU{n1u;(L_AAxhPS!bh?D0%<`H(-_XetrD z>*VJ=?@FS0*)hs2(8djN!o932&hnzCW5j6HzIY6Vw{SKetLp{>y+^zz>w}HU@B#yL z$cZ$zJChQz^=I4MmDzTRd1zzrgZ#d;_?w5u@fQOfCS5P1jha?dN;KAyroihpn<{lF zHbyIgsP>eXSCU(;w+YHy3iKOleCV)F+h?|e2bJw$*GxhwZ+SJT;N7i>~Y z=}X1&8Gz_&#=B(@Oj#7Up_wsgl9YM)zCOB)lB;2BGr*RQY%=R8%X;>W9X*ooZK%tfhn$cO+VVeuuiH|YY45}dv3~xqyu4SgAR2$``KJ(%4aea zl0Gf*nfw2Oi!ycKme8_dxc`Y*b;Q#)B^Yh|Dld)Yao%s#vk%`C>u~$)i-JrhN-JdX z$;RkAkr5<(`|6SPJ? HKREvZ4o9GJ delta 171 zcmV;c095~rxB>U90kAX}0c(>r7%`K67#EYp7)X;P8F-V;8DNt|8ZeWk8eo$h8^M$I z8yAx$97vOe95Iv5959m>9T$^D9Y~YC9Y~WM9vG8N9(l9g9tQ!F{U0!sMIcC%r63rS z?I0PG9w8W$P9YeRej&e;RU#OZg(66k_!prt4zoc>HV&p4JX`<( diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 80fea2ab781279865b786ee0d4d2084b5b45f6bc..d0967962c44f484bd0a5921ed3baabab751a3eba 100644 GIT binary patch literal 17 VcmZP$cJnpe`{Bc11~6bu0suBj1snhX literal 17 UcmZP$cJnpe`{Bc11_<~G05;zRvH$=8 diff --git a/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java b/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java index b0c18a5f..bf4a013a 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java @@ -20,7 +20,6 @@ public class RestaurantController { private final RestaurantService restaurantService; - @PostMapping("/create") public ResponseEntity createRestaurant( @Validated @RequestBody RestaurantCreateRequest request diff --git a/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java b/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java index 7a9c5909..bf0860bf 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java @@ -28,7 +28,6 @@ public RestaurantDetailResponse create(RestaurantCreateRequest restaurantCreateR Restaurant.builder() .title(restaurantCreateRequest.getTitle()) .category(restaurantCreateRequest.getCategory()) -// .createdAt(restaurantCreateRequest.getCreatedAt()) .build(); restaurantRepository.save(newRestaurant); diff --git a/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java b/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java index efc5dbaf..bf7dbbff 100644 --- a/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java +++ b/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java @@ -1,4 +1,31 @@ package com.project.hackathon.domain.review.controller; + +import com.project.hackathon.domain.restaurant.dto.RestaurantCreateRequest; +import com.project.hackathon.domain.restaurant.dto.RestaurantDetailResponse; +import com.project.hackathon.domain.restaurant.service.RestaurantService; +import com.project.hackathon.domain.review.dto.ReviewCreateRequest; +import com.project.hackathon.domain.review.dto.ReviewDetailResponse; +import com.project.hackathon.domain.review.service.ReviewService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +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; + +@RequestMapping("/api/v1/{restaurant}/review") +@RequiredArgsConstructor +@RestController public class ReviewController { -} + + private final ReviewService reviewService; + @PostMapping("/create") + public ResponseEntity createReview( + @Validated @RequestBody ReviewCreateRequest request + ) { + ReviewDetailResponse reviewDetailResponse = reviewService.create(request); + return ResponseEntity.ok(reviewDetailResponse); + } +} \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java b/src/main/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java index e4094fb8..9f3f71d6 100644 --- a/src/main/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java +++ b/src/main/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java @@ -1,24 +1,21 @@ package com.project.hackathon.domain.review.dto; +import com.project.hackathon.domain.restaurant.entity.Restaurant; import lombok.AllArgsConstructor; import lombok.Builder; +import lombok.Data; import lombok.Getter; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @Getter @Builder -@AllArgsConstructor +@Data public class ReviewCreateRequest { - @NotNull(message = "리뷰 Id는 공백이 올 수 없습니다.") - private final String id; - @NotBlank(message = "리뷰 제목은 빈칸일 수 없습니다.") - private final String title; + private String title; @NotBlank(message = "리뷰 내용은 빈칸일 수 없습니다.") - private final String context; + private String content; - @NotBlank(message = "리뷰 레스토랑은 빈칸일 수 없습니다.") - private final String restaurant; } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/review/dto/ReviewDetailResponse.java b/src/main/java/com/project/hackathon/domain/review/dto/ReviewDetailResponse.java new file mode 100644 index 00000000..27ab838a --- /dev/null +++ b/src/main/java/com/project/hackathon/domain/review/dto/ReviewDetailResponse.java @@ -0,0 +1,22 @@ +package com.project.hackathon.domain.review.dto; + +import com.project.hackathon.domain.restaurant.entity.Category; +import com.project.hackathon.domain.restaurant.entity.Restaurant; +import lombok.*; + +import java.time.LocalDateTime; + +@Setter +@Builder +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class ReviewDetailResponse { + + // 리뷰 이름 + private String title; + // 리뷰 내용 + private String content; + + private Restaurant restaurant; +} diff --git a/src/main/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java b/src/main/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java index 8fe72d4e..547a64b6 100644 --- a/src/main/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java +++ b/src/main/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java @@ -10,15 +10,11 @@ @Builder @AllArgsConstructor public class ReviewUpdateRequest { - @NotNull(message = "리뷰 Id는 공백이 올 수 없습니다.") - private final String id; @NotBlank(message = "리뷰 제목은 빈칸일 수 없습니다.") private final String title; @NotBlank(message = "리뷰 내용은 빈칸일 수 없습니다.") - private final String context; + private final String content; - @NotBlank(message = "리뷰 레스토랑은 빈칸일 수 없습니다.") - private final String restaurant; } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/review/entity/Review.java b/src/main/java/com/project/hackathon/domain/review/entity/Review.java index f128ffd0..27956e62 100644 --- a/src/main/java/com/project/hackathon/domain/review/entity/Review.java +++ b/src/main/java/com/project/hackathon/domain/review/entity/Review.java @@ -33,7 +33,7 @@ public class Review extends BaseEntity { // 특정 레스토랑명 @ManyToOne(fetch = LAZY) - @JoinColumn(name = "restaurant", nullable = false) + @JoinColumn(name = "restaurant") private Restaurant restaurant; @Column(name = "is_removed", nullable = false) @@ -43,7 +43,7 @@ public class Review extends BaseEntity { public Review( String title, String content, - Restaurant restaurant) { + Restaurant restaurant){ this.title = title; this.content = content; this.restaurant = restaurant; diff --git a/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java b/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java index 5c8ef220..e1793122 100644 --- a/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java +++ b/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java @@ -1,47 +1,45 @@ -//package com.project.hackathon.domain.review.service; -// -//import com.project.hackathon.domain.restaurant.dto.RestaurantCreateRequest; -//import com.project.hackathon.domain.restaurant.dto.RestaurantDetailResponse; -//import com.project.hackathon.domain.restaurant.dto.RestaurantInfo; -//import com.project.hackathon.domain.restaurant.dto.RestaurantUpdateRequest; -//import com.project.hackathon.domain.restaurant.entity.Restaurant; -//import com.project.hackathon.domain.restaurant.repository.RestaurantRepository; -//import com.project.hackathon.domain.review.repository.ReviewRepository; -//import lombok.RequiredArgsConstructor; -//import lombok.extern.slf4j.Slf4j; -//import org.springframework.data.domain.Page; -//import org.springframework.data.domain.PageRequest; -//import org.springframework.data.domain.Pageable; -//import org.springframework.stereotype.Service; -//import org.springframework.transaction.annotation.Transactional; -// -//import java.util.ArrayList; -//import java.util.List; -// -//@RequiredArgsConstructor -//@Service -//@Slf4j -//public class ReviewService { -// private final ReviewRepository reviewRepository; -// -// @Transactional -// public RestaurantDetailResponse create(RestaurantCreateRequest restaurantCreateRequest) { -// -// final Restaurant newReview = -// Restaurant.builder() -// .title(restaurantCreateRequest.getTitle()) -// .category(restaurantCreateRequest.getCategory()) -// .createdAt(restaurantCreateRequest.getCreatedAt()) -// .build(); -// -// reviewRepository.save(newReview); -// -// return RestaurantDetailResponse.builder() -// .title(newReview.getTitle()) -// .category(newReview.getCategory()) -// .createdAt(newReview.getCreatedAt()) -// .build(); -// } +package com.project.hackathon.domain.review.service; + +import com.project.hackathon.domain.restaurant.dto.RestaurantCreateRequest; +import com.project.hackathon.domain.restaurant.dto.RestaurantDetailResponse; +import com.project.hackathon.domain.restaurant.dto.RestaurantInfo; +import com.project.hackathon.domain.restaurant.dto.RestaurantUpdateRequest; +import com.project.hackathon.domain.restaurant.entity.Restaurant; +import com.project.hackathon.domain.restaurant.repository.RestaurantRepository; +import com.project.hackathon.domain.review.dto.ReviewCreateRequest; +import com.project.hackathon.domain.review.dto.ReviewDetailResponse; +import com.project.hackathon.domain.review.entity.Review; +import com.project.hackathon.domain.review.repository.ReviewRepository; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; + +@Service +@RequiredArgsConstructor +public class ReviewService { + private final ReviewRepository reviewRepository; + + public ReviewDetailResponse create(ReviewCreateRequest reviewCreateRequest) { + Review newReview = + Review.builder() + .title(reviewCreateRequest.getTitle()) + .content(reviewCreateRequest.getContent()) + .build(); + + reviewRepository.save(newReview); + + return ReviewDetailResponse.builder() + .title(reviewCreateRequest.getTitle()) + .content(reviewCreateRequest.getContent()) + .build(); + } // // public RestaurantDetailResponse getRestaurantDetail(Long restaurantId) { // Restaurant restaurant = @@ -79,4 +77,4 @@ // restaurant.deleteRestaurant(); // restaurantRepository.save(restaurant); // } -//} \ No newline at end of file +} \ No newline at end of file From 0ea331ab1bfae40d2605515303d77876797cecab Mon Sep 17 00:00:00 2001 From: HAERYN Date: Sun, 26 Feb 2023 11:50:05 +0900 Subject: [PATCH 10/20] =?UTF-8?q?feat:=20restaurant=20list=EB=A1=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../7.6/executionHistory/executionHistory.bin | Bin 394800 -> 394800 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/7.6/fileHashes/fileHashes.bin | Bin 23647 -> 23647 bytes .gradle/7.6/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../7.6/fileHashes/resourceHashesCache.bin | Bin 23563 -> 24923 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .idea/misc.xml | 5 ++++ .../controller/RestaurantController.java | 17 +++++++++++ .../dto/RestaurantDetailResponse.java | 1 + .../domain/restaurant/entity/Restaurant.java | 3 +- .../repository/RestaurantRepository.java | 5 +++- .../restaurant/service/RestaurantService.java | 27 +++++++++++------- 12 files changed, 45 insertions(+), 13 deletions(-) diff --git a/.gradle/7.6/executionHistory/executionHistory.bin b/.gradle/7.6/executionHistory/executionHistory.bin index 4c9aade3aec1ec579247e61475744a35beb3bc72..9b6efae959fe97ed5dd933223147aa0313d988e4 100644 GIT binary patch delta 1782 zcmaizc{tTs7{?vw_meDjY~_lvggdg`YpW>jmMoDhEl)|VZJLU3Rk|{fNOcpAqR293 zY0-_F)Kl@Ggpg+J=H`xsifm8CG`~xKHIHY`bI$X8pZ7iQdEawB=e?7te21ExTUu^#bMOX>1|;)`lJU~7@}dKUX!?5Y$1#{ZX4%!u&V5YsFvlFUaH`cLcqaO2zu%V>~U16WYo5qWJ=pq!SdSfZxfyUj8qjUhTi(e zMji`XaHHm<%)_ps0~(kk2U}J2VrzEQa;$}MIa4(edJEGB+e@i{1|^V*1q%QTM~y;K zRSY37H|yaqXB*RcO4+WCKXHdMLfkY4mtl2Hae3S)59`qMCYIS_ll$>s>OQ46 zKS)i(U?~V7PV=63Vk1SUtRMBNy{Jrap2epF_Ue&oYhuV#eoI< zdYn}awXMD0#@FgB6ncB8R7ss2Q4a5$d4o6uD&XOIk{hL+V$I{qI9>K|qf@4iT*;pJ zj*ZtC26>ak#)U^QvkDsF6m5WrBvH}%+F(%X{7jL>av&Y=)d7n51e=t=_jQ0gA@bk` z9nef%5UE^UpgpVVbb%AW71`A2z?QfuQUP>eh}x}QntpD+{LP%n)`>p1V~C$e2Y$f5 zy28lYTj=0!tbZ#>;Mr?Ul~y9q6&74O+qcr?_|y0VPcO>U>SJ+g@~NGAAJ{6eOFX4S znJjI;nV$35@_uDZW10AeH>0??243Q2-B=6M10sLzwBWox{^|OX4Ifm555{I*;>&%K z0Aga1tyo|L_TUft6lPQkyRo?muoC@bZ9Gv9_v1z_s1}!C2&g4aEyzzWBog;(9SURn z1_y)&?hW@34e<##WgTJrTbKqN2@U(+C<~}YQ6sSXMdCU#+G!`W$dv5e5%aaQa=_Js ze@Fw$0lr!aaa0;*CrB|1Qw`$;iP9mP2Az4Ba_VDl8)RcH9U5Y8J5*PMh_ja_>3K}} zciLyyw3D%K%D^-HR2Jxo+`-so8ag5mRc_A{r^-PYOZhn6!0Q>fDW9O@MkA<+9gJZK ziZRuQsMpwWmL<7a%gMLR1|tUijGU6UCDrfQqIq;OHO0fFr5ZzKdkj366up9-yRdewW4sEV0iVDgoRGmr5#3-LA=F6Hvx;VeT zkl4B&*&V!htnp^c_#&4h1_OHU**Lg@+`>OoNhXN%eUCv~XB@PKME^?yq~H^^(3-!b z7VcckH}@nj%AyVNmb}J&jh7^%)D*kz*>CS4U z&jPt|rZ@W8nb&!;B}uujV=cL}K&rn*xl2~-u3BfaddVY4=ipf&epN@Orn(Pzjb?_S zoT7Jwa{ysm+B3Ivst?$YjWPZh_-*5lKzy!_o`1Zk>(I}Sc`ixIVw*%MXMx~SaiSk7 zR-IfU_;OdyHP2mI)n}N7HM`*%K8hq)0koTwLn{iZS3nQQLnGOa=6D@|T6pd6fK1&- zN?|TdTn5({5n23|9CCEy+)!_>A-eiII`Aqep+g7;DHVN=(3(+vW+Jf=EKayk{A?s; zBFn04SYlkDVDyIC)Xylu#e~FK#G2SPon5$o;MAWRc3f&G>%)MQxH;#E7)VGM{|o(c B20;J- delta 1505 zcmajd3pCVO7yxkB{m*O-wo7Yctvt?PBMcku#Ez*$Wz|NCtX9NKXbj1WOp>?VDYDz< z=8WmcOMOj5d0ZTBTNM4`q6+){>HBXV^VwPkTCh&%Nh-=ey7E{BGT0gF01D zsxc4YM)HOGgb90{IMIAAM1Mc_L~{tDq;fFjBhi;HTk!Ui_CwB;)XvoJaZ21uX}s%WS@ z)bE;3Yr+JBD;Eege%Ou2PJ<-;3PFFHh21ai7kwcpULStTeBkoSf|iNCn@UD1f*Po) zU}cBz!jac!p(L=?o8?R<=|Uc4P2T6kicMYF9~gHS@J7U~in$%*mZ}}L7X5lsgERGt z+%&)|!DCwOHF3X^A=d?k zIK%?Hhm+$eRNQC*^a%9~?zRBe2vQwMEdhN#x@-wH5)JB{u@zWHj6Of!kHf8iEi&xT zDwAC>oUqv^Z7A@(>_V1W0WR=Vy2>0k96xXI$Fk1I>9U>{)zi`#_54u((qH&@7@8U0 z4;oadcec<=%Z5yOHsiF%9#6ux)di$S*Ht9Z>jF0FOPAWO>B900F#n9Cf(=YgHspoV z3}?d=tiuenpXwgzQWd0RR5VfuprMi2kAJfRJMgFtFvO?<4q_)q;G)K(rDwS_wuBIEA8mD~7)@X^nesBIUSG`Bvc+0c9E~`WP(HqII4NhgM9JK5}c^T1vdq z%SgDHtE|cHW3JC=x?Y_!0Tejp9JI$trNq1Q)_3A5^(glH0B7d*4P(R6CuW0h1Qn|< za=;QP(80luuo)fj;1-}t6DOAy<=dXN9qd+L>41@pkRySsjs1chrmW0MXdW`*ZD)63m z$|mxVf+E%=!}h~l-4WKz@mjOy%D20Y|4K=m#l`29)GLtCd?r%4&b|d5^Ki$NxkZM7s zmaC$a9Kw7qA{`DBi@=hJhe(@y!jziQF{6|9es_DiYLSv5!*YVkMmj_1TmiPbWYm*e UBL2vTj{${R{nisPpi=Gs0*mW~sQ>@~ diff --git a/.gradle/7.6/executionHistory/executionHistory.lock b/.gradle/7.6/executionHistory/executionHistory.lock index 6008d13b88f47cced0a0c3a8d3b79fea00be4471..14de9979e7e70439d7bc7a3d0d14e62d1e4ac4a4 100644 GIT binary patch literal 17 UcmZR6tNi*(fa07w1_*cx06A3!LjV8( literal 17 UcmZR6tNi*(fa07w1_)RJ067!|0ssI2 diff --git a/.gradle/7.6/fileHashes/fileHashes.bin b/.gradle/7.6/fileHashes/fileHashes.bin index f76a86f06b9077cc2d45d39d8ee268526671ec9b..6b6466b9803c093abe9a04efc96929048f359a04 100644 GIT binary patch delta 672 zcmcb=gYo_j#toZ26f$aZ@0itHt^KrI+WDQ-lU)o9jBVX>_kUpk0mhiB$&5k5lO;Sw zH~;ovVNtmA{!$#zl%=~Wdy@aREy)N4tL~kD60Dkm@yTR)-xUf+cE8r<=vK+zHuuH? zr?X_s!o3H>r%hq-qI6kOJ?;i;4hvR|Ma>9SkWYxCa9w0Kw8fjNN57F zA_xmq&yd^RHDT77UCWjqDhaiR*gbc{6rdy!@IM9;XgYqm2Ii||1oS#G@B8&9%e4<| z$J`VSph{LC=9S#M-Y<(ONVD~L%&9uNC+&;>9Iw#ipAGTU+H9Z_AmBO&B+v{NhzPd( z@T>R2jQiWl1AXKsKy~DRH860j+MFF|$EaW{aoEq^c-78g_24TJ3UlXyRn6kChN$8^ zIr(Ie8cX-2$d1XMgM5POFW*|TQ-s~<)szGW(bKmD!Kx=kc0yGPVY(tC-beVb!Ks@@ z^SRxQGVeYG)-iYgJ%|oovB?vIT@)gocb-z^f07U;b(E|5qeK~0(KCo5G4{z{gWq#c ziUfKA1UQl=J4OgkW(pNyo)kH8vSg?}nDz$KlQ!3eRjmwkOW+22QMvS^eDgrgg! z2V{JS1&JzjP270m9k0MQoO#sB~S delta 657 zcmcb=gYo_j#toZ26y|T6mcb?YKciABMS|zOU_S!`V_P>jlP3cRFve(1W(*RZEa54- z`L_oPi-HoHAV*>8noa3RS8byjW^V_n?y~)~6Retn@%&_Y-xUgvRW50pa4u%9pZUD% zs@sgUU`0BfjSxjF+a^Evby3jYI9;%2!(XFm8!tyZ{&ge{tmxRJJcuIJwUZZm2nR~M z=(??V=}0g0JQ1lCkJo|KeE1R$QNt?$r1gw}geDLxg0O(W$$2GwTLt+)_vn7M+865u z*6}s}I8YJ@c%E%u@0Z0C)LQ8*A3klG)16yRTji3T%mAy3xPA(vigP)TMl+Z5j>D$k zKh2{VUu86f=&vb7)xkb-b9SH|qry`D<(kJIhx04k%65)oTlyKS>e!UG5OXk zSzsMstL&iWGfkct?4t1PX=+iIf{lZe>=B8a=UoS&iku;ego`JC4Svtfw9*W!DQU7} zgz#jhP!VRPmFANrL-oP5H<0FLvff-9TE)WB^)9$+vcHeiWYH)Q2uC+c56B4I2ohEJ z@=|~&ZLR`aPx# diff --git a/.gradle/7.6/fileHashes/fileHashes.lock b/.gradle/7.6/fileHashes/fileHashes.lock index 8838838d8da735679df3aa9a050ab63648165b3c..470c7b20248a6de8a833993774fcd09e258415f0 100644 GIT binary patch literal 17 VcmZQhIDR4ZmDNi>1~6dJ0RTJj1nU3* literal 17 VcmZQhIDR4ZmDNi>1~6bY1pqtu1oHp@ diff --git a/.gradle/7.6/fileHashes/resourceHashesCache.bin b/.gradle/7.6/fileHashes/resourceHashesCache.bin index a02e7abbac17f6303b1103f424007f2663511eb9..38d0f20534d3a2aade000c206af5a5eebcc66b94 100644 GIT binary patch delta 2156 zcmZvddo+}39LLQ>}j|5B2;l95CzXu&hh&UVEY2#HtXk-MGbYbtNH>MzkK4Mt=&prQ91YRuS~ zA4g^X2}4#37}6_+M4V+<#bX5{FpOFX_7F%=i-U@Q|KS&8^(+F&BhbvmHc7|nZZtI{ z^NGCH14|Q&Rm1V>FpnGuO@w>U^K6?nw$GNQAh5H6qo0hySrEL{+ocmQj2Hq#1|(=q zT_^CM!>d%pR0cAGgJ#pcgmBUQ_F}~3%4^9e$5#&r8+OB-y%Ovpw&5__vs@hV2M~4~ z*ctM0YJ$4P@?E}2=yFhNNP=+9AFg6Ai8B#c09s~6lHVcInXnF+ML7UEiHBpa>+`j{ zfwZ4>4hTqm+>U%7`&FGR*kkd42blz|FwS!y)wbw?VT1^<$gyTtSnFsuO#|5^dy#zU z)_~17FV7uB5?+EPax7%u(>eVv@7{YDvb%u+CDzrc!lc17H=BS!UwMM_mg&?NJn3DS zN7l=^tMn%wj**KS%p=MHhY|~Uj8=%(DoH|N7@iFJD5VfX&)+dxnjt|Tqand47z0Jw zUauY)ks{A!_(#yRY|1R@S<lq&P~XC;1NkR zU2wSj?wdP&zsjjuNc_LColh<#O-B?(k!Z8Wa zSUUGi%x(7SBLm0OQaoP!HGE@mk;Z34;Z-*8 zmkgDD^e@dk^y20>3StE57xv%r6}?t>)H-4kS6zlSvTR7{4@seUF)AAs=v zfkh7^803AEB`1QIU9AcV-1)mX(AD}N!^msTI7T(wNI3DGG9mYi8n0TF`#E_Ihc^}0 zu0fX(R&L(?drX)<+p{gu55tT>8_6#Xm_d@!4G)wrapTJ_>bHW2{aUXcdWf#PQauQbHsCBy?Li3 z3KpKc92!(*T+ocgB?(WVjk4S8qTO3_7VBU~J}IvhEc$A2<*!G=&kRdZn3h|}W;LHz zl)S{RirmPkrwv+r62oqFb=s7?v)qL?#tUr!7&N*T;I^=_^U|Sq657DJC~o;DF;$lE zydqw9E>c%vwt@3@;~m+mFA1QT_5_9(lA79)_8 zz9Sct?IU25eI#I$^(0`Eoh4wC6(*3gy(UlrlO-tdlSL^=lcgyblhr9A0uBkWA@~=u LFc1o}K}gCIoK-w1 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index d0967962c44f484bd0a5921ed3baabab751a3eba..6beb7719d3851c423e5de76f972f0e08920a4527 100644 GIT binary patch literal 17 VcmZP$cJnpe`{Bc11~6cJ4*)jT1*rf4 literal 17 VcmZP$cJnpe`{Bc11~6bu0suBj1snhX diff --git a/.idea/misc.xml b/.idea/misc.xml index 5d982561..1429a1d3 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,5 +1,10 @@ + + + + + diff --git a/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java b/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java index bf4a013a..e277b756 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java @@ -7,6 +7,8 @@ import com.project.hackathon.domain.restaurant.dto.RestaurantCreateRequest; import com.project.hackathon.domain.restaurant.dto.RestaurantDetailResponse; +import com.project.hackathon.domain.restaurant.entity.Category; +import com.project.hackathon.domain.restaurant.entity.Restaurant; import com.project.hackathon.domain.restaurant.service.RestaurantService; import com.project.hackathon.global.dto.ResultResponse; import lombok.RequiredArgsConstructor; @@ -14,6 +16,9 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.util.List; +import java.util.stream.Collectors; + @RequestMapping("/api/v1/restaurant") @RequiredArgsConstructor @RestController @@ -27,6 +32,18 @@ public ResponseEntity createRestaurant( RestaurantDetailResponse restaurantDetailResponse = restaurantService.create(request); return ResponseEntity.ok(restaurantDetailResponse); } + + @GetMapping("/list") + public ResponseEntity> getAllRestaurants() { + List restaurants = restaurantService.getAllRestaurants(); + return ResponseEntity.ok(restaurants); + } + + @GetMapping("/list/{category}") + public ResponseEntity loadCategory(@PathVariable Category category) { + RestaurantDetailResponse restaurantDetailResponse = restaurantService.getCategoryDetail(category); + return ResponseEntity.ok(restaurantDetailResponse); + } // // @GetMapping("/{boardId}") // public ResponseEntity getBoardDetail(@PathVariable Long boardId) { diff --git a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantDetailResponse.java b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantDetailResponse.java index d5711d69..df54f828 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantDetailResponse.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantDetailResponse.java @@ -11,6 +11,7 @@ @AllArgsConstructor @NoArgsConstructor public class RestaurantDetailResponse { + private Long id; // 레스토랑 이름 private String title; diff --git a/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java b/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java index b6ad0e53..d794d152 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java @@ -15,7 +15,7 @@ @NoArgsConstructor public class Restaurant extends BaseEntity{ @Id - @GeneratedValue(strategy = GenerationType.AUTO) + @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; @@ -44,6 +44,7 @@ public Restaurant( String title, Category category ) { + this.id = id; this.title = title; this.category = category; this.isRemoved = false; diff --git a/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java b/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java index afac5374..b17a6f5d 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java @@ -1,5 +1,6 @@ package com.project.hackathon.domain.restaurant.repository; +import com.project.hackathon.domain.restaurant.entity.Category; import com.project.hackathon.domain.restaurant.entity.Restaurant; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -7,15 +8,17 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import java.util.List; import java.util.Optional; public interface RestaurantRepository extends JpaRepository { @Query("select r from Restaurant r where r.id = :id and r.isActive = true") Optional findRestaurantById(@Param("id") Long id); + List findAll(); @Query("select r from Restaurant r where r.category = :category and r.isActive is true") - Optional findRestaurantByCategory(@Param("category") String restaurantCategory); + Optional findRestaurantByCategory(@Param("category") Category category); @Query("select r from Restaurant r where r.isActive is true") Page findRestaurantWithPagination(Pageable pageable); diff --git a/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java b/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java index bf0860bf..b55e513b 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java @@ -4,6 +4,7 @@ import com.project.hackathon.domain.restaurant.dto.RestaurantDetailResponse; import com.project.hackathon.domain.restaurant.dto.RestaurantInfo; import com.project.hackathon.domain.restaurant.dto.RestaurantUpdateRequest; +import com.project.hackathon.domain.restaurant.entity.Category; import com.project.hackathon.domain.restaurant.entity.Restaurant; import com.project.hackathon.domain.restaurant.repository.RestaurantRepository; import lombok.RequiredArgsConstructor; @@ -33,23 +34,28 @@ public RestaurantDetailResponse create(RestaurantCreateRequest restaurantCreateR restaurantRepository.save(newRestaurant); return RestaurantDetailResponse.builder() + .id(newRestaurant.getId()) .title(newRestaurant.getTitle()) .category(newRestaurant.getCategory()) .createdAt(newRestaurant.getCreatedAt()) .build(); } -// public RestaurantDetailResponse getRestaurantDetail(Long restaurantId) { -// Restaurant restaurant = -// RestaurantRepository.findRestaurantById(restaurantId).orElseThrow(null); -// return RestaurantDetailResponse.builder() -// .title(restaurant.getTitle()) -// .category(restaurant.getCategory()) -// .createdAt(restaurant.getCreatedAt()) -// .build(); -// } + @Transactional + public List getAllRestaurants() { + return restaurantRepository.findAll(); + } + + @Transactional + public RestaurantDetailResponse getCategoryDetail(Category category) { + Restaurant restaurant = restaurantRepository.findRestaurantByCategory(category).orElseThrow(null); + return + RestaurantDetailResponse.builder() + .title(restaurant.getTitle()) + .category(restaurant.getCategory()) + .build(); + } - public List restaurantInfoList = new ArrayList<>(); public RestaurantDetailResponse getBoardListPage(int page, int size) { final Pageable pageable = PageRequest.of(page, size); Page restaurantPageInfoList = @@ -66,7 +72,6 @@ public RestaurantDetailResponse updateRestaurant(RestaurantUpdateRequest restaur return RestaurantDetailResponse.builder() .title(restaurant.getTitle()) .category(restaurant.getCategory()) - .createdAt(restaurant.getCreatedAt()) .build(); } From 84283f2e2375dda13f317ded57a5399aa25cff76 Mon Sep 17 00:00:00 2001 From: HAERYN Date: Sun, 26 Feb 2023 11:55:56 +0900 Subject: [PATCH 11/20] =?UTF-8?q?feat:=20restaurant=20=EC=B9=B4=ED=85=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=20=EC=A0=95=EB=A0=AC=EB=A1=9C=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../7.6/executionHistory/executionHistory.bin | Bin 394800 -> 394800 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/7.6/fileHashes/fileHashes.bin | Bin 23647 -> 23647 bytes .gradle/7.6/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../7.6/fileHashes/resourceHashesCache.bin | Bin 24923 -> 25059 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .../controller/RestaurantController.java | 6 +++--- .../repository/RestaurantRepository.java | 2 +- .../restaurant/service/RestaurantService.java | 20 +++++++++++------- 9 files changed, 16 insertions(+), 12 deletions(-) diff --git a/.gradle/7.6/executionHistory/executionHistory.bin b/.gradle/7.6/executionHistory/executionHistory.bin index 9b6efae959fe97ed5dd933223147aa0313d988e4..fd21888584e0b54e95995013c4d3b83fe99af26f 100644 GIT binary patch delta 486 zcmdncBe4O9>eeYGrBqZEn`R|t7G;>16{MG&mKEfdS7oQ9moh-WpUn%_NyZ7BTXSoj zvgp#8?UyWEe>}QwJl#;3QG5FRS&X~4ujgefVilOFJ=au!r`h6-wrdYoDt6m}6g&~g zE&lx4^vj*eKX*&H{8?UMK3!lD}1T<8u?&@Ege3f;F*nDHZLu;phT+LWF z{f_{1xb}4~Pu>fY-|}yMU$voi*_StGPfxu2!k|x@nL!{{Nr1I=Lh$-eGdIj(Tdn6l zy-tw%#`dX-jIK=D+l41sxxC$fiGlrk^V}U|>hh4-^uL zwc69R+0Np-++y3wN-TG$8y;oWTRv5Vky$`wa{ZOZJ9hQ%Z)u%+Z8Mv~_ND5KX^fr@ zyKHJrp9eeZhCuOG=<&>nElqIJbXQme!RTP?4W|gPpWHLa&>&*++NyZ60JY-?P zv;CWj`_vmHH5KMX(+!0gwWr^o#khO>dS1pNR)M8ITk=<=N-}b+d^2Ub@^2xKf+qrh zmoIt$g?Y*stGk!Vm+WWVJY8TB}1X4LBA5Rc8nZq%StHa~Ld8z3iS2Na4 z|0BR0uALF@BYfE4)J>!L+-^sicb~fV|J$7x2GgXN83dlEx7Ji=@~t@jo@dY9H+c%v z>jar^Y@e#g=*pyRD{TIp8H)gKd zes=nTW6Uac5zjkMsq#Nb2$MR>)%;PS>>1deb{(LGJx;6>>Q$!NZJxm6J1Z<$9Vm2r z3CI1;+b#+sP<&l!ro_=0ksD^yTT)YLN}7k+P)w3kblM)^w6WH zO%y0(<^JEeFUQhctU9)zrRK{4wt;j}QX`V_Wx<)CZeSd;DQhV2J2$xl-`q zUwzT^1Irg)z6y~IkzoJ>R+h=neanKbvHkZxHCK$)u|Y)7?|Ausu%d-0??Ds^umEX2 zV<4dk#EKv+kQppEEB##9#LYi_3eGLLTMyCEAPAHM0zT!<>-~N)D{L2@VCC|5|0M?Y z>&oPX?_}xbEf2dtvfh{>|^JHncAL@&>BtEJP7+-{gtGE((^C f2hP|$PQ0aUUDqNfQhFPz=n_Pc#Ei{fgR?jQMb%_l delta 276 zcmcb=gYo_j#toZ2Br_kY=Z+T#z4!javtwK=*~ zvbW8>vB2r97%y0M=D}zNFkn@k{M@%JsCtIn_O1!D&g@#Y{7^}#eJI3;4O1YB_#Xpl zJ!2rD3B-yZEbz-UFkdAjpx2Rk->*Meu6+<4DI7paAmEkUyx#8@vx2R}VLyB0RXdB- zgRev=%$)~THH*Ux@k0@+wCax?o$w>_TPgj;uV`bG1x^R h;(6yORsJUlVNyrAnm0{{aZV7>qV diff --git a/.gradle/7.6/fileHashes/fileHashes.lock b/.gradle/7.6/fileHashes/fileHashes.lock index 470c7b20248a6de8a833993774fcd09e258415f0..2789a3304c2c140149f2d801033cf604c2c78738 100644 GIT binary patch literal 17 VcmZQhIDR4ZmDNi>1~6c80RTJ*1p@#8 literal 17 VcmZQhIDR4ZmDNi>1~6dJ0RTJj1nU3* diff --git a/.gradle/7.6/fileHashes/resourceHashesCache.bin b/.gradle/7.6/fileHashes/resourceHashesCache.bin index 38d0f20534d3a2aade000c206af5a5eebcc66b94..ba94a139aa0fb0da94300d545ccdb52a2756dd1b 100644 GIT binary patch delta 258 zcmcb8i1G1Z#tkMCk_Q_?4yyha;Mu_d28r|kL&0WKi4U9tA`>1?KHD+J6e@dgvaFIK zKO5^@`7PFLP_f$0rb-%&0;-2MB;~9SeE=1W-W;mDh>b}|bED!9@r?!_ST{R*NJ-Wk z1EnQ_SP+B-&aJt%PFZy6%=Swbu0I}K2T97Isz^R#nY+d7_`wT@`b3^h?svdckz4%v owdt2TlYj1(a{05o!W>h@OzpX*`a8`QZ?s*@d9YHk+YY1z0J)}5uK)l5 delta 46 zcmV+}0MY;B!vWjE0kAX}0ll+L81M;`RU#R)h9VyUv%Mpl1_BYuu_5>uu`o~uvq4B2 E8M==VMF0Q* diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 6beb7719d3851c423e5de76f972f0e08920a4527..92e8fadb7cb9eea04f855ecde278f86c6e294454 100644 GIT binary patch literal 17 VcmZP$cJnpe`{Bc11~6d!4FERd1+@SG literal 17 VcmZP$cJnpe`{Bc11~6cJ4*)jT1*rf4 diff --git a/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java b/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java index e277b756..a7075084 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java @@ -40,9 +40,9 @@ public ResponseEntity> getAllRestaurants() { } @GetMapping("/list/{category}") - public ResponseEntity loadCategory(@PathVariable Category category) { - RestaurantDetailResponse restaurantDetailResponse = restaurantService.getCategoryDetail(category); - return ResponseEntity.ok(restaurantDetailResponse); + public ResponseEntity> loadRestaurantByCategory(@PathVariable Category category) { + List restaurantDetailResponses = restaurantService.getRestaurantsByCategory(category); + return ResponseEntity.ok(restaurantDetailResponses); } // // @GetMapping("/{boardId}") diff --git a/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java b/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java index b17a6f5d..3e44f2f2 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java @@ -18,7 +18,7 @@ public interface RestaurantRepository extends JpaRepository { List findAll(); @Query("select r from Restaurant r where r.category = :category and r.isActive is true") - Optional findRestaurantByCategory(@Param("category") Category category); + List findByCategory(Category category); @Query("select r from Restaurant r where r.isActive is true") Page findRestaurantWithPagination(Pageable pageable); diff --git a/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java b/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java index b55e513b..1180eaf9 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java @@ -46,14 +46,18 @@ public List getAllRestaurants() { return restaurantRepository.findAll(); } - @Transactional - public RestaurantDetailResponse getCategoryDetail(Category category) { - Restaurant restaurant = restaurantRepository.findRestaurantByCategory(category).orElseThrow(null); - return - RestaurantDetailResponse.builder() - .title(restaurant.getTitle()) - .category(restaurant.getCategory()) - .build(); + @Transactional(readOnly = true) + public List getRestaurantsByCategory(Category category) { + List restaurants = restaurantRepository.findByCategory(category); + List restaurantDetailResponses = new ArrayList<>(); + for(Restaurant restaurant : restaurants) { + restaurantDetailResponses.add(RestaurantDetailResponse.builder() + .id(restaurant.getId()) + .title(restaurant.getTitle()) + .category(restaurant.getCategory()) + .build()); + } + return restaurantDetailResponses; } public RestaurantDetailResponse getBoardListPage(int page, int size) { From 888ea9aaad0ce13ae1c03f508bed09c7534ee032 Mon Sep 17 00:00:00 2001 From: HAERYN Date: Sun, 26 Feb 2023 13:53:09 +0900 Subject: [PATCH 12/20] =?UTF-8?q?feat:=20restaurant=20patch=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../7.6/executionHistory/executionHistory.bin | Bin 394800 -> 445934 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/7.6/fileHashes/fileHashes.bin | Bin 23647 -> 23797 bytes .gradle/7.6/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../7.6/fileHashes/resourceHashesCache.bin | Bin 25059 -> 25773 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .../controller/RestaurantController.java | 54 ++++-------------- .../dto/RestaurantDetailResponse.java | 1 + .../dto/RestaurantUpdateRequest.java | 5 +- .../restaurant/service/RestaurantService.java | 32 ++++------- 10 files changed, 25 insertions(+), 67 deletions(-) diff --git a/.gradle/7.6/executionHistory/executionHistory.bin b/.gradle/7.6/executionHistory/executionHistory.bin index fd21888584e0b54e95995013c4d3b83fe99af26f..47341d9a1bd56d82c808c6ab939868d3fdf66369 100644 GIT binary patch delta 1982 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 diff --git a/.gradle/7.6/executionHistory/executionHistory.lock b/.gradle/7.6/executionHistory/executionHistory.lock index c9b0b638997bd6d7d66e8eee13bd84c4da28131e..07c9c8043fed9540f79c0dae1c0b9d9ed4bbcda4 100644 GIT binary patch literal 17 UcmZR6tNi*(fa07w1_<~G06A#|R{#J2 literal 17 UcmZR6tNi*(fa07w1_*c!06AL)NdN!< diff --git a/.gradle/7.6/fileHashes/fileHashes.bin b/.gradle/7.6/fileHashes/fileHashes.bin index 3d4e6190f223c86f0cf4c0c28f1397045f55344b..8da9fa9656316ac450c339179bbb0b3e30ab9282 100644 GIT binary patch delta 895 zcmcb=gYoN5#tkMCj9HUSB_;^;76$E!Wn03>00uGfoA*j2unI_QTJiL0O2G}N=;6(x zau*l{!YJcdp&PQw5%_+~|VOX-*=pIy28AOr5q{$P5T@=bx&P)$E zbw}y0OB`cv#HVtoqFRU|(G8ow2ESviw~ui(`jqNfq5HCvVb}6g{2*1`zXUErR4ID` zX|ym5-s{e8R#&+FUw8Ms_cuI%v52gL0T@^4I>bC&<|THBrk+`_@6)o9Z;O$1m;+UF z0zHYYC7toWBgq$9Cl4?8Gq9ObF9y}}5~vagxMpsi8Fh@Y9yQV2IQODu9>>*l;WDqh z1jI@gK=r%=Yhf@s0i@Bqa@5Fd&wHbPY>}rM*B`NNaYD6)(*aXQV&=t%_D^QNY&c+J Vx={QHCpcvS!|OT361@PB768Fm2QmNv delta 600 zcmeymlkxrz#tkMCjOmk2B_?dXD-prE*;noa<7Qn2CMG7%of{Q@h;KAV;G68|QKaDg zB{`(oJE^Ajt>TY)S9ydO7#Q2Sm!v*m00G9Bs>zH&!jmODMK}NUU||Wm^ZrsC&y=OR zDtnUuw=KyC1*`6ze-f;kf$<5D)-whYnn0`w!UFuq9hdIqtGdD9>a8~-cu!)<0 z`V^d7aTLuYqKG$xXxjkD-aQE z_u*IXg&Fs^l?VFBO@Qjif#~2^H90%bMZx>Hn2vb#_C=8gmAlR@=`{r@>Wa927HaH; z$>#%CDBLsK$9UN?Wx=w^amkBAL6XRdIOHc!54xpr-OH2r!sNI7o8MP$XkGT@4cNLR zsZf)6`zB8ec2TgDJaES5apEm)>$(;>kaA5Ql7 zky2Rw*t);)Qbc#Rey;EtL~b(@x;fe-xgTk{lND1 Up|BoQ^&^OCwpE*FMjc}W0QP3h>;M1& diff --git a/.gradle/7.6/fileHashes/fileHashes.lock b/.gradle/7.6/fileHashes/fileHashes.lock index 2789a3304c2c140149f2d801033cf604c2c78738..ff72569189d63837f041dea7b419c486f2a1115c 100644 GIT binary patch literal 17 VcmZQhIDR4ZmDNi>1~6cm4gfq`1y%q6 literal 17 VcmZQhIDR4ZmDNi>1~6c80RTJ*1p@#8 diff --git a/.gradle/7.6/fileHashes/resourceHashesCache.bin b/.gradle/7.6/fileHashes/resourceHashesCache.bin index ba94a139aa0fb0da94300d545ccdb52a2756dd1b..682dd377d3921c23fdba361e4053e1d6424b8a56 100644 GIT binary patch delta 1127 zcmaESm~rh%#tkMCjMpZcO03Xmv*NmK&BUw800v3f|Dm95{XB!9gt!ohcuMBxs}hV% z{4(4rr5|sHK^0$|d{)XrV}Yp6;)@Y#3!s9ZVJ0kSto7%!>D7gZC!0_HD>ak9NA0ur ziR+>ev6Sw~z0wK-o6lW6?#|0B0~K_iyj0pkV`oIWO54|iw z9ta%&_+`s$9nm_dVDDsJ*$o0WnU1Yock1(Bh+vB9l(WR%?&;vC#a&oEM z4}lN69bYcrCA%1^U43$@e1pKZ?Hy(E)+X@~!NkX#@5&dl@U!oJbWz~vZ>Y-kn_X3a z;i@!cq1`IqPf#=GPPSFE^I!cZ>F6TaO))RNVyalfvv%G3``%5D>vLl!uKZ+$ zsbaPKWuCZ46Potuzb!FqUetL)k%tnhVvhfo4jagr(JhLT~{ z&)}^|H?PhVc#ElmVadTqWe=8?)jr+0QFiAMIZPEcal1qQ`e?0x(!S|?+=9v049*z- zjf@SrEz&bDKrijB(wrHr!I*|L-gIwz_gn6y`u(?t&(xXTP2LzIY{>Xp%Ij+~@0Lw3 zIvpK+H(=^=Sev!Y{UM)X??V~o{*|ZeC+kL-)Tb0)5YWsyZdYFLb6P*kNp4JSXT0hp z4D{E!GhB8*r^u3U4pYT`QG?>+VXNbUxNYrsO=4)rRPpk2fuG(z|GwE9*> loadRestaurantByCategory(@ List restaurantDetailResponses = restaurantService.getRestaurantsByCategory(category); return ResponseEntity.ok(restaurantDetailResponses); } -// -// @GetMapping("/{boardId}") -// public ResponseEntity getBoardDetail(@PathVariable Long boardId) { -// BoardDetailResponse response = boardService.getBoardDetail(boardId); -// -// return ResponseEntity.ok(ResultResponse.of(ResultCode.BOARD_DETAIL_GET_SUCCESS, response)); -// } -// -// @GetMapping("/list/{page}") -// public ResponseEntity getBoardListPage( -// @PathVariable int page, -// @RequestParam(required = false, defaultValue = "10") int size, -// @RequestParam(defaultValue = "false", required = false) boolean isTimeReversed) { -// BoardListResponse response = boardService.getBoardListPage(page, size, isTimeReversed); -// -// return ResponseEntity.ok(ResultResponse.of(ResultCode.BOARD_LIST_PAGE_GET_SUCCESS, response)); -// } -// -// @GetMapping("/search/{page}") -// public ResponseEntity searchBoardWithTitleOrContent( -// @PathVariable int page, -// @RequestParam(required = false) int size, -// @RequestParam(defaultValue = "false", required = false) boolean isTimeReversed, -// @RequestParam String search) { -// BoardListResponse response = -// boardService.searchBoardWithTitleOrContent(page, size, isTimeReversed, search); -// -// return ResponseEntity.ok( -// ResultResponse.of(ResultCode.BOARD_LIST_PAGE_SEARCH_SUCCESS, response)); -// } -// -// @PutMapping -// public ResponseEntity updateBoardDetail(@Valid BoardUpdateRequest request) { -// BoardDetailResponse response = boardService.updateBoard(request); -// -// return ResponseEntity.ok(ResultResponse.of(ResultCode.BOARD_DETAIL_UPDATE_SUCCESS, response)); -// } -// + + @PatchMapping("/patch") + public ResponseEntity updateRestaurant( + @Validated @RequestBody RestaurantUpdateRequest request + ) { + RestaurantDetailResponse restaurantDetailResponse = restaurantService.update(request); + return ResponseEntity.ok(restaurantDetailResponse); + } + + // @DeleteMapping("/{boardId}") // public ResponseEntity deleteBoard( // @PathVariable Long boardId, @RequestParam Long userId) { diff --git a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantDetailResponse.java b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantDetailResponse.java index df54f828..5874de0e 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantDetailResponse.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantDetailResponse.java @@ -19,4 +19,5 @@ public class RestaurantDetailResponse { private Category category; // 레스토랑 생성일자 private LocalDateTime createdAt; + private LocalDateTime updatedAt; } diff --git a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java index 5eb81cba..ffd182d6 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantUpdateRequest.java @@ -12,14 +12,11 @@ @Builder @AllArgsConstructor public class RestaurantUpdateRequest { - @NotNull(message = "레스토랑 Id는 공백이 올 수 없습니다.") - private final Long id; - @NotBlank(message = "레스토랑 제목은 빈칸일 수 없습니다.") private final String title; @NotNull(message = "레스토랑 카테고리는 공백이 올 수 없습니다.") - private final Category restaurantCategory; + private final Category category; private final LocalDateTime createdAt; } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java b/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java index 1180eaf9..ca73cd57 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java @@ -2,22 +2,16 @@ import com.project.hackathon.domain.restaurant.dto.RestaurantCreateRequest; import com.project.hackathon.domain.restaurant.dto.RestaurantDetailResponse; -import com.project.hackathon.domain.restaurant.dto.RestaurantInfo; import com.project.hackathon.domain.restaurant.dto.RestaurantUpdateRequest; import com.project.hackathon.domain.restaurant.entity.Category; import com.project.hackathon.domain.restaurant.entity.Restaurant; import com.project.hackathon.domain.restaurant.repository.RestaurantRepository; import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -60,23 +54,21 @@ public List getRestaurantsByCategory(Category category return restaurantDetailResponses; } - public RestaurantDetailResponse getBoardListPage(int page, int size) { - final Pageable pageable = PageRequest.of(page, size); - Page restaurantPageInfoList = - restaurantRepository.findRestaurantWithPagination(pageable); - return new RestaurantDetailResponse(); - } - @Transactional - public RestaurantDetailResponse updateRestaurant(RestaurantUpdateRequest restaurantUpdateRequest) { - Long id = restaurantUpdateRequest.getId(); + public RestaurantDetailResponse update(RestaurantUpdateRequest restaurantUpdateRequest) { Restaurant restaurant = - restaurantRepository.findRestaurantById(id).orElseThrow(null); + Restaurant.builder() + .title(restaurantUpdateRequest.getTitle()) + .category(restaurantUpdateRequest.getCategory()) + .build(); + restaurantRepository.save(restaurant); - return RestaurantDetailResponse.builder() - .title(restaurant.getTitle()) - .category(restaurant.getCategory()) - .build(); + return new RestaurantDetailResponse( + restaurant.getId(), + restaurant.getTitle(), + restaurant.getCategory(), + restaurant.getCreatedAt(), + restaurant.getUpdatedAt()); } // public void deleteRestaurant(Long restaurantId) { From 9efc55fa1dd271b554a8f4ad0158172cf5497dbe Mon Sep 17 00:00:00 2001 From: HAERYN Date: Sun, 26 Feb 2023 14:33:09 +0900 Subject: [PATCH 13/20] =?UTF-8?q?fix:=20restaurant=20patch=EA=B0=80=20crea?= =?UTF-8?q?te=EB=A1=9C=20=EC=A0=81=EC=9A=A9=EB=90=98=EB=8A=94=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../7.6/executionHistory/executionHistory.bin | Bin 445934 -> 445934 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/7.6/fileHashes/fileHashes.bin | Bin 23797 -> 23847 bytes .gradle/7.6/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../7.6/fileHashes/resourceHashesCache.bin | Bin 25773 -> 26079 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .../controller/RestaurantController.java | 25 ++++++------ .../dto/RestaurantDetailResponse.java | 5 +++ .../domain/restaurant/entity/Restaurant.java | 10 ++++- .../restaurant/service/RestaurantService.java | 38 ++++++++++-------- .../hackathon/global/dto/ResultResponse.java | 4 +- .../hackathon/global/entity/BaseEntity.java | 2 +- 12 files changed, 52 insertions(+), 32 deletions(-) diff --git a/.gradle/7.6/executionHistory/executionHistory.bin b/.gradle/7.6/executionHistory/executionHistory.bin index 47341d9a1bd56d82c808c6ab939868d3fdf66369..83170185ca54308aac6361a382641cbf84590df9 100644 GIT binary patch delta 962 zcmaDiTl(E>=?&%UG;8G;7;5EaXBt)H78GVDnx|zHq-AGhS0on~vo^JuMy7M$GLLamL(Ub3oK&1vz<|taSDfkU{mvS20e=vym?ILt(jC3rf-yC+9BZV z-LH^&apltmI-7DM3+7$kzHk+zBP0KflPPbLH7_g)*c#jMW{3FnkEyF>r`HKG-`1bFf1xlXZHb2+;gn%8UXm zcR~8!DKjbx?g&aPE=epcO3W(>PAw|SOrCBqokd-WK|ofMZGS+J-U?aI_bGdBK6&&3 zY;d#i^z$Oj(sp(#o^3NvFmvSOtj%>e_TK*^SoVW4(Aq0W6F=RavnXa#*rhdxk`v2; zLOH#UZv7IwYkS~w_B5}P7j>o^9%a^>K2-(ilAj=#tW;rq&Gi{<#705J+0zqM8AYZy zl(Vu;-=WGV!~&9;eomF~63cfGYl#}83WRk=jnS9oD@aUMozb1;H;9#?&ZsMJWRr=$ zzNqPP^_=>Ug1o2s)0e6V57}c=*TQy34(ihr~BO-GRO|tr;gk?z*;&p(lKJ>7NbdU39fi&MJm#S+nIv0_-8h$uzVDXny6k<}>8OU}!W z@^UMLv(%zXVKbA}RaCOp`->^!hE6n$|JAd7x9>jBv+usoem_&Ov#Hp*LQ}pd%gEtm z8H;_A_xl}=PtEZ4+Y@szKE+3!q|&G}537AsI8z6BRl0ISom;^j3Bn4nNMBzD5VOV%w^n_+uzR)0*ll-`yAsSj2t*pOW1tFJlR*C)Q~nB|z;;y%El zmIX0^wjoS=i5oAe(j) zIc#7GE$pBiLYeaxS0@Kg`pm0-Xjx8*de!5iMISP)0F`s~k)9Df8fp8sEG4HLysQ8FEsc<5C@&fA3lLG5>HDi8LLy8{)_k z=X`-}MyA+^m9NN^D&3vcAaVFC4-IhO2ZxHvG=VofVo!Bj#@k$D#Q?j%ojB+PyU?Uy qM@XwlANr{v(6W^>oTwveeB(x3^9nqH6_*uZ#jvt66nM^v)BOjHv_szj diff --git a/.gradle/7.6/executionHistory/executionHistory.lock b/.gradle/7.6/executionHistory/executionHistory.lock index 07c9c8043fed9540f79c0dae1c0b9d9ed4bbcda4..96f6c8ed8e67f305bcc07eca906fa8dec8c5dbcd 100644 GIT binary patch literal 17 VcmZR6tNi*(fa07w1~6b`1pqjA1Y`gJ literal 17 UcmZR6tNi*(fa07w1_<~G06A#|R{#J2 diff --git a/.gradle/7.6/fileHashes/fileHashes.bin b/.gradle/7.6/fileHashes/fileHashes.bin index 8da9fa9656316ac450c339179bbb0b3e30ab9282..cfd64e33d848edba297b7622820bd42c6c960a47 100644 GIT binary patch delta 744 zcmeymlX3Yj#tkMCjMt<$@+^G0Ne4zo~WJix8 z`5S@!%Qxu#Qxco+Xm_A5O^bnnv8~4>MFOmYF=kSb$Ycpm(apa-SXdO4dYcNo9BZ_k zyf?j{Y1+vPRx3A)17bYW^3C$TJdE{P5}vaJCPv+QTXIhJ?+-yHh>7Yt5LImZfwZ16 zkkABTMGzLyo_nzoET10#wNg#Jpmg*ZbKqDoF3TY54nzL?VaVglD0O@i|~+@=pSQN`Qb_dopi8 znZmyaG23TlOD?Zoe(^8Avvn%etU!n&mY~Ut1G-pxRFwrL8wN@#$jKHsKTtX=ANTxJ z!U5L9AHb@Ck`UEgJe#uvgBV$QOp@R$qi_9_|0>p3 zgY}stKZEK!2BgvaxK;4gvfLY;QNo+5el&Ka{etRv3DF@^fvLm5qTHJOl*H4$&K28N z^y{-jbvy^EoV+hsT)|Govu)-HW{#YkwYd(*-upx4KSE5D{4n`z@H-x$i@!nyIFcqi zMhH)43Ka%<V57}c=*TQy34(ihr~<3hN>#dLd@U{ z+Ppo~gbifC=gIG*!3KPutQZ4k{GJ>fv&aZFEy!xJ?GFgjTOsTDK4s6%Cy$_R1coyR Ja5e)8Jpdg4-ev#* delta 691 zcmZ3!i}CAD#tkMCj9HsaB`Vl9AC+rnW@Ox`_(Oc7fdt=VM~@-}u{Y}OmSTL4?xM@f zt>kU-OM_}W7E#e)7V+Cd9=E7pjmLUmjL zs$>OXo=Kb6``Ixncr9`iwQ%m+nkjQ?W{Y-v4Mc0a4Alcyo4O5F<;s0V2SW zG}$picrsI{FvuGdCrgHc{WEd0H-s^1a&4%T!h)CF(><&X%sVEgQJ9%59tAQKXz5L; p8S$I9hnlc~4CtTyJ{oL5|767&J&-+1~6c`2mm~l1&{y$ literal 17 VcmZQhIDR4ZmDNi>1~6cm4gfq`1y%q6 diff --git a/.gradle/7.6/fileHashes/resourceHashesCache.bin b/.gradle/7.6/fileHashes/resourceHashesCache.bin index 682dd377d3921c23fdba361e4053e1d6424b8a56..b6c9fb1fbaa4630d4a7c66127155401dcb1ef389 100644 GIT binary patch delta 531 zcmZ2`lJWj&#tkMCjQ1y-N>m6m*Y#k1tONRcC)GE z17?A}LE`ta*MDPysuZ5gD;vlk)p}V!D834+^5f)C*#Ln<4_3RMQFmSoRcN|-uIvIv zf&0>8$G)Gr&H)vjz1dXWgGu1~s&?i*%Q(}a2Atnqsu;j5AiHMOtGO|o7edvBZ{DkN zlZiig;|fQc+MQ6ry_a?aN(0>$(I?6}pB2o;KeP`&)Zk$FuMBID)A{ zu&H@EgPz3--aMxI^VUo%SPa=x8X2Ri{=wRP#^KA4ZPV{z8uE@oan*ji`RbLON(nE# z1^X~nm@40C|InT)T72)U_S0nVHJB=1%s0{PK6hUuoVSm2<+LqJE@CQi_U>26ytwk| P0-a5{kp=TEgH!+j{aBLC delta 72 zcmV-O0Js0&%K@#)0kAX}0oIc>7> loadRestaurantByCategory(@ return ResponseEntity.ok(restaurantDetailResponses); } - @PatchMapping("/patch") + @PatchMapping("/{id}") public ResponseEntity updateRestaurant( - @Validated @RequestBody RestaurantUpdateRequest request - ) { - RestaurantDetailResponse restaurantDetailResponse = restaurantService.update(request); + @PathVariable Long id, + @Valid @RequestBody RestaurantUpdateRequest request) { + RestaurantDetailResponse restaurantDetailResponse = restaurantService.update(id, request); return ResponseEntity.ok(restaurantDetailResponse); } - -// @DeleteMapping("/{boardId}") -// public ResponseEntity deleteBoard( -// @PathVariable Long boardId, @RequestParam Long userId) { -// boardService.deleteBoard(boardId, userId); -// -// return ResponseEntity.ok(ResultResponse.of(ResultCode.BOARD_DELETE_SUCCESS, new Object())); -// } + @DeleteMapping("/{id}") + public ResponseEntity deleteRestaurant( + @PathVariable Long id) { + restaurantService.delete(id); + String message = ResultResponse.RESTAURANT_DELETE_SUCCESS.getMessage(); + RestaurantDetailResponse response = new RestaurantDetailResponse(message); + return ResponseEntity.ok(response); + } } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantDetailResponse.java b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantDetailResponse.java index 5874de0e..97f0a649 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantDetailResponse.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantDetailResponse.java @@ -20,4 +20,9 @@ public class RestaurantDetailResponse { // 레스토랑 생성일자 private LocalDateTime createdAt; private LocalDateTime updatedAt; + + public RestaurantDetailResponse(String message) { + // 메시지만 필요한 경우에 사용하는 생성자 + this.title = message; + } } diff --git a/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java b/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java index d794d152..fa7ef26c 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java @@ -49,7 +49,15 @@ public Restaurant( this.category = category; this.isRemoved = false; } - + public void setTitle(String title) { + this.title = title; + } + public void setCategory(Category category) { + this.category = category; + } + public void setUpdatedAt() { + this.updatedAt = LocalDateTime.now(); + } public void deleteRestaurant() { //soft delete this.isRemoved = true; } diff --git a/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java b/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java index ca73cd57..69967f57 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java @@ -6,10 +6,12 @@ import com.project.hackathon.domain.restaurant.entity.Category; import com.project.hackathon.domain.restaurant.entity.Restaurant; import com.project.hackathon.domain.restaurant.repository.RestaurantRepository; +import lombok.Builder; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @@ -54,26 +56,28 @@ public List getRestaurantsByCategory(Category category return restaurantDetailResponses; } + @Builder @Transactional - public RestaurantDetailResponse update(RestaurantUpdateRequest restaurantUpdateRequest) { - Restaurant restaurant = - Restaurant.builder() - .title(restaurantUpdateRequest.getTitle()) - .category(restaurantUpdateRequest.getCategory()) - .build(); - restaurantRepository.save(restaurant); + public RestaurantDetailResponse update(Long id, RestaurantUpdateRequest restaurantUpdateRequest) { + Restaurant restaurant = restaurantRepository.findById(id).orElseThrow(null); + restaurant.setTitle(restaurantUpdateRequest.getTitle()); + restaurant.setCategory(restaurantUpdateRequest.getCategory()); + restaurant.setUpdatedAt(); + Restaurant savedRestaurant = restaurantRepository.save(restaurant); return new RestaurantDetailResponse( - restaurant.getId(), - restaurant.getTitle(), - restaurant.getCategory(), - restaurant.getCreatedAt(), - restaurant.getUpdatedAt()); + savedRestaurant.getId(), + savedRestaurant.getTitle(), + savedRestaurant.getCategory(), + savedRestaurant.getCreatedAt(), + savedRestaurant.getUpdatedAt() + ); } -// public void deleteRestaurant(Long restaurantId) { -// Restaurant restaurant = RestaurantRepository.findRestaurantById(restaurantId).orElseThrow(null); -// restaurant.deleteRestaurant(); -// restaurantRepository.save(restaurant); -// } + @Transactional + public void delete(Long id) { + Restaurant restaurant = restaurantRepository.findRestaurantById(id).orElseThrow(null); + restaurant.deleteRestaurant(); + restaurantRepository.save(restaurant); + } } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/global/dto/ResultResponse.java b/src/main/java/com/project/hackathon/global/dto/ResultResponse.java index b64df8ab..c7265375 100644 --- a/src/main/java/com/project/hackathon/global/dto/ResultResponse.java +++ b/src/main/java/com/project/hackathon/global/dto/ResultResponse.java @@ -9,11 +9,13 @@ public enum ResultResponse { // restaurant RESTAURANT_CREATE_SUCCESS("RT001", "레스토랑 등록 성공"), + RESTAURANT_DELETE_SUCCESS("RT002", "레스토랑 삭제 성공"), + RESTAURANT_UPDATE_SUCCESS("RT003", "레스토랑 수정 성공"), // review REVIEW_CREATE_SUCCESS("RV001", "리뷰 업로드 성공"), REVIEW_GET_SUCCESS("RV002", "리뷰 조회 성공"), - BOARD_DELETE_SUCCESS("RV003", "리뷰 삭제 성공"), + REVIEW_DELETE_SUCCESS("RV003", "리뷰 삭제 성공"), REVIEW_LIST_PAGE_GET_SUCCESS("RV005", "리뷰 리스트 페이징 조회 성공"), REVIEW_LIST_PAGE_SEARCH_SUCCESS("RV006", "리뷰 검색 성공"), ; diff --git a/src/main/java/com/project/hackathon/global/entity/BaseEntity.java b/src/main/java/com/project/hackathon/global/entity/BaseEntity.java index 0779b658..98b7b155 100644 --- a/src/main/java/com/project/hackathon/global/entity/BaseEntity.java +++ b/src/main/java/com/project/hackathon/global/entity/BaseEntity.java @@ -23,7 +23,7 @@ public abstract class BaseEntity { @LastModifiedDate @Column(name = "updated_at") - private LocalDateTime updatedAt; + protected LocalDateTime updatedAt; @Column(name = "is_active", nullable = false) private Boolean isActive; From ad5643c0e77d860a100322038212c11baf4afb4e Mon Sep 17 00:00:00 2001 From: HAERYN Date: Sun, 26 Feb 2023 14:35:15 +0900 Subject: [PATCH 14/20] =?UTF-8?q?feat:=20=EC=9D=B4=EC=A0=84=20=EC=BB=A4?= =?UTF-8?q?=EB=B0=8B=20=EB=B3=B4=EC=B6=A9=20-=20restaurant=20soft=20delete?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hackathon/domain/restaurant/service/RestaurantService.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java b/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java index 69967f57..9261cab4 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java @@ -1,5 +1,4 @@ package com.project.hackathon.domain.restaurant.service; - import com.project.hackathon.domain.restaurant.dto.RestaurantCreateRequest; import com.project.hackathon.domain.restaurant.dto.RestaurantDetailResponse; import com.project.hackathon.domain.restaurant.dto.RestaurantUpdateRequest; @@ -10,8 +9,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; From c95bce873f0c7f6c3d01b22d032152ee4e1147fe Mon Sep 17 00:00:00 2001 From: HAERYN Date: Sun, 26 Feb 2023 15:23:16 +0900 Subject: [PATCH 15/20] =?UTF-8?q?feat:=20review=20create=20=EC=88=98?= =?UTF-8?q?=EC=A0=95,=20list=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../7.6/executionHistory/executionHistory.bin | Bin 445934 -> 445934 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/7.6/fileHashes/fileHashes.bin | Bin 23847 -> 23897 bytes .gradle/7.6/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../7.6/fileHashes/resourceHashesCache.bin | Bin 26079 -> 26555 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .../dto/RestaurantCreateRequest.java | 5 - .../dto/RestaurantDetailResponse.java | 1 - .../domain/restaurant/entity/Restaurant.java | 1 - .../review/controller/ReviewController.java | 19 ++-- .../review/dto/ReviewCreateRequest.java | 3 + .../review/dto/ReviewDetailResponse.java | 10 +- .../review/dto/ReviewUpdateRequest.java | 2 + .../domain/review/entity/Review.java | 25 ++++- .../review/repository/ReviewRepository.java | 2 + .../domain/review/service/ReviewService.java | 98 ++++++++++-------- 16 files changed, 105 insertions(+), 61 deletions(-) diff --git a/.gradle/7.6/executionHistory/executionHistory.bin b/.gradle/7.6/executionHistory/executionHistory.bin index 83170185ca54308aac6361a382641cbf84590df9..d37cd3412aaa4b0f12b6ca4556b7772a0ea7a8de 100644 GIT binary patch delta 1450 zcmX9;3p7+|9G`FQ3`NE@W{hWs@u)Css`aQ?Tb7NL=c+h`JV!{$AbCZqVTIz8Hz8t6 ziBXwMdG#QVB7}sB)TAz+^0WTZ{4*`0e6eTf~yP)wV zA^y>&4%$Y@Dh98ihCKL!nhB!KqwDAMnqNQL2&1DaSE?e6WR`-15uQy3B zhjLUffS&yMo=oacGWS_~(^AO(83*X~0AayeK0<~&6hJx(RAct;j_t8j-#Ou=nPh$% zCWI4NFt(gPf=V=S8O?LBYwz}u{je%U6HFROL<;@M5LE(9IG%>5pttYL8B|Q>p5=SQ zJuXd(QG_Kl{4?}i)9(^T!+U={_=eJ8&?NT`vZRogD9M?$uZ~zGRi@9X`g16oBpgWt zT2ugHwl`4{~>l`0Y$&e1>-d`kjKFm4ecs^ZXYFKV8~(2>C|yRz>OmODemvQ!GF zhP_{qEl^zpyUO=uBoY>A0vFWPCyO=JdNLTic)CXZM_>a10|XE%g{_zrL{V?N*K%p5wBbD}foNKiBatTb_o;DOmn61E7Qop?{76+$oHP zr%DL!(NZX#ol=eG9=8zUpH~(dGi?1=wqNnS^L^wZpVne+sd0`utEPLMMzs7Qf zBQv|HoL1+>C=8m2c(ryl_Uq@Gb&;0n^dH@j)rK(ja#AW4P&5Db+cgshQoirD7)g$w zoHk4ne%-xb=MdMv#zxQ5b-2eN{^~G+ikK;KId-~ZDi2I^s8d1xn!vMDWLPD^i*1OS za)NZ+i2TZMgX?2?_x=n=?|u=>RRKKsNgGh$S~)>e8Ha8=+?08IWHR&RKA+{BHC#=z zNLERO^V(pe@}RcaIL}>HTeWZg^FXxhs6fQd$%A?bDhb=MD|$Y)R2*`Q$*a2fJ*>H+ z-km3!{0a(kVXqTW$pD8gCilj^X5F;Cy50fit#+@76-(0CTq&31w^jwFD%DsQwG@`O zEKz?$5Jotx3l3&q{EVegM)op*7QM9 zaDzN%c#>#Bryh9H6v9l+Q4Xw)!krKEJ;7mn`+{0=Q)lr}OT4^s4p9bM-dd2W@#fc~ z^qgJ2B8+hP_> z4Y(OYW*F32a{Z!Lr{|=OpwXmuw_<_9{>`Cf! zYeBpny}5vT%~%~%sztr^v}FYBS~;rqwy^5Qa}27^y5Hf}*iUnd)$U{L$me6wpz5Ah z{{?$clFi3yHTAIJtq$Z$U2&xaU|fqZV0w^~Y$Z0_D%disKlV*L36Dqs*e{n8a4h5} fm|;SsLV+G2oRicCSmCikuo9k$JV||t4<-Kt;tYvn delta 1317 zcmXw3c~H|w7|rIFSj7RBBpd+(CLD4|1PwYu0k5hNM-D-2@q&`;;2P?24Y z_>!9gfpEy7C~k>3At^aNdbwb4k|2I>yqG82pBN_=Ea4E03uIg^yJWr_Ma&RKp)RQZ zUAW58p`d2aWV#E9#_J7Eq=@a0ftNr`MVKOunT^+wR%R3sxYXGVls9sbCE1 zO1-ilb-8Ub&6#&0|5~LA!E*2#YPTnU>Ws|(uv$~LKEv)K4Ov)%=kTUHM=x`Cf3c5y zIM`oW-GQQSVLqs)5u+eKD0V8 zrZp%<-DZG}(nm3}Jpno}lGeOowL9+Wd$^~Gd{;kfJ4pi1lla#s{iJ$fpHkdje``NwM^X;)kMO`m&yn*k@x#kvU%Q_q6wpnXaJq=W-7{ zlM9b)tbKX8@r7Xsa1N=$$#gFQ zjQL~q^ld9mlH2X8p=UgfsXC1gxe0!*aT8X9tIf9o;+0Y=iv=@KSTS+gnn~jbGv?q_ zIR8K#Kb6fBMvFuQNNYJ7)cvK_B1{%J-#$i9pY_#J@t_Kk?b3O&tT*30_(!9A4-cS_ zR?HRYi-|CO+?e(j;;t%np(0fDwL-ezGm+^G0Ne51h&-pP(0 zMGDKyb@k$fTD;kKHqO<0qjQgefw8S8fw>H-QyIt7%!kgduJ1{cG*2_;e z43v^MpC~$8@n+JEv%X8d@B4YC0IUNfnH;Fc(i2;+Gutv$)AIK6dvpkcq5)NU7_w^PO}@^)hd{nx3)*~LMV$;cQgQe@seAVws@3WjC`XuM75@P~b zE`iwxYz_lED9ND(^0_BJ7UbpYZC}~{y?Fn!t-xdtOvKLe`N0jL9FES{k|Q?+E|8wJq#~aP-xQfyq#3g+eUh?ZVWd-RIg`D#;he zejxJ3rK#=;P#qDIfjQ?)G?!bg_wYC`ms%G9z}G2cXEL0hyki(1!At2&8?vdYziCwP3lrU z{C=t2cx#pF>Fgx1viQ%SOaKH-M<*}z5Uy9XeXu>6UsdMP`%l-Z`R_uFasVq~;Kbrw zRz3B+v9W=ymH=Y*MS-oC3a;~V4C VdoMJAegl_wV6zz*I6i}P002@9g&6<< delta 1308 zcmcb)i*flb#tkMCjM1a?o9}3M zpf62}fq}8D$0S990R$Lhu1#k3)Y$yngM~#wskf=X%dtkw$$QiLnWmk*V3l&SIKV0y zn3hkL_jOU&B`akjo2XFYHsSn<^8poLMO_QPf#Jm1)_GFwI#4ALusQ+>G)r8hZtB|H z-IK6(?WA|YZ5a!}mM~RK25Vqo-Gr&5(C^7iKRuTD!DruaaIBffJsYfr>)1}H7C%fa zr$pYIi?vLx6rFSG%aLA}P_Pa*(*lSN-onX=(ZZYG`8zN&t11gjHVl+fkdrNNexP(# zKJNLcgafRHKY(=f03{(hxOgT9`U+333lwJQ+VFbvOjRWCwB(>NZ6@(w#_`j%#o9`HrL_Udw;0nkCWd9OV=xzz87A6(d5v-1B#)k zH`GCL-E7v+AqKIX1JY;#UT)=S7+H5L&-2R{gKMvvfGGx)4#IEZ){!*tbN_y^y9FBi zHwR48YP|^6aSNm)0~o6sn3k;Qe%yGX`|48Ot&^5qZMB*Jb=C`rCEP&&qB~3d!-r=P zx7d$6J&gQ#&R2{Tq@%|q`71;RN77`+2;usdmD?+8>=)jfZnW{ekt8%{B!7pfVgHY5 zs>so1`-i_a2?j0=<(5hMAPF@Us)G|t>S7cQm^){}t~IW+y(P^ae`1E}_zALug@J*6 z_U6`51-AOn$L-^^-j+w11^s?hDxh5k_8@~k&;k%(yaXiB!aeP1)t^82itm1&Un;P8 z&CAzNgFk~cFtBrC>NxhlK9u8_nvJ8It@K_WKX8fy1_?-qIS_Mf#MBa3w^(vb)>&bJ zU91Hk7x|b%E%^;p2?U%*lcQr+sK{!v?GFgjTOsTDK4s6%Cy$_tfN318s2ND=0RUC> BaW4P> diff --git a/.gradle/7.6/fileHashes/fileHashes.lock b/.gradle/7.6/fileHashes/fileHashes.lock index 5ed405110ffdde5b55735062d7df4c666c5dbd9b..76fc76da3013363ee375e3b1dd1bfac7c67d62b0 100644 GIT binary patch literal 17 VcmZQhIDR4ZmDNi>1~6b12LL1~6c`2mm~l1&{y$ diff --git a/.gradle/7.6/fileHashes/resourceHashesCache.bin b/.gradle/7.6/fileHashes/resourceHashesCache.bin index b6c9fb1fbaa4630d4a7c66127155401dcb1ef389..ee494139114d23a75f28a2d00d61bcc20959a600 100644 GIT binary patch delta 787 zcmcbAnsN7e#tkMCjBh8KN_-ILaM)*e_eyLF0~n;Oo-8YA$)EfEm`YDbGE}T{v#+Ei z6aSVSdvk&|GC>5>%QweLcQ9(~Jg4j%v~BNdsM7TRP_Xl!j4+p?_++T~+0A!l92f-- zJqn(5bJD8CP*KLsqH+Pu0`Fg^G96?8_!lbbx;a*HA``#VriaUQ7EFN%rrzKDR5^lC zKw7c+X>~8V21GPnaI>kZ0h5N&cbn&Zp{sSE2E2zk!g%g;l>;?m1yI$-lVjC?2-sfJ zH~c$IGX^R+bF#0-L;m(i4|U#COQ8lRZ&ua(z$B1!=IoB!57s}2stn!Ct0Tq8B<8tM z@rU?EgA0tC9X;mBIv4|`C4pEFgazW4I`pug%{&)t7G(HT=GIG~pd6}-ZQm}%cCXp+ z^L*vRCoFFamQQ936t3s1WV<=*gW~NZl))Jzl=y=A{5G@B=USp;xH9zSG(Jp2N=$e0_S|giI(=- createReview( - @Validated @RequestBody ReviewCreateRequest request - ) { + @Validated @RequestBody ReviewCreateRequest request, + @PathVariable String restaurant) { ReviewDetailResponse reviewDetailResponse = reviewService.create(request); return ResponseEntity.ok(reviewDetailResponse); } + + @GetMapping("/list") + public ResponseEntity> getAllReviews(@PathVariable String restaurant) { + List reviews = reviewService.getAllReviews(); + return ResponseEntity.ok(reviews); + } } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java b/src/main/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java index 9f3f71d6..de0e3624 100644 --- a/src/main/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java +++ b/src/main/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java @@ -18,4 +18,7 @@ public class ReviewCreateRequest { @NotBlank(message = "리뷰 내용은 빈칸일 수 없습니다.") private String content; + @NotBlank(message = "리뷰 내용은 빈칸일 수 없습니다.") + private String restaurant; + } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/review/dto/ReviewDetailResponse.java b/src/main/java/com/project/hackathon/domain/review/dto/ReviewDetailResponse.java index 27ab838a..ca93dd1c 100644 --- a/src/main/java/com/project/hackathon/domain/review/dto/ReviewDetailResponse.java +++ b/src/main/java/com/project/hackathon/domain/review/dto/ReviewDetailResponse.java @@ -12,11 +12,17 @@ @AllArgsConstructor @NoArgsConstructor public class ReviewDetailResponse { - + private Long id; // 리뷰 이름 private String title; // 리뷰 내용 private String content; + private String restaurant; + private LocalDateTime createdAt; + private LocalDateTime updatedAt; - private Restaurant restaurant; + public ReviewDetailResponse(String message) { + // 메시지만 필요한 경우에 사용하는 생성자 + this.title = message; + } } diff --git a/src/main/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java b/src/main/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java index 547a64b6..580208e4 100644 --- a/src/main/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java +++ b/src/main/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java @@ -5,6 +5,7 @@ import lombok.Getter; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; @Getter @Builder @@ -17,4 +18,5 @@ public class ReviewUpdateRequest { @NotBlank(message = "리뷰 내용은 빈칸일 수 없습니다.") private final String content; + private final LocalDateTime createdAt; } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/review/entity/Review.java b/src/main/java/com/project/hackathon/domain/review/entity/Review.java index 27956e62..6706b06f 100644 --- a/src/main/java/com/project/hackathon/domain/review/entity/Review.java +++ b/src/main/java/com/project/hackathon/domain/review/entity/Review.java @@ -1,5 +1,6 @@ package com.project.hackathon.domain.review.entity; +import com.project.hackathon.domain.restaurant.entity.Category; import com.project.hackathon.domain.restaurant.entity.Restaurant; import com.project.hackathon.global.entity.BaseEntity; import lombok.AllArgsConstructor; @@ -7,6 +8,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import javax.persistence.*; +import java.time.LocalDateTime; import java.util.ArrayList; import static javax.persistence.FetchType.LAZY; @@ -32,9 +34,12 @@ public class Review extends BaseEntity { private String content; // 특정 레스토랑명 - @ManyToOne(fetch = LAZY) - @JoinColumn(name = "restaurant") - private Restaurant restaurant; +// @ManyToOne(fetch = LAZY) +// @JoinColumn(name = "restaurant") +// private String restaurant; + @Column(name = "restaurant", nullable = false) + private String restaurant; + @Column(name = "is_removed", nullable = false) private boolean isRemoved; @@ -43,14 +48,24 @@ public class Review extends BaseEntity { public Review( String title, String content, - Restaurant restaurant){ + String restaurant){ this.title = title; this.content = content; this.restaurant = restaurant; this.isRemoved = false; } - public void deleteRestaurant() { //soft delete + public void setTitle(String title) { + this.title = title; + } + public void setContent(String content) { + this.content = content; + } + public void setUpdatedAt() { + this.updatedAt = LocalDateTime.now(); + } + + public void deleteReview() { //soft delete this.isRemoved = true; } diff --git a/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java b/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java index 61f76c7f..c02ee73b 100644 --- a/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java +++ b/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java @@ -8,12 +8,14 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import java.util.List; import java.util.Optional; public interface ReviewRepository extends JpaRepository { @Query("select r from Review r where r.id = :id and r.isActive = true") Optional findReviewById(@Param("id") Long id); + List findAll(); @Query("select r from Review r where r.title like :title and r.isActive = true") Optional findReviewByTitle(@Param("title") String title); diff --git a/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java b/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java index e1793122..18da6813 100644 --- a/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java +++ b/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java @@ -4,12 +4,15 @@ import com.project.hackathon.domain.restaurant.dto.RestaurantDetailResponse; import com.project.hackathon.domain.restaurant.dto.RestaurantInfo; import com.project.hackathon.domain.restaurant.dto.RestaurantUpdateRequest; +import com.project.hackathon.domain.restaurant.entity.Category; import com.project.hackathon.domain.restaurant.entity.Restaurant; import com.project.hackathon.domain.restaurant.repository.RestaurantRepository; import com.project.hackathon.domain.review.dto.ReviewCreateRequest; import com.project.hackathon.domain.review.dto.ReviewDetailResponse; +import com.project.hackathon.domain.review.dto.ReviewUpdateRequest; import com.project.hackathon.domain.review.entity.Review; import com.project.hackathon.domain.review.repository.ReviewRepository; +import lombok.Builder; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -20,61 +23,74 @@ import java.util.ArrayList; import java.util.List; +import java.util.Optional; @Service @RequiredArgsConstructor public class ReviewService { private final ReviewRepository reviewRepository; - public ReviewDetailResponse create(ReviewCreateRequest reviewCreateRequest) { Review newReview = Review.builder() .title(reviewCreateRequest.getTitle()) .content(reviewCreateRequest.getContent()) + .restaurant(reviewCreateRequest.getRestaurant()) .build(); - reviewRepository.save(newReview); - return ReviewDetailResponse.builder() - .title(reviewCreateRequest.getTitle()) - .content(reviewCreateRequest.getContent()) + .id(newReview.getId()) + .title(newReview.getTitle()) + .content(newReview.getContent()) + .restaurant(reviewCreateRequest.getRestaurant()) + .createdAt(newReview.getCreatedAt()) .build(); } -// -// public RestaurantDetailResponse getRestaurantDetail(Long restaurantId) { -// Restaurant restaurant = -// RestaurantRepository.findRestaurantById(restaurantId); -// return RestaurantDetailResponse.builder() -// .title(restaurant.getTitle()) -// .category(restaurant.getCategory()) -// .createdAt(restaurant.getCreatedAt()) -// .build(); -// } -// -// public List restaurantInfoList = new ArrayList<>(); -// public RestaurantDetailResponse getBoardListPage(int page, int size) { -// final Pageable pageable = PageRequest.of(page, size); -// Page restaurantPageInfoList = -// restaurantRepository.findRestaurantWithPagination(pageable); -// return new RestaurantDetailResponse(); -// } -// -// @Transactional -// public RestaurantDetailResponse updateRestaurant(RestaurantUpdateRequest restaurantUpdateRequest) { -// Long id = restaurantUpdateRequest.getId(); -// Restaurant restaurant = -// restaurantRepository.findRestaurantById(id).orElseThrow(null); -// -// return RestaurantDetailResponse.builder() -// .title(restaurant.getTitle()) -// .category(restaurant.getCategory()) -// .createdAt(restaurant.getCreatedAt()) -// .build(); -// } -// -// public void deleteRestaurant(Long restaurantId) { -// Restaurant restaurant = RestaurantRepository.findRestaurantById(restaurantId); -// restaurant.deleteRestaurant(); -// restaurantRepository.save(restaurant); + + @Transactional + public List getAllReviews() { + return reviewRepository.findAll(); + } + +// @Transactional(readOnly = true) +// public List getReviewsByTitle(String title) { +// Optional reviews = reviewRepository.findReviewByTitle(title); +// if (reviews.isPresent()) { +// List reviewDetailResponses = new ArrayList<>(); +// for(Review review : reviews) { +// reviewDetailResponses.add(ReviewDetailResponse.builder() +// .id(review.getId()) +// .title(review.getTitle()) +// .content(review.getContent()) +// .build()); +// } +// return reviewDetailResponses; +// } +// return new ArrayList<>(); // 오류가 발생했을 때 반환할 값 // } + + @Builder + @Transactional + public ReviewDetailResponse update(Long id, ReviewUpdateRequest reviewUpdateRequest) { + Review review = reviewRepository.findById(id).orElseThrow(null); + review.setTitle(reviewUpdateRequest.getTitle()); + review.setContent(reviewUpdateRequest.getContent()); + review.setUpdatedAt(); + + Review savedReview = reviewRepository.save(review); + return new ReviewDetailResponse( + savedReview.getId(), + savedReview.getTitle(), + savedReview.getContent(), + savedReview.getRestaurant(), + savedReview.getCreatedAt(), + savedReview.getUpdatedAt() + ); + } + + @Transactional + public void delete(Long id) { + Review review = reviewRepository.findReviewById(id).orElseThrow(null); + review.deleteReview(); + reviewRepository.save(review); + } } \ No newline at end of file From e5a75f5eb84ae9db5280bc8d61e0b3933d251e49 Mon Sep 17 00:00:00 2001 From: HAERYN Date: Sun, 26 Feb 2023 15:27:33 +0900 Subject: [PATCH 16/20] =?UTF-8?q?feat:=20review=20patch=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 --- .../7.6/executionHistory/executionHistory.bin | Bin 445934 -> 445934 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/7.6/fileHashes/fileHashes.bin | Bin 23897 -> 23897 bytes .gradle/7.6/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../7.6/fileHashes/resourceHashesCache.bin | Bin 26555 -> 26589 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .../review/controller/ReviewController.java | 28 ++++++++++++++++++ 7 files changed, 28 insertions(+) diff --git a/.gradle/7.6/executionHistory/executionHistory.bin b/.gradle/7.6/executionHistory/executionHistory.bin index d37cd3412aaa4b0f12b6ca4556b7772a0ea7a8de..9fcb327af188ecf7e689ef20218d54881fa321b4 100644 GIT binary patch delta 378 zcmaDiTl(E>=?!)3lv47us?xGe((=lZi_&sRvWrU-bFzvGvocBQv+{e22Xs`N&^K*Z1ch+D` zWAsesUYL7xS!w2pC#;8WA2{X#RH@zhb#;x?o$ty&#fztXuImO0@jkrWs+9X+QxNk8 zPA3PRD4>wcp?X)PlatRHosvG@qQaKwBLhQiSw?=I{`83!tfJHXw=vJ3ZfeA6J^lVHMwRK`b~EQpzo5h{+uo(i V2*gZ4%nZaVK+L+mOP4KW0RWC)rDgyC delta 378 zcmaDiTl(E>=?!)3lu|PbQ_S)bGqTc>E2^^0Gjq%G3(AX(3QQ6iz<@D#^MZAWX#%q{ zuNC}s_hR|&{Aw?!MWfwzK~cszTmlnAn5>Pw_$S?a|IEL7$=>7BKdxr1oBl_DIehyh z1;#KI?HS!G!~|^9k8N7>D5Cqjlf#|1hQ}`qT11%{1a{>H=Y?I`u_Iv-2g8ZHbouFx zqRh7215_C=Fe#r|xT-(#Ou}Qe13PS&TxhxhRQ^|;_lphdq5X5zTV^RFYhB;&tihPZ z=s7X-vFOhua~pgW_RkevZY~d0DO>q4!CN`Q=2y1L!+9(Jo&yT4p1S*Z)Q+p-QFW@9 zl&$9M1q$7eaXym%!Jl#Aw7m=}doE;7-*}vP=H>+}92k|Cm+R`q3$=K&@ob!{^+xC3 zH?X5WZ)as;WMHT*%gE2upFYuoRdl-lHs<-$O^q0>r{AB&s51TAZswfn7nGP~+q-lb VftU%1nSq!Eh*`IH>9VCP003XVoR|Or diff --git a/.gradle/7.6/executionHistory/executionHistory.lock b/.gradle/7.6/executionHistory/executionHistory.lock index ac39716395b2235704034f8fb41b6693e1048604..a7bfa429961f68dca25392fddcc60ef6274ef7c2 100644 GIT binary patch literal 17 VcmZR6tNi*(fa07w1~6dc0{}RH1Z@BS literal 17 VcmZR6tNi*(fa07w1~6dc1^_sH1Zn^P diff --git a/.gradle/7.6/fileHashes/fileHashes.bin b/.gradle/7.6/fileHashes/fileHashes.bin index b598903c6cf6da3cc81a4cd3b20ffe3f6616d680..42234fe7726046b5fd8d6ad0532418aa549cacbd 100644 GIT binary patch delta 127 zcmcb)i}B_z#toZ26j+wFT+3jeGSe@k>w{cZbSnb`V_Q#J;Z_C^V2u7bnblKc^KXwn zHU&1baE8@is~loq&N|g+nBojknXCj>$-q5j^Gg3ctP0cAo?JDPzcp>e?F&a;llJ|9 QnzsU?iuc#%*3c{L05W(l$N&HU delta 127 zcmcb)i}B_z#toZ26qc9k>ctDSc(d_roU8Rl=NJ1~6ci2LL1~6b12LLq&|X$)YHzI*dig~_~(i5nGvh;KC5!MNGc lqe@=M7$_+T#DX9!5GekpYmwr*B@6S`8vK2K+#M(=2LQ{_9{d0R delta 36 scmcb6o^khi#tkMCjBhuaO6=g+%&OSU%jmgL@rU?EgA0tC9X+b#0Tk^H1^@s6 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 9f36766ffb9ecb91d37dbc8045b5d011ca0c8f3d..522a771b9c676f4f28332de77825e24c6d21c505 100644 GIT binary patch literal 17 VcmZP$cJnpe`{Bc11~6a>0suBV1q}cI literal 17 VcmZP$cJnpe`{Bc11~6dq0RT2O1qT2C diff --git a/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java b/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java index 28fde548..f18fc89a 100644 --- a/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java +++ b/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java @@ -3,17 +3,22 @@ import com.project.hackathon.domain.restaurant.dto.RestaurantCreateRequest; import com.project.hackathon.domain.restaurant.dto.RestaurantDetailResponse; +import com.project.hackathon.domain.restaurant.dto.RestaurantUpdateRequest; +import com.project.hackathon.domain.restaurant.entity.Category; import com.project.hackathon.domain.restaurant.entity.Restaurant; import com.project.hackathon.domain.restaurant.service.RestaurantService; import com.project.hackathon.domain.review.dto.ReviewCreateRequest; import com.project.hackathon.domain.review.dto.ReviewDetailResponse; +import com.project.hackathon.domain.review.dto.ReviewUpdateRequest; import com.project.hackathon.domain.review.entity.Review; import com.project.hackathon.domain.review.service.ReviewService; +import com.project.hackathon.global.dto.ResultResponse; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; import java.util.List; @RequestMapping("/api/v1/{restaurant}/review") @@ -35,4 +40,27 @@ public ResponseEntity> getAllReviews(@PathVariable String restauran List reviews = reviewService.getAllReviews(); return ResponseEntity.ok(reviews); } + +// @GetMapping("/list/{category}") +// public ResponseEntity> loadRestaurantByCategory(@PathVariable Category category) { +// List restaurantDetailResponses = restaurantService.getRestaurantsByCategory(category); +// return ResponseEntity.ok(restaurantDetailResponses); +// } + + @PatchMapping("/{id}") + public ResponseEntity updateReview( + @PathVariable Long id, + @Valid @RequestBody ReviewUpdateRequest request) { + ReviewDetailResponse reviewDetailResponse = reviewService.update(id, request); + return ResponseEntity.ok(reviewDetailResponse); + } + +// @DeleteMapping("/{id}") +// public ResponseEntity deleteRestaurant( +// @PathVariable Long id) { +// restaurantService.delete(id); +// String message = ResultResponse.RESTAURANT_DELETE_SUCCESS.getMessage(); +// RestaurantDetailResponse response = new RestaurantDetailResponse(message); +// return ResponseEntity.ok(response); +// } } \ No newline at end of file From a54da073e83989593a64c4d9fb35394d2c1faecc Mon Sep 17 00:00:00 2001 From: HAERYN Date: Sun, 26 Feb 2023 15:30:51 +0900 Subject: [PATCH 17/20] =?UTF-8?q?feat:=20review=20soft=20delete=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../7.6/executionHistory/executionHistory.bin | Bin 445934 -> 445934 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/7.6/fileHashes/fileHashes.bin | Bin 23897 -> 23897 bytes .gradle/7.6/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../7.6/fileHashes/resourceHashesCache.bin | Bin 26589 -> 26623 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .../review/controller/ReviewController.java | 16 ++++++++-------- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.gradle/7.6/executionHistory/executionHistory.bin b/.gradle/7.6/executionHistory/executionHistory.bin index 9fcb327af188ecf7e689ef20218d54881fa321b4..9c181ec29d1919f8007b9168970fb8bb7f0535e4 100644 GIT binary patch delta 378 zcmaDiTl(E>=?!)3luSx0D@!xe)3cLOk}|T4@^f=di_`P6lZ;ClAmH@o1?v*i1YCpX z+Uoz#`Eus2r_Nf=BO%)bMH%OC3CMopVLr3KcHW|bOGdZZ*e$1jT+LWF{f_{1`1VN( zjA1O=sqa=>Jn-=TxBtrim-!bLN6dP<^zjRWUL|G*0q2eH|8_a}dL<@_tdmkJ=bYXs z%51wmK$YNA7rm6!JfY>r{N7fZH>ak>&D`#+!I;MA zDYrFOIS&4-SBxY<{^`8rT#E^F9~3tTr3+|uPp+3(3S<^QjXP&uv!3qaP=?!)3lv47us?xGe((=lZi_&sRvWrU-bFzvGvocBQv+{e22Xs`N&^K*Z1ch+D` zWAsesUYL7xS!w2pC#;8WA2{X#RH@zhb#;x?o$ty&#fztXuImO0@jkrWs+9X+QxNk8 zPA3PRD4>wcp?X)PlatRHosvG@qQaKwBLhQiSw?=I{`83!tfJHXw=vJ3ZfeA6J^lVHMwRK`b~EQpzo5h{+uo(i V2*gZ4%nZaVK+L+mOP4KW0RWC)rDgyC diff --git a/.gradle/7.6/executionHistory/executionHistory.lock b/.gradle/7.6/executionHistory/executionHistory.lock index a7bfa429961f68dca25392fddcc60ef6274ef7c2..ce833d7ef93017365508b4eacd919f4d10e11f82 100644 GIT binary patch literal 17 VcmZR6tNi*(fa07w1~6b01OPaL1aJTV literal 17 VcmZR6tNi*(fa07w1~6dc0{}RH1Z@BS diff --git a/.gradle/7.6/fileHashes/fileHashes.bin b/.gradle/7.6/fileHashes/fileHashes.bin index 42234fe7726046b5fd8d6ad0532418aa549cacbd..1d38d8d5f765516aea1b999342e4dca29a8a8271 100644 GIT binary patch delta 127 zcmcb)i}B_z#toZ26b=-wox69B)i22dajduWMB5k`7~6U>ipEz)2;E9<-AoZr?vmzPd~sI*N2t7PEL*}T$!5354zyVVvCJiPzyzq0>j{>8-+ RQ1fO%R0;BKZVkP{4gkJ(FtY#v delta 127 zcmcb)i}B_z#toZ26j+wFT+3jeGSe@k>w{cZbSnb`V_Q#J;Z_C^V2u7bnblKc^KXwn zHU&1baE8@is~loq&N|g+nBojknXCj>$-q5j^Gg3ctP0cAo?JDPzcp>e?F&a;llJ|9 QnzsU?iuc#%*3c{L05W(l$N&HU diff --git a/.gradle/7.6/fileHashes/fileHashes.lock b/.gradle/7.6/fileHashes/fileHashes.lock index 813805dfa52c31467d514917677f90dfad5d4d0b..5365f3165e9860b023fff7472f61892c53510d5e 100644 GIT binary patch literal 17 VcmZQhIDR4ZmDNi>1~6b%2LL1~6ci2LL0suBV1q}cI diff --git a/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java b/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java index f18fc89a..09682945 100644 --- a/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java +++ b/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java @@ -55,12 +55,12 @@ public ResponseEntity updateReview( return ResponseEntity.ok(reviewDetailResponse); } -// @DeleteMapping("/{id}") -// public ResponseEntity deleteRestaurant( -// @PathVariable Long id) { -// restaurantService.delete(id); -// String message = ResultResponse.RESTAURANT_DELETE_SUCCESS.getMessage(); -// RestaurantDetailResponse response = new RestaurantDetailResponse(message); -// return ResponseEntity.ok(response); -// } + @DeleteMapping("/{id}") + public ResponseEntity deleteReview( + @PathVariable Long id) { + reviewService.delete(id); + String message = ResultResponse.REVIEW_DELETE_SUCCESS.getMessage(); + ReviewDetailResponse response = new ReviewDetailResponse(message); + return ResponseEntity.ok(response); + } } \ No newline at end of file From 34611e2d9060a8427b685066d40a050f659f612d Mon Sep 17 00:00:00 2001 From: HAERYN Date: Sun, 26 Feb 2023 20:32:04 +0900 Subject: [PATCH 18/20] =?UTF-8?q?feat:=20review=EC=9D=98=20=EC=A0=9C?= =?UTF-8?q?=EB=AA=A9=20=EB=B0=8F=20=EB=82=B4=EC=9A=A9=20=EA=B2=80=EC=83=89?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../7.6/executionHistory/executionHistory.bin | Bin 445934 -> 445934 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/7.6/fileHashes/fileHashes.bin | Bin 23897 -> 23897 bytes .gradle/7.6/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../7.6/fileHashes/resourceHashesCache.bin | Bin 26623 -> 26929 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .../review/controller/ReviewController.java | 16 +++++++---- .../review/repository/ReviewRepository.java | 13 ++------- .../domain/review/service/ReviewService.java | 25 +++++++----------- 9 files changed, 22 insertions(+), 32 deletions(-) diff --git a/.gradle/7.6/executionHistory/executionHistory.bin b/.gradle/7.6/executionHistory/executionHistory.bin index 9c181ec29d1919f8007b9168970fb8bb7f0535e4..b8abac56c398a436179e406682e7f2986f76afb5 100644 GIT binary patch delta 591 zcmaDiTl(E>=?!)3l&VV1jjOVXQ&W;s%gs|V3Nmt1G7EEZQp-#jAmIMy1?v*i1P;tM z*|EfN$p@QxTZ?|(KGv{ZP?XW1ML>L6@mJkai5K#x!hbc(~?=arcaP$nz8*ZH*+P^_NlUr5=;WpKVO#a&l1XC z#60aT^HY;G(?70etegHvfH{2oBn8GW7VV83Lg$yBt)6%xrgG2c;G+ezR(^c_!k|l= znL%LnGH-veuUA-EJ=#?=o0z+&H;OXbZVympFw%_HuXEJ*XqAMQ2Y5+TE%yt^fc9-oo9je zd=_M!5|mn&nOYv4T2z*qoT`_clUQ8LAn+=Cig?*?JxPZNN3LcV{MoS!to)Y|(EMEQ zfNl|W)jKwZiE=E>(hGn>kB>>kINh5R_0=X$vin2ADWK2ivZH|_gR3%zpDe6vtm7$`Jj+cGiX zkm+vUBiO`G-P;VZ_Q4)q!}_DX3)=5Y^;y()Y}NFQ$C+ntUa-P}QCZLW|G~h3<$vvE z?o=D3hfP=x4#RyrSXmeu7;4Kh^7HhkPqbhao$kMldH!@$BS!1#_h&JxO#il bC1%<7E?q_-W&&bnAZ7t#*6m%oY$*!>w+#PD delta 591 zcmaDiTl(E>=?!)3luSx0D@!xe)3cLOk}|T4@^f=di_`P6lZ;ClAmH@o1?v*i1YCpX z+Uoz#`Eus2r_Nf=BO%)bMH&5B1lsp_uw|ECbd0<&vQ2l7;M3`bT+CMl_=5TTHnYy> zTB2jPGW6y&zUhVw7!{{GEMsJymdwgEeS##@jO};1nJbyLPnBhqU=oo1#KU}Mf$h9S z1(%F&v$0!F|G1j5Zu%bq=J4&46d1!;v{T=$ws_#-{cr!3{V($`E{>S>bm`+42E9tm z3EXX(| zD77pzwLCbrs4O!%RWCUwvACE);BHz|U$>Y4H3{W)rw)r8z6epiK^17e-0q{Rc}m)j z)_$z^HtnaP8c^d#rv*9*ASTr6=09 z92|y!x3jV^GBDJZW#s4SPoHSPDmvYN8}t0>rbdj`)9=q>RGI#5H*?PP3rftg?OnQz VK+FWh%s|Wn#H`!9blFlC003nL^}PT9 diff --git a/.gradle/7.6/executionHistory/executionHistory.lock b/.gradle/7.6/executionHistory/executionHistory.lock index ce833d7ef93017365508b4eacd919f4d10e11f82..f8ad7224d41155f44580e4cbf7542e90a4ede448 100644 GIT binary patch literal 17 VcmZR6tNi*(fa07w1~6b$1^_sf1cCqn literal 17 VcmZR6tNi*(fa07w1~6b01OPaL1aJTV diff --git a/.gradle/7.6/fileHashes/fileHashes.bin b/.gradle/7.6/fileHashes/fileHashes.bin index 1d38d8d5f765516aea1b999342e4dca29a8a8271..266b2204b7e2f406b04f776d828addff806499e6 100644 GIT binary patch delta 329 zcmcb)i}B_z#toZ26!fhB9}Emw{?}gSPPIXL*aQX!#@z!+mUnblKc^KTC= zHig)y%eF+Q|M$7Z!gXfZA;rI7l@{GnV3iEa_a?jgy95O$&DyK5xQ#0wsZfFL!ccwD9J4 z{tsCc9x-m+u~19@u&u|Pi1@oDQDBv}+tx!=vaOr^KBP=xBZtuWrDv-rUWlpO^Evov z0mK0zvmlB@yEeCmZevq;l|4ng?6;nz!-OMOGYtOh0IMo?*#%K0Sv5I2=9bFN>b3f> a57d5sl~(cHCp}FSs%R%f5yxjBtp@-BZE+0% delta 325 zcmcb)i}B_z#toZ26b=-wox69B)i22dajduWMB5k`7~6U>i~ z#@Qx86mjPOX+2{gp$Wu_AS}Smn3Xtxwe4^D#V6a!U-YVgbwq#31WEz{|HjFQ(ZZYG z`9EZl(C%|>EtTYpV?PjitTI;Nksm|CRkO^Di!r zfLLBM3v3dDAn)eZ&~0oAchj2sy1o3bNhq&7by(!^MW`|H5LH4OCP&BIQu&_~X0Cbr WuELCOj8E^q(5OdM#PJ!ZSPuZx>}{?9 diff --git a/.gradle/7.6/fileHashes/fileHashes.lock b/.gradle/7.6/fileHashes/fileHashes.lock index 5365f3165e9860b023fff7472f61892c53510d5e..6221b9c854d7b563d510e2040c42abf43300f21f 100644 GIT binary patch literal 17 VcmZQhIDR4ZmDNi>1~6bv1pquN1tkCg literal 17 VcmZQhIDR4ZmDNi>1~6b%2LLXst{jR{8hJ9;)VRF@Zih4dlE5K*cmvV`*Ac@<=x&XJojSedts`W z?H2QebIX;!lga+|j#krEH8GV~J$$ftsiAV&UZ1nc+7(Q%F;)Cu^Yw?~#D>C!&abZZ zp12c$sp986w%=bS&-)f$FLH8e?D9L9DpC)b{H&S(yR48gPW=2qZ_@*qN)F67*|EfN R$p@QxTZ?|(KGpzI0RRWxoFxDN delta 73 zcmV-P0Ji_J(gFX^0kAX}0q?Ul7!U%pT^c9?lbsx?vtAvr0kb9_?*o%9BT18vBfzs} fB=-lCbu93+eJuh40v36(A@~=uFrWdmK}fzIDPA05 diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index b9fc03a789d65b26fb3f811f3c54724e5e70af12..14af47e35e9576dbb0740fcb003659aa86bda5e0 100644 GIT binary patch literal 17 VcmZP$cJnpe`{Bc11~6c%0RT2;1vdZy literal 17 VcmZP$cJnpe`{Bc11~6cX001^Z1rq=O diff --git a/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java b/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java index 09682945..185ae29a 100644 --- a/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java +++ b/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java @@ -14,6 +14,10 @@ import com.project.hackathon.domain.review.service.ReviewService; import com.project.hackathon.global.dto.ResultResponse; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.web.PageableDefault; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -41,11 +45,13 @@ public ResponseEntity> getAllReviews(@PathVariable String restauran return ResponseEntity.ok(reviews); } -// @GetMapping("/list/{category}") -// public ResponseEntity> loadRestaurantByCategory(@PathVariable Category category) { -// List restaurantDetailResponses = restaurantService.getRestaurantsByCategory(category); -// return ResponseEntity.ok(restaurantDetailResponses); -// } + @GetMapping("/search/{keyword}?page=0&size=10&sort=id,desc") + public ResponseEntity> searchReviews( + @PathVariable String keyword, + @PageableDefault(sort = "id", direction = Sort.Direction.DESC) Pageable pageable) { + Page reviews = reviewService.search(keyword, pageable); + return ResponseEntity.ok(reviews); + } @PatchMapping("/{id}") public ResponseEntity updateReview( diff --git a/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java b/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java index c02ee73b..2aed5911 100644 --- a/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java +++ b/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java @@ -17,16 +17,7 @@ public interface ReviewRepository extends JpaRepository { Optional findReviewById(@Param("id") Long id); List findAll(); - @Query("select r from Review r where r.title like :title and r.isActive = true") - Optional findReviewByTitle(@Param("title") String title); - - @Query("select r from Review r where r.content like :content and r.isActive = true") - Optional findReviewByContent(@Param("content") String content); - - @Query("select r from Review r where r.isActive = true") - Page findReviewWithPagination(Pageable pageable); - - @Query("select r from Review r where r.isActive = true and r.title like %:keyword%") - Page findContainingTitleReviewWithPagination( + @Query("select r from Review r where r.isActive = true and (r.title like %:keyword% or r.content like %:keyword%)") + Page findContainingTitleOrContentReviewWithPagination( Pageable pageable, @Param("keyword") String keyword); } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java b/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java index 18da6813..909b3fa3 100644 --- a/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java +++ b/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java @@ -51,22 +51,15 @@ public List getAllReviews() { return reviewRepository.findAll(); } -// @Transactional(readOnly = true) -// public List getReviewsByTitle(String title) { -// Optional reviews = reviewRepository.findReviewByTitle(title); -// if (reviews.isPresent()) { -// List reviewDetailResponses = new ArrayList<>(); -// for(Review review : reviews) { -// reviewDetailResponses.add(ReviewDetailResponse.builder() -// .id(review.getId()) -// .title(review.getTitle()) -// .content(review.getContent()) -// .build()); -// } -// return reviewDetailResponses; -// } -// return new ArrayList<>(); // 오류가 발생했을 때 반환할 값 -// } + @Transactional(readOnly = true) + public Page search(String keyword, Pageable pageable) { + Page reviews = reviewRepository.findContainingTitleOrContentReviewWithPagination(pageable, keyword); + return reviews.map(review -> ReviewDetailResponse.builder() + .id(review.getId()) + .title(review.getTitle()) + .content(review.getContent()) + .build()); + } @Builder @Transactional From e73fc1d1f523e8d839e5c947e59f090721b52024 Mon Sep 17 00:00:00 2001 From: HAERYN Date: Sun, 26 Feb 2023 21:22:03 +0900 Subject: [PATCH 19/20] =?UTF-8?q?feat:=20review=EC=9D=98=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=9D=BC=EC=9E=90=20=EA=B8=B0=EC=A4=80=20=EC=A0=95?= =?UTF-8?q?=EB=A0=AC=20&=20=EC=97=AD=EC=A0=95=EB=A0=AC=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../7.6/executionHistory/executionHistory.bin | Bin 445934 -> 445934 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/7.6/fileHashes/fileHashes.bin | Bin 23897 -> 23897 bytes .gradle/7.6/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../7.6/fileHashes/resourceHashesCache.bin | Bin 26929 -> 27439 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .../controller/RestaurantController.java | 2 -- .../dto/RestaurantCreateRequest.java | 2 -- .../dto/RestaurantDetailResponse.java | 1 - .../domain/restaurant/entity/Restaurant.java | 2 -- .../review/controller/ReviewController.java | 21 +++++++++------ .../domain/review/entity/Review.java | 16 +++++------- .../review/repository/ReviewRepository.java | 5 +++- .../domain/review/service/ReviewService.java | 24 ++++++++---------- 14 files changed, 33 insertions(+), 40 deletions(-) diff --git a/.gradle/7.6/executionHistory/executionHistory.bin b/.gradle/7.6/executionHistory/executionHistory.bin index b8abac56c398a436179e406682e7f2986f76afb5..a4e254a1c3bddcc836d3d6eeea6da50c1663a4ea 100644 GIT binary patch delta 880 zcmaDiTl(E>=?(rKN<}$^WffIrX<0?7`6k82Ma7j25Wu{-(BlO&%g%#K z-)@fekxx>Qo1K@Rm!6ecTAY}aR-BV;RF+kkTbx@_ke*Qr(ZXo6dBM7A$pV+I?aA@d zywNYwpzic3PUQV`!v&1Dw<`)WK4273-Sd~P*nVG>XGZVArxQ~RwhM|fmM{yv;?p^? z_umGZ{n?YXtY zf;T0NJC39^PcIZ<)|!4xnNfhH5v2c}GGjK&d=M*Eg;Aen0f;q0g;7eNtmdNVC&l^u zmrqquuG87BKi%*sv!3>klkxu^>)z2{>)7fhadF?2_ESsVzA$*K541_HOD;%si%srH zPE%e!?_CDd8%3FIw+E;)PG$_gvGcXl#NFBFzD=y0=dXAmt_7^^9WP^VP-ueJdWZKzxO~%e|6|N* z^&cnI7Sy)fIrJu_YVyD8_Z`1ag51-^2h^ayuP~wF*#U^sL%t!L#M%kG%&9d8pfD zOfWbf*LNw{E%wj^tLYn$Gtb<-V1)yt{NxvcR{t;GVhNcT>VMqunARe&W7qCrWnpAs bsMT(tugwU=OhC*G#4JF}x_!PjoBtvJF#2=k delta 871 zcmaDiTl(E>=?(rKO1U|iS;mRRWvOLJsa3g^=_$Fn71>5PWk!Vz5Wu*((BlO&%b)r0 zuWXL>kxx>|oLyC7Zd{dBoSKr9T5g__QIL_7l3AFOlUim1)pLLIf_2l91y=D@vfZ5Z zLGgZL!=cH?#pR|OE?~U9T~V0v0i(cy`6fG-I4=2MGjD6ruiM8OwhM|fmM{x!+VW0! z+2dKQd*ka*ENZEhn7&Y)>9m0Ovf{70r4ldXPlX3x-rbWp-H?m`ME!`rp?_+m|UYZf2S;CBiJgvI5AT zt|!7Qq5WWgz#H+D=?ZlRbDG`Qwg!S^UKs2WWo8iQ+Rb-N$!o*$H`bpvZ=d2)GrdrR zS!?<&Wkvy(Wgz|Ulo_*Gwt!f%DvbIpTS2S|DvVMBkIJwAUtIU~(;AKn7l9W(=cgMU zW!BT)$RTuo>DlUu7h)>+d=5TZFl*(<*DnmZw1GCQUgqsD_Vo%Yt4F&^W)pMw^hQx; z+wB3WjFTCImpnRq_-0^&xp$b$RE3;ZJ8!i$Jbq#Dj+e1FD77pzwOlVbC$YGgK|p?Q z*Rs{VZIf5Khq!50eiekMnf@XC z{ilUqxoEywC@l;Wnz3z}m~hB+x9<^b;-~Iy2HE;xkFH_;QQrmacc%I*>N>V+`o`nT eGdC|-;lS8_S{sC!fS4JGS%8>z`)O@91^_s%1eyQ< literal 17 VcmZR6tNi*(fa07w1~6b$1^_sf1cCqn diff --git a/.gradle/7.6/fileHashes/fileHashes.bin b/.gradle/7.6/fileHashes/fileHashes.bin index 266b2204b7e2f406b04f776d828addff806499e6..063a146f572e31c40813d5304fa22e4d1a055a8f 100644 GIT binary patch delta 598 zcmcb)i}B_z#toZ26ehnAwEBPf7E8#)Q2*nG$Fvw27~6VRswy#n0Aq~qWL8f#mfn@Y zE|c{=r6!AeiU2tYJ2&fl{$Wv=>hSi&|5E`I=1s6oclUcU4Xn3i=3cN~2Da46-hQ|0 zedQ$r8BAhM?Q6KOr$MlLHCWM#x@!o#*9NSmZBhT^&p|#C#;U0s`1EJ%&eKZjXJhwGhDuJD93HF(GGf}~&fo+PW5MLN z!H*<9PO2@aZMk#kO-j||f7S0hATCziBUo{@-KWJNj!KTiqls?wbPD z!46aj(k1?Qb8F}}Hibw2TfTmIAG0Io;m$eAGGhOs$^;+=OZrZZj@bk9)%?lQv33Bu C*~9w) delta 619 zcmcb)i}B_z#toZ26!fhB9}Emw{?}gSPPIXL*aQX!#@z!+mUnblK`rEB)l zxs&xhr6!AeiU2w1|7_Ox{KKNK-I{r`@RXw|@f-XCMJGIc4AR>Za)A-7mw|2NWN*J) z^|4QvZHZ9-?{kfX>&&u4ihsctSaeH46fxfe(t5@~LKBD;L0I6C??Q=$T^}|*D_31P zX@i|D*x2|ZxVQD|ujvA2#K$Ye|%;S!!Wz`O` zG|5}0pKKBi*8dONTLjjUA0h};2?Tt(lM|zbH^1{g&&1LbTdy|xV33rA-SJBaPQOF~ z9<@S&o-$pb?qE){8{5`ExMX;+9>@so$(_LoAcpDW zx51C!AA?g&Z-HS1yl(HqFtL?L$|Rhyvm*;UiMp0(qY1ps~HA=c7RnCyX=CflB}8> O9kU1IRg=lmv33A%8NQDI diff --git a/.gradle/7.6/fileHashes/fileHashes.lock b/.gradle/7.6/fileHashes/fileHashes.lock index 6221b9c854d7b563d510e2040c42abf43300f21f..787fe1578e7c2a763b1b7957697162458715b46c 100644 GIT binary patch literal 17 VcmZQhIDR4ZmDNi>1~6bf1pqvd1&ROw literal 17 VcmZQhIDR4ZmDNi>1~6bv1pquN1tkCg diff --git a/.gradle/7.6/fileHashes/resourceHashesCache.bin b/.gradle/7.6/fileHashes/resourceHashesCache.bin index ee452442764dddb8854be60b2d4ced0ec4b41ad5..48cd9f2f8a72d7211f628354055ab528ea8c6733 100644 GIT binary patch delta 865 zcmdmZiE;fk#tp_2OpNTCO(is#1SWpVoME{5kuC!mWXVqsl~NFx`tQ1O_bmGWh+sDF zU1Wk_T~Sf z;L4Rl+q8A%V8%L5R#liGaDS_dCI4$ymF!i}$MHT)Jy##g^H0Nnxt^QSVkC`M8B^cTGg;{)-a@FjYu8r)4bNFv0TB zbI$t1rO$QtVJeyGt+IjlKI0!z&#UQSE7&wJRfI+^d+9APBO&~RVITAE$BQskY)DqI zF;&D>SZs{S)tZ0FF`t*2>v27%ia@JJJ#$Uj)gmVgXuR97a2Jw_dT7A^W6_CE^ndf1 z`KZ#8DN03FNJ^k8RQLSlE4JSk<(biY@ae=<156dK_;gO}{dY#<;>>~^0Y-^bOclOO Xs@HkepAg`e>|&2w^8uJvm>A>$VY2QJ delta 94 zcmV-k0HOb{)&a570kAU|0s#24H5e!YlXV&xlcgFklkFOivy~el0h7%fk&|{E*Ry3F zZ~~JBA&|4JAxHzW4J9E5lSV9Gv%M@S0<-=ue*u$~Fj4{+QL!QT7m+Z?vq4DkAfCG; AyZ`_I diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 14af47e35e9576dbb0740fcb003659aa86bda5e0..012e7ca1006d97964ebe56d7a4ab353926513608 100644 GIT binary patch literal 17 VcmZP$cJnpe`{Bc11~6b+1^_mY1z`XH literal 17 VcmZP$cJnpe`{Bc11~6c%0RT2;1vdZy diff --git a/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java b/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java index 4a384f0d..e2270ab9 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/controller/RestaurantController.java @@ -1,7 +1,6 @@ package com.project.hackathon.domain.restaurant.controller; import javax.validation.Valid; - import com.project.hackathon.domain.restaurant.dto.RestaurantCreateRequest; import com.project.hackathon.domain.restaurant.dto.RestaurantDetailResponse; import com.project.hackathon.domain.restaurant.dto.RestaurantUpdateRequest; @@ -13,7 +12,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; - import java.util.List; @RequestMapping("/api/v1/restaurant") diff --git a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java index 8719fdbb..23d7afef 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantCreateRequest.java @@ -2,10 +2,8 @@ import com.project.hackathon.domain.restaurant.entity.Category; import lombok.*; - import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; -import java.time.LocalDateTime; @Getter @Builder diff --git a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantDetailResponse.java b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantDetailResponse.java index 3be4c189..66a2a10f 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantDetailResponse.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/dto/RestaurantDetailResponse.java @@ -1,7 +1,6 @@ package com.project.hackathon.domain.restaurant.dto; import java.time.LocalDateTime; - import com.project.hackathon.domain.restaurant.entity.Category; import lombok.*; diff --git a/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java b/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java index f7125126..b76207d0 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java @@ -31,8 +31,6 @@ public class Restaurant extends BaseEntity{ @Enumerated(EnumType.STRING) private Category category; - // 레스토랑 생성일자 -// @Column(name = "created_at") @CreationTimestamp private LocalDateTime createdAt; diff --git a/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java b/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java index 185ae29a..65dd8f9b 100644 --- a/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java +++ b/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java @@ -1,12 +1,5 @@ package com.project.hackathon.domain.review.controller; - -import com.project.hackathon.domain.restaurant.dto.RestaurantCreateRequest; -import com.project.hackathon.domain.restaurant.dto.RestaurantDetailResponse; -import com.project.hackathon.domain.restaurant.dto.RestaurantUpdateRequest; -import com.project.hackathon.domain.restaurant.entity.Category; -import com.project.hackathon.domain.restaurant.entity.Restaurant; -import com.project.hackathon.domain.restaurant.service.RestaurantService; import com.project.hackathon.domain.review.dto.ReviewCreateRequest; import com.project.hackathon.domain.review.dto.ReviewDetailResponse; import com.project.hackathon.domain.review.dto.ReviewUpdateRequest; @@ -45,7 +38,19 @@ public ResponseEntity> getAllReviews(@PathVariable String restauran return ResponseEntity.ok(reviews); } - @GetMapping("/search/{keyword}?page=0&size=10&sort=id,desc") + @GetMapping("/list/createdAt") + public ResponseEntity> getAllReviewsByCreatedAt(@PathVariable String restaurant) { + List reviews = reviewService.getAllReviewsByCreatedAt(); + return ResponseEntity.ok(reviews); + } + + @GetMapping("/list/createdAtDesc") + public ResponseEntity> getAllReviewsByCreatedAtDesc() { + List reviews = reviewService.getAllReviewsByCreatedAtDesc(); + return ResponseEntity.ok(reviews); + } + + @GetMapping("/search/{keyword}?page=0&size=10리&sort=id,desc") public ResponseEntity> searchReviews( @PathVariable String keyword, @PageableDefault(sort = "id", direction = Sort.Direction.DESC) Pageable pageable) { diff --git a/src/main/java/com/project/hackathon/domain/review/entity/Review.java b/src/main/java/com/project/hackathon/domain/review/entity/Review.java index 6706b06f..2b71db9f 100644 --- a/src/main/java/com/project/hackathon/domain/review/entity/Review.java +++ b/src/main/java/com/project/hackathon/domain/review/entity/Review.java @@ -1,16 +1,14 @@ package com.project.hackathon.domain.review.entity; -import com.project.hackathon.domain.restaurant.entity.Category; -import com.project.hackathon.domain.restaurant.entity.Restaurant; import com.project.hackathon.global.entity.BaseEntity; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.annotations.CreationTimestamp; + import javax.persistence.*; import java.time.LocalDateTime; -import java.util.ArrayList; -import static javax.persistence.FetchType.LAZY; @Getter @Entity @@ -19,7 +17,7 @@ @Table(name = "review") public class Review extends BaseEntity { - @Id // 이 멤버변수는 primary key라는 것을 나타내며 없으면 에러남 + @Id @GeneratedValue @Column(name = "id") private Long id; @@ -33,13 +31,12 @@ public class Review extends BaseEntity { @Column(name = "content", nullable = false) private String content; - // 특정 레스토랑명 -// @ManyToOne(fetch = LAZY) -// @JoinColumn(name = "restaurant") -// private String restaurant; @Column(name = "restaurant", nullable = false) private String restaurant; + @CreationTimestamp + @Column(name = "createdAt") + private LocalDateTime createdAt = LocalDateTime.now(); @Column(name = "is_removed", nullable = false) private boolean isRemoved; @@ -64,7 +61,6 @@ public void setContent(String content) { public void setUpdatedAt() { this.updatedAt = LocalDateTime.now(); } - public void deleteReview() { //soft delete this.isRemoved = true; } diff --git a/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java b/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java index 2aed5911..c7763afc 100644 --- a/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java +++ b/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java @@ -1,6 +1,5 @@ package com.project.hackathon.domain.review.repository; -import com.project.hackathon.domain.restaurant.entity.Restaurant; import com.project.hackathon.domain.review.entity.Review; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -20,4 +19,8 @@ public interface ReviewRepository extends JpaRepository { @Query("select r from Review r where r.isActive = true and (r.title like %:keyword% or r.content like %:keyword%)") Page findContainingTitleOrContentReviewWithPagination( Pageable pageable, @Param("keyword") String keyword); + + List findAllByOrderByCreatedAt(); + List findAllByOrderByCreatedAtDesc(); + } \ No newline at end of file diff --git a/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java b/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java index 909b3fa3..9b8603a4 100644 --- a/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java +++ b/src/main/java/com/project/hackathon/domain/review/service/ReviewService.java @@ -1,29 +1,16 @@ package com.project.hackathon.domain.review.service; -import com.project.hackathon.domain.restaurant.dto.RestaurantCreateRequest; -import com.project.hackathon.domain.restaurant.dto.RestaurantDetailResponse; -import com.project.hackathon.domain.restaurant.dto.RestaurantInfo; -import com.project.hackathon.domain.restaurant.dto.RestaurantUpdateRequest; -import com.project.hackathon.domain.restaurant.entity.Category; -import com.project.hackathon.domain.restaurant.entity.Restaurant; -import com.project.hackathon.domain.restaurant.repository.RestaurantRepository; import com.project.hackathon.domain.review.dto.ReviewCreateRequest; import com.project.hackathon.domain.review.dto.ReviewDetailResponse; import com.project.hackathon.domain.review.dto.ReviewUpdateRequest; import com.project.hackathon.domain.review.entity.Review; import com.project.hackathon.domain.review.repository.ReviewRepository; -import lombok.Builder; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; import java.util.List; -import java.util.Optional; @Service @RequiredArgsConstructor @@ -51,6 +38,16 @@ public List getAllReviews() { return reviewRepository.findAll(); } + @Transactional + public List getAllReviewsByCreatedAt() { + return reviewRepository.findAllByOrderByCreatedAt(); + } + + @Transactional + public List getAllReviewsByCreatedAtDesc() { + return reviewRepository.findAllByOrderByCreatedAtDesc(); + } + @Transactional(readOnly = true) public Page search(String keyword, Pageable pageable) { Page reviews = reviewRepository.findContainingTitleOrContentReviewWithPagination(pageable, keyword); @@ -61,7 +58,6 @@ public Page search(String keyword, Pageable pageable) { .build()); } - @Builder @Transactional public ReviewDetailResponse update(Long id, ReviewUpdateRequest reviewUpdateRequest) { Review review = reviewRepository.findById(id).orElseThrow(null); From 1795cf298ac49b01b29e97ca51b48e3f0e29a468 Mon Sep 17 00:00:00 2001 From: HAERYN Date: Sun, 26 Feb 2023 21:24:44 +0900 Subject: [PATCH 20/20] =?UTF-8?q?fix:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EC=A0=9C=EA=B1=B0=20=EB=B0=8F?= =?UTF-8?q?=20=EA=B0=9C=EB=B0=9C=20=EB=A7=88=EB=AC=B4=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/restaurant/entity/Restaurant.java | 7 ------- .../repository/RestaurantRepository.java | 1 - .../restaurant/service/RestaurantService.java | 1 + .../review/controller/ReviewController.java | 1 - .../domain/review/dto/ReviewCreateRequest.java | 3 --- .../domain/review/dto/ReviewDetailResponse.java | 3 --- .../domain/review/dto/ReviewUpdateRequest.java | 1 - .../hackathon/domain/review/entity/Review.java | 1 - .../review/repository/ReviewRepository.java | 1 - .../global/config/DataSourceConfig.java | 17 ----------------- .../hackathon/global/entity/BaseEntity.java | 1 - 11 files changed, 1 insertion(+), 36 deletions(-) delete mode 100644 src/main/java/com/project/hackathon/global/config/DataSourceConfig.java diff --git a/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java b/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java index b76207d0..b7a42a12 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/entity/Restaurant.java @@ -1,13 +1,10 @@ package com.project.hackathon.domain.restaurant.entity; -import com.project.hackathon.domain.review.entity.Review; import com.project.hackathon.global.entity.BaseEntity; import lombok.*; import org.hibernate.annotations.CreationTimestamp; - import javax.persistence.*; import java.time.LocalDateTime; -import java.util.ArrayList; @Getter @Entity @@ -19,10 +16,6 @@ public class Restaurant extends BaseEntity{ @Column(name = "id") private Long id; - // 레스토랑명 -// @OneToMany(fetch=FetchType.EAGER, cascade = CascadeType.ALL) // (1) -// @JoinColumn(name="title") -// private ArrayList title = new ArrayList<>(); @Column(name = "title", nullable = false) private String title; diff --git a/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java b/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java index 3e44f2f2..e12c0795 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/repository/RestaurantRepository.java @@ -7,7 +7,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; - import java.util.List; import java.util.Optional; diff --git a/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java b/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java index 9261cab4..b734b89b 100644 --- a/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java +++ b/src/main/java/com/project/hackathon/domain/restaurant/service/RestaurantService.java @@ -1,4 +1,5 @@ package com.project.hackathon.domain.restaurant.service; + import com.project.hackathon.domain.restaurant.dto.RestaurantCreateRequest; import com.project.hackathon.domain.restaurant.dto.RestaurantDetailResponse; import com.project.hackathon.domain.restaurant.dto.RestaurantUpdateRequest; diff --git a/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java b/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java index 65dd8f9b..cfb52ce4 100644 --- a/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java +++ b/src/main/java/com/project/hackathon/domain/review/controller/ReviewController.java @@ -14,7 +14,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; - import javax.validation.Valid; import java.util.List; diff --git a/src/main/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java b/src/main/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java index de0e3624..9542a54f 100644 --- a/src/main/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java +++ b/src/main/java/com/project/hackathon/domain/review/dto/ReviewCreateRequest.java @@ -1,12 +1,9 @@ package com.project.hackathon.domain.review.dto; -import com.project.hackathon.domain.restaurant.entity.Restaurant; -import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.Getter; import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; @Getter @Builder diff --git a/src/main/java/com/project/hackathon/domain/review/dto/ReviewDetailResponse.java b/src/main/java/com/project/hackathon/domain/review/dto/ReviewDetailResponse.java index ca93dd1c..7a7b708b 100644 --- a/src/main/java/com/project/hackathon/domain/review/dto/ReviewDetailResponse.java +++ b/src/main/java/com/project/hackathon/domain/review/dto/ReviewDetailResponse.java @@ -1,9 +1,6 @@ package com.project.hackathon.domain.review.dto; -import com.project.hackathon.domain.restaurant.entity.Category; -import com.project.hackathon.domain.restaurant.entity.Restaurant; import lombok.*; - import java.time.LocalDateTime; @Setter diff --git a/src/main/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java b/src/main/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java index 580208e4..dc9c334b 100644 --- a/src/main/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java +++ b/src/main/java/com/project/hackathon/domain/review/dto/ReviewUpdateRequest.java @@ -4,7 +4,6 @@ import lombok.Builder; import lombok.Getter; import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; import java.time.LocalDateTime; @Getter diff --git a/src/main/java/com/project/hackathon/domain/review/entity/Review.java b/src/main/java/com/project/hackathon/domain/review/entity/Review.java index 2b71db9f..3e6676d1 100644 --- a/src/main/java/com/project/hackathon/domain/review/entity/Review.java +++ b/src/main/java/com/project/hackathon/domain/review/entity/Review.java @@ -6,7 +6,6 @@ import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.CreationTimestamp; - import javax.persistence.*; import java.time.LocalDateTime; diff --git a/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java b/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java index c7763afc..a118ff7b 100644 --- a/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java +++ b/src/main/java/com/project/hackathon/domain/review/repository/ReviewRepository.java @@ -6,7 +6,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; - import java.util.List; import java.util.Optional; diff --git a/src/main/java/com/project/hackathon/global/config/DataSourceConfig.java b/src/main/java/com/project/hackathon/global/config/DataSourceConfig.java deleted file mode 100644 index 4aaa81e4..00000000 --- a/src/main/java/com/project/hackathon/global/config/DataSourceConfig.java +++ /dev/null @@ -1,17 +0,0 @@ -//package com.project.hackathon.global.config; -// -//import org.springframework.boot.context.properties.ConfigurationProperties; -//import org.springframework.boot.jdbc.DataSourceBuilder; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -// -//import javax.sql.DataSource; -// -//@Configuration -//public class DataSourceConfig { -// @ConfigurationProperties(prefix = "spring.datasource") -// @Bean -// public DataSource dataSource() { -// return DataSourceBuilder.create().build(); -// } -//} diff --git a/src/main/java/com/project/hackathon/global/entity/BaseEntity.java b/src/main/java/com/project/hackathon/global/entity/BaseEntity.java index 98b7b155..d8c26a88 100644 --- a/src/main/java/com/project/hackathon/global/entity/BaseEntity.java +++ b/src/main/java/com/project/hackathon/global/entity/BaseEntity.java @@ -15,7 +15,6 @@ @EntityListeners(value = {AuditingEntityListener.class}) @Getter @DynamicInsert - public abstract class BaseEntity { @CreatedDate @Column(name = "created_at", updatable = false)